@hatiolab/things-scene 10.1.25 → 10.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-types/figure/index.d.ts +2 -0
- package/dist-types/figure/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/things-scene-min.js +1 -1
- package/things-scene-min.js.map +1 -1
- package/things-scene.mjs +1 -1
- package/things-scene.mjs.map +1 -1
- package/CHANGELOG.md +0 -2331
package/things-scene-min.js
CHANGED
|
@@ -69,5 +69,5 @@ const tg=globalThis,eg=t=>t,ng=tg.trustedTypes,ig=ng?ng.createPolicy("lit-html",
|
|
|
69
69
|
</button>`:wg}
|
|
70
70
|
${n?vg`<button class="closable" @click=${this.closeContainer}>close</button>`:wg}
|
|
71
71
|
</div>
|
|
72
|
-
`,this.element)}catch(t){}}onchangeMinimized(){const{minimized:t}=this.state;t?this.setState("height",24):this.setState("height",this.get("height"))}}Gg=new WeakMap,hc.memoize(Wg.prototype,"bounds",!0),hc.register("container",Wg);const qg=Math.sqrt(3),Xg=2;function Kg(t,e,n,i,s){const r=5+s,o=n.x,a=n.y,c=i.x,l=i.y;if(Math.abs(o-c)>r&&Math.abs(a-l)>r){const n=(l-a)/(c-o),i=a-n*o;if(Math.abs(e-(n*t+i))>r)return!1}let h,d,u,p;return o>c?(d=o,h=c):(d=c,h=o),a>l?(p=a,u=l):(p=l,u=a),!(d+5<t)&&(!(h-5>t)&&(!(p+5<e)&&!(u-5>e)))}function Qg(t,e,n,i=2){for(let s=0;s<n.length-1;s++)if(Kg(t,e,n[s],n[s+1],i))return!0;return!1}function Zg(t,e,n,i){if("arrow"!=t.slice(-5))return n;const s=Math.atan2(i.y-n.y,i.x-n.x),r=1.5*e;return{x:n.x+Math.cos(s)*r,y:n.y+Math.sin(s)*r}}function Jg(t,e,n){let{lineWidth:i=Xg,strokeStyle:s="#000000",lineCap:r=!1,alpha:o=1,begin:a="none",end:c="none",beginSize:l="size5",endSize:h="size5"}=n;if(("none"!=a||"none"!=c)&&(i=Number(i)||Xg,t.lineCap=r,t.lineWidth=i,t.strokeStyle=s,t.fillStyle=s,t.globalAlpha*=o,"none"!=a&&ty(t,e[0],e[1],i,a,ey(l,i)),"none"!=c)){const n=e.length;ty(t,e[n-1],e[n-2],i,c,ey(h,i))}}function ty(t,e,n,i,s,r){const{x:o,y:a}=e,c=Math.atan2(n.y-a,n.x-o);switch(t.beginPath(),t.translate(o,a),t.rotate(c),s){case"oval":t.ellipse(0,0,r.X,r.Y,0,0,2*Math.PI),t.fill();break;case"diamond":t.moveTo(-r.X,0),t.lineTo(0,-r.Y),t.lineTo(r.X,0),t.lineTo(0,r.Y),t.fill();break;case"arrow":t.moveTo(0,0),t.lineTo(qg*r.X,-r.Y),t.lineTo(qg*r.X,r.Y),t.fill();break;case"sharp-arrow":t.moveTo(0,0),t.lineTo(qg*r.X,-r.Y),t.lineTo(-r.X/1.5+qg*r.X,0),t.lineTo(qg*r.X,r.Y),t.fill();break;case"open-arrow":t.moveTo(qg*r.X+i,-r.Y),t.lineTo(i,0),t.lineTo(qg*r.X+i,r.Y),t.stroke();break;case"cross":t.moveTo(-r.X,-r.Y),t.lineTo(r.X,r.Y),t.moveTo(r.X,-r.Y),t.lineTo(-r.X,r.Y),t.stroke()}t.rotate(-c),t.translate(-o,-a),t.closePath()}function ey(t,e){const n={X:0,Y:0};switch(e*=1.2,t){case"size1":n.X=e,n.Y=e;break;case"size2":n.X=1.5*e,n.Y=e;break;case"size3":n.X=2*e,n.Y=e;break;case"size4":n.X=e,n.Y=1.5*e;break;case"size5":default:n.X=1.5*e,n.Y=1.5*e;break;case"size6":n.X=2*e,n.Y=1.5*e;break;case"size7":n.X=e,n.Y=2*e;break;case"size8":n.X=1.5*e,n.Y=2*e;break;case"size9":n.X=2*e,n.Y=2*e}return n}const ny="N",iy="S",sy="E",ry="W";class oy{constructor({component:t,anchor:e,position:n,self:i}){this.component=t,this._anchorName=e,this._position=n,this.self=i}get position(){const t=this.anchor;if(t){const{position:e}=t,n=this.component.toScene(e.x,e.y);return this.self.transcoordT2P(n.x,n.y)}return this._position}set position({x:t,y:e}){this._position={x:t,y:e}}get anchor(){return this.component?.findAnchor(this._anchorName)}get direction(){const t=this.component.bounds,e=this.anchor;if(!e)return sy;const n=e.position;return n.y<=t.top?ny:n.y>=t.top+t.height?iy:n.x<=t.left?ry:sy}get boundaryPosition(){const t=this.anchor;if(t){let{position:e}=t,n=0,i=0;switch(this.direction){case iy:i=20;break;case ny:i=-20;break;case ry:n=-20;break;default:n=20}e={x:e.x+n,y:e.y+i};const s=this.component.toScene(e.x,e.y);return this.self.transcoordT2P(s.x,s.y)}}}class ay extends hc{isLine(){return!0}is3dish(){return!0}replaceRefids(t){["from","to"].forEach(e=>{const n=this.get(e);if(n?.component){const i=t.get(n.component)||n.component;this.set(e,{...n,component:i})}})}get fromEnd(){if(this.parent&&!this._fromEnd){const{component:t,anchor:e,position:n}=this.getState("from")||{};if(!t)return;const i=this.root?.findByRefid?.(t);if(!i)return;this._fromEnd=new oy({component:i,fromto:"from",anchor:e,position:n,self:this})}return this._fromEnd}get from(){return this.getState("from")}set from(t){delete this._fromEnd,this.set("from",t)}get toEnd(){if(this.parent&&!this._toEnd){const{component:t,anchor:e,position:n}=this.getState("to")||{};if(!t)return;const i=this.root?.findByRefid?.(t);if(!i)return;this._toEnd=new oy({component:i,fromto:"to",anchor:e,position:n,self:this})}return this._toEnd}get to(){return this.getState("to")}set to(t){delete this._toEnd,this.set("to",t)}move({x:t,y:e},n){n&&(this.from={position:this._fromEnd?.position||this.getState("from")?.position||{x:0,y:0}},this.to={position:this._toEnd?.position||this.getState("to")?.position||{x:0,y:0}}),super.move({x:t,y:e})}render(t){const{begin:e="none",end:n="none",lineWidth:i,round:s=0}=this.state;let r=this.drawPath;Jg(t,r,this.state),t.beginPath();const o=Zg(e,i,r[0],r[1]),a=Zg(n,i,r[r.length-1],r[r.length-2]),c=r[0];r=[o,...r.slice(1,-1),a];let l={x:o.x,y:o.y};if(t.moveTo(o.x,o.y),r.length>=2&&Or(c)){const e=r[1],n=Rr(e,s),i=Math.sqrt((o.x-e.x)**2+(o.y-e.y)**2),a=0!==i?Math.atan2(o.x-e.x,o.y-e.y):0,l=Math.sin(a)*Math.min(n,i/2)+e.x,h=Math.cos(a)*Math.min(n,i/2)+e.y,d=Dr({x:o.x,y:o.y},{x:l,y:h},c.bulge);d&&t.arc(d.cx,d.cy,d.radius,d.startAngle,d.endAngle,d.clockwise)}for(let e=1;e<r.length;e++){const n=l;l=r[e];const i=r[e+1];if(n.x===l.x&&n.y===l.y)continue;if(!i){t.lineTo(l.x,l.y);break}const o=Rr(l,s);let a=Math.sqrt((n.x-l.x)*(n.x-l.x)+(n.y-l.y)*(n.y-l.y)),c=0!==a?Math.atan2(n.x-l.x,n.y-l.y):0,h=Math.sin(c)*Math.min(o,a/2)+l.x,d=Math.cos(c)*Math.min(o,a/2)+l.y;const u=o>0||0!==a?{x:h,y:d}:l;a=Math.sqrt((i.x-l.x)*(i.x-l.x)+(i.y-l.y)*(i.y-l.y)),c=0!==a?Math.atan2(i.x-l.x,i.y-l.y):0,h=Math.sin(c)*Math.min(o,a/2)+l.x,d=Math.cos(c)*Math.min(o,a/2)+l.y;const p=o>0||0!==a?{x:h,y:d}:l;if(t.lineTo(u.x,u.y),o>0&&t.quadraticCurveTo(l.x,l.y,p.x,p.y),Or(l)){const e=Rr(i,s),n=Math.sqrt((l.x-i.x)**2+(l.y-i.y)**2),r=0!==n?Math.atan2(l.x-i.x,l.y-i.y):0,o=Math.sin(r)*Math.min(e,n/2)+i.x,a=Math.cos(r)*Math.min(e,n/2)+i.y,c=Dr({x:p.x,y:p.y},{x:o,y:a},l.bulge);c&&t.arc(c.cx,c.cy,c.radius,c.startAngle,c.endAngle,c.clockwise)}}this.drawStroke(t,void 0)}contains(t,e){const{lineWidth:n}=this.state;return Qg(t,e,this.drawPath,n)}get resizable(){return!1}get mutable(){return!0}get rotatable(){return!1}get path(){const{from:t,to:e}=this.state,{x1:n,y1:i,x2:s,y2:r}=this.state;return[this.fromEnd?.position||t?.position||{x:n,y:i},this.toEnd?.position||e?.position||{x:s,y:r}]}set path(t){const[e,n]=t,{from:i,to:s}=this.state;delete this._fromEnd,delete this._toEnd,this.set({from:{...i,position:e},to:{...s,position:n}})}get textBounds(){const t=this.drawPath;let e,n,i=0;for(let s=1;s<t.length;s++){const r=t[s-1],o=t[s],a=(r.x-o.x)*(r.x-o.x)+(r.y-o.y)*(r.y-o.y);a>i&&(i=Math.ceil(a),e=r,n=o)}let{paddingTop:s,paddingLeft:r,paddingRight:o,paddingBottom:a}=this.state;return a||=0,s||=0,r||=0,o||=0,{left:Math.min(e.x,n.x)+r,top:Math.min(e.y,n.y)+s,width:Math.max(Math.abs(e.x-n.x)-r-o,0),height:Math.max(Math.abs(e.y-n.y)-s-a,0)}}get decorators(){return this.app.isEditMode?["decotag"]:[]}}ay.getTipNeckPos=Zg,ay.containedInPath=Qg,ay.drawEndTips=Jg,hc.register("line",ay);const cy={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"angle",label:"start-angle",name:"startAngle",property:"startAngle"},{type:"angle",label:"end-angle",name:"endAngle",property:"endAngle"}],"value-property":"text"};class ly extends(Nf(dc)){is3dish(){return!0}render(t){const{cx:e,cy:n,rx:i,ry:s,startAngle:r,endAngle:o,anticlockwise:a}=this.state;t.beginPath(),t.ellipse(e,n,Math.abs(i),Math.abs(s),0,r||0,o||2*Math.PI,a),void 0!==r&&void 0!==o&&(t.lineTo(e,n),t.closePath())}get path(){const{cx:t,cy:e,rx:n,ry:i}=this.state;return[{x:t-n,y:e-i},{x:t+n,y:e-i},{x:t+n,y:e+i},{x:t-n,y:e+i}]}set path(t){const e=t[0],n=t[2];this.set({cx:e.x+(n.x-e.x)/2,cy:e.y+(n.y-e.y)/2,rx:(n.x-e.x)/2,ry:(n.y-e.y)/2})}contains(t,e){const{cx:n,cy:i,rx:s,ry:r}=this.state,o=(t-n)/(2*s-.5),a=(e-i)/(2*r-.5);return o*o+a*a<.25}outline(t){return function(t,e){const{cx:n,cy:i,rx:s,ry:r}=t.model,o=2*Math.PI*e,a=n+s*Math.cos(o),c=i+r*Math.sin(o);return t.toScene(a,c)}(this,t)}get anchors(){return function(t){const{left:e,top:n,width:i,height:s}=t.bounds,r=e+i/2,o=n+s/2;return[{name:"TOP",position:{x:r,y:n}},{name:"RIGHT",position:{x:e+i,y:o}},{name:"BOTTOM",position:{x:r,y:n+s}},{name:"LEFT",position:{x:e,y:o}}]}(this)}get nature(){return cy}}hc.memoize(ly.prototype,"path",!1),hc.register("ellipse",ly);const hy={object:{fill:"rgba(180,180,180,0.18)",stroke:"#888888",icon:"?",label:"object"},transport:{fill:"rgba(100,180,255,0.18)",stroke:"#3a78c8",icon:"⇄",label:"transport"},facility:{fill:"rgba(160,140,220,0.18)",stroke:"#6b4ec8",icon:"◫",label:"facility"},vehicle:{fill:"rgba(120,200,140,0.18)",stroke:"#3a8c5e",icon:"⊙",label:"vehicle"},region:{fill:"rgba(220,200,100,0.18)",stroke:"#a0892a",icon:"▢",label:"region"},path:{fill:"rgba(200,140,160,0.18)",stroke:"#a0506a",icon:"⌐",label:"path"},"3d-asset":{fill:"rgba(255,180,80,0.18)",stroke:"#c87a2a",icon:"◈",label:"3D asset"}},dy=[{type:"string",label:"placeholder-label",name:"placeholderLabel",description:'사용자에게 표시할 추가 라벨 (예: "Stocker A1")'},{type:"string",label:"hint",name:"placeholderHint",description:"구체화 시 참고 — 도면의 원본 식별자 / VLM 라벨 등"}];function uy(t,e,n,i,s){const{left:r,top:o,width:a,height:c}=e,l=Math.max(a,1),h=Math.max(c,1);t.save(),t.fillStyle=n.fill,t.fillRect(r,o,l,h),t.strokeStyle=n.stroke,t.lineWidth=1.5,t.setLineDash([4,3]),t.strokeRect(r,o,l,h),t.setLineDash([]),t.restore(),Math.min(l,h)>=24&&(t.save(),t.fillStyle=n.stroke,t.font=`bold ${Math.min(20,.4*Math.min(l,h))}px Arial`,t.textAlign="center",t.textBaseline="middle",t.fillText(n.icon,r+l/2,o+h/2),t.restore());const d=i?`${n.label}: ${i}`:n.label;h>=32&&(t.save(),t.fillStyle=n.stroke,t.font="10px Arial",t.textAlign="center",t.textBaseline="bottom",t.fillText(d,r+l/2,o+h-4),t.restore()),s&&h>=40&&(t.save(),t.fillStyle=n.stroke,t.font="9px Arial",t.textAlign="right",t.textBaseline="top",t.fillText(`hint: ${s}`,r+l-4,o+4),t.restore())}const py={mutable:!1,resizable:!0,rotatable:!0,properties:[...dy,{type:"placeholder-convert",label:"",name:"_convert"}],help:"scene/component/placeholder"};class fy extends(pc(dc)){get nature(){return py}render(t){const{placeholderLabel:e,placeholderHint:n}=this.state;uy(t,this.bounds,hy.object,e,n)}}hc.register("placeholder",fy);const my=["placeholder"];function gy(t,e=[]){return!!t&&(!!my.includes(t)||e.includes(t))}const yy={ondragstart:function(t,e,n){n.mutatePath(null,function(n){n.splice(e+1,0,t)})},ondragmove:function(t,e,n){n.mutatePath(null,function(n){const i=n[e+1];n[e+1]={...i||{},x:t.x,y:t.y}})},ondragend:function(t,e,n){}},by={mutable:!0,resizable:!1,rotatable:!0,properties:[{type:"number",label:"round",name:"round",property:{min:0,max:100,step:1}}],help:"scene/component/polygon"};class _y extends dc{is3dish(){return!0}get mutable(){return!0}get pathExtendable(){return!0}get cornerEditable(){return!0}get path(){return this.state.path??[]}set path(t){this.set("path",t)}contains(t,e){const n=this.path;let i=!1;return n.forEach((s,r)=>{const o=(r+n.length+1)%n.length,a=s.x,c=s.y,l=n[o].x,h=n[o].y;c>e!=h>e&&t<(l-a)*(e-c)/(h-c)+a&&(i=!i)}),i}get controls(){const t=this.path;return t.map((e,n)=>{const i=t[n+1>=t.length?0:n+1];return{x:(e.x+i.x)/2,y:(e.y+i.y)/2,handler:yy}})}get nature(){return by}}hc.memoize(_y.prototype,"controls",!1),hc.register("polygon",_y);const vy=[];class xy extends(zl(_y)){constructor(t,e){super(t,e),this._components=[]}replaceRefids(t){this.components.forEach(e=>e.replaceRefids(t))}get showMoveHandle(){return!0}get showOverflow(){return!1}dispose(){this.components.slice().forEach(t=>t.dispose()),super.dispose()}isContainer(){return!0}containable(t){return t.isDescendible(this)}get hasTextProperty(){return!1}get components(){return this._components}get focusible(){return!0}get layout(){return _c.get(this.get("layout"))||xc}reflow(){this.layout.reflow(this),this.components&&this.components.forEach(t=>{t.isContainer()&&t.reflow()})}get hierarchy(){const t=super.hierarchy;return this.components?.length&&(t.components=this.components.map(t=>t.hierarchy)),t}reparent(t,e={}){t&&t.parent!==this&&this.addComponent(t,{silent:!0})}addComponent(t,e=!1){const{ghost:n=!1,silent:i=!1}="boolean"==typeof e?{ghost:e}:e,s=t.parent;if(s){if(this===s)return;s.removeComponent(t,n||i)}const r=this._components.push(t)-1;i&&(t._silentAdd=!0),t.parent=this,t.added(this),n||i||this.trigger("add",this,t,r),t.delegate_on(this),i?(s&&this.root?._removeTraverse?.(t),this.trigger("add",this,t,r),t.trigger("added",this,t,r),delete t._silentAdd):n||t.trigger("added",this,t,r),this.root&&this.root.isReady&&t.invokeReady()}removeComponent(t,e=!1){const n=this._components.indexOf(t);-1!=n&&(this._components.splice(n,1),t.parent=null,t.removed(this),e||(this.trigger("remove",this,t),t.trigger("removed",this,t)),t.delegate_off(this))}insertComponentAt(t,e,n=!1){const i=t.parent;i&&i.removeComponent(t,n);const s=this._components.splice(0,e);this._components=s.concat(t,this._components),e=this._components.indexOf(t),t.parent=this,t.added(this),n||this.trigger("add",this,t,e),t.delegate_on(this),n||t.trigger("added",this,t,e)}add(t,e=!1){return t instanceof Array?(t.forEach(t=>{-1==this._components.indexOf(t)&&this.addComponent(t,e)}),this):this.add.call(this,[t],e)}remove(t,e=!1){return t instanceof Array?this._components?(t.forEach(t=>this.removeComponent(t,e)),this):this:this.remove.call(this,[t],e)}getAt(t){if(this._components)return this._components[t]}forEach(t,e){this._components&&this._components.forEach(t,e)}traverse(t,e){t.call(e,this),this._components&&this._components.forEach(n=>{n.isContainer()?n.traverse(t,e):t.call(e,n)})}indexOf(t){return(this._components||vy).indexOf(t)}size(){return(this._components||vy).length}moveChildAt(t,e){const n=this.indexOf(e);if(-1==n)return;let i=this._components.splice(0,n);const s=this._components.splice(1);this._components=i.concat(s),t=Math.max(0,t),t=Math.min(t,this._components.length),i=this._components.splice(0,t),this._components=i.concat(e,this._components)}moveChildForward(t){const e=this.indexOf(t);-1!=e&&e!=this.size()-1&&(this._components[e]=this._components[e+1],this._components[e+1]=t)}moveChildBackward(t){const e=this.indexOf(t);-1!=e&&0!=e&&(this._components[e]=this._components[e-1],this._components[e-1]=t)}moveChildToFront(t){const e=this.indexOf(t);if(-1==e||e==this.size()-1)return;const n=this._components.splice(0,e),i=this._components.splice(1);this._components=n.concat(i,this._components)}moveChildToBack(t){const e=this.indexOf(t);if(-1==e||0==e)return;const n=this._components.splice(0,e),i=this._components.splice(1);this._components=this._components.concat(n,i)}symmetryX(t){super.symmetryX(t),this.components.map(t=>{t.symmetryX(0)})}findAll(t,...e){if("string"==typeof t)return La(t,this,e[0]||this);if("function"!=typeof t)return[];let n=[];for(let i=this.components.length-1;i>=0;i--){const s=this.components[i].findAll(t,...e);s&&(n=n.concat(s))}return t(this,...e)&&n.push(this),n}findFirst(t,...e){if("string"==typeof t)return La(t,this,e[0])[0];if("function"==typeof t){for(let n=this.components.length-1;n>=0;n--){const i=this.components[n].findFirst(t,...e);if(null!=i)return i}return t(this,...e)?this:void 0}}findById(t){return this.root.findAllById?.(t)?.[0]}findByRefid(t){return this.root.findByRefid?.(t)}capture(t,e,n){if(!this.app.isEditMode&&this.hidden)return!1;const i=this.fromParent(t,e);if(!this.contains(i.x,i.y))return!1;const s=this.bounds;i.x-=s.left,i.y-=s.top;const r=this.layout.capturables(this);for(let s=r.length-1;s>=0;s--){const o=r[s];let a;if(a="static"==o.position?o.capture(i.x,i.y,n):o.capture(t,e,n),a)return a}return this.capturable&&!n?.(this)&&this}capturePath(t,e){if(e){if(e.indexOf(this)>-1)return!1;for(let t=0;t<e.length;t++)if(!this.containable(e[t]))return!1}const n=[],{left:i,top:s,width:r,height:o}=this.bounds;for(let e=0;e<t.length;e++){const a=this.fromParent(t[e].x,t[e].y);if(a.x<i||a.x>i+r||a.y<s||a.y>s+o)return!1;a.x-=i,a.y-=s,n.push(a)}const a=this.layout.capturables(this);for(let t=a.length-1;t>=0;t--){const i=a[t];if(!i.isContainer())continue;const s=i.capturePath(n,e);if(s)return s}return this.focusible&&this}render(t){"popup"!==this.position&&super.render(t)}postrender(t){if("popup"===this.position)return void super.postrender(t);const e=this.layout.drawables(this);if(e.length>0){let{left:n=0,top:i=0,width:s,height:r}=this.bounds;t.save(),this.showOverflow||(t.beginPath(),t.rect(n,i,s,r),t.clip(),t.closePath()),t.translate(n,i),e.forEach(e=>{const n=this.root?.transitionEffect;n?.isReparenting(e)||e.draw(this.position&&"static"!==this.position?t:this.getContext(e))}),t.translate(-n,-i),t.restore()}super.postrender(t)}trim(){this.components.forEach(t=>{t.trim()}),super.trim()}}["layout"].forEach(t=>hc.memoize(xy.prototype,t,!1));const wy={ondragstart:function(t,e,n){n.mutatePath(null,function(n){n.splice(e,0,t)})},ondragmove:function(t,e,n){n.mutatePath(null,function(n){const i=n[e];n[e]={...i||{},x:t.x,y:t.y}})},ondragend:function(t,e,n){}},My={mutable:!1,resizable:!1,rotatable:!1,properties:[{type:"number",label:"round",name:"round",property:{min:0,max:100,step:1}}],help:"scene/component/polyline"};class Sy extends ay{get pathExtendable(){return!0}get cornerEditable(){return!0}get path(){const{from:t,to:e}=this.state,{path:n}=this.state;return[this.fromEnd?.position||t?.position||n[0],...n.slice(1,-1),this.toEnd?.position||e?.position||n[n.length-1]]}set path(t){const{from:e,to:n}=this.state;delete this._fromEnd,delete this._toEnd,this.set({from:{...e,position:t[0]},to:{...n,position:t[t.length-1]},path:t})}get controls(){const t=this.path,e=[];for(let n=0;n<t.length-1;n++){const i=t[n],s=t[n+1];0==n&&e.push({x:i.x,y:i.y,handler:wy}),e.push({x:(i.x+s.x)/2,y:(i.y+s.y)/2,handler:wy}),n==t.length-2&&e.push({x:s.x,y:s.y,handler:wy})}return e}get nature(){return My}}hc.register("polyline",Sy);const Ay={mutable:!1,resizable:!1,rotatable:!1,properties:[{type:"number",label:"round",name:"round",property:{min:0,max:100,step:1}}],help:"scene/component/ortholine"};class Ey extends ay{get pathExtendable(){return!1}get drawPath(){const t=this.path[0],e=this.path[1],{component:n,direction:i,boundaryPosition:s=t}=this.fromEnd||{},{component:r,direction:o,boundaryPosition:a=e}=this.toEnd||{},c=[s,a],l=[];s&&l.push(s);let h,d=n?.bounds;d&&(h=n.toScene(d.left,d.top),h=this.transcoordT2P(h.x,h.y),d={...d,left:h.x,top:h.y});const u=d?{left:d.left-20,top:d.top-20,width:d.width+40,height:d.height+40}:{left:s.x,top:s.y,width:0,height:0};d=d||u;let p=r?.bounds;p&&(h=r.toScene(p.left,p.top),h=this.transcoordT2P(h.x,h.y),p={...p,left:h.x,top:h.y});const f=p?{left:p.left-20,top:p.top-20,width:p.width+40,height:p.height+40}:{left:a.x,top:a.y,width:0,height:0};p=p||f;const m=[u,f],g=u.left>f.left?f.left:u.left,y=u.top>f.top?f.top:u.top,b={left:g,top:y,width:u.left+u.width>f.left+f.width?u.left+u.width-g:f.left+f.width-g,height:u.top+u.height>f.top+f.height?u.top+u.height-y:f.top+f.height-y};let _,v,x,w,M,S,A,E,k,C,T=0,P=0;d.left+d.width<p.left?(w=0,M=1,k=i,C=o,_=(d.left+d.width+p.left)/2,T=p.left-_):p.left+p.width<d.left&&(w=1,M=0,k=o,C=i,_=(d.left+p.width+p.left)/2,T=d.left-_),d.top+d.height<p.top?(x=0,S=1,A=i,E=o,v=(d.top+d.height+p.top)/2,P=p.top-v):p.top+p.height<d.top&&(x=1,S=0,A=o,E=i,v=(d.top+p.height+p.top)/2,P=d.top-v);const O=[];if(_&&T>P){let t,e,n;switch(C){case ry:switch(k){case sy:O.push({x:_,y:c[w].y}),O.push({x:_,y:c[M].y});break;case ry:t=m[w].top+m[w].height/2,e=t>c[M].y?Math.min(m[w].top,c[M].y):Math.max(m[w].top+m[w].height,c[M].y),O.push({x:c[w].x,y:e}),O.push({x:_,y:e}),O.push({x:_,y:c[M].y});break;case ny:case iy:e=k===iy?Math.max(c[w].y,c[M].y):Math.min(c[w].y,c[M].y),O.push({x:c[w].x,y:e}),O.push({x:_,y:e}),O.push({x:_,y:c[M].y});break;default:return this.path}break;case sy:switch(k){case sy:e=c[w].y<c[M].y?Math.min(m[M].top,c[w].y):Math.max(m[M].top+m[M].height,c[w].y),n=e;break;case ry:e=void 0!==v?v:c[w].y<c[M].y?b.top-.5*T:b.top+b.height+.5*T,n=e;break;case iy:e=void 0!==v?Math.max(v,c[w].y):b.top+b.height,n=e;break;case ny:e=v?Math.min(v,m[w].top):b.top,n=e;break;default:return this.path}O.push({x:c[w].x,y:e}),O.push({x:_,y:e}),O.push({x:_,y:n}),O.push({x:c[M].x,y:n});break;case iy:switch(k){case sy:e=c[w].y,n=c[w].y>c[M].y?c[w].y:m[M].top+m[M].height;break;case ry:e=v?Math.max(v,m[M].top+m[M].height):b.top+b.height,n=e;break;case iy:e=b.top+b.height,n=e;break;case ny:e=v?Math.min(v,m[w].top):m[w].top,n=v?Math.max(v,m[M].top+m[M].height):m[M].top+m[M].height;break;default:return this.path}O.push({x:c[w].x,y:e}),O.push({x:_,y:e}),O.push({x:_,y:n}),O.push({x:c[M].x,y:n});break;case ny:switch(k){case sy:e=c[w].y,n=c[w].y<c[M].y?c[w].y:m[M].top;break;case ry:e=v?Math.min(v,m[M].top):b.top,n=e;break;case iy:e=void 0!==v?Math.max(v,c[w].y):c[w].y,n=void 0!==v?Math.min(v,c[M].y):c[M].y;break;case ny:e=b.top,n=e;break;default:return this.path}O.push({x:c[w].x,y:e}),O.push({x:_,y:e}),O.push({x:_,y:n}),O.push({x:c[M].x,y:n});break;default:return this.path}l.push(...0===w?O:O.reverse())}else if(v){let t,e,n;switch(E){case ny:switch(A){case iy:O.push({x:c[x].x,y:v}),O.push({x:c[S].x,y:v});break;case ny:t=m[x].left+m[x].width/2,e=t>c[S].x?Math.min(m[x].left,c[S].x):Math.max(m[x].left+m[x].width,c[S].x),O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:c[S].x,y:v});break;case ry:e=Math.min(c[x].x,c[S].x),O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:c[S].x,y:v});break;case sy:e=Math.max(c[x].x,c[S].x),O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:c[S].x,y:v});break;default:return this.path}break;case iy:switch(A){case ry:e=b.left,n=e;break;case sy:e=void 0!==_?Math.max(_,c[x].x):b.left+b.width,n=e;break;case ny:e=void 0!==_?_:c[x].x<c[S].x?b.left-.5*P:b.left+b.width+.5*P,n=e;break;case iy:e=c[x].x,n=c[x].x<c[S].x?Math.min(m[S].left,c[x].x):Math.max(m[S].left+m[S].width,c[x].x);break;default:return this.path}O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:n,y:v}),O.push({x:n,y:c[S].y});break;case sy:switch(A){case ry:e=void 0!==_?Math.min(_,c[x].x):c[x].x,n=void 0!==_?Math.max(_,c[S].x):c[S].x;break;case sy:e=b.left+b.width,n=e;break;case ny:e=void 0!==_?Math.max(_,c[S].x):b.left+b.width,n=e;break;case iy:e=c[x].x,n=Math.max(m[S].left+m[S].width,c[x].x);break;default:return this.path}O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:n,y:v}),O.push({x:n,y:c[S].y});break;case ry:switch(A){case ry:e=b.left,n=e;break;case sy:e=void 0!==_?Math.max(_,c[x].x):c[x].x,n=void 0!==_?Math.min(_,c[S].x):c[S].x;break;case ny:e=b.left,n=e;break;case iy:e=c[x].x<c[S].x?Math.min(m[S].left,c[x].x):c[x].x,n=Math.min(e,c[S].x);break;default:return this.path}O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:n,y:v}),O.push({x:n,y:c[S].y});break;default:return this.path}l.push(...0===x?O:O.reverse())}else{let t,e;switch(i){case ny:switch(o){case ny:e=b.top,l.push({x:c[0].x,y:e}),l.push({x:c[1].x,y:e});break;case iy:t=b.left+b.width,l.push({x:t,y:c[0].y}),l.push({x:t,y:b.top+b.height}),l.push({x:c[1].x,y:b.top+b.height});break;case sy:t=c[1].y<c[0].y&&c[1].x<c[0].x?c[0].x:b.left+b.width,l.push({x:t,y:c[0].y}),l.push({x:t,y:c[1].y});break;case ry:t=b.left,l.push({x:t,y:c[0].y}),l.push({x:t,y:c[1].y});break;default:return this.path}break;case iy:switch(o){case ny:t=b.left+b.width,l.push({x:t,y:c[0].y}),l.push({x:t,y:b.top}),l.push({x:c[1].x,y:b.top});break;case iy:case sy:case ry:e=b.top+b.height,l.push({x:c[0].x,y:e}),l.push({x:c[1].x,y:e});break;default:return this.path}break;case ry:switch(o){case ny:t=c[0].x>c[1].x&&c[0].y<c[1].y?c[1].x:b.left,e=c[0].x>c[1].x&&c[0].y<c[1].y?c[1].y:Math.min(b.top,c[0].y),l.push({x:t,y:c[0].y}),l.push({x:t,y:e}),l.push({x:c[1].x,y:e});break;case iy:t=b.left,e=Math.max(b.top+b.height,c[0].y),l.push({x:t,y:c[0].y}),l.push({x:t,y:e}),l.push({x:c[1].x,y:e});break;case sy:t=b.left+b.width,l.push({x:c[0].x,y:b.top}),l.push({x:t,y:b.top}),l.push({x:t,y:c[1].y});break;case ry:t=b.left,l.push({x:t,y:c[0].y}),l.push({x:t,y:c[1].y});break;default:return this.path}break;case sy:switch(o){case ny:e=c[0].y<c[1].y&&c[0].x<c[1].x?c[0].y:b.top,l.push({x:c[0].x,y:e}),l.push({x:c[1].x,y:e});break;case iy:e=c[0].y>c[1].y&&c[0].x<c[1].x?c[0].y:b.top+b.height,l.push({x:c[0].x,y:e}),l.push({x:c[1].x,y:e});break;case sy:case ry:e=b.top+b.height,l.push({x:c[0].x,y:e}),l.push({x:c[1].x,y:e});break;default:return this.path}break;default:return this.path}}return a&&l.push(a),[t,...l,e].filter((t,e,n)=>{if(0===e)return!0;const i=n[e-1];return t.x!==i.x||t.y!==i.y}).filter((t,e,n)=>{if(0===e||e>=n.length-1)return!0;const i=n[e-1],s=n[e+1];return!(t.x===i.x&&t.x===s.x||t.y===i.y&&t.y===s.y)})}get nature(){return Ay}}hc.register("ortholine",Ey);const ky={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"image-selector",label:"image-src",name:"src",property:{displayField:"id",displayFullUrl:!0,baseUrlAlias:"$base_url",defaultStorage:"scene-image",storageFilters:{type:Array,value:[{name:"category",value:"image"}]},useUpload:!0}},{type:"select",label:"cross-origin",name:"crossOrigin",property:{options:["","anonymous","use-credentials"]}}],"value-property":"src",help:"scene/component/image-view"};class Cy extends(pc(dc)){static get noimage(){return Cy.NOIMAGE||(Cy.NOIMAGE=new Image,Cy.NOIMAGE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABIBAMAAAD7Se1QAAAAIVBMVEUAAABHcEwBAQEREREBAQEEBAQGBgYLCwsDAwMDAwMICAi6HF9tAAAAC3RSTlNNAEAERiMYCS41Eac10lYAAAEgSURBVHhe7dY9asQwEAXgh7DNertNiJy48pIitY3SB7bYdk0ukL1BDDmA9gZecoH4pmFQ3MQayUMguPBrNPD4wD9TCMvJmt3M/AtYwXOlXiWgqADVCUBD46MAnGhMBaCiUQmAm8VA/Eh/eWl9Fn5WcxD+OLuRrUYJDKLluwH2InACUgkoACSdADxQc50Bytadb9RkM0CT13TcvlCT1HFg8UTHvasuUVACCa3El6u2UdD8LFTlKhUFFgA+d3dj10aABkUN72N3jAADCrJq7PIIsPidcxBoTHIIAjMFmyCwmGYIAA1P9gFgfCANAOsDSccCDW+uLDB+kLGg94OkZoAGkwsDDAe2DOg5oPxAg03rBR88OHpBz4N8UVeHFSwma74BTW6Ge4rIRa4AAAAASUVORK5CYII="),Cy.NOIMAGE}dispose(){super.dispose(),this._offcanvas=null,this._image=null}render(t){const{left:e,top:n,width:i,height:s,isGray:r=!1,alpha:o=1,src:a}=this.state;if(this.prepareIf(!this._image&&a),t.beginPath(),t.globalAlpha*=o,this._image&&this._image.complete)if(r&&this._offcanvas)t.drawImage(this._offcanvas,e,n,i,s);else try{t.drawImage(this._image,e,n,i,s)}catch(r){t.drawImage(Cy.noimage,e,n,i,s)}else!this.app.isViewMode&&t.drawImage(Cy.noimage,e,n,i,s)}get nature(){return ky}get hasTextProperty(){return!1}async ready(){await super.ready();const{src:t}=this.state;if(!this._image&&t){const e=this.root?.app?.loadTracker;if(e){const n=new Promise((t,e)=>{this.prepare(()=>t(),t=>e(t))});e.track(`image:${t}`,"image",t,n)}else this.prepareIf(!0)}}prepare(t,e){const{src:n,crossOrigin:i}=this.state;if(n){this._image=new Image;try{i&&(this._image.crossOrigin=i),this._image.src=this.app.url(n)||""}catch(t){return void e(t)}this._image.onload=()=>{if(this.get("isGray")){const t=this._image.width,e=this._image.height;this._offcanvas=hc.createCanvas(t,e);const n=this._offcanvas.getContext("2d");n.drawImage(this._image,0,0);const i=function(t,e,n){let i;try{i=t.getImageData(0,0,e,n)}catch(t){return Bi("Get Image Data Error: "+(t instanceof Error?t.message:String(t))),null}const s=i.data;for(let t=0;t<e*n*4;t+=4){const e=s[t],n=s[t+1],r=s[t+2],o=Math.floor((e+n+r)/3);i.data[t]=o,i.data[t+1]=o,i.data[t+2]=o}return i}(n,t,e);n.putImageData(i,0,0)}t(this)},this._image.onerror=t=>{this._image&&!this._image.currentSrc&&(this._image=null),e(t)}}else t(this)}get src(){return this.get("src")}set src(t){this.set("src",t)}onchange(t,e){(t.hasOwnProperty("src")||t.hasOwnProperty("isGray"))&&(this._offcanvas=null,this._image=null,this.prepareIf(t.src))}ondropfile(t,e){for(let n=0;n<t.length;n++)if(t[n].type.startsWith("image/"))return void(this.src=e[n])}}hc.register("image-view",Cy);class Ty extends($g(pc(hc))){is3dish(){return!0}prerender(){}}var Py,Oy,Dy={},zy={},Iy={};function Ry(){if(Oy)return zy;Oy=1,Object.defineProperty(zy,"__esModule",{value:!0});var t=function(){if(Py)return Iy;Py=1,Object.defineProperty(Iy,"__esModule",{value:!0});var t=function(){function t(){}return t.bitsToNum=function(t){return t.reduce(function(t,e){return 2*t+e},0)},t.byteToBitArr=function(t){for(var e=[],n=7;n>=0;n--)e.push(!!(t&1<<n));return e},t.lzwDecode=function(t,e){for(var n,i,s=0,r=function(t){for(var n=0,i=0;i<t;i++)e.charCodeAt(s>>3)&1<<(7&s)&&(n|=1<<i),s++;return n},o=[],a=1<<t,c=a+1,l=t+1,h=[],d=function(){h=[],l=t+1;for(var e=0;e<a;e++)h[e]=[e];h[a]=[],h[c]=null};;)if(i=n,(n=r(l))!==a){if(n===c)break;if(n<h.length)i!==a&&h.push(h[i].concat(h[n][0]));else{if(n!==h.length)throw new Error("Invalid LZW code.");h.push(h[i].concat(h[i][0]))}o.push.apply(o,h[n]),h.length===1<<l&&l<12&&l++}else d();return o},t}();return Iy.SuperGifUtils=t,Iy}(),e=function(){function e(t,e){this.stream=t,this.handler=e}return e.prototype.parseCT=function(t){for(var e=[],n=0;n<t;n++)e.push(this.stream.readBytes(3));return e},e.prototype.readSubBlocks=function(){var t,e;e="";do{t=this.stream.readByte(),e+=this.stream.read(t)}while(0!==t);return e},e.prototype.parseHeader=function(){var e={};if(e.sig=this.stream.read(3),e.ver=this.stream.read(3),"GIF"!==e.sig)throw new Error("Not a GIF file.");e.width=this.stream.readUnsigned(),e.height=this.stream.readUnsigned();var n=t.SuperGifUtils.byteToBitArr(this.stream.readByte());e.gctFlag=n.shift(),e.colorRes=t.SuperGifUtils.bitsToNum(n.splice(0,3)),e.sorted=n.shift(),e.gctSize=t.SuperGifUtils.bitsToNum(n.splice(0,3)),e.bgColor=this.stream.readByte(),e.pixelAspectRatio=this.stream.readByte(),e.gctFlag&&(e.gct=this.parseCT(1<<e.gctSize+1)),this.handler.hdr&&this.handler.hdr(e)},e.prototype.parseExt=function(e){var n=this;switch(e.label=this.stream.readByte(),e.label){case 249:e.extType="gce",function(e){n.stream.readByte();var i=t.SuperGifUtils.byteToBitArr(n.stream.readByte());e.reserved=i.splice(0,3),e.disposalMethod=t.SuperGifUtils.bitsToNum(i.splice(0,3)),e.userInput=i.shift(),e.transparencyGiven=i.shift(),e.delayTime=n.stream.readUnsigned(),e.transparencyIndex=n.stream.readByte(),e.terminator=n.stream.readByte(),n.handler.gce&&n.handler.gce(e)}(e);break;case 254:e.extType="com",function(t){t.comment=n.readSubBlocks(),n.handler.com&&n.handler.com(t)}(e);break;case 1:e.extType="pte",function(t){n.stream.readByte(),t.ptHeader=n.stream.readBytes(12),t.ptData=n.readSubBlocks(),n.handler.pte&&n.handler.pte(t)}(e);break;case 255:e.extType="app",function(t){n.stream.readByte(),t.identifier=n.stream.read(8),t.authCode=n.stream.read(3),"NETSCAPE"===t.identifier?function(t){n.stream.readByte(),t.unknown=n.stream.readByte(),t.iterations=n.stream.readUnsigned(),t.terminator=n.stream.readByte(),n.handler.app&&n.handler.app.NETSCAPE&&n.handler.app.NETSCAPE(t)}(t):function(t){t.appData=n.readSubBlocks(),n.handler.app&&n.handler.app[t.identifier]&&n.handler.app[t.identifier](t)}(t)}(e);break;default:e.extType="unknown",function(t){t.data=n.readSubBlocks(),n.handler.unknown&&n.handler.unknown(t)}(e)}},e.prototype.parseImg=function(e){e.leftPos=this.stream.readUnsigned(),e.topPos=this.stream.readUnsigned(),e.width=this.stream.readUnsigned(),e.height=this.stream.readUnsigned();var n=t.SuperGifUtils.byteToBitArr(this.stream.readByte());e.lctFlag=n.shift(),e.interlaced=n.shift(),e.sorted=n.shift(),e.reserved=n.splice(0,2),e.lctSize=t.SuperGifUtils.bitsToNum(n.splice(0,3)),e.lctFlag&&(e.lct=this.parseCT(1<<e.lctSize+1)),e.lzwMinCodeSize=this.stream.readByte();var i=this.readSubBlocks();e.pixels=t.SuperGifUtils.lzwDecode(e.lzwMinCodeSize,i),e.interlaced&&(e.pixels=function(t,e){for(var n=new Array(t.length),i=t.length/e,s=function(i,s){var r=t.slice(s*e,(s+1)*e);n.splice.apply(n,[i*e,e].concat(r))},r=[0,4,2,1],o=[8,8,4,2],a=0,c=0;c<4;c++)for(var l=r[c];l<i;l+=o[c])s(l,a),a++;return n}(e.pixels,e.width)),this.handler.img&&this.handler.img(e)},e.prototype.parseBlock=function(){var t={};switch(t.sentinel=this.stream.readByte(),String.fromCharCode(t.sentinel)){case"!":t.type="ext",this.parseExt(t);break;case",":t.type="img",this.parseImg(t);break;case";":t.type="eof",this.handler.eof&&this.handler.eof(t);break;default:throw new Error("Unknown block: 0x"+t.sentinel.toString(16))}"eof"!==t.type&&setTimeout(this.parseBlock.bind(this),0)},e.prototype.parse=function(){this.parseHeader(),setTimeout(this.parseBlock.bind(this),0)},e}();return zy.SuperGifParser=e,zy}var jy,Ly,Fy={};var Ny=function(){if(Ly)return Dy;Ly=1,Object.defineProperty(Dy,"__esModule",{value:!0});var t=Ry(),e=function(){if(jy)return Fy;jy=1,Object.defineProperty(Fy,"__esModule",{value:!0});var t=function(){function t(t){this.data=t,this.position=0}return t.prototype.readByte=function(){if(this.position>=this.data.length)throw new Error("Attempted to read past end of stream.");return this.data instanceof Uint8Array?this.data[this.position++]:255&this.data.charCodeAt(this.position++)},t.prototype.readBytes=function(t){for(var e=[],n=0;n<t;n++)e.push(this.readByte());return e},t.prototype.read=function(t){for(var e="",n=0;n<t;n++)e+=String.fromCharCode(this.readByte());return e},t.prototype.readUnsigned=function(){var t=this.readBytes(2);return(t[1]<<8)+t[0]},t}();return Fy.SuperGifStream=t,Fy}(),n=function(){function n(t,e){var n=this;for(var i in this.gifImgElement=t,this.options={autoPlay:!0},this.loading=!1,this.ready=!1,this.transparency=null,this.delay=null,this.disposalMethod=null,this.disposalRestoreFromIdx=null,this.lastDisposalMethod=null,this.frame=null,this.lastImg=null,this.playing=!0,this.forward=!0,this.ctxScaled=!1,this.frames=[],this.frameOffsets=[],this.initialized=!1,this.currentFrameIndex=-1,this.iterationCount=0,this.stepping=!1,this.handler={hdr:this.withProgress(this.doHdr.bind(this)),gce:this.withProgress(this.doGCE.bind(this)),com:this.withProgress(this.doNothing.bind(this)),app:{NETSCAPE:this.withProgress(this.doNothing.bind(this))},img:this.withProgress(this.doImg.bind(this)),eof:function(){n.pushFrame(),n.canvas.width=n.hdr.width*n.getCanvasScale(),n.canvas.height=n.hdr.height*n.getCanvasScale(),n.playerInit(),n.loading=!1,n.ready=!0,n.loadCallback&&n.loadCallback(n.gifImgElement)}},e)this.options[i]=e[i];this.onEndListener=e.onEnd,this.loopDelay=e.loopDelay||0,this.overrideLoopMode=null!=e.loopMode?e.loopMode:"auto",this.drawWhileLoading=null==e.drawWhileLoading||e.drawWhileLoading}return n.prototype.init=function(){var t=this.gifImgElement.parentNode,e=document.createElement("div");this.canvas=document.createElement("canvas"),this.canvasContext=this.canvas.getContext("2d"),this.tmpCanvas=document.createElement("canvas"),e.className=this.options.enclosingClass||"super-gif",e.appendChild(this.canvas),t&&(t.insertBefore(e,this.gifImgElement),t.removeChild(this.gifImgElement)),this.initialized=!0},n.prototype.loadSetup=function(t){return!this.loading&&(t&&(this.loadCallback=t),this.loading=!0,this.frames=[],this.clear(),this.disposalRestoreFromIdx=null,this.lastDisposalMethod=null,this.frame=null,this.lastImg=null,!0)},n.prototype.completeLoop=function(){this.onEndListener&&this.onEndListener(this.gifImgElement),this.iterationCount++,!1!==this.overrideLoopMode||this.iterationCount<0?this.doStep():(this.stepping=!1,this.playing=!1)},n.prototype.doStep=function(){if(this.stepping=this.playing,this.stepping){this.stepFrame(1);var t=10*this.frames[this.currentFrameIndex].delay;t||(t=100),0===this.getNextFrameNo()?(t+=this.loopDelay,setTimeout(this.completeLoop.bind(this),t)):setTimeout(this.doStep.bind(this),t)}},n.prototype.step=function(){this.stepping||setTimeout(this.doStep.bind(this),0)},n.prototype.putFrame=function(){var t;this.currentFrameIndex=parseInt(this.currentFrameIndex.toString(),10),this.currentFrameIndex>this.frames.length-1&&(this.currentFrameIndex=0),this.currentFrameIndex<0&&(this.currentFrameIndex=0),t=this.frameOffsets[this.currentFrameIndex],this.tmpCanvas.getContext("2d").putImageData(this.frames[this.currentFrameIndex].data,t.x,t.y),this.canvasContext.globalCompositeOperation="copy",this.canvasContext.drawImage(this.tmpCanvas,0,0)},n.prototype.playerInit=function(){this.loadErrorCause||(this.canvasContext.scale(this.getCanvasScale(),this.getCanvasScale()),this.options.autoPlay?this.step():(this.currentFrameIndex=0,this.putFrame()))},n.prototype.clear=function(){this.transparency=null,this.delay=null,this.lastDisposalMethod=this.disposalMethod,this.disposalMethod=null,this.frame=null},n.prototype.parseStream=function(e){try{new t.SuperGifParser(e,this.handler).parse()}catch(t){this.handleError("parse")}},n.prototype.setSizes=function(t,e){this.canvas.width=t*this.getCanvasScale(),this.canvas.height=e*this.getCanvasScale(),this.tmpCanvas.width=t,this.tmpCanvas.height=e,this.tmpCanvas.style.width=t+"px",this.tmpCanvas.style.height=e+"px",this.tmpCanvas.getContext("2d").setTransform(1,0,0,1,0,0)},n.prototype.drawError=function(){this.canvasContext.fillStyle="black",this.canvasContext.fillRect(0,0,this.hdr.width,this.hdr.height),this.canvasContext.strokeStyle="red",this.canvasContext.lineWidth=3,this.canvasContext.moveTo(0,0),this.canvasContext.lineTo(this.hdr.width,this.hdr.height),this.canvasContext.moveTo(0,this.hdr.height),this.canvasContext.lineTo(this.hdr.width,0),this.canvasContext.stroke()},n.prototype.handleError=function(t){this.loadErrorCause=t,this.hdr={width:this.gifImgElement.width,height:this.gifImgElement.height},this.frames=[],this.drawError()},n.prototype.doHdr=function(t){this.hdr=t,this.setSizes(this.hdr.width,this.hdr.height)},n.prototype.doGCE=function(t){this.pushFrame(),this.clear(),this.transparency=t.transparencyGiven?t.transparencyIndex:null,this.delay=t.delayTime,this.disposalMethod=t.disposalMethod},n.prototype.pushFrame=function(){this.frame&&(this.frames.push({data:this.frame.getImageData(0,0,this.hdr.width,this.hdr.height),delay:this.delay}),this.frameOffsets.push({x:0,y:0}))},n.prototype.doImg=function(t){var e=this;this.frame||(this.frame=this.tmpCanvas.getContext("2d"));var n=this.frames.length,i=t.lctFlag?t.lct:this.hdr.gct;n>0&&(3===this.lastDisposalMethod?null!==this.disposalRestoreFromIdx?this.frame.putImageData(frames[this.disposalRestoreFromIdx].data,0,0):this.frame.clearRect(this.lastImg.leftPos,this.lastImg.topPos,this.lastImg.width,this.lastImg.height):this.disposalRestoreFromIdx=n-1,2===this.lastDisposalMethod&&this.frame.clearRect(this.lastImg.leftPos,this.lastImg.topPos,this.lastImg.width,this.lastImg.height));var s=this.frame.getImageData(t.leftPos,t.topPos,t.width,t.height);t.pixels.forEach(function(t,n){t!==e.transparency&&(s.data[4*n+0]=i[t][0],s.data[4*n+1]=i[t][1],s.data[4*n+2]=i[t][2],s.data[4*n+3]=255)}),this.frame.putImageData(s,t.leftPos,t.topPos),this.ctxScaled||(this.canvasContext.scale(this.getCanvasScale(),this.getCanvasScale()),this.ctxScaled=!0),this.drawWhileLoading&&(this.canvasContext.drawImage(this.tmpCanvas,0,0),this.drawWhileLoading=this.options.autoPlay),this.lastImg=t},n.prototype.doNothing=function(){},n.prototype.withProgress=function(t){return function(e){t(e)}},n.prototype.getNextFrameNo=function(){var t=this.forward?1:-1;return(this.currentFrameIndex+t+this.frames.length)%this.frames.length},n.prototype.stepFrame=function(t){this.currentFrameIndex=this.currentFrameIndex+t,this.putFrame()},n.prototype.getCanvasScale=function(){return this.options.maxWidth&&this.hdr&&this.hdr.width>this.options.maxWidth?this.options.maxWidth/this.hdr.width:window.devicePixelRatio||1},n.prototype.play=function(){this.playing=!0,this.step()},n.prototype.pause=function(){this.playing=!1},n.prototype.isPlaying=function(){return this.playing},n.prototype.getCanvas=function(){return this.canvas},n.prototype.isLoading=function(){return this.loading},n.prototype.isReady=function(){return this.ready},n.prototype.isAutoPlay=function(){return this.options.autoPlay},n.prototype.getLength=function(){return this.frames.length},n.prototype.getCurrentFrame=function(){return this.currentFrameIndex},n.prototype.moveTo=function(t){this.currentFrameIndex=t,this.putFrame()},n.prototype.loadURL=function(t,n){var i=this;if(this.loadSetup(n)){var s=new XMLHttpRequest;s.open("GET",t,!0),"overrideMimeType"in s?s.overrideMimeType("text/plain; charset=x-user-defined"):"responseType"in s?s.responseType="arraybuffer":s.setRequestHeader("Accept-Charset","x-user-defined"),s.onloadstart=function(){i.initialized||i.init()},s.onload=function(){if(200===s.status){var t=s.response;t.toString().indexOf("ArrayBuffer")>0&&(t=new Uint8Array(t));var n=new e.SuperGifStream(t);setTimeout(function(){i.parseStream(n)},0)}else i.handleError("xhr - response")},s.onerror=function(){i.handleError("xhr")},s.send()}},n.prototype.load=function(t){this.loadURL(this.gifImgElement.src,t)},n}();return Dy.SuperGif=n,Dy}();const By={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"image-selector",label:"src",name:"src"},{type:"checkbox",label:"play",name:"play"}],"value-property":"src",help:"scene/component/gif-view"};class Hy extends Ty{async oncreate_element(t){const{src:e,play:n}=this.state;this.onchangesrc(e),this.onchangeplay(n)}buildImg(){const t=this.element;if(!t)return document.createElement("img");t.replaceChildren();const e=document.createElement("img");return e.style.width="100%",e.style.height="100%",t.appendChild(e),e}onchange(t,e){super.onchange(t,e),"src"in t&&this.onchangesrc(t.src),"play"in t&&this.onchangeplay(t.play)}setElementProperties(t){}onchangeplay(t){const e=this._superGif;e&&e.isReady()&&(t?e.play():e.pause())}onchangesrc(t){const e=this.buildImg();t||(t="data:image/gif;base64,R0lGODlhYABIAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKio+Pj5iYmKCgoKampqurq66urrCwsLGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrOzs7S0tLa2tre3t7m5ubu7u7+/v8DAwMHBwcPDw8XFxcfHx8vLy8/Pz9LS0tXV1dfX193d3eTk5Onp6fj4+Pz8/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////yH5BAkAAPUAIf47R2VuZXJhdGVkIGJ5IGpzZ2lmIChodHRwczovL2dpdGh1Yi5jb20vYW50aW1hdHRlcjE1L2pzZ2lmLykALAAAAABgAEgAAAj+AGcJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmR9VKqXMmypcuXMGPKnJkSIs2bOHPqZGlzp8+fQOv1DEq0KMyhRpMmRaq0KVCmTqPmhCq1qkyqLrFRSyYwGTVsVo1iZXmNa8Fk18ISHasSm1mDycCq/ck2JTWF1ObSfTjz7cFken3WFbow8M7BDA3rHOwXruKpfGXeTZg3qDVrUge7RRg3KLZjx+Q2HVyvLNy0QaMJjBaVdD2tZr2K/mmNIObRkR+n9AsYt0Pddg1WXppb8bWDx1CLLW74GcJnSl3TtDY8Zu2Et4tKl7n52eyWnxXvhl7+26jqrspbnlfIWjtz2gWPZV95neH8veU9NxZYfbfD3kFt99J6Bnmn0mQO9XfYezrVxxlmx0GUXIAM4hSeffsxBN1TFd5E4Ef3QZbfTg6CNJ5gHXJ3TEntLThiTh+KFCJNAqZU4kgAitjQTheepOBMNcZI0oQ6JpbTjSZtiNN2PZ400IxHpdiSc07G911M0iFZZYtAStnWilUeBGVLrlEZpmM0elmPlmfO8iOZXl4DZpsGEYmll2bSWWCXLwJXVY1+urhjoGEBSuiSah6K36CKtpZoo4s9CimielZq6aWYZqrpppx26umnoIZ6UkAAOw=="),e.src=t,e.setAttribute("rel:animated_src",t),e.setAttribute("rel:auto_play",String(0)),this._superGif=new Ny.SuperGif(e,{autoPlay:!1}),this._superGif.init(),this.element&&Array.from(this.element.children).forEach(t=>{t.style.width="100%",t.style.height="100%"});const n=this._superGif.getCanvas();n.style.width="100%",n.style.height="100%",this._superGif.load(()=>{setTimeout(()=>{this._superGif.moveTo(0),this.play&&this._superGif.play()},100)})}ondropfile(t,e){for(let n=0;n<t.length;n++)if(/\.gif$/.test(t[n].name))return void(this.src=e[n])}get src(){return this.getState("src")}set src(t){this.set("src",t)}get play(){return this.getState("play")}set play(t){this.setState("play",t)}get nature(){return By}get tagName(){return"div"}}hc.register("gif-view",Hy);const $y={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"attachment-selector",label:"src",name:"src",property:{category:"audio"}},{type:"checkbox",label:"started",name:"started"},{type:"checkbox",label:"loop",name:"loop"}],"value-property":"src",help:"scene/component/audio"};class Gy extends(pc(dc)){static get image(){return Gy.IMAGE||(Gy.IMAGE=new Image,Gy.IMAGE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAMAAAC3Ycb+AAAAP1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACzJYIvAAAAFHRSTlMA8BAwgNBgQKB/wCBwUJDg37CvXyUlBK8AABFYSURBVHja7NsBkqIwFIThTiAQgyBq3/+sm6p1tnamZkaTMhJJf1f4S/JeEIiIiIiIiIiIiIiIiEhD7Hg4BH84TpAKjJ4f3NFCtjVd+InXz2RTs+FXlxGylYHfcVfIJmb+YFWSLUyGVJKKBJJKUo+Rd6w63l/qzLuCkryO5fe0l2xk5mMWbe+v0fNBRqf7S3je6CipQ2ACr+dWcYEpzBFS1plpguatsnomMgdIQSOTuQ5SjmE6/UgK8szgdJIUM/FG41YlFmYJ2kkKsY5ZzAwBurHDk3WGeRY0bvYrGa1+rqNI22f7dS32ZnUK1GMr0eSK3mEc9dhKMxp+ZTo8kT2emOXS5LQ1kCxbJBocSd2k5PaIjMVzjWcdJPk9ooBnmzx1t5XbIxqBKpJ4NGTgzwKiGpK4do72gb+ZUMIYtCPm9WCPMsYTE5k2hq2ZvzujlCE1iRmwf3dvmRyKsT0T7b9I7HEPCpqCiqT2IIqaT1pI0noQZdlFC8l/PbYPAnRORT56VBEE6FXkb49agmByKhJ71BME6FsvEntUFQTdqekisUdlQWCXhovEHtUFAWbTapHYo8YgmFybO3vsUWcQYGmxSOxRbRAMprkisUfFQVKmrX18sxt7VB0ENjT1xir2qDxIwkFi3v89e+xRfxAMzfzzIfZ4hyAYDR9zwVuLPd4jCDrTwoLYGb5LEFi3/+E3rweR6urX20c/Fvls2Pvwm9mDSGIPhv8YPyGf3/eo9Ye7O8B2FIShAAooakEttex/rbODad5/yTHIAjqn505IQPv+Xz06dz+4VXORHEZcgAcB8updM8F6e25jBzwIkE07l+x8amMnPDp6nsNJ+BoZ7Q6F8egqAda9VEuRNlZjBzwYkMskdXR73okd8GBAJiKYjBcZKKqG9OiKDbgdfxJ5VhsBPDiQZhaouD3p4hfw4EAmwxisz3MSHwAPEmQ1TB1N+SmXWoAHC7JbZsWl/IxLLcCDBplNo3lrfMLsmwAPGmShAxX5/1vOEzjEz3iyfQ/hI36W4TctsUesOAifPdrQg8M++KYl95iCBkjI1r8634betBAPHZDTPFAmD3zLiHgogVTziMsahz0eIh5aIGHGRSJ2mFtHPR4iHhQIP2UvWGMf8wk74qEIEib7rLjPiBfxiAcCwp8V+Nae3uMdRhAPDIR/J5f/Q2DTcC+hIB7qIGEq3Ti9bx+sryMeAAgS70OK8G2kBD8L8QBAoLWU3g3vUVIc6D0txAMAsY+4jBWowXHO64gHBGKfYJ2T5qY1BxcL98BB+PQ+XiS9xxh9EQ8ChA6C5UXWIUoE9MBB8LVHQoS7ib8/dRn3sAcJ6bQRSdH96RDxIEH4QEX+AHF4LxHEAwUh12xyr1V8lwjiQYDYF8kuf1jluUQQDwrEvkhW8Wc6LhHUgwfhi4QPlHm7LRHawx4kpE191Dq8lgjhAYDQa1cftYrPEiE8OJDb40uqyzdQCA8WhAzL4G/PT4c3WrgHD2IfllGl53V37zsgHg5ApPNvVvq4Fn4spx4oiH1W3CwtEV+PDhEPJyBSkVX4aa7emkM83ICEKWpGM7wdvYCCeDgCEYpcwhLxczhEPFyBCEUWnRL5T6X59SBASBF+9l28TL5F7uEORCZyCUvEx+S7yT0cgoRVb9JaXLR1qUdfgksQ0fTbgmhFB20d8HAKEha14+F8f1sHPNyCiL6EqK+n20/rgIdjkFC0Ho1s6Gndvcc9ICkr/ey8/rHO6vp9KawL8DAFOV6l9Fyub7IbflsCag1qRfVsXWvxHjxIejU+BHZV6uvHD1XiEb++Bw8i+dNd+Wv0eCQmhcPhRPwUUt2DB5G1sfa1aeyzAuyJj9x2HjyIdKzIKw5SI14ieFtvo3kIQERj3lVhkUOnRD7AnjV5369QkAOJZeCH+Jh41xOLs73dQwAifY6dpxCCbjTDzLf1Bm1Y93tAIDOWXcLPvrHyr2hVoEAceEAgDQzB4jetk0/c2OXRHB48EJCpa4dgpYh2ETxtrshz7zx4ICCzfuTSDn8p/EOS9OTjwgMB+cABP3yWYuOPIofs33LigYCULlpZNXJppVU30Vf14kGAUCLijf1D71lN9FW9eFiA9KgZ8FPpPUsSnufGA+8hvAg2Kpz0nrX//qp+PIgpC3i6xJRITOye9fn1VT15ICCrVlQG5rywo0H8x965bVkNwmCYQ2kR6Gmb939WXV65dFnI/tPdjPBfO7XMN4EkTUJtqZp4sCJ1+8jwkhMu0KpMxFXFA8hlVfQSMxGH5mDK1VKV8QCyvTVtUiYyo7V358VStfGoAEFMhGYhEwloxZy9WKo2Hjwg5iSOvFDXeUYd33+PuVfHgwnEBWLocDJp+IIa2fyvperjwQRiXCKGosyXqoA+YfsIELuYu4HAt+msMknfDK4jfQJIzOZ2IPAQWJtFOhQKivR2IDZ6Awis7V0iLxqBI7uEZo19dakTogLSwKvf8yk8Jq6CGK0GKvWlatG7b7kkUU/Lo1gdXWn7/4E0j0qeJDpqN/ABqQcgJgdqURb4chjQktIugDS6wFFiz3JgaJj7AGJmholAe9YKhoZLJ0Ca6smjwJ4VwVN96gVIE5GM71kHaGKxGyAtRDaB2NBhLVmpHyANRKzDO28W7FS3HQFpaIWa8TrfCXQwegJSL5k+8M9UJ+pm9QTEnCIZrR0MDQeQ9ua0iCcYQaBTV0CqNXQW/yiyYG7W1heQanPaCkciBXuH1BkQJzHcDQxmpgGkPatl4WkbCXO/bW9AqlNg4H0PPMi6A1IxkQmOZ8D0ousNSMVEEuyreTAQ6Q7IRJeCX2YZQHhv6SrBOmpkM+YUzN0BqSRQCupmTeCP9wdkhiOREwtEzgGEsWcF9BhK9R8fQDiN7A8DiR0CKXQlj/q9IM8OgXjIzcKBlAHkD6FulgNzJwPIHwpo8mQAkX3LiPq9dKUMAQk9AqmcqmjuBAJCPQIpA4guIAsKJA0gnwNy3A4kDyBIHCEPxAwgf8gPILqA5AFEF5CxZX0lIHYc6rqADLf380BmFMgxgIzUyf8MJKLTRelKHgKy9wgkjfS7LiA0gKgC8vQn3HUA4RQ5LKPIAQciWbqIEg0YkLNDIHYUyqkCsmKN5vg3+W0AYTRATaPY+uu1IwS6UMGAlO6AFPjSCQMStaNh53cdcPG7Hx1Uupo+rx+Bltn1BuTAj5BptEV/bHAAwbnJMICwRmtUDOSEA8s4Rmtw3nITGD6TwUNoG0Ca7xi2YKSPj2eKXQFxQWKA2QbGMWEMMGseOb7C7T47uJS1JyAzVbTjqZdU3zbHzMXWS+qp4Fgn8Ahy/QCRGqQcwU1vGnN7fylboWn8Bzg//hyjxltvdcl45bwFfYKzFyBy11UU9BnjuoqfWizVlQXulpzBTNbaB5Aid+VRrkBFB630AMS9BC8FK2ggE7u/FGy1kvfcB9TKQufX5uUXNWl3EjvWCi4k/u9A3Ddq1CpTIQGe6VN1qd8ArcvDQNw3S41Kn6qQmOq5e7pRr+8fAYLiIJtFrrvYRMYL0q06vj8EZLXUriJzRY8H1xEagOCK7gkghRg6RQYO0I6aWPwIEAru80AiMWSdzAeuDXUKyr+WqpAID8hMHC1Ct8F4mUsQ6W8pJMICki0JHCBczAFdBl38G3VE6ErQhhWlih4LWrCSLpaqjggHiGe9mVjRY0YPoelyqcqIcIDEe97rqJFFH7FcLlUZEQ6Qg5plvZiBFNhtri1VFREGEC/Eg4nZoU5vqi1VFREGkIXDQ8xAIhzoT/WlKiLCAFIYPOQMxOPdjfWlKiLCADJRm3YGj+pDE2xktmmpaogwgMz8d8GrumZ4xzpbvinqISJ+hiTWm7wEqoJdI9JEV9JChAEkS3xCZzKecLcgN6YwlRBhAGmweTsblg6qKMM7Vmh321UQ4QAp1VfwhqVJIh+Wm03W0qV0EOEAybXtivkCmWrKeH2EZ/xBaSBCV2L9Re+LYSqJJIxDu1ew07U0EGEBcTtmHty4JuPtQhvLh1BAhK7Uvvq0GK484QZST0GvvFDqeSJ1IA0r2mfDljvqBoJ//rVsq7yZCA6kXgVkJ2f4ijIGMjOfMVsCBBORB2Jy+sM6ijNvaBUqmw/cStZ8EiKciHwp6Rp++88qmxXQeTUxDiJWJ9wSISvBicgXW+dypn1PqWTznlwgwdZdfiLHr5OELEAEASKvJFRE5JCPKbh8OxHdQKJU0crEzRXrJ/IEkFms6tGyrUw9kQeALFRXvK2iSzsRAAi6BLxM+60xdsqJAEBuXMAMxDLVp+gmAgC57/UT4qvVj3TVRCAgSAYL91aXtyNLzUQAIFhAiP8m0/NHOp+ILiBtPFKrs6bgSOcT0QTEB8nO3QR1yKslggKRf+m11UB0HOl8IlqAeCvauXuo8HnfIqIDyCw6G8XMcGiplMingMzCnbuHFp/3LSLPA4nUpqm5YkWNzwsQeQxIDsKjH5wVSU5qJPIJIIt4jjpqNBAekQeBfJOeHWS81FQoo4/I7UDcS3wUh0liTzLqiEgDqddx4ZHDrNZAACIAEMw88HPYWb0GAhABgEDmgf9Vb5oNBCByOxD3uqWYbCHVBgIQuRlIsbfwMEG5gQBE7gSyHMDsOayrxJvHBRC5B0hOxJH1nK4SlUE6QOR+IG6ju3iYQEqDdIDIzUDyZu/jMRHpS/OiRG4FkiPRfTw8kbrvIAJEACAIDpyHC1/GQHhEbgKSXwTyqIeEur6kixEBgABHOTr7YSX1MSFAhA0E307wUU76Y0KACAsI/tvCRzkF+iIuL0AEAYLbR2QOfvhKJ/obRESBxNt5rPSFXN4f7dyNdqMgEIbhAXWwJErT/e7/Wreb5HTT07QVgWSAeW5g7b4n8qOSUCRPEId4HP93SXp5dDNGRJFcQTxihSH+NW1Bb1cXKpIryJAwnG/zhl8ZcSP6jiKZghwRaaWLnP/AkcSKKJIniEcUs8QfjFLdEmRvkSxB4lfn0QN6DY+lshQpHiT96Dlr6r5hxRUpHST9ZEY71X7DOmOZQVZLsd5Q8wzrPxYYJDiKNqOBG1ZCkZKzrNXu6lHvkjChSFqQsdTPg45ApXtYaUXKr9TNuPcvqO2pVMkitFXAL2a79/qr3HQvVSTXUtofCl79RDXh5CDpw3pwu6+9kRlvtiI5VtPhmHLltT4EKVQkfb8pcOHrXqk6nBAksUjgpKtuYsskaxGKYT0+84uYgziE4YQgMdx0m8PRfis2MbL33PMXoVjD6PEunI4HSjDjStiJP08vQk9hZzQ7oH/geoLYCUBDW4rf4FqCDFt7THUO6B+4jiDn2XNTW7zf4hqCMND4BOsGyw+yAmh0x+QeFh7EeqD5Ce8nLDrI8NpbDyIWHIQNruo4GyAPlhrEzuixBxHLDDJMnfYgYolBricHNfjIdgMWF+Qyu+pkgX4HCwuymL57ELGkIHZG7z2IWE6Q5VV7vGMhQewbtMcZiwhyHj26ne9+xs8PcvDQHnFFqCD7Au0RW4TK+fOKqw4eoOcqYqgU53HR3/5uShFPCfKey9hFDyJO/vAi7RDZnp7X5igyUH72xSDW1E2Pn4tMRCQgR8vLwbgii4gcmLvqQcSPGtIPX3M08wn6I4qYQ94cM/Yw9Xxhmw+X/59wHrtMlX1AmIkzdyaaAnLg1Nnw8WGYSk40X/BOh4+El6LMSBnN2Cd0tPq4w/LJXGrMbCX06PZ2dcM65yzlNertShSHf3SzRAyPM332IcSAHUKPi8EHmXU0l8Uglmni0yipDoi16s+jJKejhywLooz68yiMEcHr2qM4h81CJ++VPJfTu5UwBpv4Pp9DJSi6MJx0bvUwiw4ewgT8zNR0LHUL+OccOpY/3ElzyGKD5pBlMJpDlsOkMythRoNbXh95PJsdA67MrMtAEYbjeDqNo+7oKqWUUkoppZRSSimllFJKFfMXp4vmSjB8n6sAAAAASUVORK5CYII="),Gy.IMAGE}dispose(){super.dispose(),this.started=!1,delete this._audio}async ready(){super.ready(),this._audio=new Audio;const{src:t="",loop:e=!1,started:n=!1}=this.state;if(t){const e=this.root?.app?.loadTracker;if(e){const n=new Promise((e,n)=>{this._audio.addEventListener("canplay",()=>e(),{once:!0}),this._audio.addEventListener("error",()=>n(new Error(`Audio load failed: ${t}`)),{once:!0})});e.track(`audio:${t}`,"audio",t,n)}}this._audio.addEventListener("canplay",()=>{this.started&&this._audio.play()}),this.onchangeSrc(t),this.onchangeLoop(e),this.onchangeStarted(n)}render(t){const{left:e,top:n,width:i,height:s}=this.state;t.beginPath(),this.drawImage(t,Gy.image,e,n,i,s)}get nature(){return $y}get hasTextProperty(){return!1}get src(){return this.get("src")}set src(t){this.set("src",t)}get started(){return!!this.get("started")}set started(t){this.set("started",t)}start(){this._audio&&(this._audio.classList.add("active"),this._audio.play())}pause(){this._audio&&(this._audio.classList.remove("active"),this._audio.pause())}onchangeSrc(t){try{"data"!==String(t).substring(0,4)?this._audio.crossOrigin="use-credentials":this._audio.crossOrigin=null,this._audio.src="string"==typeof t?this.app.url(t):t}catch(t){return void Bi(t)}}onchangeStarted(t){const e=this._audio;t?4==e.readyState&&e.play():e.pause()}onchangeLoop(t){this._audio.loop=t}onchange(t,e){"src"in t&&this.onchangeSrc(t.src),"started"in t&&this.onchangeStarted(t.started),"loop"in t&&this.onchangeLoop(t.loop)}ondblclick(t){this.started=!this.started}ondropfile(t,e){for(let n=0;n<t.length;n++)if(t[n].type.startsWith("audio/"))return void(this.src=e[n])}}hc.register("audio",Gy);class Vy extends(pc(hc)){is3dish(){return!0}}hc.register("text",Vy);const Uy=["refid","left","top","width","height","rotation","animation","zPos"];class Yy extends Wg{isGroup(){return!0}is3dish(){return!0}get showMoveHandle(){return!1}get(t){return this._model[t]}set(t,e){if("string"==typeof t)return this.set({[t]:e});const n=Uy.reduce((e,n)=>(t.hasOwnProperty(n)&&(e[n]=t[n]),e),{});return super.set(n,void 0)}capture(t,e,n){const i=super.capture(t,e,n);if(i!==this)return i}set bounds(t){if(this.__MUTATING__)return void(super.bounds=t);const e=this.bounds,n=t.width/e.width,i=t.height/e.height;this.path=this.path.map(s=>({x:t.left+(s.x-e.left)*n,y:t.top+(s.y-e.top)*i})),this.components&&this.components.forEach(t=>{if(t.mutable)t.mutatePath(null,function(t){return t.map(function(t){return{x:t.x*n,y:t.y*i}})});else{const e=t.bounds,s=t.center,r={x:s.x*(1-n),y:s.y*(1-i)},o=e.width*(1-n),a=e.height*(1-i),c=-(r.x-o/2),l=-(r.y-a/2);t.bounds={left:e.left+c,top:e.top+l,width:e.width*n,height:e.height*i}}})}get focusible(){return!1}get bounds(){return super.bounds}get hasTextProperty(){return!1}isIdentifiable(){return!1}calculateBounds(){this.clearCache(),this.__MUTATING__=!0,this.mutateBounds(function(t){const e=hc.union(this.components.map(t=>t.bounds));return this.components.forEach(t=>{const n=t.bounds;t.bounds={left:n.left-e.left,top:n.top-e.top,width:n.width,height:n.height}}),{left:t.left+e.left,top:t.top+e.top,width:e.width,height:e.height}},this),this.__MUTATING__=!1,this.parent.isGroup()&&this.parent.calculateBounds?.()}render(t){}postrender(t){const{top:e,left:n}=this.state;t.translate(n,e),this.layout.drawables(this).forEach(e=>{e.draw(t)}),t.translate(-n,-e)}}hc.memoize(Yy.prototype,"bounds",!0),hc.register("group",Yy);const Wy={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"id-input",label:"ref",name:"ref"},{type:"select",label:"fit",name:"fit",property:{options:["","both","ratio"]}}],"value-property":"ref",help:"scene/component/local-ref"};class qy extends(pc(dc)){get ref(){const t=this.getState("ref");return t&&"string"==typeof t?this.root.findById?.(t):null}set ref(t){this.setState("ref",t)}get refScale(){const t=this.ref;if(!t)return{x:1,y:1};const e=t.bounds,n=this.bounds,i=n.width/e.width,s=n.height/e.height;return"both"===this.model.fit?{x:i,y:s}:{x:Math.min(i,s),y:Math.min(i,s)}}draw(t){this._drawing||(this._drawing=!0,super.draw(t),this._drawing=!1)}prerender(t){if(super.prerender(t),this.ref){const e=this.ref.center,n=this.center,i=this.refScale;t.translate(n.x,n.y),t.scale(i.x,i.y),t.translate(-e.x,-e.y)}}postrender(t){if(this.ref)return this.ref.postrender(t);super.postrender(t)}render(t){if(this.ref)return this.ref.render(t);const{left:e,top:n,width:i,height:s}=this.bounds;t.beginPath(),t.rect(e,n,i,s)}get nature(){return Wy}get hasTextProperty(){return!1}}hc.memoize(qy.prototype,"ref",!1),hc.memoize(qy.prototype,"refScale",!1),hc.register("local-ref",qy);class Xy extends($g(Rl)){render(t){}is3dish(){return!0}get layout(){return _c.get(this.get("layout"))||vc}}const Ky={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"board-selector",label:"scene-number",name:"ref",placeholder:"SCENE-1"},{type:"number",label:"round",name:"round",property:{min:0}},{type:"select",label:"fit",name:"fit",property:{options:["","both","ratio","width","height","none"]}},{type:"select",label:"mode",name:"mode",property:{options:["view","interaction"]}}],"value-property":"ref",help:"scene/component/global-ref"};class Qy extends Xy{dispose(){this._releaseRef(),super.dispose()}get nature(){return Ky}get hasTextProperty(){return!1}get tagName(){return"div"}setElementProperties(t){const{mode:e="view",round:n=0}=this.state;t.style.pointerEvents="view"==e?"none":"inherit",t.style.borderRadius=n+"px"}async ready(){super.ready(),this.fetchRef()}reposition(){if(!this.element)return;super.reposition();const t=this._element_bounds,{offsetWidth:e,offsetHeight:n}=this.element;if(this._element_bounds={offsetWidth:e,offsetHeight:n},(!t||t.offsetWidth!=e||t.offsetHeight!=n)&&this.ref&&this.root.target_element){const{fit:t="ratio"}=this.state;this.ref.fit(t)}}async fetchRef(){this._releaseRef();const{ref:t,fit:e="ratio"}=this.state;if(!t)return;const n=this.app.refProvider;if(n&&t){const i=(async()=>{this.__ref=await n.get(t,!0),this.__ref.target=this.element,this.__ref.fit(e),this.__ref.data=this.data})();this.root?.app?.loadTracker?.track(`ref:${t}`,"ref-board",t,i);try{await i}catch(t){Bi(t)}}}get ref(){return this.__ref}set ref(t){this.setState("ref",t)}_releaseRef(){this.__ref&&this.__ref.release&&this.__ref.release(),delete this.__ref}onchange(t,e,n){super.onchange(t,e),"ref"in t&&this.fetchRef(),"fit"in t&&this.ref&&requestAnimationFrame(()=>{const{fit:t}=this.state;this.ref.fit(t)}),"data"in t&&this.ref&&requestAnimationFrame(()=>{this.ref.data=t.data})}}hc.register("global-ref",Qy);const Zy="center-middle",Jy={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"board-selector",label:"board",name:"board"},{type:"checkbox",label:"modal",name:"modal"},{type:"checkbox",label:"closable",name:"closable"},{type:"checkbox",label:"draggable",name:"draggable"},{type:"checkbox",label:"minimizable",name:"minimizable"},{type:"checkbox",label:"show",name:"show"},{type:"select",label:"popup-position",name:"popupPosition",property:{options:["static","absolute"]}},{type:"select",label:"popup-origin",name:"origin",property:{options:["left-top","center-top","right-top","left-middle",Zy,"right-middle","left-bottom","center-bottom","right-bottom","auto"]}},{type:"string",label:"title",name:"text"},{type:"data",label:"value",name:"value"},{type:"string",label:"container-ref",name:"containerRef",placeholder:"PopupContainer id (same board)"},{type:"textarea",label:"html-template",name:"htmlTemplate",property:{language:"html"}},{type:"string",label:"anchor-ref",name:"anchorRef",placeholder:"component id (3D-tracked anchor)"},{type:"select",label:"anchor-pin",name:"anchorPin",property:{options:[{display:"Top",value:"top"},{display:"Center",value:"center"},{display:"Bottom",value:"bottom"}]}},{type:"number",label:"anchor-offset-x",name:"anchorOffsetX"},{type:"number",label:"anchor-offset-y",name:"anchorOffsetY"},{type:"number",label:"anchor-offset-z",name:"anchorOffsetZ"},{type:"checkbox",label:"constant-size",name:"constantSize"},{type:"checkbox",label:"tether",name:"tether"},{type:"select",label:"off-screen",name:"offScreen",property:{options:[{display:"Hide",value:"hide"},{display:"Edge-pin",value:"edge-pin"},{display:"Keep last",value:"keep-last"}]}}],help:"scene/component/popup"};class tb extends(pc(dc)){static get image(){return tb._image||(tb._image=new Image,tb._image.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAABGCAMAAABG8BK2AAADJmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuZGFiYWNiYiwgMjAyMS8wNC8xNC0wMDozOTo0NCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkM4QzQxNUMzMzBEMTFFQ0JEMzZDMDUwQUI4MEI3QTAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkM4QzQxNUQzMzBEMTFFQ0JEMzZDMDUwQUI4MEI3QTAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpENjlENTQ3RjMzMDkxMUVDQkQzNkMwNTBBQjgwQjdBMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENjlENTQ4MDMzMDkxMUVDQkQzNkMwNTBBQjgwQjdBMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsiUYSQAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA51BMVEVHcEwzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzOguTm2AAAATHRSTlMARhB73r9B7YLrsqdE+0cq9Avzeg31eQx4aQ+Ks6aUd5DsYKixEX1w8vyT2VjoZ3YezY/cCEDvl+QTvRwJ0ifwK/5T/aw6+IuFuCImAcS6MQAAAeJJREFUWMPt2FlX2zAQhuHJYmOSFhIggbC0QNn3rS1dKXSH9///Hi58CJLxKIpEWi6YO8c5z4lG/nxGEXmu/1OVLGnhrFaSVQYg1SZetTTvUibqeFZ9QlfmvRWoV1VmCaCRzroXPpsuAjTV7gLUfPahBqD1OQMW/fazAWTKvQRI/ZgUSJR7U8CM/dHZ+/2VcatWdvdEZAaYUhiAwkerJXt0rnzXwdRKmHfDM0fHD5kxjTFyVLzVfvvirn7+cDJWjhy7c7XlYuwc6Urvu2tRhRypyhwAf1sKY+TIxfQA+H39q5wxc+RgVrcBduTmZTlj5khnDgH4IzKpMGaOVCbvyyvRGTNHGtPrKypjXirM5jb910I4k69oQeKY+77EMAcALEsck/+W6f71tyCma/ZFROTrJVwMy7wmf3bv6/MX+Dgkkysblvxps/dhOKZb6IvrTakzXXuPApnpYneDGOeKvJlaSXcDmA7AicQyW84VeTOnY+NdiWcG1uiZksFEHdyAlsJEjEkmkwGNsKHNZCJGSKtVTYC1tO022mnjwUBrMdXg8dreuOBhv7D/62/8lGZ1wLxXyZKOm+iUHIQintyny0TkaATHjYgcjeAoFpEje9R/nGPqIx2aw3NU9odCQI6e6x/VLY32cKQXVBnkAAAAAElFTkSuQmCC"),tb._image}async ready(){await super.ready(),this.show&&this.onchangeShow(!0)}render(t){const{left:e,top:n,width:i,height:s}=this.bounds;t.beginPath(),this.drawImage(t,tb.image,e,n,i,s)}onchange(t,e){"value"in t?this.show?this.onchangeShow(!0):this.show=!0:"show"in t&&this.onchangeShow(this.show)}onchangeShow(t){if(this.app.isEditMode)return;(this.getState("board")||this.getState("containerRef")||this.getState("htmlTemplate"))&&(t?this.openPopup(this.value):this.hidePopup())}openPopup(t,e){if(this.app.isEditMode)return;const n=this.getState("anchorRef"),i=n&&this.rootModel?.findById?this.rootModel.findById(n):void 0;Zu.show(this,this.getState("board"),{origin:this.getState("origin")||Zy,modal:this.getState("modal"),closable:this.getState("closable")||!1,draggable:this.getState("draggable")||!1,minimizable:this.getState("minimizable")||!1,popupPosition:this.getState("popupPosition"),title:this.text,data:t||this.value,containerRef:this.getState("containerRef"),htmlTemplate:this.getState("htmlTemplate"),anchor:i,anchorPin:this.getState("anchorPin")||"top",anchorOffsetX:this.getState("anchorOffsetX")??0,anchorOffsetY:this.getState("anchorOffsetY")??0,anchorOffsetZ:this.getState("anchorOffsetZ")??0,constantSize:this.getState("constantSize")??!0,tether:this.getState("tether")??!1,offScreen:this.getState("offScreen")||"hide",...e})}hidePopup(){Zu.hide(this)}get board(){return this.getState("board")}set board(t){this.set("board",t)}get show(){return this.getState("show")}set show(t){this.setState("show",t)}get started(){return this.getState("show")}set started(t){this.setState("show",t)}get value(){return this.getState("value")}set value(t){this.setState("value",t)}get hasTextProperty(){return!1}get nature(){return Jy}}hc.register("popup",tb);const eb={mutable:!1,resizable:!0,rotatable:!1,properties:[{type:"layout",label:"layout",name:"layoutOption"},{type:"checkbox",label:"constant-size",name:"constantSize"},{type:"checkbox",label:"billboard",name:"billboard"},{type:"checkbox",label:"tether",name:"tether"},{type:"select",label:"off-screen",name:"offScreen",property:{options:[{display:"Hide",value:"hide"},{display:"Edge-pin",value:"edge-pin"},{display:"Keep last",value:"keep-last"}]}}],help:"scene/component/popup-container"};class nb extends Wg{get nature(){return eb}isPopupContainer(){return!0}}hc.register("popup-container",nb);class ib extends hc{render(t){const{path:e=[]}=this.state;if(!(e.length<=1)){t.beginPath(),t.moveTo(e[0].x,e[0].y);for(let n=1;n<e.length;n++)t.lineTo(e[n].x,e[n].y);t.closePath(),this.drawStroke(t,void 0)}}get path(){return this.model.path}set path(t){this.set("path",t)}contains(t,e){const n=this.state.path;let i=!1;return n.forEach((s,r)=>{const o=(r+n.length+1)%n.length,a=s.x,c=s.y,l=n[o].x,h=n[o].y;c>e!=h>e&&t<(l-a)*(e-c)/(h-c)+a&&(i=!i)}),i}}hc.register("path",ib);const sb={mutable:!0,resizable:!1,rotatable:!0,properties:[{type:"number",label:"round",name:"round",property:{min:0,max:100,step:1}}],help:"scene/component/triangle"};class rb extends dc{is3dish(){return!0}contains(t,e){const{x1:n,y1:i,x2:s,y2:r,x3:o,y3:a}=this.state,c=[n,i,s,r,o,a];let l=!1;for(let n=0;n<c.length;n+=2){const i=(n+2)%c.length,s=c[n],r=c[n+1],o=c[i+1];r>e!=o>e&&t<(c[i]-s)*(e-r)/(o-r)+s&&(l=!l)}return l}get mutable(){return!0}get path(){const{x1:t,y1:e,x2:n,y2:i,x3:s,y3:r}=this.state;return[{x:t,y:e},{x:n,y:i},{x:s,y:r}]}set path(t){this.set({x1:t[0].x,y1:t[0].y,x2:t[1].x,y2:t[1].y,x3:t[2].x,y3:t[2].y})}get nature(){return sb}}hc.memoize(rb.prototype,"path",!1),hc.register("triangle",rb);const ob={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"ratio",name:"ratio",property:"ratio"}],help:"scene/component/donut"},ab={ondragmove:function(t,e,n){let{cx:i,rx:s}=n.model;s=Math.abs(s);let r=(n.fromParent(t.x,t.y).x-i)/s*100;r=r>=100||r<=-100?100:Math.abs(r),n.set({ratio:r})}};class cb extends ly{is3dish(){return!0}render(t){let{ratio:e=50,cx:n,cy:i,rx:s,ry:r,startAngle:o,endAngle:a,anticlockwise:c}=this.state;s=Math.abs(s),r=Math.abs(r),t.beginPath(),t.ellipse(n,i,s,r,0,o||0,a||2*Math.PI,c),t.moveTo(n+s/100*e,i),t.ellipse(n,i,s/100*e,r/100*e,0,o||0,a||2*Math.PI,!0)}contains(t,e){let{cx:n,cy:i,rx:s,ry:r,ratio:o}=this.state;s=Math.abs(s),r=Math.abs(r);const a=(t-n)/(2*s-.5),c=(e-i)/(2*r-.5),l=(t-n)/(s/100*o*2-.5),h=(e-i)/(r/100*o*2-.5);let d=!1;return a*a+c*c<.25&&l*l+h*h>.25&&(d=!d),d}get controls(){let{cx:t,cy:e,rx:n,ratio:i}=this.state;return n=Math.abs(n),[{x:t+n/100*i,y:e,handler:ab}]}get nature(){return ob}}hc.memoize(cb.prototype,"controls",!1),hc.register("donut",cb);const lb={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"ratio",name:"ratio",property:"ratio"},{type:"number",label:"wing",name:"wing",property:"wing"}],help:"scene/component/star"},hb={ondragmove:function(t,e,n){const{cy:i,ry:s}=n.model;let r=(n.fromParent(t.x,t.y).y-i)/s*100+100;r>=100?r=100:r<=0&&(r=0),n.set({ratio:r})}};class db extends ly{is3dish(){return!0}render(t){const{ratio:e=30,wing:n=5,cx:i,cy:s,rx:r,ry:o}=this.state;if(n<3)return;const a=1.5707963267948966,c=2*Math.PI/n,l=r-e/100*r,h=o-e/100*o;t.save(),t.beginPath(),t.translate(i,s),t.moveTo(r*Math.cos(-a),o*Math.sin(-a)),t.lineTo((r-l)*(Math.cos(c-a)+Math.cos(0-a))/2,(o-h)*(Math.sin(c-a)+Math.sin(0-a))/2);for(let e=1;e<n;e++)t.lineTo(r*Math.cos(c*e-a),o*Math.sin(c*e-a)),t.lineTo((r-l)*(Math.cos(c*(e+1)-a)+Math.cos(c*e-a))/2,(o-h)*(Math.sin(c*(e+1)-a)+Math.sin(c*e-a))/2);t.closePath(),t.restore()}get controls(){const{cx:t,cy:e,ry:n,ratio:i}=this.state;return[{x:t,y:e-n+n*(i/100),handler:hb}]}get nature(){return lb}}hc.memoize(db.prototype,"controls",!1),hc.register("star",db);const ub={mutable:!1,resizable:!1,rotatable:!1,properties:[]};class pb extends(Nf(dc)){is3dish(){return!1}isDescendible(){return!1}render(t){const{cx:e,cy:n,anticlockwise:i}=this.state,s=this.app?.scale||1;t.beginPath(),t.scale(1/s,1/s),t.ellipse(e,n,Math.abs(pb.RADIUS),Math.abs(pb.RADIUS),0,0,2*Math.PI,i),t.scale(s,s),t.closePath()}get path(){const{cx:t,cy:e}=this.state;return[{x:t-pb.RADIUS,y:e-pb.RADIUS},{x:t+pb.RADIUS,y:e-pb.RADIUS},{x:t+pb.RADIUS,y:e+pb.RADIUS},{x:t-pb.RADIUS,y:e+pb.RADIUS}]}set path(t){const e=t[0],n=t[2];this.set({cx:e.x+(n.x-e.x)/2,cy:e.y+(n.y-e.y)/2})}contains(t,e){const{cx:n,cy:i}=this.state,s=(t-n)/(2*pb.RADIUS-.5),r=(e-i)/(2*pb.RADIUS-.5);return s*s+r*r<.25}outline(t){const{cx:e,cy:n}=this.state;return this.toScene(e,n)}get nature(){return ub}}pb.RADIUS=5,hc.memoize(pb.prototype,"path",!1),hc.register("node",pb);class fb extends iu{getObject3dInstance(){return new M.Mesh}build(){super.build();const{width:t,height:e}=this.component.bounds,n=this.component.state.depth||.5*Math.min(t,e),i=.15*Math.min(t,e,n),s=new v.RoundedBoxGeometry(1,1,1,4,i/Math.min(t,e,n));s.scale(t,n,e),this.object3d.geometry=s,this.object3d.material=new M.MeshStandardMaterial({color:"#5090d0",transparent:!0,opacity:.35,roughness:.6,metalness:.1,side:M.FrontSide,depthWrite:!1}),this.object3d.visible=!!this.component.app?.isEditMode}updateAlpha(){const t=this.object3d.material;t&&(t.opacity=this.component.app?.isEditMode?.35:0)}updateHidden(){this.object3d.visible=!!this.component.app?.isEditMode&&!this.component.state.hidden}updateDimension(){const{width:t,height:e}=this.component.bounds,n=this.component.state.depth||.5*Math.min(t,e);this.object3d.geometry.computeBoundingBox();const i=this.object3d.geometry.boundingBox;if(i){const s=i.max.x-i.min.x,r=i.max.y-i.min.y,o=i.max.z-i.min.z;this.setDimensionScale(t/s,n/r,e/o)}}updateFillStyle(){}updateStrokeStyle(){}updateText(){}clear(){return Vd(this.object3d),super.clear()}}const mb="data:image/svg+xml;base64,"+btoa('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="#5090d0">\n <path d="M32 20a12 12 0 1 0 0 24 12 12 0 0 0 0-24zm0 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12z"/>\n <path d="M55.4 27.2l-3.6-.6c-.4-1.2-.8-2.4-1.4-3.4l2.2-3c.6-.8.4-2-.2-2.6l-3-3c-.8-.6-1.8-.8-2.6-.2l-3 2.2c-1.2-.6-2.2-1-3.4-1.4l-.6-3.6c-.2-1-1-1.6-2-1.6h-4.2c-1 0-1.8.6-2 1.6l-.6 3.6c-1.2.4-2.4.8-3.4 1.4l-3-2.2c-.8-.6-2-.4-2.6.2l-3 3c-.6.8-.8 1.8-.2 2.6l2.2 3c-.6 1.2-1 2.2-1.4 3.4l-3.6.6c-1 .2-1.6 1-1.6 2v4.2c0 1 .6 1.8 1.6 2l3.6.6c.4 1.2.8 2.4 1.4 3.4l-2.2 3c-.6.8-.4 2 .2 2.6l3 3c.8.6 1.8.8 2.6.2l3-2.2c1.2.6 2.2 1 3.4 1.4l.6 3.6c.2 1 1 1.6 2 1.6h4.2c1 0 1.8-.6 2-1.6l.6-3.6c1.2-.4 2.4-.8 3.4-1.4l3 2.2c.8.6 2 .4 2.6-.2l3-3c.6-.8.8-1.8.2-2.6l-2.2-3c.6-1.2 1-2.2 1.4-3.4l3.6-.6c1-.2 1.6-1 1.6-2v-4.2c0-1-.6-1.8-1.6-2z"/>\n</svg>');class gb extends(pc(hc)){static get icon(){return gb._defaultIcon||(gb._defaultIcon=new Image,gb._defaultIcon.src=mb),gb._defaultIcon}get serviceName(){}get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new fb(this)}render(t){if(this.app?.isViewMode)return;const{left:e,top:n,width:i,height:s}=this.bounds,r=this.constructor.icon;t.beginPath(),t.globalAlpha=.6,this.drawImage(t,r,e,n,i,s),t.globalAlpha=1}added(t){super.added(t);const e=this.serviceName;e&&(this._registeredRoot=this.root,this._registeredRoot?.registerService?.(e,this))}removed(t){const e=this.serviceName;e&&this._registeredRoot&&(this._registeredRoot.unregisterService?.(e),this._registeredRoot=void 0),super.removed(t)}get controls(){return[]}}function yb(t){return class extends t{animOnValueChange(t,e=!1,n){if(t==this._lastValue)return;if(this.root?.app?.suppressAnimations)return this._lastValue=t,this._anim_alpha=0,void this.invalidate();let i;i=e?t-(Number(n)||0):t-(this._lastValue||0),this._lastValue=t,this._anim_alpha=-i,this.animate({step:t=>{this._anim_alpha=i*(t-1),this.invalidate()},duration:1e3,delta:"circ",options:{x:1},ease:"out"}).start()}dispose(){super.dispose(),delete this._value_substitutor}onchange(t,e){t.hasOwnProperty("value")&&delete this._value_substitutor}get animAlpha(){return this._anim_alpha||0}get animValue(){return(this._lastValue||0)+(this._anim_alpha||0)}defaultValueSubstitutor(){return this.getState("value")}get valueSubstitutor(){return this._value_substitutor||(this._value_substitutor=kr(this.getState("value"),this,void 0)||this.defaultValueSubstitutor),this._value_substitutor}get value(){return Number(this.valueSubstitutor())||0}set value(t){delete this._value_substitutor,this.setState("value",Number(hi(t)))}}}function bb(t){return class extends t{_convertDataFormat(t,e){let n;if("json"===e)n=JSON.parse(t);else n=t;return n}isDataSource(){return!0}}}function _b(t){var e;return(e=class extends t{is3dish(){return!0}get hasTextProperty(){return!1}get capturable(){return!1}render(t){}}).raycastTargetDefault=!1,e.requires3d=!0,e}const vb="$base_url",xb=[{type:"gltf-preset",label:"preset",name:"preset"},{type:"gltf-selector",label:"url",name:"src",property:{displayField:"id",displayFullUrl:!0,baseUrlAlias:vb,defaultStorage:"3d-model",storageFilters:{type:Array,value:[{name:"category",value:"image"}]},useUpload:!0,category:"application"},observe:function(t){const e=this.parentNode?.querySelector("[name=gltfInfo]");e&&(e.src=t);const n=this.parentNode?.querySelector("[name=fillStyleTargets]");n&&(n.src=t);const i=this.parentNode?.querySelector("[name=playTargets]");i&&(i.src=t)}},{type:"gltf-info",label:"",name:"gltfInfo",readonly:!0,property:{action:(t,e)=>{t._ratioLocking=!0;try{t.set(e)}finally{t._ratioLocking=!1}}},editor:{fullwidth:!0}},{type:"gltf-fill-targets",label:"fill-targets",name:"fillStyleTargets",editor:{fullwidth:!0}},{type:"gltf-play-targets",label:"play-targets",name:"playTargets",editor:{fullwidth:!0}}];function wb(t){return class extends t{constructor(){super(...arguments),this._snapshotLoading=!1,this._ratioLocking=!1}is3dish(){return!0}get hasTextProperty(){return!1}get controls(){return[]}render(t){const{left:e,top:n,width:i,height:s}=this.bounds;t.beginPath();const r=this._topViewSnapshot;if(r)return void t.drawImage(r,e,n,i,s);this._ensureTopViewSnapshot(),t.rect(e,n,i,s),t.fillStyle="#f0f0f0",t.fill(),t.strokeStyle="#999",t.lineWidth=1,t.stroke();const o=this.getState("src"),a=o&&o.split("/").pop()?.replace(/\.[^.]+$/,"")||"GLTF",c=Math.max(10,.12*Math.min(i,s));t.fillStyle="#666",t.font=`${c}px sans-serif`,t.textAlign="center",t.textBaseline="middle",t.fillText(a,e+i/2,n+s/2,.9*i)}onchange(t,e){super.onchange?.(t,e),"src"in t&&(this._topViewSnapshot=void 0)}_ensureTopViewSnapshot(){if(this._snapshotLoading)return;const t=this.getState("src");if(!t)return;const e=hu.getTopViewCache(t);if(e)return this._topViewSnapshot=e,void this.invalidate();this._snapshotLoading=!0;const n=this.app.url(t);hu.loadGLTF(n).then(e=>{if(this._snapshotLoading=!1,this.getState("src")!==t)return;const n=hu.getTopViewCache(t);if(n)return this._topViewSnapshot=n,void this.invalidate();const i=hu.renderTopView(e.scene);hu.setTopViewCache(t,i),this._topViewSnapshot=i,this.invalidate()}).catch(()=>{this._snapshotLoading=!1})}buildRealObject(){return new hu(this)}get source(){return this.getState("src")}set source(t){this.setState("src",t)}get play(){return!1!==this.getState("play")}set play(t){this.setState("play",t)}get nodes(){return this.getState("nodes")}set nodes(t){this.setState("nodes",t)}get animations(){return this.getState("animations")}set animations(t){this.setState("animations",t)}get playTargets(){return this.getState("playTargets")}set playTargets(t){this.setState("playTargets",t)}get fillStyleTargets(){return this.getState("fillStyleTargets")}set fillStyleTargets(t){this.setState("fillStyleTargets",t)}get nodeNames(){const t=this.realObject;return t?.nodeNames??[]}get animationNames(){const t=this.realObject;return t?.animationNames??[]}set dimension(t){const{width:e=1,height:n=1,depth:i=1}=t;this.setState({width:e,height:n,depth:i}),this.realObject?.updateDimension()}_applyRatioLock(t){if(!("width"in t||"height"in t||"depth"in t))return t;const e=this.state.width||1,n=this.state.height||1,i=this.state.depth||1,s=df([(t.width??e)/e,(t.height??n)/n,(t.depth??i)/i]);return s?{...t,width:Math.round(e*s),height:Math.round(n*s),depth:Math.round(i*s)}:t}set(t,e){if("string"==typeof t&&(t={[t]:e}),this.state?.ratioLock&&!this._ratioLocking){this._ratioLocking=!0;try{t=this._applyRatioLock(t)}finally{}}try{return super.set(t)}finally{this._ratioLocking=!1}}setState(t,e){if("string"==typeof t&&(t={[t]:e}),this.state?.ratioLock&&!this._ratioLocking){this._ratioLocking=!0;try{t=this._applyRatioLock(t)}finally{}}try{return super.setState(t)}finally{this._ratioLocking=!1}}}}function Mb(t){return function(e){return Array.isArray(t)?t.forEach(t=>{hc.register(t,e)}):hc.register(t,e),e}}function Sb(t){return!!t&&"function"==typeof t.capacity&&"function"==typeof t.available}function Ab(t){if(Sb(t)){const e=t.capacity(),n=t.available();return{capacity:e,available:n,isFull:0===n}}if("function"==typeof t?.slotIds){const e=t.slotIds().length,n="function"==typeof t.emptySlotIds?t.emptySlotIds().length:e;return{capacity:e,available:n,isFull:0===n}}const e=t?.state?.capacity,n=Array.isArray(t?.state?.data)?t.state.data.length:0;if("number"==typeof e){const t=Math.max(0,e-n);return{capacity:e,available:t,isFull:0===t}}return{capacity:1/0,available:1/0,isFull:!1}}class Eb{constructor(){this.wasFull=!1,this.availableListeners=[],this.fullListeners=[]}notify(t){const e=0===t;if(e&&!this.wasFull){this.wasFull=!0;for(const t of this.fullListeners)try{t()}catch(t){}}else if(!e&&this.wasFull){this.wasFull=!1;for(const t of this.availableListeners)try{t()}catch(t){}}}onAvailable(t){return this.availableListeners.push(t),()=>{const e=this.availableListeners.indexOf(t);e>=0&&this.availableListeners.splice(e,1)}}onFull(t){return this.fullListeners.push(t),()=>{const e=this.fullListeners.indexOf(t);e>=0&&this.fullListeners.splice(e,1)}}dispose(){this.availableListeners=[],this.fullListeners=[]}}function kb(t,e){if(!t||!e)return()=>{};if("function"!=typeof t.pauseEmit||"function"!=typeof t.resumeEmit)return()=>{};if("function"!=typeof e.onFull||"function"!=typeof e.onAvailable)return()=>{};const n=e.onFull(()=>t.pauseEmit()),i=e.onAvailable(()=>t.resumeEmit());return Ab(e).isFull&&t.pauseEmit(),()=>{n?.(),i?.()}}class Cb{constructor(t,e=1,n="horizontal"){this.owner=t,this.itemSpacing=e,this.axis=n}positionAt(t,e,n,i){const s=e.maxCount??1/0;if(t<0||t>=s)return null;const r=this.owner?.state?.width??0,o=this.owner?.state?.height??0,a=i?.state?.width??0,c=i?.state?.height??0;return"horizontal"===this.axis?{x:t*this.itemSpacing,y:Math.max(0,(o-c)/2),z:0}:{x:Math.max(0,(r-a)/2),y:t*this.itemSpacing,z:0}}capacity(t){return t.maxCount??1/0}}function Tb(t,e,n,i,s,r,o){const a=n.w,c=n.h,l=i.w,h=i.h,d=i.d,u=[],p=l+s,f=h+s,m=Math.max(1,Math.floor((a+s)/p)),g=Math.max(1,Math.floor((c+s)/f)),y=m*g,b=r&&r>0?Math.floor(r):4;if("row"===t||"column"===t){const n=o?.advanceAlongX??!1,i=o?.reverse??!1,s=n?m:g,r=n?g:m,l=(t,e,i)=>((t,e,n)=>u.push({x:-a/2+(t+.5)*p,y:n*d+d/2,z:-c/2+(e+.5)*f}))(n?t:e,n?e:t,i);let h=0;for(let n=0;n<s&&h<e;n++){const o=i?s-1-n:n;if("column"===t)for(let t=0;t<r&&h<e;t++)for(let n=0;n<b&&h<e;n++)l(o,t,n),h++;else for(let t=0;t<b&&h<e;t++)for(let n=0;n<r&&h<e;n++)l(o,n,t),h++}return u}if("pyramid"===t){let t=e,n=0;for(;t>0;){const e=Math.max(1,m-n),i=Math.max(1,g-n),s=e*i,o=Math.min(t,s);for(let t=0;t<o;t++){const s=t%e,r=Math.floor(t/e),o=-a/2+(s+(m-e)/2+.5)*p,l=-c/2+(r+(g-i)/2+.5)*f;u.push({x:o,y:n*d+d/2,z:l})}if(t-=o,n++,1===e&&1===i){for(let e=0;e<t;e++)u.push({x:0,y:(n+e)*d+d/2,z:0});break}if(r&&n>=r)break}return u}if("pile"===t){const t=t=>(43758.5453*Math.sin(12.9898*t)%1+1)%1;for(let n=0;n<e;n++){const e=Math.floor(n/y),i=n%y,s=i%m,o=Math.floor(i/m),g=(t(2*n)-.5)*l*.2,b=(t(2*n+1)-.5)*h*.2,_=-a/2+(s+.5)*p+g,v=-c/2+(o+.5)*f+b;if(u.push({x:_,y:e*d+d/2,z:v}),r&&e>=r-1&&i===y-1)break}return u}for(let n=0;n<e;n++){const e=Math.floor(n/y);if(r&&e>=r)break;const i=n%y,s=i%m,o=Math.floor(i/m);let l=-a/2+(s+.5)*p;const h=-c/2+(o+.5)*f;"staggered"===t&&e%2==1&&(l+=p/2),u.push({x:l,y:e*d+d/2,z:h})}return u}class Pb{constructor(t,e={}){this.pattern=t,this.defaults=e}layout(t,e,n,i={}){const s=i.gap??this.defaults.gap??0,r=i.heightLimit??this.defaults.heightLimit,o=i.fill??this.defaults.fill;return Tb(this.pattern,t,e,n,s,r,o).map(t=>({position:t}))}}class Ob{constructor(t,e,n={}){this.cols=t,this.rows=e,this.defaults=n}layout(t,e,n,i={}){const s=Math.max(1,this.cols),r=Math.max(1,this.rows),o=s*r,a=i.gap??this.defaults.gap??0,c=n.w+a,l=n.h+a,h=[];for(let e=0;e<t;e++){const t=Math.floor(e/o),i=e%o,a=i%s,d=Math.floor(i/s);h.push({position:{x:(a-(s-1)/2)*c,z:(d-(r-1)/2)*l,y:t*n.d+n.d/2}})}return h}}class Db{constructor(t=.1,e=!1,n=!1){this.gapRatio=t,this.fillFromFar=e,this.sliceFirst=n}grid(t,e){const n=e.w*this.gapRatio,i=e.h*this.gapRatio;return{cols:Math.max(1,Math.floor((t.w-n)/(e.w+n))),rows:Math.max(1,Math.floor((t.h-i)/(e.h+i))),pitchX:e.w+n,pitchZ:e.h+i}}capacity(t,e,n){const{cols:i,rows:s}=this.grid(t,e);return i*s*Math.max(1,Math.floor(n))}layout(t,e,n,i={}){const{cols:s,rows:r,pitchX:o,pitchZ:a}=this.grid(e,n),c=n.d+n.d*this.gapRatio,l=null!=i.heightLimit?Math.max(1,Math.floor(i.heightLimit)):1/0,h=Number.isFinite(l),d=this.sliceFirst&&h,u=s*r,p=s*(h?l:1),f=s*r*(h?l:t),m=Math.min(t,f),g=[];for(let t=0;t<m;t++){let e,i,l;if(d){const n=Math.floor(t/p),r=t%p;e=r%s,l=Math.floor(r/s),i=n}else{l=Math.floor(t/u);const n=t%u;e=n%s,i=Math.floor(n/s)}this.fillFromFar&&(i=r-1-i),g.push({position:{x:(e-(s-1)/2)*o,z:(i-(r-1)/2)*a,y:l*c+n.d/2}})}return g}}function zb(t,e,n,i=0){for(let s=0;s<e.length;s++){const r=e[s],o=n[s];r&&o&&(r.parent!==t&&t.attach(r),r.position.set(o.position.x,i+o.position.y,o.position.z),o.rotation?r.quaternion.set(o.rotation.x,o.rotation.y,o.rotation.z,o.rotation.w):r.quaternion.identity())}}function Ib(t,e,n,i=.12){const s=e.left+e.width/2,r=e.top+e.height/2,o=Math.min(n.w,n.h)*i,a=new Map;for(const e of t){const t=`${Math.round(e.position.x)},${Math.round(e.position.z)}`;let i=a.get(t);i||(i={x:s+e.position.x-n.w/2+o,y:r+e.position.z-n.h/2+o,w:n.w-2*o,h:n.h-2*o,count:0},a.set(t,i)),i.count++}return[...a.values()]}function Rb(t){return{id:t?.state?.id??t?.id??t?.refid,type:t?.state?.type??t?.type}}const jb=new M.Euler;function Lb(t,e){jb.setFromQuaternion(new M.Quaternion(e.x,e.y,e.z,e.w),"YXZ"),t.rotationX=jb.x,t.rotation=-jb.y,t.rotationY=jb.z}const Fb="_transferSlotId",Nb=new Set(["left","top","width","height","depth","zPos","rotation","rotationX","rotationY","rotationZ","scale","translate","material3d","fillStyle","strokeStyle","lineWidth","lineDash","alpha","opacity","hidden","text","fontColor","fontSize","fontFamily","bold","italic","textAlign","textBaseline","shadow","border","cssText","object3d","_realObject","refid","id"]);function Bb(t){return class extends t{async ready(){await super.ready();const t=this.state?.data;Array.isArray(t)&&0===this._items.length&&!this.isRecordStorage&&this._reconcileItems(t)}set data(t){if(Array.isArray(t)){if(this.isRecordStorage){const e=this.setState;return void("function"==typeof e&&e.call(this,{data:t}))}this._reconcileItems(t)}else this.setState?.({data:t})}get data(){if(this.isRecordStorage)return this.state?.data??[];const t=this._exportSlotRecords();return 0===t.length?this.state?.data:t}_reconcileItems(t){const e=new Map;for(const n of t){const t=this._recordKey(n);t&&e.set(t,n)}const n=new Map;for(const t of this._items){const e=t[Fb];null!=e&&n.set(String(e),t)}for(const[t,i]of n)if(!e.has(t)){try{this.removeItem(i,!0)}catch{}try{i?.dispose?.()}catch{}}for(const[t,i]of e){if(n.has(t))continue;if(null==i.itemId)continue;const e=this._createItemFromRecord(i);if(e){e[Fb]=t;try{this.handoverIn(e)}catch{}}}for(const[t,i]of e){const e=n.get(t);if(e&&(i.itemState&&"function"==typeof e.setState))try{e.setState(i.itemState)}catch{}}}_exportSlotRecords(){const t=this.slotIds?.()??[],e=[],n=new Map,i=[];for(const t of this._items){const e=t[Fb];null!=e?n.set(String(e),t):i.push(t)}for(const i of t){const t=n.get(i)??null;e.push(this._slotRecordOf(i,t))}for(const t of i)e.push(this._slotRecordOf("",t));for(const[i,s]of n)t.includes(i)||e.push(this._slotRecordOf(i,s));return e}_recordKey(t){return t.slotId??t.cellId??""}_slotRecordOf(t,e){if(!e)return{slotId:t,itemId:null};const n=e?.state?.id;return{slotId:t,itemId:null!=n?String(n):null,itemType:e?.state?.type,itemState:this._extractItemState(e)}}_extractItemState(t){const e=t?.state;if(!e||"object"!=typeof e)return;const n=this._businessFields?.();if(Array.isArray(n)){if(0===n.length)return;const t={};for(const i of n)i in e&&void 0!==e[i]&&(t[i]=e[i]);return Object.keys(t).length>0?t:void 0}const i={};for(const t of Object.keys(e))Nb.has(t)||t.startsWith("_")||(i[t]=e[t]);return Object.keys(i).length>0?i:void 0}_businessFields(){return null}_createItemFromRecord(t){const e=t.itemType??t.type;if(!e)return null;try{const n=hc.register?.(e);if(n&&"function"==typeof n){return new n({type:e,...t.itemState??{}})}}catch{}return null}}}class Hb{positionAt(t,e,n){return 0!==t?null:e.localPosition??{x:0,y:0,z:0}}capacity(t){return 1}}const $b=new Hb,Gb=[{id:"__default__",maxCount:1/0}];function Vb(t){var e;return e=class extends t{get slots(){return[]}get arrangementStrategy(){return $b}canReceive(t,e){const n=null!==this.findSlot(t);return Au.log({role:"target",contract:"canReceive",component:this,args:{carrier:Rb(t)},result:n}),n}findSlot(t){const e=this.slots.length?this.slots:Gb;for(const n of e){if(n.allowedTypes?.length){const e=t?.state?.type??t?.type;if(!e||!n.allowedTypes.includes(e))continue}const e=n.maxCount??this.arrangementStrategy.capacity(n),i=this._countOccupied(n.id);if(!(i>=e))return Au.log({role:"target",contract:"findSlot",component:this,args:{carrier:Rb(t)},result:{slotId:n.id,occupied:i,max:e}}),n}return Au.log({role:"target",contract:"findSlot",component:this,args:{carrier:Rb(t)},result:null}),null}acceptanceRotation(t,e){}deliveryWorldRotation(t){const e=this.acceptanceRotation?.(t);if(!e)return;const n=this._realObject?.object3d;if(!n)return;n.updateWorldMatrix(!0,!1);const i=new M.Quaternion;n.getWorldQuaternion(i);const s=new M.Quaternion(e.x,e.y,e.z,e.w);return i.clone().multiply(s)}deliveryWorldPosition(t){const e=this._realObject,n=e?.object3d;if(!n)return;n.updateWorldMatrix(!0,!1);const i=new M.Vector3;n.getWorldPosition(i);const s=this._receivingSurfaceLocalY();if(null!==s){const t=new M.Vector3(0,s,0);return n.localToWorld(t),{x:i.x,y:t.y,z:i.z}}return{x:i.x,y:i.y,z:i.z}}attachPointFor(t){const e=t?.[Fb];if(!e)return null;const n=this.slots.find(t=>t.id===e);return n?{position:n.localPosition??{x:0,y:0,z:0},rotation:n.localRotation??{x:0,y:0,z:0},slotId:n.id}:null}placementFor(t,e={}){const n=t&&"object"==typeof t&&"state"in t?t:void 0,i=n?n.state??{}:t??{},s={width:Number(i.width)||0,height:Number(i.height)||0,depth:Number(i.depth)||0},r=e.slot??this.slots.find(t=>{const e=t.maxCount??this.arrangementStrategy.capacity(t);return this._countOccupied(t.id)<e});if(!r)return null;const o=e.index??this._countOccupied(r.id),a=e.occupantCount??o,c=this.arrangementStrategy.positionAt(o,r,a,n??{state:{...s}});if(!c)return null;const l=Number(this.state?.width)||0,h=Number(this.state?.height)||0,d=c.x+s.width/2-l/2,u=c.y+s.height/2-h/2,p=this._realObject,f=p?.placementMode??"floor",m="space"===f?0:"inverted"===f?-s.depth/2:s.depth/2,g=this._receivingSurfaceLocalY();let y;y=null!==g?g+m:r.localPosition&&Number.isFinite(r.localPosition.z)?r.localPosition.z+m:m-(p?.geometricOffsetY??0);const b=this.acceptanceRotation?.(n??s,r)??void 0;return b?{position:{x:d,y:y,z:u},rotation:b}:{position:{x:d,y:y,z:u}}}_zPosFromSeatY(t,e,n){const i=this._realObject,s=i?.receivingSurfaceY??0,r=!(!n.localPosition||!Number.isFinite(n.localPosition.z));if(0===s&&!r)return null;const o=Number(e)||0,a=i?.placementMode??"floor";return t-("space"===a?0:"inverted"===a?-o/2:o/2)+(i?.geometricOffsetY??0)-s}_receivingSurfaceLocalY(){const t=this._realObject,e=t?.receivingSurfaceY;return"number"!=typeof e||0===e?null:e-(t.geometricOffsetY??0)}_countOccupied(t){const e=this._items;if(e)return e.filter(e=>e?.[Fb]===t).length;const n=this.components;return n?n.filter(e=>e.parent===this&&e[Fb]===t).length:0}},e.__hasCapacity=!0,e}function Ub(t,e){const n=t.left??0,i=t.top??0,s=t.width??0,r=t.height??0;if(s<=0||r<=0)return[];const o="number"==typeof t.rotation?t.rotation:0,a=Math.cos(o),c=Math.sin(o),l=n+s/2,h=i+r/2,d="inbound"===e?-1:1;return[{lx:-s/2,lz:0,odx:-1,odz:0},{lx:s/2,lz:0,odx:1,odz:0},{lx:0,lz:-r/2,odx:0,odz:-1},{lx:0,lz:r/2,odx:0,odz:1}].map(t=>{var e,n;return{worldPos:(e=t.lx,n=t.lz,{x:l+e*a-n*c,z:h+e*c+n*a}),direction:{x:d*(t.odx*a-t.odz*c),z:d*(t.odx*c+t.odz*a)},halfSpan:0!==t.odx?r/2:s/2}})}function Yb(t,e){const n=t.left??0,i=t.top??0,s=t.width??0,r=t.height??0;if(s<=0||r<=0)return{inbounds:[],outbounds:[]};const o="number"==typeof t.rotation?t.rotation:0,a=e??"reverse"===t.status,c="vertical"===t.orientation||"horizontal"!==t.orientation&&s<r,l=n+s/2,h=i+r/2,d=c?r/2:s/2,u=c?0:1,p=c?1:0,f=Math.cos(o),m=Math.sin(o),g=(t,e)=>({x:l+t*f-e*m,z:h+t*m+e*f}),y=c?{lx:0,lz:-d}:{lx:-d,lz:0},b=c?{lx:0,lz:d}:{lx:d,lz:0},_=g(y.lx,y.lz),v=g(b.lx,b.lz),x={x:u*f-p*m,z:u*m+p*f},w=Math.hypot(x.x,x.z)||1,M={x:x.x/w,z:x.z/w},S={x:-M.x,z:-M.z},A=(c?s:r)/2;return a?{inbounds:[{worldPos:v,direction:S,halfSpan:A}],outbounds:[{worldPos:_,direction:S,halfSpan:A}]}:{inbounds:[{worldPos:_,direction:M,halfSpan:A}],outbounds:[{worldPos:v,direction:M,halfSpan:A}]}}function Wb(t){const e=t.left??0,n=t.top??0,i=t.width??0,s=t.height??0;if(i<=0||s<=0)return null;const r="number"==typeof t.rotation?t.rotation:0,o="vertical"===t.orientation||"horizontal"!==t.orientation&&i<s,a=e+i/2,c=n+s/2,l=o?s/2:i/2,h=Math.cos(r),d=Math.sin(r),u=(t,e)=>({x:a+t*h-e*d,z:c+t*d+e*h});return{start:o?u(0,-l):u(-l,0),end:o?u(0,l):u(l,0)}}function qb(t){const e=t.cx??0,n=t.cy??0,i=Math.abs(t.rx??100),s=Math.abs(t.ry??100),r=t.ratio??50,o=(i+i*r/100)/2,a=(s+s*r/100)/2,c=t.startAngle??0,l=t.endAngle??Math.PI/2,h="reverse"===t.status;if(i<=0||s<=0)return{inbounds:[],outbounds:[]};const d={x:e+o*Math.sin(c),z:n-a*Math.cos(c)},u={x:e+o*Math.sin(l),z:n-a*Math.cos(l)},p={x:Math.cos(c),z:Math.sin(c)},f={x:Math.cos(l),z:Math.sin(l)};return h?{inbounds:[{worldPos:u,direction:{x:-f.x,z:-f.z}}],outbounds:[{worldPos:d,direction:{x:-p.x,z:-p.z}}]}:{inbounds:[{worldPos:d,direction:p}],outbounds:[{worldPos:u,direction:f}]}}function Xb(t){const e=Yb(t),n=e.outbounds[0];if(!n)return{inbounds:Ub(t,"inbound"),outbounds:[]};const i=Ub(t,"inbound").filter(t=>{const e=t.worldPos.x-n.worldPos.x,i=t.worldPos.z-n.worldPos.z;return Math.hypot(e,i)>1}),s=n.direction,r=[];for(const t of i){const e=t.direction.x*s.x+t.direction.z*s.z;if(Math.abs(e)>=.1)continue;const n=t.direction.x+s.x,i=t.direction.z+s.z,o=Math.hypot(n,i)||1;r.push({worldPos:t.worldPos,direction:{x:n/o,z:i/o},halfSpan:t.halfSpan})}return{inbounds:[...i,...r],outbounds:e.outbounds}}function Kb(t,e,n={}){const i=n.distance??5,s=n.cosine??.9;if(t.direction.x*e.direction.x+t.direction.z*e.direction.z<s)return!1;const r=t.worldPos.x-e.worldPos.x,o=t.worldPos.z-e.worldPos.z;if("number"==typeof t.halfSpan&&"number"==typeof e.halfSpan){const n=t.direction.x,s=t.direction.z;if(Math.abs(r*n+o*s)>i)return!1;const a=Math.abs(r*-s+o*n);return t.halfSpan+e.halfSpan-a>0}return Math.hypot(r,o)<=i}function Qb(t,e,n,i=0){const s=n.width??0,r=n.height??0;if(s<=0||r<=0)return!1;const o=(n.left??0)+s/2,a=(n.top??0)+r/2,c="number"==typeof n.rotation?n.rotation:0,l=Math.cos(-c),h=Math.sin(-c),d=t-o,u=e-a,p=d*l-u*h,f=d*h+u*l;return Math.abs(p)<=s/2+i&&Math.abs(f)<=r/2+i}function Zb(t,e,n){const i=n.width??0,s=n.height??0;if(i<=0||s<=0)return 1/0;const r=(n.left??0)+i/2,o=(n.top??0)+s/2;let a=t.x-r,c=t.z-o,l=e.x,h=e.z;const d="number"==typeof n.rotation?n.rotation:0;if(0!==d){const t=Math.cos(-d),e=Math.sin(-d),n=a*e+c*t,i=l*e+h*t;a=a*t-c*e,c=n,l=l*t-h*e,h=i}const u=i/2,p=s/2;let f=-1/0,m=1/0;if(Math.abs(l)<1e-9){if(a<-u||a>u)return 1/0}else{const t=(-u-a)/l,e=(u-a)/l;f=Math.max(f,Math.min(t,e)),m=Math.min(m,Math.max(t,e))}if(Math.abs(h)<1e-9){if(c<-p||c>p)return 1/0}else{const t=(-p-c)/h,e=(p-c)/h;f=Math.max(f,Math.min(t,e)),m=Math.min(m,Math.max(t,e))}return m<f?1/0:f>=0?f:m>=0?Math.min(-f,m):-m}function Jb(t,e,n,i=6){return!!Qb(t.worldPos.x,t.worldPos.z,e,i)&&(!n||t.direction.x*n.x+t.direction.z*n.z>=0)}function t_(t,e,n){return t.outbounds.map(t=>{const i=[];for(const s of e){let e=null;for(const i of s.topology.inbounds){if(!Kb(t,i,n))continue;const s=t.worldPos.x-i.worldPos.x,r=t.worldPos.z-i.worldPos.z,o=Math.hypot(s,r);(null===e||o<e)&&(e=o)}if(null===e&&s.bounds){const i=s.topology.outbounds[0]?.direction,r=!(s.topology.outbounds&&s.topology.outbounds.length)?n?.sinkMargin??30:6;if(Jb(t,s.bounds,i,r)){const n=Zb(t.worldPos,t.direction,s.bounds);if(Number.isFinite(n))e=n+1e3;else{const n=(s.bounds.left??0)+(s.bounds.width??0)/2,i=(s.bounds.top??0)+(s.bounds.height??0)/2;e=Math.hypot(t.worldPos.x-n,t.worldPos.z-i)+1e3}}}null!==e&&i.push({id:s.id,dist:e})}return 0===i.length?null:(i.sort((t,e)=>t.dist-e.dist||(t.id<e.id?-1:1)),i[0].id)})}function e_(t,e){const n=new Map;for(const e of t)n.set(e.id,e);const i=new Map,s=new Set;for(const n of t){const r=t.filter(t=>t.id!==n.id),o=t_(n.topology,r,e);i.set(n.id,o);for(const t of o)null!=t&&s.add(t)}const r=(t,e)=>{if(!n.has(t)||!n.has(e)||t===e)return;const r=i.get(t)??[];r.includes(e)||(r.push(e),i.set(t,r),s.add(e))};for(const e of t)if(e.links){for(const t of e.links.downstream??[])r(e.id,t);for(const t of e.links.upstream??[])r(t,e.id)}const o=new Set,a=new Set;for(const e of t){(i.get(e.id)??[]).some(t=>null!=t)||o.add(e.id),s.has(e.id)||a.add(e.id)}return{nodes:n,out:i,sinks:o,sources:a}}function n_(t,e){const n=new Map;return(t.out.get(e)??[]).map(e=>{if(null==e)return new Set;const i=new Set([e]);for(const s of function(t,e,n){const i=n.get(e);if(i)return i;const s=new Set,r=[e],o=new Set([e]);for(;r.length;){const e=r.shift();for(const n of t.out.get(e)??[])null!=n&&(s.add(n),o.has(n)||(o.add(n),r.push(n)))}return n.set(e,s),s}(t,e,n))i.add(s);return i})}function i_(t,e,n,i){return e===n?0:function(t,e,n){const i=n.get(e);if(i)return i;const s=new Map([[e,0]]),r=[e];for(;r.length;){const e=r.shift(),n=s.get(e);for(const i of t.out.get(e)??[])null==i||s.has(i)||(s.set(i,n+1),r.push(i))}return n.set(e,s),s}(t,e,i).get(n)??1/0}function s_(t,e,n){const i=t.out.get(e)??[],s=new Map,r=[];for(let e=0;e<i.length;e++){const o=i[e];if(null==o)continue;const a=o===n?0:i_(t,o,n,s);a!==1/0&&r.push({i:e,hops:1+a})}return r.sort((t,e)=>t.hops-e.hops||t.i-e.i),r.map(t=>t.i)}function r_(t,e,n){const i=s_(t,e,n);return i.length?i[0]:-1}function o_(t,e,n){return e===n||s_(t,e,n).length>0}function a_(t,e){const n=new Set;for(const i of n_(t,e))for(const e of i)t.sinks.has(e)&&n.add(e);return n}function c_(t,e,n){return l_(t,e,n).map(t=>t.index)}function l_(t,e,n){const i=n instanceof Set?n:new Set(n);if(0===i.size)return[];const s=t.out.get(e)??[],r=new Map,o=[...i].sort(),a=[];for(let e=0;e<s.length;e++){const n=s[e];if(null==n)continue;let i=1/0,c="";for(const e of o){const s=1+(n===e?0:i_(t,n,e,r));s<i&&(i=s,c=e)}i!==1/0&&a.push({index:e,hops:i,target:c})}return a.sort((t,e)=>t.hops-e.hops||t.index-e.index),a}function h_(t,e={}){const n=[],i=e.loopCapableIds??new Set,s=e.routingTargetIds??new Set;for(const e of[...t.sources].sort()){const i=t.nodes.get(e);if(!i||!i.topology.outbounds?.length)continue;const s=(t.out.get(e)??[]).some(t=>null!=t);s||n.push({severity:"error",code:"orphan-source",nodeId:e,message:`source 노드 "${e}" 가 outgoing edge 0 — 아무 데도 carrier 를 보낼 수 없음`})}for(const e of[...t.nodes.keys()].sort()){const i=(t.out.get(e)??[]).some(t=>null!=t);i||(s.has(e)||t.sources.has(e)||n.push({severity:"error",code:"dead-end",nodeId:e,message:`노드 "${e}" 가 outgoing 0 인데 RoutingTarget 자격 없음 — routing 미정의 종착`}))}const r=function(t){const e=[],n=[...t.nodes.keys()].sort(),i=new Set,s=[],r=new Set,o=n=>{i.add(n),s.push(n),r.add(n);for(const a of t.out.get(n)??[])if(null!=a)if(r.has(a)){const t=s.indexOf(a),n=s.slice(t),i=n.indexOf([...n].sort()[0]),r=[...n.slice(i),...n.slice(0,i)],o=r.join("→");e.some(t=>t.join("→")===o)||e.push(r)}else i.has(a)||o(a);s.pop(),r.delete(n)};for(const t of n)i.has(t)||o(t);return e.sort((t,e)=>t[0].localeCompare(e[0])||t.length-e.length),e}(t);for(const t of r){const e=t.some(t=>i.has(t));e||n.push({severity:"error",code:"cycle",cycle:t,message:`의도 cycle 자격 (isLoop) 없는 cycle: ${t.join(" → ")} → ${t[0]}`})}const o=e.routingWeights;if(o)for(const[t,e]of[...o].sort((t,e)=>t[0].localeCompare(e[0])))(!Number.isFinite(e)||e<=0)&&n.push({severity:"warning",code:"invalid-weight",nodeId:t,message:`RoutingTarget "${t}" 의 routingWeight=${e} — weight ≤ 0 비정상, weight 정책에서 제외됨`});const a=new Set;for(const e of t.out.values())for(const t of e)null!=t&&a.add(t);for(const e of[...s].sort())t.nodes.has(e)&&(a.has(e)||n.push({severity:"warning",code:"unreachable-target",nodeId:e,message:`RoutingTarget "${e}" 에 incoming edge 0 — 누구도 이쪽으로 carrier 를 보내지 않음`}));return n.sort((t,e)=>t.code!==e.code?t.code.localeCompare(e.code):(t.nodeId??"").localeCompare(e.nodeId??"")),n}function d_(t,e){if(!t)return[];const n=[],i=new Set,s=t=>{if(!t||i.has(t))return;if(i.add(t),t!==e&&"function"==typeof t?.getSegmentTopology){const e=t.state?.id,i=t.refid??t.state?.refid,s="string"==typeof e&&e.length>0?e:null!=i?String(i):void 0;if(s)try{const e=t.getSegmentTopology(),i=t.state??{},r={left:i.left,top:i.top,width:i.width,height:i.height,rotation:i.rotation};e&&n.push({id:s,topology:e,bounds:r})}catch{}}const r=t?.components;if(Array.isArray(r))for(const t of r)s(t)};return s(t),n}function u_(t,e){const n=t.state?.targetRef??t.state?.downstreamRef;if("string"==typeof n&&n.length>0)return n;if("function"!=typeof t.getSegmentTopology)return null;const i=t.getSegmentTopology();if(!i||0===i.outbounds.length)return null;const s=d_(t.parent??t.rootModel??t.root,t).filter(t=>t.topology.inbounds.length>0),r=t_(i,s,e);for(const t of r)if(t)return t;return null}function p_(t){return!!t&&"function"==typeof t.routingConstraints}function f_(t){return!!t&&"function"==typeof t.acceptedCarrierData}function m_(t,e=16){const n=[],i=t.parent??t.rootModel??t.root;if(!i)return n;const s=u_(t);if(!s)return n;const r=b_(i,s);if(!r)return n;const o=[{segment:r,accumulated:{},pathIds:[s],visited:new Set([s])}];for(;o.length>0;){const t=o.shift();if(t.pathIds.length>e)continue;const s=p_(t.segment)?t.segment.routingConstraints():null;if(s&&s.length>0)for(const e of s)for(const s of e.candidates){const r=g_(t.accumulated,s);if(!r)continue;const a=y_(t.segment,e.portId,i);a&&!t.visited.has(a.state?.id??"")?o.push({segment:a,accumulated:r,pathIds:[...t.pathIds,a.state?.id??"?"],visited:new Set([...t.visited,a.state?.id??""])}):n.push({data:r,weight:1,pathIds:[...t.pathIds,`${e.portId}`],destination:e.portId})}else{if(f_(t.segment)){const e=t.segment.acceptedCarrierData(),i=t.segment.state?.id;if(0===e.length)n.push({data:t.accumulated,weight:1,pathIds:t.pathIds,destination:i});else for(const s of e){const e=g_(t.accumulated,s);e&&n.push({data:e,weight:1,pathIds:t.pathIds,destination:i})}continue}const e=u_(t.segment);if(!e||t.visited.has(e)){n.push({data:t.accumulated,weight:1,pathIds:t.pathIds,destination:t.pathIds[t.pathIds.length-1]});continue}const s=b_(i,e);if(!s)continue;o.push({segment:s,accumulated:t.accumulated,pathIds:[...t.pathIds,e],visited:new Set([...t.visited,e])})}}return n}function g_(t,e){const n={...t};for(const[t,i]of Object.entries(e)){if(t in n&&n[t]!==i)return null;n[t]=i}return n}function y_(t,e,n){if("straight"===e&&t.state?.downstreamRef)return b_(n,t.state.downstreamRef);const i=b_(n,e);if(i)return i;const s=u_(t);return s?b_(n,s):null}function b_(t,e){if(!t||!e)return null;if("function"==typeof t.findById)return t.findById(e);const n=new Set,i=t=>{if(!t||n.has(t))return null;if(n.add(t),t.state?.id===e)return t;const s=t.components;if(Array.isArray(s))for(const t of s){const e=i(t);if(e)return e}return null};return i(t)}function __(t,e){return Math.hypot(t.x-e.x,t.z-e.z)}function v_(t,e,n=5,i=[],s=n){const r=t.length,o=new Array(r).fill(void 0),a=new Set,c=(e,n)=>"start"===n?t[e].start:t[e].end,l=[],h=new Map,d=[],u=new Map;for(const t of i){const e=Array.isArray(t),n=e?t:t.positions,i=e?void 0:t.kind;if(!n.length)continue;const s=l.length;l.push({pos:n[0],members:[]});for(const t of n)d.push({pos:t,pt:s});i&&u.set(s,i)}const p=(t,e)=>{const i=c(t,e),s=h.get(`${t}:${"end"===e?"start":"end"}`),r=[];for(const t of d)__(t.pos,i)<=n&&!r.includes(t.pt)&&r.push(t.pt);for(let t=0;t<l.length;t++)__(l[t].pos,i)<=n&&!r.includes(t)&&r.push(t);let o=r.find(t=>t!==s)??-1;o<0&&(o=l.length,l.push({pos:i,members:[]})),l[o].members.push({seg:t,end:e}),h.set(`${t}:${e}`,o)};for(let t=0;t<r;t++)p(t,"start"),p(t,"end");const f=new Set,m=new Set,g=new Set;{const t=t=>{let e=-1,n=1/0;for(let i=0;i<l.length;i++){const s=__(l[i].pos,t);s<n&&(n=s,e=i)}for(const i of d){const s=__(i.pos,t);s<n&&(n=s,e=i.pt)}return{pt:e,d:n}};for(const n of e){const{pt:e,d:i}=t(n.pos);e>=0&&i<=s&&(f.add(e),("source"===n.kind?m:g).add(e))}}for(const[t,e]of u)f.add(t),("source"===e?m:g).add(t);const y=(t,e)=>"end"===e!==o[t],b=[],_=(e,n)=>{if(void 0===o[e])return o[e]=n,void b.push(e);o[e]!==n&&a.add(t[e].id)},v=t=>{for(const e of["start","end"]){const n=h.get(`${t}:${e}`);if(void 0===n)continue;const i=l[n];if(2!==i.members.length||f.has(n))continue;const s=i.members[0],r=s.seg===t&&s.end===e?i.members[1]:s;if(r.seg===t)continue;const a="end"===e!==o[t],c="end"===r.end!==!a;_(r.seg,c)}},x=()=>{for(;b.length;)v(b.shift())},w=t=>{let e=-1,n="start",i=1/0;for(let s=0;s<r;s++)for(const r of["start","end"]){const o=__(c(s,r),t.pos);o<i&&(i=o,e=s,n=r)}if(e<0||i>s)return;const o="source"===t.kind?"end"===n:"start"===n;_(e,o)};for(const t of e)"source"===t.kind&&w(t);x();for(const t of e)"sink"===t.kind&&w(t);x();let M=!0;for(;M;){M=!1;for(const t of l){if(t.members.length<3)continue;const e=t.members.filter(t=>void 0===o[t.seg]);if(1!==e.length)continue;let n=0,i=0;for(const e of t.members)void 0!==o[e.seg]&&(y(e.seg,e.end)?n++:i++);const s=e[0];let r;0===i&&n>0?r="end"===s.end:0===n&&i>0&&(r="start"===s.end),void 0!==r&&(o[s.seg]=r,b.push(s.seg),x(),M=!0)}}if(o.some(t=>void 0===t)&&m.size>0&&g.size>0){const t=t=>{const e=new Array(l.length).fill(1/0),n=[];for(const i of t)e[i]=0,n.push(i);for(;n.length;){const t=n.shift();for(const i of l[t].members){const s=h.get(`${i.seg}:${"start"===i.end?"end":"start"}`);void 0!==s&&e[s]>e[t]+1&&(e[s]=e[t]+1,n.push(s))}}return e},e=t(m),n=t(g);for(let t=0;t<r;t++){if(void 0!==o[t])continue;const i=h.get(`${t}:start`),s=h.get(`${t}:end`);if(void 0===i||void 0===s)continue;if(l[i].members.length<2||l[s].members.length<2)continue;if(e[i]===1/0||e[s]===1/0||n[i]===1/0||n[s]===1/0)continue;let r;e[i]!==e[s]?r=e[i]<e[s]:n[i]!==n[s]&&(r=n[s]<n[i]),void 0!==r&&(o[t]=!r,b.push(t))}x()}const S=new Map;for(let e=0;e<r;e++)S.set(t[e].id,void 0===o[e]?"unknown":o[e]?"reverse":"forward");return{directions:S,conflicts:[...a]}}function x_(...t){}function w_(t){return String(t?.state?.id??t?.refid??t?.state?.refid??"?")}function M_(t){const e=t?.state?.id;if("string"==typeof e&&e.length>0)return e;const n=t?.refid??t?.state?.refid;return null!=n?String(n):void 0}function*S_(t){if(!t)return;("function"==typeof t.getSegmentTopology||t.flowOrientable)&&(yield t);const e=t.components;if(Array.isArray(e))for(const t of e)yield*S_(t)}function A_(t,e,n){const i=e.width??0,s=e.height??0;if(i<=0||s<=0)return!1;const r=(e.left??0)+i/2,o=(e.top??0)+s/2,a="number"==typeof e.rotation?e.rotation:0,c=t.x-r,l=t.z-o,h=Math.cos(-a),d=Math.sin(-a),u=c*h-l*d,p=c*d+l*h;return Math.abs(u)<=i/2+n&&Math.abs(p)<=s/2+n}function E_(t){const e=[],n=[],i=[],s=[];for(const r of S_(t)){const t=M_(r);if(!t)continue;if(r.flowOrientable){const n=Wb(r.state??{});n&&e.push({id:t,start:n.start,end:n.end});continue}if("function"==typeof r.openings){const t=r.state??{};(t.width??0)>0&&(t.height??0)>0&&s.push(t);continue}let o;try{o=r.getSegmentTopology()}catch{continue}if(!o)continue;const a=o.inbounds??[],c=o.outbounds??[],l="function"==typeof r.routingDestination;if(0===a.length&&c.length>0)for(const t of c)n.push({pos:{x:t.worldPos.x,z:t.worldPos.z},kind:"source"});else if(a.length>0&&(0===c.length||l))for(const t of a)n.push({pos:{x:t.worldPos.x,z:t.worldPos.z},kind:"sink"});else if(a.length>0||c.length>0){const t=[];for(const e of a)t.push({x:e.worldPos.x,z:e.worldPos.z});for(const e of c)t.push({x:e.worldPos.x,z:e.worldPos.z});t.length&&i.push({positions:t})}}for(const t of s){const s=[];for(const n of e)for(const e of[n.start,n.end])A_(e,t,16)&&s.push(e);let r=!1,o=!1;for(const e of n)A_(e.pos,t,16)&&("sink"===e.kind?r=!0:o=!0);const a=r&&!o?"sink":o&&!r?"source":void 0;(s.length>=2||a&&s.length>=1)&&i.push({positions:s,kind:a})}if(0===e.length||0===n.length)return new Map;return v_(e,n,8,i,60).directions}function k_(t){const e=t?.root;if(!e)return;if(e.__flowComputing)return;let n=e.__flowOrientation;if(!n){e.__flowComputing=!0;try{n={map:E_(e)}}finally{e.__flowComputing=!1}e.__flowOrientation=n}const i=M_(t),s=i?n.map.get(i):void 0;return"reverse"===s||"forward"!==s&&void 0}function C_(t){return!!t&&"function"==typeof t.distanceToBoardPoint}function T_(t,e,n,i){if(!t||!e)return null;const s=[],r=t=>{if(!t||t===i)return;if(Mm(t,e)&&C_(t)){const e=function(t){const e=t?.state?.id;if("string"==typeof e&&e.length>0)return e;const n=t?.refid??t?.state?.refid;return null!=n?String(n):void 0}(t);e&&s.push({id:e,component:t,distance:t.distanceToBoardPoint(n.x,n.y)})}const o=t.components;if(Array.isArray(o))for(const t of o)r(t)};return r(t),0===s.length?null:(s.sort((t,e)=>t.distance-e.distance||t.id.localeCompare(e.id)),s[0])}function P_(t){return!!t&&"function"==typeof t.routingDestination}function O_(t){const e=t?.state?.id;if("string"==typeof e&&e.length>0)return e;const n=t?.refid??t?.state?.refid;return null!=n?String(n):void 0}function*D_(t){if(!t)return;yield t;const e=t.components;if(Array.isArray(e))for(const t of e)yield*D_(t)}function z_(t){const e=[],n=new Map,i=new Map,s=new Set,r=[];for(const o of D_(t)){"function"==typeof o?.registerWithHost&&r.push(o);const t="function"==typeof o?.getSegmentTopology,a="function"==typeof o?.routingLinks?o.routingLinks():void 0,c=!(!a||!((a.downstream?.length??0)>0||(a.upstream?.length??0)>0));if(!(t||P_(o)||c||C_(o)))continue;const l=O_(o);if(!l)continue;let h={inbounds:[],outbounds:[]};if(t){try{h=o.getSegmentTopology()}catch{continue}if(!h)continue}const d=o.state??{},u={left:d.left,top:d.top,width:d.width,height:d.height,rotation:d.rotation};if(e.push({id:l,topology:h,bounds:u,links:a}),i.set(l,o),P_(o)){s.add(l);const t=o.routingDestination();if("string"==typeof t&&t.length>0){const e=n.get(t)??[];e.push(l),n.set(t,e)}}}return{nodes:e,destToSinks:n,components:i,routingTargetIds:s,stationClients:r}}function I_(t){if(!t)return null;let e=t.__flowGraph;if(!e){const{nodes:n,destToSinks:i,components:s,routingTargetIds:r,stationClients:o}=z_(t),a=e_(n);!function(t,e){if(!t)return;const n=t=>{if(!t)return;"function"==typeof t.clearStations&&t.clearStations();const e=t.components;if(Array.isArray(e))for(const t of e)n(t)};n(t);const i=[...e].sort((t,e)=>{const n=O_(t)??"",i=O_(e)??"";return n.localeCompare(i)});for(const e of i){const n=e.declaredHostRef?.();let i=null;if(n&&(i=t.findById?.(n)??null),!i){const n=e.hostCapability?.(),s=e.hostFacingPoint?.();n&&s&&(i=T_(t,n,s,e)?.component??null)}i&&"function"==typeof e.registerWithHost&&e.registerWithHost(i)}const s=e=>{if(!e)return;if(C_(e)&&"function"==typeof e.resolveDownstream&&"function"==typeof e.registerDivertStation)for(const n of e.resolveDownstream()){const i=t.findById?.(n);i&&e.registerDivertStation(n,i)}const n=e.components;if(Array.isArray(n))for(const t of n)s(t)};s(t)}(t,o);const c=new Set;for(const[t,e]of s){((e?.state?.type??e?.model?.type??"").includes("loop")||!0===e?.isLoop)&&c.add(t)}const l=new Map;for(const t of r){const e=s.get(t);if("function"==typeof e?.routingWeight){const n=e.routingWeight();"number"==typeof n&&(!Number.isFinite(n)||n<=0)&&l.set(t,n)}}const h=h_(a,{routingTargetIds:r,loopCapableIds:c,routingWeights:l});if(h.length>0&&"undefined"!=typeof console){const t=h.filter(t=>"error"===t.severity),e=h.filter(t=>"warning"===t.severity);t.length>0?console.warn(`[FlowGraph] ${t.length} error(s) / ${e.length} warning(s):`,h):console.info(`[FlowGraph] ${e.length} warning(s):`,h)}e={graph:a,destToSinks:i,components:s,issues:h},t.__flowGraph=e}return e}function R_(t){return I_(t)?.issues??[]}function j_(t){const e=I_(t);return e&&e.graph.nodes.size>0?e.graph:null}function L_(t,e){return I_(t)?.destToSinks.get(e)??[]}function F_(t,e){return I_(t)?.components.get(e)}function N_(t){const e=I_(t);return e?[...e.destToSinks.keys()]:[]}function B_(t){return O_(t)}function H_(t){const e="number"==typeof t?.inventoryCount?t.inventoryCount:"function"==typeof t?.size?t.size():0,n=t?.state?.capacity;return"number"==typeof n&&n>0?e/n:e}function $_(t,e,n,i,s){if(1===i.length)return i[0];switch(t){case"index":default:return i[0];case"round-robin":{const t=n.counters.get(e)??0;return n.counters.set(e,t+1),i[t%i.length]}case"weight":{const t=i.map(t=>function(t){if("function"==typeof t?.routingWeight){const e=t.routingWeight();if("number"==typeof e&&Number.isFinite(e)&&e>0)return e}return 1}(s.get(t.target))),r=t.reduce((t,e)=>t+e,0);if(r<=0)return i[0];const o=n.counters.get(e)??0;n.counters.set(e,o+1);let a=o%r;for(let e=0;e<i.length;e++){if(a<t[e])return i[e];a-=t[e]}return i[i.length-1]}case"utilization":{let t=1/0,e=i[0];for(const n of i){const i=H_(s.get(n.target));i<t&&(t=i,e=n)}return e}}}function G_(t,e,n){const i=t?.root;if(!i)return null;const s=e?.state?.meta?.destination;if("string"!=typeof s||0===s.length)return null;const r=I_(i);if(!r||0===r.graph.nodes.size)return null;const o=O_(t);if(!o)return null;let a=r.destToSinks.get(s)??[];0===a.length&&(a=[s]);const c=l_(r.graph,o,a);if(0===c.length)return null;const l=r.graph.out.get(o)??[],h=c.filter(t=>{const n=l[t.index],i=n?r.components.get(n):null;return!i||"function"!=typeof i.canReceive||i.canReceive(e)});if(0===h.length)return l[c[0].index]??null;const d=n?.policy??function(t,e){const n=t?.state?.balancingPolicy;if(n)return n;const i=e?.state?.routingBalancingPolicy;return i||"round-robin"}(t,i),u=$_(d,o,function(t){return t.__balancingState||(t.__balancingState={counters:new Map}),t.__balancingState}(i),h,r.components);return l[u.index]??null}Em({name:"Capacity",description:"Item 을 *보유(keep)* 하는 측면 — slot 위상 / 수용 판정(canReceive/findSlot) / 3D 안착(placementFor/attachPointFor/acceptanceRotation) / delivery 좌표 질의 / 점유 수. 이동(receive/dispatch 등)은 Transferable 소관.",methods:["get slots","get arrangementStrategy","canReceive","findSlot","placementFor","attachPointFor","acceptanceRotation","deliveryWorldRotation","deliveryWorldPosition","_countOccupied"],sourceFile:"src/items/capacity-mixin.ts"}),Em({name:"PlacementSurface",description:"carrier 가 holder 위 *정확히 어디에 앉는가* 의 단일 진입점 — placementFor(carrier, ctx) → SeatingPose (holder object3d local frame, 순수 함수). I1 접촉 (밑면 = 받침 상면) / I2 frame-explicit (parent-child 비가정 — Sovereign handover 와 reparent 양쪽이 같은 값 소비) / I3 순수성 / I4 per-carrier 치수. default 구현은 Capacity(FlowNode) 가 기존 receivingSurfaceY + ArrangementStrategy + acceptanceRotation 합성과 수치 동일하게 제공.",methods:["placementFor"],models:["CarrierDims","PlacementContext","SeatingPose"],sourceFile:"src/items/capacity-mixin.ts"});try{globalThis.__operatoBuildFlowGraph=(t,e)=>{try{return e?.force&&t&&delete t.__flowGraph,j_(t)}catch{return null}}}catch{}function V_(t,e,n){const i=G_(t,e,n);if(null==i)return null;const s=t?.root,r=F_(s,i)??s?.findById?.(i)??null;return r?{targetId:i,component:r,origin:"explicit"}:null}function U_(t){const e=t?.root,n=j_(e),i=B_(t);if(!n||!i)return null;const s=(n.out.get(i)??[]).find(Boolean);if(!s)return null;const r=F_(e,s)??e?.findById?.(s)??null;return r?{id:s,component:r}:null}function Y_(t){const e=B_(t);return e?W_(t?.root,e):[]}function W_(t,e){if(!t||!e)return[];const n=j_(t);if(!n)return[];const i=new Set;for(const s of a_(n,e)){const e=F_(t,s);if(P_(e)){const t=e.routingDestination();"string"==typeof t&&t.length>0&&i.add(t)}}return[...i]}function q_(t,e){if(!t||!e)return[];const n=j_(t);if(!n)return[];const i=new Map;for(const t of n.out.values())for(const e of t)null!=e&&i.set(e,(i.get(e)??0)+1);const s=new Map;for(const r of a_(n,e)){const e=F_(t,r);if(!P_(e))continue;const n=e.routingDestination();if("string"!=typeof n||0===n.length)continue;let o=null;if("function"==typeof e.routingWeight){const t=e.routingWeight();"number"==typeof t&&Number.isFinite(t)&&t>0&&(o=t)}null===o&&(o=i.get(r)??0,0===o&&(o=1)),s.set(n,(s.get(n)??0)+o)}return[...s].map(([t,e])=>({value:t,weight:e}))}function X_(t){return j_(t)}function K_(t){const e=j_(t);if(!e)return[];const n=new Set,i=new Set,s=t=>{if(!t)return;const r=B_(t);if(r&&e.nodes.has(r)){P_(t)&&n.add(r);((t?.state?.type??t?.model?.type??"").includes("loop")||!0===t?.isLoop)&&i.add(r)}const o=t.components;if(Array.isArray(o))for(const t of o)s(t)};return s(t),h_(e,{routingTargetIds:n,loopCapableIds:i})}function Q_(t){if(0===t.length)return;const e=t.reduce((t,e)=>t+e.weight,0);if(e<=0)return t[Math.floor(Math.random()*t.length)].value;const n=Math.random()*e;let i=0;for(const e of t)if(i+=e.weight,n<i)return e.value;return t[t.length-1].value}const Z_={next:V_,downstream:U_,reachableDestinations:Y_,reachableDestinationsFrom:W_,reachableDestinationsWeightedFrom:q_,pickWeightedDestination:Q_,graphFor:X_,validate:K_};function J_(t){var e;return e=class extends t{constructor(){super(...arguments),this._items=[]}get items(){return this._items}containsItem(t){return-1!==this._items.indexOf(t)}attachPointFor(e,n){const i=t.prototype?.attachPointFor;return"function"==typeof i?i.call(this,e,n):null}addItem(t,e){if(!t||this.containsItem(t))return;const n=t.parent;if(n&&"function"==typeof n.removeItem&&n!==this&&n.removeItem(t,!0),this._items.push(t),t.parent=this,!e?.silent&&"function"==typeof this.trigger)try{this.trigger("hold",this,t,this._items.length-1)}catch{}t.held?.(this)}removeItem(t,e){if(!t)return;const n=this._items.indexOf(t);if(-1!==n&&(this._items.splice(n,1),t.parent=null,!e)){if("function"==typeof this.trigger)try{this.trigger("release",this,t,n)}catch{}t.released?.(this)}}forEachItem(t,e){this._items.forEach(t,e)}handoverIn(t,e){if(!t)return;const n=t.parent;n&&("function"==typeof n.removeComponent&&-1!==n._components?.indexOf?.(t)&&n.removeComponent(t,!0),n!==this&&"function"==typeof n.removeItem&&-1!==n._items?.indexOf?.(t)&&n.removeItem(t,!0));const i=-1===this._items.indexOf(t);if(i&&this._items.push(t),t.parent=this,i&&"function"==typeof this.trigger)try{this.trigger("hold",this,t,this._items.length-1)}catch{}const s=t._realObject,r=s?.object3d;if(r){let n,i,o=e?.toParent3D,a="world-preserve";if(!o){const s=this.attachPointFor?.(t,{slotId:e?.slotId});s?.attach&&(o=s.attach,n=s.localPosition,i=s.localRotation,a=s.carryPolicy??"world-preserve")}o&&r.parent!==o&&(o.updateWorldMatrix?.(!0,!1),r.updateWorldMatrix?.(!0,!1),o.attach(r),s.suppressTransform=!0),o&&(n&&r.position.set(n.x,n.y,n.z),"world-preserve"!==a?i?r.rotation.set(i.x,i.y,i.z):r.quaternion.identity():i&&r.rotation.set(i.x,i.y,i.z),s?.setTransientPlacement?.({policy:"carried",meta:{carryPolicy:a}}))}t.held?.(this),this._bumpReceived?.(t)}handoverOut(t){this.removeItem(t),this._bumpDispatched?.(t)}dispose(){const t=this._items.slice();this._items.length=0;for(const e of t)try{e.dispose?.()}catch{}super.dispose?.()}_drawItems(t){const e=this.root?.transitionEffect;for(const t of this._items)e?.isReparenting?.(t)||t.draw?.(this.getContext?.(t))}_captureItems(t,e,n,i,s){for(let r=this._items.length-1;r>=0;r--){const o=this._items[r],a="static"===o.position?o.capture?.(t,e,s):o.capture?.(n,i,s);if(a)return a}return null}postrender(t){super.postrender?.(t);const e=this;if("popup"===e.position)return;const n=this._items;if(!n||0===n.length)return;t.save();const i=e.bounds;!e.showOverflow&&i&&(t.beginPath(),t.rect(i.left,i.top,i.width,i.height),t.clip(),t.closePath());const{left:s=0,top:r=0}=e.state??{};t.translate(s,r),this._drawItems(t),t.translate(-s,-r),t.restore()}capture(t,e,n){const i=this,s=this._items;if(s&&s.length>0&&(!i.app||i.app.isEditMode||!i.hidden)){const s=i.fromParent?.(t,e);if(s&&i.contains?.(s.x,s.y)){const r=i.bounds,o=this._captureItems(s.x-r.left,s.y-r.top,t,e,n);if(o)return o}}return super.capture?.(t,e,n)}},e.capabilities=Object.freeze([...t.capabilities??[],"Holdable"]),e}function tv(t){var e;return e=class extends t{reserve(t,e){const n=this.findSlot(t);return n?{slot:n,token:Symbol("slot-reservation")}:null}release(t){}async receive(t,e={}){Au.log({role:"target",contract:"receive:enter",component:this,args:{carrier:Rb(t),options:e}});const n=this.reserve(t,e);if(!n){Au.log({role:"target",contract:"receive:reject",component:this,args:{carrier:Rb(t)},result:{reason:"no-slot"}}),this.trigger("transfer-rejected",{type:"transfer-rejected",component:t,container:this,reason:"no-slot"});const e=new Error("receive rejected: no-slot");throw e.reason="no-slot",e}this.commit(n,t,e)}commit(t,e,n={}){const i=t.slot,s=this._countOccupied(i.id),r=this.arrangementStrategy.positionAt(s,i,s,e);Au.log({role:"target",contract:"arrangementStrategy.positionAt",component:this,args:{idx:s,slotId:i.id,occupantCount:s,carrier:Rb(e)},result:r}),e[Fb]=i.id;const o=e._realObject;let a,c;o?.object3d&&(o.object3d.updateWorldMatrix(!0,!1),a=new M.Vector3,c=new M.Quaternion,o.object3d.getWorldPosition(a),o.object3d.getWorldQuaternion(c));const{animated:l=!1,duration:h,ease:d}=n;"function"==typeof this.handoverIn?this.handoverIn(e,{slotId:i.id}):this.reparent?.(e,{animated:l,duration:h,ease:d}),!l&&e._realObject&&(e._realObject.suppressTransform=!1);{const t={},n=this.placementFor?.(e,{slot:i,index:s,occupantCount:s})??null;if(Au.log({role:"target",contract:"placementFor",component:this,args:{carrier:Rb(e),slotId:i.id,index:s},result:n}),n){const s=e.state??{},r=this.state??{};t.left=n.position.x-(Number(s.width)||0)/2+(Number(r.width)||0)/2,t.top=n.position.z-(Number(s.height)||0)/2+(Number(r.height)||0)/2;const o=this._zPosFromSeatY(n.position.y,s.depth,i);null!==o&&(t.zPos=o),n.rotation&&Lb(t,n.rotation)}else{r&&(t.left=r.x,t.top=r.y);if(0!==(this._realObject?.receivingSurfaceY??0))t.zPos=0;else if(i.localPosition&&Number.isFinite(i.localPosition.z)){const e=this._realObject?.geometricOffsetY??0;t.zPos=i.localPosition.z+e}const n=this.acceptanceRotation?.(e,i);Au.log({role:"target",contract:"acceptanceRotation",component:this,args:{carrier:Rb(e),slotId:i.id},result:n}),n&&Lb(t,n)}const o=this.normalizePose?.(e,i);"function"==typeof this.normalizePose&&Au.log({role:"target",contract:"normalizePose",component:this,args:{carrier:Rb(e),slotId:i.id},result:o}),o&&Object.assign(t,o),Object.keys(t).length&&(e.setState?.(t),Au.log({role:"target",contract:"receive:setState",component:this,args:{carrier:Rb(e),keys:Object.keys(t)}}))}this.trigger("transfer-received",{type:"transfer-received",component:e,container:this,slotId:i.id,preReceiveWorldPos:a,preReceiveWorldQuat:c}),Au.log({role:"target",contract:"receive:done",component:this,args:{carrier:Rb(e),slotId:i.id}})}async dispatch(t,e,n={}){const i=new Tu({source:this,target:e,carrier:t,options:n,physical:async()=>{delete t[Fb]}}),s=await i.execute();"rolled-back"!==s.phase?this.trigger("transfer-dispatched",{type:"transfer-dispatched",component:t,container:this,target:e}):this.trigger("transfer-rejected",{type:"transfer-rejected",component:t,container:this,reason:s.rejectReason??"rejected"})}route(t){return null}resolveRoute(t,e){}rejectRoute(t,e="rejected"){this.trigger("transfer-rejected",{type:"transfer-rejected",component:t,container:this,reason:e})}canAccept(t){const e=(()=>{const e=this.slots;if(!e.length)return{ok:!1,reason:"no-slots-defined"};const n=this.findSlot(t);if(!n){const n=t?.state?.type??t?.type;for(const t of e)if(!t.allowedTypes?.length||!n||t.allowedTypes.includes(n))return{ok:!1,reason:"all-slots-full"};return{ok:!1,reason:"type-not-accepted"}}return{ok:!0,slot:n}})();return Au.log({role:"target",contract:"canAccept",component:this,args:{carrier:Rb(t)},result:e.ok?{ok:!0,slotId:e.slot.id}:{ok:!1,reason:e.reason}}),e}accept(t,e){return this.receive(t,e)}},e.__hasTransferable=!0,e}function ev(t){var e;const n=!!t.__hasCapacity,i=!!t.__hasTransferable,s=n?t:Vb(t),r=i?s:tv(s),o=[...t.capabilities??[]];n||o.push("Capacity","PlacementSurface"),i||o.push("Transferable"),o.push("Holdable","FlowNode");const a=(e=class extends(J_(r)){get isFlowNode(){return!0}containable(t){return!!t&&!0===t.isItem}get showMoveHandle(){return!1}inboundPorts(){return[]}outboundPorts(){return[]}_bumpReceived(t){const e=this.state?.received??0;this.setState?.({received:e+1})}_bumpDispatched(t){const e=this.state?.dispatched??0;this.setState?.({dispatched:e+1})}_bumpRejected(t,e){const n=this.state?.rejected??0;this.setState?.({rejected:n+1})}route(t){return null}resolveRoute(t,e){}rejectRoute(t,e){}resolveDownstream(){const t=this.state?.downstreamRef;if(!t)return[];return(this.root?.findAll?.(t)??[]).map(t=>t?.state?.id).filter(Boolean)}routingLinks(){return{downstream:this.resolveDownstream()}}},function(t,e,n){"symbol"==typeof e&&(e=e.description?"[".concat(e.description,"]"):""),Object.defineProperty(t,"name",{configurable:!0,value:n?"".concat(n," ",e):e})}(e,"FlowNodeMixed"),e.capabilities=Object.freeze(o),e.isFlowNode=!0,e);return Bb(a)}function nv(t){return!!t&&!0===t.isFlowNode}Em({name:"Holdable",description:"어떤 Component 든 item(데이타바인딩 동적 물건) 을 보유하는 capability. _items + add/remove/forEach + handover + hold/release event + dispose cascade. Container(정적 _components) 와 직교 — 컨테이너 비의존.",methods:["addItem","removeItem","forEachItem","containsItem","handoverIn","handoverOut","_drawItems","_captureItems","dispose"],sourceFile:"src/components/mixins/holdable.ts"}),Em({name:"Transferable",description:"Item 을 노드 간에 옮기는 *이동(move)* 측면. 수용 트랜잭션 라이프사이클(reserve → commit → release)과 receive/accept/dispatch/route 를 제공. 보유(keep — slots/findSlot/canReceive 등)는 Capacity 소관.",methods:["reserve","commit","release","receive","accept","canAccept","dispatch","route","resolveRoute","rejectRoute"],sourceFile:"src/transfer/transferable-mixin.ts"}),Em({name:"FlowNode",description:"Flow graph 의 노드 — 구조 (inbound/outbound port + slot) + flow (route + 5-phase transfer stat). 보유(_items/handover)는 Holdable base 위임. 모든 flow 컴포넌트의 base — Storable/Mobile/Processable 의도가 위에 직교로 적용.",methods:["inboundPorts","outboundPorts","slotIds","slotAt","route","resolveRoute","rejectRoute"],models:["Port","SlotInfo","Vec3"],sourceFile:"src/flow/flow-node.ts"});const iv={x:0,y:0,z:0,w:1};function sv(t){const e=t/2;return{x:0,y:Math.sin(e),z:0,w:Math.cos(e)}}function rv(t,e){const n=t.rotation,i=e.rotation,s=e.position,r=n.w*s.x+n.y*s.z-n.z*s.y,o=n.w*s.y+n.z*s.x-n.x*s.z,a=n.w*s.z+n.x*s.y-n.y*s.x,c=-n.x*s.x-n.y*s.y-n.z*s.z,l=r*n.w+c*-n.x+o*-n.z-a*-n.y,h=o*n.w+c*-n.y+a*-n.x-r*-n.z,d=a*n.w+c*-n.z+r*-n.y-o*-n.x,u={x:n.w*i.x+n.x*i.w+n.y*i.z-n.z*i.y,y:n.w*i.y-n.x*i.z+n.y*i.w+n.z*i.x,z:n.w*i.z+n.x*i.y-n.y*i.x+n.z*i.w,w:n.w*i.w-n.x*i.x-n.y*i.y-n.z*i.z};return{position:{x:t.position.x+l,y:t.position.y+h,z:t.position.z+d},rotation:u}}const ov={east:{axis:{x:1,y:0,z:0},yaw:0,idSuffix:"east"},west:{axis:{x:-1,y:0,z:0},yaw:Math.PI,idSuffix:"west"},south:{axis:{x:0,y:0,z:1},yaw:-Math.PI/2,idSuffix:"south"},north:{axis:{x:0,y:0,z:-1},yaw:Math.PI/2,idSuffix:"north"}};function av(t){const{carrierWorld:e,width:n,depth:i,entryHeight:s,mountLocalY:r,approachDistance:o,sides:a,toolType:c,tolerance:l,priority:h}=t,d="number"==typeof r?{position:{x:0,y:r,z:0},rotation:{...iv}}:void 0,u=n/2,p=i/2;return a.map(t=>{const n=ov[t],i="string"==typeof c?c:c[t]??"unknown",r={position:{x:n.axis.x*("east"===t||"west"===t?u:0),y:s,z:n.axis.z*("north"===t||"south"===t?p:0)},rotation:sv(n.yaw)},a={position:{x:r.position.x+n.axis.x*o,y:s,z:r.position.z+n.axis.z*o},rotation:sv(n.yaw)};return{id:`entry-${n.idSuffix}`,toolType:i,approach:rv(e,a),engage:rv(e,r),...d?{mount:d}:{},tolerance:l,priority:h}})}function cv(t){const{carrierWorld:e,topY:n,approachDistance:i,toolType:s,mountLocalY:r,tolerance:o,priority:a,id:c}=t,l={position:{x:0,y:n,z:0},rotation:{...iv}};return{id:c??"top",toolType:s,approach:rv(e,{position:{x:0,y:n+i,z:0},rotation:{...iv}}),engage:rv(e,l),..."number"==typeof r?{mount:{position:{x:0,y:r,z:0},rotation:{...iv}}}:{},tolerance:o,priority:a}}function lv(t,e){return t.filter(t=>t.toolType===e.toolType)}function hv(t,e){if(0===t.length)return null;const n=t.map(t=>{const n=t.approach.position.x-e.x,i=t.approach.position.y-e.y,s=t.approach.position.z-e.z;return{f:t,dist:Math.sqrt(n*n+i*i+s*s)}});return n.sort((t,e)=>{const n=t.f.priority??0,i=e.f.priority??0;return n!==i?n-i:t.dist-e.dist}),n[0].f}class dv{constructor(t){this.owner=t}positionAt(t,e,n,i){if(0!==t)return null;const s=this.owner?.state?.width??0,r=this.owner?.state?.height??0,o=i?.state?.width??0,a=i?.state?.height??0;return{x:Math.max(0,(s-o)/2),y:Math.max(0,(r-a)/2),z:0}}capacity(t){return t.maxCount??1}}let uv=1;function pv(t,e){return t.startSimMs<e.endSimMs&&e.startSimMs<t.endSimMs}const fv={resolveConflict:(t,e)=>t.priority!==e.priority?t.priority<e.priority?"b-yields":"a-yields":t.id<e.id?"b-yields":"a-yields"};class mv{constructor(t=fv){this._byResource=new Map,this._byReserver=new Map,this._listeners=new Set,this._conflictLog=[],this._maxConflictLog=1e3,this._yieldPolicy=t}add(t){const e={...t,id:"res-"+uv++},n=(this._byResource.get(e.resource)??[]).filter(t=>pv(t.timeWindow,e.timeWindow));if(0===n.length)return this._insert(e),this._emit({kind:"added",reservation:e}),{ok:!0,reservation:e};const i=n.map(t=>{const n=this._yieldPolicy.resolveConflict(e,t);return{a:e,b:t,decision:n}}),s=i.every(t=>"b-yields"===t.decision);if(s){const i=n.slice();for(const t of i)this._remove(t),this._emit({kind:"evicted",reservation:t,by:e});return this._insert(e),this._emit({kind:"added",reservation:e}),this._appendConflictLog({simTime:e.timeWindow.startSimMs,resource:e.resource,proposed:t,existing:i,outcome:"preempted"}),{ok:"preempted",reservation:e,evicted:i}}return this._appendConflictLog({simTime:e.timeWindow.startSimMs,resource:e.resource,proposed:t,existing:n.slice(),outcome:"rejected"}),{ok:!1,conflicts:i}}conflictLog(){return[...this._conflictLog]}setMaxConflictLog(t){this._maxConflictLog=Math.max(1,t)}_appendConflictLog(t){this._conflictLog.push(t),this._conflictLog.length>this._maxConflictLog&&this._conflictLog.shift()}conflicts(t,e){return(this._byResource.get(t)??[]).filter(t=>pv(t.timeWindow,e))}release(t){this._remove(t)&&this._emit({kind:"released",reservation:t})}releaseAllOf(t){const e=(this._byReserver.get(t)??[]).slice();for(const t of e)this._remove(t),this._emit({kind:"released",reservation:t});return e}forResource(t){return[...this._byResource.get(t)??[]]}forReserver(t){return[...this._byReserver.get(t)??[]]}all(){const t=[];for(const e of this._byResource.values())t.push(...e);return t}clear(){this._byResource.clear(),this._byReserver.clear(),this._conflictLog.length=0}subscribe(t){return this._listeners.add(t),()=>{this._listeners.delete(t)}}_insert(t){let e=this._byResource.get(t.resource);e||(e=[],this._byResource.set(t.resource,e));const n=e.findIndex(e=>e.timeWindow.startSimMs>t.timeWindow.startSimMs);n<0?e.push(t):e.splice(n,0,t);let i=this._byReserver.get(t.reserverId);i||(i=[],this._byReserver.set(t.reserverId,i)),i.push(t)}_remove(t){const e=this._byResource.get(t.resource);if(!e)return!1;const n=e.findIndex(e=>e.id===t.id);if(n<0)return!1;e.splice(n,1),0===e.length&&this._byResource.delete(t.resource);const i=this._byReserver.get(t.reserverId);if(i){const e=i.findIndex(e=>e.id===t.id);e>=0&&i.splice(e,1),0===i.length&&this._byReserver.delete(t.reserverId)}return!0}_emit(t){this._listeners.forEach(e=>e(t))}}const gv=new mv;"undefined"!=typeof globalThis&&(globalThis.__THINGS_SCENE_RESERVATION_TABLE__=gv);class yv{constructor(){this.nodes=new Map,this.edges=new Map,this.laneEndpoints=new Map}addNode(t){this.nodes.has(t.id)||(this.nodes.set(t.id,t),this.edges.set(t.id,[]))}addEdge(t){const e=this.edges.get(t.fromNode);if(!e)throw new Error(`NavGraph.addEdge: source node not found: ${t.fromNode}`);if(!this.nodes.has(t.toNode))throw new Error(`NavGraph.addEdge: target node not found: ${t.toNode}`);e.push(t)}edgesFrom(t){return this.edges.get(t)??[]}findNearestNode(t){let e=null,n=1/0;for(const i of this.nodes.values()){const s=bv(i.position,t);s<n&&(n=s,e=i)}return e}}function bv(t,e){const n=t.x-e.x,i=t.y-e.y,s=t.z-e.z;return n*n+i*i+s*s}function _v(t,e){return Math.sqrt(bv(t,e))}function vv(t,e,n={}){const i=new yv,s=n.defaultSpeed??100;for(const e of t){const t=e.geometry.centerPoints;if(t.length<2)continue;const n=`${e.id}:start`,r=`${e.id}:end`;i.addNode({id:n,position:t[0],type:"lane-start"}),i.addNode({id:r,position:t[t.length-1],type:"lane-end"}),i.laneEndpoints.set(e.id,{startNodeId:n,endNodeId:r});let o=0;for(let e=1;e<t.length;e++)o+=_v(t[e-1],t[e]);const a=o/(e.speedLimit??s)*1e3;i.addEdge({fromNode:n,toNode:r,resource:e.id,distance:o,durationMs:a,forward:!0}),"twoway"===e.direction&&i.addEdge({fromNode:r,toNode:n,resource:e.id,distance:o,durationMs:a,forward:!1})}for(const t of e){if(t.lanes.length<2)continue;const e=[];for(const n of t.lanes){const s=i.laneEndpoints.get(n);if(!s)continue;const r=i.nodes.get(s.startNodeId).position,o=i.nodes.get(s.endNodeId).position;let a=0,c=0,l=0;for(const e of t.lanes){if(e===n)continue;const t=i.laneEndpoints.get(e);if(!t)continue;const s=i.nodes.get(t.startNodeId).position,h=i.nodes.get(t.endNodeId).position;a+=Math.min(bv(r,s),bv(r,h)),c+=Math.min(bv(o,s),bv(o,h)),l++}if(0===l)continue;const h=a<c?s.startNodeId:s.endNodeId;e.push({laneId:n,nodeId:h,pos:i.nodes.get(h).position})}for(let n=0;n<e.length;n++)for(let s=0;s<e.length;s++){if(n===s)continue;const r=e[n],o=e[s],a=_v(r.pos,o.pos);i.addEdge({fromNode:r.nodeId,toNode:o.nodeId,resource:t.id,distance:a,durationMs:t.crossingTimeMs,forward:!0})}}return i}function xv(t,e,n,i={}){const s=t.nodes.get(e),r=t.nodes.get(n);if(!s||!r)return null;const o=i.speed?.max??100,a=e=>{const n=function(t,e){return Math.sqrt(function(t,e){const n=t.x-e.x,i=t.y-e.y,s=t.z-e.z;return n*n+i*i+s*s}(t,e))}(t.nodes.get(e).position,r.position);return n/o*1e3},c=new Map,l=new Set,h=new Set,d={nodeId:e,gScore:0,fScore:a(e)};c.set(e,d),l.add(e);const u=i.startSimMs??0,p=i.deadlineSimMs;for(;l.size>0;){let e=null,i=null;for(const t of l){const n=c.get(t);(!i||n.fScore<i.fScore||n.fScore===i.fScore&&t<e)&&(i=n,e=t)}if(!i||!e)return null;if(e===n){const t=[];let e=i,n=0;for(;e&&e.cameFromEdge;){const i=e.cameFromEdge,s=u+(e.gScore-i.durationMs);t.unshift({resource:i.resource,timeWindow:{startSimMs:s,endSimMs:s+i.durationMs},fromPos:i.fromPos,toPos:i.toPos}),n+=i.distance,e=c.get(i.fromNodeId)}const s=i.gScore;return void 0!==p&&u+s>p?null:{segments:t,totalDurationMs:s,totalDistance:n}}l.delete(e),h.add(e);for(const n of t.edgesFrom(e)){if(h.has(n.toNode))continue;const e=i.gScore+n.durationMs,s=c.get(n.toNode);if(!s||e<s.gScore){const i=t.nodes.get(n.fromNode),s=t.nodes.get(n.toNode),r={nodeId:n.toNode,gScore:e,fScore:e+a(n.toNode),cameFromEdge:{fromNodeId:n.fromNode,resource:n.resource,distance:n.distance,durationMs:n.durationMs,fromPos:i.position,toPos:s.position}};c.set(n.toNode,r),l.add(n.toNode)}}}return null}function wv(t,e,n=0,i){return t.segments.map(t=>({resource:t.resource,timeWindow:t.timeWindow,reserverId:e,priority:n,metadata:i}))}const Mv={closed:!0,round:0,divisions:24};class Sv{constructor(t,e){this.points=t,this.closed=e;const n=[0];for(let e=1;e<t.length;e++){const i=t[e].x-t[e-1].x,s=t[e].y-t[e-1].y;n.push(n[e-1]+Math.sqrt(i*i+s*s))}this.cumulative=n,this.length=n[n.length-1]??0}sample(t){const e=this.length;if(0===this.points.length)return{x:0,y:0,theta:0};if(0===e)return{x:this.points[0].x,y:this.points[0].y,theta:0};let n=t;this.closed?n=(t%e+e)%e:n<0?n=0:n>e&&(n=e);const i=this.cumulative;let s=0,r=i.length-2;for(;s<r;){const t=s+r>>1;i[t+1]<=n?s=t+1:r=t}const o=i[s+1]-i[s],a=o>0?(n-i[s])/o:0,c=this.points[s],l=this.points[s+1],h=l.x-c.x,d=l.y-c.y;return{x:c.x+h*a,y:c.y+d*a,theta:0===h&&0===d?0:Math.atan2(d,h)}}}function Av(t,e={}){const n={...Mv,...e},i=t.length;if(0===i)return new Sv([],n.closed);if(1===i)return new Sv([{x:t[0].x,y:t[0].y}],n.closed);const s=[],r=(t,e)=>{if(s.length>0){const n=s[s.length-1];if(Math.abs(n.x-t)<1e-9&&Math.abs(n.y-e)<1e-9)return}s.push({x:t,y:e})},o=(n.closed,i);for(let e=0;e<o;e++){const s=0===e?n.closed?i-1:-1:e-1,o=e===i-1?n.closed?0:-1:e+1,a=s>=0?t[s]:null,c=t[e],l=o>=0?t[o]:null;if(a&&a.x===c.x&&a.y===c.y)continue;const h=a&&l?Rr(c,n.round):0;let d,u,p,f;if(a){const t=Math.sqrt((a.x-c.x)**2+(a.y-c.y)**2),e=0!==t?Math.atan2(a.x-c.x,a.y-c.y):0,n=Math.min(h,t/2);d=Math.sin(e)*n+c.x,u=Math.cos(e)*n+c.y}else d=c.x,u=c.y;if(l){const t=Math.sqrt((l.x-c.x)**2+(l.y-c.y)**2),e=0!==t?Math.atan2(l.x-c.x,l.y-c.y):0,n=Math.min(h,t/2);p=Math.sin(e)*n+c.x,f=Math.cos(e)*n+c.y}else p=c.x,f=c.y;if(r(d,u),h>0&&a&&l)for(let t=1;t<=n.divisions;t++){const e=t/n.divisions,i=1-e;r(i*i*d+2*i*e*c.x+e*e*p,i*i*u+2*i*e*c.y+e*e*f)}else d===p&&u===f||r(p,f);if(l&&Or(c)){const t=Rr(l,n.round),e=Math.sqrt((c.x-l.x)**2+(c.y-l.y)**2),i=0!==e?Math.atan2(c.x-l.x,c.y-l.y):0,s=Math.min(t,e/2),o=Dr({x:p,y:f},{x:Math.sin(i)*s+l.x,y:Math.cos(i)*s+l.y},c.bulge);if(o){let t=o.endAngle-o.startAngle;if(o.clockwise)for(;t>0;)t-=2*Math.PI;else for(;t<0;)t+=2*Math.PI;for(let e=1;e<=n.divisions;e++){const i=e/n.divisions,s=o.startAngle+t*i;r(o.cx+o.radius*Math.cos(s),o.cy+o.radius*Math.sin(s))}}}}if(n.closed&&s.length>0){const t=s[0],e=s[s.length-1];(Math.abs(e.x-t.x)>1e-9||Math.abs(e.y-t.y)>1e-9)&&s.push({x:t.x,y:t.y})}return new Sv(s,n.closed)}function Ev(t,e){return Av(t,e).length}function kv(t){return t?/forklift|agv|amr|oht|tugger|worker/i.test(t)?"mobile":/conveyor|sorter|induct|chute|belt/i.test(t)?"flow":/rack|shelf|stocker|cell/i.test(t)?"cell":/pallet|box|parcel|crate|drum|tray/i.test(t)?"atomic":/robot[-_]?arm|crane|lift/i.test(t)?"articulated":/spawn[-_]?point|sink[-_]?point/i.test(t)?"boundary":"":""}function Cv(t){const e=[];let n=t.parent;for(;n&&!n.isRootModel?.();){const t=n.state?.id??n.constructor?.name;t&&e.unshift(t),n=n.parent}return e.join(" › ")}function Tv(t,e=!0){const n=t.constructor?.name??t.state?.type??"Component",i={type:n,id:t.state?.id??`?${t._id??Math.random().toString(36).slice(2,7)}`,category:kv(n),parentId:t.parent?.state?.id,parentPath:Cv(t)},s=t._realObject?.object3d;if(s){s.updateWorldMatrix?.(!0,!1);const t=s.matrixWorld?.elements;t&&(i.pose={position:{x:t[12],y:t[13],z:t[14]},rotation:{x:0,y:0,z:0,w:1}})}if(!0===t.isItem&&(i.isItem=!0),!0===t.isMover&&(i.isMover=!0),"function"!=typeof t.canReceive&&"function"!=typeof t.canAccept||(i.isHolder=!0),"function"==typeof t.pickupFrames)try{i.isPickable=t.pickupFrames().length>0}catch{i.isPickable=!1}if("string"==typeof t.toolType||"function"==typeof t.toolType?i.toolType="function"==typeof t.toolType?t.toolType():t.toolType:void 0!==t.toolType&&(i.toolType=String(t.toolType)),t.state&&"object"==typeof t.state){const e={};for(const[n,i]of Object.entries(t.state))"string"!=typeof i&&"number"!=typeof i&&"boolean"!=typeof i&&null!==i||(e[n]=i);i.state=e}if(e){const e=t.components??[];i.childIds=e.map(t=>t.state?.id).filter(Boolean)}return i}function Pv(t){function e(t,n){if(!t)return;n.push(Tv(t));const i=t.components??[];for(const t of i)e(t,n)}function n(t,e){if(!e)return null;if(e.state?.id===t)return e;const i=e.components??[];for(const e of i){const i=n(t,e);if(i)return i}return null}return{version:"0.1.0",collectComponents(){const n=[];return e(t?.rootModel??t,n),n},getComponent(e){const i=n(e,t?.rootModel??t);if(!i)return null;const s={...Tv(i)};if("function"==typeof i.pickupFrames)try{s.pickupFrames=i.pickupFrames()}catch{}if("object"==typeof i.slots)try{s.slots=Array.isArray(i.slots)?i.slots:"function"==typeof i.slots?i.slots():[]}catch{}if("function"==typeof i.acceptanceRotation)try{s.acceptanceWorldQuat=i.deliveryWorldRotation?.(null)??void 0}catch{}if("function"==typeof i.deliveryWorldPosition)try{s.deliveryWorldPosition=i.deliveryWorldPosition(null)}catch{}return s},simStatus(){let e=0;const n=[t?.rootModel??t];for(;n.length>0;){const t=n.pop();if(!t)continue;!0===t.isItem&&e++;const i=t.components??[];for(const t of i)n.push(t)}return{simTime:mr.now,realTime:"undefined"!=typeof performance?performance.now():Date.now(),speed:mr.speed,paused:mr.isPaused,carrierCount:e}},transferLog(){const t={};Pu.flows().forEach((e,n)=>{t[n]=e});const e={};Pu.targetCounts().forEach((t,n)=>{e[n]=t});const n={};return Pu.rejectReasonCounts().forEach((t,e)=>{n[e]=t}),{entries:Pu.toJSON(),stats:Pu.stats(),flows:t,targetCounts:e,rejectReasonCounts:n}},reservations(){const t=[...gv.all()],e={},n={};for(const i of t)(e[i.resource]??=[]).push(i),(n[i.reserverId]??=[]).push(i);for(const t of Object.values(e))t.sort((t,e)=>t.timeWindow.startSimMs-e.timeWindow.startSimMs);for(const t of Object.values(n))t.sort((t,e)=>t.timeWindow.startSimMs-e.timeWindow.startSimMs);return{simTime:mr.now,all:t,byResource:e,byReserver:n}},conflicts(){const t=gv.conflictLog(),e={},n={};let i=0,s=0;for(const r of t)e[r.resource]=(e[r.resource]??0)+1,n[r.proposed.reserverId]=(n[r.proposed.reserverId]??0)+1,"rejected"===r.outcome?i++:s++;return{simTime:mr.now,log:[...t],total:t.length,rejected:i,preempted:s,byResource:e,byReserver:n}}}}function Ov(t){const e=Pv(t);return"undefined"!=typeof window&&(window.__SCENE_INSPECTOR__=e),e}let Dv=0;const zv=new FinalizationRegistry(()=>{Dv--});class Iv{static get residents(){return Dv}static get residentsCount(){return Dv}constructor(t,e){this.counters={},this.references={},this.creator=t,this.disposer=e,Dv++,zv.register(this,Dv)}dispose(){if(this.disposer)for(const t in this.references)this.disposer(t,this.references[t]);this.references={},this.counters={}}get ids(){return Object.keys(this.references)}create(t){return new Promise((e,n)=>{this.creator?this.creator(t,n=>{n.release=()=>{this.disposer?.(t,n),delete n.release,$i("RELEASED",t)},e(n)},n):n(Error("Reference id("+t+") could not be created. Reference creator should be defined."))})}add(t,e){const n=new Promise((n,i)=>{const s=this.references[t];if(s)s===e?i(Error("Reference ID and target duplicate")):e?i(Error("Reference ID duplicate")):n(s);else{const s=e=>{e.release=()=>{this.release(e)},this.references[t]=e,this.counters[t]=1,n(e)};if(e)s(e);else{if(!this.creator)return void i(Error("Reference id("+t+") is not allowed. Reference creator should be defined."));this.creator(t,s,i)}}});return this.references[t]||(this.references[t]=n),n}async get(t,e=!1){let n=this.references[t];if(n){if(!(n instanceof Promise)){if(!(t in this.counters))throw new Error("No Reference Count");return this.counters[t]++,n}if(e)return n=await n,this.counters[t]++,n}if(e)return await this.add(t);throw new Error("No References for "+t)}_id(t){for(const e in this.references){if(this.references[e]===t)return e}}release(t){const e=this._id(t);if(!e)return void Bi("No Referenced ID");const n=this.references[e];n&&(this.counters[e]--,0==this.counters[e]&&(this.disposer?.(e,n),delete this.references[e],delete this.counters[e],delete t.release,$i("RELEASED",e)))}}const Rv={},jv={};let Lv=[];function Fv(t){const e=t.target,n="SCRIPT"===e.tagName?Rv:jv,i=e.src||e.href;n[i]=!0,Lv.forEach((t,e)=>{if(!t)return;const{resolve:s,scripts:r,styles:o}=t;if(n===Rv){const t=r.indexOf(i);t>-1&&t<r.length-1&&Bv(r[t+1])}r.some(t=>!Rv[t])||o?.some(t=>!jv[t])||(s(),Lv[e]=null)}),Lv=Lv.filter(Boolean)}function Nv(t){if("string"==typeof t)return;const e=t.target,n=e.src,i="SCRIPT"===e.tagName?Rv:jv;Lv.forEach((e,s)=>{if(!e)return;const{reject:r,scripts:o,styles:a}=e;(i===Rv&&o.includes(n)||i===jv&&!!a?.includes(n))&&(r(t),Lv[s]=null)}),Lv=Lv.filter(Boolean),delete i[n],document.head.removeChild(e)}function Bv(t){Rv[t]=!1;const e=document.createElement("script");e.onload=Fv,e.onerror=Nv,e.type="text/javascript",e.src=t,document.head.appendChild(e)}class Hv{static load(t,e){const n="string"==typeof t?[t]:t,i="string"==typeof e?[e]:e;return new Promise(function(t,e){if(n&&!Array.isArray(n)||i&&!Array.isArray(i))return void e(new Error("invalid sources for load"));let s,r=!0;if(i?.forEach(t=>{t in jv||function(t){jv[t]=!1;const e=document.createElement("link");e.onload=Fv,e.onerror=Nv,e.type="text/css",e.rel="stylesheet",e.media="screen,print",e.href=t,document.head.appendChild(e)}(t),jv[t]||(r=!1)}),n&&n.length>0)for(const t of n)t in Rv?Rv[t]||(r=!1):s??=t;if(s)Bv(s);else if(r)return void t();Lv.push({resolve:t,reject:e,scripts:n,styles:i})})}}const $v="0.0.0";function Gv(t){if(!(t>0))return 1;let e=0;if(!(t&t-1))return t;for(;0!=t;)t>>=1,e+=1;return 1<<e}function Vv(t){const{lineWidth:e=0}=t.state;let{width:n,height:i}=t.bounds;n+=e,i+=e;const s=Gv(2*n),r=Gv(2*i),o=Mp(s,r),a=new M.CanvasTexture(o);return Uv(o,t,2),a.needsUpdate=!0,a.wrapS=M.RepeatWrapping,a.wrapT=M.RepeatWrapping,a.offset.set(0,1-2*i/r),a.repeat.set(2*n/s,2*i/r),a.magFilter=M.NearestFilter,a.minFilter=M.LinearFilter,a.colorSpace=M.SRGBColorSpace,a}function Uv(t,e,n){const{lineWidth:i=0}=e.state;let{left:s,top:r}=e.bounds;s-=i/2,r-=i/2;const o=t.getContext("2d");o.scale(n,n),o.translate(-s,-r),e.render(o),e.postrender(o)}function Yv(t,e,n=2){const i=t.getContext("2d");i&&(i.setTransform(1,0,0,1,0,0),i.clearRect(0,0,t.width,t.height),Uv(t,e,n))}const Wv=new Set(["cx","cy","cz","zPos","left","top","width","height","depth","lineWidth","rotationX","rotationY","rotation","scale","hidden","alpha","material3d","screenFixed"]);class qv extends iu{get syncZPosOffset(){return this.effectiveDepth}get geometricOffsetY(){return this.effectiveDepth}constructor(t){super(t),this._origInvalidate=t.invalidate.bind(t),t.invalidate=()=>{this._origInvalidate(),this._refreshTextureNow()}}getObject3dInstance(){return new M.Mesh}build(){super.build();const{width:t,height:e}=this.component.bounds;if(!t||!e)return;const n=ud(this.component.state.material3d),i=new M.PlaneGeometry(1,1);i.rotateX(-Math.PI/2),this.object3d.geometry=i;const s=Vv(this.component),r=new M.MeshStandardMaterial({map:s});md(r,n),r.transparent=!0,this.object3d.material=r,this.object3d.castShadow=n.castShadow,this.object3d.receiveShadow=n.receiveShadow}updateDimension(){const{width:t,height:e}=this.component.bounds;this.setDimensionScale(t,1,e)}updateAlpha(){const{alpha:t=1,fillStyle:e}=this.component.state;jd(this.object3d.material,0,e)}_debouncedRebuild(){this._debounceTimer&&clearTimeout(this._debounceTimer),this._debounceTimer=setTimeout(()=>{this._debounceTimer=void 0,this._rebuildTexture()},100)}_rebuildTexture(){this.clear(),this.build(),this.updateTransform(),this.updateDimension(),this.updateHidden()}_refreshTextureNow(){const t=this.object3d.material,e=t?.map;if(!e)return;const n=e.source?.data;n&&(Yv(n,this.component,2),e.needsUpdate=!0)}updateFillStyle(){this._debouncedRebuild()}updateStrokeStyle(){this._debouncedRebuild()}updateText(){this._debouncedRebuild()}onchange(t,e){super.onchange(t,e);for(const e of Object.keys(t))if(!Wv.has(e)){this._debouncedRebuild();break}}updateMaterial3d(){super.updateMaterial3d();const t=this.object3d.material;if(!t)return;const e=ud(this.component.state.material3d);md(t,e),t.transparent=!0,this.object3d.castShadow=e.castShadow,this.object3d.receiveShadow=e.receiveShadow}clear(){return this._debounceTimer&&(clearTimeout(this._debounceTimer),this._debounceTimer=void 0),Vd(this.object3d),super.clear()}dispose(){this._debounceTimer&&(clearTimeout(this._debounceTimer),this._debounceTimer=void 0),this._origInvalidate&&(this.component.invalidate=this._origInvalidate,this._origInvalidate=void 0),super.dispose()}}const Xv=new Map;function Kv(t){return Math.round(1e3*t)/1e3}function Qv(t){return new M.Color(t).getHexString()}const Zv={material(t,e,n){const i=t+"::"+function(t){const e=[];return null!=t.color&&e.push("c"+Qv(t.color)),null!=t.metalness&&e.push("m"+Kv(t.metalness)),null!=t.roughness&&e.push("r"+Kv(t.roughness)),null!=t.opacity&&e.push("o"+Kv(t.opacity)),null!=t.emissive&&e.push("E"+Qv(t.emissive)),null!=t.emissiveIntensity&&e.push("I"+Kv(t.emissiveIntensity)),null!=t.envMapIntensity&&e.push("e"+Kv(t.envMapIntensity)),null!=t.side&&e.push("s"+t.side),t.transparent&&e.push("t"),t.flatShading&&e.push("f"),!1===t.depthWrite&&e.push("dw0"),t.map&&e.push("M"+(t.map.uuid??"")),e.join("|")}(e);let s=Xv.get(i);return s||Xv.set(i,s=function(t){const e=new M.MeshStandardMaterial;return e.userData.__bankOwned=!0,null!=t.color&&e.color.set(t.color),null!=t.emissive&&e.emissive.set(t.emissive),null!=t.metalness&&(e.metalness=t.metalness),null!=t.roughness&&(e.roughness=t.roughness),null!=t.emissiveIntensity&&(e.emissiveIntensity=t.emissiveIntensity),null!=t.envMapIntensity&&(e.envMapIntensity=t.envMapIntensity),null!=t.side&&(e.side=t.side),null!=t.map&&(e.map=t.map),null!=t.flatShading&&(e.flatShading=t.flatShading),null!=t.depthWrite&&(e.depthWrite=t.depthWrite),null!=t.opacity&&(e.opacity=t.opacity),null!=t.transparent?e.transparent=t.transparent:null!=t.opacity&&t.opacity<1&&(e.transparent=!0),e}(e)),null==n?s:Od(s,{color:n})},get size(){return Xv.size},has(t){const e=t+"::";for(const t of Xv.keys())if(t.startsWith(e))return!0;return!1},dispose(){for(const t of Xv.values())zd(t),t.dispose();Xv.clear()}};class Jv extends iu{getObject3dInstance(){return new M.Mesh}build(){super.build(),this.buildGeometry(),this.buildMaterial(),this.updateDimension()}updateAlpha(){if(this.canShareMaterial)return void super.updateAlpha();const{alpha:t=1,fillStyle:e}=this.component.state;jd(this.object3d.material,0,e)}updateFillStyle(){if(this.canShareMaterial)return this.applyBankMaterial(),void this.applyMaterialOpacity();const{fillStyle:t,alpha:e=1}=this.component.state,n=this.object3d.material;if(!n)return;const i=iu.buildFillStyleTexture(this.component);i?(n.map&&n.map.dispose(),i.needsUpdate=!0,n.map=i,n.needsUpdate=!0):"string"==typeof t&&(n.map&&(n.map.dispose(),n.map=null,n.needsUpdate=!0),"transparent"!==t&&"none"!==t&&n.color.set(Ld(t))),jd(n,0,t)}updateStrokeStyle(){const t=this.object3d.getObjectByName("__edgeLines__");t&&(this.object3d.remove(t),Vd(t));const{strokeStyle:e}=this.component.state;if(!e||"transparent"===e||"none"===e)return;const n=this.object3d.geometry;if(!n?.getAttribute("position"))return;const i=new M.EdgesGeometry(n),s=new M.LineBasicMaterial({color:e}),r=new M.LineSegments(i,s);r.name="__edgeLines__",this.object3d.add(r)}updateDimension(){const{width:t,height:e}=this.component.bounds,{depth:n=1}=this.component.state;if(!this.object3d)return;this.object3d.geometry.computeBoundingBox();const i=this.object3d.geometry.boundingBox;if(i){const s=i.max.x-i.min.x,r=i.max.y-i.min.y,o=i.max.z-i.min.z;this.setDimensionScale(t/s,n/r,e/o)}}get canShareMaterial(){return void 0===this.materialSharingIssue}get materialSharingIssue(){const{fillStyle:t}=this.component.state;if(!t||"object"!=typeof t)return;const e=t.type;return"pattern"===e?"무늬(pattern) fillStyle 은 인스턴스마다 캔버스 텍스처가 필요하다":"gradient"===e?"그라디언트 fillStyle 은 인스턴스마다 캔버스 텍스처가 필요하다":`fillStyle 이 색 문자열이 아니다 (type: ${String(e)})`}get requiresSharedMaterial(){return!0===this.component.constructor.requiresSharedMaterial}get materialSharing(){const t=this.materialSharingIssue,e=void 0===t,n=this.requiresSharedMaterial,i={shared:e,required:n,violated:n&&!e};return void 0!==t&&(i.reason=t),e&&(i.bankKey=this.materialBankKey),i}get materialBankKey(){return`mesh|${this.component.state.type??"unknown"}`}materialSpec(){const t=ud(this.component.state.material3d),e=Rd(this.component.state.fillStyle);return{metalness:t.metalness,roughness:t.roughness,emissive:t.emissive,emissiveIntensity:t.emissiveIntensity,envMapIntensity:t.envMapIntensity,side:fd(t.side),flatShading:t.flatShading,opacity:e,transparent:e<1}}buildMaterial(){if(!this.canShareMaterial){const t=ud(this.component.state.material3d),e=new M.MeshStandardMaterial({transparent:!0});return md(e,t),void(this.object3d.material=e)}this.applyBankMaterial()}applyBankMaterial(){const{fillStyle:t}=this.component.state,e=Rd(t)>0&&"string"==typeof t?Ld(t):void 0;Dd(this.object3d),this.object3d.material=Zv.material(this.materialBankKey,this.materialSpec(),e)}updateMaterial3d(){if(super.updateMaterial3d(),this.canShareMaterial)return this.applyBankMaterial(),void this.applyMaterialOpacity();const t=this.object3d.material;t&&md(t,ud(this.component.state.material3d))}clear(){return Dd(this.object3d),Vd(this.object3d),super.clear()}}function tx(t,e,n,i){return[["bold",t],["italic",e],[n+"px",!0],[i,!0]].filter(t=>t[1]).map(t=>t[0]).join(" ")}function ex(t){let e=0;if(!((t=Math.abs(t)||1)&t-1))return t;for(;0!=t;)t>>=1,e+=1;return 1<<e}function nx(t,e,n){const{bold:i=!1,italic:s=!1,fontFamily:r="Serif",fontSize:o=10,fontColor:a="black",textAlign:c="center",textBaseline:l="middle",width:h=t.width,height:d=t.height,offsetX:u=0,offsetY:p=0}=n||{},f=t.getContext("2d");let m,g;f.imageSmoothingEnabled=!1,f.fillStyle=a,f.strokeStyle=a,f.font=tx(i,s,o,r),"left"===c||"start"===c?(f.textAlign="left",m=u):"right"===c||"end"===c?(f.textAlign="right",m=u+h):(f.textAlign="center",m=u+h/2);const y=1.2*o,b=String(e).split("\n"),_=y*b.length;g="top"===l||"hanging"===l?p+.1*o:"bottom"===l||"alphabetic"===l?p+d-_+.1*o:p+(d-_)/2+.1*o,f.textBaseline="top";for(const t of b)f.fillText(t,m,g),g+=y}function ix(t,e,n,i){const s=ex(2*e),r=ex(2*n),o=Mp(s,r),a=o.getContext("2d"),{fillStyle:c}=i||{};if(c&&"object"==typeof c&&c.colorStops?.length){const t=Ud(c,2*e,2*n);t&&a.drawImage(t,0,0)}a.scale(2,2),"string"==typeof c&&""!==c&&"transparent"!==c&&(a.fillStyle=c,a.fillRect(0,0,e,n)),nx(o,t,i);const l=new M.CanvasTexture(o);return l.needsUpdate=!0,l.wrapS=M.RepeatWrapping,l.wrapT=M.RepeatWrapping,l.offset.set(0,1-2*n/r),l.repeat.set(2*e/s,2*n/r),l.minFilter=M.LinearFilter,l.colorSpace=M.SRGBColorSpace,l}function sx(t,e,n,i,s,r,o){const a=new Image;a.crossOrigin="anonymous",a.onload=()=>{const t=2*n,c=2*i,l=ex(t),h=ex(c),d=Mp(l,h),u=d.getContext("2d");if(r.color&&(u.fillStyle=r.color,u.fillRect(0,0,t,c)),r.fitPattern)u.drawImage(a,0,0,t,c);else{const e=2*(r.width||a.naturalWidth),n=2*(r.height||a.naturalHeight),i=2*(r.offsetX||0),s=2*(r.offsetY||0);let o=0,l=0;switch(r.align){case"center":o=(t-e)/2,l=(c-n)/2;break;case"left-top":break;case"left-bottom":l=c-n;break;case"right-top":o=t-e;break;case"right-bottom":o=t-e,l=c-n;break;case"left":l=(c-n)/2;break;case"right":o=t-e,l=(c-n)/2;break;case"top":o=(t-e)/2;break;case"bottom":o=(t-e)/2,l=c-n}const h=i+o,d=s+l;if(r.noRepeat)u.drawImage(a,0,0,a.naturalWidth,a.naturalHeight,h,d,e,n);else{u.save(),u.rect(0,0,t,c),u.clip();const i=h>0?h-Math.ceil(h/e)*e:h;for(let s=d>0?d-Math.ceil(d/n)*n:d;s<c;s+=n)for(let r=i;r<t;r+=e)u.drawImage(a,0,0,a.naturalWidth,a.naturalHeight,r,s,e,n);u.restore()}}e&&(u.scale(2,2),nx(d,e,s));const p=new M.CanvasTexture(d);p.needsUpdate=!0,p.wrapS=M.RepeatWrapping,p.wrapT=M.RepeatWrapping,p.offset.set(0,1-c/h),p.repeat.set(t/l,c/h),p.minFilter=M.LinearFilter,p.colorSpace=M.SRGBColorSpace,o(p)},a.onerror=()=>{const t=ix(e,n,i,s);o(t)},a.src=t}function rx(t,e){let{bold:n=!1,italic:i=!1,fontFamily:s="Serif",fontSize:r=10,lineHeight:o="normal"}=e||{};t=void 0===t||""==t?" ":String(t);const a=document.createElement("span");a.style.font=tx(n,i,r,s),a.style.lineHeight=String(o),a.style.whiteSpace="pre",a.style.position="absolute",a.textContent=t,document.body.appendChild(a);const c=a.getBoundingClientRect();return document.body.removeChild(a),{width:c.width,height:c.height}}class ox extends Jv{get zPriority(){return Kd.DECAL}get syncZPosOffset(){return this.effectiveDepth}get geometricOffsetY(){return this.effectiveDepth}buildGeometry(){this.updateDimension()}updateStrokeStyle(){}updateFillStyle(){this.updateText()}updateDimension(){const{width:t,height:e}=this.component.state,n=Math.abs(t)||1,i=Math.abs(e)||1;this.object3d.geometry&&this.object3d.geometry.dispose();const s=new M.PlaneGeometry(n,i);s.rotateX(-Math.PI/2),this.object3d.geometry=s}updateText(){const t=this.object3d.material;if(!t)return;const{width:e,height:n,bold:i=!1,italic:s=!1,fontFamily:r="Serif",fontSize:o=10,fontColor:a="black",textAlign:c="center",textBaseline:l="middle",fillStyle:h}=this.component.state,d=Math.abs(e)||1,u=Math.abs(n)||1,p=this.component.text,f=h&&"none"!==h?h:"transparent",m={bold:i,italic:s,fontFamily:r,fontSize:o,fontColor:a,textAlign:c,textBaseline:l,width:d,height:u,fillStyle:f};if("object"==typeof f&&"pattern"===f?.type&&f.image){return void sx(this.component.app.url(h.image),p,d,u,m,h,e=>{t.map&&t.map.dispose(),t.map=e,t.color.set(16777215),t.needsUpdate=!0})}const g=ix(p,d,u,m);g?(t.map&&t.map.dispose(),t.map=g,t.color.set(16777215),g.needsUpdate=!0):"string"==typeof h&&(""!==h&&"transparent"!==h?t.color.set(Ld(h)):t.opacity=0)}updateAlpha(){const t=this.object3d.material;t.opacity=1,t.transparent=!0,super.applyMaterialOpacity()}}zp("text",t=>new ox(t));const ax={input:"css3d",select:"css3d",textarea:"css3d",button:"css3d",iframe:"css3d",video:"css3d",label:"texture",table:"texture",progress:"texture"};function cx(t){const e=t.model?.type??"";return"texture"===(ax[e]??"css3d")?new qv(t):new Pp(t)}zp("html-overlay-element",cx),zp("html-overlay-container",cx);class lx{setShape({extrudedShape:t,extrudedOptions:e}){this.extrudedShape=t,this.bb=new M.Box2,this.bb.setFromPoints(this.extrudedShape?.extractPoints(0).shape),this.extrudedOptions=e}generateTopUV(t,e,n,i,s){const r=e[3*n],o=e[3*n+1],a=e[3*i],c=e[3*i+1],l=e[3*s],h=e[3*s+1],d=this.bb,u=d.max.x-d.min.x,p=d.max.y-d.min.y;return[new M.Vector2((r-d.min.x)/u,1-(o-d.min.y)/p),new M.Vector2((a-d.min.x)/u,1-(c-d.min.y)/p),new M.Vector2((l-d.min.x)/u,1-(h-d.min.y)/p)]}generateSideWallUV(t,e,n,i,s,r){const o=e[3*n],a=e[3*n+1],c=e[3*n+2],l=e[3*i],h=e[3*i+1],d=e[3*i+2],u=e[3*s],p=e[3*s+1],f=e[3*s+2],m=e[3*r],g=e[3*r+1],y=e[3*r+2],b=this.extrudedOptions?.depth||100,_=this.bb,v=_.max.x-_.min.x,x=_.max.y-_.min.y;return Math.abs(a-h)<.01?[new M.Vector2(o/v,1-c/b),new M.Vector2(l/v,1-d/b),new M.Vector2(u/v,1-f/b),new M.Vector2(m/v,1-y/b)]:[new M.Vector2(a/x,1-c/b),new M.Vector2(h/x,1-d/b),new M.Vector2(p/x,1-f/b),new M.Vector2(g/x,1-y/b)]}}function hx(t,e){const n=t/2,i=e/2;return{points:[{x:-n,y:-i},{x:n,y:-i},{x:n,y:i},{x:-n,y:i}]}}function dx(t,e,n){const i=Math.max(3,Math.floor(n)),s=[];for(let n=0;n<i;n++){const r=n/i*Math.PI*2;s.push({x:t*Math.cos(r),y:e*Math.sin(r)})}return{points:s,segments:i}}function ux(t){if(0===t.length)return[];let e=1/0,n=1/0,i=-1/0,s=-1/0;for(const r of t)r.x<e&&(e=r.x),r.x>i&&(i=r.x),r.y<n&&(n=r.y),r.y>s&&(s=r.y);const r=(e+i)/2,o=(n+s)/2,a=t.map(t=>({x:t.x-r,y:t.y-o})),c=a[0],l=a[a.length-1];return a.length>1&&Math.abs(c.x-l.x)<1e-9&&Math.abs(c.y-l.y)<1e-9&&a.pop(),a}class px extends iu{clear(){return this._mesh=void 0,super.clear()}get shape(){return null}topOutline(){const t=this.shape;if(!t||"function"!=typeof t.getPoints)return null;const e=this.outlineDivisions,n=t.getPoints(e);if(!n||n.length<3)return null;const i=ux(n);return i.length<3?null:{points:i}}get outlineDivisions(){return 12}get boundUVGenerator(){return this._boundUVGenerator||(this._boundUVGenerator=new lx),this._boundUVGenerator}build(){super.build();const t=this.effectiveDepth,e=this.shape;if(!e)return;const n=this.boundUVGenerator;n&&n.setShape({extrudedShape:e,extrudedOptions:{depth:t}});const i=this.createGeometry(e),s=this.createMaterials();this._mesh=new M.Mesh(i,s),this._mesh.rotation.x=-Math.PI/2,this._mesh.rotation.y=-Math.PI,this._mesh.rotation.z=-Math.PI,this._mesh.castShadow=!0,this.object3d.add(this._mesh),this.updateFillStyle(),this.updateStrokeStyle()}createGeometry(t){const e=this.effectiveDepth,{lineWidth:n=0}=this.component.state,i={steps:1,depth:e,bevelEnabled:n>0,bevelThickness:0,bevelSize:n,bevelSegments:1,UVGenerator:this.boundUVGenerator},s=new M.ExtrudeGeometry(t,i);return s.center(),s}createMaterials(){const t=ud(this.component.state.material3d),e=new M.MeshStandardMaterial;md(e,t);const n=new M.MeshStandardMaterial;return md(n,t),[e,n]}createTexture(){const{width:t,height:e}=this.component.bounds,n=ex(t),i=ex(e),s=Mp(n,i);this.component.render(s.getContext("2d"));const r=new M.CanvasTexture(s);return r.needsUpdate=!0,r.wrapS=M.RepeatWrapping,r.wrapT=M.RepeatWrapping,r.offset.set(0,1-e/i),r.repeat.set(t/n,e/i),r.minFilter=M.LinearFilter,r}getMaterials(){if(!this._mesh)return;const t=this._mesh.material;return Array.isArray(t)?t:void 0}updateMaterial3d(){super.updateMaterial3d();const t=this.getMaterials();if(!t)return;const e=ud(this.component.state.material3d);for(const n of t)md(n,e)}updateAlpha(){const{alpha:t=1,fillStyle:e,strokeStyle:n}=this.component.state,i=this.getMaterials();i&&(jd(i[0],0,e),jd(i[1],0,n))}updateStrokeStyle(){const t=this.getMaterials();if(!t)return;const{strokeStyle:e}=this.component.state;t[1].color.set(Ld(e))}updateFillStyle(){this._applyCapTexture()}updateText(){this._applyCapTexture()}_applyCapTexture(){const t=this.getMaterials();if(!t)return;const e=t[0],{fillStyle:n}=this.component.state,i=this.component.hasTextProperty?this.component.text:"";if(!i){const t=iu.buildFillStyleTexture(this.component);return t?(e.map&&e.map.dispose(),e.map=t,e.color.set(16777215)):(e.map&&(e.map.dispose(),e.map=null),e.color.set(Ld(n))),void(e.needsUpdate=!0)}const{bold:s=!1,italic:r=!1,fontFamily:o="Serif",fontSize:a=10,fontColor:c="black",textAlign:l="center",textBaseline:h="middle",paddingTop:d=0,paddingLeft:u=0,paddingRight:p=0,paddingBottom:f=0}=this.component.state,{width:m,height:g}=this.component.bounds,y=Math.abs(m)||1,b=Math.abs(g)||1,_={bold:s,italic:r,fontFamily:o,fontSize:a,fontColor:c,textAlign:l,textBaseline:h,width:Math.max(y-u-p,0),height:Math.max(b-d-f,0),fillStyle:n,offsetX:u,offsetY:d};if("object"==typeof n&&"pattern"===n?.type&&n.image){return void sx(this.component.app.url(n.image),i,y,b,_,n,t=>{e.map&&e.map.dispose(),e.map=t,e.color.set(16777215),e.needsUpdate=!0})}e.map&&e.map.dispose();const v=ix(i,y,b,_);e.map=v,e.color.set(16777215),e.needsUpdate=!0}updateDimension(){super.updateDimension()}onchange(t,e){if("path"in t&&this._mesh){const t=this._mesh.geometry,e=this.shape;if(e){const n=this.createGeometry(e);this._mesh.geometry=n,t.dispose()}}super.onchange(t,e)}}class fx extends px{get shape(){const{cx:t=0,cy:e=0,rx:n=1,ry:i=1,startAngle:s=0,endAngle:r=2*Math.PI,anticlockwise:o=!1}=this.component.state,a=new M.EllipseCurve(t,e,Math.abs(n),Math.abs(i),s,r,o,0);return new M.Shape(a.getPoints(50))}}zp("ellipse",t=>new fx(t));class mx extends px{get shape(){const{width:t,height:e,round:n=0}=this.component.state,i=uc(n,t,e);if(i>0){const n=i,s=new M.Path;return s.moveTo(n,0),s.lineTo(t-n,0),s.quadraticCurveTo(t,0,t,n),s.lineTo(t,e-n),s.quadraticCurveTo(t,e,t-n,e),s.lineTo(n,e),s.quadraticCurveTo(0,e,0,e-n),s.lineTo(0,n),s.quadraticCurveTo(0,0,n,0),new M.Shape(s.getPoints(12))}const s=new M.Shape;return s.moveTo(0,0),s.lineTo(t,0),s.lineTo(t,e),s.lineTo(0,e),s.lineTo(0,0),s}}function gx(t,e={}){const n=e.round??0,i=e.divisions??24;if(!t||0===t.length)return new M.Shape;const s=t.some(t=>Or(t)),r=n>0||t.some(t=>Rr(t,0)>0);if(s||r){const e=new M.Path;for(let i=0;i<t.length;i++){const s=t[(i-1+t.length)%t.length],r=t[i],o=t[(i+1)%t.length];if(s.x===r.x&&s.y===r.y)continue;const a=Rr(r,n);let c=Math.sqrt((s.x-r.x)**2+(s.y-r.y)**2),l=0!==c?Math.atan2(s.x-r.x,s.y-r.y):0;const h=Math.sin(l)*Math.min(a,c/2)+r.x,d=Math.cos(l)*Math.min(a,c/2)+r.y;c=Math.sqrt((o.x-r.x)**2+(o.y-r.y)**2),l=0!==c?Math.atan2(o.x-r.x,o.y-r.y):0;const u=Math.sin(l)*Math.min(a,c/2)+r.x,p=Math.cos(l)*Math.min(a,c/2)+r.y;if(0===i?e.moveTo(h,d):e.lineTo(h,d),a>0&&e.quadraticCurveTo(r.x,r.y,u,p),Or(r)){const t=Rr(o,n),i=Math.sqrt((r.x-o.x)**2+(r.y-o.y)**2),s=0!==i?Math.atan2(r.x-o.x,r.y-o.y):0,a=Dr({x:u,y:p},{x:Math.sin(s)*Math.min(t,i/2)+o.x,y:Math.cos(s)*Math.min(t,i/2)+o.y},r.bulge);a&&e.absarc(a.cx,a.cy,a.radius,a.startAngle,a.endAngle,a.clockwise)}}return new M.Shape(e.getPoints(i))}const o=new M.Shape;for(let e=0;e<t.length;e++)0===e?o.moveTo(t[e].x,t[e].y):o.lineTo(t[e].x,t[e].y);return o}zp("rect",t=>new mx(t));class yx extends px{get shape(){const{path:t=[],round:e=0}=this.component.state;return gx(t,{round:e,divisions:24})}build(){Object.getPrototypeOf(px.prototype).build.call(this);const t=this.effectiveDepth,e=this.shape;if(!e)return;const n=this.boundUVGenerator,i=this.minMax;if(n&&void 0!==i.minX&&void 0!==i.maxX&&void 0!==i.minY&&void 0!==i.maxY){const e=new M.Shape;e.moveTo(i.minX,i.minY),e.lineTo(i.maxX,i.minY),e.lineTo(i.maxX,i.maxY),e.lineTo(i.minX,i.maxY),e.closePath(),n.setShape({extrudedShape:e,extrudedOptions:{depth:t}})}else n&&n.setShape({extrudedShape:e,extrudedOptions:{depth:t}});const s=this.createGeometry(e),r=this.createMaterials();this._mesh=new M.Mesh(s,r),this._mesh.rotation.x=-Math.PI/2,this._mesh.rotation.y=-Math.PI,this._mesh.rotation.z=-Math.PI,this._mesh.castShadow=!0,this.object3d.add(this._mesh),this.updateFillStyle(),this.updateStrokeStyle()}createGeometry(t){const e=this.effectiveDepth,{lineWidth:n=0}=this.component.state,i={steps:1,depth:e,bevelEnabled:n>0,bevelThickness:0,bevelSize:n,bevelSegments:1,UVGenerator:this.boundUVGenerator},s=new M.ExtrudeGeometry(t,i),r=this.minMax;if(void 0!==r.minX&&void 0!==r.maxX&&void 0!==r.minY&&void 0!==r.maxY){const t=(r.minX+r.maxX)/2,e=(r.minY+r.maxY)/2;s.translate(-t,-e,0),s.computeBoundingBox();const n=s.boundingBox;n&&s.translate(0,0,-(n.min.z+n.max.z)/2)}else s.center();return s}get minMax(){if(!this._minMax){const{path:t}=this.component.state;let e,n,i,s;t.forEach((t,r)=>{if(0==r)return e=i=t.x,void(n=s=t.y);e=Math.min(e,t.x),i=Math.max(i,t.x),n=Math.min(n,t.y),s=Math.max(s,t.y)}),this._minMax={minX:e,minY:n,maxX:i,maxY:s}}return this._minMax}}zp("polygon",t=>new yx(t));class bx extends px{get shape(){const{cx:t=0,cy:e=0,rx:n=1,ry:i=1,ratio:s=50,startAngle:r=0,endAngle:o=2*Math.PI,anticlockwise:a=!1}=this.component.state,c=Math.abs(n),l=Math.abs(i),h=new M.EllipseCurve(t,e,c,l,r,o,a,0),d=new M.Shape(h.getPoints(50)),u=c/100*s,p=l/100*s;if(u>0&&p>0){const n=new M.EllipseCurve(t,e,u,p,r,o,a,0),i=new M.Path(n.getPoints(50));d.holes.push(i)}return d}}zp("donut",t=>new bx(t));class _x extends px{get shape(){const{x1:t=0,y1:e=0,x2:n=0,y2:i=0,x3:s=0,y3:r=0,round:o=0}=this.component.state,a=[{x:t,y:e},{x:n,y:i},{x:s,y:r}];if(o>0){const t=new M.Path;for(let e=0;e<a.length;e++){const n=a[(e-1+a.length)%a.length],i=a[e],s=a[(e+1)%a.length];let r=Math.sqrt((n.x-i.x)**2+(n.y-i.y)**2),c=0!==r?Math.atan2(n.x-i.x,n.y-i.y):0;const l=Math.sin(c)*Math.min(o,r/2)+i.x,h=Math.cos(c)*Math.min(o,r/2)+i.y;r=Math.sqrt((s.x-i.x)**2+(s.y-i.y)**2),c=0!==r?Math.atan2(s.x-i.x,s.y-i.y):0;const d=Math.sin(c)*Math.min(o,r/2)+i.x,u=Math.cos(c)*Math.min(o,r/2)+i.y;0===e?t.moveTo(l,h):t.lineTo(l,h),t.quadraticCurveTo(i.x,i.y,d,u)}return new M.Shape(t.getPoints(12))}const c=new M.Shape;return c.moveTo(t,e),c.lineTo(n,i),c.lineTo(s,r),c.closePath(),c}}zp("triangle",t=>new _x(t));class vx extends px{get shape(){const{ratio:t=30,wing:e=5,cx:n=0,cy:i=0,rx:s=1,ry:r=1}=this.component.state;if(e<3)return null;const o=Math.PI/2,a=2*Math.PI/e,c=s-t/100*s,l=r-t/100*r,h=new M.Shape;h.moveTo(n+s*Math.cos(-o),i+r*Math.sin(-o)),h.lineTo(n+(s-c)*(Math.cos(a-o)+Math.cos(0-o))/2,i+(r-l)*(Math.sin(a-o)+Math.sin(0-o))/2);for(let t=1;t<e;t++)h.lineTo(n+s*Math.cos(a*t-o),i+r*Math.sin(a*t-o)),h.lineTo(n+(s-c)*(Math.cos(a*(t+1)-o)+Math.cos(a*t-o))/2,i+(r-l)*(Math.sin(a*(t+1)-o)+Math.sin(a*t-o))/2);return h.closePath(),h}}zp("star",t=>new vx(t));const xx=new Map;function wx(t){return t.userData.__bankOwned=!0,t}const Mx={primitive(t){const e="primitive::"+function(t){switch(t.kind){case"cylinder":return`cylinder|${t.segments??0}`;case"sphere":return`sphere|${t.segments??0}|${t.heightSegments??0}`;default:return t.kind}}(t);let n=xx.get(e);return n||xx.set(e,n=wx(function(t){switch(t.kind){case"box":return new M.BoxGeometry(1,1,1);case"plane":return new M.PlaneGeometry(1,1);case"cylinder":return new M.CylinderGeometry(.5,.5,1,t.segments??16);case"sphere":return new M.SphereGeometry(.5,t.segments??16,t.heightSegments??Math.max(2,Math.round((t.segments??16)/2)))}}(t))),n},shaped(t,e){const n="shaped::"+t;let i=xx.get(n);return i||xx.set(n,i=wx(e())),i},owns:t=>!0===t.userData?.__bankOwned,get size(){return xx.size},has:t=>xx.has("primitive::"+t)||xx.has("shaped::"+t),dispose(){for(const t of xx.values())t.dispose();xx.clear()}},Sx=[8,12,16],Ax={cylinder:25,sphere:32},Ex=128;function kx(t,e){return"number"==typeof t&&Number.isFinite(t)?Math.min(Ex,Math.max(3,Math.floor(t))):e}function Cx(t,e){return"number"==typeof t&&Number.isFinite(t)?Math.min(Ex,Math.max(2,Math.floor(t))):Math.max(2,Math.round(e/2))}function Tx(t){return Sx.includes(t)}const Px={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"segments",name:"segments",property:"segments"},{type:"number",label:"height-segments",name:"heightSegments",property:"heightSegments"}],help:"scene/component/sphere"};class Ox extends Jv{buildGeometry(){const t=this.component.state,e=kx(t.segments,Ax.sphere),n=Cx(t.heightSegments,e);this.object3d.geometry=Mx.primitive({kind:"sphere",segments:e,heightSegments:n})}updateDimension(){const{rx:t=0,ry:e=0,rz:n}=this.component.state,i=n??t;this.setDimensionScale(2*t,2*i,2*e)}get effectiveDepth(){const{rx:t=0,rz:e}=this.component.state,n=e??t;return Math.max(2*n,1)}topOutline(){const{rx:t=0,ry:e=0}=this.component.state;if(!(t>0&&e>0))return null;return dx(t,e,kx(this.component.state.segments,Ax.sphere))}}t.Sphere=class extends ly{get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new Ox(this)}get nature(){return Px}},t.Sphere=Pm([Mb("sphere")],t.Sphere);class Dx extends iu{getObject3dInstance(){return new M.Sprite}build(){super.build(),this.buildMaterial()}get cz(){const{zPos:t=0}=this.component.state,{height:e}=this.component.bounds,{tz:n=0}=this.component.delta(),i=this.component.parent?._realObject;return t+n+e/2-(i?.geometricOffsetY??0)}get geometricOffsetY(){const{height:t=0}=this.component.bounds;return t/2}updateAlpha(){const{alpha:t=1,fillStyle:e}=this.component.state;jd(this.object3d.material,0,e)}updateFillStyle(){const{fillStyle:t}=this.component.state,e=this.object3d.material;if(!e)return;const n=iu.buildFillStyleTexture(this.component);n?(e.map&&e.map.dispose(),n.needsUpdate=!0,e.map=n):"string"==typeof t&&("transparent"!==t?e.color.set(Ld(t)):e.opacity=0)}}class zx extends Dx{buildMaterial(){const t=this.object3d.material;t&&t.dispose(),this.object3d.material=new M.SpriteMaterial({map:Vv(this.component),alphaTest:.01,sizeAttenuation:!1})}get scale(){const{width:t,height:e}=this.component.bounds,n=this.threeContainer,{width:i=1,height:s=1}=n?.bounds??{},{scale:r=1}=this.component.state;return{x:r*t/i,y:r*e/s,z:r}}update(){this.build(),this.updateHidden()}updateFillStyle(){this.update()}updateStrokeStyle(){this.update()}updateAlpha(){this.update()}updateText(){this.update()}}const Ix={mutable:!1,resizable:!0,rotatable:!0,properties:[]};t.Sprite=class extends(pc(dc)){get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new zx(this)}get nature(){return Ix}},t.Sprite=Pm([Mb("sprite")],t.Sprite);const Rx={mutable:!1,resizable:!0,rotatable:!0,properties:[],help:"scene/component/cube"};class jx extends Jv{buildGeometry(){this.object3d.geometry=Mx.primitive({kind:"box"})}topOutline(){const{width:t=0,height:e=0}=this.component.state;return t>0&&e>0?hx(t,e):null}}t.Cube=class extends(pc(dc)){get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new jx(this)}get nature(){return Rx}},t.Cube=Pm([Mb("cube")],t.Cube);const Lx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"segments",name:"segments",property:"segments"}],help:"scene/component/cylinder"};class Fx extends Jv{buildGeometry(){const t=kx(this.component.state.segments,Ax.cylinder);this.object3d.geometry=Mx.primitive({kind:"cylinder",segments:t})}updateDimension(){const{rx:t=0,ry:e=0,depth:n=1}=this.component.state;this.setDimensionScale(2*t,n,2*e)}topOutline(){const{rx:t=0,ry:e=0}=this.component.state;if(!(t>0&&e>0))return null;return dx(t,e,kx(this.component.state.segments,Ax.cylinder))}}t.Cylinder=class extends ly{get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new Fx(this)}get nature(){return Lx}},t.Cylinder=Pm([Mb("cylinder")],t.Cylinder);const Nx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"color",label:"box-color",name:"boxColor",property:"boxColor"}],help:"scene/component/banner"};class Bx extends iu{get zPriority(){return Kd.DECAL}build(){super.build();const{width:t=1,height:e=1,depth:n=1}=this.component.state;this.object3d.add(this.createCube(t,e,n));const i=this.createTextureBoard(t,n);i.position.set(0,0,.5*e+1),this.object3d.add(i)}createCube(t,e,n){const{boxColor:i="#ccaa76"}=this.component.state,s=ud(this.component.state.material3d),r=new M.BoxGeometry(t,n,e),o=new M.MeshStandardMaterial({color:i,side:M.FrontSide});md(o,s);const a=new M.Mesh(r,o);return a.castShadow=s.castShadow,a.receiveShadow=s.receiveShadow,a}createTextureBoard(t,e){const n=ud(this.component.state.material3d),{fillStyle:i="#ccaa76"}=this.component.state,s=iu.buildFillStyleTexture(this.component),r=new M.MeshStandardMaterial(s?{map:s}:{color:i||"#ccaa76",side:M.FrontSide});md(r,n);const o=new M.PlaneGeometry(t,e,1,1),a=new M.Mesh(o,r);return a.castShadow=n.castShadow,a.receiveShadow=n.receiveShadow,a}updateMaterial3d(){super.updateMaterial3d();const t=ud(this.component.state.material3d);this.object3d.traverse(e=>{if(e.isMesh){const n=e.material;n&&md(n,t),e.castShadow=t.castShadow,e.receiveShadow=t.receiveShadow}})}updateFillStyle(){this.update()}onchange(t,e){super.onchange(t,e),"boxColor"in t&&this.update()}}var Hx;t.Banner=class extends(pc(dc)){get hasTextProperty(){return!1}is3dish(){return!0}get nature(){return Nx}buildRealObject(){return new Bx(this)}},t.Banner=Pm([Mb("banner")],t.Banner);const $x={far:1e5,fov:80,near:1,zoom:1},Gx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"near",name:"near"},{type:"number",label:"far",name:"far"},{type:"number",label:"fov",name:"fov"},{type:"number",label:"zoom",name:"zoom"},{type:"checkbox",label:"show-helper",name:"showHelper"}],help:"scene/component/camera"};class Vx extends iu{getObject3dInstance(){return new M.Mesh}updateCamera(){const{near:t=$x.near,far:e=$x.far,fov:n=$x.fov,zoom:i=$x.zoom,showHelper:s}=this.component.state;this.camera.far=e,this.camera.fov=n,this.camera.near=t,this.camera.zoom=i,s?this.helper||(this.helper=new M.CameraHelper(this.camera),this.object3d.add(this.helper)):this.helper&&(this.object3d.remove(this.helper),delete this.helper)}build(){super.build();const{width:t=0,height:e=0,depth:n=0,fillStyle:i="lightgray"}=this.component.state;this.object3d.geometry=new M.BoxGeometry(t,n,e);const s=ud(this.component.state.material3d),r=new M.MeshStandardMaterial({color:i});md(r,s),this.object3d.material=r,this.object3d.castShadow=s.castShadow,this.object3d.receiveShadow=s.receiveShadow,this.camera=new M.PerspectiveCamera,this.camera.position.set(0,0,0),this.object3d.add(this.camera),this.object3d.lookAt(0,0,0),this.updateCamera()}updateMaterial3d(){super.updateMaterial3d();const t=this.object3d.material;if(!t)return;const e=ud(this.component.state.material3d);md(t,e),this.object3d.castShadow=e.castShadow,this.object3d.receiveShadow=e.receiveShadow}}t.Camera=Hx=class extends(pc(dc)){get hasTextProperty(){return!1}is3dish(){return!0}static get image(){return Hx._image||(Hx._image=new Image,Hx._image.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA1IAAANSAQMAAABV6G1EAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAABlBMVEX6+voBAQGV71ZvAAAFO0lEQVR42u3dMZLkNBiGYakUKFRIqKOISxDvETiCTBEQcgQOQE7clyAi8REm7KDXIhgYoMa/7fbIX+2K9w022MCP/25Z28GW5RwRERERERERERERERERERERERERERERERERERERERERERERERHRl9mv7fdPn7879sf8Mcq3J3r5EJXaUy3Wddrcd6qNybx9F2/lZ63H+nVCa9Oe9elZa5ksa/dDbE+3fsm4v27C89bd+i6W3l+XdcnSWtuxyvPW+hqorbWb0Jr7Pl3m4tjfVMIZ625d6L5pxTPWw7rQY9P6pqu1dF8aq5d83cE3rXrGWluIxV6h53eotv4c1V3Ln7Nm66ZvvZf8SSues16sD2jubz2sC839fmvYiz7t//LJna27wsr7VjlnNWtPeHTfNlae2bZvnaTePUd+74fqV2LNxv6zdN8O3z9HSWhlc4F+dOvdsKbe2+F7q+zPddq6W2ts6r31vrN825/rtPWwvvcL5losy11uxQNz5U6fYT4w12mrWf80TUNZdetXal/LtwNW6WOFI1Y9bU3GVnfFXM9bneZKwrmKcK4qnKsK52q6uULTzRWFVjpkta/OykKrCq02puWFVhRaSWjlQa0itJrO8oNaQWgloZWFVhnUqjrLN50VBrWi0MpCqwitOqjVdFYQWlFopUGtLLSq0GpjWl5oRaGVBrWy0KpCq+ksP6gVhFYSWllolUGtqrNW/jvBZVYY1IpCKwutIrTqoFbTWUFoxUGtJLSK0KpCq41peaEVhVYa1MpCqwqtprP8oFYUWklo5UGtIrSazvJCKwxqRaGVhVYZ1Ko664ems34UWj8Nav0stBoWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhbW/9L6RWgp37WofIek8j2cyveLTkqrCq0itLLQSkJL+Q5k5budle/HVr73e/24gAHenZ6FlvK9+srzAoLQUp65oDy3QnoeRxFaWWgpz2pRnncThJbyzCDpuUtVaBWhlYWW8qwx5RlqynPovNBSnuUnPaOwCK0stJLQUp4BqjzbVHk+rFNaVWgVoZWFlvJc6Si0lGdzK88cV57bLj2PvgitLLSS0IpCKwgtL7Sc0qpCqwitLLSS0IpCKwgtL7Sc0qpCqwitLLSS0IpCKwgtL7Sc0qpCqwitLLSS0IpCKwgtL7Sc0qpCqwitLLSS0IpCKwgtL7Sc0qpCqxyyahcrH7JKFysJ54rCuYJwLi+cywnn+vdlLp+rCOfKwrnStXP95zLxiJX7WEFoeaHljO/xEqsaf9/FWqz1bM+VzloP655df2uxrnP9XPHKue7OeMDsuWInyx+Y67T1Yv0gs+cKvay6P5fvZZULrdnYFBbbcr2sdKF1MxbZFdZkLLItq3aay6/vJ102eusD2rJKl633nw/o3n+uxbrpLSv1svL6M95hQ3xYNz33t16sC21Zoc+28Xahm+u+Ic7WhbYs1+dRfrvQ5LpvHOaFNq3SZ8n/faEt6twDtli7wrJpxT6P1183/di0Ti36u3XT903Ld1qGrzf9smmdWhyTddNzf8t8UqdtK/dZGq8P2DZ1ZnHcrQ/osWO5PkvDuby7NE58Yctk7Qq3PSv3+bpc3F0aJ56wF+uLX9xu6eOb4es9z/vWc0vR3oZuByjnf2t/fP/54B/2WvvWEREREREREREREREREREREREREREREREREREREREREREREREREX2J/QlrTpqHD8xO1gAAAABJRU5ErkJggg=="),Hx._image}render(t){const{left:e,top:n,width:i,height:s}=this.bounds;t.beginPath(),this.drawImage(t,Hx.image,e,n,i,s)}buildRealObject(){return new Vx(this)}get nature(){return Gx}},t.Camera=Hx=Pm([Mb("camera")],t.Camera);const Ux={mutable:!1,resizable:!0,rotatable:!0,properties:[...xb],"value-property":"source",help:"scene/component/gltf-object"};t.GLTFObject=class extends(wb(pc(dc))){get nature(){return Ux}},t.GLTFObject=Pm([Mb("gltf-object")],t.GLTFObject);const Yx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"select",label:"light-type",name:"lightType",property:{options:["","point","directional"]}},{type:"number",label:"intensity",name:"intensity"},{type:"number",label:"distance",name:"distance"},{type:"number",label:"decay",name:"decay"},{type:"checkbox",label:"cast-shadow",name:"castShadow"},{type:"number",label:"near",name:"near",placeholder:"0.5"},{type:"number",label:"far",name:"far",placeholder:"1000"},{type:"number",label:"fov",name:"fov",placeholder:"90"},{type:"number",label:"zoom",name:"zoom",placeholder:"1"},{type:"checkbox",label:"show-helper",name:"showHelper"}],help:"scene/component/light"};class Wx extends iu{updatePointLight(){const{lightType:t="point",distance:e=0,intensity:n=10,decay:i=1,fillStyle:s="white",castShadow:r,near:o=.5,far:a=1e3,fov:c=90,zoom:l=1,showHelper:h}=this.component.state;if(this.object3d.color=new M.Color(s),"point"==t&&(this.object3d.distance=e,this.object3d.decay=i),this.object3d.intensity=n,this.object3d.castShadow=r,r){const t=this.object3d.shadow?.camera;t.far=a,t.near=o,t.fov=c,t.zoom=l}if(h){const t=this.object3d.shadow?.camera;this.helper||(this.helper=new M.CameraHelper(t),this.object3d.add(this.helper))}else this.helper&&(this.object3d.remove(this.helper),delete this.helper)}getObject3dInstance(){const{lightType:t="point"}=this.component.state;return"point"==t?new M.PointLight:new M.DirectionalLight}update(){this.clear(),this.build(),this.updateDimension(),this.updateHidden(),this.updatePointLight()}}t.PointLight=class extends ly{get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new Wx(this)}get anchors(){return[]}get nature(){return Yx}},t.PointLight=Pm([Mb("light")],t.PointLight);const qx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"depth",name:"depth",property:"depth"}],help:"scene/component/wall"};class Xx extends Jv{buildGeometry(){this.object3d.geometry=Mx.primitive({kind:"box"})}topOutline(){const{width:t=0,height:e=0}=this.component.state;return t>0&&e>0?hx(t,e):null}}t.Wall=class extends(pc(dc)){get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new Xx(this)}get nature(){return qx}},t.Wall=Pm([Mb("wall")],t.Wall);const Kx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"depth",name:"depth",property:"depth"},{type:"checkbox",label:"hide-in-2d-view",name:"hideIn2DView"},{type:"checkbox",label:"hide-in-3d-view",name:"hideIn3DView"}],help:"scene/component/floor-plate"};class Qx extends iu{get zPriority(){return Kd.FLOOR}get receivingSurfaceY(){return this.placementSurfaceY()}resolveShadow(){const t=this.component.state,e=t.material3d,{alpha:n=1,fillStyle:i}=t,s=n>=.9&&"none"!==i;return{receive:e?.receiveShadow??!0,cast:e?.castShadow??s}}updateHidden(){const t=this.component.state,e=!!this.component.app?.isViewMode;this.object3d.visible=!(t.hidden||e&&t.hideIn3DView)}clear(){return this._topTexture&&(this._topTexture.dispose(),this._topTexture=void 0),this._mesh=void 0,super.clear()}build(){super.build();const{width:t,height:e,depth:n=1}=this.component.state;if(!t||!e)return;const i=Math.abs(t),s=Math.abs(e),r=Math.max(n,.5),o=new M.BoxGeometry(i,r,s),a=this._buildTopMaterial(),c=this._buildSideMaterial(),l=[c,c,a,c,c,c];this._mesh=new M.Mesh(o,l),this._mesh.position.y=0;const{cast:h,receive:d}=this.resolveShadow();this._mesh.castShadow=h,this._mesh.receiveShadow=d,this.object3d.add(this._mesh)}_buildTopMaterial(){const{alpha:t=1,fillStyle:e}=this.component.state,n=ud(this.component.state.material3d),i=iu.buildFillStyleTexture(this.component);if(i){this._topTexture=i;const t=new M.MeshStandardMaterial({map:i,side:M.DoubleSide});return jd(t,0,e),t.depthWrite=t.opacity>=.9,md(t,n),t}const s="string"==typeof e&&"none"!==e?Ld(e):"#e0e0e0",r=new M.MeshStandardMaterial({color:s,side:M.DoubleSide});return jd(r,0,e),r.depthWrite=r.opacity>=.9,md(r,n),r}_buildSideMaterial(){const{strokeStyle:t,alpha:e=1}=this.component.state,n="string"==typeof t&&t?Ld(t):"#999999",i=ud(this.component.state.material3d),s=new M.MeshStandardMaterial({color:n});return md(s,i),s.side=M.DoubleSide,jd(s,0,t),s.depthWrite=s.opacity>=.9,s}updateAlpha(){if(!this._mesh)return;const{alpha:t=1,fillStyle:e,strokeStyle:n}=this.component.state,i=this._mesh.material;for(let t=0;t<i.length;t++){const s=i[t];jd(s,0,2===t?e:n),s.depthWrite=s.opacity>=.9}}updateFillStyle(){if(!this._mesh)return;this._topTexture&&(this._topTexture.dispose(),this._topTexture=void 0);const t=this._mesh.material;t[2].dispose(),t[2]=this._buildTopMaterial()}updateStrokeStyle(){if(!this._mesh)return;const t=this._mesh.material,e=this._buildSideMaterial();for(let n=0;n<t.length;n++)2!==n&&(t[n].dispose(),t[n]=e)}}t.FloorPlate=class extends Rl{get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new Qx(this)}get nature(){return Kx}get hidden(){return!!this.getState("hideIn2DView")||super.hidden}},t.FloorPlate.requires3d=!0,t.FloorPlate=Pm([Mb("floor-plate")],t.FloorPlate);function Zx(t,e={}){const n=e.size??5,i=e.color??4500172,s=e.emissive??2245734,r=new M.SphereGeometry(n,16,12),o=new M.MeshStandardMaterial({color:i,emissive:s,emissiveIntensity:.15,metalness:.3,roughness:.4,transparent:!0,opacity:.35}),a=new M.Mesh(r,o);e.position&&a.position.set(e.position[0],e.position[1],e.position[2]),a.userData.alwaysRaycast=!0,a.scale.setScalar(1),a.visible=e.visible??!(!0===t.app?.isViewMode);const c=()=>{o.emissiveIntensity=.9,o.opacity=.95,a.scale.setScalar(1.35),t.invalidate?.()},l=()=>{o.emissiveIntensity=.15,o.opacity=.35,a.scale.setScalar(1),t.invalidate?.()};return t.on("mouseenter",c),t.on("mouseleave",l),a.userData.dispose=()=>{t.off("mouseenter",c),t.off("mouseleave",l)},a}class Jx extends Jv{get zPriority(){return Kd.DECAL}get syncZPosOffset(){return this.effectiveDepth}get geometricOffsetY(){return this.effectiveDepth}buildGeometry(){const{width:t,height:e}=this.component.state,n=Math.abs(t)||1,i=Math.abs(e)||1,s=new M.PlaneGeometry(n,i);s.rotateX(-Math.PI/2),this.object3d.geometry=s}updateDimension(){this.update()}build(){super.build();const{width:t,height:e}=this.component.state,n=Math.abs(t)||1,i=Math.abs(e)||1,s=Math.max(2,.04*Math.min(n,i));this.object3d.add(Zx(this.component,{size:s,position:[n/2-s,s,-i/2+s]}))}}const tw={mutable:!1,resizable:!0,rotatable:!0,properties:[],help:"scene/component/decal"};let ew=class extends(_b(pc(dc))){buildRealObject(){return new Jx(this)}get nature(){return tw}};ew=Pm([Mb("decal")],ew);class nw extends iu{getObject3dInstance(){return new M.Group}get allowedGizmoModes(){return this.component.isGroup?.()?["translate"]:null}}const iw="#dde2e8",sw="#9c9c9c",rw="#e8e8ec",ow=.35;function aw(t,e,n,i,s){if(!e.visible)return new M.MeshStandardMaterial({transparent:!0,opacity:0,depthWrite:!1});const r=e.alpha*n,o="wall"===i?iw:"floor"===i?sw:rw,a=new M.MeshStandardMaterial({metalness:0,roughness:"wall"===i?.6:.85,transparent:r<1,opacity:r,side:s?M.BackSide:M.DoubleSide});return function(t,e,n,i,s,r){if("string"==typeof n&&n&&"transparent"!==n)t.color.set(n);else{if(n&&"object"==typeof n){const i=!r,o=iu.buildFillStyleTexture(e,n,{mirror:i,rotation:s});if(o)return t.map&&t.map.dispose(),t.map=o,void t.color.set("#ffffff")}t.color.set(i)}}(a,t,e.fillStyle,o,e.rotation,e.mirror),a}class cw extends nw{get zPriority(){return Kd.BACKDROP}get position(){if(this.component.state.fitToBoard){return{x:0,y:super.position.y,z:0}}return super.position}build(){super.build();const t=this.component.state;let e=t.width,n=t.height;if(t.fitToBoard){const t=this.component.rootModel,i=t?.state;i&&Number.isFinite(i.width)&&Number.isFinite(i.height)&&(e=i.width,n=i.height)}const i=this.effectiveDepth||Math.min(e,n)||200,s=t.alpha??1,r=!1!==t.seeThrough,o={east:this._resolveFace("east",iw,!0,ow),west:this._resolveFace("west",iw,!0,ow),north:this._resolveFace("north",iw,!0,ow),south:this._resolveFace("south",iw,!0,ow),floor:this._resolveFace("floor",sw,!0,1),ceiling:this._resolveFace("ceiling",rw,!0,1)},a=[aw(this.component,o.east,s,"wall",r),aw(this.component,o.west,s,"wall",r),aw(this.component,o.ceiling,s,"ceiling",r),aw(this.component,o.floor,s,"floor",r),aw(this.component,o.south,s,"wall",r),aw(this.component,o.north,s,"wall",r)],c=new M.BoxGeometry(e,i,n),l=new M.Mesh(c,a);if(l.receiveShadow=!0,this.object3d.add(l),this.component.app?.isEditMode){const t=new M.LineBasicMaterial({color:4473941,transparent:!0,opacity:.7}),e=new M.LineSegments(new M.EdgesGeometry(c),t);this.object3d.add(e)}const h=Math.max(2,.04*Math.min(e,n,i));this.object3d.add(Zx(this.component,{size:h,position:[e/2,i/2+h,-n/2]}))}_resolveFace(t,e,n,i){const s=this.component.state,r=s.faces?.[t]??{},o=r.visible,a=r.alpha,c=r.rotation,l=90===c||180===c||270===c?c:0;return{fillStyle:r.fillStyle??e,visible:"boolean"==typeof o?o:n,alpha:"number"==typeof a&&Number.isFinite(a)?a:i,rotation:l,mirror:!0===r.mirror}}updateDimension(){}onchange(t,e){["alpha","width","height","depth","fitToBoard","faces","seeThrough"].some(e=>e in t)?this.update():super.onchange(t,e)}updateAlpha(){}}const lw={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"checkbox",label:"fit-to-board",name:"fitToBoard"},{type:"checkbox",label:"see-through",name:"seeThrough"},{type:"backdrop-faces",label:"",name:"faces"}],help:"scene/component/backdrop"};let hw=class extends(_b(pc(dc))){buildRealObject(){return new cw(this)}get nature(){return lw}added(t){super.added?.(t),this.state.fitToBoard&&(this._syncFromRoot(!0),this._attachRootListener())}async ready(){await super.ready(),this.state.fitToBoard&&this._syncFromRoot(!1)}removed(t){this._detachRootListener(),super.removed?.(t)}dispose(){this._detachRootListener(),super.dispose?.()}onchange(t,e){"fitToBoard"in t&&(t.fitToBoard?(this._syncFromRoot(!0),this._attachRootListener()):this._detachRootListener()),super.onchange?.(t,e)}_syncFromRoot(t=!1){const e=this.rootModel;if(!e||e===this)return;const n=e.state;if(!n)return;const i={},s=Number.isFinite(n.width)?n.width:this.state.width,r=Number.isFinite(n.height)?n.height:this.state.height;s!==this.state.width&&(i.width=s),r!==this.state.height&&(i.height=r);const o=Number.isFinite(n.left)?n.left:0,a=Number.isFinite(n.top)?n.top:0;if(o!==this.state.left&&(i.left=o),a!==this.state.top&&(i.top=a),t){const t=this.state.depth;if(!("number"==typeof t&&Number.isFinite(t)&&t>0)){const e=Math.min(s,r);e!==t&&(i.depth=e)}}Object.keys(i).length>0&&this.set(i)}_attachRootListener(){if(this._onRootChange)return;const t=this.rootModel;t&&t!==this&&(this._onRootChange=t=>{("width"in t||"height"in t||"left"in t||"top"in t)&&this._syncFromRoot()},t.on?.("change",this._onRootChange))}_detachRootListener(){if(!this._onRootChange)return;const t=this.rootModel;t?.off?.("change",this._onRootChange),this._onRootChange=void 0}};function dw(t,e){return"none"===t?0:t.endsWith("arrow")?1.5*e:0}function uw(t,e,n,i){const s=[];for(let r=1;r<=i;r++){const o=r/i,a=1-o;s.push(new M.Vector3(a*a*t.x+2*a*o*e.x+o*o*n.x,a*a*t.y+2*a*o*e.y+o*o*n.y,a*a*t.z+2*a*o*e.z+o*o*n.z))}return s}hw=Pm([Mb("backdrop")],hw);class pw extends iu{getObject3dInstance(){return new M.Group}get gizmoTransformable(){return!0}get syncZPosOffset(){return 0}get geometricOffsetY(){return 0}syncFromObject3D(){}applyDimensionFromGizmo(t){}build(){super.build(),this._buildLine()}get smoothedPath(){const t=this.worldPath;if(t.length<2)return t;const{round:e=0}=this.component.state;if(e<=0||t.length<3)return t;const n=[];n.push(t[0]);for(let i=1;i<t.length;i++){const s=t[i-1],r=t[i],o=t[i+1];if(!o){n.push(r);break}const a=s.x-r.x,c=s.y-r.y,l=s.z-r.z,h=Math.sqrt(a*a+c*c+l*l),d=Math.min(e,h/2),u=o.x-r.x,p=o.y-r.y,f=o.z-r.z,m=Math.sqrt(u*u+p*p+f*f),g=Math.min(e,m/2),y=h>0?new M.Vector3(r.x+a/h*d,r.y+c/h*d,r.z+l/h*d):r.clone(),b=m>0?new M.Vector3(r.x+u/m*g,r.y+p/m*g,r.z+f/m*g):r.clone();n.push(y),n.push(...uw(y,r,b,8))}return n}_buildLine(){const t=this.smoothedPath;if(t.length<2)return;const{strokeStyle:e,lineWidth:n=2,alpha:i=1,lineDash:s,begin:r="none",beginSize:o="size5",end:a="none",endSize:c="size5"}=this.component.state,l=Math.max(n,1),p="string"==typeof e&&"transparent"!==e?Ld(e):"#000000",f=new M.Color(p),m=this._getResolution(),g=r,y=a,b=dw(g,l),_=dw(y,l),v=t[0],x=t[t.length-1],w=(new M.Vector3).subVectors(t[1],v).normalize(),S=(new M.Vector3).subVectors(t[t.length-2],x).normalize(),A=[...t];b>0&&(A[0]=v.clone().add(w.clone().multiplyScalar(b))),_>0&&(A[A.length-1]=x.clone().add(S.clone().multiplyScalar(_)));const E=new u.LineGeometry;E.setPositions(A.flatMap(t=>[t.x,t.y,t.z]));const k=function(t,e){switch(t){case"round-dot":return{dashSize:e,gapSize:e};case"square-dot":return{dashSize:2*e,gapSize:e};case"dash":return{dashSize:4*e,gapSize:1.5*e};case"dash-dot":return{dashSize:4*e,gapSize:2*e};case"long-dash":return{dashSize:6*e,gapSize:3*e};case"long-dash-dot":return{dashSize:6*e,gapSize:2*e};case"long-dash-dot-dot":return{dashSize:6*e,gapSize:e};default:return null}}(s,l),C=new d.LineMaterial({color:f.getHex(),linewidth:l,worldUnits:!0,transparent:i<1,opacity:i,resolution:m,dashed:!!k,dashSize:k?.dashSize??1,gapSize:k?.gapSize??1,dashScale:1});if(this._line2=new h.Line2(E,C),this._line2.computeLineDistances(),this.object3d.add(this._line2),"none"!==g){const t=Ep(g,Ap(o,l));if(t){const e=(new M.Quaternion).setFromUnitVectors(new M.Vector3(1,0,0),w.clone().negate());this._placeTip(t,v,e,f,i,m)}}if("none"!==y){const t=Ep(y,Ap(c,l));if(t){const e=(new M.Quaternion).setFromUnitVectors(new M.Vector3(1,0,0),S.clone().negate());this._placeTip(t,x,e,f,i,m)}}}_placeTip(t,e,n,i,s,r){const o=t.mesh||t.line2||t.group;if(o){if(o.position.copy(e),o.setRotationFromQuaternion(n),t.mesh){const e=t.mesh.material;e.color.copy(i),e.transparent=s<1,e.opacity=s}else if(t.line2){const e=t.line2.material;e.color.copy(i),e.transparent=s<1,e.opacity=s,e.resolution.copy(r)}else t.group&&t.group.traverse(t=>{if(t.material){const e=t.material;e.color&&e.color.copy(i),e.transparent=s<1,e.opacity=s,e.resolution&&e.resolution.copy(r)}});this.object3d.add(o)}}_getResolution(){const t=this.threeContainer?.renderer3d;if(t){return t.getSize(new M.Vector2)}return new M.Vector2(window.innerWidth,window.innerHeight)}onGizmoDragEnd(t){const e=this._component,n=e.path;if(!n||n.length<2)return;const i=this.object3d,{width:s=0,height:r=0}=e.parent?.bounds??{},{x:o,y:a}=e.center,c=i.position,l=i.rotation,h=i.scale,d=this.position;if(Math.abs(c.x-d.x)<.001&&Math.abs(c.y-d.y)<.001&&Math.abs(c.z-d.z)<.001&&Math.abs(l.x)<.001&&Math.abs(l.y)<.001&&Math.abs(l.z)<.001&&Math.abs(h.x-1)<.001&&Math.abs(h.y-1)<.001&&Math.abs(h.z-1)<.001)return;const u=pw.computeBakedPath(n,{x:o,y:a},{width:s,height:r},i);this._suppressOnchange=!0,e.set({rotation:0,rotationX:0,rotationY:0,zPos:0}),e.mutatePath(null,()=>u),this._suppressOnchange=!1,this.update()}static computeBakedPath(t,e,n,i){const s=n.width,r=n.height,o=e.x,a=e.y;return i.updateMatrixWorld(!0),t.map(t=>{const e=new M.Vector3(t.x-o,t.z||0,t.y-a).applyMatrix4(i.matrixWorld),n={x:e.x+s/2,y:e.z+r/2};return Math.abs(e.y)>.001&&(n.z=e.y),n})}updateStrokeStyle(){this.updateDimension()}updateAlpha(){this.updateDimension()}updateDimension(){this.clear(),this.build()}onchange(t,e){("path"in t||"from"in t||"to"in t)&&(this.updateDimension(),this.updatePosition()),("round"in t||"lineDash"in t||"lineWidth"in t||"begin"in t||"end"in t||"beginSize"in t||"endSize"in t)&&this.updateDimension(),super.onchange(t,e)}clear(){for(;this.object3d.children.length>0;){const t=this.object3d.children[0];this.object3d.remove(t),Vd(t)}return this._line2=void 0,super.clear()}}class fw extends pw{get worldPath(){const t=this.component.path;if(!t||t.length<2)return[];const{x:e,y:n}=this.component.center,i=this.component,s=i.fromEnd?.component?._realObject?.object3d?.position?.y??0,r=i.toEnd?.component?._realObject?.object3d?.position?.y??0;return t.map((i,o)=>{const a=t.length>1?o/(t.length-1):0;return new M.Vector3(i.x-e,i.z||s+(r-s)*a,i.y-n)})}}zp("line",t=>new fw(t));class mw extends pw{get worldPath(){const t=this.component.path;if(!t||t.length<2)return[];const{x:e,y:n}=this.component.center;return t.map(t=>new M.Vector3(t.x-e,t.z||0,t.y-n))}}zp("polyline",t=>new mw(t));class gw extends pw{get worldPath(){const t=this.component.drawPath;if(!t||t.length<2)return[];const{x:e,y:n}=this.component.center,i=this.component,s=i.fromEnd?.component?._realObject?.object3d?.position?.y??0,r=i.toEnd?.component?._realObject?.object3d?.position?.y??0;return t.map((i,o)=>{const a=t.length>1?o/(t.length-1):0;return new M.Vector3(i.x-e,i.z||s+(r-s)*a,i.y-n)})}}zp("ortholine",t=>new gw(t)),zp("group",t=>new nw(t));class yw{constructor(t){this._count=0,this._placements=[],this._geometry=t.geometry,this._material=t.material,this._capacity=Math.max(1,t.capacity??16),this._name=t.name??"instanced",this._castShadow=t.castShadow??!0,this._receiveShadow=t.receiveShadow??!1,this.object3d=new M.Group,this.object3d.name=this._name,this._mesh=this._makeMesh(this._capacity),this.object3d.add(this._mesh)}_makeMesh(t){const e=new M.InstancedMesh(this._geometry,this._material,t);return e.name=this._name+"__instances",e.castShadow=this._castShadow,e.receiveShadow=this._receiveShadow,e.instanceMatrix.setUsage(M.DynamicDrawUsage),e.count=0,e}get mesh(){return this._mesh}get count(){return this._count}get capacity(){return this._capacity}place(t){const e=t.length;if(e>this._capacity){const t=function(t,e=16){let n=Math.max(e,1);for(;n<t;)n*=2;return n}(e,this._capacity);this.object3d.remove(this._mesh),this._mesh.dispose(),this._capacity=t,this._mesh=this._makeMesh(t),this.object3d.add(this._mesh)}this._placements.length=e;for(let n=0;n<e;n++){const e=t[n];this._placements[n]=e,this._writeMatrix(n,e),void 0!==e.color&&this._writeColor(n,e.color)}this._count=e,this._mesh.count=e,this.commit()}update(t,e){t<0||t>=this._count||(this._placements[t]=e,this._writeMatrix(t,e),void 0!==e.color&&this._writeColor(t,e.color),this.commit())}setRotation(t,e){if(t<0||t>=this._count)return;const n=this._placements[t];n&&(n.rotation=e,this._writeMatrix(t,n))}commitMatrices(){this._mesh.instanceMatrix.needsUpdate=!0}setColor(t,e){t<0||t>=this._count||(this._writeColor(t,e),this._mesh.instanceColor&&(this._mesh.instanceColor.needsUpdate=!0))}indexOf(t){return t>=0&&t<this._count?t:-1}commit(){this._mesh.instanceMatrix.needsUpdate=!0,this._mesh.instanceColor&&(this._mesh.instanceColor.needsUpdate=!0),this._mesh.computeBoundingSphere()}dispose(){this.object3d.remove(this._mesh),this._mesh.dispose(),this._placements.length=0,this._count=0}_writeMatrix(t,e){const n=yw;n._p.set(e.position.x,e.position.y,e.position.z);const i=e.rotation;n._e.set(i?.x??0,i?.y??0,i?.z??0),n._q.setFromEuler(n._e);const s=e.scale;"number"==typeof s?n._s.set(s,s,s):n._s.set(s?.x??1,s?.y??1,s?.z??1),n._m.compose(n._p,n._q,n._s),this._mesh.setMatrixAt(t,n._m)}_writeColor(t,e){yw._c.set(e),this._mesh.setColorAt(t,yw._c)}}function bw(t,e,n){const i=Math.max(1,Math.floor(t.x??1)),s=Math.max(1,Math.floor(t.y??1)),r=Math.max(1,Math.floor(t.z??1)),o=e.x??0,a=e.y??0,c=e.z??0,l=n?.x??0,h=n?.y??0,d=n?.z??0,u=[];for(let t=0;t<s;t++)for(let e=0;e<r;e++)for(let n=0;n<i;n++)u.push({position:{x:l+n*o,y:h+t*a,z:d+e*c}});return u}yw._m=new M.Matrix4,yw._p=new M.Vector3,yw._q=new M.Quaternion,yw._e=new M.Euler,yw._s=new M.Vector3,yw._c=new M.Color;class _w extends iu{build(){super.build()}update(){}}const vw={far:1e5,fov:80,near:1,zoom:1};class xw extends iu{build(){super.build()}update(){super.update(),this.updateCamera()}getObject3dInstance(){return new M.PerspectiveCamera}updateCamera(){const{near:t=vw.near,far:e=vw.far,fov:n=vw.fov,zoom:i=vw.zoom}=this.component.state;this.object3d.far=e,this.object3d.fov=n,this.object3d.near=t,this.object3d.zoom=i}}class ww extends Jv{buildGeometry(){const{width:t,height:e}=this.component.state.dimension;this.object3d.geometry=new M.PlaneGeometry(t,e)}buildMaterial(){this.object3d.material=new M.MeshStandardMaterial({opacity:0,side:M.DoubleSide,blending:M.NoBlending})}}class Mw extends iu{getObject3dInstance(){return new M.Scene}dispose(){for(const t of this.object3d.children)Vd(t);this._animationMixer&&(this._animationMixer.stopAllAction(),this._animationMixer.uncacheRoot(this.object3d),this._animationMixer=void 0),super.dispose()}clear(){return this._floor&&(this.object3d.remove(this._floor),this._floor.material instanceof Array?this._floor.material.forEach(t=>t.dispose()):this._floor.material.dispose(),this._floor.geometry.dispose(),delete this._floor),super.clear()}get floor(){return this._floor}set floor(t){this._floor&&(this.object3d.remove(this._floor),this._floor.clear(),delete this._floor),t&&(this._floor=t,this.object3d.add(t)),this.component.invalidate()}build(){super.build(),this.floor=Qp(this.component)}updateTransform(){}updateDimension(){}updatePosition(){}updateRotate(){}updateScale(){}updateAlpha(){}updateHidden(){}get animationMixer(){return this._animationMixer||(this._animationMixer=new M.AnimationMixer(this.object3d)),this._animationMixer}}const Sw=new Set(["cx","cy","cz","zPos","left","top","width","height","depth","lineWidth","rotationX","rotationY","rotation","scale","hidden","alpha","material3d","screenFixed"]);class Aw extends iu{get syncZPosOffset(){return this.effectiveDepth}get geometricOffsetY(){return this.effectiveDepth}constructor(t){super(t),this._origInvalidate=t.invalidate.bind(t),t.invalidate=()=>{this._origInvalidate(),this._refreshTextureNow()}}getObject3dInstance(){return new M.Mesh}build(){super.build();const{width:t,height:e}=this.component.bounds;if(!t||!e)return;const n=ud(this.component.state.material3d),i=new M.PlaneGeometry(1,1);i.rotateX(-Math.PI/2),this.object3d.geometry=i;const s=Vv(this.component),r=new M.MeshStandardMaterial({map:s});md(r,n),r.transparent=!0,this.object3d.material=r,this.object3d.castShadow=n.castShadow,this.object3d.receiveShadow=n.receiveShadow}updateAlpha(){const{alpha:t=1,fillStyle:e}=this.component.state;jd(this.object3d.material,0,e)}get dimension(){const{width:t,height:e}=this.component.bounds;return{width:t||1,height:e||1,depth:1}}get scale(){const t=super.scale,{width:e,height:n}=this.dimension;return{x:t.x*e,y:t.y,z:t.z*n}}updateDimension(){this.updateTransform()}_debouncedRebuild(){this._debounceTimer&&clearTimeout(this._debounceTimer),this._debounceTimer=setTimeout(()=>{this._debounceTimer=void 0,this.update()},100)}_refreshTextureNow(){const t=this.object3d.material,e=t?.map;if(!e)return;const n=e.source?.data;n&&(Yv(n,this.component,2),e.needsUpdate=!0)}update(){this.clear(),this.build(),this.updateDimension(),this.updateTransform(),this.updateHidden()}onchange(t,e){super.onchange(t,e);for(const e of Object.keys(t))if(!Sw.has(e)){this._debouncedRebuild();break}}updateFillStyle(){this._debouncedRebuild()}updateStrokeStyle(){this._debouncedRebuild()}updateText(){this._debouncedRebuild()}updateMaterial3d(){super.updateMaterial3d();const t=this.object3d.material;if(!t)return;const e=ud(this.component.state.material3d);md(t,e),t.transparent=!0,this.object3d.castShadow=e.castShadow,this.object3d.receiveShadow=e.receiveShadow}clear(){return this._debounceTimer&&(clearTimeout(this._debounceTimer),this._debounceTimer=void 0),Vd(this.object3d),super.clear()}dispose(){this._debounceTimer&&(clearTimeout(this._debounceTimer),this._debounceTimer=void 0),this._origInvalidate&&(this.component.invalidate=this._origInvalidate,this._origInvalidate=void 0),super.dispose()}}const Ew={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"select",label:"precision",name:"precision",property:{options:[{display:"High",value:"highp"},{display:"Medium",value:"mediump"},{display:"Low",value:"lowp"}]}},{type:"checkbox",label:"anti-alias",name:"antialias",property:"antialias"},{type:"checkbox",label:"3dmode",name:"threed",property:"threed"},{type:"checkbox",label:"auto-rotate",name:"autoRotate",property:"autoRotate"},{type:"checkbox",label:"debug",name:"debug",property:"debug"}],help:"scene/component/three-container"};function kw(t){const e=Tw(t);if(!e)return null;const{height:n,hollow:i}=t;if(!(n>0))return null;if(!(i&&i.wall>0))return Cw(e,n,n/2);const s=Math.max(i.floor??i.wall,0),r=n-s;if(!(r>0))return null;const o=Dw(t,i.wall);if(!o)return null;const a=new M.Shape(e.getPoints(Sx[0]));a.holes=[new M.Path(o.slice().reverse())];const c=Cw(a,r,n/2);if(s<=0)return c;const l=Cw(e,s,-n/2+s);return x.mergeGeometries([l,c],!1)??c}function Cw(t,e,n){const i=new M.ExtrudeGeometry(t,{steps:1,depth:e,bevelEnabled:!1});return i.rotateX(Math.PI/2),i.translate(0,n,0),i}function Tw(t){if(t.polygon){const e=t.path;if(!e||e.length<3)return null;const n=new M.Shape;n.moveTo(e[0].x,e[0].y);for(let t=1;t<e.length;t++)n.lineTo(e[t].x,e[t].y);return n.closePath(),n}return Ow(t.width,t.depth,t.round??0)}function Pw(t,e,n,i){if(!(t>0&&e>0))return null;const s=Math.min(Math.max(n,0),t/2),r=Math.min(Math.max(i,0),e/2),o=-t/2,a=-e/2;if(s<=0&&r<=0){const n=new M.Shape;return n.moveTo(o,a),n.lineTo(o+t,a),n.lineTo(o+t,a+e),n.lineTo(o,a+e),n.closePath(),n}const c=new M.Path;return c.moveTo(o+s,a),c.lineTo(o+t-s,a),c.quadraticCurveTo(o+t,a,o+t,a+r),c.lineTo(o+t,a+e-r),c.quadraticCurveTo(o+t,a+e,o+t-s,a+e),c.lineTo(o+s,a+e),c.quadraticCurveTo(o,a+e,o,a+e-r),c.lineTo(o,a+r),c.quadraticCurveTo(o,a,o+s,a),new M.Shape(c.getPoints(Sx[0]))}function Ow(t,e,n){if(!(t>0&&e>0))return null;const i=-t/2,s=-e/2;if(n<=0){const n=new M.Shape;return n.moveTo(i,s),n.lineTo(i+t,s),n.lineTo(i+t,s+e),n.lineTo(i,s+e),n.closePath(),n}const r=Math.min(n,t/2,e/2),o=new M.Path;return o.moveTo(i+r,s),o.lineTo(i+t-r,s),o.quadraticCurveTo(i+t,s,i+t,s+r),o.lineTo(i+t,s+e-r),o.quadraticCurveTo(i+t,s+e,i+t-r,s+e),o.lineTo(i+r,s+e),o.quadraticCurveTo(i,s+e,i,s+e-r),o.lineTo(i,s+r),o.quadraticCurveTo(i,s,i+r,s),new M.Shape(o.getPoints(Sx[0]))}function Dw(t,e){if(!t.polygon){const n=Math.max((t.round??0)-e,0),i=Ow(t.width-2*e,t.depth-2*e,n);return i?i.getPoints(Sx[0]):null}const n=t.path;if(!n||n.length<3)return null;const i=n.map(t=>new M.Vector2(t.x,t.y));let s=0;for(let t=0;t<i.length;t++){const e=i[t],n=i[(t+1)%i.length];s+=e.x*n.y-n.x*e.y}const r=s>=0?1:-1,o=i.map((t,n)=>{const s=i[(n+1)%i.length],o=s.x-t.x,a=s.y-t.y,c=Math.hypot(o,a)||1;return{x:t.x+-a/c*e*r,y:t.y+o/c*e*r,dx:o,dy:a}}),a=[];for(let t=0;t<o.length;t++){const e=o[(t+o.length-1)%o.length],n=o[t],i=e.dx*n.dy-e.dy*n.dx;if(Math.abs(i)<1e-9){a.push(new M.Vector2(n.x,n.y));continue}const s=((n.x-e.x)*n.dy-(n.y-e.y)*n.dx)/i;a.push(new M.Vector2(e.x+e.dx*s,e.y+e.dy*s))}return a}function zw(t){const e=Tw(t);if(!e)return null;const n=[e.getPoints(Sx[0])],i=t.hollow?.wall??0;if(i>0){const e=Dw(t,i);e&&n.push(e.slice().reverse())}return n}t.ThreeContainer=class extends Wg{constructor(){super(...arguments),this._capability=new Sf}get sceneManager(){return this._capability.sceneManager}get cameraManager(){return this._capability.cameraManager}get rendererManager(){return this._capability.rendererManager}get lightManager(){return this._capability.lightManager}get controlsManager(){return this._capability.controlsManager}get eventManager(){return this._capability.eventManager}get hasEnvironment(){return this._capability.hasEnvironment}containable(t){return!0}is3dContainer(){return!0}getLightingConfig(){return{hemisphere:{skyColor:16777215,groundColor:14540253,intensity:1},directional:{color:16777215,intensity:1.2,attachToCamera:!0,castShadow:!1}}}getCss3DSceneAttribute(){return"three-container:css3d-renderer"}init_scene3d(){this._capability.isInitialized&&this._capability.destroy(),this._capability.init(this,{lightingConfig:this.getLightingConfig(),css3DSceneAttribute:this.getCss3DSceneAttribute(),skipEnvironment:!0,skipPostprocessing:!0,skipShadowMap:!0}),this._capability.buildOverlays(),this._capability.resize(),this.onchangeData&&this.onchangeData(this.data,this.data)}destroy_scene3d(){this.stop(),this._capability.destroy()}stop(){}resize(){this._capability.resize()}get scene3d(){return this._capability.isInitialized||this.init_scene3d(),this._capability.scene3d}get renderer3d(){return this._capability.renderer3d}get mixer(){return this._capability.mixer}get css3DScene(){return this._capability.css3DScene}get css3DRenderer(){return this._capability.css3DRenderer}render_threed(){this._capability.renderThreeD()}get _parentIs3dMode(){return!!this.rootModel?.is3dMode}render(t){this._parentIs3dMode||(this.app.isViewMode&&this.setState("threed",!0),!this.state.threed||this._capability.noSupportWebgl?super.render(t):this._capability.camera&&this._capability.renderCSS3D())}postrender(t){if(this._parentIs3dMode)return;const{left:e,top:n,debug:i,threed:s}=this.state;let{width:r,height:o}=this.bounds;if(r=Math.floor(r),o=Math.floor(o),s){if(this._capability.isInitialized||this.init_scene3d(),this._capability.noSupportWebgl)return void this._capability.showWebglNoSupportText(t,this.state.width,this.state.height);if(!this._capability.renderer3d)return;this._capability.renderThreeD();const s=this._capability.domElement;if(!s||!s.width||!s.height)return;t.drawImage(s,0,0,s.width,s.height,e,n,r,o),i&&this._capability.showDebugFPS(t)}else super.postrender(t)}dispose(){this._capability.dispose(),super.dispose()}get layout(){return _c.get("three")}get nature(){return Ew}getObjectByRaycast(){return this._capability.getObjectByRaycast()}getObjectsByRaycast(){return this._capability.getObjectsByRaycast()}onchange(t,e){(t.hasOwnProperty("width")||t.hasOwnProperty("height"))&&this._capability.destroy(),this._capability.onchange(t)}onmousedown(t){this._capability.onMouseDown(t)}onmouseup(t){this._capability.onMouseUp(t)}onmousemove(t){this._capability.onMouseMove(t)}onmouseleave(t){this._capability.onMouseLeave(t)}onwheel(t){this._capability.onWheel(t)&&this.invalidate()}ondblclick(t){this._capability.onDblClick(t)&&this.invalidate()}ondragstart(t){this._capability.onDragStart(t)}ondragmove(t){this._capability.onDragMove(t)&&this.invalidate()}ondragend(t){this._capability.onDragEnd(t)&&this.invalidate()}ontouchstart(t){this._capability.onTouchStart(t)}onpan(t){this._capability.onPan(t)&&this.invalidate()}ontouchend(t){this._capability.onTouchEnd(t)}onkeydown(t){this._capability.onKeyDown(t)}onpinch(t){this._capability.onPinch(t)&&this.invalidate()}ondoubletap(){this._capability.onDoubleTap(),this.invalidate()}},t.ThreeContainer=Pm([Mb("3d-container")],t.ThreeContainer),Ip(t=>new qv(t));const Iw=["Capacity","Holdable","Transferable","FlowNode"],Rw=Object.freeze({Transferable:["Capacity","FlowNode"]}),jw=["floor","ceiling","center"],Lw=["revolute","prismatic","continuous"],Fw=["slot","port-in","port-out"];class Nw extends Error{code;path;constructor(t,e,n){super(`${t}: ${e}: ${n}`),this.name="V3ContractError",this.code=t,this.path=e}}const Bw=(t,e,n)=>{throw new Nw(t,e,n)},Hw={mm:[[1,0,0],1],cm:[[1,0,0],10],m:[[1,0,0],1e3],rad:[[0,1,0],1],deg:[[0,1,0],Math.PI/180],s:[[0,0,1],1],ratio:[[0,0,0],1],percent:[[0,0,0],.01]},$w=[1,0,0],Gw=[0,0,0],Vw=[0,1,0],Uw={kind:"count"},Yw={kind:"flag"};Hw.count=[Uw,1];const Ww=(t,e)=>Array.isArray(t)&&Array.isArray(e)?t.length===e.length&&t.every((t,n)=>t===e[n]):JSON.stringify(t)===JSON.stringify(e);function qw(t,e,n,i){t&&"object"==typeof t&&!Array.isArray(t)||Bw("SCHEMA",i,"object required");for(const n of e)Object.hasOwn(t,n)||Bw("SCHEMA",i,`missing ${n}`);for(const s of Object.keys(t))[...e,...n].includes(s)||Bw("SCHEMA",i,`unknown ${s}`)}function Xw(t,e){return"string"==typeof t&&/^[a-zA-Z][a-zA-Z0-9_.-]*$/.test(t)||Bw("ID",e,"invalid id"),t}function Kw(t,e){return"number"==typeof t&&Number.isFinite(t)||Bw("NON_FINITE",e,String(t)),t}function Qw(t,e){return Object.hasOwn(Hw,t)||Bw("UNIT",e,String(t)),Hw[t]}function Zw(t,e,n){(t.length!==e.length||t.some((t,n)=>!Ww(t,e[n])))&&Bw("TYPE",n,`expected ${JSON.stringify(e)}, got ${JSON.stringify(t)}`)}const Jw={"add@1":{ports:["value"],types:(t,e)=>(2===t.length&&t.every(Array.isArray)&&Ww(t[0],t[1])||Bw("TYPE",e,"addition needs same scalar dimensions"),[t[0]]),run:([t,e])=>[t+e]},"mul@1":{ports:["value"],types:(t,e)=>(2===t.length&&t.every(Array.isArray)||Bw("TYPE",e,"two scalar arguments"),[t[0].map((e,n)=>e+t[1][n])]),run:([t,e])=>[t*e]},"div@1":{ports:["value"],types:(t,e)=>(2===t.length&&t.every(Array.isArray)||Bw("TYPE",e,"two scalar arguments"),[t[0].map((e,n)=>e-t[1][n])]),run:([t,e],n)=>(0===e&&Bw("DOMAIN",n,"zero denominator"),[t/e])},"sin@1":{ports:["value"],types:(t,e)=>(Zw(t,[Vw],e),[Gw]),run:([t])=>[Math.sin(t)]},"geomean@1":{ports:["value"],types:(t,e)=>((t.length<2||t.length>3||!t.every(Array.isArray)||!t.every(e=>Ww(e,t[0])))&&Bw("TYPE",e,"geometric mean needs two or three scalars of the same dimension"),[t[0]]),run:(t,e)=>(t.some(t=>t<0)&&Bw("DOMAIN",e,"geometric mean of a negative value"),[Math.pow(t.reduce((t,e)=>t*e,1),1/t.length)])},"curve@1":{ports:["value"],types(t,e){(t.length<5||t.length%2==0||!t.every(Array.isArray))&&Bw("TYPE",e,"x and at least two (at, value) key pairs, all scalars");for(let n=1;n<t.length;n+=2)Ww(t[n],t[0])||Bw("TYPE",e,`key ${(n-1)/2}: at must have the dimension of x`),Ww(t[n+1],t[2])||Bw("TYPE",e,`key ${(n-1)/2}: every value must have one dimension`);return[t[2]]},run:(t,e)=>{const n=t[0],i=(t.length-1)/2,s=e=>t[1+2*e],r=e=>t[2+2*e];for(let t=1;t<i;t++)s(t)>s(t-1)||Bw("DOMAIN",e,`keys out of order: at[${t}] = ${s(t)} is not after at[${t-1}] = ${s(t-1)}`);if(n<=s(0))return[r(0)];if(n>=s(i-1))return[r(i-1)];let o=0;for(;o<i-2&&s(o+1)<=n;)o++;const a=(n-s(o))/(s(o+1)-s(o));return[r(o)+(r(o+1)-r(o))*a]}},"at-least@1":{ports:["value"],types:(t,e)=>(2===t.length&&t.every(Array.isArray)&&Ww(t[0],t[1])||Bw("TYPE",e,"at-least compares two scalars of the same dimension"),[Yw]),run:([t,e])=>[t>=e]},"max@1":{ports:["value"],types:(t,e)=>((t.length<2||!t.every(Array.isArray)||!t.every(e=>Ww(e,t[0])))&&Bw("TYPE",e,"two or more scalars of the same dimension"),[t[0]]),run:t=>[Math.max(...t)]},"min@1":{ports:["value"],types:(t,e)=>((t.length<2||!t.every(Array.isArray)||!t.every(e=>Ww(e,t[0])))&&Bw("TYPE",e,"two or more scalars of the same dimension"),[t[0]]),run:t=>[Math.min(...t)]},"between@1":{ports:["length","center"],types:(t,e)=>(Zw(t,[$w,$w,$w,$w],e),[$w,$w]),run:([t,e,n,i],s)=>{(n<0||i<0)&&Bw("DOMAIN",s,"negative margin");const r=e-t-n-i;return r>0||Bw("NO_SPACE",s,`available=${e-t}; margins=${n+i}; deficit=${Math.max(0,-r)}; positive length required`),[r,(t+e+n-i)/2]}},"box@1":{ports:["xMin","xMax","yMin","yMax","zMin","zMax"],types:(t,e)=>(Zw(t,[$w,$w,$w],e),Array(6).fill($w)),run:([t,e,n],i)=>([t,e,n].some(t=>!(t>0))&&Bw("GEOMETRY_DOMAIN",i,"positive width,height,depth required"),[-t/2,t/2,-e/2,e/2,-n/2,n/2]),geometry:([t,e,n])=>({provider:"box@1",dimensions:{width:t,height:e,depth:n}})},"cylinder@1":{ports:["start","end","radialMin","radialMax"],types:(t,e)=>(Zw(t,[$w,$w],e),Array(4).fill($w)),run:([t,e],n)=>(t>0&&e>0||Bw("GEOMETRY_DOMAIN",n,"positive radius,length required"),[-e/2,e/2,-t,t]),geometry:([t,e])=>({provider:"cylinder@1",axis:"Y",dimensions:{radius:t,length:e}})}},tM=(t,e)=>({kind:"transform",from:t,to:e}),eM=()=>[[1,0,0],[0,1,0],[0,0,1]],nM=t=>t[0].map((e,n)=>t.map(t=>t[n])),iM=(t,e)=>t.reduce((t,n,i)=>t+n*e[i],0),sM=(t,e)=>t.map(t=>iM(t,e)),rM=(t,e)=>t.map(t=>nM(e).map(e=>iM(t,e))),oM=(t,e)=>t.map((t,n)=>t+e[n]),aM=(t,e)=>({r:rM(t.r,e.r),t:oM(sM(t.r,e.t),t.t)}),cM=t=>{const e=nM(t.r);return{r:e,t:sM(e,t.t.map(t=>-t))}};function lM(t,e){qw(t.params,e,[],t.id);for(const n of e)Xw(t.params[n],t.id)}function hM(t,e,n){(t.length!==n||t.some(t=>"transform"!==t.kind))&&Bw("TYPE",e,"rigid transforms required")}Object.assign(Jw,{"rounded-box@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,Array(4).fill($w),e),[{kind:"shape",provider:"roundedBox",frame:n.params.frame}]),run:([t,e,n,i],s)=>(t>0&&e>0&&n>0&&i>=0&&i<=Math.min(t,n)/2||Bw("GEOMETRY_DOMAIN",s,"positive dimensions and valid XZ corner radius required"),[{provider:"roundedBox",dimensions:{width:t,height:e,depth:n,round:i}}])},"fit-pitch@1":{ports:["layout"],types:(t,e)=>(Zw(t,[$w,$w,$w,$w,$w,Gw,Uw],e),[{kind:"layout"}]),run:([t,e,n,i,s,r,o],a)=>{t>=0&&e>=0&&n>=0&&i>0&&s>0&&r>=0&&r<=1&&Number.isSafeInteger(o)&&o>=0&&o<=1e4||Bw("LAYOUT_DOMAIN",a,"invalid length, margins, extent, pitch, alignment or limit");const c=t-e-n,l=c<i?0:1+Math.floor((c-i)/s);l>o&&Bw("RESOURCE_LIMIT",a,`count=${l}, limit=${o}`);const h=l?c-i-(l-1)*s:0;return[{centers:Array.from({length:l},(t,n)=>e+i/2+r*h+n*s),count:l}]}},"fixed-count@1":{ports:["layout"],types:(t,e)=>(Zw(t,[Uw,$w,$w,$w,$w,Gw,Uw],e),[{kind:"layout"}]),run:([t,e,n,i,s,r,o],a)=>{if(Number.isSafeInteger(t)&&t>=0&&Number.isSafeInteger(o)&&o>=0&&o<=1e4&&e>=0&&n>=0&&i>=0&&s>0&&r>=0&&r<=1||Bw("LAYOUT_DOMAIN",a,"invalid fixed count layout"),t>o&&Bw("RESOURCE_LIMIT",a,"fixed count exceeds limit"),!t)return[{centers:[],count:0}];const c=e-n-i-s;return(c<0||t>1&&c/(t-1)<s)&&Bw("NO_SPACE",a,"fixed count non-overlapping items do not fit"),[{centers:1===t?[n+s/2+r*c]:Array.from({length:t},(e,i)=>n+s/2+i*c/(t-1)),count:t}]}},"assembly@1":{ports:["assembly"],types:(t,e)=>(t.length&&!t.some(e=>"placed"!==e.kind||e.frame!==t[0].frame)||Bw("FRAME_TYPE",e,"assembly members need one common frame"),[{kind:"assembly",frame:t[0].frame}]),run:(t,e,n)=>[{members:t.map((t,e)=>({key:n.args[e],...t}))}]},"repeat@1":{ports:["collection"],params:["axis"],types:(t,e,n)=>(["x","y","z"].includes(n.params.axis)||Bw("AXIS",e,n.params.axis),3===t.length&&"layout"===t[0].kind&&"assembly"===t[1].kind&&"transform"===t[2].kind&&t[2].from===t[1].frame||Bw("FRAME_TYPE",e,"layout, assembly and compatible placement required"),[{kind:"collection",frame:t[2].to}]),run:([t,e,n],i,s)=>{t.count*e.members.length>1e4&&Bw("RESOURCE_LIMIT",i,"expanded geometry count > 10000");const r=["x","y","z"].indexOf(s.params.axis),o=[];for(let i=0;i<t.count;i++)for(const a of e.members){const e=[0,0,0];e[r]=t.centers[i],o.push({id:JSON.stringify([s.id,i,a.key]),key:a.key,index:i,shape:a.shape,pose:aM(aM(n,{r:eM(),t:e}),a.pose)})}return[{items:o}]},geometry:(t,e)=>e[0].items},"select-item@1":{ports:["placed"],params:["member"],types:(t,e)=>(2===t.length&&"collection"===t[0].kind&&Ww(t[1],Uw)||Bw("TYPE",e,"collection and count index required"),[{kind:"placed",frame:t[0].frame}]),run:([t,e],n,i)=>{const s=t.items.find(t=>t.index===e&&t.key===i.params.member);return s||Bw("TARGET_ABSENT",n,`${i.params.member}[${e}]`),[{shape:s.shape,pose:s.pose}]}},"portal-profile@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,Array(8).fill($w),e),[{kind:"shape",provider:"portal",frame:n.params.frame}]),run:([t,e,n,i,s,r,o,a],c)=>{t<s&&s<r&&r<e&&n<o&&o<i&&a>0||Bw("GEOMETRY_DOMAIN",c,"ordered outer/opening boundaries and positive depth required");return[{provider:"portal",dimensions:{left:t,right:e,bottom:n,top:i,openingLeft:s,openingRight:r,openingTop:o,depth:a},profile:[[t,n],[s,n],[s,o],[r,o],[r,n],[e,n],[e,i],[t,i]].map(([t,e],n)=>({id:["outerLeftBottom","innerLeftBottom","innerLeftTop","innerRightTop","innerRightBottom","outerRightBottom","outerRightTop","outerLeftTop"][n],x:t,y:e}))}]}},"rigid@1":{ports:["pose"],params:["from","to"],types:(t,e,n)=>(Zw(t,[$w,$w,$w,Vw,Vw,Vw],e),[tM(n.params.from,n.params.to)]),run:([t,e,n,i,s,r])=>{const o=Math.cos(i),a=Math.sin(i),c=Math.cos(s),l=Math.sin(s),h=Math.cos(r),d=Math.sin(r);return[{r:rM(rM([[1,0,0],[0,o,-a],[0,a,o]],[[c,0,l],[0,1,0],[-l,0,c]]),[[h,-d,0],[d,h,0],[0,0,1]]),t:[t,e,n]}]}},"axis-turn@1":{ports:["pose"],params:["from","to"],types:(t,e,n)=>(Zw(t,[Gw,Gw,Gw,Vw],e),[tM(n.params.from,n.params.to)]),run:([t,e,n,i],s)=>{const r=Math.hypot(t,e,n);Math.abs(r-1)>1e-6&&Bw("AXIS",s,"unit axis required");const o=t/r,a=e/r,c=n/r,l=Math.cos(i),h=Math.sin(i),d=1-l;return[{r:[[l+o*o*d,o*a*d-c*h,o*c*d+a*h],[a*o*d+c*h,l+a*a*d,a*c*d-o*h],[c*o*d-a*h,c*a*d+o*h,l+c*c*d]],t:[0,0,0]}]}},"axis-slide@1":{ports:["pose"],params:["from","to"],types:(t,e,n)=>(Zw(t,[Gw,Gw,Gw,$w],e),[tM(n.params.from,n.params.to)]),run:([t,e,n,i],s)=>{const r=Math.hypot(t,e,n);return Math.abs(r-1)>1e-6&&Bw("AXIS",s,"unit axis required"),[{r:[[1,0,0],[0,1,0],[0,0,1]],t:[t/r*i,e/r*i,n/r*i]}]}},"compose@1":{ports:["pose"],types:(t,e)=>(hM(t,e,2),t[1].to!==t[0].from&&Bw("FRAME_TYPE",e,"composition intermediate frame mismatch"),[tM(t[1].from,t[0].to)]),run:([t,e])=>[aM(t,e)]},"attach@1":{ports:["pose"],types(t,e){hM(t,e,3);const[n,i,s]=t;return n.from===i.to&&i.from===s.from||Bw("FRAME_TYPE",e,"A O inverse(B) frame mismatch"),[tM(s.to,n.to)]},run:([t,e,n])=>[aM(aM(t,e),cM(n))]},"point@1":{ports:["point"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w,$w],e),[{kind:"point",frame:n.params.frame}]),run:t=>[t]},"map-point@1":{ports:["point"],types:(t,e)=>(2===t.length&&"transform"===t[0].kind&&"point"===t[1].kind&&t[0].from===t[1].frame||Bw("FRAME_TYPE",e,"point frame must match transform source"),[{kind:"point",frame:t[0].to}]),run:([t,e])=>[oM(sM(t.r,e),t.t)]},"distance@1":{ports:["length"],types:(t,e)=>(2===t.length&&"point"===t[0].kind&&Ww(t[0],t[1])||Bw("FRAME_TYPE",e,"distance requires points in same frame"),[$w]),run:([t,e])=>[Math.hypot(...t.map((t,n)=>t-e[n]))]},"box-shape@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w,$w],e),[{kind:"shape",provider:"box",frame:n.params.frame}]),run:([t,e,n],i)=>([t,e,n].some(t=>!(t>0))&&Bw("GEOMETRY_DOMAIN",i,"positive box dimensions"),[{provider:"box",dimensions:{width:t,height:e,depth:n}}])},"cylinder-shape@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w],e),[{kind:"shape",provider:"cylinder",frame:n.params.frame}]),run:([t,e],n)=>(t>0&&e>0||Bw("GEOMETRY_DOMAIN",n,"positive cylinder dimensions"),[{provider:"cylinder",dimensions:{radius:t,length:e}}])},"sphere-shape@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w,$w],e),[{kind:"shape",provider:"sphere",frame:n.params.frame}]),run:([t,e,n],i)=>([t,e,n].some(t=>!(t>0))&&Bw("GEOMETRY_DOMAIN",i,"positive sphere radii required"),[{provider:"sphere",dimensions:{radiusX:t,radiusY:e,radiusZ:n}}])},"frustum-shape@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w,$w],e),[{kind:"shape",provider:"frustum",frame:n.params.frame}]),run:([t,e,n],i)=>(n>0&&t>=0&&e>=0&&t+e>0||Bw("GEOMETRY_DOMAIN",i,"positive height and non-negative radii, not both zero, required"),[{provider:"frustum",dimensions:{radiusTop:t,radiusBottom:e,height:n}}])},"cylinder-shape@2":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w,$w],e),[{kind:"shape",provider:"ellipticCylinder",frame:n.params.frame}]),run:([t,e,n],i)=>(t>0&&e>0&&n>0||Bw("GEOMETRY_DOMAIN",i,"positive radii and length required"),[{provider:"ellipticCylinder",dimensions:{radiusX:t,radiusZ:e,length:n}}])},"rounded-box@2":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,Array(5).fill($w),e),[{kind:"shape",provider:"roundedBoxXZ",frame:n.params.frame}]),run:([t,e,n,i,s],r)=>(t>0&&e>0&&n>0&&i>=0&&s>=0&&i<=t/2&&s<=n/2||Bw("GEOMETRY_DOMAIN",r,"positive dimensions and corner semi-axes within half the section required"),[{provider:"roundedBoxXZ",dimensions:{width:t,height:e,depth:n,roundX:i,roundZ:s}}])},"hollow-box@2":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,Array(8).fill($w),e),[{kind:"shape",provider:"hollowBoxXZ",frame:n.params.frame}]),run:([t,e,n,i,s,r,o,a],c)=>(t>0&&e>0&&n>0&&i>=0&&s>=0&&i<=t/2&&s<=n/2||Bw("GEOMETRY_DOMAIN",c,"positive dimensions and corner semi-axes within half the section required"),r>0&&o>0&&r<t/2&&o<n/2&&a>=0&&a<e||Bw("GEOMETRY_DOMAIN",c,"walls thinner than half the section and a floor thinner than the height required"),[{provider:"hollowBoxXZ",dimensions:{width:t,height:e,depth:n,roundX:i,roundZ:s,wallX:r,wallZ:o,floor:a}}])},"polygon-shape@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>((t.length<7||t.length%2==0||!t.every(t=>Ww(t,$w)))&&Bw("TYPE",e,"height then at least three (x, z) length pairs required"),[{kind:"shape",provider:"polygon",frame:n.params.frame}]),run:([t,...e],n)=>{t>0||Bw("GEOMETRY_DOMAIN",n,"positive height required");const i=[];for(let t=0;t<e.length;t+=2)i.push({id:"p"+t/2,x:e[t],y:e[t+1]});const s=i.map(t=>t.x),r=i.map(t=>t.y),o=Math.max(...s)-Math.min(...s),a=Math.max(...r)-Math.min(...r);return o>0&&a>0||Bw("GEOMETRY_DOMAIN",n,"section must span both axes"),[{provider:"polygon",dimensions:{height:t,width:o,depth:a},profile:i}]}},"hollow-box@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,Array(7).fill($w),e),[{kind:"shape",provider:"hollowBox",frame:n.params.frame}]),run:([t,e,n,i,s,r,o],a)=>(t>0&&e>0&&n>0&&i>=0&&i<=Math.min(t,n)/2||Bw("GEOMETRY_DOMAIN",a,"positive dimensions and valid XZ corner radius required"),s>0&&r>0&&s<t/2&&r<n/2&&o>=0&&o<e||Bw("GEOMETRY_DOMAIN",a,"walls thinner than half the section and a floor thinner than the height required"),[{provider:"hollowBox",dimensions:{width:t,height:e,depth:n,round:i,wallX:s,wallZ:r,floor:o}}])},"feature@1":{ports:["pose"],params:["frame","name"],types(t,e,n){1===t.length&&"shape"===t[0].kind||Bw("TYPE",e,"shape required");return("portal"===t[0].provider?["top","bottomLeft","bottomRight","openingTop","frontTop"]:["box","roundedBox","roundedBoxXZ","sphere","hollowBox","hollowBoxXZ"].includes(t[0].provider)?["left","right","bottom","top","back","front"]:"polygon"===t[0].provider?["bottom","top"]:"frustum"===t[0].provider||"ellipticCylinder"===t[0].provider?["start","end"]:["start","end","radialBottom"]).includes(n.params.name)||Bw("UNKNOWN_FEATURE",e,n.params.name),[tM(n.params.frame,t[0].frame)]},run:([t],e,n)=>{const i=t.dimensions;return[{r:[[1,0,0],[0,1,0],[0,0,1]],t:("portal"===t.provider?{top:[(i.left+i.right)/2,i.top,0],bottomLeft:[(i.left+i.openingLeft)/2,i.bottom,0],bottomRight:[(i.right+i.openingRight)/2,i.bottom,0],openingTop:[(i.openingLeft+i.openingRight)/2,i.openingTop,0],frontTop:[(i.left+i.right)/2,i.top,i.depth/2]}:"sphere"===t.provider?{left:[-i.radiusX,0,0],right:[i.radiusX,0,0],bottom:[0,-i.radiusY,0],top:[0,i.radiusY,0],back:[0,0,-i.radiusZ],front:[0,0,i.radiusZ]}:"polygon"===t.provider?{bottom:[0,-i.height/2,0],top:[0,i.height/2,0]}:"frustum"===t.provider||"ellipticCylinder"===t.provider?{start:[0,-(i.height??i.length)/2,0],end:[0,(i.height??i.length)/2,0]}:["box","roundedBox","roundedBoxXZ","hollowBox","hollowBoxXZ"].includes(t.provider)?{left:[-i.width/2,0,0],right:[i.width/2,0,0],bottom:[0,-i.height/2,0],top:[0,i.height/2,0],back:[0,0,-i.depth/2],front:[0,0,i.depth/2]}:{start:[0,-i.length/2,0],end:[0,i.length/2,0],radialBottom:[0,0,-i.radius]})[n.params.name]}]}},"place@1":{ports:["placed"],types:(t,e)=>(2===t.length&&"shape"===t[0].kind&&"transform"===t[1].kind&&t[0].frame===t[1].from||Bw("FRAME_TYPE",e,"shape local frame mismatch"),[{kind:"placed",frame:t[1].to}]),run:([t,e])=>[{shape:t,pose:e}],geometry:([t,e])=>({shape:t,pose:e})}}),Jw["member@1"]={...Jw["place@1"],geometry:void 0};for(const[t,e]of Object.entries(Jw))e.state="fit-pitch@1"===t||"fixed-count@1"===t?"refuses":"follows";function dM(t,e,n){if(Array.isArray(e))return Kw(t,n);if("flag"===e.kind)return"boolean"!=typeof t&&Bw("FLAG",n,"boolean required"),t;if("count"===e.kind)return(!Number.isSafeInteger(t)||t<0)&&Bw("COUNT",n,"nonnegative safe integer required"),t;const i=t=>{"number"==typeof t?Kw(t,n):Array.isArray(t)?t.forEach(i):t&&"object"==typeof t&&Object.values(t).forEach(i)};return i(t),t}function uM(t){return function(t){qw(t,["version","inputs","constants","nodes"],[],"model"),["r3-scalar-1","r3-spatial-1"].includes(t.version)||Bw("VERSION","model",t.version);for(const e of["inputs","constants","nodes"])Array.isArray(t[e])||Bw("SCHEMA",e,"array required");const e=structuredClone(t),n=new Map,i=new Map,s=new Map,r=new Map,o=[],a=[],c=(t,e)=>{Xw(t,e),n.has(t)&&Bw("DUPLICATE_WRITER",t,`${n.get(t)} and ${e}`),n.set(t,e)};for(const t of e.inputs)qw(t,["id","unit","min","max"],["role"],"input"),c(t.id,"input"),i.set(t.id,Qw(t.unit,t.id)[0]),t.role&&!["design","state"].includes(t.role)&&Bw("SCHEMA",t.id,"unknown input role"),"state"===t.role&&s.set(t.id,new Set([t.id])),Kw(t.min,t.id)>Kw(t.max,t.id)&&Bw("RANGE",t.id,"min > max"),"count"===t.unit&&(dM(t.min,Uw,t.id),dM(t.max,Uw,t.id));for(const t of e.constants)qw(t,["id","unit","value"],[],"constant"),c(t.id,"constant"),i.set(t.id,Qw(t.unit,t.id)[0]),dM(t.value,i.get(t.id),t.id);for(const t of e.nodes){qw(t,["id","op","args","outputs"],["params"],"node"),Xw(t.id,"node"),r.has(t.id)&&Bw("DUPLICATE_NODE",t.id,"node id"),Object.hasOwn(Jw,t.op)||Bw("OPERATOR",t.id,t.op),Jw[t.op].params?lM(t,Jw[t.op].params):Object.hasOwn(t,"params")&&Bw("SCHEMA",t.id,"unexpected params"),Array.isArray(t.args)||Bw("SCHEMA",t.id,"args array required"),t.args.forEach(e=>Xw(e,t.id)),qw(t.outputs,Jw[t.op].ports,[],t.id);for(const e of Object.values(t.outputs))c(e,t.id);r.set(t.id,t)}const l=new Set;function h(t){if(l.has(t))return;a.includes(t)&&Bw("CYCLE",t,[...a,t].join(" -> ")),a.push(t);const e=r.get(t),c=Jw[e.op],d=e.args.map(t=>(n.has(t)||Bw("UNKNOWN_REFERENCE",e.id,t),i.has(t)||h(n.get(t)),i.get(t))),u=c.types(d,e.id,e),p=new Set;for(const t of e.args)for(const e of s.get(t)??[])p.add(e);p.size&&(void 0===c.state&&Bw("STATE_POLICY",e.id,`${e.op} declares no policy for a state-dependent argument (${[...p].join(", ")})`),"refuses"===c.state&&Bw("TOPOLOGY_STATE",e.id,`${e.op} must depend on design inputs only; it depends on ${[...p].join(", ")}`)),c.ports.forEach((t,n)=>i.set(e.outputs[t],u[n])),p.size&&Object.values(e.outputs).forEach(t=>s.set(t,new Set(p))),a.pop(),l.add(t),o.push(e)}for(const t of r.keys())h(t);return{outputTypes:Object.fromEntries([...i].map(([t,e])=>[t,structuredClone(e)])),dependence:Object.fromEntries([...s].map(([t,e])=>[t,[...e].sort()])),order:o.map(t=>t.id),evaluate(t){qw(t,e.inputs.map(t=>t.id),[],"input values");const n=new Map,s=[];for(const s of e.inputs){const e=Kw(t[s.id],s.id);(e<s.min||e>s.max)&&Bw("INPUT_RANGE",s.id,`${e} outside [${s.min},${s.max}]`),n.set(s.id,dM(e*Qw(s.unit,s.id)[1],i.get(s.id),s.id))}for(const t of e.constants)n.set(t.id,Kw(t.value*Qw(t.unit,t.id)[1],t.id));for(const t of o){const e=Jw[t.op],r=t.args.map(t=>n.get(t)),o=e.run(r,t.id,t);if(e.ports.forEach((e,s)=>n.set(t.outputs[e],dM(o[s],i.get(t.outputs[e]),t.id))),e.geometry){const n=e.geometry(r,o);Array.isArray(n)?s.push(...n):s.push({id:t.id,...n})}}return{values:Object.fromEntries(n),geometry:s}}}}(t)}Object.freeze(Object.fromEntries(Object.entries(Jw).map(([t,e])=>[t,e.state]))),Object.freeze(Object.keys(Jw));const pM=(t,e,n)=>{throw new Nw(t,e,n)},fM={left:[-1,0,0],right:[1,0,0],bottom:[0,-1,0],top:[0,1,0],back:[0,0,-1],front:[0,0,1],start:[0,-1,0],end:[0,1,0]};function mM(t,e,n){const{types:i,writers:s,model:r,assetFrame:o}=t;e&&"object"==typeof e&&!Array.isArray(e)||pM("SCHEMA",n,"object required");for(const t of["placement","feature"])Object.hasOwn(e,t)||pM("SCHEMA",n,`missing ${t}`);for(const t of Object.keys(e))["placement","feature"].includes(t)||pM("SCHEMA",n,`unknown ${t}`);const a=t=>("string"==typeof t&&t.trim()||pM("SCHEMA",n,"nonempty string required"),Object.hasOwn(i,t)||pM("TARGET_ABSENT",n,t),i[t]),c=a(e.placement),l=a(e.feature),h=s.get(e.placement),d=s.get(e.feature);let u,p=h;if("select-item@1"===h?.op){const t=s.get(h.args[0]),e="repeat@1"===t?.op?s.get(t.args[1]):null;"assembly@1"===e?.op&&e.args.includes(h.params.member)||pM("SURFACE_PROVENANCE",n,"selected member must belong to the referenced repeat assembly"),p=s.get(h.params.member),"member@1"!==p?.op&&pM("SURFACE_PROVENANCE",n,"selected source must be a declared template member"),r.inputs.some(t=>t.id===h.args[1]&&"state"===t.role)&&pM("TARGET_STATE",n,"binding target index must not change as animation state"),u={collection:h.args[0],index:h.args[1],member:h.params.member}}else"place@1"!==h?.op&&pM("SURFACE_PROVENANCE",n,"actual placement or selected repeated member required");"feature@1"!==d?.op&&pM("SURFACE_PROVENANCE",n,"provider feature required"),"placed"===c.kind&&c.frame===o&&"transform"===l.kind||pM("FRAME_TYPE",n,"contact must be in asset frame"),p.args[0]!==d.args[0]&&pM("SURFACE_OWNER",n,"feature belongs to a different shape declaration");const f=i[d.args[0]].provider,m=d.params.name;return("box"===f?["left","right","bottom","top","back","front"]:"roundedBox"===f||"roundedBoxXZ"===f||"hollowBox"===f||"hollowBoxXZ"===f?["bottom","top"]:"cylinder"===f?["start","end"]:[]).includes(m)||pM("SURFACE_UNSUPPORTED",n,"feature is not a supported planar surface"),{...e,geometryId:u?null:h.id,selection:u,provider:f,face:m,frame:l.from,normal:fM[m]}}const gM=(t,e,n)=>{throw new Nw(t,e,n)};function yM(t,e,n,i){t&&"object"==typeof t&&!Array.isArray(t)||gM("SCHEMA",i,"object required");for(const n of e)Object.hasOwn(t,n)||gM("SCHEMA",i,`missing ${n}`);for(const s of Object.keys(t))[...e,...n].includes(s)||gM("SCHEMA",i,`unknown ${s}`)}const bM=(t,e)=>{"string"==typeof t&&t.trim()||gM("SCHEMA",e,"nonempty string required")};function _M(t,e){return function(t,e){const n=uM(t),i=structuredClone(e),s=n.outputTypes,r=new Map(t.nodes.flatMap(t=>Object.values(t.outputs).map(e=>[e,structuredClone(t)]))),o=new Map;yM(i,["version","assetFrame","bindings"],["names"],"capabilities"),"r3-capability-3"!==i.version&&gM("VERSION","capabilities",i.version);if(bM(i.assetFrame,"assetFrame"),void 0!==i.names){Array.isArray(i.names)||gM("SCHEMA","names","array required");for(const t of i.names)Iw.includes(t)||gM("CAPABILITY_NAME","names",`${String(t)} is not one of ${Iw.join(", ")}`);new Set(i.names).size!==i.names.length&&gM("CAPABILITY_NAME","names","duplicate capability name")}Array.isArray(i.bindings)||gM("SCHEMA","bindings","array required");const a=new Set,c=(t,e)=>(bM(t,e),Object.hasOwn(s,t)||gM("TARGET_ABSENT",e,t),s[t]),l=(t,e,n)=>{const s=c(t,e);("transform"!==s.kind||s.to!==i.assetFrame||void 0!==n&&s.from!==n)&&gM("FRAME_TYPE",e,"transform must map declared local frame to assetFrame")},h=(e,n)=>mM({types:s,writers:r,model:t,assetFrame:i.assetFrame},e,n),d=new Map;for(const t of i.bindings){yM(t,["id","label","role","frame","pose","accepts","capacity"],["region","contacts"],"binding");for(const e of["id","label","frame"])bM(t[e],e);if(a.has(t.id)&&gM("DUPLICATE_BINDING",t.id,"duplicate id"),a.add(t.id),["seat","grip"].includes(t.role)||gM("ROLE",t.id,"explicit seat or grip required; slot is ambiguous"),"string"==typeof t.pose)l(t.pose,t.id,t.frame);else{const e=h(t.pose,t.id);e.frame!==t.frame&&gM("FRAME_TYPE",t.id,"binding frame must be the selected feature frame"),d.set(t.id,e)}if(Array.isArray(t.accepts)&&t.accepts.length||gM("SCHEMA",t.id,"nonempty accepts required"),t.accepts.forEach(e=>bM(e,t.id)),new Set(t.accepts).size!==t.accepts.length&&gM("SCHEMA",t.id,"duplicate accepted type"),(!Number.isSafeInteger(t.capacity)||t.capacity<1)&&gM("CAPACITY",t.id,"positive integer capacity required"),Object.hasOwn(t,"region")){yM(t.region,["kind","dimensions"],[],t.id+".region"),"centered-box"!==t.region.kind&&gM("REGION",t.id,"only centered-box is specified"),Array.isArray(t.region.dimensions)&&3===t.region.dimensions.length||gM("SCHEMA",t.id,"three dimension references required");for(const e of t.region.dimensions)"[1,0,0]"!==JSON.stringify(c(e,t.id))&&gM("TYPE",t.id,"region dimensions must be lengths")}if(void 0!==t.contacts){Array.isArray(t.contacts)||gM("SCHEMA",t.id,"contact array required");const e=new Set,n=[];for(const i of t.contacts){const s=h(i,t.id),r=JSON.stringify([i.placement,i.feature]);e.has(r)&&gM("DUPLICATE_CONTACT",t.id,r),e.add(r),n.push(s)}o.set(t.id,n)}}return{outputTypes:structuredClone(s),dependence:structuredClone(n.dependence),evaluate(t,e={}){yM(e,[],[...a],"requests");const s=n.evaluate(t),r=t=>function(t,e){const n=t[e.placement],i=t[e.feature],s=n.pose.r,r=s.map(t=>t.reduce((t,n,i)=>t+n*e.normal[i],0)),o=s.map((t,e)=>n.pose.t[e]+t.reduce((t,e,n)=>t+e*i.t[n],0));let a=e.geometryId;if(e.selection){const n=e.selection,i=t[n.collection].items.find(e=>e.index===t[n.index]&&e.key===n.member);i||pM("TARGET_ABSENT",e.placement,"selected repeated item is absent"),a=i.id}return{placement:e.placement,feature:e.feature,geometryId:a,provider:e.provider,face:e.face,pose:{r:s.map(t=>[...t]),t:o},normal:r,provenance:"verified-planar-surface"}}(s.values,t),c=i.bindings.map(t=>{let n=null;if(t.region){const e=t.region.dimensions.map(t=>s.values[t]);e.some(t=>!Number.isFinite(t)||t<=0)&&gM("REGION_DOMAIN",t.id,"positive region dimensions required"),n={kind:t.region.kind,dimensions:e}}let i={status:"unverified",reason:"NO_REQUEST"};if(Object.hasOwn(e,t.id)){const n=e[t.id];yM(n,["type","occupied"],[],t.id+".request"),bM(n.type,t.id),(!Number.isSafeInteger(n.occupied)||n.occupied<0)&&gM("OCCUPANCY",t.id,"nonnegative integer occupancy snapshot required");const s=[];t.accepts.includes(n.type)||s.push("TYPE_NOT_ACCEPTED"),n.occupied>=t.capacity&&s.push("CAPACITY_FULL"),i={status:s.length?"failed":"satisfied",reasons:s}}const a=(o.get(t.id)??[]).map(r),c=d.has(t.id)?r(d.get(t.id)):null;return{id:t.id,label:t.label,role:t.role,frame:t.frame,pose:c?c.pose:s.values[t.pose],...c?{targetGeometryId:c.geometryId}:{},region:n,contacts:a,checks:{declaration:{status:"satisfied"},eligibility:i,spatial:{status:"unverified",reason:"NO_CONTACT_OR_FIT_SOLVER"},collision:{status:"unverified",reason:"NOT_CHECKED"},safety:{status:"unverified",reason:"NOT_CHECKED"}}}});return{geometry:s.geometry,bindings:c,values:s.values}}}}(t,e)}const vM=1048576;function xM(t,e){throw new Nw(t,"document",e)}function wM(t){return(new TextEncoder).encode(t).byteLength}function MM(t){const e=new Set;!function t(n,i){if(i>64&&xM("DOCUMENT_LIMIT","nesting exceeds 64"),null===n||"string"==typeof n||"boolean"==typeof n)return;if("number"==typeof n)return void(Number.isFinite(n)||xM("JSON_VALUE","nonfinite number"));"object"!=typeof n&&xM("JSON_VALUE","only JSON values are allowed"),e.has(n)&&xM("JSON_VALUE","cycle");const s=Array.isArray(n);s||Object.getPrototypeOf(n)===Object.prototype||xM("JSON_VALUE","plain objects required"),e.add(n);const r=Object.getOwnPropertyDescriptors(n);for(const e of Reflect.ownKeys(r)){if(s&&"length"===e)continue;"string"!=typeof e&&xM("JSON_VALUE","symbols unsupported");const o=r[e];o.enumerable&&Object.hasOwn(o,"value")||xM("JSON_VALUE","hidden properties and accessors unsupported"),!s||/^(0|[1-9][0-9]*)$/.test(e)&&Number(e)<n.length||xM("JSON_VALUE","extra array property"),t(o.value,i+1)}s&&Object.keys(n).length!==n.length&&xM("JSON_VALUE","sparse array"),e.delete(n)}(t,0)}function SM(t){if(MM(t),!t||Array.isArray(t)||"object"!=typeof t||3!==Object.keys(t).length||!["version","model","capabilities"].every(e=>Object.hasOwn(t,e)))throw new Nw("SCHEMA","document","expected version, model, capabilities only");if("figure-v3-prototype-1"!==t.version)throw new Nw("VERSION","document","unsupported document version");if(wM(JSON.stringify(t))>vM)throw new Nw("DOCUMENT_LIMIT","document","over 1 MiB");const e=t;if(!Array.isArray(e.model?.nodes)||e.model.nodes.length>512)throw new Nw("DOCUMENT_LIMIT","document","maximum 512 nodes");return _M(e.model,e.capabilities)}const AM=(t,e,n)=>{throw new Nw(t,e,n)};function EM(t){return new Map(t.document.model.inputs.filter(t=>"state"===t.role).map(t=>[t.id,t.unit]))}function kM(t,e){const n=t.keys;if(e<=n[0].at)return n[0].value;const i=n[n.length-1];if(e>=i.at)return i.value;let s=0;for(;s<n.length-2&&n[s+1].at<=e;)s++;const r=n[s],o=n[s+1];if("step"===t.interpolation)return r.value;const a=o.at-r.at;return r.value+(e-r.at)/a*(o.value-r.value)}function CM(t,e,n="other"){Number.isFinite(e)||AM("DRIVER_TIME",t.id,"finite time required");const i=Math.max(0,e),s=t.time.duration,r=t.keys[0].value,o=t.keys[t.keys.length-1];let a;if("hold"===t.loop)a=kM(t,Math.min(i/s,1));else{const e=Math.floor(i/s);a=kM(t,(i-e*s)/s),t.accumulates&&(a+=e*(o.value-r))}return t.accumulates?"deg"===n||"rad"===n?function(t,e){const n="deg"===e?360:2*Math.PI,i=n/2,s=((t+i)%n+n)%n-i;return s===i?-i:s}(a,n):AM("DRIVER_STATE",t.id,"an accumulating driver needs an angle unit"):a}const TM=(t,e,n)=>{throw new Nw(t,e,n)};function PM(t,e,n,i){t&&"object"==typeof t&&!Array.isArray(t)||TM("ASSET_SCHEMA",i,"object required");for(const n of e)Object.hasOwn(t,n)||TM("ASSET_SCHEMA",i,`missing ${n}`);for(const s of Object.keys(t))[...e,...n].includes(s)||TM("ASSET_SCHEMA",i,`unknown ${s}`)}function OM(t){return function(t){MM(t),wM(JSON.stringify(t))>vM&&TM("DOCUMENT_LIMIT","asset","over 1 MiB");PM(t,["version","name","document","designInputs","stateDefaults","palette","appearance"],["occupancy","drivers","stateInputs"],"asset"),"figure-v3-asset-1"!==t.version&&TM("VERSION","asset",t.version);"string"==typeof t.name&&t.name.trim()||TM("ASSET_SCHEMA","name","nonempty name required");const e=structuredClone(t),n=SM(e.document),i=e.document.model,s=i.inputs.filter(t=>"state"!==t.role).map(t=>t.id),r=i.inputs.filter(t=>"state"===t.role).map(t=>t.id);PM(e.designInputs,s,[],"designInputs"),PM(e.stateDefaults,r,[],"stateDefaults"),(!e.palette||"object"!=typeof e.palette||Array.isArray(e.palette))&&TM("ASSET_SCHEMA","palette","token to hex color map required");for(const[t,n]of Object.entries(e.palette))t.trim()&&"string"==typeof n&&/^#[0-9a-f]{6}$/i.test(n)||TM("PALETTE","palette","six digit hex color required");const o=t=>{"string"==typeof t&&Object.hasOwn(e.palette,t)||TM("PALETTE",String(t),"unresolved color token")},a=new Map(i.nodes.flatMap(t=>Object.values(t.outputs).map(e=>[e,t]))),c=new Map(i.nodes.filter(t=>["place@1","member@1"].includes(t.op)).map(t=>[t.id,t])),l=new Map;Array.isArray(e.appearance)||TM("ASSET_SCHEMA","appearance","array required");for(const t of e.appearance){if(PM(t,["target","material"],["segments","visibility"],"appearance"),void 0!==t.visibility){const e=n.outputTypes[t.visibility];"string"==typeof t.visibility&&e&&"flag"===e.kind||TM("VISIBILITY","appearance.visibility",`${String(t.visibility)} is not a flag value in the graph`)}if(c.has(t.target)&&!l.has(t.target)||TM("APPEARANCE_TARGET",String(t.target),"unknown or duplicate source placement"),PM(t.material,["token"],["preset","transparent","emissive"],"material"),o(t.material.token),void 0===t.material.preset||["default","metal","glass","plastic","wood","ceramic","rubber"].includes(t.material.preset)||TM("MATERIAL","preset","unknown preset"),void 0!==t.material.transparent&&"boolean"!=typeof t.material.transparent&&TM("MATERIAL","transparent","boolean required"),void 0!==t.material.emissive){const e=t.material.emissive;PM(e,["token","intensity","on"],[],"emissive"),o(e.token),("boolean"!=typeof e.on||!Number.isFinite(e.intensity)||e.intensity<0||e.intensity>5)&&TM("MATERIAL","emissive","invalid intensity or switch")}const e=a.get(c.get(t.target).args[0]);["cylinder-shape@1","cylinder-shape@2","sphere-shape@1","frustum-shape@1"].includes(e?.op)?[8,12,16,24,32,48].includes(t.segments)||TM("QUALITY","segments","explicit supported cylinder segment count required"):void 0!==t.segments&&TM("QUALITY","segments","segments unsupported on this provider"),l.set(t.target,t)}l.size!==c.size&&TM("APPEARANCE_MISSING","appearance","every source placement/member requires appearance");if(void 0!==e.occupancy){if(PM(e.occupancy,["bounds","placement"],["contact"],"occupancy"),void 0!==e.occupancy.contact){const t=e.occupancy.contact;PM(t,["plane","surface"],[],"occupancy.contact"),"mounting-plane"!==t.plane&&TM("OCCUPANCY","occupancy.contact",`${String(t.plane)} is not a plane the figure can be mounted on`),mM({types:n.outputTypes,writers:a,model:i,assetFrame:e.document.capabilities.assetFrame},t.surface,"occupancy.contact.surface")}PM(e.occupancy.bounds,["x","y","z"],[],"occupancy.bounds");const t=JSON.stringify([1,0,0]);for(const i of["x","y","z"]){PM(e.occupancy.bounds[i],["min","max"],[],`occupancy.bounds.${i}`);for(const s of["min","max"]){const r=`occupancy.bounds.${i}.${s}`,o=e.occupancy.bounds[i][s];"string"==typeof o&&JSON.stringify(n.outputTypes[o])===t||TM("OCCUPANCY",r,`${String(o)} is not a length value in the graph`),n.dependence[o]?.length&&TM("OCCUPANCY_STATE",r,`${o} depends on state input ${n.dependence[o].join(", ")}; the occupancy is state-independent`)}}jw.includes(e.occupancy.placement)||TM("OCCUPANCY","occupancy.placement",`one of ${jw.join(", ")} required`)}function h(t={}){PM(t,[],r,"state overrides");const i={...e.designInputs,...e.stateDefaults,...t},s=n.evaluate(i),o=s.geometry.map(t=>{const e=t.key?a.get(t.key)?.id:t.id,n=l.get(e);return n||TM("APPEARANCE_MISSING",t.id,"no source appearance"),{...t,material:structuredClone(n.material),visible:void 0===n.visibility||s.values[n.visibility],...void 0!==n.segments?{segments:n.segments}:{}}});return{...s,geometry:o,inputs:i,palette:structuredClone(e.palette)}}return function(t){const e=t.drivers;if(void 0===e)return;Array.isArray(e)||AM("DRIVER","drivers","array required");const n=EM(t),i=new Set,s=new Set,r=new Map;for(const t of e){const e=`drivers.${String(t?.id??"?")}`,o=t=>t&&"object"==typeof t?Object.keys(t).sort():null;JSON.stringify(o(t))!==JSON.stringify(["accumulates","clip","id","interpolation","keys","loop","state","time"])&&AM("DRIVER",e,"exactly id, clip, state, time, keys, interpolation, loop, accumulates required"),"string"==typeof t.id&&t.id.trim()||AM("DRIVER",e,"id required"),i.has(t.id)&&AM("DRIVER",e,"duplicate driver id"),i.add(t.id),"string"==typeof t.clip&&t.clip.trim()||AM("DRIVER",e,"clip required; the playback group is declared, not read out of the id"),n.has(t.state)||AM("DRIVER_STATE",e,`${String(t.state)} is not a state input of this asset`),s.has(t.state)&&AM("DRIVER_STATE",e,`two drivers write ${t.state}; one writer per state`),s.add(t.state),JSON.stringify(o(t.time))===JSON.stringify(["duration","unit"])&&"s"===t.time.unit||AM("DRIVER_TIME",e,'time must be { unit: "s", duration }'),Number.isFinite(t.time.duration)&&t.time.duration>0||AM("DRIVER_TIME",e,"positive duration in seconds required");const a=r.get(t.clip);void 0===a?r.set(t.clip,t.time.duration):a!==t.time.duration&&AM("DRIVER_TIME",e,`clip "${t.clip}" already runs for ${a} s; one clip is one clock, so every driver in it shares a duration`),(!Array.isArray(t.keys)||t.keys.length<2)&&AM("DRIVER_KEYS",e,"at least two keys required");let c=-1/0;for(const n of t.keys)JSON.stringify(o(n))!==JSON.stringify(["at","value"])&&AM("DRIVER_KEYS",e,"a key is { at, value }"),Number.isFinite(n.at)&&n.at>=0&&n.at<=1||AM("DRIVER_KEYS",e,"key at must be a fraction of the duration in [0, 1]"),n.at>c||AM("DRIVER_KEYS",e,"key at values must strictly increase"),c=n.at,Number.isFinite(n.value)||AM("DRIVER_KEYS",e,"finite key value required");0!==t.keys[0].at&&AM("DRIVER_KEYS",e,"the first key is at 0"),["linear","step"].includes(t.interpolation)||AM("DRIVER",e,"interpolation is linear or step"),["wrap","hold"].includes(t.loop)||AM("DRIVER",e,"loop is wrap or hold"),"boolean"!=typeof t.accumulates&&AM("DRIVER",e,"accumulates must be a boolean");const l=n.get(t.state);t.accumulates&&"deg"!==l&&"rad"!==l&&AM("DRIVER_STATE",e,`an accumulating driver writes an angle; ${t.state} is in ${l}`)}}(e),function(t){const e=t.stateInputs;if(void 0===e)return;e&&"object"==typeof e&&!Array.isArray(e)||AM("STATE_INPUT","stateInputs","object required");const n=EM(t);for(const[t,i]of Object.entries(e)){const e=`stateInputs.${t}`;n.has(t)||AM("STATE_INPUT",e,`${t} is not a state input of this asset`),i&&"object"==typeof i&&!Array.isArray(i)||AM("STATE_INPUT",e,"object required");for(const t of Object.keys(i))"label"!==t&&"sweep"!==t&&AM("STATE_INPUT",e,`unknown ${t}`);void 0===i.label||"string"==typeof i.label&&i.label.trim()||AM("STATE_INPUT",e,"label must be a nonempty string"),void 0===i.sweep||Number.isFinite(i.sweep)&&i.sweep>=0||AM("STATE_INPUT",e,"sweep must be a number of seconds, zero or more")}}(e),h(),{evaluate:h}}(t)}const DM="0.1.37";function zM(t,e,n){const i=t.anchor?.[n];if(i)return i;if("scale"===t.sizing)return"scale";if("stretch"===t.sizing&&n===HM(t))return"span";if("repeat"===t.sizing&&n===t.repeat?.axis)return"center";const s=IM(t,e,n);return s.min<s.max?"min":s.max<s.min?"max":"center"}function IM(t,e,n){const i=(Number.isFinite(e[n])?e[n]:0)/2,s=t.transform.position[n],r=BM(t)[n]/2;return{min:s-r+i,max:i-(s+r)}}function RM(t){return Number.isFinite(t)&&t>0?t:1}function jM(t,e,n,i){const s=IM(t,n,i),r=(Number.isFinite(n[i])?n[i]:0)*RM(e[i]);return Math.max(r-s.min-s.max,LM)}const LM=.001;function FM(t){return"scale"!==t.sizing||NM(t)}function NM(t){return("cylinder"===t.primitive||"sphere"===t.primitive)&&!1!==t.keepRound}function BM(t){const{size:e,rotation:n}=t.transform;if(!n)return{...e};const i=Math.PI/180,s=Math.cos((n.x??0)*i),r=Math.sin((n.x??0)*i),o=Math.cos((n.y??0)*i),a=Math.sin((n.y??0)*i),c=Math.cos((n.z??0)*i),l=Math.sin((n.z??0)*i),h=[[o*c,-o*l,a],[r*a*c+s*l,-r*a*l+s*c,-r*o],[-s*a*c+r*l,s*a*l+r*c,s*o]],d=t=>Math.abs(t[0])*e.x+Math.abs(t[1])*e.y+Math.abs(t[2])*e.z;return{x:d(h[0]),y:d(h[1]),z:d(h[2])}}function HM(t){const{x:e,y:n,z:i}=BM(t);return e>=i&&e>=n?"x":i>=n?"z":"y"}function $M(t,e,n){const i={x:zM(t,n,"x"),y:zM(t,n,"y"),z:zM(t,n,"z")};if(WM.every(t=>"scale"===i[t])){const n={x:1,y:1,z:1};return VM(t,e,n),n}const s={x:qM(e.x),y:qM(e.y),z:qM(e.z)};for(const r of WM){const o=i[r];if("scale"===o&&(s[r]=1),"span"!==o)continue;const a=BM(t)[r];s[r]=a>0?jM(t,e,n,r)/a/RM(e[r]):1}return VM(t,e,s),function(t,e,n,i){const s={x:RM(n.x)*i.x,y:RM(n.y)*i.y,z:RM(n.z)*i.z};for(const r of WM){const o=GM(zM(t,e,r));o&&(i[r]=s[o]/RM(n[r]))}}(t,n,e,s),s}function GM(t){return"aspect-x"===t?"x":"aspect-y"===t?"y":"aspect-z"===t?"z":null}function VM(t,e,n){if(!NM(t))return;const i="sphere"===t.primitive?null:function(t){const e=t.transform.rotation;if(!e)return"y";const n=Math.PI/180,i=Math.cos((e.x??0)*n),s=Math.sin((e.x??0)*n),r=Math.cos((e.y??0)*n),o=Math.cos((e.z??0)*n),a=Math.sin((e.z??0)*n),c=Math.sin((e.y??0)*n),l={x:-r*a,y:-s*c*a+i*o,z:i*c*a+s*o},h={x:Math.abs(l.x),y:Math.abs(l.y),z:Math.abs(l.z)};return h.x>=h.y&&h.x>=h.z?"x":h.z>=h.y?"z":"y"}(t),s=WM.filter(t=>t!==i);let r=1;for(const t of s)r*=RM(e[t])*n[t];if(!(r>0&&Number.isFinite(r)))return;const o=Math.pow(r,1/s.length);for(const t of s)n[t]=o/RM(e[t])}function UM(t,e,n){const{position:i}=t.transform,s={x:zM(t,n,"x"),y:zM(t,n,"y"),z:zM(t,n,"z")};if(WM.every(t=>"scale"===s[t]))return{...i};const r={...i},o=$M(t,e,n),a=t=>RM(e[t])*o[t];for(const o of WM){const c=s[o];if("scale"===c)continue;const l=GM(c);if(l){r[o]=i[o]*a(l)/RM(e[o]);continue}const h=RM(e[o]),d=(Number.isFinite(n[o])?n[o]:0)/2,u=IM(t,n,o),p=BM(t)[o]/2;r[o]="span"===c?(-d*h+u.min+jM(t,e,n,o)/2)/h:"min"===c?(-d*h+u.min+p)/h:"max"===c?(d*h-u.max-p)/h:i[o]/h}return r}function YM(t,e,n,i){const{origin:s}=t;if(!e)return{...s};const r=UM(e,n,i),o=$M(e,n,i),a=e.transform.position;return{x:r.x+(s.x-a.x)*o.x,y:r.y+(s.y-a.y)*o.y,z:r.z+(s.z-a.z)*o.z}}const WM=["x","y","z"];function qM(t){return Number.isFinite(t)&&t>0?1/t:1}function XM(t,e,n){if("repeat"!==t.sizing||!t.repeat)return null;const i=t.repeat.axis,s=t.repeat.pitch;if(!(Number.isFinite(s)&&s>0))return null;const r="scale"!==zM(t,n,i)&&Number.isFinite(e[i])&&e[i]>0?e[i]:1,o=(Number.isFinite(n[i])&&n[i]>0?n[i]:s)*r;return{axis:i,count:Math.max(1,Math.min(KM,Math.floor(o/s))),pitch:s}}const KM=100;function QM(t,e,n){return(t-(e-1)/2)*n}const ZM=Object.freeze({x:"size.x",y:"size.y",z:"size.z"});function JM(t){return"number"==typeof t&&Number.isFinite(t)}function tS(t){if(!t||"object"!=typeof t)return!1;const{x:e,y:n,z:i}=t;return JM(e)&&JM(n)&&JM(i)}function eS(t){const e=[],n=t;if(!n||"object"!=typeof n)return["청사진이 객체가 아니다"];1!==n.version&&e.push(`읽을 수 없는 판이다 — version ${String(n.version)}, 이 판올림은 1 만 읽는다`),"string"==typeof n.type&&0!==n.type.length||e.push("type 이 없다 — 컴포넌트 타입 이름이 곧 청사진을 찾는 키다");const i=n.base;if(i&&JM(i.x)&&JM(i.y)&&JM(i.z)?i.x>0&&i.z>0||e.push("base 의 x·z 는 0 보다 커야 한다 — 평면 배치 비율의 분모다"):e.push("base 의 x·y·z 가 온전하지 않다"),!Array.isArray(n.groups))return e.push("groups 가 배열이 아니다"),e;if(0===n.groups.length&&e.push("groups 가 비어 있다 — 그릴 것이 없는 청사진은 등록하지 않는다"),n.groups.forEach((t,n)=>{t&&Array.isArray(t.members)?(0===t.members.length&&e.push(`groups[${n}] 에 부품이 없다`),t.members.forEach((t,i)=>{const s=`groups[${n}].members[${i}]`;"string"==typeof t?.name&&0!==t.name.length||e.push(`${s}.name 이 없다 — 이름이 바인딩·이벤트·애니메이션이 붙는 자리다`);const r=t?.transform;r&&tS(r.position)&&tS(r.size)||e.push(`${s}.transform 의 값이 온전하지 않다`)})):e.push(`groups[${n}].members 가 배열이 아니다`)}),void 0!==n.anchors&&(Array.isArray(n.anchors)?n.anchors.forEach((t,n)=>{const i=`anchors[${n}]`;"string"==typeof t?.name&&0!==t.name.length||e.push(`${i}.name 이 없다 — 이름이 곧 slot·port 의 id 다`),Array.isArray(t?.roles)&&0!==t.roles.length?t.roles.some(t=>!Fw.includes(t))&&e.push(`${i}.roles 에 ${Fw.join(" · ")} 밖의 값이 있다`):e.push(`${i}.roles 가 역할 하나 이상의 배열이 아니다`);const s=t?.transform;s&&tS(s.position)&&tS(s.size)||e.push(`${i}.transform 의 값이 온전하지 않다`)}):e.push("anchors 가 배열이 아니다")),void 0!==n.parameters&&(Array.isArray(n.parameters)?n.parameters.forEach((t,n)=>{const i=`parameters[${n}]`;"string"==typeof t?.name&&0!==t.name.length||e.push(`${i}.name 이 없다 — 인스턴스가 이 이름으로 값을 준다`);const s=t?.range;s&&JM(s.min)&&JM(s.max)?s.max>s.min||e.push(`${i}.range 의 max 가 min 보다 크지 않다 — 0~1 로 맵할 수 없다`):e.push(`${i}.range 의 min·max 가 온전하지 않다`),t?.clip&&Array.isArray(t.clip.channels)?void 0===t.clip.duration||JM(t.clip.duration)&&t.clip.duration>=0||e.push(`${i}.clip.duration 이 0 이상의 수가 아니다`):e.push(`${i}.clip.channels 가 배열이 아니다 — 값이 무엇을 움직이는지 없다`)}):e.push("parameters 가 배열이 아니다")),void 0!==n.joints)if(Array.isArray(n.joints)){const t=new Set;n.joints.forEach((n,i)=>{const s=`joints[${i}]`;"string"==typeof n?.name&&0!==n.name.length?(Lw.includes(n.type)||e.push(`${s}.type 이 ${Lw.join(" · ")} 가 아니다`),tS(n.origin)||e.push(`${s}.origin 이 온전하지 않다`),tS(n.axis)&&0!==Math.hypot(n.axis.x,n.axis.y,n.axis.z)||e.push(`${s}.axis 가 0 이 아닌 벡터가 아니다`),void 0===n.parent||t.has(n.parent)||e.push(`${s}.parent '${n.parent}' 가 앞에 없다 — 관절은 부모가 먼저 온다`),t.add(n.name)):e.push(`${s}.name 이 없다 — channel 이 이 이름으로 관절을 몬다`)})}else e.push("joints 가 배열이 아니다");const s=new Set(Array.isArray(n.joints)?n.joints.map(t=>t?.name):[]);return n.groups.forEach((t,n)=>{void 0===t?.joint||s.has(t.joint)||e.push(`groups[${n}].joint '${t.joint}' 가 joints 에 없다`)}),(Array.isArray(n.anchors)?n.anchors:[]).forEach((t,n)=>{void 0===t?.joint||s.has(t.joint)||e.push(`anchors[${n}].joint '${t.joint}' 가 joints 에 없다`)}),e}const nS={"palette.primary":"#154473","palette.accent":"#f79c40","palette.neutral":"#96989b","palette.dark":"#27292c","palette.light":"#d6d7d9","palette.surface":"#56585b","palette.status-danger":"#f61b30","palette.status-warning":"#e68d1a","palette.status-info":"#158bde","palette.status-success":"#1cb648"},iS=new Map([["default",nS]]);let sS="default",rS=0;function oS(){return rS}function aS(t,e){iS.set(t,e),t===sS&&rS++}function cS(t){if(!iS.has(t))throw new Error(`등록되지 않은 팔레트다: '${t}'. 등록된 것 — ${[...iS.keys()].join(", ")}`);t!==sS&&(sS=t,rS++)}function lS(){return sS}function hS(){return iS.get(sS)}function dS(t){const e=hS()[t];if(void 0===e)throw new Error(`팔레트에 없는 토큰이다: '${t}' (팔레트 '${sS}'). 쓸 수 있는 것 — ${Object.keys(hS()).join(", ")}`);return e}const uS=nS["palette.neutral"];function pS(){iS.clear(),iS.set("default",nS),sS="default",rS++}const fS=new Map;let mS=null;function gS(t){mS=t}function yS(t){const e=t.material?.token;return void 0===e?uS:dS(e)}function bS(t){const e=[],n=[];for(const i of t.groups){const t=yS(i);for(const e of i.members)n.push({member:e,group:i,color:t});e.push({group:i,color:t})}return n.sort((t,e)=>t.member.transform.position.y-e.member.transform.position.y),{blueprint:t,paintOrder:n,groups:e,paletteVersion:oS()}}function _S(t){const e=eS(t);if(e.length>0){throw new Error(`Figure '${t?.type??"(이름 없음)"}' 를 등록할 수 없다:\n - ${e.join("\n - ")}`)}const n=bS(t);return fS.set(t.type,n),mS&&mS.registerType?.(t.type,t.capabilities??[],t.placement),n}function vS(t,e=[],n){mS?.registerType?.(t,e,n)}function xS(t){const e=fS.get(t);if(!e)return null;if(e.paletteVersion!==oS()){const n=bS(e.blueprint);return fS.set(t,n),n}return e}function wS(){return[...fS.keys()]}function MS(t){return fS.has(t)}function SS(t){return fS.delete(t)}function AS(){fS.clear()}const ES={x:0,y:0,z:0};function kS(t){let e=0;for(const n of t.channels??[]){const t=n.keys,i=t?.[t.length-1]?.at;"number"==typeof i&&Number.isFinite(i)&&i>e&&(e=i)}return e}function CS(t,e){const n=t.keys;if(!n||0===n.length)return ES;if(1===n.length)return n[0].value;if(e<=n[0].at)return n[0].value;const i=n[n.length-1];if(e>=i.at)return i.value;let s=0;for(;s<n.length-2&&n[s+1].at<=e;)s++;const r=n[s],o=n[s+1];if("step"===t.interpolation)return r.value;const a=o.at-r.at,c=a>0?(e-r.at)/a:0;return{x:r.value.x+(o.value.x-r.value.x)*c,y:r.value.y+(o.value.y-r.value.y)*c,z:r.value.z+(o.value.z-r.value.z)*c}}function TS(t,e){const n=new Map;for(const i of t.channels??[]){const t=i.target;if("string"!=typeof t)continue;if(!PS(i))continue;let s=n.get(t);s||(s={},n.set(t,s)),s[i.path]=CS(i,e)}return n}function PS(t){return void 0!==t.path}function OS(t,e){const n=t.keys;if(!n||0===n.length)return 0;if(1===n.length||e<=n[0].at)return n[0].value;const i=n[n.length-1];if(e>=i.at)return i.value;let s=0;for(;s<n.length-2&&n[s+1].at<=e;)s++;const r=n[s],o=n[s+1];if("step"===t.interpolation)return r.value;const a=o.at-r.at,c=a>0?(e-r.at)/a:0;return r.value+(o.value-r.value)*c}function DS(t,e){const n=new Map;for(const i of t.channels??[])"string"!=typeof i.target||PS(i)||n.set(i.target,OS(i,e));return n}function zS(t,e){return t<=0?0:e%t}function IS(t){return Math.min(Math.max(t,0),1)}function RS(t,e,n,i){if(!(n>0))return e;const s=i/1e3/n;return Math.abs(e-t)<=s?e:t+Math.sign(e-t)*s}function jS(t){const e=FS(t);if(!e)return null;const{position:n,rotation:i}=t.transform;return i&&(e.rotateZ(M.MathUtils.degToRad(i.z??0)),e.rotateY(M.MathUtils.degToRad(i.y??0)),e.rotateX(M.MathUtils.degToRad(i.x??0))),e.translate(n.x,n.y,n.z),e}function LS(t){const e=FS(t);if(!e)return null;const{rotation:n}=t.transform;return n&&(e.rotateZ(M.MathUtils.degToRad(n.z??0)),e.rotateY(M.MathUtils.degToRad(n.y??0)),e.rotateX(M.MathUtils.degToRad(n.x??0))),e}function FS(t){const{size:e}=t.transform;if(!(e.x>0&&e.y>0&&e.z>0))return null;switch(t.primitive){case"cube":case"wall":return new M.BoxGeometry(e.x,e.y,e.z);case"cylinder":case"sphere":{const n=function(t){const e=t.segments;return kx(e,Sx[0])}(t),i=Mx.primitive({kind:t.primitive,segments:n}).clone();return i.scale(e.x,e.y,e.z),i}case"rect":case"polygon":return kw(function(t){const{size:e}=t.transform;return{polygon:"polygon"===t.primitive,width:e.x,depth:e.z,height:e.y,round:t.shape?.round,path:t.shape?.path,hollow:t.shape?.hollow}}(t))}}function NS(t,e){const{blueprint:n}=t,i=t.groups[e];if(!i)return null;const s=`figure|${n.type}|${e}|${i.group.materialKey}|${function(t){let e=2166136261;const n=t=>{for(let n=0;n<t.length;n++)e^=t.charCodeAt(n),e=Math.imul(e,16777619)};for(const e of t.group.members){const{position:t,size:i,rotation:s}=e.transform;n(`${e.geometryKey}@${t.x},${t.y},${t.z}:${i.x},${i.y},${i.z}`),n(s?`%${s.x??0},${s.y??0},${s.z??0};`:";")}return(e>>>0).toString(36)}(i)}`,r=Mx.shaped(s,()=>{const t=[];for(const e of i.group.members){const n=jS(e);n&&t.push(n)}if(0===t.length)return new M.BufferGeometry;let s;if(1===t.length)s=t[0];else{const r=t.map(t=>t.index?t.toNonIndexed():t),o=x.mergeGeometries(r,!1);if(!o)throw new Error(`Figure '${n.type}' 의 묶음 ${e}(${i.group.materialKey})를 합치지 못했다 — 부품 ${i.group.members.map(t=>t.name).join(", ")}`);s=o;for(const t of r)t.dispose();for(const e of t)e.dispose()}return s});return r.getAttribute("position")?r:null}function BS(t,e,n=!1){const{material:i}=e.group,s=dd[i.preset??"default"]??dd.default,r=n&&i.emissive,o=r&&i.emissive.token?dS(i.emissive.token):e.color,a=`figure|${t.blueprint.type}|${e.group.materialKey}`+(r?"||emissive":"");return Zv.material(a,{color:o,metalness:s.metalness,roughness:s.roughness,envMapIntensity:s.envMapIntensity,flatShading:i.flatShading??!0,transparent:i.transparent??!1,opacity:i.transparent?s.opacity??.3:1,emissive:o,emissiveIntensity:r?i.emissive.intensity:0})}function HS(t,e){const n=t.group.material.emissive;if(!n)return!1;const i=t.group.members[0]?.name;return(i?e?.[i]:void 0)??n.on??!1}function $S(t){return!t||[t.x??0,t.y??0,t.z??0].every(t=>Math.abs(t%90)<1e-6)}const GS=new M.Quaternion,VS=new M.Vector3,US=new M.Vector3,YS=new M.Vector3,WS=new M.Quaternion,qS=new M.Quaternion,XS=new M.Vector3,KS=new M.Vector3,QS=new M.Vector3,ZS=new M.Vector3,JS=new M.Matrix4;function tA(t){return Number.isFinite(t)&&t>0?1/t:1}function eA(t,e){if("number"!=typeof e||!Number.isFinite(e))return;const n=t.max-t.min;return!Number.isFinite(n)||n<=0?void 0:Math.min(Math.max((e-t.min)/n,0),1)}function nA(t,e){const n=e?.[t.clip.name];return"number"==typeof n&&Number.isFinite(n)&&n>=0?n:1}function iA(t,e){const n=t.range;return n?eA(n,e?.[t.name])??eA(n,t.default)??0:0}function sA(t,e){const n=e?.[t.name];if(rA(n))return n;const i=t.clip?.duration;return rA(i)?i:0}function rA(t){return"number"==typeof t&&Number.isFinite(t)&&t>=0}const oA=new M.Euler;function aA(t){const{rotation:e}=t.transform;return(new M.Quaternion).setFromEuler(new M.Euler(M.MathUtils.degToRad(e?.x??0),M.MathUtils.degToRad(e?.y??0),M.MathUtils.degToRad(e?.z??0)))}const cA=new Set;function lA(t,e,n){const i=`${t}|${e}|${n}`;cA.has(i)||(cA.add(i),Hi(`[figure] ${t}.${e}: ${n} 는 아직 안 움직인다 — 청사진에는 실렸다.`))}class hA extends iu{constructor(){super(...arguments),this._meshByName=new Map,this._sized=[],this._memberByName=new Map,this._clips=[],this._parameters=[],this._moved=new Map,this._joints=new Map,this._frameByName=new Map,this._framedMeshes=[],this._jointScale=new M.Vector3(1,1,1)}get figure(){return xS(this.component.state.type)}get lamps(){return this.component.state.lamps}updateLamps(){const t=this.figure;if(t)for(const e of t.groups){if(!e.group.material.emissive)continue;const n=e.group.members[0]?.name;if(!n)continue;const i=this._meshByName.get(n);i&&(i.material=BS(t,e,HS(e,this.lamps)))}}get clips(){return this.component.state.clips}updateClips(){const t=this.clips;for(const e of this._clips)e.value=nA(e,t);this.component.invalidate?.()}get parameters(){return this.component.state.parameters}get parameterDurations(){return this.component.state.parameterDurations}updateParameters(){const t=this.parameters;for(const e of this._parameters)e.target=iA(e.parameter,t);this.component.invalidate?.()}updateParameterDurations(){const t=this.parameterDurations;for(const e of this._parameters)e.sweep=sA(e.parameter,t)}onchange(t,e){super.onchange(t,e),"lamps"in t&&this.updateLamps(),"clips"in t&&this.updateClips(),"parameters"in t&&this.updateParameters(),"parameterDurations"in t&&this.updateParameterDurations()}build(){super.build();const t=this.figure;if(t){for(const e of t.blueprint.groups)for(const t of e.members)this._memberByName.set(t.name,t),void 0!==e.joint&&this._frameByName.set(t.name,e.joint);this.buildJoints(t),t.groups.forEach((e,n)=>{const i=e.group.joint,s=function(t){const{members:e}=t.group;if(1!==e.length)return null;const n=e[0];return FM(n)?n:null}(e);if(s)return void this.buildSized(t,e,s,i);const r=NS(t,n);if(!r)return;const o=new M.Mesh(r,BS(t,e,HS(e,this.lamps)));o.castShadow=!0,o.name=e.group.animated?e.group.members[0]?.name??"":"";const a=void 0!==i?this._joints.get(i)?.node:void 0;a?(a.add(o),this._framedMeshes.push({mesh:o,frame:i})):this.object3d.add(o);for(const t of e.group.members)this._meshByName.has(t.name)||this._meshByName.set(t.name,o)}),this.updateDimension(),this.takeClips(t),this.takeParameters(t),this.seatParameters(),this.startTicking()}}buildJoints(t){const e=t.blueprint.joints??[];if(0===e.length)return;const n=new M.Object3D;n.name="(joints)",this.object3d.add(n),this._rigid=n;for(const t of e){const e=new M.Object3D;e.name=t.name;((void 0!==t.parent?this._joints.get(t.parent)?.node:void 0)??n).add(e),this._joints.set(t.name,{joint:t,node:e,origin:new M.Vector3,rest:new M.Vector3})}}layoutJoints(t){const e=this.figure;if(!e||!this._rigid)return;const{base:n,anchors:i}=e.blueprint;this._jointScale.set(t.x,t.y,t.z),this._rigid.scale.set(tA(t.x),tA(t.y),tA(t.z));for(const e of this._joints.values()){const{attach:s}=e.joint,r=void 0===s?void 0:this._memberByName.get(s)??i?.find(t=>t.name===s),o=YM(e.joint,r,t,n);e.origin.set(o.x*t.x,o.y*t.y,o.z*t.z);const a=void 0!==e.joint.parent?this._joints.get(e.joint.parent):void 0;e.rest.copy(e.origin),a&&e.rest.sub(a.origin)}for(const{mesh:t,frame:e}of this._framedMeshes){const n=this._joints.get(e)?.origin;n&&(t.position.copy(n).negate(),t.scale.copy(this._jointScale))}this.applyJoints(new Map)}anchorPosition(t){const e=t.transform.position,n=void 0===t.joint?void 0:this._joints?.get(t.joint);if(!n||!this._rigid)return e;const i=this._jointScale;if(0===i.x||0===i.y||0===i.z)return e;const s=ZS.set(e.x*i.x,e.y*i.y,e.z*i.z).sub(n.origin);JS.identity();for(let t=n.node;t&&t!==this._rigid;t=t.parent)t.updateMatrix(),JS.premultiply(t.matrix);return s.applyMatrix4(JS),{x:s.x/i.x,y:s.y/i.y,z:s.z/i.z}}anchorAttachment(t){const e=void 0===t.joint?void 0:this._joints?.get(t.joint);if(!e||!this._rigid)return;const n=this._jointScale,i=t.transform.position;return{attach:e.node,localPosition:{x:i.x*n.x-e.origin.x,y:i.y*n.y-e.origin.y,z:i.z*n.z-e.origin.z}}}applyJoints(t){for(const e of this._joints.values()){const{joint:n,node:i}=e,s=n.limits;let r=t.get(n.name)??0;s&&(r=Math.min(Math.max(r,s.min),s.max)),i.position.copy(e.rest),"prismatic"===n.type?(i.quaternion.identity(),i.position.x+=n.axis.x*r*this._jointScale.x,i.position.y+=n.axis.y*r*this._jointScale.y,i.position.z+=n.axis.z*r*this._jointScale.z):(XS.set(n.axis.x,n.axis.y,n.axis.z),i.quaternion.setFromAxisAngle(XS,M.MathUtils.degToRad(r)))}}takeClips(t){const e=this.clips,n=this.component.state.type;for(const i of t.blueprint.animations??[]){const t=kS(i);if(t<=0)continue;if(0===this.takeChannels(i.channels??[],n))continue;const s={clip:i,duration:t,value:0,elapsed:0};s.value=nA(s,e),this._clips.push(s)}}takeParameters(t){const e=this.parameters,n=this.parameterDurations,i=this.component.state.type;for(const s of t.blueprint.parameters??[]){const t=s.clip?.channels??[];if(0===this.takeChannels(t,i))continue;const r={parameter:s,sweep:sA(s,n),at:0,target:0};r.target=iA(s,e),r.at=r.target,this._parameters.push(r)}}takeChannels(t,e){let n=0;for(const i of t){if(!PS(i)){this._joints?.has(i.target)&&n++;continue}const s=this._moved.get(i.target),r=this._memberByName.get(i.target);if(!r)continue;const o=aA(r),a=this._sized.find(t=>t.member.name===i.target),c=a?void 0:this._meshByName.get(i.target);if(!a&&!c)continue;const l=new M.Vector3(i.pivot?.x??0,i.pivot?.y??0,i.pivot?.z??0);if(l.applyQuaternion(o),!a){const{position:t}=r.transform;l.set(l.x+t.x,l.y+t.y,l.z+t.z)}if(t.some(t=>t.target===i.target&&"scale"===t.path)&&!$S(r.transform.rotation)&&lA(e,i.target,"90도 배수가 아닌 회전 위의 scale 채널"),s){if(n++,void 0===i.pivot)continue;if(s.pivoted){s.pivot.equals(l)||lA(e,i.target,"회전 중심이 서로 다른 채널 둘");continue}s.pivot.copy(l),s.pivoted=!0;continue}const h=void 0!==i.pivot,d=this._frameByName?.get(i.target);this._moved.set(i.target,void 0===d?{name:i.target,mesh:c,sized:a,pivot:l,pivoted:h,turn:o}:{name:i.target,mesh:c,sized:a,pivot:l,pivoted:h,turn:o,frame:d}),n++}return n}startTicking(){this._unsubscribeTick||0===this._clips.length&&0===this._parameters.length||(this._unsubscribeTick=yr.subscribe(t=>this.advanceClips(t),{description:`Figure[${this.component.state.type}].clips`,component:this.component,getTargets:()=>[...[...this._moved.values()].map(t=>t.mesh??t.sized?.holder),...[...this._joints?.values()??[]].map(t=>t.node)]}))}advanceClips(t){if(0===this._clips.length&&0===this._parameters.length)return;let e=!1;const n=new Map,i=new Map,s=t=>{for(const[e,n]of t)i.set(e,(i.get(e)??0)+n)},r=t=>{let e=n.get(t);return e||(e={shift:new M.Vector3,scale:new M.Vector3(1,1,1),turn:new M.Quaternion},n.set(t,e)),e};for(const n of this._parameters){const i=n.at;n.at=RS(n.at,n.target,n.sweep,t),n.at!==i&&(e=!0);for(const[t,e]of TS(n.parameter.clip,IS(n.at))){const n=this._moved.get(t);n&&this.mixPose(r(t),n,e)}this._joints?.size&&s(DS(n.parameter.clip,IS(n.at)))}for(const n of this._clips){0!==n.value&&(n.elapsed+=t/1e3*n.value,e=!0);const i=zS(n.duration,n.elapsed);for(const[t,e]of TS(n.clip,i)){const n=this._moved.get(t);n&&this.mixPose(r(t),n,e)}this._joints?.size&&s(DS(n.clip,i))}this.applyPose(n),this._joints?.size&&this.applyJoints(i),e&&this.component.invalidate?.()}mixPose(t,e,n){var i;n.translation&&(t.shift.x+=n.translation.x,t.shift.y+=n.translation.y,t.shift.z+=n.translation.z),n.rotation&&t.turn.multiply(qS.copy(e.turn).multiply((i=n.rotation,i?GS.setFromEuler(oA.set(M.MathUtils.degToRad(i.x),M.MathUtils.degToRad(i.y),M.MathUtils.degToRad(i.z))):GS.identity())).multiply(WS.copy(e.turn).invert())),n.scale&&(VS.set(n.scale.x,n.scale.y,n.scale.z).applyQuaternion(e.turn),t.scale.multiply(VS.set(Math.abs(VS.x),Math.abs(VS.y),Math.abs(VS.z))))}seatParameters(){0!==this._parameters.length&&this.advanceClips(0)}applyPose(t){for(const[e,n]of t){const t=this._moved.get(e);if(!t)continue;const i=US.copy(t.pivot).multiply(n.scale).applyQuaternion(n.turn),s=(new M.Vector3).copy(t.pivot).sub(i).add(n.shift);if(t.sized){const e=t.sized;e.copies.forEach((t,i)=>{t.visible&&(t.quaternion.copy(n.turn),t.scale.copy(n.scale),t.position.copy(e.offsets[i]??YS).add(s))});continue}const r=t.mesh;if(!r)continue;const o=void 0!==t.frame?this._joints?.get(t.frame)?.origin:void 0;if(o){const e=this._jointScale,i=KS.copy(t.pivot).multiply(e),s=US.copy(i).multiply(n.scale).applyQuaternion(n.turn);r.position.copy(i).sub(s).add(QS.copy(n.shift).multiply(e)).sub(o),r.quaternion.copy(n.turn),r.scale.copy(n.scale).multiply(e);continue}r.quaternion.copy(n.turn),r.scale.copy(n.scale),r.position.copy(s)}}buildSized(t,e,n,i){const s=function(t,e){const{size:n,rotation:i}=e.transform,s=`figure-part|${t.blueprint.type}|${e.geometryKey}|${n.x},${n.y},${n.z}|${i?`${i.x??0},${i.y??0},${i.z??0}`:"-"}`,r=Mx.shaped(s,()=>LS(e)??new M.BufferGeometry);return r.getAttribute("position")?r:null}(t,n);if(!s)return;const r=new M.Object3D,{position:o}=n.transform;r.position.set(o.x,o.y,o.z),r.name=n.name;const a=void 0!==i?this._joints.get(i)?.node:void 0;(a??this.object3d).add(r);const c=new M.Mesh(s,BS(t,e,HS(e,this.lamps)));c.castShadow=!0,r.add(c);const l={member:n,holder:r,copies:[c],offsets:[new M.Vector3]};a&&(l.frame=i),this._sized.push(l),this._meshByName.has(n.name)||this._meshByName.set(n.name,c)}applySizing(t){const e=this.figure?.blueprint.base;if(e)for(const n of this._sized){const{member:i,holder:s,copies:r}=n,o=$M(i,t,e);s.scale.set(o.x,o.y,o.z);const a=UM(i,t,e);s.position.set(a.x,a.y,a.z);const c=void 0!==n.frame?this._joints?.get(n.frame)?.origin:void 0;c&&(s.position.set(a.x*t.x,a.y*t.y,a.z*t.z).sub(c),s.scale.set(o.x*t.x,o.y*t.y,o.z*t.z));const l=XM(i,t,e);if(!l){r.forEach((t,e)=>{t.visible=0===e,t.position.set(0,0,0),n.offsets[e]=(n.offsets[e]??new M.Vector3).set(0,0,0)});continue}const h=r[0];for(;r.length<l.count;){const t=new M.Mesh(h.geometry,h.material);t.castShadow=!0,s.add(t),r.push(t)}r.forEach((t,e)=>{t.visible=e<l.count,t.visible&&(t.position.set(0,0,0),t.position[l.axis]=QM(e,l.count,l.pitch),n.offsets[e]=(n.offsets[e]??new M.Vector3).copy(t.position))})}}get effectiveDepth(){const t=this.component.state.depth;if("number"==typeof t&&Number.isFinite(t)&&t>0)return t;const e=this.figure;if(!e)return super.effectiveDepth;const{base:n}=e.blueprint,{width:i,height:s}=this.component.bounds,r=n.x>0?i/n.x:1,o=n.z>0?s/n.z:1;return n.y*Math.sqrt(Math.max(r,0)*Math.max(o,0))}get effectiveZPos(){const t=this.component.state.zPos;if("number"==typeof t&&Number.isFinite(t))return t;if("ceiling"!==this.figure?.blueprint.placement)return super.effectiveZPos;const{ceiling:e}=this.sceneHeights,n=this.effectiveDepth;switch(this.placementMode){case"inverted":return e;case"space":return e-n/2;default:return e-n}}updateDimension(){const t=this.figure;if(!t)return;const{base:e}=t.blueprint,{width:n,height:i}=this.component.bounds,s=this.effectiveDepth,r={x:e.x>0?n/e.x:1,y:e.y>0?s/e.y:1,z:e.z>0?i/e.z:1};this.setDimensionScale(r.x,r.y,r.z),this._joints?.size&&this.layoutJoints(r),this._sized.length>0&&this.applySizing(r),this._joints?.size&&this.advanceClips(0)}topOutline(){return null}clear(){return this._unsubscribeTick?.(),this._unsubscribeTick=void 0,this._clips=[],this._parameters=[],this._moved.clear(),this._joints?.clear(),this._rigid=void 0,this._frameByName?.clear(),this._framedMeshes=[],this._memberByName.clear(),this._meshByName.clear(),this._sized=[],super.clear()}}function dA(t){if(Array.isArray(t))return`[${t.map(dA).join(",")}]`;if(t&&"object"==typeof t){const e=t;return`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${dA(e[t])}`).join(",")}}`}return JSON.stringify(t)}const uA=new Map;function pA(t){const e=function(t){const e=dA(t),n=t=>{let n=t>>>0;for(let t=0;t<e.length;t++)n^=e.charCodeAt(t),n=Math.imul(n,16777619)>>>0;return n.toString(16).padStart(8,"0")};return n(2166136261)+n(2538058380)}(t),n=`${e}|${DM}`,i=uA.get(n);if(i)return uA.delete(n),uA.set(n,i),i;const s=structuredClone(t),r=new Map;for(const t of s.document.model.nodes)for(const e of Object.values(t.outputs))r.set(e,t.id);const o={key:n,fingerprint:e,kernel:DM,compiled:OM(s),document:SM(s.document),looks:new Map(s.appearance.map(t=>[t.target,t])),writers:r,asset:s};return uA.set(n,o),uA.size>256&&uA.delete(uA.keys().next().value),o}const fA=new Map;const mA=new Map;function gA(t,e=12){const n=function(t,e){const n=Object.keys(t.dimensions).sort().map(e=>`${e}=${Math.round(1e6*t.dimensions[e])/1e6}`).join(","),i=t.profile?"|"+t.profile.map(t=>`${Math.round(1e6*t.x)/1e6}:${Math.round(1e6*t.y)/1e6}`).join(";"):"";return`${t.provider}|${n}|s${e}${i}`}(t,e),i=mA.get(n);if(i)return i.users++,i.geometry;const s=function(t,e=12){const n=t.dimensions;switch(t.provider){case"box":return new M.BoxGeometry(n.width,n.height,n.depth);case"cylinder":return new M.CylinderGeometry(n.radius,n.radius,n.length,e);case"ellipticCylinder":return new M.CylinderGeometry(1,1,1,e).scale(n.radiusX,n.length,n.radiusZ);case"frustum":return new M.CylinderGeometry(n.radiusTop,n.radiusBottom,n.height,e);case"sphere":return new M.SphereGeometry(1,e,Math.max(4,Math.round(e/2))).scale(n.radiusX,n.radiusY,n.radiusZ);case"roundedBox":case"roundedBoxXZ":{const e="roundedBox"===t.provider?n.round:n.roundX,i="roundedBox"===t.provider?n.round:n.roundZ,s=Pw(n.width,n.depth,e,i);return s?Cw(s,n.height,n.height/2):new M.BufferGeometry}case"hollowBox":case"hollowBoxXZ":{const e="hollowBox"===t.provider?n.round:n.roundX,i="hollowBox"===t.provider?n.round:n.roundZ,s=Pw(n.width,n.depth,e,i),r=Pw(n.width-2*n.wallX,n.depth-2*n.wallZ,Math.max(e-n.wallX,0),Math.max(i-n.wallZ,0));if(!s||!r)return new M.BufferGeometry;const o=n.height,a=Math.max(n.floor,0),c=o-a,l=new M.Shape(s.getPoints(8));l.holes=[new M.Path(r.getPoints(8).reverse())];const h=Cw(l,c,o/2);if(a<=0)return h;const d=Cw(s,a,-o/2+a);return x.mergeGeometries([d,h],!1)??h}case"polygon":{const e=t.profile??[];if(e.length<3)return new M.BufferGeometry;const i=new M.Shape;i.moveTo(e[0].x,e[0].y);for(let t=1;t<e.length;t++)i.lineTo(e[t].x,e[t].y);return i.closePath(),Cw(i,n.height,n.height/2)}case"portal":{const e=t.profile??[];if(e.length<3)return new M.BufferGeometry;const i=new M.Shape;i.moveTo(e[0].x,e[0].y);for(let t=1;t<e.length;t++)i.lineTo(e[t].x,e[t].y);i.closePath();const s=new M.ExtrudeGeometry(i,{steps:1,depth:n.depth,bevelEnabled:!1});return s.translate(0,0,-n.depth/2),s}}}(t,e);return s.userData.v3Key=n,mA.set(n,{geometry:s,users:1}),s}function yA(t){const e=t.userData.v3Key;if(!e)return;const n=mA.get(e);n&&--n.users<=0&&(mA.delete(e),n.geometry.dispose())}class bA{constructor(t,e={}){this.group=new M.Group,this.meshes=new Map,this.size=null,this.external={},this.clipTimes=new Map,this.last=null,this.compiled=pA(t),this.theme=e.theme??{},this.group.name=`figure-v3:${t.name}`}get asset(){return this.compiled.asset}get base(){const t=this.asset.designInputs,e=e=>"number"==typeof t[e];return e(ZM.x)&&e(ZM.y)&&e(ZM.z)?{x:t[ZM.x],y:t[ZM.y],z:t[ZM.z]}:null}setSize(t){this.size=t}setState(t){this.external={...t}}static clipOf(t){return t.clip}get clips(){return[...new Set((this.asset.drivers??[]).map(t=>bA.clipOf(t)))]}setClipTime(t,e){this.clipTimes.set(t,e)}clipTime(t){return this.clipTimes.get(t)??0}setTime(t){for(const e of this.clips)this.clipTimes.set(e,t)}stateOverrides(){const t=new Map(this.asset.document.model.inputs.map(t=>[t.id,t.unit])),e={};for(const n of this.asset.drivers??[]){if(n.state in this.external)continue;const i=t.get(n.state);e[n.state]=CM(n,this.clipTime(bA.clipOf(n)),"deg"===i||"rad"===i?i:"other")}for(const[n,i]of Object.entries(this.external))t.has(n)&&(e[n]=i);return e}get externalState(){return{...this.external}}update(){const t=this.evaluate();this.last=t;const e=new Set;for(const n of t.geometry){if(!("pose"in n))continue;const t=n.id;e.add(t);let i=this.meshes.get(t);const s=!1!==n.visible,r=gA(n.shape,n.segments);i?i.geometry!==r?(yA(i.geometry),i.geometry=r):yA(r):(i=new M.Mesh(r,this.materialFor(n)),i.name=t,i.matrixAutoUpdate=!1,this.meshes.set(t,i),s&&this.group.add(i));const o=n.pose.r,a=n.pose.t;i.matrix.set(o[0][0],o[0][1],o[0][2],a[0],o[1][0],o[1][1],o[1][2],a[1],o[2][0],o[2][1],o[2][2],a[2],0,0,0,1),i.matrixWorldNeedsUpdate=!0,i.castShadow=s,s&&i.parent!==this.group?this.group.add(i):s||i.parent!==this.group||this.group.remove(i)}for(const[t,n]of this.meshes)e.has(t)||(n.parent===this.group&&this.group.remove(n),yA(n.geometry),this.meshes.delete(t));return t}evaluate(){const t={...this.asset.designInputs,...this.asset.stateDefaults,...this.stateOverrides()};this.size&&(t[ZM.x]=this.size.x,t[ZM.y]=this.size.y,t[ZM.z]=this.size.z);const e=this.compiled.document.evaluate(t),n=e.geometry.map(t=>{const e="key"in t&&t.key?this.compiled.writers.get(t.key):t.id,n=this.compiled.looks.get(e);if(!n)throw new Error(`figure-v3: no appearance for ${e}`);const i={...t,material:structuredClone(n.material)};return void 0!==n.segments&&(i.segments=n.segments),i});return{geometry:n,bindings:e.bindings,inputs:t,palette:{...this.asset.palette}}}colourOf(t){return this.theme[t]??this.asset.palette[t]??"#9a9a9a"}materialFor(t){const e=t.material,n=dd[e.preset??"default"]??dd.default,i=!!e.emissive?.on,s=i&&e.emissive?this.colourOf(e.emissive.token):this.colourOf(e.token),r=i&&e.emissive?e.emissive.intensity:0,o=`figure-v3|${this.compiled.fingerprint}|${e.token}|${e.preset??"default"}|${e.transparent?"t":"o"}|${i?"on":"off"}|${s}|${r}`;return Zv.material(o,{color:s,metalness:n.metalness,roughness:n.roughness,envMapIntensity:n.envMapIntensity,flatShading:!0,transparent:e.transparent??!1,opacity:e.transparent?n.opacity??.3:1,emissive:s,emissiveIntensity:r})}meshOf(t){return this.meshes.get(t)}drawnIds(){return this.group.children.map(t=>t.name)}dispose(){for(const t of this.meshes.values())t.parent===this.group&&this.group.remove(t),yA(t.geometry);this.meshes.clear()}}class _A extends iu{constructor(){super(...arguments),this.rig=null}get figure(){return t=this.component.state.type,fA.get(t)??null;var t}getObject3dInstance(){return new M.Group}build(){super.build();const t=this.figure;t&&(this.rig=new bA(t.compiled.asset),this.object3d.add(this.rig.group),this.rig.setSize(this.instanceSize()),this.rig.setState(this.parameters),this.rig.update(),this.startTicking())}get parameters(){const t=this.component.state.parameters;return t&&"object"==typeof t?t:{}}get clipSpeeds(){const t=this.component.state.clips;return t&&"object"==typeof t?t:{}}clipTime(t){return this.rig?.clipTime(t)??0}onchange(t,e){super.onchange(t,e),"parameters"in t&&this.updateParameters(),"clips"in t&&this.updateClips()}instanceSize(){const t=this.rig?.base;if(!t)return null;const{width:e,height:n}=this.component.bounds;return{x:e,y:this.effectiveDepth,z:n}}get effectiveDepth(){const t=this.component.state.depth;if("number"==typeof t&&Number.isFinite(t)&&t>0)return t;const e=this.rig?.base;if(!e)return super.effectiveDepth;const{width:n,height:i}=this.component.bounds,s=e.x>0?n/e.x:1,r=e.z>0?i/e.z:1;return e.y*Math.sqrt(Math.max(s,0)*Math.max(r,0))}updateDimension(){this.rig&&(this.rig.setSize(this.instanceSize()),this.refresh())}updateParameters(){this.rig&&(this.rig.setState(this.parameters),this.refresh())}updateClips(){this.rig&&(this.startTicking(),this.component.invalidate?.())}refresh(){this.rig&&(this.rig.update(),this.component.invalidate?.())}startTicking(){const t=this.rig?.asset.drivers??[];this.unsubscribe||0===t.length||(this.unsubscribe=yr.subscribe(t=>this.advance(t),{description:`FigureV3[${this.component.state.type}].drivers`,component:this.component,getTargets:()=>this.rig?[this.rig.group]:[]}))}tick(t){const e=this.rig;if(!e)return;const n=this.clipSpeeds;let i=!1;for(const s of e.clips){const r=n[s]??0;Number.isFinite(r)&&0!==r&&(e.setClipTime(s,e.clipTime(s)+t/1e3*r),i=!0)}i&&(e.update(),this.component.invalidate?.())}advance(t){this.tick(t)}clear(){return this.unsubscribe?.(),this.unsubscribe=void 0,this.rig?.dispose(),this.rig=null,super.clear()}}const vA=Iw,xA=Object.freeze({Capacity:t=>Vb(t),Holdable:t=>J_(t),Transferable:t=>tv(t),FlowNode:t=>ev(t)}),wA=Object.freeze({Capacity:"자리를 갖는다 — 물건이 앉을 곳과 몇 개까지인지를 정한다",Holdable:"물건을 보유한다 — 담긴 것을 함께 들고 그린다",Transferable:"주고받는다 — 자리를 잡아 두고 넘겨받는다. Capacity 가 있어야 자리를 찾는다",FlowNode:"흐름의 마디다 — 담는 것에 더해 문(port)으로 받고 보낸다. 위의 셋을 스스로 포함한다"});function MA(t){return{x:t.x,y:t.z,z:t.y}}function SA(t,e,n){if(t.repeat){const i=XM(t,e,n);if(i)return i.count}return t.capacity??1}function AA(t,e,n){const i=[];for(const s of t){if(!s.roles.includes("slot"))continue;const t={id:s.name,maxCount:SA(s,e,n)};s.accepts&&s.accepts.length>0&&(t.allowedTypes=[...s.accepts]),i.push(t)}return i}function EA(t,e,n){return t.filter(t=>t.roles.includes(e)).map(t=>({id:t.name,position:MA(n?.(t)??t.transform.position)}))}const kA=new Map;function CA(t,e=[],n){const i=new Set(e),s=[...i].filter(t=>!vA.includes(t));if(s.length>0)throw new Error(`모르는 능력이다: ${s.join(" · ")} — 쓸 수 있는 것은 ${vA.join(" · ")}`);for(const[t,e]of Object.entries(Rw))if(i.has(t)&&!e.some(t=>i.has(t)))throw new Error(`${t} 은 혼자 설 수 없다 — ${e.join(" 이나 ")} 가 함께 있어야 한다`);const r=`${[...i].sort().join("+")}|${n??""}`,o=kA.get(r);if(o)return o;const a=0===i.size?t:(c=function(t,e){const n=t.capabilities??[],i=[...new Set([...n,...e])];return Object.defineProperty(t,"capabilities",{value:Object.freeze(i),configurable:!0}),t}(function(t,e){if(e.has("FlowNode"))return xA.FlowNode(t);let n=t;for(const t of["Capacity","Transferable","Holdable"])e.has(t)&&(n=xA[t](n));return n}(t,i),i),class extends c{get _blueprint(){return this.figure?.blueprint??null}get slots(){const t=this._blueprint;return t?.anchors?.length?AA(t.anchors,this.instanceScale,t.base):super.slots??[]}get _posed(){const t=this._realObject;return"function"==typeof t?.anchorPosition?e=>t.anchorPosition(e):void 0}attachPointFor(t,e){const n=()=>super.attachPointFor?super.attachPointFor(t,e):null,i=this._blueprint;if(!i?.anchors?.length)return n();const s=e?.slotId??t?.[Fb];if(!s)return n();const r=i.anchors.find(t=>t.name===s&&t.roles.includes("slot"));if(!r)return n();const o=this._realObject;return o?.anchorAttachment?.(r)??n()}inboundPorts(){const t=this._blueprint;return t?.anchors?.length?EA(t.anchors,"port-in",this._posed):super.inboundPorts?.()??[]}outboundPorts(){const t=this._blueprint;return t?.anchors?.length?EA(t.anchors,"port-out",this._posed):super.outboundPorts?.()??[]}});var c;const l=void 0===n?a:function(t,e){const n=class extends t{};return Object.defineProperty(n,"placement",{value:e,enumerable:!0}),Object.defineProperty(n,"name",{value:`${t.name??"Figure"}·${e}`}),n}(a,n);return kA.set(r,l),l}function TA(){kA.clear()}const PA={mutable:!1,resizable:!0,rotatable:!0,properties:[],help:"scene/component/figure"};class OA extends(pc(dc)){static registerType(t,e=[],n){const i=hc.register(t);if(i&&!(i===OA||i.prototype instanceof OA))throw new Error(`figure type '${t}' is already registered by a non-figure component — refusing to replace it`);const s=CA(OA,e,n);hc.register(t,s)}get instanceScale(){const t=this.figure,{width:e=0,height:n=0}=this.state;if(!t)return{x:1,y:1,z:1};const{base:i}=t.blueprint,s=i.x>0?e/i.x:1,r=i.z>0?n/i.z:1;return{x:s,y:this.depthScale(i,s,r),z:r}}get hasTextProperty(){return!1}is3dish(){return!0}get nature(){return PA}buildRealObject(){return t=this.state.type,fA.has(t)?new _A(this):new hA(this);var t}get figure(){return xS(this.state.type)}render(t){const e=this.figure,{left:n=0,top:i=0,width:s=0,height:r=0}=this.state;if(!e)return void this.renderMissing(t,n,i,s,r);const{base:o}=e.blueprint,a=o.x>0?s/o.x:1,c=o.z>0?r/o.z:1,l=n+s/2,h=i+r/2,d=this.instanceScale;for(const n of e.paintOrder)t.fillStyle=n.color,t.beginPath(),this.tracePart(t,n,l,h,a,c,d,o),t.fill()}depthScale(t,e,n){const i=this.state.depth;return"number"==typeof i&&Number.isFinite(i)&&i>0?t.y>0?i/t.y:1:Math.sqrt(Math.max(e,0)*Math.max(n,0))}tracePart(t,e,n,i,s,r,o,a){const{member:c}=e,l=UM(c,o,a),h=n+l.x*s,d=i+l.z*r,u=$M(c,o,a),p=s*u.x,f=r*u.z,m=XM(c,o,a);if(m&&"y"!==m.axis&&m.count>1)for(let n=0;n<m.count;n++){const i=QM(n,m.count,m.pitch);this.traceOne(t,e,"x"===m.axis?h+i*s:h,"z"===m.axis?d+i*r:d,p,f)}else this.traceOne(t,e,h,d,p,f)}traceOne(t,e,n,i,s,r){const{member:o}=e,{size:a,rotation:c}=o.transform,l=c?.x??0,h=c?.y??0,d=c?.z??0;if(0!==l||0!==d){const e=function(t,e,n,i){const s=Math.PI/180,r=Math.cos(e*s),o=Math.sin(e*s),a=Math.cos(n*s),c=Math.sin(n*s),l=Math.cos(i*s),h=Math.sin(i*s),d=a*l,u=-a*h,p=c,f=o*h-r*c*l,m=o*l+r*c*h,g=r*a,y=t.x/2,b=t.y/2,_=t.z/2;return{u:Math.abs(d)*y+Math.abs(u)*b+Math.abs(p)*_,v:Math.abs(f)*y+Math.abs(m)*b+Math.abs(g)*_}}(a,l,h,d);return void t.rect(n-e.u*s,i-e.v*r,2*e.u*s,2*e.v*r)}if(0!==h)return t.save(),t.translate(n,i),t.rotate(-h*Math.PI/180),this.traceShape(t,e,0,0,s,r),void t.restore();this.traceShape(t,e,n,i,s,r)}traceShape(t,e,n,i,s,r){const{member:o}=e,{size:a}=o.transform,c=a.x*s,l=a.z*r,h=n-c/2,d=i-l/2,u=o.shape?.hollow;if(u&&u.wall>0){const e=zw({polygon:"polygon"===o.primitive,width:a.x,depth:a.z,round:o.shape?.round,path:o.shape?.path,hollow:u});if(e){for(const o of e)if(!(o.length<3)){t.moveTo(n+o[0].x*s,i+o[0].y*r);for(let e=1;e<o.length;e++)t.lineTo(n+o[e].x*s,i+o[e].y*r);t.closePath()}return}}switch(o.primitive){case"cylinder":case"sphere":{const e=dx(c/2,l/2,kx(o.segments,Sx[0])).points;t.moveTo(n+e[0].x,i+e[0].y);for(let s=1;s<e.length;s++)t.lineTo(n+e[s].x,i+e[s].y);return void t.closePath()}case"polygon":{const e=o.shape?.path;if(!e||e.length<3)return;t.moveTo(n+e[0].x*s,i+e[0].y*r);for(let o=1;o<e.length;o++)t.lineTo(n+e[o].x*s,i+e[o].y*r);return void t.closePath()}default:{const e=o.shape?.round??0;if(e>0&&"function"==typeof t.roundRect)return void t.roundRect(h,d,c,l,Math.min(e*s,c/2,l/2));t.rect(h,d,c,l)}}}renderMissing(t,e,n,i,s){t.save(),t.strokeStyle="#e53935",t.lineWidth=1,t.setLineDash([4,4]),t.beginPath(),t.rect(e,n,i,s),t.stroke(),t.restore()}postrender(t){hc.prototype.postrender.call(this,t)}}gS(OA);const DA={mutable:!1,resizable:!0,rotatable:!0,properties:[],help:"scene/component/figure-part"},zA=new M.Vector3,IA=["cylinder","sphere"],RA=["rect","polygon"],jA=["primitive","round","path","hollow"],LA=["width","height"],FA=["width","height","depth"],NA=["token","preset","flatShading","transparent","emissive"];function BA(t,e,n,i,s){return{polygon:"polygon"===e,width:n,depth:i,height:s,round:t.round,path:t.path,hollow:t.hollow}}function HA(t){return t.state}class $A extends iu{constructor(){super(...arguments),this._copies=[]}build(){super.build();const t=HA(this.component).primitive??"cube",e=RA.includes(t)?this.extrudedGeometry(t):this.unitGeometry(t);if(!e)return;const n=new M.Mesh(e,this.material());n.castShadow=!0,this.object3d.add(n),this._copies=[n],this.updateDimension()}clear(){return this._copies=[],super.clear()}applyRepeat(){const t=this._copies[0];if(!t)return;const e=this.repeatPlanNow();if(!e)return void this._copies.forEach((t,e)=>{t.visible=0===e,t.position.set(0,0,0)});for(;this._copies.length<e.count;){const e=new M.Mesh(t.geometry,t.material);e.castShadow=!0,this.object3d.add(e),this._copies.push(e)}const n=this.repeatUndo();this._copies.forEach((t,i)=>{t.visible=i<e.count,t.visible&&(zA.set(0,0,0),zA[e.axis]=QM(i,e.count,e.pitch),zA.applyQuaternion(n.turn),t.position.set(zA.x*n.scale.x,zA.y*n.scale.y,zA.z*n.scale.z))})}updateRotate(){super.updateRotate(),this.applyRepeat()}onchange(t,e){const n=e=>e.some(e=>e in t);n(jA)||this.isExtruded&&n(this.isHollow?FA:LA)?this.update():(super.onchange(t,e),n(NA)&&this.applyMaterial(),n(["sizing","repeat"])&&this.applyRepeat())}get isExtruded(){return RA.includes(HA(this.component).primitive??"cube")}applyMaterial(){const t=this.material();for(const e of this._copies)e.material=t}repeatPlanNow(){const t=HA(this.component);if("repeat"!==t.sizing||!t.repeat)return null;const e=this.component.parent;if(!e)return null;const n={x:Number(e.get("width"))||0,y:Number(e.get("depth"))||0,z:Number(e.get("height"))||0};return XM(this.asMember(t),{x:1,y:1,z:1},n)}asMember(t){const e=this.component.state,n=t=>180*(t??0)/Math.PI;return{name:"",primitive:t.primitive??"cube",geometryKey:"",triangles:0,sizing:"repeat",repeat:t.repeat,transform:{position:{x:0,y:0,z:0},size:{x:Number(e.width)||0,y:this.effectiveDepth,z:Number(e.height)||0},rotation:{x:n(e.rotationX),y:-n(e.rotation),z:n(e.rotationY)}}}}repeatUndo(){const t=this.object3d,e=t=>Number.isFinite(t)&&0!==t?1/t:1;return{turn:t.quaternion.clone().invert(),scale:new M.Vector3(e(t.scale.x),e(t.scale.y),e(t.scale.z))}}updateScale(){super.updateScale(),this.applyRepeat()}syncFromObject3D(){super.syncFromObject3D(),this.applyRepeat()}applyDimensionFromGizmo(t){super.applyDimensionFromGizmo(t),this.applyRepeat()}unitGeometry(t){const e=HA(this.component);return"cylinder"===t||"sphere"===t?Mx.primitive({kind:t,segments:kx(e.segments,Sx[0])}):Mx.primitive({kind:"box"})}extrudedGeometry(t){const e=HA(this.component),{width:n=1,height:i=1}=this.component.state,s=e.hollow,r=BA(e,t,n,i,s&&this.component.state.depth||1),o="polygon"===t?`polygon|${JSON.stringify(r.path??[])}`:`rect|${n}x${i}|r${r.round??0}`,a=s?`figure-part|${o}|h${s.wall},${s.floor??s.wall}@${r.height}`:`figure-part|${o}`,c=Mx.shaped(a,()=>kw(r)??new M.BufferGeometry);return c.getAttribute("position")?c:null}material(){const t=HA(this.component),e=dd[t.preset??"default"]??dd.default,n=t.token?dS(t.token):uS,i=t.flatShading??!0,s=t.transparent??!1,r=t.emissive,o=r?.token?dS(r.token):n,a=r?.intensity??0;return Zv.material(`figure-part|${t.token??"-"}|${t.preset??"default"}|${i}|${s}|`+(r?`${r.token??"="}:${a}`:"-"),{color:o,metalness:e.metalness,roughness:e.roughness,envMapIntensity:e.envMapIntensity,flatShading:i,transparent:s,opacity:s?e.opacity??.3:1,emissive:o,emissiveIntensity:a})}get isHollow(){const t=HA(this.component).hollow;return!!t&&t.wall>0&&this.isExtruded}updateDimension(){const{width:t=1,height:e=1}=this.component.bounds,n=this.effectiveDepth,i=HA(this.component).primitive??"cube";this.isHollow?this.setDimensionScale(1,1,1):RA.includes(i)?this.setDimensionScale(1,n,1):this.setDimensionScale(t,n,e),this.applyRepeat()}}class GA extends(pc(dc)){static registerType(){hc.register("figure-part",GA)}get hasTextProperty(){return!1}is3dish(){return!0}get nature(){return DA}buildRealObject(){return new $A(this)}render(t){const{left:e=0,top:n=0,width:i=0,height:s=0}=this.state,r=HA(this);t.beginPath(),this.traceFootprint(t,r,e,n,i,s),t.fillStyle=r.token?dS(r.token):uS,t.fill()}traceFootprint(t,e,n,i,s,r){const o=e.primitive??"cube",a=n+s/2,c=i+r/2;if(IA.includes(o)){const n=dx(s/2,r/2,kx(e.segments,Sx[0])).points;t.moveTo(a+n[0].x,c+n[0].y);for(let e=1;e<n.length;e++)t.lineTo(a+n[e].x,c+n[e].y);return void t.closePath()}if(e.hollow&&e.hollow.wall>0){const n=zw(BA(e,o,s,r,1));if(n){for(const e of n)if(!(e.length<3)){t.moveTo(a+e[0].x,c+e[0].y);for(let n=1;n<e.length;n++)t.lineTo(a+e[n].x,c+e[n].y);t.closePath()}return}}if("polygon"===o){const n=e.path;if(!n||n.length<3)return;t.moveTo(a+n[0].x,c+n[0].y);for(let e=1;e<n.length;e++)t.lineTo(a+n[e].x,c+n[e].y);return void t.closePath()}const l=e.round??0;l>0&&"function"==typeof t.roundRect?t.roundRect(n,i,s,r,Math.min(l,s/2,r/2)):t.rect(n,i,s,r)}}var VA;GA.registerType(),t.Model=void 0,(VA=t.Model||(t.Model={})).compile=bl,VA.duplicate=_l,VA.select=La,VA.match=Ia,Ai.registerResidents(()=>({componentResidentsCount:hc.residentsCount,sceneResidentsCount:zu.residentsCount,referenceMapResidentsCount:Iv.residentsCount,sceneResidents:hc.residents}));var UA=Object.freeze({__proto__:null,AbsoluteLayout:xc,Animation:aa,AudioPlayer:Gy,BULGE_EPSILON:Pr,get Banner(){return t.Banner},Banner3D:Bx,BoxSelectionManager:bf,CAPABILITY_MIXINS:xA,COMMON_PLACEHOLDER_PROPERTIES:dy,CORE_PLACEHOLDER_TYPES:my,get Camera(){return t.Camera},Camera3D:Vx,CameraBookmarkManager:yf,CameraManager:ef,Capacity:Vb,CapacityEventTracker:Eb,CardLayout:Mc,CenteringQueueStrategy:Cb,CenteringSlotStrategy:dv,Component:hc,Connectable:Nf,Container:Wg,ContainerAbstract:Rl,ControlsManager:of,get Cube(){return t.Cube},Cube3D:jx,get Cylinder(){return t.Cylinder},Cylinder3D:Fx,DEFAULT:Ds,DEFAULT_CEILING:tu,DEFAULT_PALETTE:nS,DEFAULT_PLACEMENT:qd,DPPX:Ts,DataLagTracker:Bl,DataSource:bb,DefaultLoadingOverlayRenderer:Ad,Donut:cb,DonutExtrude:bx,Ellipse:ly,EllipseExtrude:fx,EventManager3D:af,EventMap:Kc,FIGURE_CAPABILITIES:vA,FIGURE_CAPABILITY_NOTES:wA,FPS:xp,FigureInstance:OA,FigurePart:GA,FigurePartRealObject:$A,FigureRealObject:hA,FixedSlotStrategy:Hb,get FloorPlate(){return t.FloorPlate},FlowEngine:Z_,FlowNode:ev,GESTURES:Ps,get GLTFObject(){return t.GLTFObject},GLTF_BASE_URL_ALIAS:vb,GenericObject:fy,GeometryBank:Mx,GifView:Hy,GizmoManager:lf,GizmoOperationManager:uf,GlobalRef:Qy,GltfComponent:wb,GridStacking:Ob,Group:Yy,HTMLAbsoluteLayout:vc,HTMLOverlayContainer:Xy,HTMLOverlayElement:Ty,Holdable:J_,ImageView:Cy,InfoWindow:yc,InstancedSet:yw,InteractionManager:pf,ItemsDataBinding:Bb,KEYEVENTS:Os,Layer:Ju,Layout:_c,LightManager:sf,LightObject:Wx,Line:ay,Line3D:fw,LinearHorizontalLayout:Ac,LinearVerticalLayout:kc,LoadTracker:Gl,LoadingOverlay:yd,LocalRef:qy,MATERIAL_PRESETS:dd,MAX_SEGMENTS:Ex,MAX_UNDO_SIZE:30,MIN_SEGMENTS:3,MODE_ADD:3,MODE_EDIT:1,MODE_PASTE_DATABIND:5,MODE_PASTE_STYLE:4,MODE_SHIFT:2,MODE_VIEW:0,MaterialBank:Zv,get Model(){return t.Model},MoveHandle:zl,NOTHING:ks,NavGraph:yv,Node:pb,OrthoLine:Ey,OrthoLine3D:gw,PIXEL_RATIO:wp,PLACEHOLDER_THEMES:hy,Path:ib,PatternStacking:Pb,PlacementManager:ff,get PointLight(){return t.PointLight},Polygon:_y,PolygonContainer:xy,PolygonExtrude:yx,PolygonPathPolyline:Sv,Polyline:Sy,Polyline3D:mw,Popup:tb,PopupContainer:nb,Pose6DOF:nl,REPEAT_LIMIT:KM,RealObject:iu,RealObjectCamera:xw,RealObjectDomElement:Pp,RealObjectDomTexture:qv,RealObjectDummy:_w,RealObjectExternalModel:ou,RealObjectExtrude:px,RealObjectGLTF:hu,RealObjectGroup:nw,RealObjectLine:pw,RealObjectMesh:Jv,RealObjectPlane:ww,RealObjectPlane2D:Aw,RealObjectScene:Mw,RealObjectService:fb,RealObjectSprite:Dx,RealObjectSprite2D:zx,RealObjectText:ox,Rect:$f,RectExtrude:mx,RectPath:pc,ReferenceMap:Iv,RendererManager:nf,ReservationTable:mv,RootContainer:Nl,Ruler:Vf,SCALE_MIN:Id,SCENE_MODE:Cs,SEGMENT_DEFAULTS:Ax,SEGMENT_PRESETS:Sx,SHORTCUT_SECTIONS:Of,Scene:zu,SceneManager:tf,ScenePopup:Zu,SceneSearchEngine:mu,ScriptLoader:Hv,SearchOverlay:yu,ServiceComponent:gb,Shape:dc,get Sphere(){return t.Sphere},Sphere3D:Ox,get Sprite(){return t.Sprite},Star:db,StarExtrude:vx,TRANSFER_SLOT_KEY:Fb,TableLayout:Cc,Text:Vy,ThreeCapability:Sf,get ThreeContainer(){return t.ThreeContainer},ThreeDOnly:_b,Tracker:_u,Transfer:Tu,TransitionEffect:Dl,Triangle:rb,TriangleExtrude:_x,UNIT_DIMENSION:Fd,UNIT_ROTATE:Hd,UNIT_SCALE:Nd,UNIT_TRANSLATE:Bd,UNTOKENED_COLOR:uS,ValueHolder:yb,VertexGizmoManager:Mf,VolumeStacking:Db,get Wall(){return t.Wall},Wall3D:Xx,Z_PRIORITY:Kd,activePalette:hS,activePaletteName:lS,allDestinations:N_,anchorOf:zM,anchorsConnect:Kb,animate:oa,applyAlpha:jd,applyMaterial3dProps:md,applyPolicy:$_,applySeatingRotation:Lb,applyStackLayout:zb,applyZPriorityToMaterials:Zd,arcSegmentTopology:qb,autoWireBackPressure:kb,blueprintProblems:eS,buildArrow3D:Cp,buildContractInspector:Pv,buildCoordinateGround:Bp,buildFlowGraph:e_,buildNavGraph:vv,buildShapeFromPolygonPath:gx,buildTether:Gu,bulgeFromDrag:Ir,bulgeHandlePosition:zr,canReach:o_,capability:Sm,centerOnBBox:ux,chooseNearestPickupFrame:hv,clearTether:Uu,collectAdjacentSegments:d_,compile:la,componentForNode:F_,computeArcParams:Dr,computeFlowMap:E_,computeStackPositions:Tb,cornerHandlePosition:jr,cornerRadiusFromDrag:Lr,create:Ru,createCanvas:Mp,createCanvasTexture:Vv,createFloor:Qp,createRealObjectFor:Rp,createSelectionHandle3D:Zx,dataLagTracker:Hl,debug:$i,deliversInto:Jb,delta:sa,disposeCoordinateGround:Vp,disposeObject3D:Vd,disposeTether:Yu,downstream:U_,drawTextTexture:nx,effectiveCornerRadius:Rr,ellipseOutline:dx,enumerateDataScenarios:m_,error:Bi,figureClassFor:CA,figureTypes:wS,fillStyleOpacity:Rd,filterByToolType:lv,filterShortcuts:Df,findNearestWithCapability:T_,flattenPolygonPath:Av,flowGraphFor:j_,flowGraphIssues:R_,flowReverseFor:k_,fontStyle:tx,footprint2D:Ib,frameClock:yr,ftId:w_,ftrace:x_,getAllCapabilityMeta:Cm,getCapabilityMeta:km,getFigure:xS,getPose:al,getWorldPose:cl,globalSimClock:mr,gltfNatureProperties:xb,graphFor:X_,gridPlacements:bw,hasArc:Or,hasCapability:Mm,hasCapacity:Sb,hasFigure:MS,inferCapacity:Ab,inferDownstreamId:u_,inferFlowDirections:v_,initFontFamilyWatcher:Is,innerOutlineOf:Dw,inspector:gd,installContractInspector:Ov,isFlowNode:nv,isGenericPlaceholder:gy,isGeometricHost:C_,isParted:su,isRoutingTarget:P_,isSegmentPreset:Tx,isStateDriven:Xd,isThreedEnabled:uu,jointOriginPosition:YM,matchOutbounds:t_,memberGeometry:jS,memberGeometryAtOrigin:FS,memberGeometryTurned:LS,mergedGeometryOf:NS,metrics:Ai,needsOwnMesh:FM,next:V_,nextHop:r_,nextHops:s_,nextHopsToAny:c_,nextHopsToAnyDetailed:l_,niceGridStep:Fp,nodeIdOf:B_,normalizeParameter:eA,opaqueColor:Ld,outlineOf:Tw,outlinesFor2D:zw,paletteVersion:oS,partAtByIndex:ru,pickWeightedDestination:Q_,planPathAStar:xv,planToReservations:wv,pointInRotatedRect:Qb,polygonOffsetForPriority:Qd,polygonPathLength:Ev,portsFromAnchors:EA,profileGeometry:kw,projectToScreen:Nu,pushed:Cw,quatFromYaw:sv,rayAbsDistanceToRect:Zb,reachableByOutbound:n_,reachableDestinations:Y_,reachableDestinationsFrom:W_,reachableDestinationsWeightedFrom:q_,reachableSinks:a_,receiptToJSON:ku,recommendsLogarithmicDepthForSky:Jp,rectFaceAnchors:Ub,rectOutline:hx,rectangularFootprintFrames:av,registerCapabilityMeta:Em,registerDefaultRealObjectFactory:Ip,registerFigure:_S,registerFigureType:vS,registerPalette:aS,registerRealObjectFactory:zp,registerTypeResolver:yh,renderCanvasTexture:Uv,renderPlaceholder:uy,repeatOffset:QM,repeatPlan:XM,reservationTable:gv,resetFigureClasses:TA,resetFigures:AS,resetPalettes:pS,resolveAnchorWorldPosition:$u,resolveHeightSegments:Cx,resolveMaterial3d:ud,resolveNextHop:G_,resolveSegments:kx,resolveToken:dS,resolveUnknownTypes:_h,resolveVariant:Od,rotatedExtent:BM,roundedRect:Ow,roundedRectXZ:Pw,sceneComponent:Mb,setActivePalette:cS,setPose:ll,setThreedEnabled:pu,setWorldPose:hl,sinksForDestination:L_,sizingPosition:UM,sizingScale:$M,slotsFromAnchors:AA,standardYieldPolicy:fv,stopFPSMeasure:vp,straightSegmentEndpoints:Wb,straightSegmentMultiInbound:Xb,straightSegmentTopology:Yb,stretchAxis:HM,sweepOf:sA,textBounds:rx,textTexture:ix,toThreeSide:fd,topApproachFrame:cv,transferLog:Pu,transferTracer:Au,uniformZ:Fr,unknownTypesOf:bh,unregisterFigure:SS,updateDefaultFontFamily:zs,updateTether:Vu,useFigureComponent:gS,validate:K_,validateFlowGraph:h_,valueNow:nA,valueOf:iA,version:$v,warn:Hi});const YA=globalThis;"undefined"==typeof globalThis||YA.scene||(YA.scene=UA),t.AbsoluteLayout=xc,t.Animation=aa,t.AudioPlayer=Gy,t.BULGE_EPSILON=Pr,t.Banner3D=Bx,t.BoxSelectionManager=bf,t.CAPABILITY_MIXINS=xA,t.COMMON_PLACEHOLDER_PROPERTIES=dy,t.CORE_PLACEHOLDER_TYPES=my,t.Camera3D=Vx,t.CameraBookmarkManager=yf,t.CameraManager=ef,t.Capacity=Vb,t.CapacityEventTracker=Eb,t.CardLayout=Mc,t.CenteringQueueStrategy=Cb,t.CenteringSlotStrategy=dv,t.Component=hc,t.Connectable=Nf,t.Container=Wg,t.ContainerAbstract=Rl,t.ControlsManager=of,t.Cube3D=jx,t.Cylinder3D=Fx,t.DEFAULT=Ds,t.DEFAULT_CEILING=tu,t.DEFAULT_PALETTE=nS,t.DEFAULT_PLACEMENT=qd,t.DPPX=Ts,t.DataLagTracker=Bl,t.DataSource=bb,t.DefaultLoadingOverlayRenderer=Ad,t.Donut=cb,t.DonutExtrude=bx,t.Ellipse=ly,t.EllipseExtrude=fx,t.EventManager3D=af,t.EventMap=Kc,t.FIGURE_CAPABILITIES=vA,t.FIGURE_CAPABILITY_NOTES=wA,t.FPS=xp,t.FigureInstance=OA,t.FigurePart=GA,t.FigurePartRealObject=$A,t.FigureRealObject=hA,t.FixedSlotStrategy=Hb,t.FlowEngine=Z_,t.FlowNode=ev,t.GESTURES=Ps,t.GLTF_BASE_URL_ALIAS=vb,t.GenericObject=fy,t.GeometryBank=Mx,t.GifView=Hy,t.GizmoManager=lf,t.GizmoOperationManager=uf,t.GlobalRef=Qy,t.GltfComponent=wb,t.GridStacking=Ob,t.Group=Yy,t.HTMLAbsoluteLayout=vc,t.HTMLOverlayContainer=Xy,t.HTMLOverlayElement=Ty,t.Holdable=J_,t.ImageView=Cy,t.InfoWindow=yc,t.InstancedSet=yw,t.InteractionManager=pf,t.ItemsDataBinding=Bb,t.KEYEVENTS=Os,t.Layer=Ju,t.Layout=_c,t.LightManager=sf,t.LightObject=Wx,t.Line=ay,t.Line3D=fw,t.LinearHorizontalLayout=Ac,t.LinearVerticalLayout=kc,t.LoadTracker=Gl,t.LoadingOverlay=yd,t.LocalRef=qy,t.MATERIAL_PRESETS=dd,t.MAX_SEGMENTS=Ex,t.MAX_UNDO_SIZE=30,t.MIN_SEGMENTS=3,t.MODE_ADD=3,t.MODE_EDIT=1,t.MODE_PASTE_DATABIND=5,t.MODE_PASTE_STYLE=4,t.MODE_SHIFT=2,t.MODE_VIEW=0,t.MaterialBank=Zv,t.MoveHandle=zl,t.NOTHING=ks,t.NavGraph=yv,t.Node=pb,t.OrthoLine=Ey,t.OrthoLine3D=gw,t.PIXEL_RATIO=wp,t.PLACEHOLDER_THEMES=hy,t.Path=ib,t.PatternStacking=Pb,t.PlacementManager=ff,t.Polygon=_y,t.PolygonContainer=xy,t.PolygonExtrude=yx,t.PolygonPathPolyline=Sv,t.Polyline=Sy,t.Polyline3D=mw,t.Popup=tb,t.PopupContainer=nb,t.Pose6DOF=nl,t.REPEAT_LIMIT=KM,t.RealObject=iu,t.RealObjectCamera=xw,t.RealObjectDomElement=Pp,t.RealObjectDomTexture=qv,t.RealObjectDummy=_w,t.RealObjectExternalModel=ou,t.RealObjectExtrude=px,t.RealObjectGLTF=hu,t.RealObjectGroup=nw,t.RealObjectLine=pw,t.RealObjectMesh=Jv,t.RealObjectPlane=ww,t.RealObjectPlane2D=Aw,t.RealObjectScene=Mw,t.RealObjectService=fb,t.RealObjectSprite=Dx,t.RealObjectSprite2D=zx,t.RealObjectText=ox,t.Rect=$f,t.RectExtrude=mx,t.RectPath=pc,t.ReferenceMap=Iv,t.RendererManager=nf,t.ReservationTable=mv,t.RootContainer=Nl,t.Ruler=Vf,t.SCALE_MIN=Id,t.SCENE_MODE=Cs,t.SEGMENT_DEFAULTS=Ax,t.SEGMENT_PRESETS=Sx,t.SHORTCUT_SECTIONS=Of,t.Scene=zu,t.SceneManager=tf,t.ScenePopup=Zu,t.SceneSearchEngine=mu,t.ScriptLoader=Hv,t.SearchOverlay=yu,t.ServiceComponent=gb,t.Shape=dc,t.Sphere3D=Ox,t.Star=db,t.StarExtrude=vx,t.TRANSFER_SLOT_KEY=Fb,t.TableLayout=Cc,t.Text=Vy,t.ThreeCapability=Sf,t.ThreeDOnly=_b,t.Tracker=_u,t.Transfer=Tu,t.TransitionEffect=Dl,t.Triangle=rb,t.TriangleExtrude=_x,t.UNIT_DIMENSION=Fd,t.UNIT_ROTATE=Hd,t.UNIT_SCALE=Nd,t.UNIT_TRANSLATE=Bd,t.UNTOKENED_COLOR=uS,t.ValueHolder=yb,t.VertexGizmoManager=Mf,t.VolumeStacking=Db,t.Wall3D=Xx,t.Z_PRIORITY=Kd,t.activePalette=hS,t.activePaletteName=lS,t.allDestinations=N_,t.anchorOf=zM,t.anchorsConnect=Kb,t.animate=oa,t.applyAlpha=jd,t.applyMaterial3dProps=md,t.applyPolicy=$_,t.applySeatingRotation=Lb,t.applyStackLayout=zb,t.applyZPriorityToMaterials=Zd,t.arcSegmentTopology=qb,t.autoWireBackPressure=kb,t.blueprintProblems=eS,t.buildArrow3D=Cp,t.buildContractInspector=Pv,t.buildCoordinateGround=Bp,t.buildFlowGraph=e_,t.buildNavGraph=vv,t.buildShapeFromPolygonPath=gx,t.buildTether=Gu,t.bulgeFromDrag=Ir,t.bulgeHandlePosition=zr,t.canReach=o_,t.capability=Sm,t.centerOnBBox=ux,t.chooseNearestPickupFrame=hv,t.clearTether=Uu,t.collectAdjacentSegments=d_,t.compile=la,t.componentForNode=F_,t.computeArcParams=Dr,t.computeFlowMap=E_,t.computeStackPositions=Tb,t.cornerHandlePosition=jr,t.cornerRadiusFromDrag=Lr,t.create=Ru,t.createCanvas=Mp,t.createCanvasTexture=Vv,t.createFloor=Qp,t.createRealObjectFor=Rp,t.createSelectionHandle3D=Zx,t.dataLagTracker=Hl,t.debug=$i,t.deliversInto=Jb,t.delta=sa,t.disposeCoordinateGround=Vp,t.disposeObject3D=Vd,t.disposeTether=Yu,t.downstream=U_,t.drawTextTexture=nx,t.effectiveCornerRadius=Rr,t.ellipseOutline=dx,t.enumerateDataScenarios=m_,t.error=Bi,t.figureClassFor=CA,t.figureTypes=wS,t.fillStyleOpacity=Rd,t.filterByToolType=lv,t.filterShortcuts=Df,t.findNearestWithCapability=T_,t.flattenPolygonPath=Av,t.flowGraphFor=j_,t.flowGraphIssues=R_,t.flowReverseFor=k_,t.fontStyle=tx,t.footprint2D=Ib,t.frameClock=yr,t.ftId=w_,t.ftrace=x_,t.getAllCapabilityMeta=Cm,t.getCapabilityMeta=km,t.getFigure=xS,t.getPose=al,t.getWorldPose=cl,t.globalSimClock=mr,t.gltfNatureProperties=xb,t.graphFor=X_,t.gridPlacements=bw,t.hasArc=Or,t.hasCapability=Mm,t.hasCapacity=Sb,t.hasFigure=MS,t.inferCapacity=Ab,t.inferDownstreamId=u_,t.inferFlowDirections=v_,t.initFontFamilyWatcher=Is,t.innerOutlineOf=Dw,t.inspector=gd,t.installContractInspector=Ov,t.isFlowNode=nv,t.isGenericPlaceholder=gy,t.isGeometricHost=C_,t.isParted=su,t.isRoutingTarget=P_,t.isSegmentPreset=Tx,t.isStateDriven=Xd,t.isThreedEnabled=uu,t.jointOriginPosition=YM,t.matchOutbounds=t_,t.memberGeometry=jS,t.memberGeometryAtOrigin=FS,t.memberGeometryTurned=LS,t.mergedGeometryOf=NS,t.metrics=Ai,t.needsOwnMesh=FM,t.next=V_,t.nextHop=r_,t.nextHops=s_,t.nextHopsToAny=c_,t.nextHopsToAnyDetailed=l_,t.niceGridStep=Fp,t.nodeIdOf=B_,t.normalizeParameter=eA,t.opaqueColor=Ld,t.outlineOf=Tw,t.outlinesFor2D=zw,t.paletteVersion=oS,t.partAtByIndex=ru,t.pickWeightedDestination=Q_,t.planPathAStar=xv,t.planToReservations=wv,t.pointInRotatedRect=Qb,t.polygonOffsetForPriority=Qd,t.polygonPathLength=Ev,t.portsFromAnchors=EA,t.profileGeometry=kw,t.projectToScreen=Nu,t.pushed=Cw,t.quatFromYaw=sv,t.rayAbsDistanceToRect=Zb,t.reachableByOutbound=n_,t.reachableDestinations=Y_,t.reachableDestinationsFrom=W_,t.reachableDestinationsWeightedFrom=q_,t.reachableSinks=a_,t.receiptToJSON=ku,t.recommendsLogarithmicDepthForSky=Jp,t.rectFaceAnchors=Ub,t.rectOutline=hx,t.rectangularFootprintFrames=av,t.registerCapabilityMeta=Em,t.registerDefaultRealObjectFactory=Ip,t.registerFigure=_S,t.registerFigureType=vS,t.registerPalette=aS,t.registerRealObjectFactory=zp,t.registerTypeResolver=yh,t.renderCanvasTexture=Uv,t.renderPlaceholder=uy,t.repeatOffset=QM,t.repeatPlan=XM,t.reservationTable=gv,t.resetFigureClasses=TA,t.resetFigures=AS,t.resetPalettes=pS,t.resolveAnchorWorldPosition=$u,t.resolveHeightSegments=Cx,t.resolveMaterial3d=ud,t.resolveNextHop=G_,t.resolveSegments=kx,t.resolveToken=dS,t.resolveUnknownTypes=_h,t.resolveVariant=Od,t.rotatedExtent=BM,t.roundedRect=Ow,t.roundedRectXZ=Pw,t.sceneComponent=Mb,t.setActivePalette=cS,t.setPose=ll,t.setThreedEnabled=pu,t.setWorldPose=hl,t.sinksForDestination=L_,t.sizingPosition=UM,t.sizingScale=$M,t.slotsFromAnchors=AA,t.standardYieldPolicy=fv,t.stopFPSMeasure=vp,t.straightSegmentEndpoints=Wb,t.straightSegmentMultiInbound=Xb,t.straightSegmentTopology=Yb,t.stretchAxis=HM,t.sweepOf=sA,t.textBounds=rx,t.textTexture=ix,t.toThreeSide=fd,t.topApproachFrame=cv,t.transferLog=Pu,t.transferTracer=Au,t.uniformZ=Fr,t.unknownTypesOf=bh,t.unregisterFigure=SS,t.updateDefaultFontFamily=zs,t.updateTether=Vu,t.useFigureComponent=gS,t.validate=K_,t.validateFlowGraph=h_,t.valueNow=nA,t.valueOf=iA,t.version=$v,t.warn=Hi});
|
|
72
|
+
`,this.element)}catch(t){}}onchangeMinimized(){const{minimized:t}=this.state;t?this.setState("height",24):this.setState("height",this.get("height"))}}Gg=new WeakMap,hc.memoize(Wg.prototype,"bounds",!0),hc.register("container",Wg);const qg=Math.sqrt(3),Xg=2;function Kg(t,e,n,i,s){const r=5+s,o=n.x,a=n.y,c=i.x,l=i.y;if(Math.abs(o-c)>r&&Math.abs(a-l)>r){const n=(l-a)/(c-o),i=a-n*o;if(Math.abs(e-(n*t+i))>r)return!1}let h,d,u,p;return o>c?(d=o,h=c):(d=c,h=o),a>l?(p=a,u=l):(p=l,u=a),!(d+5<t)&&(!(h-5>t)&&(!(p+5<e)&&!(u-5>e)))}function Qg(t,e,n,i=2){for(let s=0;s<n.length-1;s++)if(Kg(t,e,n[s],n[s+1],i))return!0;return!1}function Zg(t,e,n,i){if("arrow"!=t.slice(-5))return n;const s=Math.atan2(i.y-n.y,i.x-n.x),r=1.5*e;return{x:n.x+Math.cos(s)*r,y:n.y+Math.sin(s)*r}}function Jg(t,e,n){let{lineWidth:i=Xg,strokeStyle:s="#000000",lineCap:r=!1,alpha:o=1,begin:a="none",end:c="none",beginSize:l="size5",endSize:h="size5"}=n;if(("none"!=a||"none"!=c)&&(i=Number(i)||Xg,t.lineCap=r,t.lineWidth=i,t.strokeStyle=s,t.fillStyle=s,t.globalAlpha*=o,"none"!=a&&ty(t,e[0],e[1],i,a,ey(l,i)),"none"!=c)){const n=e.length;ty(t,e[n-1],e[n-2],i,c,ey(h,i))}}function ty(t,e,n,i,s,r){const{x:o,y:a}=e,c=Math.atan2(n.y-a,n.x-o);switch(t.beginPath(),t.translate(o,a),t.rotate(c),s){case"oval":t.ellipse(0,0,r.X,r.Y,0,0,2*Math.PI),t.fill();break;case"diamond":t.moveTo(-r.X,0),t.lineTo(0,-r.Y),t.lineTo(r.X,0),t.lineTo(0,r.Y),t.fill();break;case"arrow":t.moveTo(0,0),t.lineTo(qg*r.X,-r.Y),t.lineTo(qg*r.X,r.Y),t.fill();break;case"sharp-arrow":t.moveTo(0,0),t.lineTo(qg*r.X,-r.Y),t.lineTo(-r.X/1.5+qg*r.X,0),t.lineTo(qg*r.X,r.Y),t.fill();break;case"open-arrow":t.moveTo(qg*r.X+i,-r.Y),t.lineTo(i,0),t.lineTo(qg*r.X+i,r.Y),t.stroke();break;case"cross":t.moveTo(-r.X,-r.Y),t.lineTo(r.X,r.Y),t.moveTo(r.X,-r.Y),t.lineTo(-r.X,r.Y),t.stroke()}t.rotate(-c),t.translate(-o,-a),t.closePath()}function ey(t,e){const n={X:0,Y:0};switch(e*=1.2,t){case"size1":n.X=e,n.Y=e;break;case"size2":n.X=1.5*e,n.Y=e;break;case"size3":n.X=2*e,n.Y=e;break;case"size4":n.X=e,n.Y=1.5*e;break;case"size5":default:n.X=1.5*e,n.Y=1.5*e;break;case"size6":n.X=2*e,n.Y=1.5*e;break;case"size7":n.X=e,n.Y=2*e;break;case"size8":n.X=1.5*e,n.Y=2*e;break;case"size9":n.X=2*e,n.Y=2*e}return n}const ny="N",iy="S",sy="E",ry="W";class oy{constructor({component:t,anchor:e,position:n,self:i}){this.component=t,this._anchorName=e,this._position=n,this.self=i}get position(){const t=this.anchor;if(t){const{position:e}=t,n=this.component.toScene(e.x,e.y);return this.self.transcoordT2P(n.x,n.y)}return this._position}set position({x:t,y:e}){this._position={x:t,y:e}}get anchor(){return this.component?.findAnchor(this._anchorName)}get direction(){const t=this.component.bounds,e=this.anchor;if(!e)return sy;const n=e.position;return n.y<=t.top?ny:n.y>=t.top+t.height?iy:n.x<=t.left?ry:sy}get boundaryPosition(){const t=this.anchor;if(t){let{position:e}=t,n=0,i=0;switch(this.direction){case iy:i=20;break;case ny:i=-20;break;case ry:n=-20;break;default:n=20}e={x:e.x+n,y:e.y+i};const s=this.component.toScene(e.x,e.y);return this.self.transcoordT2P(s.x,s.y)}}}class ay extends hc{isLine(){return!0}is3dish(){return!0}replaceRefids(t){["from","to"].forEach(e=>{const n=this.get(e);if(n?.component){const i=t.get(n.component)||n.component;this.set(e,{...n,component:i})}})}get fromEnd(){if(this.parent&&!this._fromEnd){const{component:t,anchor:e,position:n}=this.getState("from")||{};if(!t)return;const i=this.root?.findByRefid?.(t);if(!i)return;this._fromEnd=new oy({component:i,fromto:"from",anchor:e,position:n,self:this})}return this._fromEnd}get from(){return this.getState("from")}set from(t){delete this._fromEnd,this.set("from",t)}get toEnd(){if(this.parent&&!this._toEnd){const{component:t,anchor:e,position:n}=this.getState("to")||{};if(!t)return;const i=this.root?.findByRefid?.(t);if(!i)return;this._toEnd=new oy({component:i,fromto:"to",anchor:e,position:n,self:this})}return this._toEnd}get to(){return this.getState("to")}set to(t){delete this._toEnd,this.set("to",t)}move({x:t,y:e},n){n&&(this.from={position:this._fromEnd?.position||this.getState("from")?.position||{x:0,y:0}},this.to={position:this._toEnd?.position||this.getState("to")?.position||{x:0,y:0}}),super.move({x:t,y:e})}render(t){const{begin:e="none",end:n="none",lineWidth:i,round:s=0}=this.state;let r=this.drawPath;Jg(t,r,this.state),t.beginPath();const o=Zg(e,i,r[0],r[1]),a=Zg(n,i,r[r.length-1],r[r.length-2]),c=r[0];r=[o,...r.slice(1,-1),a];let l={x:o.x,y:o.y};if(t.moveTo(o.x,o.y),r.length>=2&&Or(c)){const e=r[1],n=Rr(e,s),i=Math.sqrt((o.x-e.x)**2+(o.y-e.y)**2),a=0!==i?Math.atan2(o.x-e.x,o.y-e.y):0,l=Math.sin(a)*Math.min(n,i/2)+e.x,h=Math.cos(a)*Math.min(n,i/2)+e.y,d=Dr({x:o.x,y:o.y},{x:l,y:h},c.bulge);d&&t.arc(d.cx,d.cy,d.radius,d.startAngle,d.endAngle,d.clockwise)}for(let e=1;e<r.length;e++){const n=l;l=r[e];const i=r[e+1];if(n.x===l.x&&n.y===l.y)continue;if(!i){t.lineTo(l.x,l.y);break}const o=Rr(l,s);let a=Math.sqrt((n.x-l.x)*(n.x-l.x)+(n.y-l.y)*(n.y-l.y)),c=0!==a?Math.atan2(n.x-l.x,n.y-l.y):0,h=Math.sin(c)*Math.min(o,a/2)+l.x,d=Math.cos(c)*Math.min(o,a/2)+l.y;const u=o>0||0!==a?{x:h,y:d}:l;a=Math.sqrt((i.x-l.x)*(i.x-l.x)+(i.y-l.y)*(i.y-l.y)),c=0!==a?Math.atan2(i.x-l.x,i.y-l.y):0,h=Math.sin(c)*Math.min(o,a/2)+l.x,d=Math.cos(c)*Math.min(o,a/2)+l.y;const p=o>0||0!==a?{x:h,y:d}:l;if(t.lineTo(u.x,u.y),o>0&&t.quadraticCurveTo(l.x,l.y,p.x,p.y),Or(l)){const e=Rr(i,s),n=Math.sqrt((l.x-i.x)**2+(l.y-i.y)**2),r=0!==n?Math.atan2(l.x-i.x,l.y-i.y):0,o=Math.sin(r)*Math.min(e,n/2)+i.x,a=Math.cos(r)*Math.min(e,n/2)+i.y,c=Dr({x:p.x,y:p.y},{x:o,y:a},l.bulge);c&&t.arc(c.cx,c.cy,c.radius,c.startAngle,c.endAngle,c.clockwise)}}this.drawStroke(t,void 0)}contains(t,e){const{lineWidth:n}=this.state;return Qg(t,e,this.drawPath,n)}get resizable(){return!1}get mutable(){return!0}get rotatable(){return!1}get path(){const{from:t,to:e}=this.state,{x1:n,y1:i,x2:s,y2:r}=this.state;return[this.fromEnd?.position||t?.position||{x:n,y:i},this.toEnd?.position||e?.position||{x:s,y:r}]}set path(t){const[e,n]=t,{from:i,to:s}=this.state;delete this._fromEnd,delete this._toEnd,this.set({from:{...i,position:e},to:{...s,position:n}})}get textBounds(){const t=this.drawPath;let e,n,i=0;for(let s=1;s<t.length;s++){const r=t[s-1],o=t[s],a=(r.x-o.x)*(r.x-o.x)+(r.y-o.y)*(r.y-o.y);a>i&&(i=Math.ceil(a),e=r,n=o)}let{paddingTop:s,paddingLeft:r,paddingRight:o,paddingBottom:a}=this.state;return a||=0,s||=0,r||=0,o||=0,{left:Math.min(e.x,n.x)+r,top:Math.min(e.y,n.y)+s,width:Math.max(Math.abs(e.x-n.x)-r-o,0),height:Math.max(Math.abs(e.y-n.y)-s-a,0)}}get decorators(){return this.app.isEditMode?["decotag"]:[]}}ay.getTipNeckPos=Zg,ay.containedInPath=Qg,ay.drawEndTips=Jg,hc.register("line",ay);const cy={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"angle",label:"start-angle",name:"startAngle",property:"startAngle"},{type:"angle",label:"end-angle",name:"endAngle",property:"endAngle"}],"value-property":"text"};class ly extends(Nf(dc)){is3dish(){return!0}render(t){const{cx:e,cy:n,rx:i,ry:s,startAngle:r,endAngle:o,anticlockwise:a}=this.state;t.beginPath(),t.ellipse(e,n,Math.abs(i),Math.abs(s),0,r||0,o||2*Math.PI,a),void 0!==r&&void 0!==o&&(t.lineTo(e,n),t.closePath())}get path(){const{cx:t,cy:e,rx:n,ry:i}=this.state;return[{x:t-n,y:e-i},{x:t+n,y:e-i},{x:t+n,y:e+i},{x:t-n,y:e+i}]}set path(t){const e=t[0],n=t[2];this.set({cx:e.x+(n.x-e.x)/2,cy:e.y+(n.y-e.y)/2,rx:(n.x-e.x)/2,ry:(n.y-e.y)/2})}contains(t,e){const{cx:n,cy:i,rx:s,ry:r}=this.state,o=(t-n)/(2*s-.5),a=(e-i)/(2*r-.5);return o*o+a*a<.25}outline(t){return function(t,e){const{cx:n,cy:i,rx:s,ry:r}=t.model,o=2*Math.PI*e,a=n+s*Math.cos(o),c=i+r*Math.sin(o);return t.toScene(a,c)}(this,t)}get anchors(){return function(t){const{left:e,top:n,width:i,height:s}=t.bounds,r=e+i/2,o=n+s/2;return[{name:"TOP",position:{x:r,y:n}},{name:"RIGHT",position:{x:e+i,y:o}},{name:"BOTTOM",position:{x:r,y:n+s}},{name:"LEFT",position:{x:e,y:o}}]}(this)}get nature(){return cy}}hc.memoize(ly.prototype,"path",!1),hc.register("ellipse",ly);const hy={object:{fill:"rgba(180,180,180,0.18)",stroke:"#888888",icon:"?",label:"object"},transport:{fill:"rgba(100,180,255,0.18)",stroke:"#3a78c8",icon:"⇄",label:"transport"},facility:{fill:"rgba(160,140,220,0.18)",stroke:"#6b4ec8",icon:"◫",label:"facility"},vehicle:{fill:"rgba(120,200,140,0.18)",stroke:"#3a8c5e",icon:"⊙",label:"vehicle"},region:{fill:"rgba(220,200,100,0.18)",stroke:"#a0892a",icon:"▢",label:"region"},path:{fill:"rgba(200,140,160,0.18)",stroke:"#a0506a",icon:"⌐",label:"path"},"3d-asset":{fill:"rgba(255,180,80,0.18)",stroke:"#c87a2a",icon:"◈",label:"3D asset"}},dy=[{type:"string",label:"placeholder-label",name:"placeholderLabel",description:'사용자에게 표시할 추가 라벨 (예: "Stocker A1")'},{type:"string",label:"hint",name:"placeholderHint",description:"구체화 시 참고 — 도면의 원본 식별자 / VLM 라벨 등"}];function uy(t,e,n,i,s){const{left:r,top:o,width:a,height:c}=e,l=Math.max(a,1),h=Math.max(c,1);t.save(),t.fillStyle=n.fill,t.fillRect(r,o,l,h),t.strokeStyle=n.stroke,t.lineWidth=1.5,t.setLineDash([4,3]),t.strokeRect(r,o,l,h),t.setLineDash([]),t.restore(),Math.min(l,h)>=24&&(t.save(),t.fillStyle=n.stroke,t.font=`bold ${Math.min(20,.4*Math.min(l,h))}px Arial`,t.textAlign="center",t.textBaseline="middle",t.fillText(n.icon,r+l/2,o+h/2),t.restore());const d=i?`${n.label}: ${i}`:n.label;h>=32&&(t.save(),t.fillStyle=n.stroke,t.font="10px Arial",t.textAlign="center",t.textBaseline="bottom",t.fillText(d,r+l/2,o+h-4),t.restore()),s&&h>=40&&(t.save(),t.fillStyle=n.stroke,t.font="9px Arial",t.textAlign="right",t.textBaseline="top",t.fillText(`hint: ${s}`,r+l-4,o+4),t.restore())}const py={mutable:!1,resizable:!0,rotatable:!0,properties:[...dy,{type:"placeholder-convert",label:"",name:"_convert"}],help:"scene/component/placeholder"};class fy extends(pc(dc)){get nature(){return py}render(t){const{placeholderLabel:e,placeholderHint:n}=this.state;uy(t,this.bounds,hy.object,e,n)}}hc.register("placeholder",fy);const my=["placeholder"];function gy(t,e=[]){return!!t&&(!!my.includes(t)||e.includes(t))}const yy={ondragstart:function(t,e,n){n.mutatePath(null,function(n){n.splice(e+1,0,t)})},ondragmove:function(t,e,n){n.mutatePath(null,function(n){const i=n[e+1];n[e+1]={...i||{},x:t.x,y:t.y}})},ondragend:function(t,e,n){}},by={mutable:!0,resizable:!1,rotatable:!0,properties:[{type:"number",label:"round",name:"round",property:{min:0,max:100,step:1}}],help:"scene/component/polygon"};class _y extends dc{is3dish(){return!0}get mutable(){return!0}get pathExtendable(){return!0}get cornerEditable(){return!0}get path(){return this.state.path??[]}set path(t){this.set("path",t)}contains(t,e){const n=this.path;let i=!1;return n.forEach((s,r)=>{const o=(r+n.length+1)%n.length,a=s.x,c=s.y,l=n[o].x,h=n[o].y;c>e!=h>e&&t<(l-a)*(e-c)/(h-c)+a&&(i=!i)}),i}get controls(){const t=this.path;return t.map((e,n)=>{const i=t[n+1>=t.length?0:n+1];return{x:(e.x+i.x)/2,y:(e.y+i.y)/2,handler:yy}})}get nature(){return by}}hc.memoize(_y.prototype,"controls",!1),hc.register("polygon",_y);const vy=[];class xy extends(zl(_y)){constructor(t,e){super(t,e),this._components=[]}replaceRefids(t){this.components.forEach(e=>e.replaceRefids(t))}get showMoveHandle(){return!0}get showOverflow(){return!1}dispose(){this.components.slice().forEach(t=>t.dispose()),super.dispose()}isContainer(){return!0}containable(t){return t.isDescendible(this)}get hasTextProperty(){return!1}get components(){return this._components}get focusible(){return!0}get layout(){return _c.get(this.get("layout"))||xc}reflow(){this.layout.reflow(this),this.components&&this.components.forEach(t=>{t.isContainer()&&t.reflow()})}get hierarchy(){const t=super.hierarchy;return this.components?.length&&(t.components=this.components.map(t=>t.hierarchy)),t}reparent(t,e={}){t&&t.parent!==this&&this.addComponent(t,{silent:!0})}addComponent(t,e=!1){const{ghost:n=!1,silent:i=!1}="boolean"==typeof e?{ghost:e}:e,s=t.parent;if(s){if(this===s)return;s.removeComponent(t,n||i)}const r=this._components.push(t)-1;i&&(t._silentAdd=!0),t.parent=this,t.added(this),n||i||this.trigger("add",this,t,r),t.delegate_on(this),i?(s&&this.root?._removeTraverse?.(t),this.trigger("add",this,t,r),t.trigger("added",this,t,r),delete t._silentAdd):n||t.trigger("added",this,t,r),this.root&&this.root.isReady&&t.invokeReady()}removeComponent(t,e=!1){const n=this._components.indexOf(t);-1!=n&&(this._components.splice(n,1),t.parent=null,t.removed(this),e||(this.trigger("remove",this,t),t.trigger("removed",this,t)),t.delegate_off(this))}insertComponentAt(t,e,n=!1){const i=t.parent;i&&i.removeComponent(t,n);const s=this._components.splice(0,e);this._components=s.concat(t,this._components),e=this._components.indexOf(t),t.parent=this,t.added(this),n||this.trigger("add",this,t,e),t.delegate_on(this),n||t.trigger("added",this,t,e)}add(t,e=!1){return t instanceof Array?(t.forEach(t=>{-1==this._components.indexOf(t)&&this.addComponent(t,e)}),this):this.add.call(this,[t],e)}remove(t,e=!1){return t instanceof Array?this._components?(t.forEach(t=>this.removeComponent(t,e)),this):this:this.remove.call(this,[t],e)}getAt(t){if(this._components)return this._components[t]}forEach(t,e){this._components&&this._components.forEach(t,e)}traverse(t,e){t.call(e,this),this._components&&this._components.forEach(n=>{n.isContainer()?n.traverse(t,e):t.call(e,n)})}indexOf(t){return(this._components||vy).indexOf(t)}size(){return(this._components||vy).length}moveChildAt(t,e){const n=this.indexOf(e);if(-1==n)return;let i=this._components.splice(0,n);const s=this._components.splice(1);this._components=i.concat(s),t=Math.max(0,t),t=Math.min(t,this._components.length),i=this._components.splice(0,t),this._components=i.concat(e,this._components)}moveChildForward(t){const e=this.indexOf(t);-1!=e&&e!=this.size()-1&&(this._components[e]=this._components[e+1],this._components[e+1]=t)}moveChildBackward(t){const e=this.indexOf(t);-1!=e&&0!=e&&(this._components[e]=this._components[e-1],this._components[e-1]=t)}moveChildToFront(t){const e=this.indexOf(t);if(-1==e||e==this.size()-1)return;const n=this._components.splice(0,e),i=this._components.splice(1);this._components=n.concat(i,this._components)}moveChildToBack(t){const e=this.indexOf(t);if(-1==e||0==e)return;const n=this._components.splice(0,e),i=this._components.splice(1);this._components=this._components.concat(n,i)}symmetryX(t){super.symmetryX(t),this.components.map(t=>{t.symmetryX(0)})}findAll(t,...e){if("string"==typeof t)return La(t,this,e[0]||this);if("function"!=typeof t)return[];let n=[];for(let i=this.components.length-1;i>=0;i--){const s=this.components[i].findAll(t,...e);s&&(n=n.concat(s))}return t(this,...e)&&n.push(this),n}findFirst(t,...e){if("string"==typeof t)return La(t,this,e[0])[0];if("function"==typeof t){for(let n=this.components.length-1;n>=0;n--){const i=this.components[n].findFirst(t,...e);if(null!=i)return i}return t(this,...e)?this:void 0}}findById(t){return this.root.findAllById?.(t)?.[0]}findByRefid(t){return this.root.findByRefid?.(t)}capture(t,e,n){if(!this.app.isEditMode&&this.hidden)return!1;const i=this.fromParent(t,e);if(!this.contains(i.x,i.y))return!1;const s=this.bounds;i.x-=s.left,i.y-=s.top;const r=this.layout.capturables(this);for(let s=r.length-1;s>=0;s--){const o=r[s];let a;if(a="static"==o.position?o.capture(i.x,i.y,n):o.capture(t,e,n),a)return a}return this.capturable&&!n?.(this)&&this}capturePath(t,e){if(e){if(e.indexOf(this)>-1)return!1;for(let t=0;t<e.length;t++)if(!this.containable(e[t]))return!1}const n=[],{left:i,top:s,width:r,height:o}=this.bounds;for(let e=0;e<t.length;e++){const a=this.fromParent(t[e].x,t[e].y);if(a.x<i||a.x>i+r||a.y<s||a.y>s+o)return!1;a.x-=i,a.y-=s,n.push(a)}const a=this.layout.capturables(this);for(let t=a.length-1;t>=0;t--){const i=a[t];if(!i.isContainer())continue;const s=i.capturePath(n,e);if(s)return s}return this.focusible&&this}render(t){"popup"!==this.position&&super.render(t)}postrender(t){if("popup"===this.position)return void super.postrender(t);const e=this.layout.drawables(this);if(e.length>0){let{left:n=0,top:i=0,width:s,height:r}=this.bounds;t.save(),this.showOverflow||(t.beginPath(),t.rect(n,i,s,r),t.clip(),t.closePath()),t.translate(n,i),e.forEach(e=>{const n=this.root?.transitionEffect;n?.isReparenting(e)||e.draw(this.position&&"static"!==this.position?t:this.getContext(e))}),t.translate(-n,-i),t.restore()}super.postrender(t)}trim(){this.components.forEach(t=>{t.trim()}),super.trim()}}["layout"].forEach(t=>hc.memoize(xy.prototype,t,!1));const wy={ondragstart:function(t,e,n){n.mutatePath(null,function(n){n.splice(e,0,t)})},ondragmove:function(t,e,n){n.mutatePath(null,function(n){const i=n[e];n[e]={...i||{},x:t.x,y:t.y}})},ondragend:function(t,e,n){}},My={mutable:!1,resizable:!1,rotatable:!1,properties:[{type:"number",label:"round",name:"round",property:{min:0,max:100,step:1}}],help:"scene/component/polyline"};class Sy extends ay{get pathExtendable(){return!0}get cornerEditable(){return!0}get path(){const{from:t,to:e}=this.state,{path:n}=this.state;return[this.fromEnd?.position||t?.position||n[0],...n.slice(1,-1),this.toEnd?.position||e?.position||n[n.length-1]]}set path(t){const{from:e,to:n}=this.state;delete this._fromEnd,delete this._toEnd,this.set({from:{...e,position:t[0]},to:{...n,position:t[t.length-1]},path:t})}get controls(){const t=this.path,e=[];for(let n=0;n<t.length-1;n++){const i=t[n],s=t[n+1];0==n&&e.push({x:i.x,y:i.y,handler:wy}),e.push({x:(i.x+s.x)/2,y:(i.y+s.y)/2,handler:wy}),n==t.length-2&&e.push({x:s.x,y:s.y,handler:wy})}return e}get nature(){return My}}hc.register("polyline",Sy);const Ay={mutable:!1,resizable:!1,rotatable:!1,properties:[{type:"number",label:"round",name:"round",property:{min:0,max:100,step:1}}],help:"scene/component/ortholine"};class Ey extends ay{get pathExtendable(){return!1}get drawPath(){const t=this.path[0],e=this.path[1],{component:n,direction:i,boundaryPosition:s=t}=this.fromEnd||{},{component:r,direction:o,boundaryPosition:a=e}=this.toEnd||{},c=[s,a],l=[];s&&l.push(s);let h,d=n?.bounds;d&&(h=n.toScene(d.left,d.top),h=this.transcoordT2P(h.x,h.y),d={...d,left:h.x,top:h.y});const u=d?{left:d.left-20,top:d.top-20,width:d.width+40,height:d.height+40}:{left:s.x,top:s.y,width:0,height:0};d=d||u;let p=r?.bounds;p&&(h=r.toScene(p.left,p.top),h=this.transcoordT2P(h.x,h.y),p={...p,left:h.x,top:h.y});const f=p?{left:p.left-20,top:p.top-20,width:p.width+40,height:p.height+40}:{left:a.x,top:a.y,width:0,height:0};p=p||f;const m=[u,f],g=u.left>f.left?f.left:u.left,y=u.top>f.top?f.top:u.top,b={left:g,top:y,width:u.left+u.width>f.left+f.width?u.left+u.width-g:f.left+f.width-g,height:u.top+u.height>f.top+f.height?u.top+u.height-y:f.top+f.height-y};let _,v,x,w,M,S,A,E,k,C,T=0,P=0;d.left+d.width<p.left?(w=0,M=1,k=i,C=o,_=(d.left+d.width+p.left)/2,T=p.left-_):p.left+p.width<d.left&&(w=1,M=0,k=o,C=i,_=(d.left+p.width+p.left)/2,T=d.left-_),d.top+d.height<p.top?(x=0,S=1,A=i,E=o,v=(d.top+d.height+p.top)/2,P=p.top-v):p.top+p.height<d.top&&(x=1,S=0,A=o,E=i,v=(d.top+p.height+p.top)/2,P=d.top-v);const O=[];if(_&&T>P){let t,e,n;switch(C){case ry:switch(k){case sy:O.push({x:_,y:c[w].y}),O.push({x:_,y:c[M].y});break;case ry:t=m[w].top+m[w].height/2,e=t>c[M].y?Math.min(m[w].top,c[M].y):Math.max(m[w].top+m[w].height,c[M].y),O.push({x:c[w].x,y:e}),O.push({x:_,y:e}),O.push({x:_,y:c[M].y});break;case ny:case iy:e=k===iy?Math.max(c[w].y,c[M].y):Math.min(c[w].y,c[M].y),O.push({x:c[w].x,y:e}),O.push({x:_,y:e}),O.push({x:_,y:c[M].y});break;default:return this.path}break;case sy:switch(k){case sy:e=c[w].y<c[M].y?Math.min(m[M].top,c[w].y):Math.max(m[M].top+m[M].height,c[w].y),n=e;break;case ry:e=void 0!==v?v:c[w].y<c[M].y?b.top-.5*T:b.top+b.height+.5*T,n=e;break;case iy:e=void 0!==v?Math.max(v,c[w].y):b.top+b.height,n=e;break;case ny:e=v?Math.min(v,m[w].top):b.top,n=e;break;default:return this.path}O.push({x:c[w].x,y:e}),O.push({x:_,y:e}),O.push({x:_,y:n}),O.push({x:c[M].x,y:n});break;case iy:switch(k){case sy:e=c[w].y,n=c[w].y>c[M].y?c[w].y:m[M].top+m[M].height;break;case ry:e=v?Math.max(v,m[M].top+m[M].height):b.top+b.height,n=e;break;case iy:e=b.top+b.height,n=e;break;case ny:e=v?Math.min(v,m[w].top):m[w].top,n=v?Math.max(v,m[M].top+m[M].height):m[M].top+m[M].height;break;default:return this.path}O.push({x:c[w].x,y:e}),O.push({x:_,y:e}),O.push({x:_,y:n}),O.push({x:c[M].x,y:n});break;case ny:switch(k){case sy:e=c[w].y,n=c[w].y<c[M].y?c[w].y:m[M].top;break;case ry:e=v?Math.min(v,m[M].top):b.top,n=e;break;case iy:e=void 0!==v?Math.max(v,c[w].y):c[w].y,n=void 0!==v?Math.min(v,c[M].y):c[M].y;break;case ny:e=b.top,n=e;break;default:return this.path}O.push({x:c[w].x,y:e}),O.push({x:_,y:e}),O.push({x:_,y:n}),O.push({x:c[M].x,y:n});break;default:return this.path}l.push(...0===w?O:O.reverse())}else if(v){let t,e,n;switch(E){case ny:switch(A){case iy:O.push({x:c[x].x,y:v}),O.push({x:c[S].x,y:v});break;case ny:t=m[x].left+m[x].width/2,e=t>c[S].x?Math.min(m[x].left,c[S].x):Math.max(m[x].left+m[x].width,c[S].x),O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:c[S].x,y:v});break;case ry:e=Math.min(c[x].x,c[S].x),O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:c[S].x,y:v});break;case sy:e=Math.max(c[x].x,c[S].x),O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:c[S].x,y:v});break;default:return this.path}break;case iy:switch(A){case ry:e=b.left,n=e;break;case sy:e=void 0!==_?Math.max(_,c[x].x):b.left+b.width,n=e;break;case ny:e=void 0!==_?_:c[x].x<c[S].x?b.left-.5*P:b.left+b.width+.5*P,n=e;break;case iy:e=c[x].x,n=c[x].x<c[S].x?Math.min(m[S].left,c[x].x):Math.max(m[S].left+m[S].width,c[x].x);break;default:return this.path}O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:n,y:v}),O.push({x:n,y:c[S].y});break;case sy:switch(A){case ry:e=void 0!==_?Math.min(_,c[x].x):c[x].x,n=void 0!==_?Math.max(_,c[S].x):c[S].x;break;case sy:e=b.left+b.width,n=e;break;case ny:e=void 0!==_?Math.max(_,c[S].x):b.left+b.width,n=e;break;case iy:e=c[x].x,n=Math.max(m[S].left+m[S].width,c[x].x);break;default:return this.path}O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:n,y:v}),O.push({x:n,y:c[S].y});break;case ry:switch(A){case ry:e=b.left,n=e;break;case sy:e=void 0!==_?Math.max(_,c[x].x):c[x].x,n=void 0!==_?Math.min(_,c[S].x):c[S].x;break;case ny:e=b.left,n=e;break;case iy:e=c[x].x<c[S].x?Math.min(m[S].left,c[x].x):c[x].x,n=Math.min(e,c[S].x);break;default:return this.path}O.push({x:e,y:c[x].y}),O.push({x:e,y:v}),O.push({x:n,y:v}),O.push({x:n,y:c[S].y});break;default:return this.path}l.push(...0===x?O:O.reverse())}else{let t,e;switch(i){case ny:switch(o){case ny:e=b.top,l.push({x:c[0].x,y:e}),l.push({x:c[1].x,y:e});break;case iy:t=b.left+b.width,l.push({x:t,y:c[0].y}),l.push({x:t,y:b.top+b.height}),l.push({x:c[1].x,y:b.top+b.height});break;case sy:t=c[1].y<c[0].y&&c[1].x<c[0].x?c[0].x:b.left+b.width,l.push({x:t,y:c[0].y}),l.push({x:t,y:c[1].y});break;case ry:t=b.left,l.push({x:t,y:c[0].y}),l.push({x:t,y:c[1].y});break;default:return this.path}break;case iy:switch(o){case ny:t=b.left+b.width,l.push({x:t,y:c[0].y}),l.push({x:t,y:b.top}),l.push({x:c[1].x,y:b.top});break;case iy:case sy:case ry:e=b.top+b.height,l.push({x:c[0].x,y:e}),l.push({x:c[1].x,y:e});break;default:return this.path}break;case ry:switch(o){case ny:t=c[0].x>c[1].x&&c[0].y<c[1].y?c[1].x:b.left,e=c[0].x>c[1].x&&c[0].y<c[1].y?c[1].y:Math.min(b.top,c[0].y),l.push({x:t,y:c[0].y}),l.push({x:t,y:e}),l.push({x:c[1].x,y:e});break;case iy:t=b.left,e=Math.max(b.top+b.height,c[0].y),l.push({x:t,y:c[0].y}),l.push({x:t,y:e}),l.push({x:c[1].x,y:e});break;case sy:t=b.left+b.width,l.push({x:c[0].x,y:b.top}),l.push({x:t,y:b.top}),l.push({x:t,y:c[1].y});break;case ry:t=b.left,l.push({x:t,y:c[0].y}),l.push({x:t,y:c[1].y});break;default:return this.path}break;case sy:switch(o){case ny:e=c[0].y<c[1].y&&c[0].x<c[1].x?c[0].y:b.top,l.push({x:c[0].x,y:e}),l.push({x:c[1].x,y:e});break;case iy:e=c[0].y>c[1].y&&c[0].x<c[1].x?c[0].y:b.top+b.height,l.push({x:c[0].x,y:e}),l.push({x:c[1].x,y:e});break;case sy:case ry:e=b.top+b.height,l.push({x:c[0].x,y:e}),l.push({x:c[1].x,y:e});break;default:return this.path}break;default:return this.path}}return a&&l.push(a),[t,...l,e].filter((t,e,n)=>{if(0===e)return!0;const i=n[e-1];return t.x!==i.x||t.y!==i.y}).filter((t,e,n)=>{if(0===e||e>=n.length-1)return!0;const i=n[e-1],s=n[e+1];return!(t.x===i.x&&t.x===s.x||t.y===i.y&&t.y===s.y)})}get nature(){return Ay}}hc.register("ortholine",Ey);const ky={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"image-selector",label:"image-src",name:"src",property:{displayField:"id",displayFullUrl:!0,baseUrlAlias:"$base_url",defaultStorage:"scene-image",storageFilters:{type:Array,value:[{name:"category",value:"image"}]},useUpload:!0}},{type:"select",label:"cross-origin",name:"crossOrigin",property:{options:["","anonymous","use-credentials"]}}],"value-property":"src",help:"scene/component/image-view"};class Cy extends(pc(dc)){static get noimage(){return Cy.NOIMAGE||(Cy.NOIMAGE=new Image,Cy.NOIMAGE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABIBAMAAAD7Se1QAAAAIVBMVEUAAABHcEwBAQEREREBAQEEBAQGBgYLCwsDAwMDAwMICAi6HF9tAAAAC3RSTlNNAEAERiMYCS41Eac10lYAAAEgSURBVHhe7dY9asQwEAXgh7DNertNiJy48pIitY3SB7bYdk0ukL1BDDmA9gZecoH4pmFQ3MQayUMguPBrNPD4wD9TCMvJmt3M/AtYwXOlXiWgqADVCUBD46MAnGhMBaCiUQmAm8VA/Eh/eWl9Fn5WcxD+OLuRrUYJDKLluwH2InACUgkoACSdADxQc50Bytadb9RkM0CT13TcvlCT1HFg8UTHvasuUVACCa3El6u2UdD8LFTlKhUFFgA+d3dj10aABkUN72N3jAADCrJq7PIIsPidcxBoTHIIAjMFmyCwmGYIAA1P9gFgfCANAOsDSccCDW+uLDB+kLGg94OkZoAGkwsDDAe2DOg5oPxAg03rBR88OHpBz4N8UVeHFSwma74BTW6Ge4rIRa4AAAAASUVORK5CYII="),Cy.NOIMAGE}dispose(){super.dispose(),this._offcanvas=null,this._image=null}render(t){const{left:e,top:n,width:i,height:s,isGray:r=!1,alpha:o=1,src:a}=this.state;if(this.prepareIf(!this._image&&a),t.beginPath(),t.globalAlpha*=o,this._image&&this._image.complete)if(r&&this._offcanvas)t.drawImage(this._offcanvas,e,n,i,s);else try{t.drawImage(this._image,e,n,i,s)}catch(r){t.drawImage(Cy.noimage,e,n,i,s)}else!this.app.isViewMode&&t.drawImage(Cy.noimage,e,n,i,s)}get nature(){return ky}get hasTextProperty(){return!1}async ready(){await super.ready();const{src:t}=this.state;if(!this._image&&t){const e=this.root?.app?.loadTracker;if(e){const n=new Promise((t,e)=>{this.prepare(()=>t(),t=>e(t))});e.track(`image:${t}`,"image",t,n)}else this.prepareIf(!0)}}prepare(t,e){const{src:n,crossOrigin:i}=this.state;if(n){this._image=new Image;try{i&&(this._image.crossOrigin=i),this._image.src=this.app.url(n)||""}catch(t){return void e(t)}this._image.onload=()=>{if(this.get("isGray")){const t=this._image.width,e=this._image.height;this._offcanvas=hc.createCanvas(t,e);const n=this._offcanvas.getContext("2d");n.drawImage(this._image,0,0);const i=function(t,e,n){let i;try{i=t.getImageData(0,0,e,n)}catch(t){return Bi("Get Image Data Error: "+(t instanceof Error?t.message:String(t))),null}const s=i.data;for(let t=0;t<e*n*4;t+=4){const e=s[t],n=s[t+1],r=s[t+2],o=Math.floor((e+n+r)/3);i.data[t]=o,i.data[t+1]=o,i.data[t+2]=o}return i}(n,t,e);n.putImageData(i,0,0)}t(this)},this._image.onerror=t=>{this._image&&!this._image.currentSrc&&(this._image=null),e(t)}}else t(this)}get src(){return this.get("src")}set src(t){this.set("src",t)}onchange(t,e){(t.hasOwnProperty("src")||t.hasOwnProperty("isGray"))&&(this._offcanvas=null,this._image=null,this.prepareIf(t.src))}ondropfile(t,e){for(let n=0;n<t.length;n++)if(t[n].type.startsWith("image/"))return void(this.src=e[n])}}hc.register("image-view",Cy);class Ty extends($g(pc(hc))){is3dish(){return!0}prerender(){}}var Py,Oy,Dy={},zy={},Iy={};function Ry(){if(Oy)return zy;Oy=1,Object.defineProperty(zy,"__esModule",{value:!0});var t=function(){if(Py)return Iy;Py=1,Object.defineProperty(Iy,"__esModule",{value:!0});var t=function(){function t(){}return t.bitsToNum=function(t){return t.reduce(function(t,e){return 2*t+e},0)},t.byteToBitArr=function(t){for(var e=[],n=7;n>=0;n--)e.push(!!(t&1<<n));return e},t.lzwDecode=function(t,e){for(var n,i,s=0,r=function(t){for(var n=0,i=0;i<t;i++)e.charCodeAt(s>>3)&1<<(7&s)&&(n|=1<<i),s++;return n},o=[],a=1<<t,c=a+1,l=t+1,h=[],d=function(){h=[],l=t+1;for(var e=0;e<a;e++)h[e]=[e];h[a]=[],h[c]=null};;)if(i=n,(n=r(l))!==a){if(n===c)break;if(n<h.length)i!==a&&h.push(h[i].concat(h[n][0]));else{if(n!==h.length)throw new Error("Invalid LZW code.");h.push(h[i].concat(h[i][0]))}o.push.apply(o,h[n]),h.length===1<<l&&l<12&&l++}else d();return o},t}();return Iy.SuperGifUtils=t,Iy}(),e=function(){function e(t,e){this.stream=t,this.handler=e}return e.prototype.parseCT=function(t){for(var e=[],n=0;n<t;n++)e.push(this.stream.readBytes(3));return e},e.prototype.readSubBlocks=function(){var t,e;e="";do{t=this.stream.readByte(),e+=this.stream.read(t)}while(0!==t);return e},e.prototype.parseHeader=function(){var e={};if(e.sig=this.stream.read(3),e.ver=this.stream.read(3),"GIF"!==e.sig)throw new Error("Not a GIF file.");e.width=this.stream.readUnsigned(),e.height=this.stream.readUnsigned();var n=t.SuperGifUtils.byteToBitArr(this.stream.readByte());e.gctFlag=n.shift(),e.colorRes=t.SuperGifUtils.bitsToNum(n.splice(0,3)),e.sorted=n.shift(),e.gctSize=t.SuperGifUtils.bitsToNum(n.splice(0,3)),e.bgColor=this.stream.readByte(),e.pixelAspectRatio=this.stream.readByte(),e.gctFlag&&(e.gct=this.parseCT(1<<e.gctSize+1)),this.handler.hdr&&this.handler.hdr(e)},e.prototype.parseExt=function(e){var n=this;switch(e.label=this.stream.readByte(),e.label){case 249:e.extType="gce",function(e){n.stream.readByte();var i=t.SuperGifUtils.byteToBitArr(n.stream.readByte());e.reserved=i.splice(0,3),e.disposalMethod=t.SuperGifUtils.bitsToNum(i.splice(0,3)),e.userInput=i.shift(),e.transparencyGiven=i.shift(),e.delayTime=n.stream.readUnsigned(),e.transparencyIndex=n.stream.readByte(),e.terminator=n.stream.readByte(),n.handler.gce&&n.handler.gce(e)}(e);break;case 254:e.extType="com",function(t){t.comment=n.readSubBlocks(),n.handler.com&&n.handler.com(t)}(e);break;case 1:e.extType="pte",function(t){n.stream.readByte(),t.ptHeader=n.stream.readBytes(12),t.ptData=n.readSubBlocks(),n.handler.pte&&n.handler.pte(t)}(e);break;case 255:e.extType="app",function(t){n.stream.readByte(),t.identifier=n.stream.read(8),t.authCode=n.stream.read(3),"NETSCAPE"===t.identifier?function(t){n.stream.readByte(),t.unknown=n.stream.readByte(),t.iterations=n.stream.readUnsigned(),t.terminator=n.stream.readByte(),n.handler.app&&n.handler.app.NETSCAPE&&n.handler.app.NETSCAPE(t)}(t):function(t){t.appData=n.readSubBlocks(),n.handler.app&&n.handler.app[t.identifier]&&n.handler.app[t.identifier](t)}(t)}(e);break;default:e.extType="unknown",function(t){t.data=n.readSubBlocks(),n.handler.unknown&&n.handler.unknown(t)}(e)}},e.prototype.parseImg=function(e){e.leftPos=this.stream.readUnsigned(),e.topPos=this.stream.readUnsigned(),e.width=this.stream.readUnsigned(),e.height=this.stream.readUnsigned();var n=t.SuperGifUtils.byteToBitArr(this.stream.readByte());e.lctFlag=n.shift(),e.interlaced=n.shift(),e.sorted=n.shift(),e.reserved=n.splice(0,2),e.lctSize=t.SuperGifUtils.bitsToNum(n.splice(0,3)),e.lctFlag&&(e.lct=this.parseCT(1<<e.lctSize+1)),e.lzwMinCodeSize=this.stream.readByte();var i=this.readSubBlocks();e.pixels=t.SuperGifUtils.lzwDecode(e.lzwMinCodeSize,i),e.interlaced&&(e.pixels=function(t,e){for(var n=new Array(t.length),i=t.length/e,s=function(i,s){var r=t.slice(s*e,(s+1)*e);n.splice.apply(n,[i*e,e].concat(r))},r=[0,4,2,1],o=[8,8,4,2],a=0,c=0;c<4;c++)for(var l=r[c];l<i;l+=o[c])s(l,a),a++;return n}(e.pixels,e.width)),this.handler.img&&this.handler.img(e)},e.prototype.parseBlock=function(){var t={};switch(t.sentinel=this.stream.readByte(),String.fromCharCode(t.sentinel)){case"!":t.type="ext",this.parseExt(t);break;case",":t.type="img",this.parseImg(t);break;case";":t.type="eof",this.handler.eof&&this.handler.eof(t);break;default:throw new Error("Unknown block: 0x"+t.sentinel.toString(16))}"eof"!==t.type&&setTimeout(this.parseBlock.bind(this),0)},e.prototype.parse=function(){this.parseHeader(),setTimeout(this.parseBlock.bind(this),0)},e}();return zy.SuperGifParser=e,zy}var jy,Ly,Fy={};var Ny=function(){if(Ly)return Dy;Ly=1,Object.defineProperty(Dy,"__esModule",{value:!0});var t=Ry(),e=function(){if(jy)return Fy;jy=1,Object.defineProperty(Fy,"__esModule",{value:!0});var t=function(){function t(t){this.data=t,this.position=0}return t.prototype.readByte=function(){if(this.position>=this.data.length)throw new Error("Attempted to read past end of stream.");return this.data instanceof Uint8Array?this.data[this.position++]:255&this.data.charCodeAt(this.position++)},t.prototype.readBytes=function(t){for(var e=[],n=0;n<t;n++)e.push(this.readByte());return e},t.prototype.read=function(t){for(var e="",n=0;n<t;n++)e+=String.fromCharCode(this.readByte());return e},t.prototype.readUnsigned=function(){var t=this.readBytes(2);return(t[1]<<8)+t[0]},t}();return Fy.SuperGifStream=t,Fy}(),n=function(){function n(t,e){var n=this;for(var i in this.gifImgElement=t,this.options={autoPlay:!0},this.loading=!1,this.ready=!1,this.transparency=null,this.delay=null,this.disposalMethod=null,this.disposalRestoreFromIdx=null,this.lastDisposalMethod=null,this.frame=null,this.lastImg=null,this.playing=!0,this.forward=!0,this.ctxScaled=!1,this.frames=[],this.frameOffsets=[],this.initialized=!1,this.currentFrameIndex=-1,this.iterationCount=0,this.stepping=!1,this.handler={hdr:this.withProgress(this.doHdr.bind(this)),gce:this.withProgress(this.doGCE.bind(this)),com:this.withProgress(this.doNothing.bind(this)),app:{NETSCAPE:this.withProgress(this.doNothing.bind(this))},img:this.withProgress(this.doImg.bind(this)),eof:function(){n.pushFrame(),n.canvas.width=n.hdr.width*n.getCanvasScale(),n.canvas.height=n.hdr.height*n.getCanvasScale(),n.playerInit(),n.loading=!1,n.ready=!0,n.loadCallback&&n.loadCallback(n.gifImgElement)}},e)this.options[i]=e[i];this.onEndListener=e.onEnd,this.loopDelay=e.loopDelay||0,this.overrideLoopMode=null!=e.loopMode?e.loopMode:"auto",this.drawWhileLoading=null==e.drawWhileLoading||e.drawWhileLoading}return n.prototype.init=function(){var t=this.gifImgElement.parentNode,e=document.createElement("div");this.canvas=document.createElement("canvas"),this.canvasContext=this.canvas.getContext("2d"),this.tmpCanvas=document.createElement("canvas"),e.className=this.options.enclosingClass||"super-gif",e.appendChild(this.canvas),t&&(t.insertBefore(e,this.gifImgElement),t.removeChild(this.gifImgElement)),this.initialized=!0},n.prototype.loadSetup=function(t){return!this.loading&&(t&&(this.loadCallback=t),this.loading=!0,this.frames=[],this.clear(),this.disposalRestoreFromIdx=null,this.lastDisposalMethod=null,this.frame=null,this.lastImg=null,!0)},n.prototype.completeLoop=function(){this.onEndListener&&this.onEndListener(this.gifImgElement),this.iterationCount++,!1!==this.overrideLoopMode||this.iterationCount<0?this.doStep():(this.stepping=!1,this.playing=!1)},n.prototype.doStep=function(){if(this.stepping=this.playing,this.stepping){this.stepFrame(1);var t=10*this.frames[this.currentFrameIndex].delay;t||(t=100),0===this.getNextFrameNo()?(t+=this.loopDelay,setTimeout(this.completeLoop.bind(this),t)):setTimeout(this.doStep.bind(this),t)}},n.prototype.step=function(){this.stepping||setTimeout(this.doStep.bind(this),0)},n.prototype.putFrame=function(){var t;this.currentFrameIndex=parseInt(this.currentFrameIndex.toString(),10),this.currentFrameIndex>this.frames.length-1&&(this.currentFrameIndex=0),this.currentFrameIndex<0&&(this.currentFrameIndex=0),t=this.frameOffsets[this.currentFrameIndex],this.tmpCanvas.getContext("2d").putImageData(this.frames[this.currentFrameIndex].data,t.x,t.y),this.canvasContext.globalCompositeOperation="copy",this.canvasContext.drawImage(this.tmpCanvas,0,0)},n.prototype.playerInit=function(){this.loadErrorCause||(this.canvasContext.scale(this.getCanvasScale(),this.getCanvasScale()),this.options.autoPlay?this.step():(this.currentFrameIndex=0,this.putFrame()))},n.prototype.clear=function(){this.transparency=null,this.delay=null,this.lastDisposalMethod=this.disposalMethod,this.disposalMethod=null,this.frame=null},n.prototype.parseStream=function(e){try{new t.SuperGifParser(e,this.handler).parse()}catch(t){this.handleError("parse")}},n.prototype.setSizes=function(t,e){this.canvas.width=t*this.getCanvasScale(),this.canvas.height=e*this.getCanvasScale(),this.tmpCanvas.width=t,this.tmpCanvas.height=e,this.tmpCanvas.style.width=t+"px",this.tmpCanvas.style.height=e+"px",this.tmpCanvas.getContext("2d").setTransform(1,0,0,1,0,0)},n.prototype.drawError=function(){this.canvasContext.fillStyle="black",this.canvasContext.fillRect(0,0,this.hdr.width,this.hdr.height),this.canvasContext.strokeStyle="red",this.canvasContext.lineWidth=3,this.canvasContext.moveTo(0,0),this.canvasContext.lineTo(this.hdr.width,this.hdr.height),this.canvasContext.moveTo(0,this.hdr.height),this.canvasContext.lineTo(this.hdr.width,0),this.canvasContext.stroke()},n.prototype.handleError=function(t){this.loadErrorCause=t,this.hdr={width:this.gifImgElement.width,height:this.gifImgElement.height},this.frames=[],this.drawError()},n.prototype.doHdr=function(t){this.hdr=t,this.setSizes(this.hdr.width,this.hdr.height)},n.prototype.doGCE=function(t){this.pushFrame(),this.clear(),this.transparency=t.transparencyGiven?t.transparencyIndex:null,this.delay=t.delayTime,this.disposalMethod=t.disposalMethod},n.prototype.pushFrame=function(){this.frame&&(this.frames.push({data:this.frame.getImageData(0,0,this.hdr.width,this.hdr.height),delay:this.delay}),this.frameOffsets.push({x:0,y:0}))},n.prototype.doImg=function(t){var e=this;this.frame||(this.frame=this.tmpCanvas.getContext("2d"));var n=this.frames.length,i=t.lctFlag?t.lct:this.hdr.gct;n>0&&(3===this.lastDisposalMethod?null!==this.disposalRestoreFromIdx?this.frame.putImageData(frames[this.disposalRestoreFromIdx].data,0,0):this.frame.clearRect(this.lastImg.leftPos,this.lastImg.topPos,this.lastImg.width,this.lastImg.height):this.disposalRestoreFromIdx=n-1,2===this.lastDisposalMethod&&this.frame.clearRect(this.lastImg.leftPos,this.lastImg.topPos,this.lastImg.width,this.lastImg.height));var s=this.frame.getImageData(t.leftPos,t.topPos,t.width,t.height);t.pixels.forEach(function(t,n){t!==e.transparency&&(s.data[4*n+0]=i[t][0],s.data[4*n+1]=i[t][1],s.data[4*n+2]=i[t][2],s.data[4*n+3]=255)}),this.frame.putImageData(s,t.leftPos,t.topPos),this.ctxScaled||(this.canvasContext.scale(this.getCanvasScale(),this.getCanvasScale()),this.ctxScaled=!0),this.drawWhileLoading&&(this.canvasContext.drawImage(this.tmpCanvas,0,0),this.drawWhileLoading=this.options.autoPlay),this.lastImg=t},n.prototype.doNothing=function(){},n.prototype.withProgress=function(t){return function(e){t(e)}},n.prototype.getNextFrameNo=function(){var t=this.forward?1:-1;return(this.currentFrameIndex+t+this.frames.length)%this.frames.length},n.prototype.stepFrame=function(t){this.currentFrameIndex=this.currentFrameIndex+t,this.putFrame()},n.prototype.getCanvasScale=function(){return this.options.maxWidth&&this.hdr&&this.hdr.width>this.options.maxWidth?this.options.maxWidth/this.hdr.width:window.devicePixelRatio||1},n.prototype.play=function(){this.playing=!0,this.step()},n.prototype.pause=function(){this.playing=!1},n.prototype.isPlaying=function(){return this.playing},n.prototype.getCanvas=function(){return this.canvas},n.prototype.isLoading=function(){return this.loading},n.prototype.isReady=function(){return this.ready},n.prototype.isAutoPlay=function(){return this.options.autoPlay},n.prototype.getLength=function(){return this.frames.length},n.prototype.getCurrentFrame=function(){return this.currentFrameIndex},n.prototype.moveTo=function(t){this.currentFrameIndex=t,this.putFrame()},n.prototype.loadURL=function(t,n){var i=this;if(this.loadSetup(n)){var s=new XMLHttpRequest;s.open("GET",t,!0),"overrideMimeType"in s?s.overrideMimeType("text/plain; charset=x-user-defined"):"responseType"in s?s.responseType="arraybuffer":s.setRequestHeader("Accept-Charset","x-user-defined"),s.onloadstart=function(){i.initialized||i.init()},s.onload=function(){if(200===s.status){var t=s.response;t.toString().indexOf("ArrayBuffer")>0&&(t=new Uint8Array(t));var n=new e.SuperGifStream(t);setTimeout(function(){i.parseStream(n)},0)}else i.handleError("xhr - response")},s.onerror=function(){i.handleError("xhr")},s.send()}},n.prototype.load=function(t){this.loadURL(this.gifImgElement.src,t)},n}();return Dy.SuperGif=n,Dy}();const By={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"image-selector",label:"src",name:"src"},{type:"checkbox",label:"play",name:"play"}],"value-property":"src",help:"scene/component/gif-view"};class Hy extends Ty{async oncreate_element(t){const{src:e,play:n}=this.state;this.onchangesrc(e),this.onchangeplay(n)}buildImg(){const t=this.element;if(!t)return document.createElement("img");t.replaceChildren();const e=document.createElement("img");return e.style.width="100%",e.style.height="100%",t.appendChild(e),e}onchange(t,e){super.onchange(t,e),"src"in t&&this.onchangesrc(t.src),"play"in t&&this.onchangeplay(t.play)}setElementProperties(t){}onchangeplay(t){const e=this._superGif;e&&e.isReady()&&(t?e.play():e.pause())}onchangesrc(t){const e=this.buildImg();t||(t="data:image/gif;base64,R0lGODlhYABIAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKio+Pj5iYmKCgoKampqurq66urrCwsLGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrOzs7S0tLa2tre3t7m5ubu7u7+/v8DAwMHBwcPDw8XFxcfHx8vLy8/Pz9LS0tXV1dfX193d3eTk5Onp6fj4+Pz8/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////yH5BAkAAPUAIf47R2VuZXJhdGVkIGJ5IGpzZ2lmIChodHRwczovL2dpdGh1Yi5jb20vYW50aW1hdHRlcjE1L2pzZ2lmLykALAAAAABgAEgAAAj+AGcJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmR9VKqXMmypcuXMGPKnJkSIs2bOHPqZGlzp8+fQOv1DEq0KMyhRpMmRaq0KVCmTqPmhCq1qkyqLrFRSyYwGTVsVo1iZXmNa8Fk18ISHasSm1mDycCq/ck2JTWF1ObSfTjz7cFken3WFbow8M7BDA3rHOwXruKpfGXeTZg3qDVrUge7RRg3KLZjx+Q2HVyvLNy0QaMJjBaVdD2tZr2K/mmNIObRkR+n9AsYt0Pddg1WXppb8bWDx1CLLW74GcJnSl3TtDY8Zu2Et4tKl7n52eyWnxXvhl7+26jqrspbnlfIWjtz2gWPZV95neH8veU9NxZYfbfD3kFt99J6Bnmn0mQO9XfYezrVxxlmx0GUXIAM4hSeffsxBN1TFd5E4Ef3QZbfTg6CNJ5gHXJ3TEntLThiTh+KFCJNAqZU4kgAitjQTheepOBMNcZI0oQ6JpbTjSZtiNN2PZ400IxHpdiSc07G911M0iFZZYtAStnWilUeBGVLrlEZpmM0elmPlmfO8iOZXl4DZpsGEYmll2bSWWCXLwJXVY1+urhjoGEBSuiSah6K36CKtpZoo4s9CimielZq6aWYZqrpppx26umnoIZ6UkAAOw=="),e.src=t,e.setAttribute("rel:animated_src",t),e.setAttribute("rel:auto_play",String(0)),this._superGif=new Ny.SuperGif(e,{autoPlay:!1}),this._superGif.init(),this.element&&Array.from(this.element.children).forEach(t=>{t.style.width="100%",t.style.height="100%"});const n=this._superGif.getCanvas();n.style.width="100%",n.style.height="100%",this._superGif.load(()=>{setTimeout(()=>{this._superGif.moveTo(0),this.play&&this._superGif.play()},100)})}ondropfile(t,e){for(let n=0;n<t.length;n++)if(/\.gif$/.test(t[n].name))return void(this.src=e[n])}get src(){return this.getState("src")}set src(t){this.set("src",t)}get play(){return this.getState("play")}set play(t){this.setState("play",t)}get nature(){return By}get tagName(){return"div"}}hc.register("gif-view",Hy);const $y={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"attachment-selector",label:"src",name:"src",property:{category:"audio"}},{type:"checkbox",label:"started",name:"started"},{type:"checkbox",label:"loop",name:"loop"}],"value-property":"src",help:"scene/component/audio"};class Gy extends(pc(dc)){static get image(){return Gy.IMAGE||(Gy.IMAGE=new Image,Gy.IMAGE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAMAAAC3Ycb+AAAAP1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACzJYIvAAAAFHRSTlMA8BAwgNBgQKB/wCBwUJDg37CvXyUlBK8AABFYSURBVHja7NsBkqIwFIThTiAQgyBq3/+sm6p1tnamZkaTMhJJf1f4S/JeEIiIiIiIiIiIiIiIiEhD7Hg4BH84TpAKjJ4f3NFCtjVd+InXz2RTs+FXlxGylYHfcVfIJmb+YFWSLUyGVJKKBJJKUo+Rd6w63l/qzLuCkryO5fe0l2xk5mMWbe+v0fNBRqf7S3je6CipQ2ACr+dWcYEpzBFS1plpguatsnomMgdIQSOTuQ5SjmE6/UgK8szgdJIUM/FG41YlFmYJ2kkKsY5ZzAwBurHDk3WGeRY0bvYrGa1+rqNI22f7dS32ZnUK1GMr0eSK3mEc9dhKMxp+ZTo8kT2emOXS5LQ1kCxbJBocSd2k5PaIjMVzjWcdJPk9ooBnmzx1t5XbIxqBKpJ4NGTgzwKiGpK4do72gb+ZUMIYtCPm9WCPMsYTE5k2hq2ZvzujlCE1iRmwf3dvmRyKsT0T7b9I7HEPCpqCiqT2IIqaT1pI0noQZdlFC8l/PbYPAnRORT56VBEE6FXkb49agmByKhJ71BME6FsvEntUFQTdqekisUdlQWCXhovEHtUFAWbTapHYo8YgmFybO3vsUWcQYGmxSOxRbRAMprkisUfFQVKmrX18sxt7VB0ENjT1xir2qDxIwkFi3v89e+xRfxAMzfzzIfZ4hyAYDR9zwVuLPd4jCDrTwoLYGb5LEFi3/+E3rweR6urX20c/Fvls2Pvwm9mDSGIPhv8YPyGf3/eo9Ye7O8B2FIShAAooakEttex/rbODad5/yTHIAjqn505IQPv+Xz06dz+4VXORHEZcgAcB8updM8F6e25jBzwIkE07l+x8amMnPDp6nsNJ+BoZ7Q6F8egqAda9VEuRNlZjBzwYkMskdXR73okd8GBAJiKYjBcZKKqG9OiKDbgdfxJ5VhsBPDiQZhaouD3p4hfw4EAmwxisz3MSHwAPEmQ1TB1N+SmXWoAHC7JbZsWl/IxLLcCDBplNo3lrfMLsmwAPGmShAxX5/1vOEzjEz3iyfQ/hI36W4TctsUesOAifPdrQg8M++KYl95iCBkjI1r8634betBAPHZDTPFAmD3zLiHgogVTziMsahz0eIh5aIGHGRSJ2mFtHPR4iHhQIP2UvWGMf8wk74qEIEib7rLjPiBfxiAcCwp8V+Nae3uMdRhAPDIR/J5f/Q2DTcC+hIB7qIGEq3Ti9bx+sryMeAAgS70OK8G2kBD8L8QBAoLWU3g3vUVIc6D0txAMAsY+4jBWowXHO64gHBGKfYJ2T5qY1BxcL98BB+PQ+XiS9xxh9EQ8ChA6C5UXWIUoE9MBB8LVHQoS7ib8/dRn3sAcJ6bQRSdH96RDxIEH4QEX+AHF4LxHEAwUh12xyr1V8lwjiQYDYF8kuf1jluUQQDwrEvkhW8Wc6LhHUgwfhi4QPlHm7LRHawx4kpE191Dq8lgjhAYDQa1cftYrPEiE8OJDb40uqyzdQCA8WhAzL4G/PT4c3WrgHD2IfllGl53V37zsgHg5ApPNvVvq4Fn4spx4oiH1W3CwtEV+PDhEPJyBSkVX4aa7emkM83ICEKWpGM7wdvYCCeDgCEYpcwhLxczhEPFyBCEUWnRL5T6X59SBASBF+9l28TL5F7uEORCZyCUvEx+S7yT0cgoRVb9JaXLR1qUdfgksQ0fTbgmhFB20d8HAKEha14+F8f1sHPNyCiL6EqK+n20/rgIdjkFC0Ho1s6Gndvcc9ICkr/ey8/rHO6vp9KawL8DAFOV6l9Fyub7IbflsCag1qRfVsXWvxHjxIejU+BHZV6uvHD1XiEb++Bw8i+dNd+Wv0eCQmhcPhRPwUUt2DB5G1sfa1aeyzAuyJj9x2HjyIdKzIKw5SI14ieFtvo3kIQERj3lVhkUOnRD7AnjV5369QkAOJZeCH+Jh41xOLs73dQwAifY6dpxCCbjTDzLf1Bm1Y93tAIDOWXcLPvrHyr2hVoEAceEAgDQzB4jetk0/c2OXRHB48EJCpa4dgpYh2ETxtrshz7zx4ICCzfuTSDn8p/EOS9OTjwgMB+cABP3yWYuOPIofs33LigYCULlpZNXJppVU30Vf14kGAUCLijf1D71lN9FW9eFiA9KgZ8FPpPUsSnufGA+8hvAg2Kpz0nrX//qp+PIgpC3i6xJRITOye9fn1VT15ICCrVlQG5rywo0H8x965bVkNwmCYQ2kR6Gmb939WXV65dFnI/tPdjPBfO7XMN4EkTUJtqZp4sCJ1+8jwkhMu0KpMxFXFA8hlVfQSMxGH5mDK1VKV8QCyvTVtUiYyo7V358VStfGoAEFMhGYhEwloxZy9WKo2Hjwg5iSOvFDXeUYd33+PuVfHgwnEBWLocDJp+IIa2fyvperjwQRiXCKGosyXqoA+YfsIELuYu4HAt+msMknfDK4jfQJIzOZ2IPAQWJtFOhQKivR2IDZ6Awis7V0iLxqBI7uEZo19dakTogLSwKvf8yk8Jq6CGK0GKvWlatG7b7kkUU/Lo1gdXWn7/4E0j0qeJDpqN/ABqQcgJgdqURb4chjQktIugDS6wFFiz3JgaJj7AGJmholAe9YKhoZLJ0Ca6smjwJ4VwVN96gVIE5GM71kHaGKxGyAtRDaB2NBhLVmpHyANRKzDO28W7FS3HQFpaIWa8TrfCXQwegJSL5k+8M9UJ+pm9QTEnCIZrR0MDQeQ9ua0iCcYQaBTV0CqNXQW/yiyYG7W1heQanPaCkciBXuH1BkQJzHcDQxmpgGkPatl4WkbCXO/bW9AqlNg4H0PPMi6A1IxkQmOZ8D0ousNSMVEEuyreTAQ6Q7IRJeCX2YZQHhv6SrBOmpkM+YUzN0BqSRQCupmTeCP9wdkhiOREwtEzgGEsWcF9BhK9R8fQDiN7A8DiR0CKXQlj/q9IM8OgXjIzcKBlAHkD6FulgNzJwPIHwpo8mQAkX3LiPq9dKUMAQk9AqmcqmjuBAJCPQIpA4guIAsKJA0gnwNy3A4kDyBIHCEPxAwgf8gPILqA5AFEF5CxZX0lIHYc6rqADLf380BmFMgxgIzUyf8MJKLTRelKHgKy9wgkjfS7LiA0gKgC8vQn3HUA4RQ5LKPIAQciWbqIEg0YkLNDIHYUyqkCsmKN5vg3+W0AYTRATaPY+uu1IwS6UMGAlO6AFPjSCQMStaNh53cdcPG7Hx1Uupo+rx+Bltn1BuTAj5BptEV/bHAAwbnJMICwRmtUDOSEA8s4Rmtw3nITGD6TwUNoG0Ca7xi2YKSPj2eKXQFxQWKA2QbGMWEMMGseOb7C7T47uJS1JyAzVbTjqZdU3zbHzMXWS+qp4Fgn8Ahy/QCRGqQcwU1vGnN7fylboWn8Bzg//hyjxltvdcl45bwFfYKzFyBy11UU9BnjuoqfWizVlQXulpzBTNbaB5Aid+VRrkBFB630AMS9BC8FK2ggE7u/FGy1kvfcB9TKQufX5uUXNWl3EjvWCi4k/u9A3Ddq1CpTIQGe6VN1qd8ArcvDQNw3S41Kn6qQmOq5e7pRr+8fAYLiIJtFrrvYRMYL0q06vj8EZLXUriJzRY8H1xEagOCK7gkghRg6RQYO0I6aWPwIEAru80AiMWSdzAeuDXUKyr+WqpAID8hMHC1Ct8F4mUsQ6W8pJMICki0JHCBczAFdBl38G3VE6ErQhhWlih4LWrCSLpaqjggHiGe9mVjRY0YPoelyqcqIcIDEe97rqJFFH7FcLlUZEQ6Qg5plvZiBFNhtri1VFREGEC/Eg4nZoU5vqi1VFREGkIXDQ8xAIhzoT/WlKiLCAFIYPOQMxOPdjfWlKiLCADJRm3YGj+pDE2xktmmpaogwgMz8d8GrumZ4xzpbvinqISJ+hiTWm7wEqoJdI9JEV9JChAEkS3xCZzKecLcgN6YwlRBhAGmweTsblg6qKMM7Vmh321UQ4QAp1VfwhqVJIh+Wm03W0qV0EOEAybXtivkCmWrKeH2EZ/xBaSBCV2L9Re+LYSqJJIxDu1ew07U0EGEBcTtmHty4JuPtQhvLh1BAhK7Uvvq0GK484QZST0GvvFDqeSJ1IA0r2mfDljvqBoJ//rVsq7yZCA6kXgVkJ2f4ijIGMjOfMVsCBBORB2Jy+sM6ijNvaBUqmw/cStZ8EiKciHwp6Rp++88qmxXQeTUxDiJWJ9wSISvBicgXW+dypn1PqWTznlwgwdZdfiLHr5OELEAEASKvJFRE5JCPKbh8OxHdQKJU0crEzRXrJ/IEkFms6tGyrUw9kQeALFRXvK2iSzsRAAi6BLxM+60xdsqJAEBuXMAMxDLVp+gmAgC57/UT4qvVj3TVRCAgSAYL91aXtyNLzUQAIFhAiP8m0/NHOp+ILiBtPFKrs6bgSOcT0QTEB8nO3QR1yKslggKRf+m11UB0HOl8IlqAeCvauXuo8HnfIqIDyCw6G8XMcGiplMingMzCnbuHFp/3LSLPA4nUpqm5YkWNzwsQeQxIDsKjH5wVSU5qJPIJIIt4jjpqNBAekQeBfJOeHWS81FQoo4/I7UDcS3wUh0liTzLqiEgDqddx4ZHDrNZAACIAEMw88HPYWb0GAhABgEDmgf9Vb5oNBCByOxD3uqWYbCHVBgIQuRlIsbfwMEG5gQBE7gSyHMDsOayrxJvHBRC5B0hOxJH1nK4SlUE6QOR+IG6ju3iYQEqDdIDIzUDyZu/jMRHpS/OiRG4FkiPRfTw8kbrvIAJEACAIDpyHC1/GQHhEbgKSXwTyqIeEur6kixEBgABHOTr7YSX1MSFAhA0E307wUU76Y0KACAsI/tvCRzkF+iIuL0AEAYLbR2QOfvhKJ/obRESBxNt5rPSFXN4f7dyNdqMgEIbhAXWwJErT/e7/Wreb5HTT07QVgWSAeW5g7b4n8qOSUCRPEId4HP93SXp5dDNGRJFcQTxihSH+NW1Bb1cXKpIryJAwnG/zhl8ZcSP6jiKZghwRaaWLnP/AkcSKKJIniEcUs8QfjFLdEmRvkSxB4lfn0QN6DY+lshQpHiT96Dlr6r5hxRUpHST9ZEY71X7DOmOZQVZLsd5Q8wzrPxYYJDiKNqOBG1ZCkZKzrNXu6lHvkjChSFqQsdTPg45ApXtYaUXKr9TNuPcvqO2pVMkitFXAL2a79/qr3HQvVSTXUtofCl79RDXh5CDpw3pwu6+9kRlvtiI5VtPhmHLltT4EKVQkfb8pcOHrXqk6nBAksUjgpKtuYsskaxGKYT0+84uYgziE4YQgMdx0m8PRfis2MbL33PMXoVjD6PEunI4HSjDjStiJP08vQk9hZzQ7oH/geoLYCUBDW4rf4FqCDFt7THUO6B+4jiDn2XNTW7zf4hqCMND4BOsGyw+yAmh0x+QeFh7EeqD5Ce8nLDrI8NpbDyIWHIQNruo4GyAPlhrEzuixBxHLDDJMnfYgYolBricHNfjIdgMWF+Qyu+pkgX4HCwuymL57ELGkIHZG7z2IWE6Q5VV7vGMhQewbtMcZiwhyHj26ne9+xs8PcvDQHnFFqCD7Au0RW4TK+fOKqw4eoOcqYqgU53HR3/5uShFPCfKey9hFDyJO/vAi7RDZnp7X5igyUH72xSDW1E2Pn4tMRCQgR8vLwbgii4gcmLvqQcSPGtIPX3M08wn6I4qYQ94cM/Yw9Xxhmw+X/59wHrtMlX1AmIkzdyaaAnLg1Nnw8WGYSk40X/BOh4+El6LMSBnN2Cd0tPq4w/LJXGrMbCX06PZ2dcM65yzlNertShSHf3SzRAyPM332IcSAHUKPi8EHmXU0l8Uglmni0yipDoi16s+jJKejhywLooz68yiMEcHr2qM4h81CJ++VPJfTu5UwBpv4Pp9DJSi6MJx0bvUwiw4ewgT8zNR0LHUL+OccOpY/3ElzyGKD5pBlMJpDlsOkMythRoNbXh95PJsdA67MrMtAEYbjeDqNo+7oKqWUUkoppZRSSimllFJKFfMXp4vmSjB8n6sAAAAASUVORK5CYII="),Gy.IMAGE}dispose(){super.dispose(),this.started=!1,delete this._audio}async ready(){super.ready(),this._audio=new Audio;const{src:t="",loop:e=!1,started:n=!1}=this.state;if(t){const e=this.root?.app?.loadTracker;if(e){const n=new Promise((e,n)=>{this._audio.addEventListener("canplay",()=>e(),{once:!0}),this._audio.addEventListener("error",()=>n(new Error(`Audio load failed: ${t}`)),{once:!0})});e.track(`audio:${t}`,"audio",t,n)}}this._audio.addEventListener("canplay",()=>{this.started&&this._audio.play()}),this.onchangeSrc(t),this.onchangeLoop(e),this.onchangeStarted(n)}render(t){const{left:e,top:n,width:i,height:s}=this.state;t.beginPath(),this.drawImage(t,Gy.image,e,n,i,s)}get nature(){return $y}get hasTextProperty(){return!1}get src(){return this.get("src")}set src(t){this.set("src",t)}get started(){return!!this.get("started")}set started(t){this.set("started",t)}start(){this._audio&&(this._audio.classList.add("active"),this._audio.play())}pause(){this._audio&&(this._audio.classList.remove("active"),this._audio.pause())}onchangeSrc(t){try{"data"!==String(t).substring(0,4)?this._audio.crossOrigin="use-credentials":this._audio.crossOrigin=null,this._audio.src="string"==typeof t?this.app.url(t):t}catch(t){return void Bi(t)}}onchangeStarted(t){const e=this._audio;t?4==e.readyState&&e.play():e.pause()}onchangeLoop(t){this._audio.loop=t}onchange(t,e){"src"in t&&this.onchangeSrc(t.src),"started"in t&&this.onchangeStarted(t.started),"loop"in t&&this.onchangeLoop(t.loop)}ondblclick(t){this.started=!this.started}ondropfile(t,e){for(let n=0;n<t.length;n++)if(t[n].type.startsWith("audio/"))return void(this.src=e[n])}}hc.register("audio",Gy);class Vy extends(pc(hc)){is3dish(){return!0}}hc.register("text",Vy);const Uy=["refid","left","top","width","height","rotation","animation","zPos"];class Yy extends Wg{isGroup(){return!0}is3dish(){return!0}get showMoveHandle(){return!1}get(t){return this._model[t]}set(t,e){if("string"==typeof t)return this.set({[t]:e});const n=Uy.reduce((e,n)=>(t.hasOwnProperty(n)&&(e[n]=t[n]),e),{});return super.set(n,void 0)}capture(t,e,n){const i=super.capture(t,e,n);if(i!==this)return i}set bounds(t){if(this.__MUTATING__)return void(super.bounds=t);const e=this.bounds,n=t.width/e.width,i=t.height/e.height;this.path=this.path.map(s=>({x:t.left+(s.x-e.left)*n,y:t.top+(s.y-e.top)*i})),this.components&&this.components.forEach(t=>{if(t.mutable)t.mutatePath(null,function(t){return t.map(function(t){return{x:t.x*n,y:t.y*i}})});else{const e=t.bounds,s=t.center,r={x:s.x*(1-n),y:s.y*(1-i)},o=e.width*(1-n),a=e.height*(1-i),c=-(r.x-o/2),l=-(r.y-a/2);t.bounds={left:e.left+c,top:e.top+l,width:e.width*n,height:e.height*i}}})}get focusible(){return!1}get bounds(){return super.bounds}get hasTextProperty(){return!1}isIdentifiable(){return!1}calculateBounds(){this.clearCache(),this.__MUTATING__=!0,this.mutateBounds(function(t){const e=hc.union(this.components.map(t=>t.bounds));return this.components.forEach(t=>{const n=t.bounds;t.bounds={left:n.left-e.left,top:n.top-e.top,width:n.width,height:n.height}}),{left:t.left+e.left,top:t.top+e.top,width:e.width,height:e.height}},this),this.__MUTATING__=!1,this.parent.isGroup()&&this.parent.calculateBounds?.()}render(t){}postrender(t){const{top:e,left:n}=this.state;t.translate(n,e),this.layout.drawables(this).forEach(e=>{e.draw(t)}),t.translate(-n,-e)}}hc.memoize(Yy.prototype,"bounds",!0),hc.register("group",Yy);const Wy={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"id-input",label:"ref",name:"ref"},{type:"select",label:"fit",name:"fit",property:{options:["","both","ratio"]}}],"value-property":"ref",help:"scene/component/local-ref"};class qy extends(pc(dc)){get ref(){const t=this.getState("ref");return t&&"string"==typeof t?this.root.findById?.(t):null}set ref(t){this.setState("ref",t)}get refScale(){const t=this.ref;if(!t)return{x:1,y:1};const e=t.bounds,n=this.bounds,i=n.width/e.width,s=n.height/e.height;return"both"===this.model.fit?{x:i,y:s}:{x:Math.min(i,s),y:Math.min(i,s)}}draw(t){this._drawing||(this._drawing=!0,super.draw(t),this._drawing=!1)}prerender(t){if(super.prerender(t),this.ref){const e=this.ref.center,n=this.center,i=this.refScale;t.translate(n.x,n.y),t.scale(i.x,i.y),t.translate(-e.x,-e.y)}}postrender(t){if(this.ref)return this.ref.postrender(t);super.postrender(t)}render(t){if(this.ref)return this.ref.render(t);const{left:e,top:n,width:i,height:s}=this.bounds;t.beginPath(),t.rect(e,n,i,s)}get nature(){return Wy}get hasTextProperty(){return!1}}hc.memoize(qy.prototype,"ref",!1),hc.memoize(qy.prototype,"refScale",!1),hc.register("local-ref",qy);class Xy extends($g(Rl)){render(t){}is3dish(){return!0}get layout(){return _c.get(this.get("layout"))||vc}}const Ky={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"board-selector",label:"scene-number",name:"ref",placeholder:"SCENE-1"},{type:"number",label:"round",name:"round",property:{min:0}},{type:"select",label:"fit",name:"fit",property:{options:["","both","ratio","width","height","none"]}},{type:"select",label:"mode",name:"mode",property:{options:["view","interaction"]}}],"value-property":"ref",help:"scene/component/global-ref"};class Qy extends Xy{dispose(){this._releaseRef(),super.dispose()}get nature(){return Ky}get hasTextProperty(){return!1}get tagName(){return"div"}setElementProperties(t){const{mode:e="view",round:n=0}=this.state;t.style.pointerEvents="view"==e?"none":"inherit",t.style.borderRadius=n+"px"}async ready(){super.ready(),this.fetchRef()}reposition(){if(!this.element)return;super.reposition();const t=this._element_bounds,{offsetWidth:e,offsetHeight:n}=this.element;if(this._element_bounds={offsetWidth:e,offsetHeight:n},(!t||t.offsetWidth!=e||t.offsetHeight!=n)&&this.ref&&this.root.target_element){const{fit:t="ratio"}=this.state;this.ref.fit(t)}}async fetchRef(){this._releaseRef();const{ref:t,fit:e="ratio"}=this.state;if(!t)return;const n=this.app.refProvider;if(n&&t){const i=(async()=>{this.__ref=await n.get(t,!0),this.__ref.target=this.element,this.__ref.fit(e),this.__ref.data=this.data})();this.root?.app?.loadTracker?.track(`ref:${t}`,"ref-board",t,i);try{await i}catch(t){Bi(t)}}}get ref(){return this.__ref}set ref(t){this.setState("ref",t)}_releaseRef(){this.__ref&&this.__ref.release&&this.__ref.release(),delete this.__ref}onchange(t,e,n){super.onchange(t,e),"ref"in t&&this.fetchRef(),"fit"in t&&this.ref&&requestAnimationFrame(()=>{const{fit:t}=this.state;this.ref.fit(t)}),"data"in t&&this.ref&&requestAnimationFrame(()=>{this.ref.data=t.data})}}hc.register("global-ref",Qy);const Zy="center-middle",Jy={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"board-selector",label:"board",name:"board"},{type:"checkbox",label:"modal",name:"modal"},{type:"checkbox",label:"closable",name:"closable"},{type:"checkbox",label:"draggable",name:"draggable"},{type:"checkbox",label:"minimizable",name:"minimizable"},{type:"checkbox",label:"show",name:"show"},{type:"select",label:"popup-position",name:"popupPosition",property:{options:["static","absolute"]}},{type:"select",label:"popup-origin",name:"origin",property:{options:["left-top","center-top","right-top","left-middle",Zy,"right-middle","left-bottom","center-bottom","right-bottom","auto"]}},{type:"string",label:"title",name:"text"},{type:"data",label:"value",name:"value"},{type:"string",label:"container-ref",name:"containerRef",placeholder:"PopupContainer id (same board)"},{type:"textarea",label:"html-template",name:"htmlTemplate",property:{language:"html"}},{type:"string",label:"anchor-ref",name:"anchorRef",placeholder:"component id (3D-tracked anchor)"},{type:"select",label:"anchor-pin",name:"anchorPin",property:{options:[{display:"Top",value:"top"},{display:"Center",value:"center"},{display:"Bottom",value:"bottom"}]}},{type:"number",label:"anchor-offset-x",name:"anchorOffsetX"},{type:"number",label:"anchor-offset-y",name:"anchorOffsetY"},{type:"number",label:"anchor-offset-z",name:"anchorOffsetZ"},{type:"checkbox",label:"constant-size",name:"constantSize"},{type:"checkbox",label:"tether",name:"tether"},{type:"select",label:"off-screen",name:"offScreen",property:{options:[{display:"Hide",value:"hide"},{display:"Edge-pin",value:"edge-pin"},{display:"Keep last",value:"keep-last"}]}}],help:"scene/component/popup"};class tb extends(pc(dc)){static get image(){return tb._image||(tb._image=new Image,tb._image.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEYAAABGCAMAAABG8BK2AAADJmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuZGFiYWNiYiwgMjAyMS8wNC8xNC0wMDozOTo0NCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RkM4QzQxNUMzMzBEMTFFQ0JEMzZDMDUwQUI4MEI3QTAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RkM4QzQxNUQzMzBEMTFFQ0JEMzZDMDUwQUI4MEI3QTAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpENjlENTQ3RjMzMDkxMUVDQkQzNkMwNTBBQjgwQjdBMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpENjlENTQ4MDMzMDkxMUVDQkQzNkMwNTBBQjgwQjdBMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsiUYSQAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAA51BMVEVHcEwzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzOguTm2AAAATHRSTlMARhB73r9B7YLrsqdE+0cq9Avzeg31eQx4aQ+Ks6aUd5DsYKixEX1w8vyT2VjoZ3YezY/cCEDvl+QTvRwJ0ifwK/5T/aw6+IuFuCImAcS6MQAAAeJJREFUWMPt2FlX2zAQhuHJYmOSFhIggbC0QNn3rS1dKXSH9///Hi58CJLxKIpEWi6YO8c5z4lG/nxGEXmu/1OVLGnhrFaSVQYg1SZetTTvUibqeFZ9QlfmvRWoV1VmCaCRzroXPpsuAjTV7gLUfPahBqD1OQMW/fazAWTKvQRI/ZgUSJR7U8CM/dHZ+/2VcatWdvdEZAaYUhiAwkerJXt0rnzXwdRKmHfDM0fHD5kxjTFyVLzVfvvirn7+cDJWjhy7c7XlYuwc6Urvu2tRhRypyhwAf1sKY+TIxfQA+H39q5wxc+RgVrcBduTmZTlj5khnDgH4IzKpMGaOVCbvyyvRGTNHGtPrKypjXirM5jb910I4k69oQeKY+77EMAcALEsck/+W6f71tyCma/ZFROTrJVwMy7wmf3bv6/MX+Dgkkysblvxps/dhOKZb6IvrTakzXXuPApnpYneDGOeKvJlaSXcDmA7AicQyW84VeTOnY+NdiWcG1uiZksFEHdyAlsJEjEkmkwGNsKHNZCJGSKtVTYC1tO022mnjwUBrMdXg8dreuOBhv7D/62/8lGZ1wLxXyZKOm+iUHIQintyny0TkaATHjYgcjeAoFpEje9R/nGPqIx2aw3NU9odCQI6e6x/VLY32cKQXVBnkAAAAAElFTkSuQmCC"),tb._image}async ready(){await super.ready(),this.show&&this.onchangeShow(!0)}render(t){const{left:e,top:n,width:i,height:s}=this.bounds;t.beginPath(),this.drawImage(t,tb.image,e,n,i,s)}onchange(t,e){"value"in t?this.show?this.onchangeShow(!0):this.show=!0:"show"in t&&this.onchangeShow(this.show)}onchangeShow(t){if(this.app.isEditMode)return;(this.getState("board")||this.getState("containerRef")||this.getState("htmlTemplate"))&&(t?this.openPopup(this.value):this.hidePopup())}openPopup(t,e){if(this.app.isEditMode)return;const n=this.getState("anchorRef"),i=n&&this.rootModel?.findById?this.rootModel.findById(n):void 0;Zu.show(this,this.getState("board"),{origin:this.getState("origin")||Zy,modal:this.getState("modal"),closable:this.getState("closable")||!1,draggable:this.getState("draggable")||!1,minimizable:this.getState("minimizable")||!1,popupPosition:this.getState("popupPosition"),title:this.text,data:t||this.value,containerRef:this.getState("containerRef"),htmlTemplate:this.getState("htmlTemplate"),anchor:i,anchorPin:this.getState("anchorPin")||"top",anchorOffsetX:this.getState("anchorOffsetX")??0,anchorOffsetY:this.getState("anchorOffsetY")??0,anchorOffsetZ:this.getState("anchorOffsetZ")??0,constantSize:this.getState("constantSize")??!0,tether:this.getState("tether")??!1,offScreen:this.getState("offScreen")||"hide",...e})}hidePopup(){Zu.hide(this)}get board(){return this.getState("board")}set board(t){this.set("board",t)}get show(){return this.getState("show")}set show(t){this.setState("show",t)}get started(){return this.getState("show")}set started(t){this.setState("show",t)}get value(){return this.getState("value")}set value(t){this.setState("value",t)}get hasTextProperty(){return!1}get nature(){return Jy}}hc.register("popup",tb);const eb={mutable:!1,resizable:!0,rotatable:!1,properties:[{type:"layout",label:"layout",name:"layoutOption"},{type:"checkbox",label:"constant-size",name:"constantSize"},{type:"checkbox",label:"billboard",name:"billboard"},{type:"checkbox",label:"tether",name:"tether"},{type:"select",label:"off-screen",name:"offScreen",property:{options:[{display:"Hide",value:"hide"},{display:"Edge-pin",value:"edge-pin"},{display:"Keep last",value:"keep-last"}]}}],help:"scene/component/popup-container"};class nb extends Wg{get nature(){return eb}isPopupContainer(){return!0}}hc.register("popup-container",nb);class ib extends hc{render(t){const{path:e=[]}=this.state;if(!(e.length<=1)){t.beginPath(),t.moveTo(e[0].x,e[0].y);for(let n=1;n<e.length;n++)t.lineTo(e[n].x,e[n].y);t.closePath(),this.drawStroke(t,void 0)}}get path(){return this.model.path}set path(t){this.set("path",t)}contains(t,e){const n=this.state.path;let i=!1;return n.forEach((s,r)=>{const o=(r+n.length+1)%n.length,a=s.x,c=s.y,l=n[o].x,h=n[o].y;c>e!=h>e&&t<(l-a)*(e-c)/(h-c)+a&&(i=!i)}),i}}hc.register("path",ib);const sb={mutable:!0,resizable:!1,rotatable:!0,properties:[{type:"number",label:"round",name:"round",property:{min:0,max:100,step:1}}],help:"scene/component/triangle"};class rb extends dc{is3dish(){return!0}contains(t,e){const{x1:n,y1:i,x2:s,y2:r,x3:o,y3:a}=this.state,c=[n,i,s,r,o,a];let l=!1;for(let n=0;n<c.length;n+=2){const i=(n+2)%c.length,s=c[n],r=c[n+1],o=c[i+1];r>e!=o>e&&t<(c[i]-s)*(e-r)/(o-r)+s&&(l=!l)}return l}get mutable(){return!0}get path(){const{x1:t,y1:e,x2:n,y2:i,x3:s,y3:r}=this.state;return[{x:t,y:e},{x:n,y:i},{x:s,y:r}]}set path(t){this.set({x1:t[0].x,y1:t[0].y,x2:t[1].x,y2:t[1].y,x3:t[2].x,y3:t[2].y})}get nature(){return sb}}hc.memoize(rb.prototype,"path",!1),hc.register("triangle",rb);const ob={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"ratio",name:"ratio",property:"ratio"}],help:"scene/component/donut"},ab={ondragmove:function(t,e,n){let{cx:i,rx:s}=n.model;s=Math.abs(s);let r=(n.fromParent(t.x,t.y).x-i)/s*100;r=r>=100||r<=-100?100:Math.abs(r),n.set({ratio:r})}};class cb extends ly{is3dish(){return!0}render(t){let{ratio:e=50,cx:n,cy:i,rx:s,ry:r,startAngle:o,endAngle:a,anticlockwise:c}=this.state;s=Math.abs(s),r=Math.abs(r),t.beginPath(),t.ellipse(n,i,s,r,0,o||0,a||2*Math.PI,c),t.moveTo(n+s/100*e,i),t.ellipse(n,i,s/100*e,r/100*e,0,o||0,a||2*Math.PI,!0)}contains(t,e){let{cx:n,cy:i,rx:s,ry:r,ratio:o}=this.state;s=Math.abs(s),r=Math.abs(r);const a=(t-n)/(2*s-.5),c=(e-i)/(2*r-.5),l=(t-n)/(s/100*o*2-.5),h=(e-i)/(r/100*o*2-.5);let d=!1;return a*a+c*c<.25&&l*l+h*h>.25&&(d=!d),d}get controls(){let{cx:t,cy:e,rx:n,ratio:i}=this.state;return n=Math.abs(n),[{x:t+n/100*i,y:e,handler:ab}]}get nature(){return ob}}hc.memoize(cb.prototype,"controls",!1),hc.register("donut",cb);const lb={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"ratio",name:"ratio",property:"ratio"},{type:"number",label:"wing",name:"wing",property:"wing"}],help:"scene/component/star"},hb={ondragmove:function(t,e,n){const{cy:i,ry:s}=n.model;let r=(n.fromParent(t.x,t.y).y-i)/s*100+100;r>=100?r=100:r<=0&&(r=0),n.set({ratio:r})}};class db extends ly{is3dish(){return!0}render(t){const{ratio:e=30,wing:n=5,cx:i,cy:s,rx:r,ry:o}=this.state;if(n<3)return;const a=1.5707963267948966,c=2*Math.PI/n,l=r-e/100*r,h=o-e/100*o;t.save(),t.beginPath(),t.translate(i,s),t.moveTo(r*Math.cos(-a),o*Math.sin(-a)),t.lineTo((r-l)*(Math.cos(c-a)+Math.cos(0-a))/2,(o-h)*(Math.sin(c-a)+Math.sin(0-a))/2);for(let e=1;e<n;e++)t.lineTo(r*Math.cos(c*e-a),o*Math.sin(c*e-a)),t.lineTo((r-l)*(Math.cos(c*(e+1)-a)+Math.cos(c*e-a))/2,(o-h)*(Math.sin(c*(e+1)-a)+Math.sin(c*e-a))/2);t.closePath(),t.restore()}get controls(){const{cx:t,cy:e,ry:n,ratio:i}=this.state;return[{x:t,y:e-n+n*(i/100),handler:hb}]}get nature(){return lb}}hc.memoize(db.prototype,"controls",!1),hc.register("star",db);const ub={mutable:!1,resizable:!1,rotatable:!1,properties:[]};class pb extends(Nf(dc)){is3dish(){return!1}isDescendible(){return!1}render(t){const{cx:e,cy:n,anticlockwise:i}=this.state,s=this.app?.scale||1;t.beginPath(),t.scale(1/s,1/s),t.ellipse(e,n,Math.abs(pb.RADIUS),Math.abs(pb.RADIUS),0,0,2*Math.PI,i),t.scale(s,s),t.closePath()}get path(){const{cx:t,cy:e}=this.state;return[{x:t-pb.RADIUS,y:e-pb.RADIUS},{x:t+pb.RADIUS,y:e-pb.RADIUS},{x:t+pb.RADIUS,y:e+pb.RADIUS},{x:t-pb.RADIUS,y:e+pb.RADIUS}]}set path(t){const e=t[0],n=t[2];this.set({cx:e.x+(n.x-e.x)/2,cy:e.y+(n.y-e.y)/2})}contains(t,e){const{cx:n,cy:i}=this.state,s=(t-n)/(2*pb.RADIUS-.5),r=(e-i)/(2*pb.RADIUS-.5);return s*s+r*r<.25}outline(t){const{cx:e,cy:n}=this.state;return this.toScene(e,n)}get nature(){return ub}}pb.RADIUS=5,hc.memoize(pb.prototype,"path",!1),hc.register("node",pb);class fb extends iu{getObject3dInstance(){return new M.Mesh}build(){super.build();const{width:t,height:e}=this.component.bounds,n=this.component.state.depth||.5*Math.min(t,e),i=.15*Math.min(t,e,n),s=new v.RoundedBoxGeometry(1,1,1,4,i/Math.min(t,e,n));s.scale(t,n,e),this.object3d.geometry=s,this.object3d.material=new M.MeshStandardMaterial({color:"#5090d0",transparent:!0,opacity:.35,roughness:.6,metalness:.1,side:M.FrontSide,depthWrite:!1}),this.object3d.visible=!!this.component.app?.isEditMode}updateAlpha(){const t=this.object3d.material;t&&(t.opacity=this.component.app?.isEditMode?.35:0)}updateHidden(){this.object3d.visible=!!this.component.app?.isEditMode&&!this.component.state.hidden}updateDimension(){const{width:t,height:e}=this.component.bounds,n=this.component.state.depth||.5*Math.min(t,e);this.object3d.geometry.computeBoundingBox();const i=this.object3d.geometry.boundingBox;if(i){const s=i.max.x-i.min.x,r=i.max.y-i.min.y,o=i.max.z-i.min.z;this.setDimensionScale(t/s,n/r,e/o)}}updateFillStyle(){}updateStrokeStyle(){}updateText(){}clear(){return Vd(this.object3d),super.clear()}}const mb="data:image/svg+xml;base64,"+btoa('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="#5090d0">\n <path d="M32 20a12 12 0 1 0 0 24 12 12 0 0 0 0-24zm0 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12z"/>\n <path d="M55.4 27.2l-3.6-.6c-.4-1.2-.8-2.4-1.4-3.4l2.2-3c.6-.8.4-2-.2-2.6l-3-3c-.8-.6-1.8-.8-2.6-.2l-3 2.2c-1.2-.6-2.2-1-3.4-1.4l-.6-3.6c-.2-1-1-1.6-2-1.6h-4.2c-1 0-1.8.6-2 1.6l-.6 3.6c-1.2.4-2.4.8-3.4 1.4l-3-2.2c-.8-.6-2-.4-2.6.2l-3 3c-.6.8-.8 1.8-.2 2.6l2.2 3c-.6 1.2-1 2.2-1.4 3.4l-3.6.6c-1 .2-1.6 1-1.6 2v4.2c0 1 .6 1.8 1.6 2l3.6.6c.4 1.2.8 2.4 1.4 3.4l-2.2 3c-.6.8-.4 2 .2 2.6l3 3c.8.6 1.8.8 2.6.2l3-2.2c1.2.6 2.2 1 3.4 1.4l.6 3.6c.2 1 1 1.6 2 1.6h4.2c1 0 1.8-.6 2-1.6l.6-3.6c1.2-.4 2.4-.8 3.4-1.4l3 2.2c.8.6 2 .4 2.6-.2l3-3c.6-.8.8-1.8.2-2.6l-2.2-3c.6-1.2 1-2.2 1.4-3.4l3.6-.6c1-.2 1.6-1 1.6-2v-4.2c0-1-.6-1.8-1.6-2z"/>\n</svg>');class gb extends(pc(hc)){static get icon(){return gb._defaultIcon||(gb._defaultIcon=new Image,gb._defaultIcon.src=mb),gb._defaultIcon}get serviceName(){}get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new fb(this)}render(t){if(this.app?.isViewMode)return;const{left:e,top:n,width:i,height:s}=this.bounds,r=this.constructor.icon;t.beginPath(),t.globalAlpha=.6,this.drawImage(t,r,e,n,i,s),t.globalAlpha=1}added(t){super.added(t);const e=this.serviceName;e&&(this._registeredRoot=this.root,this._registeredRoot?.registerService?.(e,this))}removed(t){const e=this.serviceName;e&&this._registeredRoot&&(this._registeredRoot.unregisterService?.(e),this._registeredRoot=void 0),super.removed(t)}get controls(){return[]}}function yb(t){return class extends t{animOnValueChange(t,e=!1,n){if(t==this._lastValue)return;if(this.root?.app?.suppressAnimations)return this._lastValue=t,this._anim_alpha=0,void this.invalidate();let i;i=e?t-(Number(n)||0):t-(this._lastValue||0),this._lastValue=t,this._anim_alpha=-i,this.animate({step:t=>{this._anim_alpha=i*(t-1),this.invalidate()},duration:1e3,delta:"circ",options:{x:1},ease:"out"}).start()}dispose(){super.dispose(),delete this._value_substitutor}onchange(t,e){t.hasOwnProperty("value")&&delete this._value_substitutor}get animAlpha(){return this._anim_alpha||0}get animValue(){return(this._lastValue||0)+(this._anim_alpha||0)}defaultValueSubstitutor(){return this.getState("value")}get valueSubstitutor(){return this._value_substitutor||(this._value_substitutor=kr(this.getState("value"),this,void 0)||this.defaultValueSubstitutor),this._value_substitutor}get value(){return Number(this.valueSubstitutor())||0}set value(t){delete this._value_substitutor,this.setState("value",Number(hi(t)))}}}function bb(t){return class extends t{_convertDataFormat(t,e){let n;if("json"===e)n=JSON.parse(t);else n=t;return n}isDataSource(){return!0}}}function _b(t){var e;return(e=class extends t{is3dish(){return!0}get hasTextProperty(){return!1}get capturable(){return!1}render(t){}}).raycastTargetDefault=!1,e.requires3d=!0,e}const vb="$base_url",xb=[{type:"gltf-preset",label:"preset",name:"preset"},{type:"gltf-selector",label:"url",name:"src",property:{displayField:"id",displayFullUrl:!0,baseUrlAlias:vb,defaultStorage:"3d-model",storageFilters:{type:Array,value:[{name:"category",value:"image"}]},useUpload:!0,category:"application"},observe:function(t){const e=this.parentNode?.querySelector("[name=gltfInfo]");e&&(e.src=t);const n=this.parentNode?.querySelector("[name=fillStyleTargets]");n&&(n.src=t);const i=this.parentNode?.querySelector("[name=playTargets]");i&&(i.src=t)}},{type:"gltf-info",label:"",name:"gltfInfo",readonly:!0,property:{action:(t,e)=>{t._ratioLocking=!0;try{t.set(e)}finally{t._ratioLocking=!1}}},editor:{fullwidth:!0}},{type:"gltf-fill-targets",label:"fill-targets",name:"fillStyleTargets",editor:{fullwidth:!0}},{type:"gltf-play-targets",label:"play-targets",name:"playTargets",editor:{fullwidth:!0}}];function wb(t){return class extends t{constructor(){super(...arguments),this._snapshotLoading=!1,this._ratioLocking=!1}is3dish(){return!0}get hasTextProperty(){return!1}get controls(){return[]}render(t){const{left:e,top:n,width:i,height:s}=this.bounds;t.beginPath();const r=this._topViewSnapshot;if(r)return void t.drawImage(r,e,n,i,s);this._ensureTopViewSnapshot(),t.rect(e,n,i,s),t.fillStyle="#f0f0f0",t.fill(),t.strokeStyle="#999",t.lineWidth=1,t.stroke();const o=this.getState("src"),a=o&&o.split("/").pop()?.replace(/\.[^.]+$/,"")||"GLTF",c=Math.max(10,.12*Math.min(i,s));t.fillStyle="#666",t.font=`${c}px sans-serif`,t.textAlign="center",t.textBaseline="middle",t.fillText(a,e+i/2,n+s/2,.9*i)}onchange(t,e){super.onchange?.(t,e),"src"in t&&(this._topViewSnapshot=void 0)}_ensureTopViewSnapshot(){if(this._snapshotLoading)return;const t=this.getState("src");if(!t)return;const e=hu.getTopViewCache(t);if(e)return this._topViewSnapshot=e,void this.invalidate();this._snapshotLoading=!0;const n=this.app.url(t);hu.loadGLTF(n).then(e=>{if(this._snapshotLoading=!1,this.getState("src")!==t)return;const n=hu.getTopViewCache(t);if(n)return this._topViewSnapshot=n,void this.invalidate();const i=hu.renderTopView(e.scene);hu.setTopViewCache(t,i),this._topViewSnapshot=i,this.invalidate()}).catch(()=>{this._snapshotLoading=!1})}buildRealObject(){return new hu(this)}get source(){return this.getState("src")}set source(t){this.setState("src",t)}get play(){return!1!==this.getState("play")}set play(t){this.setState("play",t)}get nodes(){return this.getState("nodes")}set nodes(t){this.setState("nodes",t)}get animations(){return this.getState("animations")}set animations(t){this.setState("animations",t)}get playTargets(){return this.getState("playTargets")}set playTargets(t){this.setState("playTargets",t)}get fillStyleTargets(){return this.getState("fillStyleTargets")}set fillStyleTargets(t){this.setState("fillStyleTargets",t)}get nodeNames(){const t=this.realObject;return t?.nodeNames??[]}get animationNames(){const t=this.realObject;return t?.animationNames??[]}set dimension(t){const{width:e=1,height:n=1,depth:i=1}=t;this.setState({width:e,height:n,depth:i}),this.realObject?.updateDimension()}_applyRatioLock(t){if(!("width"in t||"height"in t||"depth"in t))return t;const e=this.state.width||1,n=this.state.height||1,i=this.state.depth||1,s=df([(t.width??e)/e,(t.height??n)/n,(t.depth??i)/i]);return s?{...t,width:Math.round(e*s),height:Math.round(n*s),depth:Math.round(i*s)}:t}set(t,e){if("string"==typeof t&&(t={[t]:e}),this.state?.ratioLock&&!this._ratioLocking){this._ratioLocking=!0;try{t=this._applyRatioLock(t)}finally{}}try{return super.set(t)}finally{this._ratioLocking=!1}}setState(t,e){if("string"==typeof t&&(t={[t]:e}),this.state?.ratioLock&&!this._ratioLocking){this._ratioLocking=!0;try{t=this._applyRatioLock(t)}finally{}}try{return super.setState(t)}finally{this._ratioLocking=!1}}}}function Mb(t){return function(e){return Array.isArray(t)?t.forEach(t=>{hc.register(t,e)}):hc.register(t,e),e}}function Sb(t){return!!t&&"function"==typeof t.capacity&&"function"==typeof t.available}function Ab(t){if(Sb(t)){const e=t.capacity(),n=t.available();return{capacity:e,available:n,isFull:0===n}}if("function"==typeof t?.slotIds){const e=t.slotIds().length,n="function"==typeof t.emptySlotIds?t.emptySlotIds().length:e;return{capacity:e,available:n,isFull:0===n}}const e=t?.state?.capacity,n=Array.isArray(t?.state?.data)?t.state.data.length:0;if("number"==typeof e){const t=Math.max(0,e-n);return{capacity:e,available:t,isFull:0===t}}return{capacity:1/0,available:1/0,isFull:!1}}class Eb{constructor(){this.wasFull=!1,this.availableListeners=[],this.fullListeners=[]}notify(t){const e=0===t;if(e&&!this.wasFull){this.wasFull=!0;for(const t of this.fullListeners)try{t()}catch(t){}}else if(!e&&this.wasFull){this.wasFull=!1;for(const t of this.availableListeners)try{t()}catch(t){}}}onAvailable(t){return this.availableListeners.push(t),()=>{const e=this.availableListeners.indexOf(t);e>=0&&this.availableListeners.splice(e,1)}}onFull(t){return this.fullListeners.push(t),()=>{const e=this.fullListeners.indexOf(t);e>=0&&this.fullListeners.splice(e,1)}}dispose(){this.availableListeners=[],this.fullListeners=[]}}function kb(t,e){if(!t||!e)return()=>{};if("function"!=typeof t.pauseEmit||"function"!=typeof t.resumeEmit)return()=>{};if("function"!=typeof e.onFull||"function"!=typeof e.onAvailable)return()=>{};const n=e.onFull(()=>t.pauseEmit()),i=e.onAvailable(()=>t.resumeEmit());return Ab(e).isFull&&t.pauseEmit(),()=>{n?.(),i?.()}}class Cb{constructor(t,e=1,n="horizontal"){this.owner=t,this.itemSpacing=e,this.axis=n}positionAt(t,e,n,i){const s=e.maxCount??1/0;if(t<0||t>=s)return null;const r=this.owner?.state?.width??0,o=this.owner?.state?.height??0,a=i?.state?.width??0,c=i?.state?.height??0;return"horizontal"===this.axis?{x:t*this.itemSpacing,y:Math.max(0,(o-c)/2),z:0}:{x:Math.max(0,(r-a)/2),y:t*this.itemSpacing,z:0}}capacity(t){return t.maxCount??1/0}}function Tb(t,e,n,i,s,r,o){const a=n.w,c=n.h,l=i.w,h=i.h,d=i.d,u=[],p=l+s,f=h+s,m=Math.max(1,Math.floor((a+s)/p)),g=Math.max(1,Math.floor((c+s)/f)),y=m*g,b=r&&r>0?Math.floor(r):4;if("row"===t||"column"===t){const n=o?.advanceAlongX??!1,i=o?.reverse??!1,s=n?m:g,r=n?g:m,l=(t,e,i)=>((t,e,n)=>u.push({x:-a/2+(t+.5)*p,y:n*d+d/2,z:-c/2+(e+.5)*f}))(n?t:e,n?e:t,i);let h=0;for(let n=0;n<s&&h<e;n++){const o=i?s-1-n:n;if("column"===t)for(let t=0;t<r&&h<e;t++)for(let n=0;n<b&&h<e;n++)l(o,t,n),h++;else for(let t=0;t<b&&h<e;t++)for(let n=0;n<r&&h<e;n++)l(o,n,t),h++}return u}if("pyramid"===t){let t=e,n=0;for(;t>0;){const e=Math.max(1,m-n),i=Math.max(1,g-n),s=e*i,o=Math.min(t,s);for(let t=0;t<o;t++){const s=t%e,r=Math.floor(t/e),o=-a/2+(s+(m-e)/2+.5)*p,l=-c/2+(r+(g-i)/2+.5)*f;u.push({x:o,y:n*d+d/2,z:l})}if(t-=o,n++,1===e&&1===i){for(let e=0;e<t;e++)u.push({x:0,y:(n+e)*d+d/2,z:0});break}if(r&&n>=r)break}return u}if("pile"===t){const t=t=>(43758.5453*Math.sin(12.9898*t)%1+1)%1;for(let n=0;n<e;n++){const e=Math.floor(n/y),i=n%y,s=i%m,o=Math.floor(i/m),g=(t(2*n)-.5)*l*.2,b=(t(2*n+1)-.5)*h*.2,_=-a/2+(s+.5)*p+g,v=-c/2+(o+.5)*f+b;if(u.push({x:_,y:e*d+d/2,z:v}),r&&e>=r-1&&i===y-1)break}return u}for(let n=0;n<e;n++){const e=Math.floor(n/y);if(r&&e>=r)break;const i=n%y,s=i%m,o=Math.floor(i/m);let l=-a/2+(s+.5)*p;const h=-c/2+(o+.5)*f;"staggered"===t&&e%2==1&&(l+=p/2),u.push({x:l,y:e*d+d/2,z:h})}return u}class Pb{constructor(t,e={}){this.pattern=t,this.defaults=e}layout(t,e,n,i={}){const s=i.gap??this.defaults.gap??0,r=i.heightLimit??this.defaults.heightLimit,o=i.fill??this.defaults.fill;return Tb(this.pattern,t,e,n,s,r,o).map(t=>({position:t}))}}class Ob{constructor(t,e,n={}){this.cols=t,this.rows=e,this.defaults=n}layout(t,e,n,i={}){const s=Math.max(1,this.cols),r=Math.max(1,this.rows),o=s*r,a=i.gap??this.defaults.gap??0,c=n.w+a,l=n.h+a,h=[];for(let e=0;e<t;e++){const t=Math.floor(e/o),i=e%o,a=i%s,d=Math.floor(i/s);h.push({position:{x:(a-(s-1)/2)*c,z:(d-(r-1)/2)*l,y:t*n.d+n.d/2}})}return h}}class Db{constructor(t=.1,e=!1,n=!1){this.gapRatio=t,this.fillFromFar=e,this.sliceFirst=n}grid(t,e){const n=e.w*this.gapRatio,i=e.h*this.gapRatio;return{cols:Math.max(1,Math.floor((t.w-n)/(e.w+n))),rows:Math.max(1,Math.floor((t.h-i)/(e.h+i))),pitchX:e.w+n,pitchZ:e.h+i}}capacity(t,e,n){const{cols:i,rows:s}=this.grid(t,e);return i*s*Math.max(1,Math.floor(n))}layout(t,e,n,i={}){const{cols:s,rows:r,pitchX:o,pitchZ:a}=this.grid(e,n),c=n.d+n.d*this.gapRatio,l=null!=i.heightLimit?Math.max(1,Math.floor(i.heightLimit)):1/0,h=Number.isFinite(l),d=this.sliceFirst&&h,u=s*r,p=s*(h?l:1),f=s*r*(h?l:t),m=Math.min(t,f),g=[];for(let t=0;t<m;t++){let e,i,l;if(d){const n=Math.floor(t/p),r=t%p;e=r%s,l=Math.floor(r/s),i=n}else{l=Math.floor(t/u);const n=t%u;e=n%s,i=Math.floor(n/s)}this.fillFromFar&&(i=r-1-i),g.push({position:{x:(e-(s-1)/2)*o,z:(i-(r-1)/2)*a,y:l*c+n.d/2}})}return g}}function zb(t,e,n,i=0){for(let s=0;s<e.length;s++){const r=e[s],o=n[s];r&&o&&(r.parent!==t&&t.attach(r),r.position.set(o.position.x,i+o.position.y,o.position.z),o.rotation?r.quaternion.set(o.rotation.x,o.rotation.y,o.rotation.z,o.rotation.w):r.quaternion.identity())}}function Ib(t,e,n,i=.12){const s=e.left+e.width/2,r=e.top+e.height/2,o=Math.min(n.w,n.h)*i,a=new Map;for(const e of t){const t=`${Math.round(e.position.x)},${Math.round(e.position.z)}`;let i=a.get(t);i||(i={x:s+e.position.x-n.w/2+o,y:r+e.position.z-n.h/2+o,w:n.w-2*o,h:n.h-2*o,count:0},a.set(t,i)),i.count++}return[...a.values()]}function Rb(t){return{id:t?.state?.id??t?.id??t?.refid,type:t?.state?.type??t?.type}}const jb=new M.Euler;function Lb(t,e){jb.setFromQuaternion(new M.Quaternion(e.x,e.y,e.z,e.w),"YXZ"),t.rotationX=jb.x,t.rotation=-jb.y,t.rotationY=jb.z}const Fb="_transferSlotId",Nb=new Set(["left","top","width","height","depth","zPos","rotation","rotationX","rotationY","rotationZ","scale","translate","material3d","fillStyle","strokeStyle","lineWidth","lineDash","alpha","opacity","hidden","text","fontColor","fontSize","fontFamily","bold","italic","textAlign","textBaseline","shadow","border","cssText","object3d","_realObject","refid","id"]);function Bb(t){return class extends t{async ready(){await super.ready();const t=this.state?.data;Array.isArray(t)&&0===this._items.length&&!this.isRecordStorage&&this._reconcileItems(t)}set data(t){if(Array.isArray(t)){if(this.isRecordStorage){const e=this.setState;return void("function"==typeof e&&e.call(this,{data:t}))}this._reconcileItems(t)}else this.setState?.({data:t})}get data(){if(this.isRecordStorage)return this.state?.data??[];const t=this._exportSlotRecords();return 0===t.length?this.state?.data:t}_reconcileItems(t){const e=new Map;for(const n of t){const t=this._recordKey(n);t&&e.set(t,n)}const n=new Map;for(const t of this._items){const e=t[Fb];null!=e&&n.set(String(e),t)}for(const[t,i]of n)if(!e.has(t)){try{this.removeItem(i,!0)}catch{}try{i?.dispose?.()}catch{}}for(const[t,i]of e){if(n.has(t))continue;if(null==i.itemId)continue;const e=this._createItemFromRecord(i);if(e){e[Fb]=t;try{this.handoverIn(e)}catch{}}}for(const[t,i]of e){const e=n.get(t);if(e&&(i.itemState&&"function"==typeof e.setState))try{e.setState(i.itemState)}catch{}}}_exportSlotRecords(){const t=this.slotIds?.()??[],e=[],n=new Map,i=[];for(const t of this._items){const e=t[Fb];null!=e?n.set(String(e),t):i.push(t)}for(const i of t){const t=n.get(i)??null;e.push(this._slotRecordOf(i,t))}for(const t of i)e.push(this._slotRecordOf("",t));for(const[i,s]of n)t.includes(i)||e.push(this._slotRecordOf(i,s));return e}_recordKey(t){return t.slotId??t.cellId??""}_slotRecordOf(t,e){if(!e)return{slotId:t,itemId:null};const n=e?.state?.id;return{slotId:t,itemId:null!=n?String(n):null,itemType:e?.state?.type,itemState:this._extractItemState(e)}}_extractItemState(t){const e=t?.state;if(!e||"object"!=typeof e)return;const n=this._businessFields?.();if(Array.isArray(n)){if(0===n.length)return;const t={};for(const i of n)i in e&&void 0!==e[i]&&(t[i]=e[i]);return Object.keys(t).length>0?t:void 0}const i={};for(const t of Object.keys(e))Nb.has(t)||t.startsWith("_")||(i[t]=e[t]);return Object.keys(i).length>0?i:void 0}_businessFields(){return null}_createItemFromRecord(t){const e=t.itemType??t.type;if(!e)return null;try{const n=hc.register?.(e);if(n&&"function"==typeof n){return new n({type:e,...t.itemState??{}})}}catch{}return null}}}class Hb{positionAt(t,e,n){return 0!==t?null:e.localPosition??{x:0,y:0,z:0}}capacity(t){return 1}}const $b=new Hb,Gb=[{id:"__default__",maxCount:1/0}];function Vb(t){var e;return e=class extends t{get slots(){return[]}get arrangementStrategy(){return $b}canReceive(t,e){const n=null!==this.findSlot(t);return Au.log({role:"target",contract:"canReceive",component:this,args:{carrier:Rb(t)},result:n}),n}findSlot(t){const e=this.slots.length?this.slots:Gb;for(const n of e){if(n.allowedTypes?.length){const e=t?.state?.type??t?.type;if(!e||!n.allowedTypes.includes(e))continue}const e=n.maxCount??this.arrangementStrategy.capacity(n),i=this._countOccupied(n.id);if(!(i>=e))return Au.log({role:"target",contract:"findSlot",component:this,args:{carrier:Rb(t)},result:{slotId:n.id,occupied:i,max:e}}),n}return Au.log({role:"target",contract:"findSlot",component:this,args:{carrier:Rb(t)},result:null}),null}acceptanceRotation(t,e){}deliveryWorldRotation(t){const e=this.acceptanceRotation?.(t);if(!e)return;const n=this._realObject?.object3d;if(!n)return;n.updateWorldMatrix(!0,!1);const i=new M.Quaternion;n.getWorldQuaternion(i);const s=new M.Quaternion(e.x,e.y,e.z,e.w);return i.clone().multiply(s)}deliveryWorldPosition(t){const e=this._realObject,n=e?.object3d;if(!n)return;n.updateWorldMatrix(!0,!1);const i=new M.Vector3;n.getWorldPosition(i);const s=this._receivingSurfaceLocalY();if(null!==s){const t=new M.Vector3(0,s,0);return n.localToWorld(t),{x:i.x,y:t.y,z:i.z}}return{x:i.x,y:i.y,z:i.z}}attachPointFor(t){const e=t?.[Fb];if(!e)return null;const n=this.slots.find(t=>t.id===e);return n?{position:n.localPosition??{x:0,y:0,z:0},rotation:n.localRotation??{x:0,y:0,z:0},slotId:n.id}:null}placementFor(t,e={}){const n=t&&"object"==typeof t&&"state"in t?t:void 0,i=n?n.state??{}:t??{},s={width:Number(i.width)||0,height:Number(i.height)||0,depth:Number(i.depth)||0},r=e.slot??this.slots.find(t=>{const e=t.maxCount??this.arrangementStrategy.capacity(t);return this._countOccupied(t.id)<e});if(!r)return null;const o=e.index??this._countOccupied(r.id),a=e.occupantCount??o,c=this.arrangementStrategy.positionAt(o,r,a,n??{state:{...s}});if(!c)return null;const l=Number(this.state?.width)||0,h=Number(this.state?.height)||0,d=c.x+s.width/2-l/2,u=c.y+s.height/2-h/2,p=this._realObject,f=p?.placementMode??"floor",m="space"===f?0:"inverted"===f?-s.depth/2:s.depth/2,g=this._receivingSurfaceLocalY();let y;y=null!==g?g+m:r.localPosition&&Number.isFinite(r.localPosition.z)?r.localPosition.z+m:m-(p?.geometricOffsetY??0);const b=this.acceptanceRotation?.(n??s,r)??void 0;return b?{position:{x:d,y:y,z:u},rotation:b}:{position:{x:d,y:y,z:u}}}_zPosFromSeatY(t,e,n){const i=this._realObject,s=i?.receivingSurfaceY??0,r=!(!n.localPosition||!Number.isFinite(n.localPosition.z));if(0===s&&!r)return null;const o=Number(e)||0,a=i?.placementMode??"floor";return t-("space"===a?0:"inverted"===a?-o/2:o/2)+(i?.geometricOffsetY??0)-s}_receivingSurfaceLocalY(){const t=this._realObject,e=t?.receivingSurfaceY;return"number"!=typeof e||0===e?null:e-(t.geometricOffsetY??0)}_countOccupied(t){const e=this._items;if(e)return e.filter(e=>e?.[Fb]===t).length;const n=this.components;return n?n.filter(e=>e.parent===this&&e[Fb]===t).length:0}},e.__hasCapacity=!0,e}function Ub(t,e){const n=t.left??0,i=t.top??0,s=t.width??0,r=t.height??0;if(s<=0||r<=0)return[];const o="number"==typeof t.rotation?t.rotation:0,a=Math.cos(o),c=Math.sin(o),l=n+s/2,h=i+r/2,d="inbound"===e?-1:1;return[{lx:-s/2,lz:0,odx:-1,odz:0},{lx:s/2,lz:0,odx:1,odz:0},{lx:0,lz:-r/2,odx:0,odz:-1},{lx:0,lz:r/2,odx:0,odz:1}].map(t=>{var e,n;return{worldPos:(e=t.lx,n=t.lz,{x:l+e*a-n*c,z:h+e*c+n*a}),direction:{x:d*(t.odx*a-t.odz*c),z:d*(t.odx*c+t.odz*a)},halfSpan:0!==t.odx?r/2:s/2}})}function Yb(t,e){const n=t.left??0,i=t.top??0,s=t.width??0,r=t.height??0;if(s<=0||r<=0)return{inbounds:[],outbounds:[]};const o="number"==typeof t.rotation?t.rotation:0,a=e??"reverse"===t.status,c="vertical"===t.orientation||"horizontal"!==t.orientation&&s<r,l=n+s/2,h=i+r/2,d=c?r/2:s/2,u=c?0:1,p=c?1:0,f=Math.cos(o),m=Math.sin(o),g=(t,e)=>({x:l+t*f-e*m,z:h+t*m+e*f}),y=c?{lx:0,lz:-d}:{lx:-d,lz:0},b=c?{lx:0,lz:d}:{lx:d,lz:0},_=g(y.lx,y.lz),v=g(b.lx,b.lz),x={x:u*f-p*m,z:u*m+p*f},w=Math.hypot(x.x,x.z)||1,M={x:x.x/w,z:x.z/w},S={x:-M.x,z:-M.z},A=(c?s:r)/2;return a?{inbounds:[{worldPos:v,direction:S,halfSpan:A}],outbounds:[{worldPos:_,direction:S,halfSpan:A}]}:{inbounds:[{worldPos:_,direction:M,halfSpan:A}],outbounds:[{worldPos:v,direction:M,halfSpan:A}]}}function Wb(t){const e=t.left??0,n=t.top??0,i=t.width??0,s=t.height??0;if(i<=0||s<=0)return null;const r="number"==typeof t.rotation?t.rotation:0,o="vertical"===t.orientation||"horizontal"!==t.orientation&&i<s,a=e+i/2,c=n+s/2,l=o?s/2:i/2,h=Math.cos(r),d=Math.sin(r),u=(t,e)=>({x:a+t*h-e*d,z:c+t*d+e*h});return{start:o?u(0,-l):u(-l,0),end:o?u(0,l):u(l,0)}}function qb(t){const e=t.cx??0,n=t.cy??0,i=Math.abs(t.rx??100),s=Math.abs(t.ry??100),r=t.ratio??50,o=(i+i*r/100)/2,a=(s+s*r/100)/2,c=t.startAngle??0,l=t.endAngle??Math.PI/2,h="reverse"===t.status;if(i<=0||s<=0)return{inbounds:[],outbounds:[]};const d={x:e+o*Math.sin(c),z:n-a*Math.cos(c)},u={x:e+o*Math.sin(l),z:n-a*Math.cos(l)},p={x:Math.cos(c),z:Math.sin(c)},f={x:Math.cos(l),z:Math.sin(l)};return h?{inbounds:[{worldPos:u,direction:{x:-f.x,z:-f.z}}],outbounds:[{worldPos:d,direction:{x:-p.x,z:-p.z}}]}:{inbounds:[{worldPos:d,direction:p}],outbounds:[{worldPos:u,direction:f}]}}function Xb(t){const e=Yb(t),n=e.outbounds[0];if(!n)return{inbounds:Ub(t,"inbound"),outbounds:[]};const i=Ub(t,"inbound").filter(t=>{const e=t.worldPos.x-n.worldPos.x,i=t.worldPos.z-n.worldPos.z;return Math.hypot(e,i)>1}),s=n.direction,r=[];for(const t of i){const e=t.direction.x*s.x+t.direction.z*s.z;if(Math.abs(e)>=.1)continue;const n=t.direction.x+s.x,i=t.direction.z+s.z,o=Math.hypot(n,i)||1;r.push({worldPos:t.worldPos,direction:{x:n/o,z:i/o},halfSpan:t.halfSpan})}return{inbounds:[...i,...r],outbounds:e.outbounds}}function Kb(t,e,n={}){const i=n.distance??5,s=n.cosine??.9;if(t.direction.x*e.direction.x+t.direction.z*e.direction.z<s)return!1;const r=t.worldPos.x-e.worldPos.x,o=t.worldPos.z-e.worldPos.z;if("number"==typeof t.halfSpan&&"number"==typeof e.halfSpan){const n=t.direction.x,s=t.direction.z;if(Math.abs(r*n+o*s)>i)return!1;const a=Math.abs(r*-s+o*n);return t.halfSpan+e.halfSpan-a>0}return Math.hypot(r,o)<=i}function Qb(t,e,n,i=0){const s=n.width??0,r=n.height??0;if(s<=0||r<=0)return!1;const o=(n.left??0)+s/2,a=(n.top??0)+r/2,c="number"==typeof n.rotation?n.rotation:0,l=Math.cos(-c),h=Math.sin(-c),d=t-o,u=e-a,p=d*l-u*h,f=d*h+u*l;return Math.abs(p)<=s/2+i&&Math.abs(f)<=r/2+i}function Zb(t,e,n){const i=n.width??0,s=n.height??0;if(i<=0||s<=0)return 1/0;const r=(n.left??0)+i/2,o=(n.top??0)+s/2;let a=t.x-r,c=t.z-o,l=e.x,h=e.z;const d="number"==typeof n.rotation?n.rotation:0;if(0!==d){const t=Math.cos(-d),e=Math.sin(-d),n=a*e+c*t,i=l*e+h*t;a=a*t-c*e,c=n,l=l*t-h*e,h=i}const u=i/2,p=s/2;let f=-1/0,m=1/0;if(Math.abs(l)<1e-9){if(a<-u||a>u)return 1/0}else{const t=(-u-a)/l,e=(u-a)/l;f=Math.max(f,Math.min(t,e)),m=Math.min(m,Math.max(t,e))}if(Math.abs(h)<1e-9){if(c<-p||c>p)return 1/0}else{const t=(-p-c)/h,e=(p-c)/h;f=Math.max(f,Math.min(t,e)),m=Math.min(m,Math.max(t,e))}return m<f?1/0:f>=0?f:m>=0?Math.min(-f,m):-m}function Jb(t,e,n,i=6){return!!Qb(t.worldPos.x,t.worldPos.z,e,i)&&(!n||t.direction.x*n.x+t.direction.z*n.z>=0)}function t_(t,e,n){return t.outbounds.map(t=>{const i=[];for(const s of e){let e=null;for(const i of s.topology.inbounds){if(!Kb(t,i,n))continue;const s=t.worldPos.x-i.worldPos.x,r=t.worldPos.z-i.worldPos.z,o=Math.hypot(s,r);(null===e||o<e)&&(e=o)}if(null===e&&s.bounds){const i=s.topology.outbounds[0]?.direction,r=!(s.topology.outbounds&&s.topology.outbounds.length)?n?.sinkMargin??30:6;if(Jb(t,s.bounds,i,r)){const n=Zb(t.worldPos,t.direction,s.bounds);if(Number.isFinite(n))e=n+1e3;else{const n=(s.bounds.left??0)+(s.bounds.width??0)/2,i=(s.bounds.top??0)+(s.bounds.height??0)/2;e=Math.hypot(t.worldPos.x-n,t.worldPos.z-i)+1e3}}}null!==e&&i.push({id:s.id,dist:e})}return 0===i.length?null:(i.sort((t,e)=>t.dist-e.dist||(t.id<e.id?-1:1)),i[0].id)})}function e_(t,e){const n=new Map;for(const e of t)n.set(e.id,e);const i=new Map,s=new Set;for(const n of t){const r=t.filter(t=>t.id!==n.id),o=t_(n.topology,r,e);i.set(n.id,o);for(const t of o)null!=t&&s.add(t)}const r=(t,e)=>{if(!n.has(t)||!n.has(e)||t===e)return;const r=i.get(t)??[];r.includes(e)||(r.push(e),i.set(t,r),s.add(e))};for(const e of t)if(e.links){for(const t of e.links.downstream??[])r(e.id,t);for(const t of e.links.upstream??[])r(t,e.id)}const o=new Set,a=new Set;for(const e of t){(i.get(e.id)??[]).some(t=>null!=t)||o.add(e.id),s.has(e.id)||a.add(e.id)}return{nodes:n,out:i,sinks:o,sources:a}}function n_(t,e){const n=new Map;return(t.out.get(e)??[]).map(e=>{if(null==e)return new Set;const i=new Set([e]);for(const s of function(t,e,n){const i=n.get(e);if(i)return i;const s=new Set,r=[e],o=new Set([e]);for(;r.length;){const e=r.shift();for(const n of t.out.get(e)??[])null!=n&&(s.add(n),o.has(n)||(o.add(n),r.push(n)))}return n.set(e,s),s}(t,e,n))i.add(s);return i})}function i_(t,e,n,i){return e===n?0:function(t,e,n){const i=n.get(e);if(i)return i;const s=new Map([[e,0]]),r=[e];for(;r.length;){const e=r.shift(),n=s.get(e);for(const i of t.out.get(e)??[])null==i||s.has(i)||(s.set(i,n+1),r.push(i))}return n.set(e,s),s}(t,e,i).get(n)??1/0}function s_(t,e,n){const i=t.out.get(e)??[],s=new Map,r=[];for(let e=0;e<i.length;e++){const o=i[e];if(null==o)continue;const a=o===n?0:i_(t,o,n,s);a!==1/0&&r.push({i:e,hops:1+a})}return r.sort((t,e)=>t.hops-e.hops||t.i-e.i),r.map(t=>t.i)}function r_(t,e,n){const i=s_(t,e,n);return i.length?i[0]:-1}function o_(t,e,n){return e===n||s_(t,e,n).length>0}function a_(t,e){const n=new Set;for(const i of n_(t,e))for(const e of i)t.sinks.has(e)&&n.add(e);return n}function c_(t,e,n){return l_(t,e,n).map(t=>t.index)}function l_(t,e,n){const i=n instanceof Set?n:new Set(n);if(0===i.size)return[];const s=t.out.get(e)??[],r=new Map,o=[...i].sort(),a=[];for(let e=0;e<s.length;e++){const n=s[e];if(null==n)continue;let i=1/0,c="";for(const e of o){const s=1+(n===e?0:i_(t,n,e,r));s<i&&(i=s,c=e)}i!==1/0&&a.push({index:e,hops:i,target:c})}return a.sort((t,e)=>t.hops-e.hops||t.index-e.index),a}function h_(t,e={}){const n=[],i=e.loopCapableIds??new Set,s=e.routingTargetIds??new Set;for(const e of[...t.sources].sort()){const i=t.nodes.get(e);if(!i||!i.topology.outbounds?.length)continue;const s=(t.out.get(e)??[]).some(t=>null!=t);s||n.push({severity:"error",code:"orphan-source",nodeId:e,message:`source 노드 "${e}" 가 outgoing edge 0 — 아무 데도 carrier 를 보낼 수 없음`})}for(const e of[...t.nodes.keys()].sort()){const i=(t.out.get(e)??[]).some(t=>null!=t);i||(s.has(e)||t.sources.has(e)||n.push({severity:"error",code:"dead-end",nodeId:e,message:`노드 "${e}" 가 outgoing 0 인데 RoutingTarget 자격 없음 — routing 미정의 종착`}))}const r=function(t){const e=[],n=[...t.nodes.keys()].sort(),i=new Set,s=[],r=new Set,o=n=>{i.add(n),s.push(n),r.add(n);for(const a of t.out.get(n)??[])if(null!=a)if(r.has(a)){const t=s.indexOf(a),n=s.slice(t),i=n.indexOf([...n].sort()[0]),r=[...n.slice(i),...n.slice(0,i)],o=r.join("→");e.some(t=>t.join("→")===o)||e.push(r)}else i.has(a)||o(a);s.pop(),r.delete(n)};for(const t of n)i.has(t)||o(t);return e.sort((t,e)=>t[0].localeCompare(e[0])||t.length-e.length),e}(t);for(const t of r){const e=t.some(t=>i.has(t));e||n.push({severity:"error",code:"cycle",cycle:t,message:`의도 cycle 자격 (isLoop) 없는 cycle: ${t.join(" → ")} → ${t[0]}`})}const o=e.routingWeights;if(o)for(const[t,e]of[...o].sort((t,e)=>t[0].localeCompare(e[0])))(!Number.isFinite(e)||e<=0)&&n.push({severity:"warning",code:"invalid-weight",nodeId:t,message:`RoutingTarget "${t}" 의 routingWeight=${e} — weight ≤ 0 비정상, weight 정책에서 제외됨`});const a=new Set;for(const e of t.out.values())for(const t of e)null!=t&&a.add(t);for(const e of[...s].sort())t.nodes.has(e)&&(a.has(e)||n.push({severity:"warning",code:"unreachable-target",nodeId:e,message:`RoutingTarget "${e}" 에 incoming edge 0 — 누구도 이쪽으로 carrier 를 보내지 않음`}));return n.sort((t,e)=>t.code!==e.code?t.code.localeCompare(e.code):(t.nodeId??"").localeCompare(e.nodeId??"")),n}function d_(t,e){if(!t)return[];const n=[],i=new Set,s=t=>{if(!t||i.has(t))return;if(i.add(t),t!==e&&"function"==typeof t?.getSegmentTopology){const e=t.state?.id,i=t.refid??t.state?.refid,s="string"==typeof e&&e.length>0?e:null!=i?String(i):void 0;if(s)try{const e=t.getSegmentTopology(),i=t.state??{},r={left:i.left,top:i.top,width:i.width,height:i.height,rotation:i.rotation};e&&n.push({id:s,topology:e,bounds:r})}catch{}}const r=t?.components;if(Array.isArray(r))for(const t of r)s(t)};return s(t),n}function u_(t,e){const n=t.state?.targetRef??t.state?.downstreamRef;if("string"==typeof n&&n.length>0)return n;if("function"!=typeof t.getSegmentTopology)return null;const i=t.getSegmentTopology();if(!i||0===i.outbounds.length)return null;const s=d_(t.parent??t.rootModel??t.root,t).filter(t=>t.topology.inbounds.length>0),r=t_(i,s,e);for(const t of r)if(t)return t;return null}function p_(t){return!!t&&"function"==typeof t.routingConstraints}function f_(t){return!!t&&"function"==typeof t.acceptedCarrierData}function m_(t,e=16){const n=[],i=t.parent??t.rootModel??t.root;if(!i)return n;const s=u_(t);if(!s)return n;const r=b_(i,s);if(!r)return n;const o=[{segment:r,accumulated:{},pathIds:[s],visited:new Set([s])}];for(;o.length>0;){const t=o.shift();if(t.pathIds.length>e)continue;const s=p_(t.segment)?t.segment.routingConstraints():null;if(s&&s.length>0)for(const e of s)for(const s of e.candidates){const r=g_(t.accumulated,s);if(!r)continue;const a=y_(t.segment,e.portId,i);a&&!t.visited.has(a.state?.id??"")?o.push({segment:a,accumulated:r,pathIds:[...t.pathIds,a.state?.id??"?"],visited:new Set([...t.visited,a.state?.id??""])}):n.push({data:r,weight:1,pathIds:[...t.pathIds,`${e.portId}`],destination:e.portId})}else{if(f_(t.segment)){const e=t.segment.acceptedCarrierData(),i=t.segment.state?.id;if(0===e.length)n.push({data:t.accumulated,weight:1,pathIds:t.pathIds,destination:i});else for(const s of e){const e=g_(t.accumulated,s);e&&n.push({data:e,weight:1,pathIds:t.pathIds,destination:i})}continue}const e=u_(t.segment);if(!e||t.visited.has(e)){n.push({data:t.accumulated,weight:1,pathIds:t.pathIds,destination:t.pathIds[t.pathIds.length-1]});continue}const s=b_(i,e);if(!s)continue;o.push({segment:s,accumulated:t.accumulated,pathIds:[...t.pathIds,e],visited:new Set([...t.visited,e])})}}return n}function g_(t,e){const n={...t};for(const[t,i]of Object.entries(e)){if(t in n&&n[t]!==i)return null;n[t]=i}return n}function y_(t,e,n){if("straight"===e&&t.state?.downstreamRef)return b_(n,t.state.downstreamRef);const i=b_(n,e);if(i)return i;const s=u_(t);return s?b_(n,s):null}function b_(t,e){if(!t||!e)return null;if("function"==typeof t.findById)return t.findById(e);const n=new Set,i=t=>{if(!t||n.has(t))return null;if(n.add(t),t.state?.id===e)return t;const s=t.components;if(Array.isArray(s))for(const t of s){const e=i(t);if(e)return e}return null};return i(t)}function __(t,e){return Math.hypot(t.x-e.x,t.z-e.z)}function v_(t,e,n=5,i=[],s=n){const r=t.length,o=new Array(r).fill(void 0),a=new Set,c=(e,n)=>"start"===n?t[e].start:t[e].end,l=[],h=new Map,d=[],u=new Map;for(const t of i){const e=Array.isArray(t),n=e?t:t.positions,i=e?void 0:t.kind;if(!n.length)continue;const s=l.length;l.push({pos:n[0],members:[]});for(const t of n)d.push({pos:t,pt:s});i&&u.set(s,i)}const p=(t,e)=>{const i=c(t,e),s=h.get(`${t}:${"end"===e?"start":"end"}`),r=[];for(const t of d)__(t.pos,i)<=n&&!r.includes(t.pt)&&r.push(t.pt);for(let t=0;t<l.length;t++)__(l[t].pos,i)<=n&&!r.includes(t)&&r.push(t);let o=r.find(t=>t!==s)??-1;o<0&&(o=l.length,l.push({pos:i,members:[]})),l[o].members.push({seg:t,end:e}),h.set(`${t}:${e}`,o)};for(let t=0;t<r;t++)p(t,"start"),p(t,"end");const f=new Set,m=new Set,g=new Set;{const t=t=>{let e=-1,n=1/0;for(let i=0;i<l.length;i++){const s=__(l[i].pos,t);s<n&&(n=s,e=i)}for(const i of d){const s=__(i.pos,t);s<n&&(n=s,e=i.pt)}return{pt:e,d:n}};for(const n of e){const{pt:e,d:i}=t(n.pos);e>=0&&i<=s&&(f.add(e),("source"===n.kind?m:g).add(e))}}for(const[t,e]of u)f.add(t),("source"===e?m:g).add(t);const y=(t,e)=>"end"===e!==o[t],b=[],_=(e,n)=>{if(void 0===o[e])return o[e]=n,void b.push(e);o[e]!==n&&a.add(t[e].id)},v=t=>{for(const e of["start","end"]){const n=h.get(`${t}:${e}`);if(void 0===n)continue;const i=l[n];if(2!==i.members.length||f.has(n))continue;const s=i.members[0],r=s.seg===t&&s.end===e?i.members[1]:s;if(r.seg===t)continue;const a="end"===e!==o[t],c="end"===r.end!==!a;_(r.seg,c)}},x=()=>{for(;b.length;)v(b.shift())},w=t=>{let e=-1,n="start",i=1/0;for(let s=0;s<r;s++)for(const r of["start","end"]){const o=__(c(s,r),t.pos);o<i&&(i=o,e=s,n=r)}if(e<0||i>s)return;const o="source"===t.kind?"end"===n:"start"===n;_(e,o)};for(const t of e)"source"===t.kind&&w(t);x();for(const t of e)"sink"===t.kind&&w(t);x();let M=!0;for(;M;){M=!1;for(const t of l){if(t.members.length<3)continue;const e=t.members.filter(t=>void 0===o[t.seg]);if(1!==e.length)continue;let n=0,i=0;for(const e of t.members)void 0!==o[e.seg]&&(y(e.seg,e.end)?n++:i++);const s=e[0];let r;0===i&&n>0?r="end"===s.end:0===n&&i>0&&(r="start"===s.end),void 0!==r&&(o[s.seg]=r,b.push(s.seg),x(),M=!0)}}if(o.some(t=>void 0===t)&&m.size>0&&g.size>0){const t=t=>{const e=new Array(l.length).fill(1/0),n=[];for(const i of t)e[i]=0,n.push(i);for(;n.length;){const t=n.shift();for(const i of l[t].members){const s=h.get(`${i.seg}:${"start"===i.end?"end":"start"}`);void 0!==s&&e[s]>e[t]+1&&(e[s]=e[t]+1,n.push(s))}}return e},e=t(m),n=t(g);for(let t=0;t<r;t++){if(void 0!==o[t])continue;const i=h.get(`${t}:start`),s=h.get(`${t}:end`);if(void 0===i||void 0===s)continue;if(l[i].members.length<2||l[s].members.length<2)continue;if(e[i]===1/0||e[s]===1/0||n[i]===1/0||n[s]===1/0)continue;let r;e[i]!==e[s]?r=e[i]<e[s]:n[i]!==n[s]&&(r=n[s]<n[i]),void 0!==r&&(o[t]=!r,b.push(t))}x()}const S=new Map;for(let e=0;e<r;e++)S.set(t[e].id,void 0===o[e]?"unknown":o[e]?"reverse":"forward");return{directions:S,conflicts:[...a]}}function x_(...t){}function w_(t){return String(t?.state?.id??t?.refid??t?.state?.refid??"?")}function M_(t){const e=t?.state?.id;if("string"==typeof e&&e.length>0)return e;const n=t?.refid??t?.state?.refid;return null!=n?String(n):void 0}function*S_(t){if(!t)return;("function"==typeof t.getSegmentTopology||t.flowOrientable)&&(yield t);const e=t.components;if(Array.isArray(e))for(const t of e)yield*S_(t)}function A_(t,e,n){const i=e.width??0,s=e.height??0;if(i<=0||s<=0)return!1;const r=(e.left??0)+i/2,o=(e.top??0)+s/2,a="number"==typeof e.rotation?e.rotation:0,c=t.x-r,l=t.z-o,h=Math.cos(-a),d=Math.sin(-a),u=c*h-l*d,p=c*d+l*h;return Math.abs(u)<=i/2+n&&Math.abs(p)<=s/2+n}function E_(t){const e=[],n=[],i=[],s=[];for(const r of S_(t)){const t=M_(r);if(!t)continue;if(r.flowOrientable){const n=Wb(r.state??{});n&&e.push({id:t,start:n.start,end:n.end});continue}if("function"==typeof r.openings){const t=r.state??{};(t.width??0)>0&&(t.height??0)>0&&s.push(t);continue}let o;try{o=r.getSegmentTopology()}catch{continue}if(!o)continue;const a=o.inbounds??[],c=o.outbounds??[],l="function"==typeof r.routingDestination;if(0===a.length&&c.length>0)for(const t of c)n.push({pos:{x:t.worldPos.x,z:t.worldPos.z},kind:"source"});else if(a.length>0&&(0===c.length||l))for(const t of a)n.push({pos:{x:t.worldPos.x,z:t.worldPos.z},kind:"sink"});else if(a.length>0||c.length>0){const t=[];for(const e of a)t.push({x:e.worldPos.x,z:e.worldPos.z});for(const e of c)t.push({x:e.worldPos.x,z:e.worldPos.z});t.length&&i.push({positions:t})}}for(const t of s){const s=[];for(const n of e)for(const e of[n.start,n.end])A_(e,t,16)&&s.push(e);let r=!1,o=!1;for(const e of n)A_(e.pos,t,16)&&("sink"===e.kind?r=!0:o=!0);const a=r&&!o?"sink":o&&!r?"source":void 0;(s.length>=2||a&&s.length>=1)&&i.push({positions:s,kind:a})}if(0===e.length||0===n.length)return new Map;return v_(e,n,8,i,60).directions}function k_(t){const e=t?.root;if(!e)return;if(e.__flowComputing)return;let n=e.__flowOrientation;if(!n){e.__flowComputing=!0;try{n={map:E_(e)}}finally{e.__flowComputing=!1}e.__flowOrientation=n}const i=M_(t),s=i?n.map.get(i):void 0;return"reverse"===s||"forward"!==s&&void 0}function C_(t){return!!t&&"function"==typeof t.distanceToBoardPoint}function T_(t,e,n,i){if(!t||!e)return null;const s=[],r=t=>{if(!t||t===i)return;if(Mm(t,e)&&C_(t)){const e=function(t){const e=t?.state?.id;if("string"==typeof e&&e.length>0)return e;const n=t?.refid??t?.state?.refid;return null!=n?String(n):void 0}(t);e&&s.push({id:e,component:t,distance:t.distanceToBoardPoint(n.x,n.y)})}const o=t.components;if(Array.isArray(o))for(const t of o)r(t)};return r(t),0===s.length?null:(s.sort((t,e)=>t.distance-e.distance||t.id.localeCompare(e.id)),s[0])}function P_(t){return!!t&&"function"==typeof t.routingDestination}function O_(t){const e=t?.state?.id;if("string"==typeof e&&e.length>0)return e;const n=t?.refid??t?.state?.refid;return null!=n?String(n):void 0}function*D_(t){if(!t)return;yield t;const e=t.components;if(Array.isArray(e))for(const t of e)yield*D_(t)}function z_(t){const e=[],n=new Map,i=new Map,s=new Set,r=[];for(const o of D_(t)){"function"==typeof o?.registerWithHost&&r.push(o);const t="function"==typeof o?.getSegmentTopology,a="function"==typeof o?.routingLinks?o.routingLinks():void 0,c=!(!a||!((a.downstream?.length??0)>0||(a.upstream?.length??0)>0));if(!(t||P_(o)||c||C_(o)))continue;const l=O_(o);if(!l)continue;let h={inbounds:[],outbounds:[]};if(t){try{h=o.getSegmentTopology()}catch{continue}if(!h)continue}const d=o.state??{},u={left:d.left,top:d.top,width:d.width,height:d.height,rotation:d.rotation};if(e.push({id:l,topology:h,bounds:u,links:a}),i.set(l,o),P_(o)){s.add(l);const t=o.routingDestination();if("string"==typeof t&&t.length>0){const e=n.get(t)??[];e.push(l),n.set(t,e)}}}return{nodes:e,destToSinks:n,components:i,routingTargetIds:s,stationClients:r}}function I_(t){if(!t)return null;let e=t.__flowGraph;if(!e){const{nodes:n,destToSinks:i,components:s,routingTargetIds:r,stationClients:o}=z_(t),a=e_(n);!function(t,e){if(!t)return;const n=t=>{if(!t)return;"function"==typeof t.clearStations&&t.clearStations();const e=t.components;if(Array.isArray(e))for(const t of e)n(t)};n(t);const i=[...e].sort((t,e)=>{const n=O_(t)??"",i=O_(e)??"";return n.localeCompare(i)});for(const e of i){const n=e.declaredHostRef?.();let i=null;if(n&&(i=t.findById?.(n)??null),!i){const n=e.hostCapability?.(),s=e.hostFacingPoint?.();n&&s&&(i=T_(t,n,s,e)?.component??null)}i&&"function"==typeof e.registerWithHost&&e.registerWithHost(i)}const s=e=>{if(!e)return;if(C_(e)&&"function"==typeof e.resolveDownstream&&"function"==typeof e.registerDivertStation)for(const n of e.resolveDownstream()){const i=t.findById?.(n);i&&e.registerDivertStation(n,i)}const n=e.components;if(Array.isArray(n))for(const t of n)s(t)};s(t)}(t,o);const c=new Set;for(const[t,e]of s){((e?.state?.type??e?.model?.type??"").includes("loop")||!0===e?.isLoop)&&c.add(t)}const l=new Map;for(const t of r){const e=s.get(t);if("function"==typeof e?.routingWeight){const n=e.routingWeight();"number"==typeof n&&(!Number.isFinite(n)||n<=0)&&l.set(t,n)}}const h=h_(a,{routingTargetIds:r,loopCapableIds:c,routingWeights:l});if(h.length>0&&"undefined"!=typeof console){const t=h.filter(t=>"error"===t.severity),e=h.filter(t=>"warning"===t.severity);t.length>0?console.warn(`[FlowGraph] ${t.length} error(s) / ${e.length} warning(s):`,h):console.info(`[FlowGraph] ${e.length} warning(s):`,h)}e={graph:a,destToSinks:i,components:s,issues:h},t.__flowGraph=e}return e}function R_(t){return I_(t)?.issues??[]}function j_(t){const e=I_(t);return e&&e.graph.nodes.size>0?e.graph:null}function L_(t,e){return I_(t)?.destToSinks.get(e)??[]}function F_(t,e){return I_(t)?.components.get(e)}function N_(t){const e=I_(t);return e?[...e.destToSinks.keys()]:[]}function B_(t){return O_(t)}function H_(t){const e="number"==typeof t?.inventoryCount?t.inventoryCount:"function"==typeof t?.size?t.size():0,n=t?.state?.capacity;return"number"==typeof n&&n>0?e/n:e}function $_(t,e,n,i,s){if(1===i.length)return i[0];switch(t){case"index":default:return i[0];case"round-robin":{const t=n.counters.get(e)??0;return n.counters.set(e,t+1),i[t%i.length]}case"weight":{const t=i.map(t=>function(t){if("function"==typeof t?.routingWeight){const e=t.routingWeight();if("number"==typeof e&&Number.isFinite(e)&&e>0)return e}return 1}(s.get(t.target))),r=t.reduce((t,e)=>t+e,0);if(r<=0)return i[0];const o=n.counters.get(e)??0;n.counters.set(e,o+1);let a=o%r;for(let e=0;e<i.length;e++){if(a<t[e])return i[e];a-=t[e]}return i[i.length-1]}case"utilization":{let t=1/0,e=i[0];for(const n of i){const i=H_(s.get(n.target));i<t&&(t=i,e=n)}return e}}}function G_(t,e,n){const i=t?.root;if(!i)return null;const s=e?.state?.meta?.destination;if("string"!=typeof s||0===s.length)return null;const r=I_(i);if(!r||0===r.graph.nodes.size)return null;const o=O_(t);if(!o)return null;let a=r.destToSinks.get(s)??[];0===a.length&&(a=[s]);const c=l_(r.graph,o,a);if(0===c.length)return null;const l=r.graph.out.get(o)??[],h=c.filter(t=>{const n=l[t.index],i=n?r.components.get(n):null;return!i||"function"!=typeof i.canReceive||i.canReceive(e)});if(0===h.length)return l[c[0].index]??null;const d=n?.policy??function(t,e){const n=t?.state?.balancingPolicy;if(n)return n;const i=e?.state?.routingBalancingPolicy;return i||"round-robin"}(t,i),u=$_(d,o,function(t){return t.__balancingState||(t.__balancingState={counters:new Map}),t.__balancingState}(i),h,r.components);return l[u.index]??null}Em({name:"Capacity",description:"Item 을 *보유(keep)* 하는 측면 — slot 위상 / 수용 판정(canReceive/findSlot) / 3D 안착(placementFor/attachPointFor/acceptanceRotation) / delivery 좌표 질의 / 점유 수. 이동(receive/dispatch 등)은 Transferable 소관.",methods:["get slots","get arrangementStrategy","canReceive","findSlot","placementFor","attachPointFor","acceptanceRotation","deliveryWorldRotation","deliveryWorldPosition","_countOccupied"],sourceFile:"src/items/capacity-mixin.ts"}),Em({name:"PlacementSurface",description:"carrier 가 holder 위 *정확히 어디에 앉는가* 의 단일 진입점 — placementFor(carrier, ctx) → SeatingPose (holder object3d local frame, 순수 함수). I1 접촉 (밑면 = 받침 상면) / I2 frame-explicit (parent-child 비가정 — Sovereign handover 와 reparent 양쪽이 같은 값 소비) / I3 순수성 / I4 per-carrier 치수. default 구현은 Capacity(FlowNode) 가 기존 receivingSurfaceY + ArrangementStrategy + acceptanceRotation 합성과 수치 동일하게 제공.",methods:["placementFor"],models:["CarrierDims","PlacementContext","SeatingPose"],sourceFile:"src/items/capacity-mixin.ts"});try{globalThis.__operatoBuildFlowGraph=(t,e)=>{try{return e?.force&&t&&delete t.__flowGraph,j_(t)}catch{return null}}}catch{}function V_(t,e,n){const i=G_(t,e,n);if(null==i)return null;const s=t?.root,r=F_(s,i)??s?.findById?.(i)??null;return r?{targetId:i,component:r,origin:"explicit"}:null}function U_(t){const e=t?.root,n=j_(e),i=B_(t);if(!n||!i)return null;const s=(n.out.get(i)??[]).find(Boolean);if(!s)return null;const r=F_(e,s)??e?.findById?.(s)??null;return r?{id:s,component:r}:null}function Y_(t){const e=B_(t);return e?W_(t?.root,e):[]}function W_(t,e){if(!t||!e)return[];const n=j_(t);if(!n)return[];const i=new Set;for(const s of a_(n,e)){const e=F_(t,s);if(P_(e)){const t=e.routingDestination();"string"==typeof t&&t.length>0&&i.add(t)}}return[...i]}function q_(t,e){if(!t||!e)return[];const n=j_(t);if(!n)return[];const i=new Map;for(const t of n.out.values())for(const e of t)null!=e&&i.set(e,(i.get(e)??0)+1);const s=new Map;for(const r of a_(n,e)){const e=F_(t,r);if(!P_(e))continue;const n=e.routingDestination();if("string"!=typeof n||0===n.length)continue;let o=null;if("function"==typeof e.routingWeight){const t=e.routingWeight();"number"==typeof t&&Number.isFinite(t)&&t>0&&(o=t)}null===o&&(o=i.get(r)??0,0===o&&(o=1)),s.set(n,(s.get(n)??0)+o)}return[...s].map(([t,e])=>({value:t,weight:e}))}function X_(t){return j_(t)}function K_(t){const e=j_(t);if(!e)return[];const n=new Set,i=new Set,s=t=>{if(!t)return;const r=B_(t);if(r&&e.nodes.has(r)){P_(t)&&n.add(r);((t?.state?.type??t?.model?.type??"").includes("loop")||!0===t?.isLoop)&&i.add(r)}const o=t.components;if(Array.isArray(o))for(const t of o)s(t)};return s(t),h_(e,{routingTargetIds:n,loopCapableIds:i})}function Q_(t){if(0===t.length)return;const e=t.reduce((t,e)=>t+e.weight,0);if(e<=0)return t[Math.floor(Math.random()*t.length)].value;const n=Math.random()*e;let i=0;for(const e of t)if(i+=e.weight,n<i)return e.value;return t[t.length-1].value}const Z_={next:V_,downstream:U_,reachableDestinations:Y_,reachableDestinationsFrom:W_,reachableDestinationsWeightedFrom:q_,pickWeightedDestination:Q_,graphFor:X_,validate:K_};function J_(t){var e;return e=class extends t{constructor(){super(...arguments),this._items=[]}get items(){return this._items}containsItem(t){return-1!==this._items.indexOf(t)}attachPointFor(e,n){const i=t.prototype?.attachPointFor;return"function"==typeof i?i.call(this,e,n):null}addItem(t,e){if(!t||this.containsItem(t))return;const n=t.parent;if(n&&"function"==typeof n.removeItem&&n!==this&&n.removeItem(t,!0),this._items.push(t),t.parent=this,!e?.silent&&"function"==typeof this.trigger)try{this.trigger("hold",this,t,this._items.length-1)}catch{}t.held?.(this)}removeItem(t,e){if(!t)return;const n=this._items.indexOf(t);if(-1!==n&&(this._items.splice(n,1),t.parent=null,!e)){if("function"==typeof this.trigger)try{this.trigger("release",this,t,n)}catch{}t.released?.(this)}}forEachItem(t,e){this._items.forEach(t,e)}handoverIn(t,e){if(!t)return;const n=t.parent;n&&("function"==typeof n.removeComponent&&-1!==n._components?.indexOf?.(t)&&n.removeComponent(t,!0),n!==this&&"function"==typeof n.removeItem&&-1!==n._items?.indexOf?.(t)&&n.removeItem(t,!0));const i=-1===this._items.indexOf(t);if(i&&this._items.push(t),t.parent=this,i&&"function"==typeof this.trigger)try{this.trigger("hold",this,t,this._items.length-1)}catch{}const s=t._realObject,r=s?.object3d;if(r){let n,i,o=e?.toParent3D,a="world-preserve";if(!o){const s=this.attachPointFor?.(t,{slotId:e?.slotId});s?.attach&&(o=s.attach,n=s.localPosition,i=s.localRotation,a=s.carryPolicy??"world-preserve")}o&&r.parent!==o&&(o.updateWorldMatrix?.(!0,!1),r.updateWorldMatrix?.(!0,!1),o.attach(r),s.suppressTransform=!0),o&&(n&&r.position.set(n.x,n.y,n.z),"world-preserve"!==a?i?r.rotation.set(i.x,i.y,i.z):r.quaternion.identity():i&&r.rotation.set(i.x,i.y,i.z),s?.setTransientPlacement?.({policy:"carried",meta:{carryPolicy:a}}))}t.held?.(this),this._bumpReceived?.(t)}handoverOut(t){this.removeItem(t),this._bumpDispatched?.(t)}dispose(){const t=this._items.slice();this._items.length=0;for(const e of t)try{e.dispose?.()}catch{}super.dispose?.()}_drawItems(t){const e=this.root?.transitionEffect;for(const t of this._items)e?.isReparenting?.(t)||t.draw?.(this.getContext?.(t))}_captureItems(t,e,n,i,s){for(let r=this._items.length-1;r>=0;r--){const o=this._items[r],a="static"===o.position?o.capture?.(t,e,s):o.capture?.(n,i,s);if(a)return a}return null}postrender(t){super.postrender?.(t);const e=this;if("popup"===e.position)return;const n=this._items;if(!n||0===n.length)return;t.save();const i=e.bounds;!e.showOverflow&&i&&(t.beginPath(),t.rect(i.left,i.top,i.width,i.height),t.clip(),t.closePath());const{left:s=0,top:r=0}=e.state??{};t.translate(s,r),this._drawItems(t),t.translate(-s,-r),t.restore()}capture(t,e,n){const i=this,s=this._items;if(s&&s.length>0&&(!i.app||i.app.isEditMode||!i.hidden)){const s=i.fromParent?.(t,e);if(s&&i.contains?.(s.x,s.y)){const r=i.bounds,o=this._captureItems(s.x-r.left,s.y-r.top,t,e,n);if(o)return o}}return super.capture?.(t,e,n)}},e.capabilities=Object.freeze([...t.capabilities??[],"Holdable"]),e}function tv(t){var e;return e=class extends t{reserve(t,e){const n=this.findSlot(t);return n?{slot:n,token:Symbol("slot-reservation")}:null}release(t){}async receive(t,e={}){Au.log({role:"target",contract:"receive:enter",component:this,args:{carrier:Rb(t),options:e}});const n=this.reserve(t,e);if(!n){Au.log({role:"target",contract:"receive:reject",component:this,args:{carrier:Rb(t)},result:{reason:"no-slot"}}),this.trigger("transfer-rejected",{type:"transfer-rejected",component:t,container:this,reason:"no-slot"});const e=new Error("receive rejected: no-slot");throw e.reason="no-slot",e}this.commit(n,t,e)}commit(t,e,n={}){const i=t.slot,s=this._countOccupied(i.id),r=this.arrangementStrategy.positionAt(s,i,s,e);Au.log({role:"target",contract:"arrangementStrategy.positionAt",component:this,args:{idx:s,slotId:i.id,occupantCount:s,carrier:Rb(e)},result:r}),e[Fb]=i.id;const o=e._realObject;let a,c;o?.object3d&&(o.object3d.updateWorldMatrix(!0,!1),a=new M.Vector3,c=new M.Quaternion,o.object3d.getWorldPosition(a),o.object3d.getWorldQuaternion(c));const{animated:l=!1,duration:h,ease:d}=n;"function"==typeof this.handoverIn?this.handoverIn(e,{slotId:i.id}):this.reparent?.(e,{animated:l,duration:h,ease:d}),!l&&e._realObject&&(e._realObject.suppressTransform=!1);{const t={},n=this.placementFor?.(e,{slot:i,index:s,occupantCount:s})??null;if(Au.log({role:"target",contract:"placementFor",component:this,args:{carrier:Rb(e),slotId:i.id,index:s},result:n}),n){const s=e.state??{},r=this.state??{};t.left=n.position.x-(Number(s.width)||0)/2+(Number(r.width)||0)/2,t.top=n.position.z-(Number(s.height)||0)/2+(Number(r.height)||0)/2;const o=this._zPosFromSeatY(n.position.y,s.depth,i);null!==o&&(t.zPos=o),n.rotation&&Lb(t,n.rotation)}else{r&&(t.left=r.x,t.top=r.y);if(0!==(this._realObject?.receivingSurfaceY??0))t.zPos=0;else if(i.localPosition&&Number.isFinite(i.localPosition.z)){const e=this._realObject?.geometricOffsetY??0;t.zPos=i.localPosition.z+e}const n=this.acceptanceRotation?.(e,i);Au.log({role:"target",contract:"acceptanceRotation",component:this,args:{carrier:Rb(e),slotId:i.id},result:n}),n&&Lb(t,n)}const o=this.normalizePose?.(e,i);"function"==typeof this.normalizePose&&Au.log({role:"target",contract:"normalizePose",component:this,args:{carrier:Rb(e),slotId:i.id},result:o}),o&&Object.assign(t,o),Object.keys(t).length&&(e.setState?.(t),Au.log({role:"target",contract:"receive:setState",component:this,args:{carrier:Rb(e),keys:Object.keys(t)}}))}this.trigger("transfer-received",{type:"transfer-received",component:e,container:this,slotId:i.id,preReceiveWorldPos:a,preReceiveWorldQuat:c}),Au.log({role:"target",contract:"receive:done",component:this,args:{carrier:Rb(e),slotId:i.id}})}async dispatch(t,e,n={}){const i=new Tu({source:this,target:e,carrier:t,options:n,physical:async()=>{delete t[Fb]}}),s=await i.execute();"rolled-back"!==s.phase?this.trigger("transfer-dispatched",{type:"transfer-dispatched",component:t,container:this,target:e}):this.trigger("transfer-rejected",{type:"transfer-rejected",component:t,container:this,reason:s.rejectReason??"rejected"})}route(t){return null}resolveRoute(t,e){}rejectRoute(t,e="rejected"){this.trigger("transfer-rejected",{type:"transfer-rejected",component:t,container:this,reason:e})}canAccept(t){const e=(()=>{const e=this.slots;if(!e.length)return{ok:!1,reason:"no-slots-defined"};const n=this.findSlot(t);if(!n){const n=t?.state?.type??t?.type;for(const t of e)if(!t.allowedTypes?.length||!n||t.allowedTypes.includes(n))return{ok:!1,reason:"all-slots-full"};return{ok:!1,reason:"type-not-accepted"}}return{ok:!0,slot:n}})();return Au.log({role:"target",contract:"canAccept",component:this,args:{carrier:Rb(t)},result:e.ok?{ok:!0,slotId:e.slot.id}:{ok:!1,reason:e.reason}}),e}accept(t,e){return this.receive(t,e)}},e.__hasTransferable=!0,e}function ev(t){var e;const n=!!t.__hasCapacity,i=!!t.__hasTransferable,s=n?t:Vb(t),r=i?s:tv(s),o=[...t.capabilities??[]];n||o.push("Capacity","PlacementSurface"),i||o.push("Transferable"),o.push("Holdable","FlowNode");const a=(e=class extends(J_(r)){get isFlowNode(){return!0}containable(t){return!!t&&!0===t.isItem}get showMoveHandle(){return!1}inboundPorts(){return[]}outboundPorts(){return[]}_bumpReceived(t){const e=this.state?.received??0;this.setState?.({received:e+1})}_bumpDispatched(t){const e=this.state?.dispatched??0;this.setState?.({dispatched:e+1})}_bumpRejected(t,e){const n=this.state?.rejected??0;this.setState?.({rejected:n+1})}route(t){return null}resolveRoute(t,e){}rejectRoute(t,e){}resolveDownstream(){const t=this.state?.downstreamRef;if(!t)return[];return(this.root?.findAll?.(t)??[]).map(t=>t?.state?.id).filter(Boolean)}routingLinks(){return{downstream:this.resolveDownstream()}}},function(t,e,n){"symbol"==typeof e&&(e=e.description?"[".concat(e.description,"]"):""),Object.defineProperty(t,"name",{configurable:!0,value:n?"".concat(n," ",e):e})}(e,"FlowNodeMixed"),e.capabilities=Object.freeze(o),e.isFlowNode=!0,e);return Bb(a)}function nv(t){return!!t&&!0===t.isFlowNode}Em({name:"Holdable",description:"어떤 Component 든 item(데이타바인딩 동적 물건) 을 보유하는 capability. _items + add/remove/forEach + handover + hold/release event + dispose cascade. Container(정적 _components) 와 직교 — 컨테이너 비의존.",methods:["addItem","removeItem","forEachItem","containsItem","handoverIn","handoverOut","_drawItems","_captureItems","dispose"],sourceFile:"src/components/mixins/holdable.ts"}),Em({name:"Transferable",description:"Item 을 노드 간에 옮기는 *이동(move)* 측면. 수용 트랜잭션 라이프사이클(reserve → commit → release)과 receive/accept/dispatch/route 를 제공. 보유(keep — slots/findSlot/canReceive 등)는 Capacity 소관.",methods:["reserve","commit","release","receive","accept","canAccept","dispatch","route","resolveRoute","rejectRoute"],sourceFile:"src/transfer/transferable-mixin.ts"}),Em({name:"FlowNode",description:"Flow graph 의 노드 — 구조 (inbound/outbound port + slot) + flow (route + 5-phase transfer stat). 보유(_items/handover)는 Holdable base 위임. 모든 flow 컴포넌트의 base — Storable/Mobile/Processable 의도가 위에 직교로 적용.",methods:["inboundPorts","outboundPorts","slotIds","slotAt","route","resolveRoute","rejectRoute"],models:["Port","SlotInfo","Vec3"],sourceFile:"src/flow/flow-node.ts"});const iv={x:0,y:0,z:0,w:1};function sv(t){const e=t/2;return{x:0,y:Math.sin(e),z:0,w:Math.cos(e)}}function rv(t,e){const n=t.rotation,i=e.rotation,s=e.position,r=n.w*s.x+n.y*s.z-n.z*s.y,o=n.w*s.y+n.z*s.x-n.x*s.z,a=n.w*s.z+n.x*s.y-n.y*s.x,c=-n.x*s.x-n.y*s.y-n.z*s.z,l=r*n.w+c*-n.x+o*-n.z-a*-n.y,h=o*n.w+c*-n.y+a*-n.x-r*-n.z,d=a*n.w+c*-n.z+r*-n.y-o*-n.x,u={x:n.w*i.x+n.x*i.w+n.y*i.z-n.z*i.y,y:n.w*i.y-n.x*i.z+n.y*i.w+n.z*i.x,z:n.w*i.z+n.x*i.y-n.y*i.x+n.z*i.w,w:n.w*i.w-n.x*i.x-n.y*i.y-n.z*i.z};return{position:{x:t.position.x+l,y:t.position.y+h,z:t.position.z+d},rotation:u}}const ov={east:{axis:{x:1,y:0,z:0},yaw:0,idSuffix:"east"},west:{axis:{x:-1,y:0,z:0},yaw:Math.PI,idSuffix:"west"},south:{axis:{x:0,y:0,z:1},yaw:-Math.PI/2,idSuffix:"south"},north:{axis:{x:0,y:0,z:-1},yaw:Math.PI/2,idSuffix:"north"}};function av(t){const{carrierWorld:e,width:n,depth:i,entryHeight:s,mountLocalY:r,approachDistance:o,sides:a,toolType:c,tolerance:l,priority:h}=t,d="number"==typeof r?{position:{x:0,y:r,z:0},rotation:{...iv}}:void 0,u=n/2,p=i/2;return a.map(t=>{const n=ov[t],i="string"==typeof c?c:c[t]??"unknown",r={position:{x:n.axis.x*("east"===t||"west"===t?u:0),y:s,z:n.axis.z*("north"===t||"south"===t?p:0)},rotation:sv(n.yaw)},a={position:{x:r.position.x+n.axis.x*o,y:s,z:r.position.z+n.axis.z*o},rotation:sv(n.yaw)};return{id:`entry-${n.idSuffix}`,toolType:i,approach:rv(e,a),engage:rv(e,r),...d?{mount:d}:{},tolerance:l,priority:h}})}function cv(t){const{carrierWorld:e,topY:n,approachDistance:i,toolType:s,mountLocalY:r,tolerance:o,priority:a,id:c}=t,l={position:{x:0,y:n,z:0},rotation:{...iv}};return{id:c??"top",toolType:s,approach:rv(e,{position:{x:0,y:n+i,z:0},rotation:{...iv}}),engage:rv(e,l),..."number"==typeof r?{mount:{position:{x:0,y:r,z:0},rotation:{...iv}}}:{},tolerance:o,priority:a}}function lv(t,e){return t.filter(t=>t.toolType===e.toolType)}function hv(t,e){if(0===t.length)return null;const n=t.map(t=>{const n=t.approach.position.x-e.x,i=t.approach.position.y-e.y,s=t.approach.position.z-e.z;return{f:t,dist:Math.sqrt(n*n+i*i+s*s)}});return n.sort((t,e)=>{const n=t.f.priority??0,i=e.f.priority??0;return n!==i?n-i:t.dist-e.dist}),n[0].f}class dv{constructor(t){this.owner=t}positionAt(t,e,n,i){if(0!==t)return null;const s=this.owner?.state?.width??0,r=this.owner?.state?.height??0,o=i?.state?.width??0,a=i?.state?.height??0;return{x:Math.max(0,(s-o)/2),y:Math.max(0,(r-a)/2),z:0}}capacity(t){return t.maxCount??1}}let uv=1;function pv(t,e){return t.startSimMs<e.endSimMs&&e.startSimMs<t.endSimMs}const fv={resolveConflict:(t,e)=>t.priority!==e.priority?t.priority<e.priority?"b-yields":"a-yields":t.id<e.id?"b-yields":"a-yields"};class mv{constructor(t=fv){this._byResource=new Map,this._byReserver=new Map,this._listeners=new Set,this._conflictLog=[],this._maxConflictLog=1e3,this._yieldPolicy=t}add(t){const e={...t,id:"res-"+uv++},n=(this._byResource.get(e.resource)??[]).filter(t=>pv(t.timeWindow,e.timeWindow));if(0===n.length)return this._insert(e),this._emit({kind:"added",reservation:e}),{ok:!0,reservation:e};const i=n.map(t=>{const n=this._yieldPolicy.resolveConflict(e,t);return{a:e,b:t,decision:n}}),s=i.every(t=>"b-yields"===t.decision);if(s){const i=n.slice();for(const t of i)this._remove(t),this._emit({kind:"evicted",reservation:t,by:e});return this._insert(e),this._emit({kind:"added",reservation:e}),this._appendConflictLog({simTime:e.timeWindow.startSimMs,resource:e.resource,proposed:t,existing:i,outcome:"preempted"}),{ok:"preempted",reservation:e,evicted:i}}return this._appendConflictLog({simTime:e.timeWindow.startSimMs,resource:e.resource,proposed:t,existing:n.slice(),outcome:"rejected"}),{ok:!1,conflicts:i}}conflictLog(){return[...this._conflictLog]}setMaxConflictLog(t){this._maxConflictLog=Math.max(1,t)}_appendConflictLog(t){this._conflictLog.push(t),this._conflictLog.length>this._maxConflictLog&&this._conflictLog.shift()}conflicts(t,e){return(this._byResource.get(t)??[]).filter(t=>pv(t.timeWindow,e))}release(t){this._remove(t)&&this._emit({kind:"released",reservation:t})}releaseAllOf(t){const e=(this._byReserver.get(t)??[]).slice();for(const t of e)this._remove(t),this._emit({kind:"released",reservation:t});return e}forResource(t){return[...this._byResource.get(t)??[]]}forReserver(t){return[...this._byReserver.get(t)??[]]}all(){const t=[];for(const e of this._byResource.values())t.push(...e);return t}clear(){this._byResource.clear(),this._byReserver.clear(),this._conflictLog.length=0}subscribe(t){return this._listeners.add(t),()=>{this._listeners.delete(t)}}_insert(t){let e=this._byResource.get(t.resource);e||(e=[],this._byResource.set(t.resource,e));const n=e.findIndex(e=>e.timeWindow.startSimMs>t.timeWindow.startSimMs);n<0?e.push(t):e.splice(n,0,t);let i=this._byReserver.get(t.reserverId);i||(i=[],this._byReserver.set(t.reserverId,i)),i.push(t)}_remove(t){const e=this._byResource.get(t.resource);if(!e)return!1;const n=e.findIndex(e=>e.id===t.id);if(n<0)return!1;e.splice(n,1),0===e.length&&this._byResource.delete(t.resource);const i=this._byReserver.get(t.reserverId);if(i){const e=i.findIndex(e=>e.id===t.id);e>=0&&i.splice(e,1),0===i.length&&this._byReserver.delete(t.reserverId)}return!0}_emit(t){this._listeners.forEach(e=>e(t))}}const gv=new mv;"undefined"!=typeof globalThis&&(globalThis.__THINGS_SCENE_RESERVATION_TABLE__=gv);class yv{constructor(){this.nodes=new Map,this.edges=new Map,this.laneEndpoints=new Map}addNode(t){this.nodes.has(t.id)||(this.nodes.set(t.id,t),this.edges.set(t.id,[]))}addEdge(t){const e=this.edges.get(t.fromNode);if(!e)throw new Error(`NavGraph.addEdge: source node not found: ${t.fromNode}`);if(!this.nodes.has(t.toNode))throw new Error(`NavGraph.addEdge: target node not found: ${t.toNode}`);e.push(t)}edgesFrom(t){return this.edges.get(t)??[]}findNearestNode(t){let e=null,n=1/0;for(const i of this.nodes.values()){const s=bv(i.position,t);s<n&&(n=s,e=i)}return e}}function bv(t,e){const n=t.x-e.x,i=t.y-e.y,s=t.z-e.z;return n*n+i*i+s*s}function _v(t,e){return Math.sqrt(bv(t,e))}function vv(t,e,n={}){const i=new yv,s=n.defaultSpeed??100;for(const e of t){const t=e.geometry.centerPoints;if(t.length<2)continue;const n=`${e.id}:start`,r=`${e.id}:end`;i.addNode({id:n,position:t[0],type:"lane-start"}),i.addNode({id:r,position:t[t.length-1],type:"lane-end"}),i.laneEndpoints.set(e.id,{startNodeId:n,endNodeId:r});let o=0;for(let e=1;e<t.length;e++)o+=_v(t[e-1],t[e]);const a=o/(e.speedLimit??s)*1e3;i.addEdge({fromNode:n,toNode:r,resource:e.id,distance:o,durationMs:a,forward:!0}),"twoway"===e.direction&&i.addEdge({fromNode:r,toNode:n,resource:e.id,distance:o,durationMs:a,forward:!1})}for(const t of e){if(t.lanes.length<2)continue;const e=[];for(const n of t.lanes){const s=i.laneEndpoints.get(n);if(!s)continue;const r=i.nodes.get(s.startNodeId).position,o=i.nodes.get(s.endNodeId).position;let a=0,c=0,l=0;for(const e of t.lanes){if(e===n)continue;const t=i.laneEndpoints.get(e);if(!t)continue;const s=i.nodes.get(t.startNodeId).position,h=i.nodes.get(t.endNodeId).position;a+=Math.min(bv(r,s),bv(r,h)),c+=Math.min(bv(o,s),bv(o,h)),l++}if(0===l)continue;const h=a<c?s.startNodeId:s.endNodeId;e.push({laneId:n,nodeId:h,pos:i.nodes.get(h).position})}for(let n=0;n<e.length;n++)for(let s=0;s<e.length;s++){if(n===s)continue;const r=e[n],o=e[s],a=_v(r.pos,o.pos);i.addEdge({fromNode:r.nodeId,toNode:o.nodeId,resource:t.id,distance:a,durationMs:t.crossingTimeMs,forward:!0})}}return i}function xv(t,e,n,i={}){const s=t.nodes.get(e),r=t.nodes.get(n);if(!s||!r)return null;const o=i.speed?.max??100,a=e=>{const n=function(t,e){return Math.sqrt(function(t,e){const n=t.x-e.x,i=t.y-e.y,s=t.z-e.z;return n*n+i*i+s*s}(t,e))}(t.nodes.get(e).position,r.position);return n/o*1e3},c=new Map,l=new Set,h=new Set,d={nodeId:e,gScore:0,fScore:a(e)};c.set(e,d),l.add(e);const u=i.startSimMs??0,p=i.deadlineSimMs;for(;l.size>0;){let e=null,i=null;for(const t of l){const n=c.get(t);(!i||n.fScore<i.fScore||n.fScore===i.fScore&&t<e)&&(i=n,e=t)}if(!i||!e)return null;if(e===n){const t=[];let e=i,n=0;for(;e&&e.cameFromEdge;){const i=e.cameFromEdge,s=u+(e.gScore-i.durationMs);t.unshift({resource:i.resource,timeWindow:{startSimMs:s,endSimMs:s+i.durationMs},fromPos:i.fromPos,toPos:i.toPos}),n+=i.distance,e=c.get(i.fromNodeId)}const s=i.gScore;return void 0!==p&&u+s>p?null:{segments:t,totalDurationMs:s,totalDistance:n}}l.delete(e),h.add(e);for(const n of t.edgesFrom(e)){if(h.has(n.toNode))continue;const e=i.gScore+n.durationMs,s=c.get(n.toNode);if(!s||e<s.gScore){const i=t.nodes.get(n.fromNode),s=t.nodes.get(n.toNode),r={nodeId:n.toNode,gScore:e,fScore:e+a(n.toNode),cameFromEdge:{fromNodeId:n.fromNode,resource:n.resource,distance:n.distance,durationMs:n.durationMs,fromPos:i.position,toPos:s.position}};c.set(n.toNode,r),l.add(n.toNode)}}}return null}function wv(t,e,n=0,i){return t.segments.map(t=>({resource:t.resource,timeWindow:t.timeWindow,reserverId:e,priority:n,metadata:i}))}const Mv={closed:!0,round:0,divisions:24};class Sv{constructor(t,e){this.points=t,this.closed=e;const n=[0];for(let e=1;e<t.length;e++){const i=t[e].x-t[e-1].x,s=t[e].y-t[e-1].y;n.push(n[e-1]+Math.sqrt(i*i+s*s))}this.cumulative=n,this.length=n[n.length-1]??0}sample(t){const e=this.length;if(0===this.points.length)return{x:0,y:0,theta:0};if(0===e)return{x:this.points[0].x,y:this.points[0].y,theta:0};let n=t;this.closed?n=(t%e+e)%e:n<0?n=0:n>e&&(n=e);const i=this.cumulative;let s=0,r=i.length-2;for(;s<r;){const t=s+r>>1;i[t+1]<=n?s=t+1:r=t}const o=i[s+1]-i[s],a=o>0?(n-i[s])/o:0,c=this.points[s],l=this.points[s+1],h=l.x-c.x,d=l.y-c.y;return{x:c.x+h*a,y:c.y+d*a,theta:0===h&&0===d?0:Math.atan2(d,h)}}}function Av(t,e={}){const n={...Mv,...e},i=t.length;if(0===i)return new Sv([],n.closed);if(1===i)return new Sv([{x:t[0].x,y:t[0].y}],n.closed);const s=[],r=(t,e)=>{if(s.length>0){const n=s[s.length-1];if(Math.abs(n.x-t)<1e-9&&Math.abs(n.y-e)<1e-9)return}s.push({x:t,y:e})},o=(n.closed,i);for(let e=0;e<o;e++){const s=0===e?n.closed?i-1:-1:e-1,o=e===i-1?n.closed?0:-1:e+1,a=s>=0?t[s]:null,c=t[e],l=o>=0?t[o]:null;if(a&&a.x===c.x&&a.y===c.y)continue;const h=a&&l?Rr(c,n.round):0;let d,u,p,f;if(a){const t=Math.sqrt((a.x-c.x)**2+(a.y-c.y)**2),e=0!==t?Math.atan2(a.x-c.x,a.y-c.y):0,n=Math.min(h,t/2);d=Math.sin(e)*n+c.x,u=Math.cos(e)*n+c.y}else d=c.x,u=c.y;if(l){const t=Math.sqrt((l.x-c.x)**2+(l.y-c.y)**2),e=0!==t?Math.atan2(l.x-c.x,l.y-c.y):0,n=Math.min(h,t/2);p=Math.sin(e)*n+c.x,f=Math.cos(e)*n+c.y}else p=c.x,f=c.y;if(r(d,u),h>0&&a&&l)for(let t=1;t<=n.divisions;t++){const e=t/n.divisions,i=1-e;r(i*i*d+2*i*e*c.x+e*e*p,i*i*u+2*i*e*c.y+e*e*f)}else d===p&&u===f||r(p,f);if(l&&Or(c)){const t=Rr(l,n.round),e=Math.sqrt((c.x-l.x)**2+(c.y-l.y)**2),i=0!==e?Math.atan2(c.x-l.x,c.y-l.y):0,s=Math.min(t,e/2),o=Dr({x:p,y:f},{x:Math.sin(i)*s+l.x,y:Math.cos(i)*s+l.y},c.bulge);if(o){let t=o.endAngle-o.startAngle;if(o.clockwise)for(;t>0;)t-=2*Math.PI;else for(;t<0;)t+=2*Math.PI;for(let e=1;e<=n.divisions;e++){const i=e/n.divisions,s=o.startAngle+t*i;r(o.cx+o.radius*Math.cos(s),o.cy+o.radius*Math.sin(s))}}}}if(n.closed&&s.length>0){const t=s[0],e=s[s.length-1];(Math.abs(e.x-t.x)>1e-9||Math.abs(e.y-t.y)>1e-9)&&s.push({x:t.x,y:t.y})}return new Sv(s,n.closed)}function Ev(t,e){return Av(t,e).length}function kv(t){return t?/forklift|agv|amr|oht|tugger|worker/i.test(t)?"mobile":/conveyor|sorter|induct|chute|belt/i.test(t)?"flow":/rack|shelf|stocker|cell/i.test(t)?"cell":/pallet|box|parcel|crate|drum|tray/i.test(t)?"atomic":/robot[-_]?arm|crane|lift/i.test(t)?"articulated":/spawn[-_]?point|sink[-_]?point/i.test(t)?"boundary":"":""}function Cv(t){const e=[];let n=t.parent;for(;n&&!n.isRootModel?.();){const t=n.state?.id??n.constructor?.name;t&&e.unshift(t),n=n.parent}return e.join(" › ")}function Tv(t,e=!0){const n=t.constructor?.name??t.state?.type??"Component",i={type:n,id:t.state?.id??`?${t._id??Math.random().toString(36).slice(2,7)}`,category:kv(n),parentId:t.parent?.state?.id,parentPath:Cv(t)},s=t._realObject?.object3d;if(s){s.updateWorldMatrix?.(!0,!1);const t=s.matrixWorld?.elements;t&&(i.pose={position:{x:t[12],y:t[13],z:t[14]},rotation:{x:0,y:0,z:0,w:1}})}if(!0===t.isItem&&(i.isItem=!0),!0===t.isMover&&(i.isMover=!0),"function"!=typeof t.canReceive&&"function"!=typeof t.canAccept||(i.isHolder=!0),"function"==typeof t.pickupFrames)try{i.isPickable=t.pickupFrames().length>0}catch{i.isPickable=!1}if("string"==typeof t.toolType||"function"==typeof t.toolType?i.toolType="function"==typeof t.toolType?t.toolType():t.toolType:void 0!==t.toolType&&(i.toolType=String(t.toolType)),t.state&&"object"==typeof t.state){const e={};for(const[n,i]of Object.entries(t.state))"string"!=typeof i&&"number"!=typeof i&&"boolean"!=typeof i&&null!==i||(e[n]=i);i.state=e}if(e){const e=t.components??[];i.childIds=e.map(t=>t.state?.id).filter(Boolean)}return i}function Pv(t){function e(t,n){if(!t)return;n.push(Tv(t));const i=t.components??[];for(const t of i)e(t,n)}function n(t,e){if(!e)return null;if(e.state?.id===t)return e;const i=e.components??[];for(const e of i){const i=n(t,e);if(i)return i}return null}return{version:"0.1.0",collectComponents(){const n=[];return e(t?.rootModel??t,n),n},getComponent(e){const i=n(e,t?.rootModel??t);if(!i)return null;const s={...Tv(i)};if("function"==typeof i.pickupFrames)try{s.pickupFrames=i.pickupFrames()}catch{}if("object"==typeof i.slots)try{s.slots=Array.isArray(i.slots)?i.slots:"function"==typeof i.slots?i.slots():[]}catch{}if("function"==typeof i.acceptanceRotation)try{s.acceptanceWorldQuat=i.deliveryWorldRotation?.(null)??void 0}catch{}if("function"==typeof i.deliveryWorldPosition)try{s.deliveryWorldPosition=i.deliveryWorldPosition(null)}catch{}return s},simStatus(){let e=0;const n=[t?.rootModel??t];for(;n.length>0;){const t=n.pop();if(!t)continue;!0===t.isItem&&e++;const i=t.components??[];for(const t of i)n.push(t)}return{simTime:mr.now,realTime:"undefined"!=typeof performance?performance.now():Date.now(),speed:mr.speed,paused:mr.isPaused,carrierCount:e}},transferLog(){const t={};Pu.flows().forEach((e,n)=>{t[n]=e});const e={};Pu.targetCounts().forEach((t,n)=>{e[n]=t});const n={};return Pu.rejectReasonCounts().forEach((t,e)=>{n[e]=t}),{entries:Pu.toJSON(),stats:Pu.stats(),flows:t,targetCounts:e,rejectReasonCounts:n}},reservations(){const t=[...gv.all()],e={},n={};for(const i of t)(e[i.resource]??=[]).push(i),(n[i.reserverId]??=[]).push(i);for(const t of Object.values(e))t.sort((t,e)=>t.timeWindow.startSimMs-e.timeWindow.startSimMs);for(const t of Object.values(n))t.sort((t,e)=>t.timeWindow.startSimMs-e.timeWindow.startSimMs);return{simTime:mr.now,all:t,byResource:e,byReserver:n}},conflicts(){const t=gv.conflictLog(),e={},n={};let i=0,s=0;for(const r of t)e[r.resource]=(e[r.resource]??0)+1,n[r.proposed.reserverId]=(n[r.proposed.reserverId]??0)+1,"rejected"===r.outcome?i++:s++;return{simTime:mr.now,log:[...t],total:t.length,rejected:i,preempted:s,byResource:e,byReserver:n}}}}function Ov(t){const e=Pv(t);return"undefined"!=typeof window&&(window.__SCENE_INSPECTOR__=e),e}let Dv=0;const zv=new FinalizationRegistry(()=>{Dv--});class Iv{static get residents(){return Dv}static get residentsCount(){return Dv}constructor(t,e){this.counters={},this.references={},this.creator=t,this.disposer=e,Dv++,zv.register(this,Dv)}dispose(){if(this.disposer)for(const t in this.references)this.disposer(t,this.references[t]);this.references={},this.counters={}}get ids(){return Object.keys(this.references)}create(t){return new Promise((e,n)=>{this.creator?this.creator(t,n=>{n.release=()=>{this.disposer?.(t,n),delete n.release,$i("RELEASED",t)},e(n)},n):n(Error("Reference id("+t+") could not be created. Reference creator should be defined."))})}add(t,e){const n=new Promise((n,i)=>{const s=this.references[t];if(s)s===e?i(Error("Reference ID and target duplicate")):e?i(Error("Reference ID duplicate")):n(s);else{const s=e=>{e.release=()=>{this.release(e)},this.references[t]=e,this.counters[t]=1,n(e)};if(e)s(e);else{if(!this.creator)return void i(Error("Reference id("+t+") is not allowed. Reference creator should be defined."));this.creator(t,s,i)}}});return this.references[t]||(this.references[t]=n),n}async get(t,e=!1){let n=this.references[t];if(n){if(!(n instanceof Promise)){if(!(t in this.counters))throw new Error("No Reference Count");return this.counters[t]++,n}if(e)return n=await n,this.counters[t]++,n}if(e)return await this.add(t);throw new Error("No References for "+t)}_id(t){for(const e in this.references){if(this.references[e]===t)return e}}release(t){const e=this._id(t);if(!e)return void Bi("No Referenced ID");const n=this.references[e];n&&(this.counters[e]--,0==this.counters[e]&&(this.disposer?.(e,n),delete this.references[e],delete this.counters[e],delete t.release,$i("RELEASED",e)))}}const Rv={},jv={};let Lv=[];function Fv(t){const e=t.target,n="SCRIPT"===e.tagName?Rv:jv,i=e.src||e.href;n[i]=!0,Lv.forEach((t,e)=>{if(!t)return;const{resolve:s,scripts:r,styles:o}=t;if(n===Rv){const t=r.indexOf(i);t>-1&&t<r.length-1&&Bv(r[t+1])}r.some(t=>!Rv[t])||o?.some(t=>!jv[t])||(s(),Lv[e]=null)}),Lv=Lv.filter(Boolean)}function Nv(t){if("string"==typeof t)return;const e=t.target,n=e.src,i="SCRIPT"===e.tagName?Rv:jv;Lv.forEach((e,s)=>{if(!e)return;const{reject:r,scripts:o,styles:a}=e;(i===Rv&&o.includes(n)||i===jv&&!!a?.includes(n))&&(r(t),Lv[s]=null)}),Lv=Lv.filter(Boolean),delete i[n],document.head.removeChild(e)}function Bv(t){Rv[t]=!1;const e=document.createElement("script");e.onload=Fv,e.onerror=Nv,e.type="text/javascript",e.src=t,document.head.appendChild(e)}class Hv{static load(t,e){const n="string"==typeof t?[t]:t,i="string"==typeof e?[e]:e;return new Promise(function(t,e){if(n&&!Array.isArray(n)||i&&!Array.isArray(i))return void e(new Error("invalid sources for load"));let s,r=!0;if(i?.forEach(t=>{t in jv||function(t){jv[t]=!1;const e=document.createElement("link");e.onload=Fv,e.onerror=Nv,e.type="text/css",e.rel="stylesheet",e.media="screen,print",e.href=t,document.head.appendChild(e)}(t),jv[t]||(r=!1)}),n&&n.length>0)for(const t of n)t in Rv?Rv[t]||(r=!1):s??=t;if(s)Bv(s);else if(r)return void t();Lv.push({resolve:t,reject:e,scripts:n,styles:i})})}}const $v="0.0.0";function Gv(t){if(!(t>0))return 1;let e=0;if(!(t&t-1))return t;for(;0!=t;)t>>=1,e+=1;return 1<<e}function Vv(t){const{lineWidth:e=0}=t.state;let{width:n,height:i}=t.bounds;n+=e,i+=e;const s=Gv(2*n),r=Gv(2*i),o=Mp(s,r),a=new M.CanvasTexture(o);return Uv(o,t,2),a.needsUpdate=!0,a.wrapS=M.RepeatWrapping,a.wrapT=M.RepeatWrapping,a.offset.set(0,1-2*i/r),a.repeat.set(2*n/s,2*i/r),a.magFilter=M.NearestFilter,a.minFilter=M.LinearFilter,a.colorSpace=M.SRGBColorSpace,a}function Uv(t,e,n){const{lineWidth:i=0}=e.state;let{left:s,top:r}=e.bounds;s-=i/2,r-=i/2;const o=t.getContext("2d");o.scale(n,n),o.translate(-s,-r),e.render(o),e.postrender(o)}function Yv(t,e,n=2){const i=t.getContext("2d");i&&(i.setTransform(1,0,0,1,0,0),i.clearRect(0,0,t.width,t.height),Uv(t,e,n))}const Wv=new Set(["cx","cy","cz","zPos","left","top","width","height","depth","lineWidth","rotationX","rotationY","rotation","scale","hidden","alpha","material3d","screenFixed"]);class qv extends iu{get syncZPosOffset(){return this.effectiveDepth}get geometricOffsetY(){return this.effectiveDepth}constructor(t){super(t),this._origInvalidate=t.invalidate.bind(t),t.invalidate=()=>{this._origInvalidate(),this._refreshTextureNow()}}getObject3dInstance(){return new M.Mesh}build(){super.build();const{width:t,height:e}=this.component.bounds;if(!t||!e)return;const n=ud(this.component.state.material3d),i=new M.PlaneGeometry(1,1);i.rotateX(-Math.PI/2),this.object3d.geometry=i;const s=Vv(this.component),r=new M.MeshStandardMaterial({map:s});md(r,n),r.transparent=!0,this.object3d.material=r,this.object3d.castShadow=n.castShadow,this.object3d.receiveShadow=n.receiveShadow}updateDimension(){const{width:t,height:e}=this.component.bounds;this.setDimensionScale(t,1,e)}updateAlpha(){const{alpha:t=1,fillStyle:e}=this.component.state;jd(this.object3d.material,0,e)}_debouncedRebuild(){this._debounceTimer&&clearTimeout(this._debounceTimer),this._debounceTimer=setTimeout(()=>{this._debounceTimer=void 0,this._rebuildTexture()},100)}_rebuildTexture(){this.clear(),this.build(),this.updateTransform(),this.updateDimension(),this.updateHidden()}_refreshTextureNow(){const t=this.object3d.material,e=t?.map;if(!e)return;const n=e.source?.data;n&&(Yv(n,this.component,2),e.needsUpdate=!0)}updateFillStyle(){this._debouncedRebuild()}updateStrokeStyle(){this._debouncedRebuild()}updateText(){this._debouncedRebuild()}onchange(t,e){super.onchange(t,e);for(const e of Object.keys(t))if(!Wv.has(e)){this._debouncedRebuild();break}}updateMaterial3d(){super.updateMaterial3d();const t=this.object3d.material;if(!t)return;const e=ud(this.component.state.material3d);md(t,e),t.transparent=!0,this.object3d.castShadow=e.castShadow,this.object3d.receiveShadow=e.receiveShadow}clear(){return this._debounceTimer&&(clearTimeout(this._debounceTimer),this._debounceTimer=void 0),Vd(this.object3d),super.clear()}dispose(){this._debounceTimer&&(clearTimeout(this._debounceTimer),this._debounceTimer=void 0),this._origInvalidate&&(this.component.invalidate=this._origInvalidate,this._origInvalidate=void 0),super.dispose()}}const Xv=new Map;function Kv(t){return Math.round(1e3*t)/1e3}function Qv(t){return new M.Color(t).getHexString()}const Zv={material(t,e,n){const i=t+"::"+function(t){const e=[];return null!=t.color&&e.push("c"+Qv(t.color)),null!=t.metalness&&e.push("m"+Kv(t.metalness)),null!=t.roughness&&e.push("r"+Kv(t.roughness)),null!=t.opacity&&e.push("o"+Kv(t.opacity)),null!=t.emissive&&e.push("E"+Qv(t.emissive)),null!=t.emissiveIntensity&&e.push("I"+Kv(t.emissiveIntensity)),null!=t.envMapIntensity&&e.push("e"+Kv(t.envMapIntensity)),null!=t.side&&e.push("s"+t.side),t.transparent&&e.push("t"),t.flatShading&&e.push("f"),!1===t.depthWrite&&e.push("dw0"),t.map&&e.push("M"+(t.map.uuid??"")),e.join("|")}(e);let s=Xv.get(i);return s||Xv.set(i,s=function(t){const e=new M.MeshStandardMaterial;return e.userData.__bankOwned=!0,null!=t.color&&e.color.set(t.color),null!=t.emissive&&e.emissive.set(t.emissive),null!=t.metalness&&(e.metalness=t.metalness),null!=t.roughness&&(e.roughness=t.roughness),null!=t.emissiveIntensity&&(e.emissiveIntensity=t.emissiveIntensity),null!=t.envMapIntensity&&(e.envMapIntensity=t.envMapIntensity),null!=t.side&&(e.side=t.side),null!=t.map&&(e.map=t.map),null!=t.flatShading&&(e.flatShading=t.flatShading),null!=t.depthWrite&&(e.depthWrite=t.depthWrite),null!=t.opacity&&(e.opacity=t.opacity),null!=t.transparent?e.transparent=t.transparent:null!=t.opacity&&t.opacity<1&&(e.transparent=!0),e}(e)),null==n?s:Od(s,{color:n})},get size(){return Xv.size},has(t){const e=t+"::";for(const t of Xv.keys())if(t.startsWith(e))return!0;return!1},dispose(){for(const t of Xv.values())zd(t),t.dispose();Xv.clear()}};class Jv extends iu{getObject3dInstance(){return new M.Mesh}build(){super.build(),this.buildGeometry(),this.buildMaterial(),this.updateDimension()}updateAlpha(){if(this.canShareMaterial)return void super.updateAlpha();const{alpha:t=1,fillStyle:e}=this.component.state;jd(this.object3d.material,0,e)}updateFillStyle(){if(this.canShareMaterial)return this.applyBankMaterial(),void this.applyMaterialOpacity();const{fillStyle:t,alpha:e=1}=this.component.state,n=this.object3d.material;if(!n)return;const i=iu.buildFillStyleTexture(this.component);i?(n.map&&n.map.dispose(),i.needsUpdate=!0,n.map=i,n.needsUpdate=!0):"string"==typeof t&&(n.map&&(n.map.dispose(),n.map=null,n.needsUpdate=!0),"transparent"!==t&&"none"!==t&&n.color.set(Ld(t))),jd(n,0,t)}updateStrokeStyle(){const t=this.object3d.getObjectByName("__edgeLines__");t&&(this.object3d.remove(t),Vd(t));const{strokeStyle:e}=this.component.state;if(!e||"transparent"===e||"none"===e)return;const n=this.object3d.geometry;if(!n?.getAttribute("position"))return;const i=new M.EdgesGeometry(n),s=new M.LineBasicMaterial({color:e}),r=new M.LineSegments(i,s);r.name="__edgeLines__",this.object3d.add(r)}updateDimension(){const{width:t,height:e}=this.component.bounds,{depth:n=1}=this.component.state;if(!this.object3d)return;this.object3d.geometry.computeBoundingBox();const i=this.object3d.geometry.boundingBox;if(i){const s=i.max.x-i.min.x,r=i.max.y-i.min.y,o=i.max.z-i.min.z;this.setDimensionScale(t/s,n/r,e/o)}}get canShareMaterial(){return void 0===this.materialSharingIssue}get materialSharingIssue(){const{fillStyle:t}=this.component.state;if(!t||"object"!=typeof t)return;const e=t.type;return"pattern"===e?"무늬(pattern) fillStyle 은 인스턴스마다 캔버스 텍스처가 필요하다":"gradient"===e?"그라디언트 fillStyle 은 인스턴스마다 캔버스 텍스처가 필요하다":`fillStyle 이 색 문자열이 아니다 (type: ${String(e)})`}get requiresSharedMaterial(){return!0===this.component.constructor.requiresSharedMaterial}get materialSharing(){const t=this.materialSharingIssue,e=void 0===t,n=this.requiresSharedMaterial,i={shared:e,required:n,violated:n&&!e};return void 0!==t&&(i.reason=t),e&&(i.bankKey=this.materialBankKey),i}get materialBankKey(){return`mesh|${this.component.state.type??"unknown"}`}materialSpec(){const t=ud(this.component.state.material3d),e=Rd(this.component.state.fillStyle);return{metalness:t.metalness,roughness:t.roughness,emissive:t.emissive,emissiveIntensity:t.emissiveIntensity,envMapIntensity:t.envMapIntensity,side:fd(t.side),flatShading:t.flatShading,opacity:e,transparent:e<1}}buildMaterial(){if(!this.canShareMaterial){const t=ud(this.component.state.material3d),e=new M.MeshStandardMaterial({transparent:!0});return md(e,t),void(this.object3d.material=e)}this.applyBankMaterial()}applyBankMaterial(){const{fillStyle:t}=this.component.state,e=Rd(t)>0&&"string"==typeof t?Ld(t):void 0;Dd(this.object3d),this.object3d.material=Zv.material(this.materialBankKey,this.materialSpec(),e)}updateMaterial3d(){if(super.updateMaterial3d(),this.canShareMaterial)return this.applyBankMaterial(),void this.applyMaterialOpacity();const t=this.object3d.material;t&&md(t,ud(this.component.state.material3d))}clear(){return Dd(this.object3d),Vd(this.object3d),super.clear()}}function tx(t,e,n,i){return[["bold",t],["italic",e],[n+"px",!0],[i,!0]].filter(t=>t[1]).map(t=>t[0]).join(" ")}function ex(t){let e=0;if(!((t=Math.abs(t)||1)&t-1))return t;for(;0!=t;)t>>=1,e+=1;return 1<<e}function nx(t,e,n){const{bold:i=!1,italic:s=!1,fontFamily:r="Serif",fontSize:o=10,fontColor:a="black",textAlign:c="center",textBaseline:l="middle",width:h=t.width,height:d=t.height,offsetX:u=0,offsetY:p=0}=n||{},f=t.getContext("2d");let m,g;f.imageSmoothingEnabled=!1,f.fillStyle=a,f.strokeStyle=a,f.font=tx(i,s,o,r),"left"===c||"start"===c?(f.textAlign="left",m=u):"right"===c||"end"===c?(f.textAlign="right",m=u+h):(f.textAlign="center",m=u+h/2);const y=1.2*o,b=String(e).split("\n"),_=y*b.length;g="top"===l||"hanging"===l?p+.1*o:"bottom"===l||"alphabetic"===l?p+d-_+.1*o:p+(d-_)/2+.1*o,f.textBaseline="top";for(const t of b)f.fillText(t,m,g),g+=y}function ix(t,e,n,i){const s=ex(2*e),r=ex(2*n),o=Mp(s,r),a=o.getContext("2d"),{fillStyle:c}=i||{};if(c&&"object"==typeof c&&c.colorStops?.length){const t=Ud(c,2*e,2*n);t&&a.drawImage(t,0,0)}a.scale(2,2),"string"==typeof c&&""!==c&&"transparent"!==c&&(a.fillStyle=c,a.fillRect(0,0,e,n)),nx(o,t,i);const l=new M.CanvasTexture(o);return l.needsUpdate=!0,l.wrapS=M.RepeatWrapping,l.wrapT=M.RepeatWrapping,l.offset.set(0,1-2*n/r),l.repeat.set(2*e/s,2*n/r),l.minFilter=M.LinearFilter,l.colorSpace=M.SRGBColorSpace,l}function sx(t,e,n,i,s,r,o){const a=new Image;a.crossOrigin="anonymous",a.onload=()=>{const t=2*n,c=2*i,l=ex(t),h=ex(c),d=Mp(l,h),u=d.getContext("2d");if(r.color&&(u.fillStyle=r.color,u.fillRect(0,0,t,c)),r.fitPattern)u.drawImage(a,0,0,t,c);else{const e=2*(r.width||a.naturalWidth),n=2*(r.height||a.naturalHeight),i=2*(r.offsetX||0),s=2*(r.offsetY||0);let o=0,l=0;switch(r.align){case"center":o=(t-e)/2,l=(c-n)/2;break;case"left-top":break;case"left-bottom":l=c-n;break;case"right-top":o=t-e;break;case"right-bottom":o=t-e,l=c-n;break;case"left":l=(c-n)/2;break;case"right":o=t-e,l=(c-n)/2;break;case"top":o=(t-e)/2;break;case"bottom":o=(t-e)/2,l=c-n}const h=i+o,d=s+l;if(r.noRepeat)u.drawImage(a,0,0,a.naturalWidth,a.naturalHeight,h,d,e,n);else{u.save(),u.rect(0,0,t,c),u.clip();const i=h>0?h-Math.ceil(h/e)*e:h;for(let s=d>0?d-Math.ceil(d/n)*n:d;s<c;s+=n)for(let r=i;r<t;r+=e)u.drawImage(a,0,0,a.naturalWidth,a.naturalHeight,r,s,e,n);u.restore()}}e&&(u.scale(2,2),nx(d,e,s));const p=new M.CanvasTexture(d);p.needsUpdate=!0,p.wrapS=M.RepeatWrapping,p.wrapT=M.RepeatWrapping,p.offset.set(0,1-c/h),p.repeat.set(t/l,c/h),p.minFilter=M.LinearFilter,p.colorSpace=M.SRGBColorSpace,o(p)},a.onerror=()=>{const t=ix(e,n,i,s);o(t)},a.src=t}function rx(t,e){let{bold:n=!1,italic:i=!1,fontFamily:s="Serif",fontSize:r=10,lineHeight:o="normal"}=e||{};t=void 0===t||""==t?" ":String(t);const a=document.createElement("span");a.style.font=tx(n,i,r,s),a.style.lineHeight=String(o),a.style.whiteSpace="pre",a.style.position="absolute",a.textContent=t,document.body.appendChild(a);const c=a.getBoundingClientRect();return document.body.removeChild(a),{width:c.width,height:c.height}}class ox extends Jv{get zPriority(){return Kd.DECAL}get syncZPosOffset(){return this.effectiveDepth}get geometricOffsetY(){return this.effectiveDepth}buildGeometry(){this.updateDimension()}updateStrokeStyle(){}updateFillStyle(){this.updateText()}updateDimension(){const{width:t,height:e}=this.component.state,n=Math.abs(t)||1,i=Math.abs(e)||1;this.object3d.geometry&&this.object3d.geometry.dispose();const s=new M.PlaneGeometry(n,i);s.rotateX(-Math.PI/2),this.object3d.geometry=s}updateText(){const t=this.object3d.material;if(!t)return;const{width:e,height:n,bold:i=!1,italic:s=!1,fontFamily:r="Serif",fontSize:o=10,fontColor:a="black",textAlign:c="center",textBaseline:l="middle",fillStyle:h}=this.component.state,d=Math.abs(e)||1,u=Math.abs(n)||1,p=this.component.text,f=h&&"none"!==h?h:"transparent",m={bold:i,italic:s,fontFamily:r,fontSize:o,fontColor:a,textAlign:c,textBaseline:l,width:d,height:u,fillStyle:f};if("object"==typeof f&&"pattern"===f?.type&&f.image){return void sx(this.component.app.url(h.image),p,d,u,m,h,e=>{t.map&&t.map.dispose(),t.map=e,t.color.set(16777215),t.needsUpdate=!0})}const g=ix(p,d,u,m);g?(t.map&&t.map.dispose(),t.map=g,t.color.set(16777215),g.needsUpdate=!0):"string"==typeof h&&(""!==h&&"transparent"!==h?t.color.set(Ld(h)):t.opacity=0)}updateAlpha(){const t=this.object3d.material;t.opacity=1,t.transparent=!0,super.applyMaterialOpacity()}}zp("text",t=>new ox(t));const ax={input:"css3d",select:"css3d",textarea:"css3d",button:"css3d",iframe:"css3d",video:"css3d",label:"texture",table:"texture",progress:"texture"};function cx(t){const e=t.model?.type??"";return"texture"===(ax[e]??"css3d")?new qv(t):new Pp(t)}zp("html-overlay-element",cx),zp("html-overlay-container",cx);class lx{setShape({extrudedShape:t,extrudedOptions:e}){this.extrudedShape=t,this.bb=new M.Box2,this.bb.setFromPoints(this.extrudedShape?.extractPoints(0).shape),this.extrudedOptions=e}generateTopUV(t,e,n,i,s){const r=e[3*n],o=e[3*n+1],a=e[3*i],c=e[3*i+1],l=e[3*s],h=e[3*s+1],d=this.bb,u=d.max.x-d.min.x,p=d.max.y-d.min.y;return[new M.Vector2((r-d.min.x)/u,1-(o-d.min.y)/p),new M.Vector2((a-d.min.x)/u,1-(c-d.min.y)/p),new M.Vector2((l-d.min.x)/u,1-(h-d.min.y)/p)]}generateSideWallUV(t,e,n,i,s,r){const o=e[3*n],a=e[3*n+1],c=e[3*n+2],l=e[3*i],h=e[3*i+1],d=e[3*i+2],u=e[3*s],p=e[3*s+1],f=e[3*s+2],m=e[3*r],g=e[3*r+1],y=e[3*r+2],b=this.extrudedOptions?.depth||100,_=this.bb,v=_.max.x-_.min.x,x=_.max.y-_.min.y;return Math.abs(a-h)<.01?[new M.Vector2(o/v,1-c/b),new M.Vector2(l/v,1-d/b),new M.Vector2(u/v,1-f/b),new M.Vector2(m/v,1-y/b)]:[new M.Vector2(a/x,1-c/b),new M.Vector2(h/x,1-d/b),new M.Vector2(p/x,1-f/b),new M.Vector2(g/x,1-y/b)]}}function hx(t,e){const n=t/2,i=e/2;return{points:[{x:-n,y:-i},{x:n,y:-i},{x:n,y:i},{x:-n,y:i}]}}function dx(t,e,n){const i=Math.max(3,Math.floor(n)),s=[];for(let n=0;n<i;n++){const r=n/i*Math.PI*2;s.push({x:t*Math.cos(r),y:e*Math.sin(r)})}return{points:s,segments:i}}function ux(t){if(0===t.length)return[];let e=1/0,n=1/0,i=-1/0,s=-1/0;for(const r of t)r.x<e&&(e=r.x),r.x>i&&(i=r.x),r.y<n&&(n=r.y),r.y>s&&(s=r.y);const r=(e+i)/2,o=(n+s)/2,a=t.map(t=>({x:t.x-r,y:t.y-o})),c=a[0],l=a[a.length-1];return a.length>1&&Math.abs(c.x-l.x)<1e-9&&Math.abs(c.y-l.y)<1e-9&&a.pop(),a}class px extends iu{clear(){return this._mesh=void 0,super.clear()}get shape(){return null}topOutline(){const t=this.shape;if(!t||"function"!=typeof t.getPoints)return null;const e=this.outlineDivisions,n=t.getPoints(e);if(!n||n.length<3)return null;const i=ux(n);return i.length<3?null:{points:i}}get outlineDivisions(){return 12}get boundUVGenerator(){return this._boundUVGenerator||(this._boundUVGenerator=new lx),this._boundUVGenerator}build(){super.build();const t=this.effectiveDepth,e=this.shape;if(!e)return;const n=this.boundUVGenerator;n&&n.setShape({extrudedShape:e,extrudedOptions:{depth:t}});const i=this.createGeometry(e),s=this.createMaterials();this._mesh=new M.Mesh(i,s),this._mesh.rotation.x=-Math.PI/2,this._mesh.rotation.y=-Math.PI,this._mesh.rotation.z=-Math.PI,this._mesh.castShadow=!0,this.object3d.add(this._mesh),this.updateFillStyle(),this.updateStrokeStyle()}createGeometry(t){const e=this.effectiveDepth,{lineWidth:n=0}=this.component.state,i={steps:1,depth:e,bevelEnabled:n>0,bevelThickness:0,bevelSize:n,bevelSegments:1,UVGenerator:this.boundUVGenerator},s=new M.ExtrudeGeometry(t,i);return s.center(),s}createMaterials(){const t=ud(this.component.state.material3d),e=new M.MeshStandardMaterial;md(e,t);const n=new M.MeshStandardMaterial;return md(n,t),[e,n]}createTexture(){const{width:t,height:e}=this.component.bounds,n=ex(t),i=ex(e),s=Mp(n,i);this.component.render(s.getContext("2d"));const r=new M.CanvasTexture(s);return r.needsUpdate=!0,r.wrapS=M.RepeatWrapping,r.wrapT=M.RepeatWrapping,r.offset.set(0,1-e/i),r.repeat.set(t/n,e/i),r.minFilter=M.LinearFilter,r}getMaterials(){if(!this._mesh)return;const t=this._mesh.material;return Array.isArray(t)?t:void 0}updateMaterial3d(){super.updateMaterial3d();const t=this.getMaterials();if(!t)return;const e=ud(this.component.state.material3d);for(const n of t)md(n,e)}updateAlpha(){const{alpha:t=1,fillStyle:e,strokeStyle:n}=this.component.state,i=this.getMaterials();i&&(jd(i[0],0,e),jd(i[1],0,n))}updateStrokeStyle(){const t=this.getMaterials();if(!t)return;const{strokeStyle:e}=this.component.state;t[1].color.set(Ld(e))}updateFillStyle(){this._applyCapTexture()}updateText(){this._applyCapTexture()}_applyCapTexture(){const t=this.getMaterials();if(!t)return;const e=t[0],{fillStyle:n}=this.component.state,i=this.component.hasTextProperty?this.component.text:"";if(!i){const t=iu.buildFillStyleTexture(this.component);return t?(e.map&&e.map.dispose(),e.map=t,e.color.set(16777215)):(e.map&&(e.map.dispose(),e.map=null),e.color.set(Ld(n))),void(e.needsUpdate=!0)}const{bold:s=!1,italic:r=!1,fontFamily:o="Serif",fontSize:a=10,fontColor:c="black",textAlign:l="center",textBaseline:h="middle",paddingTop:d=0,paddingLeft:u=0,paddingRight:p=0,paddingBottom:f=0}=this.component.state,{width:m,height:g}=this.component.bounds,y=Math.abs(m)||1,b=Math.abs(g)||1,_={bold:s,italic:r,fontFamily:o,fontSize:a,fontColor:c,textAlign:l,textBaseline:h,width:Math.max(y-u-p,0),height:Math.max(b-d-f,0),fillStyle:n,offsetX:u,offsetY:d};if("object"==typeof n&&"pattern"===n?.type&&n.image){return void sx(this.component.app.url(n.image),i,y,b,_,n,t=>{e.map&&e.map.dispose(),e.map=t,e.color.set(16777215),e.needsUpdate=!0})}e.map&&e.map.dispose();const v=ix(i,y,b,_);e.map=v,e.color.set(16777215),e.needsUpdate=!0}updateDimension(){super.updateDimension()}onchange(t,e){if("path"in t&&this._mesh){const t=this._mesh.geometry,e=this.shape;if(e){const n=this.createGeometry(e);this._mesh.geometry=n,t.dispose()}}super.onchange(t,e)}}class fx extends px{get shape(){const{cx:t=0,cy:e=0,rx:n=1,ry:i=1,startAngle:s=0,endAngle:r=2*Math.PI,anticlockwise:o=!1}=this.component.state,a=new M.EllipseCurve(t,e,Math.abs(n),Math.abs(i),s,r,o,0);return new M.Shape(a.getPoints(50))}}zp("ellipse",t=>new fx(t));class mx extends px{get shape(){const{width:t,height:e,round:n=0}=this.component.state,i=uc(n,t,e);if(i>0){const n=i,s=new M.Path;return s.moveTo(n,0),s.lineTo(t-n,0),s.quadraticCurveTo(t,0,t,n),s.lineTo(t,e-n),s.quadraticCurveTo(t,e,t-n,e),s.lineTo(n,e),s.quadraticCurveTo(0,e,0,e-n),s.lineTo(0,n),s.quadraticCurveTo(0,0,n,0),new M.Shape(s.getPoints(12))}const s=new M.Shape;return s.moveTo(0,0),s.lineTo(t,0),s.lineTo(t,e),s.lineTo(0,e),s.lineTo(0,0),s}}function gx(t,e={}){const n=e.round??0,i=e.divisions??24;if(!t||0===t.length)return new M.Shape;const s=t.some(t=>Or(t)),r=n>0||t.some(t=>Rr(t,0)>0);if(s||r){const e=new M.Path;for(let i=0;i<t.length;i++){const s=t[(i-1+t.length)%t.length],r=t[i],o=t[(i+1)%t.length];if(s.x===r.x&&s.y===r.y)continue;const a=Rr(r,n);let c=Math.sqrt((s.x-r.x)**2+(s.y-r.y)**2),l=0!==c?Math.atan2(s.x-r.x,s.y-r.y):0;const h=Math.sin(l)*Math.min(a,c/2)+r.x,d=Math.cos(l)*Math.min(a,c/2)+r.y;c=Math.sqrt((o.x-r.x)**2+(o.y-r.y)**2),l=0!==c?Math.atan2(o.x-r.x,o.y-r.y):0;const u=Math.sin(l)*Math.min(a,c/2)+r.x,p=Math.cos(l)*Math.min(a,c/2)+r.y;if(0===i?e.moveTo(h,d):e.lineTo(h,d),a>0&&e.quadraticCurveTo(r.x,r.y,u,p),Or(r)){const t=Rr(o,n),i=Math.sqrt((r.x-o.x)**2+(r.y-o.y)**2),s=0!==i?Math.atan2(r.x-o.x,r.y-o.y):0,a=Dr({x:u,y:p},{x:Math.sin(s)*Math.min(t,i/2)+o.x,y:Math.cos(s)*Math.min(t,i/2)+o.y},r.bulge);a&&e.absarc(a.cx,a.cy,a.radius,a.startAngle,a.endAngle,a.clockwise)}}return new M.Shape(e.getPoints(i))}const o=new M.Shape;for(let e=0;e<t.length;e++)0===e?o.moveTo(t[e].x,t[e].y):o.lineTo(t[e].x,t[e].y);return o}zp("rect",t=>new mx(t));class yx extends px{get shape(){const{path:t=[],round:e=0}=this.component.state;return gx(t,{round:e,divisions:24})}build(){Object.getPrototypeOf(px.prototype).build.call(this);const t=this.effectiveDepth,e=this.shape;if(!e)return;const n=this.boundUVGenerator,i=this.minMax;if(n&&void 0!==i.minX&&void 0!==i.maxX&&void 0!==i.minY&&void 0!==i.maxY){const e=new M.Shape;e.moveTo(i.minX,i.minY),e.lineTo(i.maxX,i.minY),e.lineTo(i.maxX,i.maxY),e.lineTo(i.minX,i.maxY),e.closePath(),n.setShape({extrudedShape:e,extrudedOptions:{depth:t}})}else n&&n.setShape({extrudedShape:e,extrudedOptions:{depth:t}});const s=this.createGeometry(e),r=this.createMaterials();this._mesh=new M.Mesh(s,r),this._mesh.rotation.x=-Math.PI/2,this._mesh.rotation.y=-Math.PI,this._mesh.rotation.z=-Math.PI,this._mesh.castShadow=!0,this.object3d.add(this._mesh),this.updateFillStyle(),this.updateStrokeStyle()}createGeometry(t){const e=this.effectiveDepth,{lineWidth:n=0}=this.component.state,i={steps:1,depth:e,bevelEnabled:n>0,bevelThickness:0,bevelSize:n,bevelSegments:1,UVGenerator:this.boundUVGenerator},s=new M.ExtrudeGeometry(t,i),r=this.minMax;if(void 0!==r.minX&&void 0!==r.maxX&&void 0!==r.minY&&void 0!==r.maxY){const t=(r.minX+r.maxX)/2,e=(r.minY+r.maxY)/2;s.translate(-t,-e,0),s.computeBoundingBox();const n=s.boundingBox;n&&s.translate(0,0,-(n.min.z+n.max.z)/2)}else s.center();return s}get minMax(){if(!this._minMax){const{path:t}=this.component.state;let e,n,i,s;t.forEach((t,r)=>{if(0==r)return e=i=t.x,void(n=s=t.y);e=Math.min(e,t.x),i=Math.max(i,t.x),n=Math.min(n,t.y),s=Math.max(s,t.y)}),this._minMax={minX:e,minY:n,maxX:i,maxY:s}}return this._minMax}}zp("polygon",t=>new yx(t));class bx extends px{get shape(){const{cx:t=0,cy:e=0,rx:n=1,ry:i=1,ratio:s=50,startAngle:r=0,endAngle:o=2*Math.PI,anticlockwise:a=!1}=this.component.state,c=Math.abs(n),l=Math.abs(i),h=new M.EllipseCurve(t,e,c,l,r,o,a,0),d=new M.Shape(h.getPoints(50)),u=c/100*s,p=l/100*s;if(u>0&&p>0){const n=new M.EllipseCurve(t,e,u,p,r,o,a,0),i=new M.Path(n.getPoints(50));d.holes.push(i)}return d}}zp("donut",t=>new bx(t));class _x extends px{get shape(){const{x1:t=0,y1:e=0,x2:n=0,y2:i=0,x3:s=0,y3:r=0,round:o=0}=this.component.state,a=[{x:t,y:e},{x:n,y:i},{x:s,y:r}];if(o>0){const t=new M.Path;for(let e=0;e<a.length;e++){const n=a[(e-1+a.length)%a.length],i=a[e],s=a[(e+1)%a.length];let r=Math.sqrt((n.x-i.x)**2+(n.y-i.y)**2),c=0!==r?Math.atan2(n.x-i.x,n.y-i.y):0;const l=Math.sin(c)*Math.min(o,r/2)+i.x,h=Math.cos(c)*Math.min(o,r/2)+i.y;r=Math.sqrt((s.x-i.x)**2+(s.y-i.y)**2),c=0!==r?Math.atan2(s.x-i.x,s.y-i.y):0;const d=Math.sin(c)*Math.min(o,r/2)+i.x,u=Math.cos(c)*Math.min(o,r/2)+i.y;0===e?t.moveTo(l,h):t.lineTo(l,h),t.quadraticCurveTo(i.x,i.y,d,u)}return new M.Shape(t.getPoints(12))}const c=new M.Shape;return c.moveTo(t,e),c.lineTo(n,i),c.lineTo(s,r),c.closePath(),c}}zp("triangle",t=>new _x(t));class vx extends px{get shape(){const{ratio:t=30,wing:e=5,cx:n=0,cy:i=0,rx:s=1,ry:r=1}=this.component.state;if(e<3)return null;const o=Math.PI/2,a=2*Math.PI/e,c=s-t/100*s,l=r-t/100*r,h=new M.Shape;h.moveTo(n+s*Math.cos(-o),i+r*Math.sin(-o)),h.lineTo(n+(s-c)*(Math.cos(a-o)+Math.cos(0-o))/2,i+(r-l)*(Math.sin(a-o)+Math.sin(0-o))/2);for(let t=1;t<e;t++)h.lineTo(n+s*Math.cos(a*t-o),i+r*Math.sin(a*t-o)),h.lineTo(n+(s-c)*(Math.cos(a*(t+1)-o)+Math.cos(a*t-o))/2,i+(r-l)*(Math.sin(a*(t+1)-o)+Math.sin(a*t-o))/2);return h.closePath(),h}}zp("star",t=>new vx(t));const xx=new Map;function wx(t){return t.userData.__bankOwned=!0,t}const Mx={primitive(t){const e="primitive::"+function(t){switch(t.kind){case"cylinder":return`cylinder|${t.segments??0}`;case"sphere":return`sphere|${t.segments??0}|${t.heightSegments??0}`;default:return t.kind}}(t);let n=xx.get(e);return n||xx.set(e,n=wx(function(t){switch(t.kind){case"box":return new M.BoxGeometry(1,1,1);case"plane":return new M.PlaneGeometry(1,1);case"cylinder":return new M.CylinderGeometry(.5,.5,1,t.segments??16);case"sphere":return new M.SphereGeometry(.5,t.segments??16,t.heightSegments??Math.max(2,Math.round((t.segments??16)/2)))}}(t))),n},shaped(t,e){const n="shaped::"+t;let i=xx.get(n);return i||xx.set(n,i=wx(e())),i},owns:t=>!0===t.userData?.__bankOwned,get size(){return xx.size},has:t=>xx.has("primitive::"+t)||xx.has("shaped::"+t),dispose(){for(const t of xx.values())t.dispose();xx.clear()}},Sx=[8,12,16],Ax={cylinder:25,sphere:32},Ex=128;function kx(t,e){return"number"==typeof t&&Number.isFinite(t)?Math.min(Ex,Math.max(3,Math.floor(t))):e}function Cx(t,e){return"number"==typeof t&&Number.isFinite(t)?Math.min(Ex,Math.max(2,Math.floor(t))):Math.max(2,Math.round(e/2))}function Tx(t){return Sx.includes(t)}const Px={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"segments",name:"segments",property:"segments"},{type:"number",label:"height-segments",name:"heightSegments",property:"heightSegments"}],help:"scene/component/sphere"};class Ox extends Jv{buildGeometry(){const t=this.component.state,e=kx(t.segments,Ax.sphere),n=Cx(t.heightSegments,e);this.object3d.geometry=Mx.primitive({kind:"sphere",segments:e,heightSegments:n})}updateDimension(){const{rx:t=0,ry:e=0,rz:n}=this.component.state,i=n??t;this.setDimensionScale(2*t,2*i,2*e)}get effectiveDepth(){const{rx:t=0,rz:e}=this.component.state,n=e??t;return Math.max(2*n,1)}topOutline(){const{rx:t=0,ry:e=0}=this.component.state;if(!(t>0&&e>0))return null;return dx(t,e,kx(this.component.state.segments,Ax.sphere))}}t.Sphere=class extends ly{get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new Ox(this)}get nature(){return Px}},t.Sphere=Pm([Mb("sphere")],t.Sphere);class Dx extends iu{getObject3dInstance(){return new M.Sprite}build(){super.build(),this.buildMaterial()}get cz(){const{zPos:t=0}=this.component.state,{height:e}=this.component.bounds,{tz:n=0}=this.component.delta(),i=this.component.parent?._realObject;return t+n+e/2-(i?.geometricOffsetY??0)}get geometricOffsetY(){const{height:t=0}=this.component.bounds;return t/2}updateAlpha(){const{alpha:t=1,fillStyle:e}=this.component.state;jd(this.object3d.material,0,e)}updateFillStyle(){const{fillStyle:t}=this.component.state,e=this.object3d.material;if(!e)return;const n=iu.buildFillStyleTexture(this.component);n?(e.map&&e.map.dispose(),n.needsUpdate=!0,e.map=n):"string"==typeof t&&("transparent"!==t?e.color.set(Ld(t)):e.opacity=0)}}class zx extends Dx{buildMaterial(){const t=this.object3d.material;t&&t.dispose(),this.object3d.material=new M.SpriteMaterial({map:Vv(this.component),alphaTest:.01,sizeAttenuation:!1})}get scale(){const{width:t,height:e}=this.component.bounds,n=this.threeContainer,{width:i=1,height:s=1}=n?.bounds??{},{scale:r=1}=this.component.state;return{x:r*t/i,y:r*e/s,z:r}}update(){this.build(),this.updateHidden()}updateFillStyle(){this.update()}updateStrokeStyle(){this.update()}updateAlpha(){this.update()}updateText(){this.update()}}const Ix={mutable:!1,resizable:!0,rotatable:!0,properties:[]};t.Sprite=class extends(pc(dc)){get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new zx(this)}get nature(){return Ix}},t.Sprite=Pm([Mb("sprite")],t.Sprite);const Rx={mutable:!1,resizable:!0,rotatable:!0,properties:[],help:"scene/component/cube"};class jx extends Jv{buildGeometry(){this.object3d.geometry=Mx.primitive({kind:"box"})}topOutline(){const{width:t=0,height:e=0}=this.component.state;return t>0&&e>0?hx(t,e):null}}t.Cube=class extends(pc(dc)){get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new jx(this)}get nature(){return Rx}},t.Cube=Pm([Mb("cube")],t.Cube);const Lx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"segments",name:"segments",property:"segments"}],help:"scene/component/cylinder"};class Fx extends Jv{buildGeometry(){const t=kx(this.component.state.segments,Ax.cylinder);this.object3d.geometry=Mx.primitive({kind:"cylinder",segments:t})}updateDimension(){const{rx:t=0,ry:e=0,depth:n=1}=this.component.state;this.setDimensionScale(2*t,n,2*e)}topOutline(){const{rx:t=0,ry:e=0}=this.component.state;if(!(t>0&&e>0))return null;return dx(t,e,kx(this.component.state.segments,Ax.cylinder))}}t.Cylinder=class extends ly{get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new Fx(this)}get nature(){return Lx}},t.Cylinder=Pm([Mb("cylinder")],t.Cylinder);const Nx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"color",label:"box-color",name:"boxColor",property:"boxColor"}],help:"scene/component/banner"};class Bx extends iu{get zPriority(){return Kd.DECAL}build(){super.build();const{width:t=1,height:e=1,depth:n=1}=this.component.state;this.object3d.add(this.createCube(t,e,n));const i=this.createTextureBoard(t,n);i.position.set(0,0,.5*e+1),this.object3d.add(i)}createCube(t,e,n){const{boxColor:i="#ccaa76"}=this.component.state,s=ud(this.component.state.material3d),r=new M.BoxGeometry(t,n,e),o=new M.MeshStandardMaterial({color:i,side:M.FrontSide});md(o,s);const a=new M.Mesh(r,o);return a.castShadow=s.castShadow,a.receiveShadow=s.receiveShadow,a}createTextureBoard(t,e){const n=ud(this.component.state.material3d),{fillStyle:i="#ccaa76"}=this.component.state,s=iu.buildFillStyleTexture(this.component),r=new M.MeshStandardMaterial(s?{map:s}:{color:i||"#ccaa76",side:M.FrontSide});md(r,n);const o=new M.PlaneGeometry(t,e,1,1),a=new M.Mesh(o,r);return a.castShadow=n.castShadow,a.receiveShadow=n.receiveShadow,a}updateMaterial3d(){super.updateMaterial3d();const t=ud(this.component.state.material3d);this.object3d.traverse(e=>{if(e.isMesh){const n=e.material;n&&md(n,t),e.castShadow=t.castShadow,e.receiveShadow=t.receiveShadow}})}updateFillStyle(){this.update()}onchange(t,e){super.onchange(t,e),"boxColor"in t&&this.update()}}var Hx;t.Banner=class extends(pc(dc)){get hasTextProperty(){return!1}is3dish(){return!0}get nature(){return Nx}buildRealObject(){return new Bx(this)}},t.Banner=Pm([Mb("banner")],t.Banner);const $x={far:1e5,fov:80,near:1,zoom:1},Gx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"near",name:"near"},{type:"number",label:"far",name:"far"},{type:"number",label:"fov",name:"fov"},{type:"number",label:"zoom",name:"zoom"},{type:"checkbox",label:"show-helper",name:"showHelper"}],help:"scene/component/camera"};class Vx extends iu{getObject3dInstance(){return new M.Mesh}updateCamera(){const{near:t=$x.near,far:e=$x.far,fov:n=$x.fov,zoom:i=$x.zoom,showHelper:s}=this.component.state;this.camera.far=e,this.camera.fov=n,this.camera.near=t,this.camera.zoom=i,s?this.helper||(this.helper=new M.CameraHelper(this.camera),this.object3d.add(this.helper)):this.helper&&(this.object3d.remove(this.helper),delete this.helper)}build(){super.build();const{width:t=0,height:e=0,depth:n=0,fillStyle:i="lightgray"}=this.component.state;this.object3d.geometry=new M.BoxGeometry(t,n,e);const s=ud(this.component.state.material3d),r=new M.MeshStandardMaterial({color:i});md(r,s),this.object3d.material=r,this.object3d.castShadow=s.castShadow,this.object3d.receiveShadow=s.receiveShadow,this.camera=new M.PerspectiveCamera,this.camera.position.set(0,0,0),this.object3d.add(this.camera),this.object3d.lookAt(0,0,0),this.updateCamera()}updateMaterial3d(){super.updateMaterial3d();const t=this.object3d.material;if(!t)return;const e=ud(this.component.state.material3d);md(t,e),this.object3d.castShadow=e.castShadow,this.object3d.receiveShadow=e.receiveShadow}}t.Camera=Hx=class extends(pc(dc)){get hasTextProperty(){return!1}is3dish(){return!0}static get image(){return Hx._image||(Hx._image=new Image,Hx._image.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA1IAAANSAQMAAABV6G1EAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAABlBMVEX6+voBAQGV71ZvAAAFO0lEQVR42u3dMZLkNBiGYakUKFRIqKOISxDvETiCTBEQcgQOQE7clyAi8REm7KDXIhgYoMa/7fbIX+2K9w022MCP/25Z28GW5RwRERERERERERERERERERERERERERERERERERERERERERERERHRl9mv7fdPn7879sf8Mcq3J3r5EJXaUy3Wddrcd6qNybx9F2/lZ63H+nVCa9Oe9elZa5ksa/dDbE+3fsm4v27C89bd+i6W3l+XdcnSWtuxyvPW+hqorbWb0Jr7Pl3m4tjfVMIZ625d6L5pxTPWw7rQY9P6pqu1dF8aq5d83cE3rXrGWluIxV6h53eotv4c1V3Ln7Nm66ZvvZf8SSues16sD2jubz2sC839fmvYiz7t//LJna27wsr7VjlnNWtPeHTfNlae2bZvnaTePUd+74fqV2LNxv6zdN8O3z9HSWhlc4F+dOvdsKbe2+F7q+zPddq6W2ts6r31vrN825/rtPWwvvcL5losy11uxQNz5U6fYT4w12mrWf80TUNZdetXal/LtwNW6WOFI1Y9bU3GVnfFXM9bneZKwrmKcK4qnKsK52q6uULTzRWFVjpkta/OykKrCq02puWFVhRaSWjlQa0itJrO8oNaQWgloZWFVhnUqjrLN50VBrWi0MpCqwitOqjVdFYQWlFopUGtLLSq0GpjWl5oRaGVBrWy0KpCq+ksP6gVhFYSWllolUGtqrNW/jvBZVYY1IpCKwutIrTqoFbTWUFoxUGtJLSK0KpCq41peaEVhVYa1MpCqwqtprP8oFYUWklo5UGtIrSazvJCKwxqRaGVhVYZ1Ko664ems34UWj8Nav0stBoWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhbW/9L6RWgp37WofIek8j2cyveLTkqrCq0itLLQSkJL+Q5k5budle/HVr73e/24gAHenZ6FlvK9+srzAoLQUp65oDy3QnoeRxFaWWgpz2pRnncThJbyzCDpuUtVaBWhlYWW8qwx5RlqynPovNBSnuUnPaOwCK0stJLQUp4BqjzbVHk+rFNaVWgVoZWFlvJc6Si0lGdzK88cV57bLj2PvgitLLSS0IpCKwgtL7Sc0qpCqwitLLSS0IpCKwgtL7Sc0qpCqwitLLSS0IpCKwgtL7Sc0qpCqwitLLSS0IpCKwgtL7Sc0qpCqwitLLSS0IpCKwgtL7Sc0qpCqxyyahcrH7JKFysJ54rCuYJwLi+cywnn+vdlLp+rCOfKwrnStXP95zLxiJX7WEFoeaHljO/xEqsaf9/FWqz1bM+VzloP655df2uxrnP9XPHKue7OeMDsuWInyx+Y67T1Yv0gs+cKvay6P5fvZZULrdnYFBbbcr2sdKF1MxbZFdZkLLItq3aay6/vJ102eusD2rJKl633nw/o3n+uxbrpLSv1svL6M95hQ3xYNz33t16sC21Zoc+28Xahm+u+Ic7WhbYs1+dRfrvQ5LpvHOaFNq3SZ8n/faEt6twDtli7wrJpxT6P1183/di0Ti36u3XT903Ld1qGrzf9smmdWhyTddNzf8t8UqdtK/dZGq8P2DZ1ZnHcrQ/osWO5PkvDuby7NE58Yctk7Qq3PSv3+bpc3F0aJ56wF+uLX9xu6eOb4es9z/vWc0vR3oZuByjnf2t/fP/54B/2WvvWEREREREREREREREREREREREREREREREREREREREREREREREREX2J/QlrTpqHD8xO1gAAAABJRU5ErkJggg=="),Hx._image}render(t){const{left:e,top:n,width:i,height:s}=this.bounds;t.beginPath(),this.drawImage(t,Hx.image,e,n,i,s)}buildRealObject(){return new Vx(this)}get nature(){return Gx}},t.Camera=Hx=Pm([Mb("camera")],t.Camera);const Ux={mutable:!1,resizable:!0,rotatable:!0,properties:[...xb],"value-property":"source",help:"scene/component/gltf-object"};t.GLTFObject=class extends(wb(pc(dc))){get nature(){return Ux}},t.GLTFObject=Pm([Mb("gltf-object")],t.GLTFObject);const Yx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"select",label:"light-type",name:"lightType",property:{options:["","point","directional"]}},{type:"number",label:"intensity",name:"intensity"},{type:"number",label:"distance",name:"distance"},{type:"number",label:"decay",name:"decay"},{type:"checkbox",label:"cast-shadow",name:"castShadow"},{type:"number",label:"near",name:"near",placeholder:"0.5"},{type:"number",label:"far",name:"far",placeholder:"1000"},{type:"number",label:"fov",name:"fov",placeholder:"90"},{type:"number",label:"zoom",name:"zoom",placeholder:"1"},{type:"checkbox",label:"show-helper",name:"showHelper"}],help:"scene/component/light"};class Wx extends iu{updatePointLight(){const{lightType:t="point",distance:e=0,intensity:n=10,decay:i=1,fillStyle:s="white",castShadow:r,near:o=.5,far:a=1e3,fov:c=90,zoom:l=1,showHelper:h}=this.component.state;if(this.object3d.color=new M.Color(s),"point"==t&&(this.object3d.distance=e,this.object3d.decay=i),this.object3d.intensity=n,this.object3d.castShadow=r,r){const t=this.object3d.shadow?.camera;t.far=a,t.near=o,t.fov=c,t.zoom=l}if(h){const t=this.object3d.shadow?.camera;this.helper||(this.helper=new M.CameraHelper(t),this.object3d.add(this.helper))}else this.helper&&(this.object3d.remove(this.helper),delete this.helper)}getObject3dInstance(){const{lightType:t="point"}=this.component.state;return"point"==t?new M.PointLight:new M.DirectionalLight}update(){this.clear(),this.build(),this.updateDimension(),this.updateHidden(),this.updatePointLight()}}t.PointLight=class extends ly{get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new Wx(this)}get anchors(){return[]}get nature(){return Yx}},t.PointLight=Pm([Mb("light")],t.PointLight);const qx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"depth",name:"depth",property:"depth"}],help:"scene/component/wall"};class Xx extends Jv{buildGeometry(){this.object3d.geometry=Mx.primitive({kind:"box"})}topOutline(){const{width:t=0,height:e=0}=this.component.state;return t>0&&e>0?hx(t,e):null}}t.Wall=class extends(pc(dc)){get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new Xx(this)}get nature(){return qx}},t.Wall=Pm([Mb("wall")],t.Wall);const Kx={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"number",label:"depth",name:"depth",property:"depth"},{type:"checkbox",label:"hide-in-2d-view",name:"hideIn2DView"},{type:"checkbox",label:"hide-in-3d-view",name:"hideIn3DView"}],help:"scene/component/floor-plate"};class Qx extends iu{get zPriority(){return Kd.FLOOR}get receivingSurfaceY(){return this.placementSurfaceY()}resolveShadow(){const t=this.component.state,e=t.material3d,{alpha:n=1,fillStyle:i}=t,s=n>=.9&&"none"!==i;return{receive:e?.receiveShadow??!0,cast:e?.castShadow??s}}updateHidden(){const t=this.component.state,e=!!this.component.app?.isViewMode;this.object3d.visible=!(t.hidden||e&&t.hideIn3DView)}clear(){return this._topTexture&&(this._topTexture.dispose(),this._topTexture=void 0),this._mesh=void 0,super.clear()}build(){super.build();const{width:t,height:e,depth:n=1}=this.component.state;if(!t||!e)return;const i=Math.abs(t),s=Math.abs(e),r=Math.max(n,.5),o=new M.BoxGeometry(i,r,s),a=this._buildTopMaterial(),c=this._buildSideMaterial(),l=[c,c,a,c,c,c];this._mesh=new M.Mesh(o,l),this._mesh.position.y=0;const{cast:h,receive:d}=this.resolveShadow();this._mesh.castShadow=h,this._mesh.receiveShadow=d,this.object3d.add(this._mesh)}_buildTopMaterial(){const{alpha:t=1,fillStyle:e}=this.component.state,n=ud(this.component.state.material3d),i=iu.buildFillStyleTexture(this.component);if(i){this._topTexture=i;const t=new M.MeshStandardMaterial({map:i,side:M.DoubleSide});return jd(t,0,e),t.depthWrite=t.opacity>=.9,md(t,n),t}const s="string"==typeof e&&"none"!==e?Ld(e):"#e0e0e0",r=new M.MeshStandardMaterial({color:s,side:M.DoubleSide});return jd(r,0,e),r.depthWrite=r.opacity>=.9,md(r,n),r}_buildSideMaterial(){const{strokeStyle:t,alpha:e=1}=this.component.state,n="string"==typeof t&&t?Ld(t):"#999999",i=ud(this.component.state.material3d),s=new M.MeshStandardMaterial({color:n});return md(s,i),s.side=M.DoubleSide,jd(s,0,t),s.depthWrite=s.opacity>=.9,s}updateAlpha(){if(!this._mesh)return;const{alpha:t=1,fillStyle:e,strokeStyle:n}=this.component.state,i=this._mesh.material;for(let t=0;t<i.length;t++){const s=i[t];jd(s,0,2===t?e:n),s.depthWrite=s.opacity>=.9}}updateFillStyle(){if(!this._mesh)return;this._topTexture&&(this._topTexture.dispose(),this._topTexture=void 0);const t=this._mesh.material;t[2].dispose(),t[2]=this._buildTopMaterial()}updateStrokeStyle(){if(!this._mesh)return;const t=this._mesh.material,e=this._buildSideMaterial();for(let n=0;n<t.length;n++)2!==n&&(t[n].dispose(),t[n]=e)}}t.FloorPlate=class extends Rl{get hasTextProperty(){return!1}is3dish(){return!0}buildRealObject(){return new Qx(this)}get nature(){return Kx}get hidden(){return!!this.getState("hideIn2DView")||super.hidden}},t.FloorPlate.requires3d=!0,t.FloorPlate=Pm([Mb("floor-plate")],t.FloorPlate);function Zx(t,e={}){const n=e.size??5,i=e.color??4500172,s=e.emissive??2245734,r=new M.SphereGeometry(n,16,12),o=new M.MeshStandardMaterial({color:i,emissive:s,emissiveIntensity:.15,metalness:.3,roughness:.4,transparent:!0,opacity:.35}),a=new M.Mesh(r,o);e.position&&a.position.set(e.position[0],e.position[1],e.position[2]),a.userData.alwaysRaycast=!0,a.scale.setScalar(1),a.visible=e.visible??!(!0===t.app?.isViewMode);const c=()=>{o.emissiveIntensity=.9,o.opacity=.95,a.scale.setScalar(1.35),t.invalidate?.()},l=()=>{o.emissiveIntensity=.15,o.opacity=.35,a.scale.setScalar(1),t.invalidate?.()};return t.on("mouseenter",c),t.on("mouseleave",l),a.userData.dispose=()=>{t.off("mouseenter",c),t.off("mouseleave",l)},a}class Jx extends Jv{get zPriority(){return Kd.DECAL}get syncZPosOffset(){return this.effectiveDepth}get geometricOffsetY(){return this.effectiveDepth}buildGeometry(){const{width:t,height:e}=this.component.state,n=Math.abs(t)||1,i=Math.abs(e)||1,s=new M.PlaneGeometry(n,i);s.rotateX(-Math.PI/2),this.object3d.geometry=s}updateDimension(){this.update()}build(){super.build();const{width:t,height:e}=this.component.state,n=Math.abs(t)||1,i=Math.abs(e)||1,s=Math.max(2,.04*Math.min(n,i));this.object3d.add(Zx(this.component,{size:s,position:[n/2-s,s,-i/2+s]}))}}const tw={mutable:!1,resizable:!0,rotatable:!0,properties:[],help:"scene/component/decal"};let ew=class extends(_b(pc(dc))){buildRealObject(){return new Jx(this)}get nature(){return tw}};ew=Pm([Mb("decal")],ew);class nw extends iu{getObject3dInstance(){return new M.Group}get allowedGizmoModes(){return this.component.isGroup?.()?["translate"]:null}}const iw="#dde2e8",sw="#9c9c9c",rw="#e8e8ec",ow=.35;function aw(t,e,n,i,s){if(!e.visible)return new M.MeshStandardMaterial({transparent:!0,opacity:0,depthWrite:!1});const r=e.alpha*n,o="wall"===i?iw:"floor"===i?sw:rw,a=new M.MeshStandardMaterial({metalness:0,roughness:"wall"===i?.6:.85,transparent:r<1,opacity:r,side:s?M.BackSide:M.DoubleSide});return function(t,e,n,i,s,r){if("string"==typeof n&&n&&"transparent"!==n)t.color.set(n);else{if(n&&"object"==typeof n){const i=!r,o=iu.buildFillStyleTexture(e,n,{mirror:i,rotation:s});if(o)return t.map&&t.map.dispose(),t.map=o,void t.color.set("#ffffff")}t.color.set(i)}}(a,t,e.fillStyle,o,e.rotation,e.mirror),a}class cw extends nw{get zPriority(){return Kd.BACKDROP}get position(){if(this.component.state.fitToBoard){return{x:0,y:super.position.y,z:0}}return super.position}build(){super.build();const t=this.component.state;let e=t.width,n=t.height;if(t.fitToBoard){const t=this.component.rootModel,i=t?.state;i&&Number.isFinite(i.width)&&Number.isFinite(i.height)&&(e=i.width,n=i.height)}const i=this.effectiveDepth||Math.min(e,n)||200,s=t.alpha??1,r=!1!==t.seeThrough,o={east:this._resolveFace("east",iw,!0,ow),west:this._resolveFace("west",iw,!0,ow),north:this._resolveFace("north",iw,!0,ow),south:this._resolveFace("south",iw,!0,ow),floor:this._resolveFace("floor",sw,!0,1),ceiling:this._resolveFace("ceiling",rw,!0,1)},a=[aw(this.component,o.east,s,"wall",r),aw(this.component,o.west,s,"wall",r),aw(this.component,o.ceiling,s,"ceiling",r),aw(this.component,o.floor,s,"floor",r),aw(this.component,o.south,s,"wall",r),aw(this.component,o.north,s,"wall",r)],c=new M.BoxGeometry(e,i,n),l=new M.Mesh(c,a);if(l.receiveShadow=!0,this.object3d.add(l),this.component.app?.isEditMode){const t=new M.LineBasicMaterial({color:4473941,transparent:!0,opacity:.7}),e=new M.LineSegments(new M.EdgesGeometry(c),t);this.object3d.add(e)}const h=Math.max(2,.04*Math.min(e,n,i));this.object3d.add(Zx(this.component,{size:h,position:[e/2,i/2+h,-n/2]}))}_resolveFace(t,e,n,i){const s=this.component.state,r=s.faces?.[t]??{},o=r.visible,a=r.alpha,c=r.rotation,l=90===c||180===c||270===c?c:0;return{fillStyle:r.fillStyle??e,visible:"boolean"==typeof o?o:n,alpha:"number"==typeof a&&Number.isFinite(a)?a:i,rotation:l,mirror:!0===r.mirror}}updateDimension(){}onchange(t,e){["alpha","width","height","depth","fitToBoard","faces","seeThrough"].some(e=>e in t)?this.update():super.onchange(t,e)}updateAlpha(){}}const lw={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"checkbox",label:"fit-to-board",name:"fitToBoard"},{type:"checkbox",label:"see-through",name:"seeThrough"},{type:"backdrop-faces",label:"",name:"faces"}],help:"scene/component/backdrop"};let hw=class extends(_b(pc(dc))){buildRealObject(){return new cw(this)}get nature(){return lw}added(t){super.added?.(t),this.state.fitToBoard&&(this._syncFromRoot(!0),this._attachRootListener())}async ready(){await super.ready(),this.state.fitToBoard&&this._syncFromRoot(!1)}removed(t){this._detachRootListener(),super.removed?.(t)}dispose(){this._detachRootListener(),super.dispose?.()}onchange(t,e){"fitToBoard"in t&&(t.fitToBoard?(this._syncFromRoot(!0),this._attachRootListener()):this._detachRootListener()),super.onchange?.(t,e)}_syncFromRoot(t=!1){const e=this.rootModel;if(!e||e===this)return;const n=e.state;if(!n)return;const i={},s=Number.isFinite(n.width)?n.width:this.state.width,r=Number.isFinite(n.height)?n.height:this.state.height;s!==this.state.width&&(i.width=s),r!==this.state.height&&(i.height=r);const o=Number.isFinite(n.left)?n.left:0,a=Number.isFinite(n.top)?n.top:0;if(o!==this.state.left&&(i.left=o),a!==this.state.top&&(i.top=a),t){const t=this.state.depth;if(!("number"==typeof t&&Number.isFinite(t)&&t>0)){const e=Math.min(s,r);e!==t&&(i.depth=e)}}Object.keys(i).length>0&&this.set(i)}_attachRootListener(){if(this._onRootChange)return;const t=this.rootModel;t&&t!==this&&(this._onRootChange=t=>{("width"in t||"height"in t||"left"in t||"top"in t)&&this._syncFromRoot()},t.on?.("change",this._onRootChange))}_detachRootListener(){if(!this._onRootChange)return;const t=this.rootModel;t?.off?.("change",this._onRootChange),this._onRootChange=void 0}};function dw(t,e){return"none"===t?0:t.endsWith("arrow")?1.5*e:0}function uw(t,e,n,i){const s=[];for(let r=1;r<=i;r++){const o=r/i,a=1-o;s.push(new M.Vector3(a*a*t.x+2*a*o*e.x+o*o*n.x,a*a*t.y+2*a*o*e.y+o*o*n.y,a*a*t.z+2*a*o*e.z+o*o*n.z))}return s}hw=Pm([Mb("backdrop")],hw);class pw extends iu{getObject3dInstance(){return new M.Group}get gizmoTransformable(){return!0}get syncZPosOffset(){return 0}get geometricOffsetY(){return 0}syncFromObject3D(){}applyDimensionFromGizmo(t){}build(){super.build(),this._buildLine()}get smoothedPath(){const t=this.worldPath;if(t.length<2)return t;const{round:e=0}=this.component.state;if(e<=0||t.length<3)return t;const n=[];n.push(t[0]);for(let i=1;i<t.length;i++){const s=t[i-1],r=t[i],o=t[i+1];if(!o){n.push(r);break}const a=s.x-r.x,c=s.y-r.y,l=s.z-r.z,h=Math.sqrt(a*a+c*c+l*l),d=Math.min(e,h/2),u=o.x-r.x,p=o.y-r.y,f=o.z-r.z,m=Math.sqrt(u*u+p*p+f*f),g=Math.min(e,m/2),y=h>0?new M.Vector3(r.x+a/h*d,r.y+c/h*d,r.z+l/h*d):r.clone(),b=m>0?new M.Vector3(r.x+u/m*g,r.y+p/m*g,r.z+f/m*g):r.clone();n.push(y),n.push(...uw(y,r,b,8))}return n}_buildLine(){const t=this.smoothedPath;if(t.length<2)return;const{strokeStyle:e,lineWidth:n=2,alpha:i=1,lineDash:s,begin:r="none",beginSize:o="size5",end:a="none",endSize:c="size5"}=this.component.state,l=Math.max(n,1),p="string"==typeof e&&"transparent"!==e?Ld(e):"#000000",f=new M.Color(p),m=this._getResolution(),g=r,y=a,b=dw(g,l),_=dw(y,l),v=t[0],x=t[t.length-1],w=(new M.Vector3).subVectors(t[1],v).normalize(),S=(new M.Vector3).subVectors(t[t.length-2],x).normalize(),A=[...t];b>0&&(A[0]=v.clone().add(w.clone().multiplyScalar(b))),_>0&&(A[A.length-1]=x.clone().add(S.clone().multiplyScalar(_)));const E=new u.LineGeometry;E.setPositions(A.flatMap(t=>[t.x,t.y,t.z]));const k=function(t,e){switch(t){case"round-dot":return{dashSize:e,gapSize:e};case"square-dot":return{dashSize:2*e,gapSize:e};case"dash":return{dashSize:4*e,gapSize:1.5*e};case"dash-dot":return{dashSize:4*e,gapSize:2*e};case"long-dash":return{dashSize:6*e,gapSize:3*e};case"long-dash-dot":return{dashSize:6*e,gapSize:2*e};case"long-dash-dot-dot":return{dashSize:6*e,gapSize:e};default:return null}}(s,l),C=new d.LineMaterial({color:f.getHex(),linewidth:l,worldUnits:!0,transparent:i<1,opacity:i,resolution:m,dashed:!!k,dashSize:k?.dashSize??1,gapSize:k?.gapSize??1,dashScale:1});if(this._line2=new h.Line2(E,C),this._line2.computeLineDistances(),this.object3d.add(this._line2),"none"!==g){const t=Ep(g,Ap(o,l));if(t){const e=(new M.Quaternion).setFromUnitVectors(new M.Vector3(1,0,0),w.clone().negate());this._placeTip(t,v,e,f,i,m)}}if("none"!==y){const t=Ep(y,Ap(c,l));if(t){const e=(new M.Quaternion).setFromUnitVectors(new M.Vector3(1,0,0),S.clone().negate());this._placeTip(t,x,e,f,i,m)}}}_placeTip(t,e,n,i,s,r){const o=t.mesh||t.line2||t.group;if(o){if(o.position.copy(e),o.setRotationFromQuaternion(n),t.mesh){const e=t.mesh.material;e.color.copy(i),e.transparent=s<1,e.opacity=s}else if(t.line2){const e=t.line2.material;e.color.copy(i),e.transparent=s<1,e.opacity=s,e.resolution.copy(r)}else t.group&&t.group.traverse(t=>{if(t.material){const e=t.material;e.color&&e.color.copy(i),e.transparent=s<1,e.opacity=s,e.resolution&&e.resolution.copy(r)}});this.object3d.add(o)}}_getResolution(){const t=this.threeContainer?.renderer3d;if(t){return t.getSize(new M.Vector2)}return new M.Vector2(window.innerWidth,window.innerHeight)}onGizmoDragEnd(t){const e=this._component,n=e.path;if(!n||n.length<2)return;const i=this.object3d,{width:s=0,height:r=0}=e.parent?.bounds??{},{x:o,y:a}=e.center,c=i.position,l=i.rotation,h=i.scale,d=this.position;if(Math.abs(c.x-d.x)<.001&&Math.abs(c.y-d.y)<.001&&Math.abs(c.z-d.z)<.001&&Math.abs(l.x)<.001&&Math.abs(l.y)<.001&&Math.abs(l.z)<.001&&Math.abs(h.x-1)<.001&&Math.abs(h.y-1)<.001&&Math.abs(h.z-1)<.001)return;const u=pw.computeBakedPath(n,{x:o,y:a},{width:s,height:r},i);this._suppressOnchange=!0,e.set({rotation:0,rotationX:0,rotationY:0,zPos:0}),e.mutatePath(null,()=>u),this._suppressOnchange=!1,this.update()}static computeBakedPath(t,e,n,i){const s=n.width,r=n.height,o=e.x,a=e.y;return i.updateMatrixWorld(!0),t.map(t=>{const e=new M.Vector3(t.x-o,t.z||0,t.y-a).applyMatrix4(i.matrixWorld),n={x:e.x+s/2,y:e.z+r/2};return Math.abs(e.y)>.001&&(n.z=e.y),n})}updateStrokeStyle(){this.updateDimension()}updateAlpha(){this.updateDimension()}updateDimension(){this.clear(),this.build()}onchange(t,e){("path"in t||"from"in t||"to"in t)&&(this.updateDimension(),this.updatePosition()),("round"in t||"lineDash"in t||"lineWidth"in t||"begin"in t||"end"in t||"beginSize"in t||"endSize"in t)&&this.updateDimension(),super.onchange(t,e)}clear(){for(;this.object3d.children.length>0;){const t=this.object3d.children[0];this.object3d.remove(t),Vd(t)}return this._line2=void 0,super.clear()}}class fw extends pw{get worldPath(){const t=this.component.path;if(!t||t.length<2)return[];const{x:e,y:n}=this.component.center,i=this.component,s=i.fromEnd?.component?._realObject?.object3d?.position?.y??0,r=i.toEnd?.component?._realObject?.object3d?.position?.y??0;return t.map((i,o)=>{const a=t.length>1?o/(t.length-1):0;return new M.Vector3(i.x-e,i.z||s+(r-s)*a,i.y-n)})}}zp("line",t=>new fw(t));class mw extends pw{get worldPath(){const t=this.component.path;if(!t||t.length<2)return[];const{x:e,y:n}=this.component.center;return t.map(t=>new M.Vector3(t.x-e,t.z||0,t.y-n))}}zp("polyline",t=>new mw(t));class gw extends pw{get worldPath(){const t=this.component.drawPath;if(!t||t.length<2)return[];const{x:e,y:n}=this.component.center,i=this.component,s=i.fromEnd?.component?._realObject?.object3d?.position?.y??0,r=i.toEnd?.component?._realObject?.object3d?.position?.y??0;return t.map((i,o)=>{const a=t.length>1?o/(t.length-1):0;return new M.Vector3(i.x-e,i.z||s+(r-s)*a,i.y-n)})}}zp("ortholine",t=>new gw(t)),zp("group",t=>new nw(t));class yw{constructor(t){this._count=0,this._placements=[],this._geometry=t.geometry,this._material=t.material,this._capacity=Math.max(1,t.capacity??16),this._name=t.name??"instanced",this._castShadow=t.castShadow??!0,this._receiveShadow=t.receiveShadow??!1,this.object3d=new M.Group,this.object3d.name=this._name,this._mesh=this._makeMesh(this._capacity),this.object3d.add(this._mesh)}_makeMesh(t){const e=new M.InstancedMesh(this._geometry,this._material,t);return e.name=this._name+"__instances",e.castShadow=this._castShadow,e.receiveShadow=this._receiveShadow,e.instanceMatrix.setUsage(M.DynamicDrawUsage),e.count=0,e}get mesh(){return this._mesh}get count(){return this._count}get capacity(){return this._capacity}place(t){const e=t.length;if(e>this._capacity){const t=function(t,e=16){let n=Math.max(e,1);for(;n<t;)n*=2;return n}(e,this._capacity);this.object3d.remove(this._mesh),this._mesh.dispose(),this._capacity=t,this._mesh=this._makeMesh(t),this.object3d.add(this._mesh)}this._placements.length=e;for(let n=0;n<e;n++){const e=t[n];this._placements[n]=e,this._writeMatrix(n,e),void 0!==e.color&&this._writeColor(n,e.color)}this._count=e,this._mesh.count=e,this.commit()}update(t,e){t<0||t>=this._count||(this._placements[t]=e,this._writeMatrix(t,e),void 0!==e.color&&this._writeColor(t,e.color),this.commit())}setRotation(t,e){if(t<0||t>=this._count)return;const n=this._placements[t];n&&(n.rotation=e,this._writeMatrix(t,n))}commitMatrices(){this._mesh.instanceMatrix.needsUpdate=!0}setColor(t,e){t<0||t>=this._count||(this._writeColor(t,e),this._mesh.instanceColor&&(this._mesh.instanceColor.needsUpdate=!0))}indexOf(t){return t>=0&&t<this._count?t:-1}commit(){this._mesh.instanceMatrix.needsUpdate=!0,this._mesh.instanceColor&&(this._mesh.instanceColor.needsUpdate=!0),this._mesh.computeBoundingSphere()}dispose(){this.object3d.remove(this._mesh),this._mesh.dispose(),this._placements.length=0,this._count=0}_writeMatrix(t,e){const n=yw;n._p.set(e.position.x,e.position.y,e.position.z);const i=e.rotation;n._e.set(i?.x??0,i?.y??0,i?.z??0),n._q.setFromEuler(n._e);const s=e.scale;"number"==typeof s?n._s.set(s,s,s):n._s.set(s?.x??1,s?.y??1,s?.z??1),n._m.compose(n._p,n._q,n._s),this._mesh.setMatrixAt(t,n._m)}_writeColor(t,e){yw._c.set(e),this._mesh.setColorAt(t,yw._c)}}function bw(t,e,n){const i=Math.max(1,Math.floor(t.x??1)),s=Math.max(1,Math.floor(t.y??1)),r=Math.max(1,Math.floor(t.z??1)),o=e.x??0,a=e.y??0,c=e.z??0,l=n?.x??0,h=n?.y??0,d=n?.z??0,u=[];for(let t=0;t<s;t++)for(let e=0;e<r;e++)for(let n=0;n<i;n++)u.push({position:{x:l+n*o,y:h+t*a,z:d+e*c}});return u}yw._m=new M.Matrix4,yw._p=new M.Vector3,yw._q=new M.Quaternion,yw._e=new M.Euler,yw._s=new M.Vector3,yw._c=new M.Color;class _w extends iu{build(){super.build()}update(){}}const vw={far:1e5,fov:80,near:1,zoom:1};class xw extends iu{build(){super.build()}update(){super.update(),this.updateCamera()}getObject3dInstance(){return new M.PerspectiveCamera}updateCamera(){const{near:t=vw.near,far:e=vw.far,fov:n=vw.fov,zoom:i=vw.zoom}=this.component.state;this.object3d.far=e,this.object3d.fov=n,this.object3d.near=t,this.object3d.zoom=i}}class ww extends Jv{buildGeometry(){const{width:t,height:e}=this.component.state.dimension;this.object3d.geometry=new M.PlaneGeometry(t,e)}buildMaterial(){this.object3d.material=new M.MeshStandardMaterial({opacity:0,side:M.DoubleSide,blending:M.NoBlending})}}class Mw extends iu{getObject3dInstance(){return new M.Scene}dispose(){for(const t of this.object3d.children)Vd(t);this._animationMixer&&(this._animationMixer.stopAllAction(),this._animationMixer.uncacheRoot(this.object3d),this._animationMixer=void 0),super.dispose()}clear(){return this._floor&&(this.object3d.remove(this._floor),this._floor.material instanceof Array?this._floor.material.forEach(t=>t.dispose()):this._floor.material.dispose(),this._floor.geometry.dispose(),delete this._floor),super.clear()}get floor(){return this._floor}set floor(t){this._floor&&(this.object3d.remove(this._floor),this._floor.clear(),delete this._floor),t&&(this._floor=t,this.object3d.add(t)),this.component.invalidate()}build(){super.build(),this.floor=Qp(this.component)}updateTransform(){}updateDimension(){}updatePosition(){}updateRotate(){}updateScale(){}updateAlpha(){}updateHidden(){}get animationMixer(){return this._animationMixer||(this._animationMixer=new M.AnimationMixer(this.object3d)),this._animationMixer}}const Sw=new Set(["cx","cy","cz","zPos","left","top","width","height","depth","lineWidth","rotationX","rotationY","rotation","scale","hidden","alpha","material3d","screenFixed"]);class Aw extends iu{get syncZPosOffset(){return this.effectiveDepth}get geometricOffsetY(){return this.effectiveDepth}constructor(t){super(t),this._origInvalidate=t.invalidate.bind(t),t.invalidate=()=>{this._origInvalidate(),this._refreshTextureNow()}}getObject3dInstance(){return new M.Mesh}build(){super.build();const{width:t,height:e}=this.component.bounds;if(!t||!e)return;const n=ud(this.component.state.material3d),i=new M.PlaneGeometry(1,1);i.rotateX(-Math.PI/2),this.object3d.geometry=i;const s=Vv(this.component),r=new M.MeshStandardMaterial({map:s});md(r,n),r.transparent=!0,this.object3d.material=r,this.object3d.castShadow=n.castShadow,this.object3d.receiveShadow=n.receiveShadow}updateAlpha(){const{alpha:t=1,fillStyle:e}=this.component.state;jd(this.object3d.material,0,e)}get dimension(){const{width:t,height:e}=this.component.bounds;return{width:t||1,height:e||1,depth:1}}get scale(){const t=super.scale,{width:e,height:n}=this.dimension;return{x:t.x*e,y:t.y,z:t.z*n}}updateDimension(){this.updateTransform()}_debouncedRebuild(){this._debounceTimer&&clearTimeout(this._debounceTimer),this._debounceTimer=setTimeout(()=>{this._debounceTimer=void 0,this.update()},100)}_refreshTextureNow(){const t=this.object3d.material,e=t?.map;if(!e)return;const n=e.source?.data;n&&(Yv(n,this.component,2),e.needsUpdate=!0)}update(){this.clear(),this.build(),this.updateDimension(),this.updateTransform(),this.updateHidden()}onchange(t,e){super.onchange(t,e);for(const e of Object.keys(t))if(!Sw.has(e)){this._debouncedRebuild();break}}updateFillStyle(){this._debouncedRebuild()}updateStrokeStyle(){this._debouncedRebuild()}updateText(){this._debouncedRebuild()}updateMaterial3d(){super.updateMaterial3d();const t=this.object3d.material;if(!t)return;const e=ud(this.component.state.material3d);md(t,e),t.transparent=!0,this.object3d.castShadow=e.castShadow,this.object3d.receiveShadow=e.receiveShadow}clear(){return this._debounceTimer&&(clearTimeout(this._debounceTimer),this._debounceTimer=void 0),Vd(this.object3d),super.clear()}dispose(){this._debounceTimer&&(clearTimeout(this._debounceTimer),this._debounceTimer=void 0),this._origInvalidate&&(this.component.invalidate=this._origInvalidate,this._origInvalidate=void 0),super.dispose()}}const Ew={mutable:!1,resizable:!0,rotatable:!0,properties:[{type:"select",label:"precision",name:"precision",property:{options:[{display:"High",value:"highp"},{display:"Medium",value:"mediump"},{display:"Low",value:"lowp"}]}},{type:"checkbox",label:"anti-alias",name:"antialias",property:"antialias"},{type:"checkbox",label:"3dmode",name:"threed",property:"threed"},{type:"checkbox",label:"auto-rotate",name:"autoRotate",property:"autoRotate"},{type:"checkbox",label:"debug",name:"debug",property:"debug"}],help:"scene/component/three-container"};function kw(t){const e=Tw(t);if(!e)return null;const{height:n,hollow:i}=t;if(!(n>0))return null;if(!(i&&i.wall>0))return Cw(e,n,n/2);const s=Math.max(i.floor??i.wall,0),r=n-s;if(!(r>0))return null;const o=Dw(t,i.wall);if(!o)return null;const a=new M.Shape(e.getPoints(Sx[0]));a.holes=[new M.Path(o.slice().reverse())];const c=Cw(a,r,n/2);if(s<=0)return c;const l=Cw(e,s,-n/2+s);return x.mergeGeometries([l,c],!1)??c}function Cw(t,e,n){const i=new M.ExtrudeGeometry(t,{steps:1,depth:e,bevelEnabled:!1});return i.rotateX(Math.PI/2),i.translate(0,n,0),i}function Tw(t){if(t.polygon){const e=t.path;if(!e||e.length<3)return null;const n=new M.Shape;n.moveTo(e[0].x,e[0].y);for(let t=1;t<e.length;t++)n.lineTo(e[t].x,e[t].y);return n.closePath(),n}return Ow(t.width,t.depth,t.round??0)}function Pw(t,e,n,i){if(!(t>0&&e>0))return null;const s=Math.min(Math.max(n,0),t/2),r=Math.min(Math.max(i,0),e/2),o=-t/2,a=-e/2;if(s<=0&&r<=0){const n=new M.Shape;return n.moveTo(o,a),n.lineTo(o+t,a),n.lineTo(o+t,a+e),n.lineTo(o,a+e),n.closePath(),n}const c=new M.Path;return c.moveTo(o+s,a),c.lineTo(o+t-s,a),c.quadraticCurveTo(o+t,a,o+t,a+r),c.lineTo(o+t,a+e-r),c.quadraticCurveTo(o+t,a+e,o+t-s,a+e),c.lineTo(o+s,a+e),c.quadraticCurveTo(o,a+e,o,a+e-r),c.lineTo(o,a+r),c.quadraticCurveTo(o,a,o+s,a),new M.Shape(c.getPoints(Sx[0]))}function Ow(t,e,n){if(!(t>0&&e>0))return null;const i=-t/2,s=-e/2;if(n<=0){const n=new M.Shape;return n.moveTo(i,s),n.lineTo(i+t,s),n.lineTo(i+t,s+e),n.lineTo(i,s+e),n.closePath(),n}const r=Math.min(n,t/2,e/2),o=new M.Path;return o.moveTo(i+r,s),o.lineTo(i+t-r,s),o.quadraticCurveTo(i+t,s,i+t,s+r),o.lineTo(i+t,s+e-r),o.quadraticCurveTo(i+t,s+e,i+t-r,s+e),o.lineTo(i+r,s+e),o.quadraticCurveTo(i,s+e,i,s+e-r),o.lineTo(i,s+r),o.quadraticCurveTo(i,s,i+r,s),new M.Shape(o.getPoints(Sx[0]))}function Dw(t,e){if(!t.polygon){const n=Math.max((t.round??0)-e,0),i=Ow(t.width-2*e,t.depth-2*e,n);return i?i.getPoints(Sx[0]):null}const n=t.path;if(!n||n.length<3)return null;const i=n.map(t=>new M.Vector2(t.x,t.y));let s=0;for(let t=0;t<i.length;t++){const e=i[t],n=i[(t+1)%i.length];s+=e.x*n.y-n.x*e.y}const r=s>=0?1:-1,o=i.map((t,n)=>{const s=i[(n+1)%i.length],o=s.x-t.x,a=s.y-t.y,c=Math.hypot(o,a)||1;return{x:t.x+-a/c*e*r,y:t.y+o/c*e*r,dx:o,dy:a}}),a=[];for(let t=0;t<o.length;t++){const e=o[(t+o.length-1)%o.length],n=o[t],i=e.dx*n.dy-e.dy*n.dx;if(Math.abs(i)<1e-9){a.push(new M.Vector2(n.x,n.y));continue}const s=((n.x-e.x)*n.dy-(n.y-e.y)*n.dx)/i;a.push(new M.Vector2(e.x+e.dx*s,e.y+e.dy*s))}return a}function zw(t){const e=Tw(t);if(!e)return null;const n=[e.getPoints(Sx[0])],i=t.hollow?.wall??0;if(i>0){const e=Dw(t,i);e&&n.push(e.slice().reverse())}return n}t.ThreeContainer=class extends Wg{constructor(){super(...arguments),this._capability=new Sf}get sceneManager(){return this._capability.sceneManager}get cameraManager(){return this._capability.cameraManager}get rendererManager(){return this._capability.rendererManager}get lightManager(){return this._capability.lightManager}get controlsManager(){return this._capability.controlsManager}get eventManager(){return this._capability.eventManager}get hasEnvironment(){return this._capability.hasEnvironment}containable(t){return!0}is3dContainer(){return!0}getLightingConfig(){return{hemisphere:{skyColor:16777215,groundColor:14540253,intensity:1},directional:{color:16777215,intensity:1.2,attachToCamera:!0,castShadow:!1}}}getCss3DSceneAttribute(){return"three-container:css3d-renderer"}init_scene3d(){this._capability.isInitialized&&this._capability.destroy(),this._capability.init(this,{lightingConfig:this.getLightingConfig(),css3DSceneAttribute:this.getCss3DSceneAttribute(),skipEnvironment:!0,skipPostprocessing:!0,skipShadowMap:!0}),this._capability.buildOverlays(),this._capability.resize(),this.onchangeData&&this.onchangeData(this.data,this.data)}destroy_scene3d(){this.stop(),this._capability.destroy()}stop(){}resize(){this._capability.resize()}get scene3d(){return this._capability.isInitialized||this.init_scene3d(),this._capability.scene3d}get renderer3d(){return this._capability.renderer3d}get mixer(){return this._capability.mixer}get css3DScene(){return this._capability.css3DScene}get css3DRenderer(){return this._capability.css3DRenderer}render_threed(){this._capability.renderThreeD()}get _parentIs3dMode(){return!!this.rootModel?.is3dMode}render(t){this._parentIs3dMode||(this.app.isViewMode&&this.setState("threed",!0),!this.state.threed||this._capability.noSupportWebgl?super.render(t):this._capability.camera&&this._capability.renderCSS3D())}postrender(t){if(this._parentIs3dMode)return;const{left:e,top:n,debug:i,threed:s}=this.state;let{width:r,height:o}=this.bounds;if(r=Math.floor(r),o=Math.floor(o),s){if(this._capability.isInitialized||this.init_scene3d(),this._capability.noSupportWebgl)return void this._capability.showWebglNoSupportText(t,this.state.width,this.state.height);if(!this._capability.renderer3d)return;this._capability.renderThreeD();const s=this._capability.domElement;if(!s||!s.width||!s.height)return;t.drawImage(s,0,0,s.width,s.height,e,n,r,o),i&&this._capability.showDebugFPS(t)}else super.postrender(t)}dispose(){this._capability.dispose(),super.dispose()}get layout(){return _c.get("three")}get nature(){return Ew}getObjectByRaycast(){return this._capability.getObjectByRaycast()}getObjectsByRaycast(){return this._capability.getObjectsByRaycast()}onchange(t,e){(t.hasOwnProperty("width")||t.hasOwnProperty("height"))&&this._capability.destroy(),this._capability.onchange(t)}onmousedown(t){this._capability.onMouseDown(t)}onmouseup(t){this._capability.onMouseUp(t)}onmousemove(t){this._capability.onMouseMove(t)}onmouseleave(t){this._capability.onMouseLeave(t)}onwheel(t){this._capability.onWheel(t)&&this.invalidate()}ondblclick(t){this._capability.onDblClick(t)&&this.invalidate()}ondragstart(t){this._capability.onDragStart(t)}ondragmove(t){this._capability.onDragMove(t)&&this.invalidate()}ondragend(t){this._capability.onDragEnd(t)&&this.invalidate()}ontouchstart(t){this._capability.onTouchStart(t)}onpan(t){this._capability.onPan(t)&&this.invalidate()}ontouchend(t){this._capability.onTouchEnd(t)}onkeydown(t){this._capability.onKeyDown(t)}onpinch(t){this._capability.onPinch(t)&&this.invalidate()}ondoubletap(){this._capability.onDoubleTap(),this.invalidate()}},t.ThreeContainer=Pm([Mb("3d-container")],t.ThreeContainer),Ip(t=>new qv(t));const Iw=["Capacity","Holdable","Transferable","FlowNode"],Rw=Object.freeze({Transferable:["Capacity","FlowNode"]}),jw=["floor","ceiling","center"],Lw=["revolute","prismatic","continuous"],Fw=["slot","port-in","port-out"];class Nw extends Error{code;path;constructor(t,e,n){super(`${t}: ${e}: ${n}`),this.name="V3ContractError",this.code=t,this.path=e}}const Bw=(t,e,n)=>{throw new Nw(t,e,n)},Hw={mm:[[1,0,0],1],cm:[[1,0,0],10],m:[[1,0,0],1e3],rad:[[0,1,0],1],deg:[[0,1,0],Math.PI/180],s:[[0,0,1],1],ratio:[[0,0,0],1],percent:[[0,0,0],.01]},$w=[1,0,0],Gw=[0,0,0],Vw=[0,1,0],Uw={kind:"count"},Yw={kind:"flag"};Hw.count=[Uw,1];const Ww=(t,e)=>Array.isArray(t)&&Array.isArray(e)?t.length===e.length&&t.every((t,n)=>t===e[n]):JSON.stringify(t)===JSON.stringify(e);function qw(t,e,n,i){t&&"object"==typeof t&&!Array.isArray(t)||Bw("SCHEMA",i,"object required");for(const n of e)Object.hasOwn(t,n)||Bw("SCHEMA",i,`missing ${n}`);for(const s of Object.keys(t))[...e,...n].includes(s)||Bw("SCHEMA",i,`unknown ${s}`)}function Xw(t,e){return"string"==typeof t&&/^[a-zA-Z][a-zA-Z0-9_.-]*$/.test(t)||Bw("ID",e,"invalid id"),t}function Kw(t,e){return"number"==typeof t&&Number.isFinite(t)||Bw("NON_FINITE",e,String(t)),t}function Qw(t,e){return Object.hasOwn(Hw,t)||Bw("UNIT",e,String(t)),Hw[t]}function Zw(t,e,n){(t.length!==e.length||t.some((t,n)=>!Ww(t,e[n])))&&Bw("TYPE",n,`expected ${JSON.stringify(e)}, got ${JSON.stringify(t)}`)}const Jw={"add@1":{ports:["value"],types:(t,e)=>(2===t.length&&t.every(Array.isArray)&&Ww(t[0],t[1])||Bw("TYPE",e,"addition needs same scalar dimensions"),[t[0]]),run:([t,e])=>[t+e]},"mul@1":{ports:["value"],types:(t,e)=>(2===t.length&&t.every(Array.isArray)||Bw("TYPE",e,"two scalar arguments"),[t[0].map((e,n)=>e+t[1][n])]),run:([t,e])=>[t*e]},"div@1":{ports:["value"],types:(t,e)=>(2===t.length&&t.every(Array.isArray)||Bw("TYPE",e,"two scalar arguments"),[t[0].map((e,n)=>e-t[1][n])]),run:([t,e],n)=>(0===e&&Bw("DOMAIN",n,"zero denominator"),[t/e])},"sin@1":{ports:["value"],types:(t,e)=>(Zw(t,[Vw],e),[Gw]),run:([t])=>[Math.sin(t)]},"geomean@1":{ports:["value"],types:(t,e)=>((t.length<2||t.length>3||!t.every(Array.isArray)||!t.every(e=>Ww(e,t[0])))&&Bw("TYPE",e,"geometric mean needs two or three scalars of the same dimension"),[t[0]]),run:(t,e)=>(t.some(t=>t<0)&&Bw("DOMAIN",e,"geometric mean of a negative value"),[Math.pow(t.reduce((t,e)=>t*e,1),1/t.length)])},"curve@1":{ports:["value"],types(t,e){(t.length<5||t.length%2==0||!t.every(Array.isArray))&&Bw("TYPE",e,"x and at least two (at, value) key pairs, all scalars");for(let n=1;n<t.length;n+=2)Ww(t[n],t[0])||Bw("TYPE",e,`key ${(n-1)/2}: at must have the dimension of x`),Ww(t[n+1],t[2])||Bw("TYPE",e,`key ${(n-1)/2}: every value must have one dimension`);return[t[2]]},run:(t,e)=>{const n=t[0],i=(t.length-1)/2,s=e=>t[1+2*e],r=e=>t[2+2*e];for(let t=1;t<i;t++)s(t)>s(t-1)||Bw("DOMAIN",e,`keys out of order: at[${t}] = ${s(t)} is not after at[${t-1}] = ${s(t-1)}`);if(n<=s(0))return[r(0)];if(n>=s(i-1))return[r(i-1)];let o=0;for(;o<i-2&&s(o+1)<=n;)o++;const a=(n-s(o))/(s(o+1)-s(o));return[r(o)+(r(o+1)-r(o))*a]}},"at-least@1":{ports:["value"],types:(t,e)=>(2===t.length&&t.every(Array.isArray)&&Ww(t[0],t[1])||Bw("TYPE",e,"at-least compares two scalars of the same dimension"),[Yw]),run:([t,e])=>[t>=e]},"max@1":{ports:["value"],types:(t,e)=>((t.length<2||!t.every(Array.isArray)||!t.every(e=>Ww(e,t[0])))&&Bw("TYPE",e,"two or more scalars of the same dimension"),[t[0]]),run:t=>[Math.max(...t)]},"min@1":{ports:["value"],types:(t,e)=>((t.length<2||!t.every(Array.isArray)||!t.every(e=>Ww(e,t[0])))&&Bw("TYPE",e,"two or more scalars of the same dimension"),[t[0]]),run:t=>[Math.min(...t)]},"between@1":{ports:["length","center"],types:(t,e)=>(Zw(t,[$w,$w,$w,$w],e),[$w,$w]),run:([t,e,n,i],s)=>{(n<0||i<0)&&Bw("DOMAIN",s,"negative margin");const r=e-t-n-i;return r>0||Bw("NO_SPACE",s,`available=${e-t}; margins=${n+i}; deficit=${Math.max(0,-r)}; positive length required`),[r,(t+e+n-i)/2]}},"box@1":{ports:["xMin","xMax","yMin","yMax","zMin","zMax"],types:(t,e)=>(Zw(t,[$w,$w,$w],e),Array(6).fill($w)),run:([t,e,n],i)=>([t,e,n].some(t=>!(t>0))&&Bw("GEOMETRY_DOMAIN",i,"positive width,height,depth required"),[-t/2,t/2,-e/2,e/2,-n/2,n/2]),geometry:([t,e,n])=>({provider:"box@1",dimensions:{width:t,height:e,depth:n}})},"cylinder@1":{ports:["start","end","radialMin","radialMax"],types:(t,e)=>(Zw(t,[$w,$w],e),Array(4).fill($w)),run:([t,e],n)=>(t>0&&e>0||Bw("GEOMETRY_DOMAIN",n,"positive radius,length required"),[-e/2,e/2,-t,t]),geometry:([t,e])=>({provider:"cylinder@1",axis:"Y",dimensions:{radius:t,length:e}})}},tM=(t,e)=>({kind:"transform",from:t,to:e}),eM=()=>[[1,0,0],[0,1,0],[0,0,1]],nM=t=>t[0].map((e,n)=>t.map(t=>t[n])),iM=(t,e)=>t.reduce((t,n,i)=>t+n*e[i],0),sM=(t,e)=>t.map(t=>iM(t,e)),rM=(t,e)=>t.map(t=>nM(e).map(e=>iM(t,e))),oM=(t,e)=>t.map((t,n)=>t+e[n]),aM=(t,e)=>({r:rM(t.r,e.r),t:oM(sM(t.r,e.t),t.t)}),cM=t=>{const e=nM(t.r);return{r:e,t:sM(e,t.t.map(t=>-t))}};function lM(t,e){qw(t.params,e,[],t.id);for(const n of e)Xw(t.params[n],t.id)}function hM(t,e,n){(t.length!==n||t.some(t=>"transform"!==t.kind))&&Bw("TYPE",e,"rigid transforms required")}Object.assign(Jw,{"rounded-box@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,Array(4).fill($w),e),[{kind:"shape",provider:"roundedBox",frame:n.params.frame}]),run:([t,e,n,i],s)=>(t>0&&e>0&&n>0&&i>=0&&i<=Math.min(t,n)/2||Bw("GEOMETRY_DOMAIN",s,"positive dimensions and valid XZ corner radius required"),[{provider:"roundedBox",dimensions:{width:t,height:e,depth:n,round:i}}])},"fit-pitch@1":{ports:["layout"],types:(t,e)=>(Zw(t,[$w,$w,$w,$w,$w,Gw,Uw],e),[{kind:"layout"}]),run:([t,e,n,i,s,r,o],a)=>{t>=0&&e>=0&&n>=0&&i>0&&s>0&&r>=0&&r<=1&&Number.isSafeInteger(o)&&o>=0&&o<=1e4||Bw("LAYOUT_DOMAIN",a,"invalid length, margins, extent, pitch, alignment or limit");const c=t-e-n,l=c<i?0:1+Math.floor((c-i)/s);l>o&&Bw("RESOURCE_LIMIT",a,`count=${l}, limit=${o}`);const h=l?c-i-(l-1)*s:0;return[{centers:Array.from({length:l},(t,n)=>e+i/2+r*h+n*s),count:l}]}},"fixed-count@1":{ports:["layout"],types:(t,e)=>(Zw(t,[Uw,$w,$w,$w,$w,Gw,Uw],e),[{kind:"layout"}]),run:([t,e,n,i,s,r,o],a)=>{if(Number.isSafeInteger(t)&&t>=0&&Number.isSafeInteger(o)&&o>=0&&o<=1e4&&e>=0&&n>=0&&i>=0&&s>0&&r>=0&&r<=1||Bw("LAYOUT_DOMAIN",a,"invalid fixed count layout"),t>o&&Bw("RESOURCE_LIMIT",a,"fixed count exceeds limit"),!t)return[{centers:[],count:0}];const c=e-n-i-s;return(c<0||t>1&&c/(t-1)<s)&&Bw("NO_SPACE",a,"fixed count non-overlapping items do not fit"),[{centers:1===t?[n+s/2+r*c]:Array.from({length:t},(e,i)=>n+s/2+i*c/(t-1)),count:t}]}},"assembly@1":{ports:["assembly"],types:(t,e)=>(t.length&&!t.some(e=>"placed"!==e.kind||e.frame!==t[0].frame)||Bw("FRAME_TYPE",e,"assembly members need one common frame"),[{kind:"assembly",frame:t[0].frame}]),run:(t,e,n)=>[{members:t.map((t,e)=>({key:n.args[e],...t}))}]},"repeat@1":{ports:["collection"],params:["axis"],types:(t,e,n)=>(["x","y","z"].includes(n.params.axis)||Bw("AXIS",e,n.params.axis),3===t.length&&"layout"===t[0].kind&&"assembly"===t[1].kind&&"transform"===t[2].kind&&t[2].from===t[1].frame||Bw("FRAME_TYPE",e,"layout, assembly and compatible placement required"),[{kind:"collection",frame:t[2].to}]),run:([t,e,n],i,s)=>{t.count*e.members.length>1e4&&Bw("RESOURCE_LIMIT",i,"expanded geometry count > 10000");const r=["x","y","z"].indexOf(s.params.axis),o=[];for(let i=0;i<t.count;i++)for(const a of e.members){const e=[0,0,0];e[r]=t.centers[i],o.push({id:JSON.stringify([s.id,i,a.key]),key:a.key,index:i,shape:a.shape,pose:aM(aM(n,{r:eM(),t:e}),a.pose)})}return[{items:o}]},geometry:(t,e)=>e[0].items},"select-item@1":{ports:["placed"],params:["member"],types:(t,e)=>(2===t.length&&"collection"===t[0].kind&&Ww(t[1],Uw)||Bw("TYPE",e,"collection and count index required"),[{kind:"placed",frame:t[0].frame}]),run:([t,e],n,i)=>{const s=t.items.find(t=>t.index===e&&t.key===i.params.member);return s||Bw("TARGET_ABSENT",n,`${i.params.member}[${e}]`),[{shape:s.shape,pose:s.pose}]}},"portal-profile@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,Array(8).fill($w),e),[{kind:"shape",provider:"portal",frame:n.params.frame}]),run:([t,e,n,i,s,r,o,a],c)=>{t<s&&s<r&&r<e&&n<o&&o<i&&a>0||Bw("GEOMETRY_DOMAIN",c,"ordered outer/opening boundaries and positive depth required");return[{provider:"portal",dimensions:{left:t,right:e,bottom:n,top:i,openingLeft:s,openingRight:r,openingTop:o,depth:a},profile:[[t,n],[s,n],[s,o],[r,o],[r,n],[e,n],[e,i],[t,i]].map(([t,e],n)=>({id:["outerLeftBottom","innerLeftBottom","innerLeftTop","innerRightTop","innerRightBottom","outerRightBottom","outerRightTop","outerLeftTop"][n],x:t,y:e}))}]}},"rigid@1":{ports:["pose"],params:["from","to"],types:(t,e,n)=>(Zw(t,[$w,$w,$w,Vw,Vw,Vw],e),[tM(n.params.from,n.params.to)]),run:([t,e,n,i,s,r])=>{const o=Math.cos(i),a=Math.sin(i),c=Math.cos(s),l=Math.sin(s),h=Math.cos(r),d=Math.sin(r);return[{r:rM(rM([[1,0,0],[0,o,-a],[0,a,o]],[[c,0,l],[0,1,0],[-l,0,c]]),[[h,-d,0],[d,h,0],[0,0,1]]),t:[t,e,n]}]}},"axis-turn@1":{ports:["pose"],params:["from","to"],types:(t,e,n)=>(Zw(t,[Gw,Gw,Gw,Vw],e),[tM(n.params.from,n.params.to)]),run:([t,e,n,i],s)=>{const r=Math.hypot(t,e,n);Math.abs(r-1)>1e-6&&Bw("AXIS",s,"unit axis required");const o=t/r,a=e/r,c=n/r,l=Math.cos(i),h=Math.sin(i),d=1-l;return[{r:[[l+o*o*d,o*a*d-c*h,o*c*d+a*h],[a*o*d+c*h,l+a*a*d,a*c*d-o*h],[c*o*d-a*h,c*a*d+o*h,l+c*c*d]],t:[0,0,0]}]}},"axis-slide@1":{ports:["pose"],params:["from","to"],types:(t,e,n)=>(Zw(t,[Gw,Gw,Gw,$w],e),[tM(n.params.from,n.params.to)]),run:([t,e,n,i],s)=>{const r=Math.hypot(t,e,n);return Math.abs(r-1)>1e-6&&Bw("AXIS",s,"unit axis required"),[{r:[[1,0,0],[0,1,0],[0,0,1]],t:[t/r*i,e/r*i,n/r*i]}]}},"compose@1":{ports:["pose"],types:(t,e)=>(hM(t,e,2),t[1].to!==t[0].from&&Bw("FRAME_TYPE",e,"composition intermediate frame mismatch"),[tM(t[1].from,t[0].to)]),run:([t,e])=>[aM(t,e)]},"attach@1":{ports:["pose"],types(t,e){hM(t,e,3);const[n,i,s]=t;return n.from===i.to&&i.from===s.from||Bw("FRAME_TYPE",e,"A O inverse(B) frame mismatch"),[tM(s.to,n.to)]},run:([t,e,n])=>[aM(aM(t,e),cM(n))]},"point@1":{ports:["point"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w,$w],e),[{kind:"point",frame:n.params.frame}]),run:t=>[t]},"map-point@1":{ports:["point"],types:(t,e)=>(2===t.length&&"transform"===t[0].kind&&"point"===t[1].kind&&t[0].from===t[1].frame||Bw("FRAME_TYPE",e,"point frame must match transform source"),[{kind:"point",frame:t[0].to}]),run:([t,e])=>[oM(sM(t.r,e),t.t)]},"distance@1":{ports:["length"],types:(t,e)=>(2===t.length&&"point"===t[0].kind&&Ww(t[0],t[1])||Bw("FRAME_TYPE",e,"distance requires points in same frame"),[$w]),run:([t,e])=>[Math.hypot(...t.map((t,n)=>t-e[n]))]},"box-shape@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w,$w],e),[{kind:"shape",provider:"box",frame:n.params.frame}]),run:([t,e,n],i)=>([t,e,n].some(t=>!(t>0))&&Bw("GEOMETRY_DOMAIN",i,"positive box dimensions"),[{provider:"box",dimensions:{width:t,height:e,depth:n}}])},"cylinder-shape@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w],e),[{kind:"shape",provider:"cylinder",frame:n.params.frame}]),run:([t,e],n)=>(t>0&&e>0||Bw("GEOMETRY_DOMAIN",n,"positive cylinder dimensions"),[{provider:"cylinder",dimensions:{radius:t,length:e}}])},"sphere-shape@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w,$w],e),[{kind:"shape",provider:"sphere",frame:n.params.frame}]),run:([t,e,n],i)=>([t,e,n].some(t=>!(t>0))&&Bw("GEOMETRY_DOMAIN",i,"positive sphere radii required"),[{provider:"sphere",dimensions:{radiusX:t,radiusY:e,radiusZ:n}}])},"frustum-shape@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w,$w],e),[{kind:"shape",provider:"frustum",frame:n.params.frame}]),run:([t,e,n],i)=>(n>0&&t>=0&&e>=0&&t+e>0||Bw("GEOMETRY_DOMAIN",i,"positive height and non-negative radii, not both zero, required"),[{provider:"frustum",dimensions:{radiusTop:t,radiusBottom:e,height:n}}])},"cylinder-shape@2":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,[$w,$w,$w],e),[{kind:"shape",provider:"ellipticCylinder",frame:n.params.frame}]),run:([t,e,n],i)=>(t>0&&e>0&&n>0||Bw("GEOMETRY_DOMAIN",i,"positive radii and length required"),[{provider:"ellipticCylinder",dimensions:{radiusX:t,radiusZ:e,length:n}}])},"rounded-box@2":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,Array(5).fill($w),e),[{kind:"shape",provider:"roundedBoxXZ",frame:n.params.frame}]),run:([t,e,n,i,s],r)=>(t>0&&e>0&&n>0&&i>=0&&s>=0&&i<=t/2&&s<=n/2||Bw("GEOMETRY_DOMAIN",r,"positive dimensions and corner semi-axes within half the section required"),[{provider:"roundedBoxXZ",dimensions:{width:t,height:e,depth:n,roundX:i,roundZ:s}}])},"hollow-box@2":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,Array(8).fill($w),e),[{kind:"shape",provider:"hollowBoxXZ",frame:n.params.frame}]),run:([t,e,n,i,s,r,o,a],c)=>(t>0&&e>0&&n>0&&i>=0&&s>=0&&i<=t/2&&s<=n/2||Bw("GEOMETRY_DOMAIN",c,"positive dimensions and corner semi-axes within half the section required"),r>0&&o>0&&r<t/2&&o<n/2&&a>=0&&a<e||Bw("GEOMETRY_DOMAIN",c,"walls thinner than half the section and a floor thinner than the height required"),[{provider:"hollowBoxXZ",dimensions:{width:t,height:e,depth:n,roundX:i,roundZ:s,wallX:r,wallZ:o,floor:a}}])},"polygon-shape@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>((t.length<7||t.length%2==0||!t.every(t=>Ww(t,$w)))&&Bw("TYPE",e,"height then at least three (x, z) length pairs required"),[{kind:"shape",provider:"polygon",frame:n.params.frame}]),run:([t,...e],n)=>{t>0||Bw("GEOMETRY_DOMAIN",n,"positive height required");const i=[];for(let t=0;t<e.length;t+=2)i.push({id:"p"+t/2,x:e[t],y:e[t+1]});const s=i.map(t=>t.x),r=i.map(t=>t.y),o=Math.max(...s)-Math.min(...s),a=Math.max(...r)-Math.min(...r);return o>0&&a>0||Bw("GEOMETRY_DOMAIN",n,"section must span both axes"),[{provider:"polygon",dimensions:{height:t,width:o,depth:a},profile:i}]}},"hollow-box@1":{ports:["shape"],params:["frame"],types:(t,e,n)=>(Zw(t,Array(7).fill($w),e),[{kind:"shape",provider:"hollowBox",frame:n.params.frame}]),run:([t,e,n,i,s,r,o],a)=>(t>0&&e>0&&n>0&&i>=0&&i<=Math.min(t,n)/2||Bw("GEOMETRY_DOMAIN",a,"positive dimensions and valid XZ corner radius required"),s>0&&r>0&&s<t/2&&r<n/2&&o>=0&&o<e||Bw("GEOMETRY_DOMAIN",a,"walls thinner than half the section and a floor thinner than the height required"),[{provider:"hollowBox",dimensions:{width:t,height:e,depth:n,round:i,wallX:s,wallZ:r,floor:o}}])},"feature@1":{ports:["pose"],params:["frame","name"],types(t,e,n){1===t.length&&"shape"===t[0].kind||Bw("TYPE",e,"shape required");return("portal"===t[0].provider?["top","bottomLeft","bottomRight","openingTop","frontTop"]:["box","roundedBox","roundedBoxXZ","sphere","hollowBox","hollowBoxXZ"].includes(t[0].provider)?["left","right","bottom","top","back","front"]:"polygon"===t[0].provider?["bottom","top"]:"frustum"===t[0].provider||"ellipticCylinder"===t[0].provider?["start","end"]:["start","end","radialBottom"]).includes(n.params.name)||Bw("UNKNOWN_FEATURE",e,n.params.name),[tM(n.params.frame,t[0].frame)]},run:([t],e,n)=>{const i=t.dimensions;return[{r:[[1,0,0],[0,1,0],[0,0,1]],t:("portal"===t.provider?{top:[(i.left+i.right)/2,i.top,0],bottomLeft:[(i.left+i.openingLeft)/2,i.bottom,0],bottomRight:[(i.right+i.openingRight)/2,i.bottom,0],openingTop:[(i.openingLeft+i.openingRight)/2,i.openingTop,0],frontTop:[(i.left+i.right)/2,i.top,i.depth/2]}:"sphere"===t.provider?{left:[-i.radiusX,0,0],right:[i.radiusX,0,0],bottom:[0,-i.radiusY,0],top:[0,i.radiusY,0],back:[0,0,-i.radiusZ],front:[0,0,i.radiusZ]}:"polygon"===t.provider?{bottom:[0,-i.height/2,0],top:[0,i.height/2,0]}:"frustum"===t.provider||"ellipticCylinder"===t.provider?{start:[0,-(i.height??i.length)/2,0],end:[0,(i.height??i.length)/2,0]}:["box","roundedBox","roundedBoxXZ","hollowBox","hollowBoxXZ"].includes(t.provider)?{left:[-i.width/2,0,0],right:[i.width/2,0,0],bottom:[0,-i.height/2,0],top:[0,i.height/2,0],back:[0,0,-i.depth/2],front:[0,0,i.depth/2]}:{start:[0,-i.length/2,0],end:[0,i.length/2,0],radialBottom:[0,0,-i.radius]})[n.params.name]}]}},"place@1":{ports:["placed"],types:(t,e)=>(2===t.length&&"shape"===t[0].kind&&"transform"===t[1].kind&&t[0].frame===t[1].from||Bw("FRAME_TYPE",e,"shape local frame mismatch"),[{kind:"placed",frame:t[1].to}]),run:([t,e])=>[{shape:t,pose:e}],geometry:([t,e])=>({shape:t,pose:e})}}),Jw["member@1"]={...Jw["place@1"],geometry:void 0};for(const[t,e]of Object.entries(Jw))e.state="fit-pitch@1"===t||"fixed-count@1"===t?"refuses":"follows";function dM(t,e,n){if(Array.isArray(e))return Kw(t,n);if("flag"===e.kind)return"boolean"!=typeof t&&Bw("FLAG",n,"boolean required"),t;if("count"===e.kind)return(!Number.isSafeInteger(t)||t<0)&&Bw("COUNT",n,"nonnegative safe integer required"),t;const i=t=>{"number"==typeof t?Kw(t,n):Array.isArray(t)?t.forEach(i):t&&"object"==typeof t&&Object.values(t).forEach(i)};return i(t),t}function uM(t){return function(t){qw(t,["version","inputs","constants","nodes"],[],"model"),["r3-scalar-1","r3-spatial-1"].includes(t.version)||Bw("VERSION","model",t.version);for(const e of["inputs","constants","nodes"])Array.isArray(t[e])||Bw("SCHEMA",e,"array required");const e=structuredClone(t),n=new Map,i=new Map,s=new Map,r=new Map,o=[],a=[],c=(t,e)=>{Xw(t,e),n.has(t)&&Bw("DUPLICATE_WRITER",t,`${n.get(t)} and ${e}`),n.set(t,e)};for(const t of e.inputs)qw(t,["id","unit","min","max"],["role"],"input"),c(t.id,"input"),i.set(t.id,Qw(t.unit,t.id)[0]),t.role&&!["design","state"].includes(t.role)&&Bw("SCHEMA",t.id,"unknown input role"),"state"===t.role&&s.set(t.id,new Set([t.id])),Kw(t.min,t.id)>Kw(t.max,t.id)&&Bw("RANGE",t.id,"min > max"),"count"===t.unit&&(dM(t.min,Uw,t.id),dM(t.max,Uw,t.id));for(const t of e.constants)qw(t,["id","unit","value"],[],"constant"),c(t.id,"constant"),i.set(t.id,Qw(t.unit,t.id)[0]),dM(t.value,i.get(t.id),t.id);for(const t of e.nodes){qw(t,["id","op","args","outputs"],["params"],"node"),Xw(t.id,"node"),r.has(t.id)&&Bw("DUPLICATE_NODE",t.id,"node id"),Object.hasOwn(Jw,t.op)||Bw("OPERATOR",t.id,t.op),Jw[t.op].params?lM(t,Jw[t.op].params):Object.hasOwn(t,"params")&&Bw("SCHEMA",t.id,"unexpected params"),Array.isArray(t.args)||Bw("SCHEMA",t.id,"args array required"),t.args.forEach(e=>Xw(e,t.id)),qw(t.outputs,Jw[t.op].ports,[],t.id);for(const e of Object.values(t.outputs))c(e,t.id);r.set(t.id,t)}const l=new Set;function h(t){if(l.has(t))return;a.includes(t)&&Bw("CYCLE",t,[...a,t].join(" -> ")),a.push(t);const e=r.get(t),c=Jw[e.op],d=e.args.map(t=>(n.has(t)||Bw("UNKNOWN_REFERENCE",e.id,t),i.has(t)||h(n.get(t)),i.get(t))),u=c.types(d,e.id,e),p=new Set;for(const t of e.args)for(const e of s.get(t)??[])p.add(e);p.size&&(void 0===c.state&&Bw("STATE_POLICY",e.id,`${e.op} declares no policy for a state-dependent argument (${[...p].join(", ")})`),"refuses"===c.state&&Bw("TOPOLOGY_STATE",e.id,`${e.op} must depend on design inputs only; it depends on ${[...p].join(", ")}`)),c.ports.forEach((t,n)=>i.set(e.outputs[t],u[n])),p.size&&Object.values(e.outputs).forEach(t=>s.set(t,new Set(p))),a.pop(),l.add(t),o.push(e)}for(const t of r.keys())h(t);return{outputTypes:Object.fromEntries([...i].map(([t,e])=>[t,structuredClone(e)])),dependence:Object.fromEntries([...s].map(([t,e])=>[t,[...e].sort()])),order:o.map(t=>t.id),evaluate(t){qw(t,e.inputs.map(t=>t.id),[],"input values");const n=new Map,s=[];for(const s of e.inputs){const e=Kw(t[s.id],s.id);(e<s.min||e>s.max)&&Bw("INPUT_RANGE",s.id,`${e} outside [${s.min},${s.max}]`),n.set(s.id,dM(e*Qw(s.unit,s.id)[1],i.get(s.id),s.id))}for(const t of e.constants)n.set(t.id,Kw(t.value*Qw(t.unit,t.id)[1],t.id));for(const t of o){const e=Jw[t.op],r=t.args.map(t=>n.get(t)),o=e.run(r,t.id,t);if(e.ports.forEach((e,s)=>n.set(t.outputs[e],dM(o[s],i.get(t.outputs[e]),t.id))),e.geometry){const n=e.geometry(r,o);Array.isArray(n)?s.push(...n):s.push({id:t.id,...n})}}return{values:Object.fromEntries(n),geometry:s}}}}(t)}Object.freeze(Object.fromEntries(Object.entries(Jw).map(([t,e])=>[t,e.state]))),Object.freeze(Object.keys(Jw));const pM=(t,e,n)=>{throw new Nw(t,e,n)},fM={left:[-1,0,0],right:[1,0,0],bottom:[0,-1,0],top:[0,1,0],back:[0,0,-1],front:[0,0,1],start:[0,-1,0],end:[0,1,0]};function mM(t,e,n){const{types:i,writers:s,model:r,assetFrame:o}=t;e&&"object"==typeof e&&!Array.isArray(e)||pM("SCHEMA",n,"object required");for(const t of["placement","feature"])Object.hasOwn(e,t)||pM("SCHEMA",n,`missing ${t}`);for(const t of Object.keys(e))["placement","feature"].includes(t)||pM("SCHEMA",n,`unknown ${t}`);const a=t=>("string"==typeof t&&t.trim()||pM("SCHEMA",n,"nonempty string required"),Object.hasOwn(i,t)||pM("TARGET_ABSENT",n,t),i[t]),c=a(e.placement),l=a(e.feature),h=s.get(e.placement),d=s.get(e.feature);let u,p=h;if("select-item@1"===h?.op){const t=s.get(h.args[0]),e="repeat@1"===t?.op?s.get(t.args[1]):null;"assembly@1"===e?.op&&e.args.includes(h.params.member)||pM("SURFACE_PROVENANCE",n,"selected member must belong to the referenced repeat assembly"),p=s.get(h.params.member),"member@1"!==p?.op&&pM("SURFACE_PROVENANCE",n,"selected source must be a declared template member"),r.inputs.some(t=>t.id===h.args[1]&&"state"===t.role)&&pM("TARGET_STATE",n,"binding target index must not change as animation state"),u={collection:h.args[0],index:h.args[1],member:h.params.member}}else"place@1"!==h?.op&&pM("SURFACE_PROVENANCE",n,"actual placement or selected repeated member required");"feature@1"!==d?.op&&pM("SURFACE_PROVENANCE",n,"provider feature required"),"placed"===c.kind&&c.frame===o&&"transform"===l.kind||pM("FRAME_TYPE",n,"contact must be in asset frame"),p.args[0]!==d.args[0]&&pM("SURFACE_OWNER",n,"feature belongs to a different shape declaration");const f=i[d.args[0]].provider,m=d.params.name;return("box"===f?["left","right","bottom","top","back","front"]:"roundedBox"===f||"roundedBoxXZ"===f||"hollowBox"===f||"hollowBoxXZ"===f?["bottom","top"]:"cylinder"===f?["start","end"]:[]).includes(m)||pM("SURFACE_UNSUPPORTED",n,"feature is not a supported planar surface"),{...e,geometryId:u?null:h.id,selection:u,provider:f,face:m,frame:l.from,normal:fM[m]}}const gM=(t,e,n)=>{throw new Nw(t,e,n)};function yM(t,e,n,i){t&&"object"==typeof t&&!Array.isArray(t)||gM("SCHEMA",i,"object required");for(const n of e)Object.hasOwn(t,n)||gM("SCHEMA",i,`missing ${n}`);for(const s of Object.keys(t))[...e,...n].includes(s)||gM("SCHEMA",i,`unknown ${s}`)}const bM=(t,e)=>{"string"==typeof t&&t.trim()||gM("SCHEMA",e,"nonempty string required")};function _M(t,e){return function(t,e){const n=uM(t),i=structuredClone(e),s=n.outputTypes,r=new Map(t.nodes.flatMap(t=>Object.values(t.outputs).map(e=>[e,structuredClone(t)]))),o=new Map;yM(i,["version","assetFrame","bindings"],["names"],"capabilities"),"r3-capability-3"!==i.version&&gM("VERSION","capabilities",i.version);if(bM(i.assetFrame,"assetFrame"),void 0!==i.names){Array.isArray(i.names)||gM("SCHEMA","names","array required");for(const t of i.names)Iw.includes(t)||gM("CAPABILITY_NAME","names",`${String(t)} is not one of ${Iw.join(", ")}`);new Set(i.names).size!==i.names.length&&gM("CAPABILITY_NAME","names","duplicate capability name")}Array.isArray(i.bindings)||gM("SCHEMA","bindings","array required");const a=new Set,c=(t,e)=>(bM(t,e),Object.hasOwn(s,t)||gM("TARGET_ABSENT",e,t),s[t]),l=(t,e,n)=>{const s=c(t,e);("transform"!==s.kind||s.to!==i.assetFrame||void 0!==n&&s.from!==n)&&gM("FRAME_TYPE",e,"transform must map declared local frame to assetFrame")},h=(e,n)=>mM({types:s,writers:r,model:t,assetFrame:i.assetFrame},e,n),d=new Map;for(const t of i.bindings){yM(t,["id","label","role","frame","pose","accepts","capacity"],["region","contacts"],"binding");for(const e of["id","label","frame"])bM(t[e],e);if(a.has(t.id)&&gM("DUPLICATE_BINDING",t.id,"duplicate id"),a.add(t.id),["seat","grip"].includes(t.role)||gM("ROLE",t.id,"explicit seat or grip required; slot is ambiguous"),"string"==typeof t.pose)l(t.pose,t.id,t.frame);else{const e=h(t.pose,t.id);e.frame!==t.frame&&gM("FRAME_TYPE",t.id,"binding frame must be the selected feature frame"),d.set(t.id,e)}if(Array.isArray(t.accepts)&&t.accepts.length||gM("SCHEMA",t.id,"nonempty accepts required"),t.accepts.forEach(e=>bM(e,t.id)),new Set(t.accepts).size!==t.accepts.length&&gM("SCHEMA",t.id,"duplicate accepted type"),(!Number.isSafeInteger(t.capacity)||t.capacity<1)&&gM("CAPACITY",t.id,"positive integer capacity required"),Object.hasOwn(t,"region")){yM(t.region,["kind","dimensions"],[],t.id+".region"),"centered-box"!==t.region.kind&&gM("REGION",t.id,"only centered-box is specified"),Array.isArray(t.region.dimensions)&&3===t.region.dimensions.length||gM("SCHEMA",t.id,"three dimension references required");for(const e of t.region.dimensions)"[1,0,0]"!==JSON.stringify(c(e,t.id))&&gM("TYPE",t.id,"region dimensions must be lengths")}if(void 0!==t.contacts){Array.isArray(t.contacts)||gM("SCHEMA",t.id,"contact array required");const e=new Set,n=[];for(const i of t.contacts){const s=h(i,t.id),r=JSON.stringify([i.placement,i.feature]);e.has(r)&&gM("DUPLICATE_CONTACT",t.id,r),e.add(r),n.push(s)}o.set(t.id,n)}}return{outputTypes:structuredClone(s),dependence:structuredClone(n.dependence),evaluate(t,e={}){yM(e,[],[...a],"requests");const s=n.evaluate(t),r=t=>function(t,e){const n=t[e.placement],i=t[e.feature],s=n.pose.r,r=s.map(t=>t.reduce((t,n,i)=>t+n*e.normal[i],0)),o=s.map((t,e)=>n.pose.t[e]+t.reduce((t,e,n)=>t+e*i.t[n],0));let a=e.geometryId;if(e.selection){const n=e.selection,i=t[n.collection].items.find(e=>e.index===t[n.index]&&e.key===n.member);i||pM("TARGET_ABSENT",e.placement,"selected repeated item is absent"),a=i.id}return{placement:e.placement,feature:e.feature,geometryId:a,provider:e.provider,face:e.face,pose:{r:s.map(t=>[...t]),t:o},normal:r,provenance:"verified-planar-surface"}}(s.values,t),c=i.bindings.map(t=>{let n=null;if(t.region){const e=t.region.dimensions.map(t=>s.values[t]);e.some(t=>!Number.isFinite(t)||t<=0)&&gM("REGION_DOMAIN",t.id,"positive region dimensions required"),n={kind:t.region.kind,dimensions:e}}let i={status:"unverified",reason:"NO_REQUEST"};if(Object.hasOwn(e,t.id)){const n=e[t.id];yM(n,["type","occupied"],[],t.id+".request"),bM(n.type,t.id),(!Number.isSafeInteger(n.occupied)||n.occupied<0)&&gM("OCCUPANCY",t.id,"nonnegative integer occupancy snapshot required");const s=[];t.accepts.includes(n.type)||s.push("TYPE_NOT_ACCEPTED"),n.occupied>=t.capacity&&s.push("CAPACITY_FULL"),i={status:s.length?"failed":"satisfied",reasons:s}}const a=(o.get(t.id)??[]).map(r),c=d.has(t.id)?r(d.get(t.id)):null;return{id:t.id,label:t.label,role:t.role,frame:t.frame,pose:c?c.pose:s.values[t.pose],...c?{targetGeometryId:c.geometryId}:{},region:n,contacts:a,checks:{declaration:{status:"satisfied"},eligibility:i,spatial:{status:"unverified",reason:"NO_CONTACT_OR_FIT_SOLVER"},collision:{status:"unverified",reason:"NOT_CHECKED"},safety:{status:"unverified",reason:"NOT_CHECKED"}}}});return{geometry:s.geometry,bindings:c,values:s.values}}}}(t,e)}const vM=1048576;function xM(t,e){throw new Nw(t,"document",e)}function wM(t){return(new TextEncoder).encode(t).byteLength}function MM(t){const e=new Set;!function t(n,i){if(i>64&&xM("DOCUMENT_LIMIT","nesting exceeds 64"),null===n||"string"==typeof n||"boolean"==typeof n)return;if("number"==typeof n)return void(Number.isFinite(n)||xM("JSON_VALUE","nonfinite number"));"object"!=typeof n&&xM("JSON_VALUE","only JSON values are allowed"),e.has(n)&&xM("JSON_VALUE","cycle");const s=Array.isArray(n);s||function(t){const e=Object.getPrototypeOf(t);return null===e||null===Object.getPrototypeOf(e)&&"function"==typeof e.hasOwnProperty}(n)||xM("JSON_VALUE","plain objects required"),e.add(n);const r=Object.getOwnPropertyDescriptors(n);for(const e of Reflect.ownKeys(r)){if(s&&"length"===e)continue;"string"!=typeof e&&xM("JSON_VALUE","symbols unsupported");const o=r[e];o.enumerable&&Object.hasOwn(o,"value")||xM("JSON_VALUE","hidden properties and accessors unsupported"),!s||/^(0|[1-9][0-9]*)$/.test(e)&&Number(e)<n.length||xM("JSON_VALUE","extra array property"),t(o.value,i+1)}s&&Object.keys(n).length!==n.length&&xM("JSON_VALUE","sparse array"),e.delete(n)}(t,0)}function SM(t){if(MM(t),!t||Array.isArray(t)||"object"!=typeof t||3!==Object.keys(t).length||!["version","model","capabilities"].every(e=>Object.hasOwn(t,e)))throw new Nw("SCHEMA","document","expected version, model, capabilities only");if("figure-v3-prototype-1"!==t.version)throw new Nw("VERSION","document","unsupported document version");if(wM(JSON.stringify(t))>vM)throw new Nw("DOCUMENT_LIMIT","document","over 1 MiB");const e=t;if(!Array.isArray(e.model?.nodes)||e.model.nodes.length>512)throw new Nw("DOCUMENT_LIMIT","document","maximum 512 nodes");return _M(e.model,e.capabilities)}const AM=(t,e,n)=>{throw new Nw(t,e,n)};function EM(t){return new Map(t.document.model.inputs.filter(t=>"state"===t.role).map(t=>[t.id,t.unit]))}function kM(t,e){const n=t.keys;if(e<=n[0].at)return n[0].value;const i=n[n.length-1];if(e>=i.at)return i.value;let s=0;for(;s<n.length-2&&n[s+1].at<=e;)s++;const r=n[s],o=n[s+1];if("step"===t.interpolation)return r.value;const a=o.at-r.at;return r.value+(e-r.at)/a*(o.value-r.value)}function CM(t,e,n="other"){Number.isFinite(e)||AM("DRIVER_TIME",t.id,"finite time required");const i=Math.max(0,e),s=t.time.duration,r=t.keys[0].value,o=t.keys[t.keys.length-1];let a;if("hold"===t.loop)a=kM(t,Math.min(i/s,1));else{const e=Math.floor(i/s);a=kM(t,(i-e*s)/s),t.accumulates&&(a+=e*(o.value-r))}return t.accumulates?"deg"===n||"rad"===n?function(t,e){const n="deg"===e?360:2*Math.PI,i=n/2,s=((t+i)%n+n)%n-i;return s===i?-i:s}(a,n):AM("DRIVER_STATE",t.id,"an accumulating driver needs an angle unit"):a}const TM=(t,e,n)=>{throw new Nw(t,e,n)};function PM(t,e,n,i){t&&"object"==typeof t&&!Array.isArray(t)||TM("ASSET_SCHEMA",i,"object required");for(const n of e)Object.hasOwn(t,n)||TM("ASSET_SCHEMA",i,`missing ${n}`);for(const s of Object.keys(t))[...e,...n].includes(s)||TM("ASSET_SCHEMA",i,`unknown ${s}`)}function OM(t){return function(t){MM(t),wM(JSON.stringify(t))>vM&&TM("DOCUMENT_LIMIT","asset","over 1 MiB");PM(t,["version","name","document","designInputs","stateDefaults","palette","appearance"],["occupancy","drivers","stateInputs"],"asset"),"figure-v3-asset-1"!==t.version&&TM("VERSION","asset",t.version);"string"==typeof t.name&&t.name.trim()||TM("ASSET_SCHEMA","name","nonempty name required");const e=structuredClone(t),n=SM(e.document),i=e.document.model,s=i.inputs.filter(t=>"state"!==t.role).map(t=>t.id),r=i.inputs.filter(t=>"state"===t.role).map(t=>t.id);PM(e.designInputs,s,[],"designInputs"),PM(e.stateDefaults,r,[],"stateDefaults"),(!e.palette||"object"!=typeof e.palette||Array.isArray(e.palette))&&TM("ASSET_SCHEMA","palette","token to hex color map required");for(const[t,n]of Object.entries(e.palette))t.trim()&&"string"==typeof n&&/^#[0-9a-f]{6}$/i.test(n)||TM("PALETTE","palette","six digit hex color required");const o=t=>{"string"==typeof t&&Object.hasOwn(e.palette,t)||TM("PALETTE",String(t),"unresolved color token")},a=new Map(i.nodes.flatMap(t=>Object.values(t.outputs).map(e=>[e,t]))),c=new Map(i.nodes.filter(t=>["place@1","member@1"].includes(t.op)).map(t=>[t.id,t])),l=new Map;Array.isArray(e.appearance)||TM("ASSET_SCHEMA","appearance","array required");for(const t of e.appearance){if(PM(t,["target","material"],["segments","visibility"],"appearance"),void 0!==t.visibility){const e=n.outputTypes[t.visibility];"string"==typeof t.visibility&&e&&"flag"===e.kind||TM("VISIBILITY","appearance.visibility",`${String(t.visibility)} is not a flag value in the graph`)}if(c.has(t.target)&&!l.has(t.target)||TM("APPEARANCE_TARGET",String(t.target),"unknown or duplicate source placement"),PM(t.material,["token"],["preset","transparent","emissive"],"material"),o(t.material.token),void 0===t.material.preset||["default","metal","glass","plastic","wood","ceramic","rubber"].includes(t.material.preset)||TM("MATERIAL","preset","unknown preset"),void 0!==t.material.transparent&&"boolean"!=typeof t.material.transparent&&TM("MATERIAL","transparent","boolean required"),void 0!==t.material.emissive){const e=t.material.emissive;PM(e,["token","intensity","on"],[],"emissive"),o(e.token),("boolean"!=typeof e.on||!Number.isFinite(e.intensity)||e.intensity<0||e.intensity>5)&&TM("MATERIAL","emissive","invalid intensity or switch")}const e=a.get(c.get(t.target).args[0]);["cylinder-shape@1","cylinder-shape@2","sphere-shape@1","frustum-shape@1"].includes(e?.op)?[8,12,16,24,32,48].includes(t.segments)||TM("QUALITY","segments","explicit supported cylinder segment count required"):void 0!==t.segments&&TM("QUALITY","segments","segments unsupported on this provider"),l.set(t.target,t)}l.size!==c.size&&TM("APPEARANCE_MISSING","appearance","every source placement/member requires appearance");if(void 0!==e.occupancy){if(PM(e.occupancy,["bounds","placement"],["contact"],"occupancy"),void 0!==e.occupancy.contact){const t=e.occupancy.contact;PM(t,["plane","surface"],[],"occupancy.contact"),"mounting-plane"!==t.plane&&TM("OCCUPANCY","occupancy.contact",`${String(t.plane)} is not a plane the figure can be mounted on`),mM({types:n.outputTypes,writers:a,model:i,assetFrame:e.document.capabilities.assetFrame},t.surface,"occupancy.contact.surface")}PM(e.occupancy.bounds,["x","y","z"],[],"occupancy.bounds");const t=JSON.stringify([1,0,0]);for(const i of["x","y","z"]){PM(e.occupancy.bounds[i],["min","max"],[],`occupancy.bounds.${i}`);for(const s of["min","max"]){const r=`occupancy.bounds.${i}.${s}`,o=e.occupancy.bounds[i][s];"string"==typeof o&&JSON.stringify(n.outputTypes[o])===t||TM("OCCUPANCY",r,`${String(o)} is not a length value in the graph`),n.dependence[o]?.length&&TM("OCCUPANCY_STATE",r,`${o} depends on state input ${n.dependence[o].join(", ")}; the occupancy is state-independent`)}}jw.includes(e.occupancy.placement)||TM("OCCUPANCY","occupancy.placement",`one of ${jw.join(", ")} required`)}function h(t={}){PM(t,[],r,"state overrides");const i={...e.designInputs,...e.stateDefaults,...t},s=n.evaluate(i),o=s.geometry.map(t=>{const e=t.key?a.get(t.key)?.id:t.id,n=l.get(e);return n||TM("APPEARANCE_MISSING",t.id,"no source appearance"),{...t,material:structuredClone(n.material),visible:void 0===n.visibility||s.values[n.visibility],...void 0!==n.segments?{segments:n.segments}:{}}});return{...s,geometry:o,inputs:i,palette:structuredClone(e.palette)}}return function(t){const e=t.drivers;if(void 0===e)return;Array.isArray(e)||AM("DRIVER","drivers","array required");const n=EM(t),i=new Set,s=new Set,r=new Map;for(const t of e){const e=`drivers.${String(t?.id??"?")}`,o=t=>t&&"object"==typeof t?Object.keys(t).sort():null;JSON.stringify(o(t))!==JSON.stringify(["accumulates","clip","id","interpolation","keys","loop","state","time"])&&AM("DRIVER",e,"exactly id, clip, state, time, keys, interpolation, loop, accumulates required"),"string"==typeof t.id&&t.id.trim()||AM("DRIVER",e,"id required"),i.has(t.id)&&AM("DRIVER",e,"duplicate driver id"),i.add(t.id),"string"==typeof t.clip&&t.clip.trim()||AM("DRIVER",e,"clip required; the playback group is declared, not read out of the id"),n.has(t.state)||AM("DRIVER_STATE",e,`${String(t.state)} is not a state input of this asset`),s.has(t.state)&&AM("DRIVER_STATE",e,`two drivers write ${t.state}; one writer per state`),s.add(t.state),JSON.stringify(o(t.time))===JSON.stringify(["duration","unit"])&&"s"===t.time.unit||AM("DRIVER_TIME",e,'time must be { unit: "s", duration }'),Number.isFinite(t.time.duration)&&t.time.duration>0||AM("DRIVER_TIME",e,"positive duration in seconds required");const a=r.get(t.clip);void 0===a?r.set(t.clip,t.time.duration):a!==t.time.duration&&AM("DRIVER_TIME",e,`clip "${t.clip}" already runs for ${a} s; one clip is one clock, so every driver in it shares a duration`),(!Array.isArray(t.keys)||t.keys.length<2)&&AM("DRIVER_KEYS",e,"at least two keys required");let c=-1/0;for(const n of t.keys)JSON.stringify(o(n))!==JSON.stringify(["at","value"])&&AM("DRIVER_KEYS",e,"a key is { at, value }"),Number.isFinite(n.at)&&n.at>=0&&n.at<=1||AM("DRIVER_KEYS",e,"key at must be a fraction of the duration in [0, 1]"),n.at>c||AM("DRIVER_KEYS",e,"key at values must strictly increase"),c=n.at,Number.isFinite(n.value)||AM("DRIVER_KEYS",e,"finite key value required");0!==t.keys[0].at&&AM("DRIVER_KEYS",e,"the first key is at 0"),["linear","step"].includes(t.interpolation)||AM("DRIVER",e,"interpolation is linear or step"),["wrap","hold"].includes(t.loop)||AM("DRIVER",e,"loop is wrap or hold"),"boolean"!=typeof t.accumulates&&AM("DRIVER",e,"accumulates must be a boolean");const l=n.get(t.state);t.accumulates&&"deg"!==l&&"rad"!==l&&AM("DRIVER_STATE",e,`an accumulating driver writes an angle; ${t.state} is in ${l}`)}}(e),function(t){const e=t.stateInputs;if(void 0===e)return;e&&"object"==typeof e&&!Array.isArray(e)||AM("STATE_INPUT","stateInputs","object required");const n=EM(t);for(const[t,i]of Object.entries(e)){const e=`stateInputs.${t}`;n.has(t)||AM("STATE_INPUT",e,`${t} is not a state input of this asset`),i&&"object"==typeof i&&!Array.isArray(i)||AM("STATE_INPUT",e,"object required");for(const t of Object.keys(i))"label"!==t&&"sweep"!==t&&AM("STATE_INPUT",e,`unknown ${t}`);void 0===i.label||"string"==typeof i.label&&i.label.trim()||AM("STATE_INPUT",e,"label must be a nonempty string"),void 0===i.sweep||Number.isFinite(i.sweep)&&i.sweep>=0||AM("STATE_INPUT",e,"sweep must be a number of seconds, zero or more")}}(e),h(),{evaluate:h}}(t)}const DM="0.1.38";function zM(t,e,n){const i=t.anchor?.[n];if(i)return i;if("scale"===t.sizing)return"scale";if("stretch"===t.sizing&&n===HM(t))return"span";if("repeat"===t.sizing&&n===t.repeat?.axis)return"center";const s=IM(t,e,n);return s.min<s.max?"min":s.max<s.min?"max":"center"}function IM(t,e,n){const i=(Number.isFinite(e[n])?e[n]:0)/2,s=t.transform.position[n],r=BM(t)[n]/2;return{min:s-r+i,max:i-(s+r)}}function RM(t){return Number.isFinite(t)&&t>0?t:1}function jM(t,e,n,i){const s=IM(t,n,i),r=(Number.isFinite(n[i])?n[i]:0)*RM(e[i]);return Math.max(r-s.min-s.max,LM)}const LM=.001;function FM(t){return"scale"!==t.sizing||NM(t)}function NM(t){return("cylinder"===t.primitive||"sphere"===t.primitive)&&!1!==t.keepRound}function BM(t){const{size:e,rotation:n}=t.transform;if(!n)return{...e};const i=Math.PI/180,s=Math.cos((n.x??0)*i),r=Math.sin((n.x??0)*i),o=Math.cos((n.y??0)*i),a=Math.sin((n.y??0)*i),c=Math.cos((n.z??0)*i),l=Math.sin((n.z??0)*i),h=[[o*c,-o*l,a],[r*a*c+s*l,-r*a*l+s*c,-r*o],[-s*a*c+r*l,s*a*l+r*c,s*o]],d=t=>Math.abs(t[0])*e.x+Math.abs(t[1])*e.y+Math.abs(t[2])*e.z;return{x:d(h[0]),y:d(h[1]),z:d(h[2])}}function HM(t){const{x:e,y:n,z:i}=BM(t);return e>=i&&e>=n?"x":i>=n?"z":"y"}function $M(t,e,n){const i={x:zM(t,n,"x"),y:zM(t,n,"y"),z:zM(t,n,"z")};if(WM.every(t=>"scale"===i[t])){const n={x:1,y:1,z:1};return VM(t,e,n),n}const s={x:qM(e.x),y:qM(e.y),z:qM(e.z)};for(const r of WM){const o=i[r];if("scale"===o&&(s[r]=1),"span"!==o)continue;const a=BM(t)[r];s[r]=a>0?jM(t,e,n,r)/a/RM(e[r]):1}return VM(t,e,s),function(t,e,n,i){const s={x:RM(n.x)*i.x,y:RM(n.y)*i.y,z:RM(n.z)*i.z};for(const r of WM){const o=GM(zM(t,e,r));o&&(i[r]=s[o]/RM(n[r]))}}(t,n,e,s),s}function GM(t){return"aspect-x"===t?"x":"aspect-y"===t?"y":"aspect-z"===t?"z":null}function VM(t,e,n){if(!NM(t))return;const i="sphere"===t.primitive?null:function(t){const e=t.transform.rotation;if(!e)return"y";const n=Math.PI/180,i=Math.cos((e.x??0)*n),s=Math.sin((e.x??0)*n),r=Math.cos((e.y??0)*n),o=Math.cos((e.z??0)*n),a=Math.sin((e.z??0)*n),c=Math.sin((e.y??0)*n),l={x:-r*a,y:-s*c*a+i*o,z:i*c*a+s*o},h={x:Math.abs(l.x),y:Math.abs(l.y),z:Math.abs(l.z)};return h.x>=h.y&&h.x>=h.z?"x":h.z>=h.y?"z":"y"}(t),s=WM.filter(t=>t!==i);let r=1;for(const t of s)r*=RM(e[t])*n[t];if(!(r>0&&Number.isFinite(r)))return;const o=Math.pow(r,1/s.length);for(const t of s)n[t]=o/RM(e[t])}function UM(t,e,n){const{position:i}=t.transform,s={x:zM(t,n,"x"),y:zM(t,n,"y"),z:zM(t,n,"z")};if(WM.every(t=>"scale"===s[t]))return{...i};const r={...i},o=$M(t,e,n),a=t=>RM(e[t])*o[t];for(const o of WM){const c=s[o];if("scale"===c)continue;const l=GM(c);if(l){r[o]=i[o]*a(l)/RM(e[o]);continue}const h=RM(e[o]),d=(Number.isFinite(n[o])?n[o]:0)/2,u=IM(t,n,o),p=BM(t)[o]/2;r[o]="span"===c?(-d*h+u.min+jM(t,e,n,o)/2)/h:"min"===c?(-d*h+u.min+p)/h:"max"===c?(d*h-u.max-p)/h:i[o]/h}return r}function YM(t,e,n,i){const{origin:s}=t;if(!e)return{...s};const r=UM(e,n,i),o=$M(e,n,i),a=e.transform.position;return{x:r.x+(s.x-a.x)*o.x,y:r.y+(s.y-a.y)*o.y,z:r.z+(s.z-a.z)*o.z}}const WM=["x","y","z"];function qM(t){return Number.isFinite(t)&&t>0?1/t:1}function XM(t,e,n){if("repeat"!==t.sizing||!t.repeat)return null;const i=t.repeat.axis,s=t.repeat.pitch;if(!(Number.isFinite(s)&&s>0))return null;const r="scale"!==zM(t,n,i)&&Number.isFinite(e[i])&&e[i]>0?e[i]:1,o=(Number.isFinite(n[i])&&n[i]>0?n[i]:s)*r;return{axis:i,count:Math.max(1,Math.min(KM,Math.floor(o/s))),pitch:s}}const KM=100;function QM(t,e,n){return(t-(e-1)/2)*n}const ZM=Object.freeze({x:"size.x",y:"size.y",z:"size.z"});function JM(t){return"number"==typeof t&&Number.isFinite(t)}function tS(t){if(!t||"object"!=typeof t)return!1;const{x:e,y:n,z:i}=t;return JM(e)&&JM(n)&&JM(i)}function eS(t){const e=[],n=t;if(!n||"object"!=typeof n)return["청사진이 객체가 아니다"];1!==n.version&&e.push(`읽을 수 없는 판이다 — version ${String(n.version)}, 이 판올림은 1 만 읽는다`),"string"==typeof n.type&&0!==n.type.length||e.push("type 이 없다 — 컴포넌트 타입 이름이 곧 청사진을 찾는 키다");const i=n.base;if(i&&JM(i.x)&&JM(i.y)&&JM(i.z)?i.x>0&&i.z>0||e.push("base 의 x·z 는 0 보다 커야 한다 — 평면 배치 비율의 분모다"):e.push("base 의 x·y·z 가 온전하지 않다"),!Array.isArray(n.groups))return e.push("groups 가 배열이 아니다"),e;if(0===n.groups.length&&e.push("groups 가 비어 있다 — 그릴 것이 없는 청사진은 등록하지 않는다"),n.groups.forEach((t,n)=>{t&&Array.isArray(t.members)?(0===t.members.length&&e.push(`groups[${n}] 에 부품이 없다`),t.members.forEach((t,i)=>{const s=`groups[${n}].members[${i}]`;"string"==typeof t?.name&&0!==t.name.length||e.push(`${s}.name 이 없다 — 이름이 바인딩·이벤트·애니메이션이 붙는 자리다`);const r=t?.transform;r&&tS(r.position)&&tS(r.size)||e.push(`${s}.transform 의 값이 온전하지 않다`)})):e.push(`groups[${n}].members 가 배열이 아니다`)}),void 0!==n.anchors&&(Array.isArray(n.anchors)?n.anchors.forEach((t,n)=>{const i=`anchors[${n}]`;"string"==typeof t?.name&&0!==t.name.length||e.push(`${i}.name 이 없다 — 이름이 곧 slot·port 의 id 다`),Array.isArray(t?.roles)&&0!==t.roles.length?t.roles.some(t=>!Fw.includes(t))&&e.push(`${i}.roles 에 ${Fw.join(" · ")} 밖의 값이 있다`):e.push(`${i}.roles 가 역할 하나 이상의 배열이 아니다`);const s=t?.transform;s&&tS(s.position)&&tS(s.size)||e.push(`${i}.transform 의 값이 온전하지 않다`)}):e.push("anchors 가 배열이 아니다")),void 0!==n.parameters&&(Array.isArray(n.parameters)?n.parameters.forEach((t,n)=>{const i=`parameters[${n}]`;"string"==typeof t?.name&&0!==t.name.length||e.push(`${i}.name 이 없다 — 인스턴스가 이 이름으로 값을 준다`);const s=t?.range;s&&JM(s.min)&&JM(s.max)?s.max>s.min||e.push(`${i}.range 의 max 가 min 보다 크지 않다 — 0~1 로 맵할 수 없다`):e.push(`${i}.range 의 min·max 가 온전하지 않다`),t?.clip&&Array.isArray(t.clip.channels)?void 0===t.clip.duration||JM(t.clip.duration)&&t.clip.duration>=0||e.push(`${i}.clip.duration 이 0 이상의 수가 아니다`):e.push(`${i}.clip.channels 가 배열이 아니다 — 값이 무엇을 움직이는지 없다`)}):e.push("parameters 가 배열이 아니다")),void 0!==n.joints)if(Array.isArray(n.joints)){const t=new Set;n.joints.forEach((n,i)=>{const s=`joints[${i}]`;"string"==typeof n?.name&&0!==n.name.length?(Lw.includes(n.type)||e.push(`${s}.type 이 ${Lw.join(" · ")} 가 아니다`),tS(n.origin)||e.push(`${s}.origin 이 온전하지 않다`),tS(n.axis)&&0!==Math.hypot(n.axis.x,n.axis.y,n.axis.z)||e.push(`${s}.axis 가 0 이 아닌 벡터가 아니다`),void 0===n.parent||t.has(n.parent)||e.push(`${s}.parent '${n.parent}' 가 앞에 없다 — 관절은 부모가 먼저 온다`),t.add(n.name)):e.push(`${s}.name 이 없다 — channel 이 이 이름으로 관절을 몬다`)})}else e.push("joints 가 배열이 아니다");const s=new Set(Array.isArray(n.joints)?n.joints.map(t=>t?.name):[]);return n.groups.forEach((t,n)=>{void 0===t?.joint||s.has(t.joint)||e.push(`groups[${n}].joint '${t.joint}' 가 joints 에 없다`)}),(Array.isArray(n.anchors)?n.anchors:[]).forEach((t,n)=>{void 0===t?.joint||s.has(t.joint)||e.push(`anchors[${n}].joint '${t.joint}' 가 joints 에 없다`)}),e}const nS={"palette.primary":"#154473","palette.accent":"#f79c40","palette.neutral":"#96989b","palette.dark":"#27292c","palette.light":"#d6d7d9","palette.surface":"#56585b","palette.status-danger":"#f61b30","palette.status-warning":"#e68d1a","palette.status-info":"#158bde","palette.status-success":"#1cb648"},iS=new Map([["default",nS]]);let sS="default",rS=0;function oS(){return rS}function aS(t,e){iS.set(t,e),t===sS&&rS++}function cS(t){if(!iS.has(t))throw new Error(`등록되지 않은 팔레트다: '${t}'. 등록된 것 — ${[...iS.keys()].join(", ")}`);t!==sS&&(sS=t,rS++)}function lS(){return sS}function hS(){return iS.get(sS)}function dS(t){const e=hS()[t];if(void 0===e)throw new Error(`팔레트에 없는 토큰이다: '${t}' (팔레트 '${sS}'). 쓸 수 있는 것 — ${Object.keys(hS()).join(", ")}`);return e}const uS=nS["palette.neutral"];function pS(){iS.clear(),iS.set("default",nS),sS="default",rS++}const fS=new Map;let mS=null;function gS(t){mS=t}function yS(t){const e=t.material?.token;return void 0===e?uS:dS(e)}function bS(t){const e=[],n=[];for(const i of t.groups){const t=yS(i);for(const e of i.members)n.push({member:e,group:i,color:t});e.push({group:i,color:t})}return n.sort((t,e)=>t.member.transform.position.y-e.member.transform.position.y),{blueprint:t,paintOrder:n,groups:e,paletteVersion:oS()}}function _S(t){const e=eS(t);if(e.length>0){throw new Error(`Figure '${t?.type??"(이름 없음)"}' 를 등록할 수 없다:\n - ${e.join("\n - ")}`)}const n=bS(t);return fS.set(t.type,n),mS&&mS.registerType?.(t.type,t.capabilities??[],t.placement),n}function vS(t,e=[],n){mS?.registerType?.(t,e,n)}function xS(t){const e=fS.get(t);if(!e)return null;if(e.paletteVersion!==oS()){const n=bS(e.blueprint);return fS.set(t,n),n}return e}function wS(){return[...fS.keys()]}function MS(t){return fS.has(t)}function SS(t){return fS.delete(t)}function AS(){fS.clear()}const ES={x:0,y:0,z:0};function kS(t){let e=0;for(const n of t.channels??[]){const t=n.keys,i=t?.[t.length-1]?.at;"number"==typeof i&&Number.isFinite(i)&&i>e&&(e=i)}return e}function CS(t,e){const n=t.keys;if(!n||0===n.length)return ES;if(1===n.length)return n[0].value;if(e<=n[0].at)return n[0].value;const i=n[n.length-1];if(e>=i.at)return i.value;let s=0;for(;s<n.length-2&&n[s+1].at<=e;)s++;const r=n[s],o=n[s+1];if("step"===t.interpolation)return r.value;const a=o.at-r.at,c=a>0?(e-r.at)/a:0;return{x:r.value.x+(o.value.x-r.value.x)*c,y:r.value.y+(o.value.y-r.value.y)*c,z:r.value.z+(o.value.z-r.value.z)*c}}function TS(t,e){const n=new Map;for(const i of t.channels??[]){const t=i.target;if("string"!=typeof t)continue;if(!PS(i))continue;let s=n.get(t);s||(s={},n.set(t,s)),s[i.path]=CS(i,e)}return n}function PS(t){return void 0!==t.path}function OS(t,e){const n=t.keys;if(!n||0===n.length)return 0;if(1===n.length||e<=n[0].at)return n[0].value;const i=n[n.length-1];if(e>=i.at)return i.value;let s=0;for(;s<n.length-2&&n[s+1].at<=e;)s++;const r=n[s],o=n[s+1];if("step"===t.interpolation)return r.value;const a=o.at-r.at,c=a>0?(e-r.at)/a:0;return r.value+(o.value-r.value)*c}function DS(t,e){const n=new Map;for(const i of t.channels??[])"string"!=typeof i.target||PS(i)||n.set(i.target,OS(i,e));return n}function zS(t,e){return t<=0?0:e%t}function IS(t){return Math.min(Math.max(t,0),1)}function RS(t,e,n,i){if(!(n>0))return e;const s=i/1e3/n;return Math.abs(e-t)<=s?e:t+Math.sign(e-t)*s}function jS(t){const e=FS(t);if(!e)return null;const{position:n,rotation:i}=t.transform;return i&&(e.rotateZ(M.MathUtils.degToRad(i.z??0)),e.rotateY(M.MathUtils.degToRad(i.y??0)),e.rotateX(M.MathUtils.degToRad(i.x??0))),e.translate(n.x,n.y,n.z),e}function LS(t){const e=FS(t);if(!e)return null;const{rotation:n}=t.transform;return n&&(e.rotateZ(M.MathUtils.degToRad(n.z??0)),e.rotateY(M.MathUtils.degToRad(n.y??0)),e.rotateX(M.MathUtils.degToRad(n.x??0))),e}function FS(t){const{size:e}=t.transform;if(!(e.x>0&&e.y>0&&e.z>0))return null;switch(t.primitive){case"cube":case"wall":return new M.BoxGeometry(e.x,e.y,e.z);case"cylinder":case"sphere":{const n=function(t){const e=t.segments;return kx(e,Sx[0])}(t),i=Mx.primitive({kind:t.primitive,segments:n}).clone();return i.scale(e.x,e.y,e.z),i}case"rect":case"polygon":return kw(function(t){const{size:e}=t.transform;return{polygon:"polygon"===t.primitive,width:e.x,depth:e.z,height:e.y,round:t.shape?.round,path:t.shape?.path,hollow:t.shape?.hollow}}(t))}}function NS(t,e){const{blueprint:n}=t,i=t.groups[e];if(!i)return null;const s=`figure|${n.type}|${e}|${i.group.materialKey}|${function(t){let e=2166136261;const n=t=>{for(let n=0;n<t.length;n++)e^=t.charCodeAt(n),e=Math.imul(e,16777619)};for(const e of t.group.members){const{position:t,size:i,rotation:s}=e.transform;n(`${e.geometryKey}@${t.x},${t.y},${t.z}:${i.x},${i.y},${i.z}`),n(s?`%${s.x??0},${s.y??0},${s.z??0};`:";")}return(e>>>0).toString(36)}(i)}`,r=Mx.shaped(s,()=>{const t=[];for(const e of i.group.members){const n=jS(e);n&&t.push(n)}if(0===t.length)return new M.BufferGeometry;let s;if(1===t.length)s=t[0];else{const r=t.map(t=>t.index?t.toNonIndexed():t),o=x.mergeGeometries(r,!1);if(!o)throw new Error(`Figure '${n.type}' 의 묶음 ${e}(${i.group.materialKey})를 합치지 못했다 — 부품 ${i.group.members.map(t=>t.name).join(", ")}`);s=o;for(const t of r)t.dispose();for(const e of t)e.dispose()}return s});return r.getAttribute("position")?r:null}function BS(t,e,n=!1){const{material:i}=e.group,s=dd[i.preset??"default"]??dd.default,r=n&&i.emissive,o=r&&i.emissive.token?dS(i.emissive.token):e.color,a=`figure|${t.blueprint.type}|${e.group.materialKey}`+(r?"||emissive":"");return Zv.material(a,{color:o,metalness:s.metalness,roughness:s.roughness,envMapIntensity:s.envMapIntensity,flatShading:i.flatShading??!0,transparent:i.transparent??!1,opacity:i.transparent?s.opacity??.3:1,emissive:o,emissiveIntensity:r?i.emissive.intensity:0})}function HS(t,e){const n=t.group.material.emissive;if(!n)return!1;const i=t.group.members[0]?.name;return(i?e?.[i]:void 0)??n.on??!1}function $S(t){return!t||[t.x??0,t.y??0,t.z??0].every(t=>Math.abs(t%90)<1e-6)}const GS=new M.Quaternion,VS=new M.Vector3,US=new M.Vector3,YS=new M.Vector3,WS=new M.Quaternion,qS=new M.Quaternion,XS=new M.Vector3,KS=new M.Vector3,QS=new M.Vector3,ZS=new M.Vector3,JS=new M.Matrix4;function tA(t){return Number.isFinite(t)&&t>0?1/t:1}function eA(t,e){if("number"!=typeof e||!Number.isFinite(e))return;const n=t.max-t.min;return!Number.isFinite(n)||n<=0?void 0:Math.min(Math.max((e-t.min)/n,0),1)}function nA(t,e){const n=e?.[t.clip.name];return"number"==typeof n&&Number.isFinite(n)&&n>=0?n:1}function iA(t,e){const n=t.range;return n?eA(n,e?.[t.name])??eA(n,t.default)??0:0}function sA(t,e){const n=e?.[t.name];if(rA(n))return n;const i=t.clip?.duration;return rA(i)?i:0}function rA(t){return"number"==typeof t&&Number.isFinite(t)&&t>=0}const oA=new M.Euler;function aA(t){const{rotation:e}=t.transform;return(new M.Quaternion).setFromEuler(new M.Euler(M.MathUtils.degToRad(e?.x??0),M.MathUtils.degToRad(e?.y??0),M.MathUtils.degToRad(e?.z??0)))}const cA=new Set;function lA(t,e,n){const i=`${t}|${e}|${n}`;cA.has(i)||(cA.add(i),Hi(`[figure] ${t}.${e}: ${n} 는 아직 안 움직인다 — 청사진에는 실렸다.`))}class hA extends iu{constructor(){super(...arguments),this._meshByName=new Map,this._sized=[],this._memberByName=new Map,this._clips=[],this._parameters=[],this._moved=new Map,this._joints=new Map,this._frameByName=new Map,this._framedMeshes=[],this._jointScale=new M.Vector3(1,1,1)}get figure(){return xS(this.component.state.type)}get lamps(){return this.component.state.lamps}updateLamps(){const t=this.figure;if(t)for(const e of t.groups){if(!e.group.material.emissive)continue;const n=e.group.members[0]?.name;if(!n)continue;const i=this._meshByName.get(n);i&&(i.material=BS(t,e,HS(e,this.lamps)))}}get clips(){return this.component.state.clips}updateClips(){const t=this.clips;for(const e of this._clips)e.value=nA(e,t);this.component.invalidate?.()}get parameters(){return this.component.state.parameters}get parameterDurations(){return this.component.state.parameterDurations}updateParameters(){const t=this.parameters;for(const e of this._parameters)e.target=iA(e.parameter,t);this.component.invalidate?.()}updateParameterDurations(){const t=this.parameterDurations;for(const e of this._parameters)e.sweep=sA(e.parameter,t)}onchange(t,e){super.onchange(t,e),"lamps"in t&&this.updateLamps(),"clips"in t&&this.updateClips(),"parameters"in t&&this.updateParameters(),"parameterDurations"in t&&this.updateParameterDurations()}build(){super.build();const t=this.figure;if(t){for(const e of t.blueprint.groups)for(const t of e.members)this._memberByName.set(t.name,t),void 0!==e.joint&&this._frameByName.set(t.name,e.joint);this.buildJoints(t),t.groups.forEach((e,n)=>{const i=e.group.joint,s=function(t){const{members:e}=t.group;if(1!==e.length)return null;const n=e[0];return FM(n)?n:null}(e);if(s)return void this.buildSized(t,e,s,i);const r=NS(t,n);if(!r)return;const o=new M.Mesh(r,BS(t,e,HS(e,this.lamps)));o.castShadow=!0,o.name=e.group.animated?e.group.members[0]?.name??"":"";const a=void 0!==i?this._joints.get(i)?.node:void 0;a?(a.add(o),this._framedMeshes.push({mesh:o,frame:i})):this.object3d.add(o);for(const t of e.group.members)this._meshByName.has(t.name)||this._meshByName.set(t.name,o)}),this.updateDimension(),this.takeClips(t),this.takeParameters(t),this.seatParameters(),this.startTicking()}}buildJoints(t){const e=t.blueprint.joints??[];if(0===e.length)return;const n=new M.Object3D;n.name="(joints)",this.object3d.add(n),this._rigid=n;for(const t of e){const e=new M.Object3D;e.name=t.name;((void 0!==t.parent?this._joints.get(t.parent)?.node:void 0)??n).add(e),this._joints.set(t.name,{joint:t,node:e,origin:new M.Vector3,rest:new M.Vector3})}}layoutJoints(t){const e=this.figure;if(!e||!this._rigid)return;const{base:n,anchors:i}=e.blueprint;this._jointScale.set(t.x,t.y,t.z),this._rigid.scale.set(tA(t.x),tA(t.y),tA(t.z));for(const e of this._joints.values()){const{attach:s}=e.joint,r=void 0===s?void 0:this._memberByName.get(s)??i?.find(t=>t.name===s),o=YM(e.joint,r,t,n);e.origin.set(o.x*t.x,o.y*t.y,o.z*t.z);const a=void 0!==e.joint.parent?this._joints.get(e.joint.parent):void 0;e.rest.copy(e.origin),a&&e.rest.sub(a.origin)}for(const{mesh:t,frame:e}of this._framedMeshes){const n=this._joints.get(e)?.origin;n&&(t.position.copy(n).negate(),t.scale.copy(this._jointScale))}this.applyJoints(new Map)}anchorPosition(t){const e=t.transform.position,n=void 0===t.joint?void 0:this._joints?.get(t.joint);if(!n||!this._rigid)return e;const i=this._jointScale;if(0===i.x||0===i.y||0===i.z)return e;const s=ZS.set(e.x*i.x,e.y*i.y,e.z*i.z).sub(n.origin);JS.identity();for(let t=n.node;t&&t!==this._rigid;t=t.parent)t.updateMatrix(),JS.premultiply(t.matrix);return s.applyMatrix4(JS),{x:s.x/i.x,y:s.y/i.y,z:s.z/i.z}}anchorAttachment(t){const e=void 0===t.joint?void 0:this._joints?.get(t.joint);if(!e||!this._rigid)return;const n=this._jointScale,i=t.transform.position;return{attach:e.node,localPosition:{x:i.x*n.x-e.origin.x,y:i.y*n.y-e.origin.y,z:i.z*n.z-e.origin.z}}}applyJoints(t){for(const e of this._joints.values()){const{joint:n,node:i}=e,s=n.limits;let r=t.get(n.name)??0;s&&(r=Math.min(Math.max(r,s.min),s.max)),i.position.copy(e.rest),"prismatic"===n.type?(i.quaternion.identity(),i.position.x+=n.axis.x*r*this._jointScale.x,i.position.y+=n.axis.y*r*this._jointScale.y,i.position.z+=n.axis.z*r*this._jointScale.z):(XS.set(n.axis.x,n.axis.y,n.axis.z),i.quaternion.setFromAxisAngle(XS,M.MathUtils.degToRad(r)))}}takeClips(t){const e=this.clips,n=this.component.state.type;for(const i of t.blueprint.animations??[]){const t=kS(i);if(t<=0)continue;if(0===this.takeChannels(i.channels??[],n))continue;const s={clip:i,duration:t,value:0,elapsed:0};s.value=nA(s,e),this._clips.push(s)}}takeParameters(t){const e=this.parameters,n=this.parameterDurations,i=this.component.state.type;for(const s of t.blueprint.parameters??[]){const t=s.clip?.channels??[];if(0===this.takeChannels(t,i))continue;const r={parameter:s,sweep:sA(s,n),at:0,target:0};r.target=iA(s,e),r.at=r.target,this._parameters.push(r)}}takeChannels(t,e){let n=0;for(const i of t){if(!PS(i)){this._joints?.has(i.target)&&n++;continue}const s=this._moved.get(i.target),r=this._memberByName.get(i.target);if(!r)continue;const o=aA(r),a=this._sized.find(t=>t.member.name===i.target),c=a?void 0:this._meshByName.get(i.target);if(!a&&!c)continue;const l=new M.Vector3(i.pivot?.x??0,i.pivot?.y??0,i.pivot?.z??0);if(l.applyQuaternion(o),!a){const{position:t}=r.transform;l.set(l.x+t.x,l.y+t.y,l.z+t.z)}if(t.some(t=>t.target===i.target&&"scale"===t.path)&&!$S(r.transform.rotation)&&lA(e,i.target,"90도 배수가 아닌 회전 위의 scale 채널"),s){if(n++,void 0===i.pivot)continue;if(s.pivoted){s.pivot.equals(l)||lA(e,i.target,"회전 중심이 서로 다른 채널 둘");continue}s.pivot.copy(l),s.pivoted=!0;continue}const h=void 0!==i.pivot,d=this._frameByName?.get(i.target);this._moved.set(i.target,void 0===d?{name:i.target,mesh:c,sized:a,pivot:l,pivoted:h,turn:o}:{name:i.target,mesh:c,sized:a,pivot:l,pivoted:h,turn:o,frame:d}),n++}return n}startTicking(){this._unsubscribeTick||0===this._clips.length&&0===this._parameters.length||(this._unsubscribeTick=yr.subscribe(t=>this.advanceClips(t),{description:`Figure[${this.component.state.type}].clips`,component:this.component,getTargets:()=>[...[...this._moved.values()].map(t=>t.mesh??t.sized?.holder),...[...this._joints?.values()??[]].map(t=>t.node)]}))}advanceClips(t){if(0===this._clips.length&&0===this._parameters.length)return;let e=!1;const n=new Map,i=new Map,s=t=>{for(const[e,n]of t)i.set(e,(i.get(e)??0)+n)},r=t=>{let e=n.get(t);return e||(e={shift:new M.Vector3,scale:new M.Vector3(1,1,1),turn:new M.Quaternion},n.set(t,e)),e};for(const n of this._parameters){const i=n.at;n.at=RS(n.at,n.target,n.sweep,t),n.at!==i&&(e=!0);for(const[t,e]of TS(n.parameter.clip,IS(n.at))){const n=this._moved.get(t);n&&this.mixPose(r(t),n,e)}this._joints?.size&&s(DS(n.parameter.clip,IS(n.at)))}for(const n of this._clips){0!==n.value&&(n.elapsed+=t/1e3*n.value,e=!0);const i=zS(n.duration,n.elapsed);for(const[t,e]of TS(n.clip,i)){const n=this._moved.get(t);n&&this.mixPose(r(t),n,e)}this._joints?.size&&s(DS(n.clip,i))}this.applyPose(n),this._joints?.size&&this.applyJoints(i),e&&this.component.invalidate?.()}mixPose(t,e,n){var i;n.translation&&(t.shift.x+=n.translation.x,t.shift.y+=n.translation.y,t.shift.z+=n.translation.z),n.rotation&&t.turn.multiply(qS.copy(e.turn).multiply((i=n.rotation,i?GS.setFromEuler(oA.set(M.MathUtils.degToRad(i.x),M.MathUtils.degToRad(i.y),M.MathUtils.degToRad(i.z))):GS.identity())).multiply(WS.copy(e.turn).invert())),n.scale&&(VS.set(n.scale.x,n.scale.y,n.scale.z).applyQuaternion(e.turn),t.scale.multiply(VS.set(Math.abs(VS.x),Math.abs(VS.y),Math.abs(VS.z))))}seatParameters(){0!==this._parameters.length&&this.advanceClips(0)}applyPose(t){for(const[e,n]of t){const t=this._moved.get(e);if(!t)continue;const i=US.copy(t.pivot).multiply(n.scale).applyQuaternion(n.turn),s=(new M.Vector3).copy(t.pivot).sub(i).add(n.shift);if(t.sized){const e=t.sized;e.copies.forEach((t,i)=>{t.visible&&(t.quaternion.copy(n.turn),t.scale.copy(n.scale),t.position.copy(e.offsets[i]??YS).add(s))});continue}const r=t.mesh;if(!r)continue;const o=void 0!==t.frame?this._joints?.get(t.frame)?.origin:void 0;if(o){const e=this._jointScale,i=KS.copy(t.pivot).multiply(e),s=US.copy(i).multiply(n.scale).applyQuaternion(n.turn);r.position.copy(i).sub(s).add(QS.copy(n.shift).multiply(e)).sub(o),r.quaternion.copy(n.turn),r.scale.copy(n.scale).multiply(e);continue}r.quaternion.copy(n.turn),r.scale.copy(n.scale),r.position.copy(s)}}buildSized(t,e,n,i){const s=function(t,e){const{size:n,rotation:i}=e.transform,s=`figure-part|${t.blueprint.type}|${e.geometryKey}|${n.x},${n.y},${n.z}|${i?`${i.x??0},${i.y??0},${i.z??0}`:"-"}`,r=Mx.shaped(s,()=>LS(e)??new M.BufferGeometry);return r.getAttribute("position")?r:null}(t,n);if(!s)return;const r=new M.Object3D,{position:o}=n.transform;r.position.set(o.x,o.y,o.z),r.name=n.name;const a=void 0!==i?this._joints.get(i)?.node:void 0;(a??this.object3d).add(r);const c=new M.Mesh(s,BS(t,e,HS(e,this.lamps)));c.castShadow=!0,r.add(c);const l={member:n,holder:r,copies:[c],offsets:[new M.Vector3]};a&&(l.frame=i),this._sized.push(l),this._meshByName.has(n.name)||this._meshByName.set(n.name,c)}applySizing(t){const e=this.figure?.blueprint.base;if(e)for(const n of this._sized){const{member:i,holder:s,copies:r}=n,o=$M(i,t,e);s.scale.set(o.x,o.y,o.z);const a=UM(i,t,e);s.position.set(a.x,a.y,a.z);const c=void 0!==n.frame?this._joints?.get(n.frame)?.origin:void 0;c&&(s.position.set(a.x*t.x,a.y*t.y,a.z*t.z).sub(c),s.scale.set(o.x*t.x,o.y*t.y,o.z*t.z));const l=XM(i,t,e);if(!l){r.forEach((t,e)=>{t.visible=0===e,t.position.set(0,0,0),n.offsets[e]=(n.offsets[e]??new M.Vector3).set(0,0,0)});continue}const h=r[0];for(;r.length<l.count;){const t=new M.Mesh(h.geometry,h.material);t.castShadow=!0,s.add(t),r.push(t)}r.forEach((t,e)=>{t.visible=e<l.count,t.visible&&(t.position.set(0,0,0),t.position[l.axis]=QM(e,l.count,l.pitch),n.offsets[e]=(n.offsets[e]??new M.Vector3).copy(t.position))})}}get effectiveDepth(){const t=this.component.state.depth;if("number"==typeof t&&Number.isFinite(t)&&t>0)return t;const e=this.figure;if(!e)return super.effectiveDepth;const{base:n}=e.blueprint,{width:i,height:s}=this.component.bounds,r=n.x>0?i/n.x:1,o=n.z>0?s/n.z:1;return n.y*Math.sqrt(Math.max(r,0)*Math.max(o,0))}get effectiveZPos(){const t=this.component.state.zPos;if("number"==typeof t&&Number.isFinite(t))return t;if("ceiling"!==this.figure?.blueprint.placement)return super.effectiveZPos;const{ceiling:e}=this.sceneHeights,n=this.effectiveDepth;switch(this.placementMode){case"inverted":return e;case"space":return e-n/2;default:return e-n}}updateDimension(){const t=this.figure;if(!t)return;const{base:e}=t.blueprint,{width:n,height:i}=this.component.bounds,s=this.effectiveDepth,r={x:e.x>0?n/e.x:1,y:e.y>0?s/e.y:1,z:e.z>0?i/e.z:1};this.setDimensionScale(r.x,r.y,r.z),this._joints?.size&&this.layoutJoints(r),this._sized.length>0&&this.applySizing(r),this._joints?.size&&this.advanceClips(0)}topOutline(){return null}clear(){return this._unsubscribeTick?.(),this._unsubscribeTick=void 0,this._clips=[],this._parameters=[],this._moved.clear(),this._joints?.clear(),this._rigid=void 0,this._frameByName?.clear(),this._framedMeshes=[],this._memberByName.clear(),this._meshByName.clear(),this._sized=[],super.clear()}}function dA(t){if(Array.isArray(t))return`[${t.map(dA).join(",")}]`;if(t&&"object"==typeof t){const e=t;return`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${dA(e[t])}`).join(",")}}`}return JSON.stringify(t)}const uA=new Map;function pA(t){const e=function(t){const e=dA(t),n=t=>{let n=t>>>0;for(let t=0;t<e.length;t++)n^=e.charCodeAt(t),n=Math.imul(n,16777619)>>>0;return n.toString(16).padStart(8,"0")};return n(2166136261)+n(2538058380)}(t),n=`${e}|${DM}`,i=uA.get(n);if(i)return uA.delete(n),uA.set(n,i),i;const s=structuredClone(t),r=new Map;for(const t of s.document.model.nodes)for(const e of Object.values(t.outputs))r.set(e,t.id);const o={key:n,fingerprint:e,kernel:DM,compiled:OM(s),document:SM(s.document),looks:new Map(s.appearance.map(t=>[t.target,t])),writers:r,asset:s};return uA.set(n,o),uA.size>256&&uA.delete(uA.keys().next().value),o}const fA=new Map;function mA(t,e){OM(e);const n={type:t,compiled:pA(e)};return fA.set(t,n),vS(t,e.document.capabilities.names??[],e.occupancy?.placement),n}function gA(t){return fA.get(t)??null}function yA(t){return fA.has(t)}function bA(t){return fA.delete(t)}function _A(){fA.clear()}const vA=new Map;function xA(t,e=12){const n=function(t,e){const n=Object.keys(t.dimensions).sort().map(e=>`${e}=${Math.round(1e6*t.dimensions[e])/1e6}`).join(","),i=t.profile?"|"+t.profile.map(t=>`${Math.round(1e6*t.x)/1e6}:${Math.round(1e6*t.y)/1e6}`).join(";"):"";return`${t.provider}|${n}|s${e}${i}`}(t,e),i=vA.get(n);if(i)return i.users++,i.geometry;const s=MA(t,e);return s.userData.v3Key=n,vA.set(n,{geometry:s,users:1}),s}function wA(t){const e=t.userData.v3Key;if(!e)return;const n=vA.get(e);n&&--n.users<=0&&(vA.delete(e),n.geometry.dispose())}function MA(t,e=12){const n=t.dimensions;switch(t.provider){case"box":return new M.BoxGeometry(n.width,n.height,n.depth);case"cylinder":return new M.CylinderGeometry(n.radius,n.radius,n.length,e);case"ellipticCylinder":return new M.CylinderGeometry(1,1,1,e).scale(n.radiusX,n.length,n.radiusZ);case"frustum":return new M.CylinderGeometry(n.radiusTop,n.radiusBottom,n.height,e);case"sphere":return new M.SphereGeometry(1,e,Math.max(4,Math.round(e/2))).scale(n.radiusX,n.radiusY,n.radiusZ);case"roundedBox":case"roundedBoxXZ":{const e="roundedBox"===t.provider?n.round:n.roundX,i="roundedBox"===t.provider?n.round:n.roundZ,s=Pw(n.width,n.depth,e,i);return s?Cw(s,n.height,n.height/2):new M.BufferGeometry}case"hollowBox":case"hollowBoxXZ":{const e="hollowBox"===t.provider?n.round:n.roundX,i="hollowBox"===t.provider?n.round:n.roundZ,s=Pw(n.width,n.depth,e,i),r=Pw(n.width-2*n.wallX,n.depth-2*n.wallZ,Math.max(e-n.wallX,0),Math.max(i-n.wallZ,0));if(!s||!r)return new M.BufferGeometry;const o=n.height,a=Math.max(n.floor,0),c=o-a,l=new M.Shape(s.getPoints(8));l.holes=[new M.Path(r.getPoints(8).reverse())];const h=Cw(l,c,o/2);if(a<=0)return h;const d=Cw(s,a,-o/2+a);return x.mergeGeometries([d,h],!1)??h}case"polygon":{const e=t.profile??[];if(e.length<3)return new M.BufferGeometry;const i=new M.Shape;i.moveTo(e[0].x,e[0].y);for(let t=1;t<e.length;t++)i.lineTo(e[t].x,e[t].y);return i.closePath(),Cw(i,n.height,n.height/2)}case"portal":{const e=t.profile??[];if(e.length<3)return new M.BufferGeometry;const i=new M.Shape;i.moveTo(e[0].x,e[0].y);for(let t=1;t<e.length;t++)i.lineTo(e[t].x,e[t].y);i.closePath();const s=new M.ExtrudeGeometry(i,{steps:1,depth:n.depth,bevelEnabled:!1});return s.translate(0,0,-n.depth/2),s}}}class SA{constructor(t,e={}){this.group=new M.Group,this.meshes=new Map,this.size=null,this.external={},this.clipTimes=new Map,this.last=null,this.compiled=pA(t),this.theme=e.theme??{},this.group.name=`figure-v3:${t.name}`}get asset(){return this.compiled.asset}get base(){const t=this.asset.designInputs,e=e=>"number"==typeof t[e];return e(ZM.x)&&e(ZM.y)&&e(ZM.z)?{x:t[ZM.x],y:t[ZM.y],z:t[ZM.z]}:null}setSize(t){this.size=t}setState(t){this.external={...t}}static clipOf(t){return t.clip}get clips(){return[...new Set((this.asset.drivers??[]).map(t=>SA.clipOf(t)))]}setClipTime(t,e){this.clipTimes.set(t,e)}clipTime(t){return this.clipTimes.get(t)??0}setTime(t){for(const e of this.clips)this.clipTimes.set(e,t)}stateOverrides(){const t=new Map(this.asset.document.model.inputs.map(t=>[t.id,t.unit])),e={};for(const n of this.asset.drivers??[]){if(n.state in this.external)continue;const i=t.get(n.state);e[n.state]=CM(n,this.clipTime(SA.clipOf(n)),"deg"===i||"rad"===i?i:"other")}for(const[n,i]of Object.entries(this.external))t.has(n)&&(e[n]=i);return e}get externalState(){return{...this.external}}update(){const t=this.evaluate();this.last=t;const e=new Set;for(const n of t.geometry){if(!("pose"in n))continue;const t=n.id;e.add(t);let i=this.meshes.get(t);const s=!1!==n.visible,r=xA(n.shape,n.segments);i?i.geometry!==r?(wA(i.geometry),i.geometry=r):wA(r):(i=new M.Mesh(r,this.materialFor(n)),i.name=t,i.matrixAutoUpdate=!1,this.meshes.set(t,i),s&&this.group.add(i));const o=n.pose.r,a=n.pose.t;i.matrix.set(o[0][0],o[0][1],o[0][2],a[0],o[1][0],o[1][1],o[1][2],a[1],o[2][0],o[2][1],o[2][2],a[2],0,0,0,1),i.matrixWorldNeedsUpdate=!0,i.castShadow=s,s&&i.parent!==this.group?this.group.add(i):s||i.parent!==this.group||this.group.remove(i)}for(const[t,n]of this.meshes)e.has(t)||(n.parent===this.group&&this.group.remove(n),wA(n.geometry),this.meshes.delete(t));return t}evaluate(){const t={...this.asset.designInputs,...this.asset.stateDefaults,...this.stateOverrides()};this.size&&(t[ZM.x]=this.size.x,t[ZM.y]=this.size.y,t[ZM.z]=this.size.z);const e=this.compiled.document.evaluate(t),n=e.geometry.map(t=>{const e="key"in t&&t.key?this.compiled.writers.get(t.key):t.id,n=this.compiled.looks.get(e);if(!n)throw new Error(`figure-v3: no appearance for ${e}`);const i={...t,material:structuredClone(n.material)};return void 0!==n.segments&&(i.segments=n.segments),i});return{geometry:n,bindings:e.bindings,inputs:t,palette:{...this.asset.palette}}}colourOf(t){return this.theme[t]??this.asset.palette[t]??"#9a9a9a"}materialFor(t){const e=t.material,n=dd[e.preset??"default"]??dd.default,i=!!e.emissive?.on,s=i&&e.emissive?this.colourOf(e.emissive.token):this.colourOf(e.token),r=i&&e.emissive?e.emissive.intensity:0,o=`figure-v3|${this.compiled.fingerprint}|${e.token}|${e.preset??"default"}|${e.transparent?"t":"o"}|${i?"on":"off"}|${s}|${r}`;return Zv.material(o,{color:s,metalness:n.metalness,roughness:n.roughness,envMapIntensity:n.envMapIntensity,flatShading:!0,transparent:e.transparent??!1,opacity:e.transparent?n.opacity??.3:1,emissive:s,emissiveIntensity:r})}meshOf(t){return this.meshes.get(t)}drawnIds(){return this.group.children.map(t=>t.name)}dispose(){for(const t of this.meshes.values())t.parent===this.group&&this.group.remove(t),wA(t.geometry);this.meshes.clear()}}class AA extends iu{constructor(){super(...arguments),this.rig=null}get figure(){return gA(this.component.state.type)}getObject3dInstance(){return new M.Group}build(){super.build();const t=this.figure;t&&(this.rig=new SA(t.compiled.asset),this.object3d.add(this.rig.group),this.rig.setSize(this.instanceSize()),this.rig.setState(this.parameters),this.rig.update(),this.startTicking())}get parameters(){const t=this.component.state.parameters;return t&&"object"==typeof t?t:{}}get clipSpeeds(){const t=this.component.state.clips;return t&&"object"==typeof t?t:{}}clipTime(t){return this.rig?.clipTime(t)??0}onchange(t,e){super.onchange(t,e),"parameters"in t&&this.updateParameters(),"clips"in t&&this.updateClips()}instanceSize(){const t=this.rig?.base;if(!t)return null;const{width:e,height:n}=this.component.bounds;return{x:e,y:this.effectiveDepth,z:n}}get effectiveDepth(){const t=this.component.state.depth;if("number"==typeof t&&Number.isFinite(t)&&t>0)return t;const e=this.rig?.base;if(!e)return super.effectiveDepth;const{width:n,height:i}=this.component.bounds,s=e.x>0?n/e.x:1,r=e.z>0?i/e.z:1;return e.y*Math.sqrt(Math.max(s,0)*Math.max(r,0))}updateDimension(){this.rig&&(this.rig.setSize(this.instanceSize()),this.refresh())}updateParameters(){this.rig&&(this.rig.setState(this.parameters),this.refresh())}updateClips(){this.rig&&(this.startTicking(),this.component.invalidate?.())}refresh(){this.rig&&(this.rig.update(),this.component.invalidate?.())}startTicking(){const t=this.rig?.asset.drivers??[];this.unsubscribe||0===t.length||(this.unsubscribe=yr.subscribe(t=>this.advance(t),{description:`FigureV3[${this.component.state.type}].drivers`,component:this.component,getTargets:()=>this.rig?[this.rig.group]:[]}))}tick(t){const e=this.rig;if(!e)return;const n=this.clipSpeeds;let i=!1;for(const s of e.clips){const r=n[s]??0;Number.isFinite(r)&&0!==r&&(e.setClipTime(s,e.clipTime(s)+t/1e3*r),i=!0)}i&&(e.update(),this.component.invalidate?.())}advance(t){this.tick(t)}clear(){return this.unsubscribe?.(),this.unsubscribe=void 0,this.rig?.dispose(),this.rig=null,super.clear()}}const EA=Iw,kA=Object.freeze({Capacity:t=>Vb(t),Holdable:t=>J_(t),Transferable:t=>tv(t),FlowNode:t=>ev(t)}),CA=Object.freeze({Capacity:"자리를 갖는다 — 물건이 앉을 곳과 몇 개까지인지를 정한다",Holdable:"물건을 보유한다 — 담긴 것을 함께 들고 그린다",Transferable:"주고받는다 — 자리를 잡아 두고 넘겨받는다. Capacity 가 있어야 자리를 찾는다",FlowNode:"흐름의 마디다 — 담는 것에 더해 문(port)으로 받고 보낸다. 위의 셋을 스스로 포함한다"});function TA(t){return{x:t.x,y:t.z,z:t.y}}function PA(t,e,n){if(t.repeat){const i=XM(t,e,n);if(i)return i.count}return t.capacity??1}function OA(t,e,n){const i=[];for(const s of t){if(!s.roles.includes("slot"))continue;const t={id:s.name,maxCount:PA(s,e,n)};s.accepts&&s.accepts.length>0&&(t.allowedTypes=[...s.accepts]),i.push(t)}return i}function DA(t,e,n){return t.filter(t=>t.roles.includes(e)).map(t=>({id:t.name,position:TA(n?.(t)??t.transform.position)}))}const zA=new Map;function IA(t,e=[],n){const i=new Set(e),s=[...i].filter(t=>!EA.includes(t));if(s.length>0)throw new Error(`모르는 능력이다: ${s.join(" · ")} — 쓸 수 있는 것은 ${EA.join(" · ")}`);for(const[t,e]of Object.entries(Rw))if(i.has(t)&&!e.some(t=>i.has(t)))throw new Error(`${t} 은 혼자 설 수 없다 — ${e.join(" 이나 ")} 가 함께 있어야 한다`);const r=`${[...i].sort().join("+")}|${n??""}`,o=zA.get(r);if(o)return o;const a=0===i.size?t:(c=function(t,e){const n=t.capabilities??[],i=[...new Set([...n,...e])];return Object.defineProperty(t,"capabilities",{value:Object.freeze(i),configurable:!0}),t}(function(t,e){if(e.has("FlowNode"))return kA.FlowNode(t);let n=t;for(const t of["Capacity","Transferable","Holdable"])e.has(t)&&(n=kA[t](n));return n}(t,i),i),class extends c{get _blueprint(){return this.figure?.blueprint??null}get slots(){const t=this._blueprint;return t?.anchors?.length?OA(t.anchors,this.instanceScale,t.base):super.slots??[]}get _posed(){const t=this._realObject;return"function"==typeof t?.anchorPosition?e=>t.anchorPosition(e):void 0}attachPointFor(t,e){const n=()=>super.attachPointFor?super.attachPointFor(t,e):null,i=this._blueprint;if(!i?.anchors?.length)return n();const s=e?.slotId??t?.[Fb];if(!s)return n();const r=i.anchors.find(t=>t.name===s&&t.roles.includes("slot"));if(!r)return n();const o=this._realObject;return o?.anchorAttachment?.(r)??n()}inboundPorts(){const t=this._blueprint;return t?.anchors?.length?DA(t.anchors,"port-in",this._posed):super.inboundPorts?.()??[]}outboundPorts(){const t=this._blueprint;return t?.anchors?.length?DA(t.anchors,"port-out",this._posed):super.outboundPorts?.()??[]}});var c;const l=void 0===n?a:function(t,e){const n=class extends t{};return Object.defineProperty(n,"placement",{value:e,enumerable:!0}),Object.defineProperty(n,"name",{value:`${t.name??"Figure"}·${e}`}),n}(a,n);return zA.set(r,l),l}function RA(){zA.clear()}const jA={mutable:!1,resizable:!0,rotatable:!0,properties:[],help:"scene/component/figure"};class LA extends(pc(dc)){static registerType(t,e=[],n){const i=hc.register(t);if(i&&!(i===LA||i.prototype instanceof LA))throw new Error(`figure type '${t}' is already registered by a non-figure component — refusing to replace it`);const s=IA(LA,e,n);hc.register(t,s)}get instanceScale(){const t=this.figure,{width:e=0,height:n=0}=this.state;if(!t)return{x:1,y:1,z:1};const{base:i}=t.blueprint,s=i.x>0?e/i.x:1,r=i.z>0?n/i.z:1;return{x:s,y:this.depthScale(i,s,r),z:r}}get hasTextProperty(){return!1}is3dish(){return!0}get nature(){return jA}buildRealObject(){return yA(this.state.type)?new AA(this):new hA(this)}get figure(){return xS(this.state.type)}render(t){const e=this.figure,{left:n=0,top:i=0,width:s=0,height:r=0}=this.state;if(!e)return void this.renderMissing(t,n,i,s,r);const{base:o}=e.blueprint,a=o.x>0?s/o.x:1,c=o.z>0?r/o.z:1,l=n+s/2,h=i+r/2,d=this.instanceScale;for(const n of e.paintOrder)t.fillStyle=n.color,t.beginPath(),this.tracePart(t,n,l,h,a,c,d,o),t.fill()}depthScale(t,e,n){const i=this.state.depth;return"number"==typeof i&&Number.isFinite(i)&&i>0?t.y>0?i/t.y:1:Math.sqrt(Math.max(e,0)*Math.max(n,0))}tracePart(t,e,n,i,s,r,o,a){const{member:c}=e,l=UM(c,o,a),h=n+l.x*s,d=i+l.z*r,u=$M(c,o,a),p=s*u.x,f=r*u.z,m=XM(c,o,a);if(m&&"y"!==m.axis&&m.count>1)for(let n=0;n<m.count;n++){const i=QM(n,m.count,m.pitch);this.traceOne(t,e,"x"===m.axis?h+i*s:h,"z"===m.axis?d+i*r:d,p,f)}else this.traceOne(t,e,h,d,p,f)}traceOne(t,e,n,i,s,r){const{member:o}=e,{size:a,rotation:c}=o.transform,l=c?.x??0,h=c?.y??0,d=c?.z??0;if(0!==l||0!==d){const e=function(t,e,n,i){const s=Math.PI/180,r=Math.cos(e*s),o=Math.sin(e*s),a=Math.cos(n*s),c=Math.sin(n*s),l=Math.cos(i*s),h=Math.sin(i*s),d=a*l,u=-a*h,p=c,f=o*h-r*c*l,m=o*l+r*c*h,g=r*a,y=t.x/2,b=t.y/2,_=t.z/2;return{u:Math.abs(d)*y+Math.abs(u)*b+Math.abs(p)*_,v:Math.abs(f)*y+Math.abs(m)*b+Math.abs(g)*_}}(a,l,h,d);return void t.rect(n-e.u*s,i-e.v*r,2*e.u*s,2*e.v*r)}if(0!==h)return t.save(),t.translate(n,i),t.rotate(-h*Math.PI/180),this.traceShape(t,e,0,0,s,r),void t.restore();this.traceShape(t,e,n,i,s,r)}traceShape(t,e,n,i,s,r){const{member:o}=e,{size:a}=o.transform,c=a.x*s,l=a.z*r,h=n-c/2,d=i-l/2,u=o.shape?.hollow;if(u&&u.wall>0){const e=zw({polygon:"polygon"===o.primitive,width:a.x,depth:a.z,round:o.shape?.round,path:o.shape?.path,hollow:u});if(e){for(const o of e)if(!(o.length<3)){t.moveTo(n+o[0].x*s,i+o[0].y*r);for(let e=1;e<o.length;e++)t.lineTo(n+o[e].x*s,i+o[e].y*r);t.closePath()}return}}switch(o.primitive){case"cylinder":case"sphere":{const e=dx(c/2,l/2,kx(o.segments,Sx[0])).points;t.moveTo(n+e[0].x,i+e[0].y);for(let s=1;s<e.length;s++)t.lineTo(n+e[s].x,i+e[s].y);return void t.closePath()}case"polygon":{const e=o.shape?.path;if(!e||e.length<3)return;t.moveTo(n+e[0].x*s,i+e[0].y*r);for(let o=1;o<e.length;o++)t.lineTo(n+e[o].x*s,i+e[o].y*r);return void t.closePath()}default:{const e=o.shape?.round??0;if(e>0&&"function"==typeof t.roundRect)return void t.roundRect(h,d,c,l,Math.min(e*s,c/2,l/2));t.rect(h,d,c,l)}}}renderMissing(t,e,n,i,s){t.save(),t.strokeStyle="#e53935",t.lineWidth=1,t.setLineDash([4,4]),t.beginPath(),t.rect(e,n,i,s),t.stroke(),t.restore()}postrender(t){hc.prototype.postrender.call(this,t)}}gS(LA);const FA={mutable:!1,resizable:!0,rotatable:!0,properties:[],help:"scene/component/figure-part"},NA=new M.Vector3,BA=["cylinder","sphere"],HA=["rect","polygon"],$A=["primitive","round","path","hollow"],GA=["width","height"],VA=["width","height","depth"],UA=["token","preset","flatShading","transparent","emissive"];function YA(t,e,n,i,s){return{polygon:"polygon"===e,width:n,depth:i,height:s,round:t.round,path:t.path,hollow:t.hollow}}function WA(t){return t.state}class qA extends iu{constructor(){super(...arguments),this._copies=[]}build(){super.build();const t=WA(this.component).primitive??"cube",e=HA.includes(t)?this.extrudedGeometry(t):this.unitGeometry(t);if(!e)return;const n=new M.Mesh(e,this.material());n.castShadow=!0,this.object3d.add(n),this._copies=[n],this.updateDimension()}clear(){return this._copies=[],super.clear()}applyRepeat(){const t=this._copies[0];if(!t)return;const e=this.repeatPlanNow();if(!e)return void this._copies.forEach((t,e)=>{t.visible=0===e,t.position.set(0,0,0)});for(;this._copies.length<e.count;){const e=new M.Mesh(t.geometry,t.material);e.castShadow=!0,this.object3d.add(e),this._copies.push(e)}const n=this.repeatUndo();this._copies.forEach((t,i)=>{t.visible=i<e.count,t.visible&&(NA.set(0,0,0),NA[e.axis]=QM(i,e.count,e.pitch),NA.applyQuaternion(n.turn),t.position.set(NA.x*n.scale.x,NA.y*n.scale.y,NA.z*n.scale.z))})}updateRotate(){super.updateRotate(),this.applyRepeat()}onchange(t,e){const n=e=>e.some(e=>e in t);n($A)||this.isExtruded&&n(this.isHollow?VA:GA)?this.update():(super.onchange(t,e),n(UA)&&this.applyMaterial(),n(["sizing","repeat"])&&this.applyRepeat())}get isExtruded(){return HA.includes(WA(this.component).primitive??"cube")}applyMaterial(){const t=this.material();for(const e of this._copies)e.material=t}repeatPlanNow(){const t=WA(this.component);if("repeat"!==t.sizing||!t.repeat)return null;const e=this.component.parent;if(!e)return null;const n={x:Number(e.get("width"))||0,y:Number(e.get("depth"))||0,z:Number(e.get("height"))||0};return XM(this.asMember(t),{x:1,y:1,z:1},n)}asMember(t){const e=this.component.state,n=t=>180*(t??0)/Math.PI;return{name:"",primitive:t.primitive??"cube",geometryKey:"",triangles:0,sizing:"repeat",repeat:t.repeat,transform:{position:{x:0,y:0,z:0},size:{x:Number(e.width)||0,y:this.effectiveDepth,z:Number(e.height)||0},rotation:{x:n(e.rotationX),y:-n(e.rotation),z:n(e.rotationY)}}}}repeatUndo(){const t=this.object3d,e=t=>Number.isFinite(t)&&0!==t?1/t:1;return{turn:t.quaternion.clone().invert(),scale:new M.Vector3(e(t.scale.x),e(t.scale.y),e(t.scale.z))}}updateScale(){super.updateScale(),this.applyRepeat()}syncFromObject3D(){super.syncFromObject3D(),this.applyRepeat()}applyDimensionFromGizmo(t){super.applyDimensionFromGizmo(t),this.applyRepeat()}unitGeometry(t){const e=WA(this.component);return"cylinder"===t||"sphere"===t?Mx.primitive({kind:t,segments:kx(e.segments,Sx[0])}):Mx.primitive({kind:"box"})}extrudedGeometry(t){const e=WA(this.component),{width:n=1,height:i=1}=this.component.state,s=e.hollow,r=YA(e,t,n,i,s&&this.component.state.depth||1),o="polygon"===t?`polygon|${JSON.stringify(r.path??[])}`:`rect|${n}x${i}|r${r.round??0}`,a=s?`figure-part|${o}|h${s.wall},${s.floor??s.wall}@${r.height}`:`figure-part|${o}`,c=Mx.shaped(a,()=>kw(r)??new M.BufferGeometry);return c.getAttribute("position")?c:null}material(){const t=WA(this.component),e=dd[t.preset??"default"]??dd.default,n=t.token?dS(t.token):uS,i=t.flatShading??!0,s=t.transparent??!1,r=t.emissive,o=r?.token?dS(r.token):n,a=r?.intensity??0;return Zv.material(`figure-part|${t.token??"-"}|${t.preset??"default"}|${i}|${s}|`+(r?`${r.token??"="}:${a}`:"-"),{color:o,metalness:e.metalness,roughness:e.roughness,envMapIntensity:e.envMapIntensity,flatShading:i,transparent:s,opacity:s?e.opacity??.3:1,emissive:o,emissiveIntensity:a})}get isHollow(){const t=WA(this.component).hollow;return!!t&&t.wall>0&&this.isExtruded}updateDimension(){const{width:t=1,height:e=1}=this.component.bounds,n=this.effectiveDepth,i=WA(this.component).primitive??"cube";this.isHollow?this.setDimensionScale(1,1,1):HA.includes(i)?this.setDimensionScale(1,n,1):this.setDimensionScale(t,n,e),this.applyRepeat()}}class XA extends(pc(dc)){static registerType(){hc.register("figure-part",XA)}get hasTextProperty(){return!1}is3dish(){return!0}get nature(){return FA}buildRealObject(){return new qA(this)}render(t){const{left:e=0,top:n=0,width:i=0,height:s=0}=this.state,r=WA(this);t.beginPath(),this.traceFootprint(t,r,e,n,i,s),t.fillStyle=r.token?dS(r.token):uS,t.fill()}traceFootprint(t,e,n,i,s,r){const o=e.primitive??"cube",a=n+s/2,c=i+r/2;if(BA.includes(o)){const n=dx(s/2,r/2,kx(e.segments,Sx[0])).points;t.moveTo(a+n[0].x,c+n[0].y);for(let e=1;e<n.length;e++)t.lineTo(a+n[e].x,c+n[e].y);return void t.closePath()}if(e.hollow&&e.hollow.wall>0){const n=zw(YA(e,o,s,r,1));if(n){for(const e of n)if(!(e.length<3)){t.moveTo(a+e[0].x,c+e[0].y);for(let n=1;n<e.length;n++)t.lineTo(a+e[n].x,c+e[n].y);t.closePath()}return}}if("polygon"===o){const n=e.path;if(!n||n.length<3)return;t.moveTo(a+n[0].x,c+n[0].y);for(let e=1;e<n.length;e++)t.lineTo(a+n[e].x,c+n[e].y);return void t.closePath()}const l=e.round??0;l>0&&"function"==typeof t.roundRect?t.roundRect(n,i,s,r,Math.min(l,s/2,r/2)):t.rect(n,i,s,r)}}var KA;XA.registerType(),t.Model=void 0,(KA=t.Model||(t.Model={})).compile=bl,KA.duplicate=_l,KA.select=La,KA.match=Ia,Ai.registerResidents(()=>({componentResidentsCount:hc.residentsCount,sceneResidentsCount:zu.residentsCount,referenceMapResidentsCount:Iv.residentsCount,sceneResidents:hc.residents}));var QA=Object.freeze({__proto__:null,AbsoluteLayout:xc,Animation:aa,AudioPlayer:Gy,BULGE_EPSILON:Pr,get Banner(){return t.Banner},Banner3D:Bx,BoxSelectionManager:bf,CAPABILITY_MIXINS:kA,COMMON_PLACEHOLDER_PROPERTIES:dy,CORE_PLACEHOLDER_TYPES:my,get Camera(){return t.Camera},Camera3D:Vx,CameraBookmarkManager:yf,CameraManager:ef,Capacity:Vb,CapacityEventTracker:Eb,CardLayout:Mc,CenteringQueueStrategy:Cb,CenteringSlotStrategy:dv,Component:hc,Connectable:Nf,Container:Wg,ContainerAbstract:Rl,ControlsManager:of,get Cube(){return t.Cube},Cube3D:jx,get Cylinder(){return t.Cylinder},Cylinder3D:Fx,DEFAULT:Ds,DEFAULT_CEILING:tu,DEFAULT_PALETTE:nS,DEFAULT_PLACEMENT:qd,DPPX:Ts,DataLagTracker:Bl,DataSource:bb,DefaultLoadingOverlayRenderer:Ad,Donut:cb,DonutExtrude:bx,Ellipse:ly,EllipseExtrude:fx,EventManager3D:af,EventMap:Kc,FIGURE_CAPABILITIES:EA,FIGURE_CAPABILITY_NOTES:CA,FPS:xp,FigureInstance:LA,FigurePart:XA,FigurePartRealObject:qA,FigureRealObject:hA,FixedSlotStrategy:Hb,get FloorPlate(){return t.FloorPlate},FlowEngine:Z_,FlowNode:ev,GESTURES:Ps,get GLTFObject(){return t.GLTFObject},GLTF_BASE_URL_ALIAS:vb,GenericObject:fy,GeometryBank:Mx,GifView:Hy,GizmoManager:lf,GizmoOperationManager:uf,GlobalRef:Qy,GltfComponent:wb,GridStacking:Ob,Group:Yy,HTMLAbsoluteLayout:vc,HTMLOverlayContainer:Xy,HTMLOverlayElement:Ty,Holdable:J_,ImageView:Cy,InfoWindow:yc,InstancedSet:yw,InteractionManager:pf,ItemsDataBinding:Bb,KEYEVENTS:Os,Layer:Ju,Layout:_c,LightManager:sf,LightObject:Wx,Line:ay,Line3D:fw,LinearHorizontalLayout:Ac,LinearVerticalLayout:kc,LoadTracker:Gl,LoadingOverlay:yd,LocalRef:qy,MATERIAL_PRESETS:dd,MAX_SEGMENTS:Ex,MAX_UNDO_SIZE:30,MIN_SEGMENTS:3,MODE_ADD:3,MODE_EDIT:1,MODE_PASTE_DATABIND:5,MODE_PASTE_STYLE:4,MODE_SHIFT:2,MODE_VIEW:0,MaterialBank:Zv,get Model(){return t.Model},MoveHandle:zl,NOTHING:ks,NavGraph:yv,Node:pb,OrthoLine:Ey,OrthoLine3D:gw,PIXEL_RATIO:wp,PLACEHOLDER_THEMES:hy,Path:ib,PatternStacking:Pb,PlacementManager:ff,get PointLight(){return t.PointLight},Polygon:_y,PolygonContainer:xy,PolygonExtrude:yx,PolygonPathPolyline:Sv,Polyline:Sy,Polyline3D:mw,Popup:tb,PopupContainer:nb,Pose6DOF:nl,REPEAT_LIMIT:KM,RealObject:iu,RealObjectCamera:xw,RealObjectDomElement:Pp,RealObjectDomTexture:qv,RealObjectDummy:_w,RealObjectExternalModel:ou,RealObjectExtrude:px,RealObjectGLTF:hu,RealObjectGroup:nw,RealObjectLine:pw,RealObjectMesh:Jv,RealObjectPlane:ww,RealObjectPlane2D:Aw,RealObjectScene:Mw,RealObjectService:fb,RealObjectSprite:Dx,RealObjectSprite2D:zx,RealObjectText:ox,Rect:$f,RectExtrude:mx,RectPath:pc,ReferenceMap:Iv,RendererManager:nf,ReservationTable:mv,RootContainer:Nl,Ruler:Vf,SCALE_MIN:Id,SCENE_MODE:Cs,SEGMENT_DEFAULTS:Ax,SEGMENT_PRESETS:Sx,SHORTCUT_SECTIONS:Of,Scene:zu,SceneManager:tf,ScenePopup:Zu,SceneSearchEngine:mu,ScriptLoader:Hv,SearchOverlay:yu,ServiceComponent:gb,Shape:dc,get Sphere(){return t.Sphere},Sphere3D:Ox,get Sprite(){return t.Sprite},Star:db,StarExtrude:vx,TRANSFER_SLOT_KEY:Fb,TableLayout:Cc,Text:Vy,ThreeCapability:Sf,get ThreeContainer(){return t.ThreeContainer},ThreeDOnly:_b,Tracker:_u,Transfer:Tu,TransitionEffect:Dl,Triangle:rb,TriangleExtrude:_x,UNIT_DIMENSION:Fd,UNIT_ROTATE:Hd,UNIT_SCALE:Nd,UNIT_TRANSLATE:Bd,UNTOKENED_COLOR:uS,ValueHolder:yb,VertexGizmoManager:Mf,VolumeStacking:Db,get Wall(){return t.Wall},Wall3D:Xx,Z_PRIORITY:Kd,acquireV3Geometry:xA,activePalette:hS,activePaletteName:lS,allDestinations:N_,anchorOf:zM,anchorsConnect:Kb,animate:oa,applyAlpha:jd,applyMaterial3dProps:md,applyPolicy:$_,applySeatingRotation:Lb,applyStackLayout:zb,applyZPriorityToMaterials:Zd,arcSegmentTopology:qb,autoWireBackPressure:kb,blueprintProblems:eS,buildArrow3D:Cp,buildContractInspector:Pv,buildCoordinateGround:Bp,buildFlowGraph:e_,buildNavGraph:vv,buildShapeFromPolygonPath:gx,buildTether:Gu,buildV3Geometry:MA,bulgeFromDrag:Ir,bulgeHandlePosition:zr,canReach:o_,capability:Sm,centerOnBBox:ux,chooseNearestPickupFrame:hv,clearTether:Uu,collectAdjacentSegments:d_,compile:la,componentForNode:F_,computeArcParams:Dr,computeFlowMap:E_,computeStackPositions:Tb,cornerHandlePosition:jr,cornerRadiusFromDrag:Lr,create:Ru,createCanvas:Mp,createCanvasTexture:Vv,createFloor:Qp,createRealObjectFor:Rp,createSelectionHandle3D:Zx,dataLagTracker:Hl,debug:$i,deliversInto:Jb,delta:sa,disposeCoordinateGround:Vp,disposeObject3D:Vd,disposeTether:Yu,downstream:U_,drawTextTexture:nx,effectiveCornerRadius:Rr,ellipseOutline:dx,enumerateDataScenarios:m_,error:Bi,figureClassFor:IA,figureTypes:wS,fillStyleOpacity:Rd,filterByToolType:lv,filterShortcuts:Df,findNearestWithCapability:T_,flattenPolygonPath:Av,flowGraphFor:j_,flowGraphIssues:R_,flowReverseFor:k_,fontStyle:tx,footprint2D:Ib,frameClock:yr,ftId:w_,ftrace:x_,getAllCapabilityMeta:Cm,getCapabilityMeta:km,getFigure:xS,getFigureV3:gA,getPose:al,getWorldPose:cl,globalSimClock:mr,gltfNatureProperties:xb,graphFor:X_,gridPlacements:bw,hasArc:Or,hasCapability:Mm,hasCapacity:Sb,hasFigure:MS,hasFigureV3:yA,inferCapacity:Ab,inferDownstreamId:u_,inferFlowDirections:v_,initFontFamilyWatcher:Is,innerOutlineOf:Dw,inspector:gd,installContractInspector:Ov,isFlowNode:nv,isGenericPlaceholder:gy,isGeometricHost:C_,isParted:su,isRoutingTarget:P_,isSegmentPreset:Tx,isStateDriven:Xd,isThreedEnabled:uu,jointOriginPosition:YM,matchOutbounds:t_,memberGeometry:jS,memberGeometryAtOrigin:FS,memberGeometryTurned:LS,mergedGeometryOf:NS,metrics:Ai,needsOwnMesh:FM,next:V_,nextHop:r_,nextHops:s_,nextHopsToAny:c_,nextHopsToAnyDetailed:l_,niceGridStep:Fp,nodeIdOf:B_,normalizeParameter:eA,opaqueColor:Ld,outlineOf:Tw,outlinesFor2D:zw,paletteVersion:oS,partAtByIndex:ru,pickWeightedDestination:Q_,planPathAStar:xv,planToReservations:wv,pointInRotatedRect:Qb,polygonOffsetForPriority:Qd,polygonPathLength:Ev,portsFromAnchors:DA,profileGeometry:kw,projectToScreen:Nu,pushed:Cw,quatFromYaw:sv,rayAbsDistanceToRect:Zb,reachableByOutbound:n_,reachableDestinations:Y_,reachableDestinationsFrom:W_,reachableDestinationsWeightedFrom:q_,reachableSinks:a_,receiptToJSON:ku,recommendsLogarithmicDepthForSky:Jp,rectFaceAnchors:Ub,rectOutline:hx,rectangularFootprintFrames:av,registerCapabilityMeta:Em,registerDefaultRealObjectFactory:Ip,registerFigure:_S,registerFigureType:vS,registerFigureV3:mA,registerPalette:aS,registerRealObjectFactory:zp,registerTypeResolver:yh,releaseV3Geometry:wA,renderCanvasTexture:Uv,renderPlaceholder:uy,repeatOffset:QM,repeatPlan:XM,reservationTable:gv,resetFigureClasses:RA,resetFigures:AS,resetFiguresV3:_A,resetPalettes:pS,resolveAnchorWorldPosition:$u,resolveHeightSegments:Cx,resolveMaterial3d:ud,resolveNextHop:G_,resolveSegments:kx,resolveToken:dS,resolveUnknownTypes:_h,resolveVariant:Od,rotatedExtent:BM,roundedRect:Ow,roundedRectXZ:Pw,sceneComponent:Mb,setActivePalette:cS,setPose:ll,setThreedEnabled:pu,setWorldPose:hl,sinksForDestination:L_,sizingPosition:UM,sizingScale:$M,slotsFromAnchors:OA,standardYieldPolicy:fv,stopFPSMeasure:vp,straightSegmentEndpoints:Wb,straightSegmentMultiInbound:Xb,straightSegmentTopology:Yb,stretchAxis:HM,sweepOf:sA,textBounds:rx,textTexture:ix,toThreeSide:fd,topApproachFrame:cv,transferLog:Pu,transferTracer:Au,uniformZ:Fr,unknownTypesOf:bh,unregisterFigure:SS,unregisterFigureV3:bA,updateDefaultFontFamily:zs,updateTether:Vu,useFigureComponent:gS,validate:K_,validateFlowGraph:h_,valueNow:nA,valueOf:iA,version:$v,warn:Hi});const ZA=globalThis;"undefined"==typeof globalThis||ZA.scene||(ZA.scene=QA),t.AbsoluteLayout=xc,t.Animation=aa,t.AudioPlayer=Gy,t.BULGE_EPSILON=Pr,t.Banner3D=Bx,t.BoxSelectionManager=bf,t.CAPABILITY_MIXINS=kA,t.COMMON_PLACEHOLDER_PROPERTIES=dy,t.CORE_PLACEHOLDER_TYPES=my,t.Camera3D=Vx,t.CameraBookmarkManager=yf,t.CameraManager=ef,t.Capacity=Vb,t.CapacityEventTracker=Eb,t.CardLayout=Mc,t.CenteringQueueStrategy=Cb,t.CenteringSlotStrategy=dv,t.Component=hc,t.Connectable=Nf,t.Container=Wg,t.ContainerAbstract=Rl,t.ControlsManager=of,t.Cube3D=jx,t.Cylinder3D=Fx,t.DEFAULT=Ds,t.DEFAULT_CEILING=tu,t.DEFAULT_PALETTE=nS,t.DEFAULT_PLACEMENT=qd,t.DPPX=Ts,t.DataLagTracker=Bl,t.DataSource=bb,t.DefaultLoadingOverlayRenderer=Ad,t.Donut=cb,t.DonutExtrude=bx,t.Ellipse=ly,t.EllipseExtrude=fx,t.EventManager3D=af,t.EventMap=Kc,t.FIGURE_CAPABILITIES=EA,t.FIGURE_CAPABILITY_NOTES=CA,t.FPS=xp,t.FigureInstance=LA,t.FigurePart=XA,t.FigurePartRealObject=qA,t.FigureRealObject=hA,t.FixedSlotStrategy=Hb,t.FlowEngine=Z_,t.FlowNode=ev,t.GESTURES=Ps,t.GLTF_BASE_URL_ALIAS=vb,t.GenericObject=fy,t.GeometryBank=Mx,t.GifView=Hy,t.GizmoManager=lf,t.GizmoOperationManager=uf,t.GlobalRef=Qy,t.GltfComponent=wb,t.GridStacking=Ob,t.Group=Yy,t.HTMLAbsoluteLayout=vc,t.HTMLOverlayContainer=Xy,t.HTMLOverlayElement=Ty,t.Holdable=J_,t.ImageView=Cy,t.InfoWindow=yc,t.InstancedSet=yw,t.InteractionManager=pf,t.ItemsDataBinding=Bb,t.KEYEVENTS=Os,t.Layer=Ju,t.Layout=_c,t.LightManager=sf,t.LightObject=Wx,t.Line=ay,t.Line3D=fw,t.LinearHorizontalLayout=Ac,t.LinearVerticalLayout=kc,t.LoadTracker=Gl,t.LoadingOverlay=yd,t.LocalRef=qy,t.MATERIAL_PRESETS=dd,t.MAX_SEGMENTS=Ex,t.MAX_UNDO_SIZE=30,t.MIN_SEGMENTS=3,t.MODE_ADD=3,t.MODE_EDIT=1,t.MODE_PASTE_DATABIND=5,t.MODE_PASTE_STYLE=4,t.MODE_SHIFT=2,t.MODE_VIEW=0,t.MaterialBank=Zv,t.MoveHandle=zl,t.NOTHING=ks,t.NavGraph=yv,t.Node=pb,t.OrthoLine=Ey,t.OrthoLine3D=gw,t.PIXEL_RATIO=wp,t.PLACEHOLDER_THEMES=hy,t.Path=ib,t.PatternStacking=Pb,t.PlacementManager=ff,t.Polygon=_y,t.PolygonContainer=xy,t.PolygonExtrude=yx,t.PolygonPathPolyline=Sv,t.Polyline=Sy,t.Polyline3D=mw,t.Popup=tb,t.PopupContainer=nb,t.Pose6DOF=nl,t.REPEAT_LIMIT=KM,t.RealObject=iu,t.RealObjectCamera=xw,t.RealObjectDomElement=Pp,t.RealObjectDomTexture=qv,t.RealObjectDummy=_w,t.RealObjectExternalModel=ou,t.RealObjectExtrude=px,t.RealObjectGLTF=hu,t.RealObjectGroup=nw,t.RealObjectLine=pw,t.RealObjectMesh=Jv,t.RealObjectPlane=ww,t.RealObjectPlane2D=Aw,t.RealObjectScene=Mw,t.RealObjectService=fb,t.RealObjectSprite=Dx,t.RealObjectSprite2D=zx,t.RealObjectText=ox,t.Rect=$f,t.RectExtrude=mx,t.RectPath=pc,t.ReferenceMap=Iv,t.RendererManager=nf,t.ReservationTable=mv,t.RootContainer=Nl,t.Ruler=Vf,t.SCALE_MIN=Id,t.SCENE_MODE=Cs,t.SEGMENT_DEFAULTS=Ax,t.SEGMENT_PRESETS=Sx,t.SHORTCUT_SECTIONS=Of,t.Scene=zu,t.SceneManager=tf,t.ScenePopup=Zu,t.SceneSearchEngine=mu,t.ScriptLoader=Hv,t.SearchOverlay=yu,t.ServiceComponent=gb,t.Shape=dc,t.Sphere3D=Ox,t.Star=db,t.StarExtrude=vx,t.TRANSFER_SLOT_KEY=Fb,t.TableLayout=Cc,t.Text=Vy,t.ThreeCapability=Sf,t.ThreeDOnly=_b,t.Tracker=_u,t.Transfer=Tu,t.TransitionEffect=Dl,t.Triangle=rb,t.TriangleExtrude=_x,t.UNIT_DIMENSION=Fd,t.UNIT_ROTATE=Hd,t.UNIT_SCALE=Nd,t.UNIT_TRANSLATE=Bd,t.UNTOKENED_COLOR=uS,t.ValueHolder=yb,t.VertexGizmoManager=Mf,t.VolumeStacking=Db,t.Wall3D=Xx,t.Z_PRIORITY=Kd,t.acquireV3Geometry=xA,t.activePalette=hS,t.activePaletteName=lS,t.allDestinations=N_,t.anchorOf=zM,t.anchorsConnect=Kb,t.animate=oa,t.applyAlpha=jd,t.applyMaterial3dProps=md,t.applyPolicy=$_,t.applySeatingRotation=Lb,t.applyStackLayout=zb,t.applyZPriorityToMaterials=Zd,t.arcSegmentTopology=qb,t.autoWireBackPressure=kb,t.blueprintProblems=eS,t.buildArrow3D=Cp,t.buildContractInspector=Pv,t.buildCoordinateGround=Bp,t.buildFlowGraph=e_,t.buildNavGraph=vv,t.buildShapeFromPolygonPath=gx,t.buildTether=Gu,t.buildV3Geometry=MA,t.bulgeFromDrag=Ir,t.bulgeHandlePosition=zr,t.canReach=o_,t.capability=Sm,t.centerOnBBox=ux,t.chooseNearestPickupFrame=hv,t.clearTether=Uu,t.collectAdjacentSegments=d_,t.compile=la,t.componentForNode=F_,t.computeArcParams=Dr,t.computeFlowMap=E_,t.computeStackPositions=Tb,t.cornerHandlePosition=jr,t.cornerRadiusFromDrag=Lr,t.create=Ru,t.createCanvas=Mp,t.createCanvasTexture=Vv,t.createFloor=Qp,t.createRealObjectFor=Rp,t.createSelectionHandle3D=Zx,t.dataLagTracker=Hl,t.debug=$i,t.deliversInto=Jb,t.delta=sa,t.disposeCoordinateGround=Vp,t.disposeObject3D=Vd,t.disposeTether=Yu,t.downstream=U_,t.drawTextTexture=nx,t.effectiveCornerRadius=Rr,t.ellipseOutline=dx,t.enumerateDataScenarios=m_,t.error=Bi,t.figureClassFor=IA,t.figureTypes=wS,t.fillStyleOpacity=Rd,t.filterByToolType=lv,t.filterShortcuts=Df,t.findNearestWithCapability=T_,t.flattenPolygonPath=Av,t.flowGraphFor=j_,t.flowGraphIssues=R_,t.flowReverseFor=k_,t.fontStyle=tx,t.footprint2D=Ib,t.frameClock=yr,t.ftId=w_,t.ftrace=x_,t.getAllCapabilityMeta=Cm,t.getCapabilityMeta=km,t.getFigure=xS,t.getFigureV3=gA,t.getPose=al,t.getWorldPose=cl,t.globalSimClock=mr,t.gltfNatureProperties=xb,t.graphFor=X_,t.gridPlacements=bw,t.hasArc=Or,t.hasCapability=Mm,t.hasCapacity=Sb,t.hasFigure=MS,t.hasFigureV3=yA,t.inferCapacity=Ab,t.inferDownstreamId=u_,t.inferFlowDirections=v_,t.initFontFamilyWatcher=Is,t.innerOutlineOf=Dw,t.inspector=gd,t.installContractInspector=Ov,t.isFlowNode=nv,t.isGenericPlaceholder=gy,t.isGeometricHost=C_,t.isParted=su,t.isRoutingTarget=P_,t.isSegmentPreset=Tx,t.isStateDriven=Xd,t.isThreedEnabled=uu,t.jointOriginPosition=YM,t.matchOutbounds=t_,t.memberGeometry=jS,t.memberGeometryAtOrigin=FS,t.memberGeometryTurned=LS,t.mergedGeometryOf=NS,t.metrics=Ai,t.needsOwnMesh=FM,t.next=V_,t.nextHop=r_,t.nextHops=s_,t.nextHopsToAny=c_,t.nextHopsToAnyDetailed=l_,t.niceGridStep=Fp,t.nodeIdOf=B_,t.normalizeParameter=eA,t.opaqueColor=Ld,t.outlineOf=Tw,t.outlinesFor2D=zw,t.paletteVersion=oS,t.partAtByIndex=ru,t.pickWeightedDestination=Q_,t.planPathAStar=xv,t.planToReservations=wv,t.pointInRotatedRect=Qb,t.polygonOffsetForPriority=Qd,t.polygonPathLength=Ev,t.portsFromAnchors=DA,t.profileGeometry=kw,t.projectToScreen=Nu,t.pushed=Cw,t.quatFromYaw=sv,t.rayAbsDistanceToRect=Zb,t.reachableByOutbound=n_,t.reachableDestinations=Y_,t.reachableDestinationsFrom=W_,t.reachableDestinationsWeightedFrom=q_,t.reachableSinks=a_,t.receiptToJSON=ku,t.recommendsLogarithmicDepthForSky=Jp,t.rectFaceAnchors=Ub,t.rectOutline=hx,t.rectangularFootprintFrames=av,t.registerCapabilityMeta=Em,t.registerDefaultRealObjectFactory=Ip,t.registerFigure=_S,t.registerFigureType=vS,t.registerFigureV3=mA,t.registerPalette=aS,t.registerRealObjectFactory=zp,t.registerTypeResolver=yh,t.releaseV3Geometry=wA,t.renderCanvasTexture=Uv,t.renderPlaceholder=uy,t.repeatOffset=QM,t.repeatPlan=XM,t.reservationTable=gv,t.resetFigureClasses=RA,t.resetFigures=AS,t.resetFiguresV3=_A,t.resetPalettes=pS,t.resolveAnchorWorldPosition=$u,t.resolveHeightSegments=Cx,t.resolveMaterial3d=ud,t.resolveNextHop=G_,t.resolveSegments=kx,t.resolveToken=dS,t.resolveUnknownTypes=_h,t.resolveVariant=Od,t.rotatedExtent=BM,t.roundedRect=Ow,t.roundedRectXZ=Pw,t.sceneComponent=Mb,t.setActivePalette=cS,t.setPose=ll,t.setThreedEnabled=pu,t.setWorldPose=hl,t.sinksForDestination=L_,t.sizingPosition=UM,t.sizingScale=$M,t.slotsFromAnchors=OA,t.standardYieldPolicy=fv,t.stopFPSMeasure=vp,t.straightSegmentEndpoints=Wb,t.straightSegmentMultiInbound=Xb,t.straightSegmentTopology=Yb,t.stretchAxis=HM,t.sweepOf=sA,t.textBounds=rx,t.textTexture=ix,t.toThreeSide=fd,t.topApproachFrame=cv,t.transferLog=Pu,t.transferTracer=Au,t.uniformZ=Fr,t.unknownTypesOf=bh,t.unregisterFigure=SS,t.unregisterFigureV3=bA,t.updateDefaultFontFamily=zs,t.updateTether=Vu,t.useFigureComponent=gS,t.validate=K_,t.validateFlowGraph=h_,t.valueNow=nA,t.valueOf=iA,t.version=$v,t.warn=Hi});
|
|
73
73
|
//# sourceMappingURL=things-scene-min.js.map
|