brep-io-kernel 1.0.196 → 1.0.197
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/apiExamples/BREP_Booleans.html +2 -2
- package/dist/apiExamples/BREP_Export.html +2 -2
- package/dist/apiExamples/BREP_Primitives.html +2 -2
- package/dist/apiExamples/BREP_Transforms.html +2 -2
- package/dist/apiExamples/Embeded_2D_Sketcher.html +2 -2
- package/dist/apiExamples/Embeded_CAD.html +2 -2
- package/dist/apiExamples/Embeded_CAD_Integration_Test.html +2 -2
- package/dist/assets/{SimulationWorkbenchManager-CZU2PaTA.js → SimulationWorkbenchManager-BlXiJ2tl.js} +121 -37
- package/dist/assets/{apiExample_BREP_Booleans-D4_za_tB.js → apiExample_BREP_Booleans-C2hoasf2.js} +1 -1
- package/dist/assets/{apiExample_BREP_Export-u2fTdaNT.js → apiExample_BREP_Export-B9OOBBCX.js} +1 -1
- package/dist/assets/{apiExample_BREP_Primitives-DAoWeXoq.js → apiExample_BREP_Primitives-Do8y8b_w.js} +1 -1
- package/dist/assets/{apiExample_BREP_Transforms-DFpbDf74.js → apiExample_BREP_Transforms-Dg6kSpF5.js} +1 -1
- package/dist/assets/{apiExample_Embeded_2D_Sketcher-BTLB-XJ1.js → apiExample_Embeded_2D_Sketcher-mfrI-BcL.js} +1 -1
- package/dist/assets/{apiExample_Embeded_CAD-BN7Rap4P.js → apiExample_Embeded_CAD-GLEJ5EGM.js} +1 -1
- package/dist/assets/{apiExample_Embeded_CAD_Integration_Test-Dl4HRxKv.js → apiExample_Embeded_CAD_Integration_Test-CsWfKgCS.js} +1 -1
- package/dist/assets/{brep-kernel-CTSjNzN4.js → brep-kernel-D6hhTKa0.js} +1 -1
- package/dist/assets/{browserTests-BeGjo-jd.js → browserTests-gCJmMaIE.js} +1 -1
- package/dist/assets/{index.es-DiqUPvrb.js → index.es-CN_DUH2L.js} +1 -1
- package/dist/assets/{javascript-Bao00j9Y.js → javascript-CamWQzyi.js} +1 -1
- package/dist/assets/{main-cad-A9axj9C3.js → main-cad-BgZQtzIN.js} +5 -5
- package/dist/assets/{test-BiekV37i.js → test-q3OlLTks.js} +3 -3
- package/dist/cad.html +1 -1
- package/dist/test.html +1 -1
- package/dist/viewer.html +1 -1
- package/dist-kernel/brep-kernel.js +1 -1
- package/package.json +1 -1
- package/src/simulation/SimulationWorkbenchManager.js +121 -37
|
@@ -15464,7 +15464,7 @@ ${t.map(o=>`${i}${o}`).join(`
|
|
|
15464
15464
|
`,document.head.appendChild(g)}c(syi,"Cki");r(syi,"ensureViewCubeCameraToggleStyles");const au=r(g=>{try{g()}catch{}},"safe");var WMA;const Iyi=(WMA=class{constructor(A){this.viewer=A,this._cleanup=[],this._hoverUpdateRaf=null,this._resizer=null,this._pinTab=null,this._hoverStrip=null}init(){const A=this.viewer;if(!A.sidebar||typeof document>"u"||!document.body)return;gyi(),oyi(),this.dispose();const e=r(y=>{const p=document.getElementById(y);p&&p.parentNode&&p.parentNode.removeChild(p)},"removeById");e("sidebar-resizer"),e("sidebar-pin-tab"),e("sidebar-hover-strip");const t=r((y,p,m,F)=>{y.addEventListener(p,m,F),this._cleanup.push(()=>y.removeEventListener(p,m,F))},"on"),i=10,o=document.createElement("div");o.id="sidebar-resizer",o.title="Drag to resize sidebar",o.setAttribute("aria-hidden","true"),o.style.width=`${i}px`,o.style.cursor="ew-resize",document.body.appendChild(o),this._resizer=o,A._sidebarResizer=o;const s=document.createElement("div");s.id="sidebar-hover-strip",s.setAttribute("aria-hidden","true"),document.body.appendChild(s),this._hoverStrip=s,A._sidebarHoverStrip=s;const I=document.createElement("button");I.id="sidebar-pin-tab",I.type="button",I.textContent="📌",I.setAttribute("aria-pressed","true"),I.title="Collapse sidebar",document.body.appendChild(I),this._pinTab=I,A._sidebarPinTab=I;const n=new Set;A._sidebarHoverTargets=n;const B=r(()=>{const y=A.sidebar;if(!y)return;const p=y.getBoundingClientRect();if(!A._isSidebarVisible()||p.width<=0||p.height<=0){o.style.display="none";return}o.style.display="",o.style.left=`${Math.round(p.right-i/2)}px`,o.style.top=`${Math.round(p.top)}px`,o.style.height=`${Math.round(p.height)}px`},"updateResizer"),C=r(()=>{B(),A._positionSidebarPinTab()},"syncLayout"),a=r(y=>{let p=Number(y);if(!Number.isFinite(p))return 200;const m=A.cadMaterialsUi?._widthInput,F=Number(m?.min)||200,f=Number(m?.max)||600;return p<F?p=F:p>f&&(p=f),Math.round(p)},"clampWidth"),Q=r(y=>{au(()=>{const p=UN(VNe,{fallback:""}),m=p?JSON.parse(p):{};m.__SIDEBAR_WIDTH__=y,HU(VNe,JSON.stringify(m,null,2))})},"persistWidthFallback"),E=r((y,{persist:p=!1}={})=>{const m=a(y);return A.cadMaterialsUi&&typeof A.cadMaterialsUi.setSidebarWidth=="function"?A.cadMaterialsUi.setSidebarWidth(m,{persist:p}):A.sidebar&&(A.sidebar.style.width=`${m}px`,p&&Q(m)),C(),m},"applyWidth"),l={active:!1,startX:0,startWidth:0,lastWidth:0,pointerId:null,prevCursor:"",prevUserSelect:""},h=r(y=>{y.button!==0||!A.sidebar||(y.preventDefault(),l.active=!0,l.startX=y.clientX,l.startWidth=A.sidebar.getBoundingClientRect().width,l.lastWidth=l.startWidth,l.pointerId=y.pointerId,l.prevCursor=document.body.style.cursor,l.prevUserSelect=document.body.style.userSelect,document.body.style.cursor="ew-resize",document.body.style.userSelect="none",o.classList.add("is-active"),au(()=>o.setPointerCapture(y.pointerId)))},"startDrag"),w=r(y=>{if(!l.active)return;const p=y.clientX-l.startX;l.lastWidth=E(l.startWidth+p)},"onDragMove"),d=r((y=!0)=>{if(!l.active)return;l.active=!1,o.classList.remove("is-active"),document.body.style.cursor=l.prevCursor||"",document.body.style.userSelect=l.prevUserSelect||"";const p=Number.isFinite(l.lastWidth)?l.lastWidth:l.startWidth;E(p,{persist:y}),l.pointerId!=null&&au(()=>o.releasePointerCapture(l.pointerId)),l.pointerId=null},"stopDrag");if(t(o,"pointerdown",h),t(o,"pointermove",w),t(o,"pointerup",()=>d(!0)),t(o,"pointercancel",()=>d(!1)),t(window,"pointerup",()=>d(!0),!0),t(window,"resize",C),this._cleanup.push(()=>au(()=>d(!1))),window.ResizeObserver){const y=new ResizeObserver(C);y.observe(A.sidebar),this._cleanup.push(()=>au(()=>y.disconnect()))}if(window.MutationObserver){const y=new MutationObserver(C);y.observe(A.sidebar,{attributes:!0,attributeFilter:["style","hidden","class"]}),this._cleanup.push(()=>au(()=>y.disconnect()))}const D=r(()=>{A._sidebarPinned||A._sidebarAutoHideSuspended||(this._hoverUpdateRaf!=null&&cancelAnimationFrame(this._hoverUpdateRaf),this._hoverUpdateRaf=requestAnimationFrame(()=>{this._hoverUpdateRaf=null,!(A._sidebarPinned||A._sidebarAutoHideSuspended)&&A._setSidebarHoverVisible(n.size>0)}))},"scheduleHoverUpdate"),u=r((y,p)=>{const m=y?.getBoundingClientRect?.();return!!(m&&p&&p.clientX>=m.left&&p.clientX<=m.right&&p.clientY>=m.top&&p.clientY<=m.bottom)},"isPointIn"),M=r((y,{captureSidebarOnLeave:p=!1,capturePinOnLeave:m=!1,requireSidebarVisible:F=!1}={})=>{if(!y)return;const f=r(()=>{F&&!A._isSidebarVisible()||(n.add(y),D())},"onEnter"),S=r(N=>{n.delete(y);const G=A._sidebarPinTab;if(m&&G){const Y=N?.relatedTarget;if(Y===G||G.contains?.(Y)){n.add(G),D();return}if(A._isSidebarVisible()&&u(G,N)){n.add(G),D();return}}p&&A.sidebar&&A._isSidebarVisible()&&u(A.sidebar,N)&&n.add(A.sidebar),D()},"onLeave");t(y,"pointerenter",f),t(y,"pointerleave",S)},"bindHover");M(s,{captureSidebarOnLeave:!0}),M(I,{captureSidebarOnLeave:!0,requireSidebarVisible:!0}),M(A.sidebar,{capturePinOnLeave:!0}),M(o,{captureSidebarOnLeave:!0,capturePinOnLeave:!0}),t(window,"pointermove",y=>{A._sidebarLastPointer={x:y.clientX,y:y.clientY}},{passive:!0}),t(I,"click",y=>{au(()=>{y.preventDefault(),y.stopPropagation()}),A._setSidebarPinned(!A._sidebarPinned)}),this._cleanup.push(()=>{this._hoverUpdateRaf!=null&&cancelAnimationFrame(this._hoverUpdateRaf),this._hoverUpdateRaf=null}),C(),A._syncSidebarVisibility()}dispose(){this._cleanup.forEach(t=>au(t)),this._cleanup.length=0,this._hoverUpdateRaf!=null&&cancelAnimationFrame(this._hoverUpdateRaf),this._hoverUpdateRaf=null;const A=this.viewer,e=r(t=>{t&&t.parentNode&&t.parentNode.removeChild(t)},"remove");e(this._resizer),e(this._hoverStrip),e(this._pinTab),A._sidebarResizer===this._resizer&&(A._sidebarResizer=null),A._sidebarHoverStrip===this._hoverStrip&&(A._sidebarHoverStrip=null),A._sidebarPinTab===this._pinTab&&(A._sidebarPinTab=null),A._sidebarHoverTargets=null,this._resizer=null,this._pinTab=null,this._hoverStrip=null}},c(WMA,"S1e2"),WMA);r(Iyi,"SidebarDockController");let wfg=Iyi;var _MA;const nyi=(_MA=class{constructor({container:A,viewSize:e=10,near:t=-1e7,far:i=1e7,pixelRatio:o=window.devicePixelRatio||1,clearColor:s=724240,clearAlpha:I=0,sidebar:n=null,partHistory:B=new BE,autoLoadLastModel:C=!1,viewerOnlyMode:a=!1,homeBannerUrl:Q="",homeBannerOpenInNewTab:E=!1}){if(!A)throw new Error("Viewer requires { container }");this.BREP=et,this.partHistory=B instanceof BE?B:new BE,this._autoLoadLastModel=!!C,this._viewerOnlyMode=!!a,this._homeBannerUrl=String(Q||"").trim(),this._homeBannerOpenInNewTab=!!E,this._triangleDebugger=null,this._lastInspectorTarget=null,this._lastInspectorSolid=null,this._workbenchReturnTarget=null,this._suspendWorkbenchReturn=!1,this._workbenchPanelRecords=new Map,this.simulationWorkbenchManager=null,this._simulationWorkbenchManagerPromise=null,this.container=A,this.sidebar=n,this._sidebarResizer=null,this._sidebarDockController=null,this._sidebarPinned=!0,this._sidebarHoverVisible=!1,this._sidebarAutoHideSuspended=!1,this._sidebarPinTab=null,this._sidebarHoverStrip=null,this._sidebarHoverTargets=null,this._sidebarStoredDisplay=null,this._sidebarStoredVisibility=null,this._sidebarStoredTransform=null,this._sidebarStoredPointerEvents=null,this._sidebarLastPointer=null,this._sidebarOffscreen=!1,this._sidebarHomeBanner=null,this._sidebarHomeBannerRO=null,this._sketchSidebarPrev=null,this.scene=B instanceof BE?B.scene:new Kw,this._axisHelpers=new Set,this._axisHelpersDirty=!0,this._axisHelperPx=CjA;try{this._worldAxisHelper=IYe({name:"__WORLD_AXES__",selectable:!1,axisHelperPx:this._axisHelperPx}),this._worldAxisHelper.userData=this._worldAxisHelper.userData||{},this._worldAxisHelper.userData.preventRemove=!0,this.scene.add(this._worldAxisHelper)}catch{}iyi();try{if(this.sidebar){const F=UN(VNe,{fallback:""});if(F)try{const f=JSON.parse(F),S=parseInt(f&&f.__SIDEBAR_WIDTH__);Number.isFinite(S)&&S>0&&(this.sidebar.style.width=`${S}px`)}catch{}}}catch{}this._sidebarDockController=new wfg(this),this._sidebarDockController.init(),this.pixelRatio=o,this._clearColor=new ct(s),this._clearAlpha=I,this._rendererMode="webgl",this._svgRenderer=null,this._webglRenderer=null,this._webglComposer=null,this._webglComposerRenderer=null,this._renderPass=null,this._solidFaceOutlinePass=null,this._solidFaceOutlineSelection=[],this._solidFaceOutlineEdgeMaskTarget=null,this._solidFaceOutlineDepthMaterial=null,this._forcePostProcessingDepth=0,this.renderer=this._createWebGLRenderer(),this._webglRenderer=this.renderer,this.container.appendChild(this.renderer.domElement),this.viewSize=e;const{width:l,height:h}=this._getContainerSize(),w=l/h||1;this.camera=new PVe(-e*w,e*w,e,-e,t,i),this._defaultNear=t,this._defaultFar=i,this._defaultPerspectiveNear=.01,this._perspectiveFov=50,this._cameraProjectionToggleButton=null,this._onCameraProjectionToggleClick=F=>{try{F?.preventDefault?.()}catch{}try{F?.stopPropagation?.()}catch{}this.toggleCameraProjection()};const d=5,D=Math.max(15,e*1.4),u=new dLA(16777215,1),M=new GGe(16777215,3355443,.25),y=[[-20,-20,-20],[-1,1,-1],[1,-1,-1],[-1,-1,1]],p=y.map(()=>{const F=new YGe(16777215,d);return F.distance=0,F.decay=0,F});p.forEach(F=>this.camera.add(F)),this.camera.add(u),this.camera.add(M),this._cameraLightRig={pointLights:p,lightDirections:y,baseLightRadius:D},this._updateCameraLightRig();try{this.camera.userData={...this.camera.userData||{},preventRemove:!0}}catch{}if(this.camera.parent!==this.scene)try{this.scene.add(this.camera)}catch{}try{this.partHistory.camera=this.camera}catch{}this.camera.position.set(15,12,15),this.camera.up.set(0,1,0),this.camera.lookAt(0,0,0),this.controls=new CCe(this.camera,this.renderer.domElement,this.scene),this.controls.enableAnimations=!1,this.controls.setGizmosVisible(!1),this.controls.minDistance=.01,this._configureCameraIdleCallbacks(),this._pointerDown=!1,this._downButton=0,this._downPos={x:0,y:0},this._dragThreshold=5,this._raf=null,this._disposed=!1,this._sketchMode=null,this._splineMode=null,this._pmiPreviewMode=null,this._imageEditorActive=!1,this._sheet2DEditorActive=!1,this._cameraMoving=!1,this._sceneBoundsCache=null,this._lastPointerEvent=null,this._lastDashWpp=null,this._selectionOverlay=null,this._hoverRefreshRaf=null,this._cubeActive=!1,this._inspectorOpen=!1,this._inspectorEl=null,this._inspectorContent=null,this._inspectorLinkedWindows=new Set,this._inspectorLinkedWindowSeed=0,this._pendingToolbarButtons=[],this._componentTransformSession=null,this._assemblyConstraintsVisible=null,this.raycaster=new aM,this.raycaster.near=0,this.raycaster.far=1/0;try{this.raycaster.params.Line=this.raycaster.params.Line||{}}catch{}try{this.raycaster.params.Line2=this.raycaster.params.Line2||{}}catch{}this._lastCanvasPointerDownAt=0,this._selectionOverlayTimer=null,this._pendingSelectionOverlay=null,this._onPointerMove=this._onPointerMove.bind(this),this._onPointerDown=this._onPointerDown.bind(this),this._onPointerUp=this._onPointerUp.bind(this),this._onContextMenu=this._onContextMenu.bind(this),this._onResize=this._onResize.bind(this),this._onControlsChange=this._onControlsChange.bind(this),this._loop=this._loop.bind(this),this._updateHover=this._updateHover.bind(this),this._selectAt=this._selectAt.bind(this),this._onHoverChanged=this._onHoverChanged.bind(this),this._onPointerLeave=()=>{try{tt.clearHover()}catch{}try{this.viewCube?.clearHover?.()}catch{}this._lastPointerEvent=null},this._onPointerEnter=F=>{this._lastPointerEvent=F};const m=this.renderer.domElement;this._attachRendererEvents(m),tt.viewer=this;try{tt.startClickWatcher(this)}catch{}if(this._viewerOnlyMode){try{tt._selectionFilterIndicator?.remove?.()}catch{}try{tt._selectionFilterIndicator=null}catch{}try{tt._selectionActionBar?.remove?.()}catch{}try{tt._selectionActionBar=null}catch{}}else try{tt._ensureSelectionFilterIndicator?.(this)}catch{}window.addEventListener("pointerup",this._onPointerUp,{passive:!1,capture:!0}),window.addEventListener("resize",this._onResize),this._onKeyDown=this._onKeyDown.bind(this),window.addEventListener("keydown",this._onKeyDown,{passive:!1}),window.addEventListener("hover-changed",this._onHoverChanged),this.controls.addEventListener("change",this._onControlsChange),this.SelectionFilter=tt,this.annotationRegistry=tE,this._ensureViewCube(),this._resizeRendererToDisplaySize(),this._loop(),this.ready=this.setupAccordion()}_createWebGLRenderer(){const A=new yLA({antialias:!0,alpha:!0,preserveDrawingBuffer:!0});return A.setClearColor(this._clearColor,this._clearAlpha),A.setPixelRatio(this.pixelRatio||1),this._applyRendererElementStyles(A),A}_createSvgRenderer(){const A=new lQt;return A.setQuality("high"),A.setClearColor(this._clearColor),this._applyRendererElementStyles(A),A}_disposeWebglPostProcessing(){try{this._webglComposer?.dispose?.()}catch{}try{this._solidFaceOutlinePass?.dispose?.()}catch{}try{this._renderPass?.dispose?.()}catch{}try{this._solidFaceOutlineEdgeMaskTarget?.dispose?.()}catch{}try{this._solidFaceOutlineDepthMaterial?.dispose?.()}catch{}this._webglComposer=null,this._webglComposerRenderer=null,this._renderPass=null,this._solidFaceOutlinePass=null,this._solidFaceOutlineEdgeMaskTarget=null,this._solidFaceOutlineDepthMaterial=null}_patchOutlinePassHiddenEdgeAlpha(A){const e=A?.edgeDetectionMaterial;if(!e||e.userData?.__transparentHiddenEdgesPatched)return;const t=e.fragmentShader||"",i="gl_FragColor = vec4(edgeColor, 1.0) * vec4(d);";t.includes(i)&&(e.fragmentShader=t.replace(i,["float edgeAlpha = 1.0 - visibilityFactor > 0.001 ? 1.0 : 0.0;","gl_FragColor = vec4(edgeColor, edgeAlpha) * vec4(d);"].join(`
|
|
15465
15465
|
`)),e.userData={...e.userData||{},__transparentHiddenEdgesPatched:!0},e.needsUpdate=!0)}_patchOutlinePassPerFaceRendering(A){if(!A||A.userData?.__perFaceRenderingPatched)return;const e=typeof A.render=="function"?A.render.bind(A):null;e&&(A.render=(t,i,o,s,I)=>{const n=Array.isArray(A.selectedObjects)?A.selectedObjects.filter(Boolean):[];if(n.length<=1){e(t,i,o,s,I);return}const B=A.selectedObjects,C=A.renderToScreen;try{for(let a=0;a<n.length;a+=1)A.selectedObjects=[n[a]],A.renderToScreen=C&&a===n.length-1,e(t,i,o,s,I)}finally{A.selectedObjects=B,A.renderToScreen=C}},A.userData={...A.userData||{},__perFaceRenderingPatched:!0})}_patchOutlinePassSolidOverlay(A){const e=A?.overlayMaterial;if(!e||e.userData?.__solidOverlayPatched)return;const t=e.fragmentShader||"";let i=t;i.includes("uniform sampler2D edgeMaskTexture;")||(i=i.replace("uniform sampler2D patternTexture;",`uniform sampler2D patternTexture;
|
|
15466
15466
|
uniform sampler2D edgeMaskTexture;`)),i=i.replace(/vec4 edgeValue = edgeValue1 \+ edgeValue2 \* edgeGlow;[\s\S]*?gl_FragColor = finalColor;/,["vec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;","float edgeSignal = max(max(edgeValue.r, edgeValue.g), max(edgeValue.b, edgeValue.a));","float edgeMask = smoothstep(0.02, 0.08, edgeSignal);","vec4 realEdgeSample = texture2D(edgeMaskTexture, vUv);","float realEdgeSignal = max(max(realEdgeSample.r, realEdgeSample.g), max(realEdgeSample.b, realEdgeSample.a));","float realEdgeMask = 1.0 - smoothstep(0.02, 0.12, realEdgeSignal);","float finalAlpha = min(1.0, edgeStrength * maskColor.r * edgeMask) * realEdgeMask;","vec3 finalRgb = edgeSignal > 1e-5 ? (edgeValue.rgb / edgeSignal) : vec3(0.0);","vec4 finalColor = vec4(finalRgb, finalAlpha);","if(usePatternTexture)"," finalColor += vec4(vec3(visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r)), 0.0);","gl_FragColor = finalColor;"].join(`
|
|
15467
|
-
`)),i!==t&&(e.uniforms={...e.uniforms||{},edgeMaskTexture:{value:null}},e.fragmentShader=i,e.blending=cR,e.userData={...e.userData||{},__solidOverlayPatched:!0},e.needsUpdate=!0)}_ensureWebglPostProcessing(){if(!(!this.renderer?.isWebGLRenderer||!this.scene||!this.camera)){if(!this._webglComposer||this._webglComposerRenderer!==this.renderer){this._disposeWebglPostProcessing();const{width:A,height:e}=this._getContainerSize(),t=typeof this.renderer.getPixelRatio=="function"?Math.max(1,Number(this.renderer.getPixelRatio())||1):1,i=new GHi(this.renderer),o=new RHi(this.scene,this.camera),s=new QqA(new Ye(A,e),this.scene,this.camera,[]),I=new qn(Math.max(1,Math.round(A*t)),Math.max(1,Math.round(e*t)));I.texture.name="Viewer.SolidFaceOutlineEdgeMask",I.texture.generateMipmaps=!1;const n=new RfA;n.side=co,n.colorWrite=!1,n.depthWrite=!0,n.depthTest=!0,n.blending=Ec,s.downSampleRatio=1,s.visibleEdgeColor.set(16776960),s.hiddenEdgeColor.set(0),s.edgeGlow=0,s.edgeThickness=1,s.edgeStrength=3,this._patchOutlinePassHiddenEdgeAlpha(s),this._patchOutlinePassPerFaceRendering(s),this._patchOutlinePassSolidOverlay(s),i.addPass(o),i.addPass(s),typeof i.setPixelRatio=="function"&&typeof this.renderer.getPixelRatio=="function"&&i.setPixelRatio(this.renderer.getPixelRatio()),i.setSize(A,e),s.setSize(A,e),this._webglComposer=i,this._webglComposerRenderer=this.renderer,this._renderPass=o,this._solidFaceOutlinePass=s,this._solidFaceOutlineEdgeMaskTarget=I,this._solidFaceOutlineDepthMaterial=n}this._renderPass&&(this._renderPass.scene=this.scene,this._renderPass.camera=this.camera),this._solidFaceOutlinePass&&(this._solidFaceOutlinePass.renderScene=this.scene,this._solidFaceOutlinePass.renderCamera=this.camera,this._solidFaceOutlinePass.overlayMaterial?.uniforms?.edgeMaskTexture&&(this._solidFaceOutlinePass.overlayMaterial.uniforms.edgeMaskTexture.value=this._solidFaceOutlineEdgeMaskTarget?.texture||null))}}_isObjectEffectivelyVisible(A){let e=A;for(;e;){if(e.visible===!1)return!1;e=e.parent}return!0}_collectSolidFaceOutlineObjects(){const A=this._solidFaceOutlineSelection||[];A.length=0;const e=this.scene;return e&&e.traverse(t=>{if(!t||t.type!=="SOLID"||!this._isObjectEffectivelyVisible(t))return;const i=Array.isArray(t.children)?t.children:[];for(const o of i)!o||o.type!=="FACE"||!o.isMesh||this._isObjectEffectivelyVisible(o)&&A.push(o)}),A}_renderSolidFaceOutlineEdgeMask(){this._ensureWebglPostProcessing();const A=this.renderer,e=this.scene,t=this.camera,i=this._solidFaceOutlineEdgeMaskTarget,o=this._solidFaceOutlineDepthMaterial;if(!A?.isWebGLRenderer||!e||!t||!i||!o)return;const s=new Map;e.traverse(l=>{l&&s.set(l,l.visible!==!1)});const I=r(l=>{e.traverse(h=>{if(h){if(s.get(h)===!1){h.visible=!1;return}if(h.isMesh||h.isLine||h.isLine2||h.isLineSegments||h.isLineLoop||h.isPoints||h.isSprite){h.visible=!!l(h);return}h.visible=!0}})},"applyRenderableVisibility"),n=new ct;A.getClearColor(n);const B=A.getClearAlpha(),C=A.autoClear,a=typeof A.getRenderTarget=="function"?A.getRenderTarget():null,Q=e.background,E=e.overrideMaterial;try{e.background=null,A.autoClear=!0,A.setRenderTarget(i),A.setClearColor(0,0),A.clear(!0,!0,!0),I(l=>l.isMesh),e.overrideMaterial=o,A.render(e,t),I(l=>l?.type!=="EDGE"||l.userData?.auxEdge?!1:l.material?.depthTest!==!1),e.overrideMaterial=null,A.render(e,t)}finally{e.overrideMaterial=E,e.background=Q,s.forEach((l,h)=>{h&&(h.visible=l)}),A.setRenderTarget(a),A.setClearColor(n,B),A.autoClear=C}}_syncSolidFaceOutlinePass(){if(this._ensureWebglPostProcessing(),!this._solidFaceOutlinePass)return;const A=Co?.EDGE?.BASE?.color;A&&typeof this._solidFaceOutlinePass.visibleEdgeColor?.copy=="function"&&this._solidFaceOutlinePass.visibleEdgeColor.copy(A);const e=Number(Co?.EDGE?.BASE?.linewidth);Number.isFinite(e)&&e>0&&(this._solidFaceOutlinePass.edgeThickness=e*.5),this._solidFaceOutlinePass.selectedObjects=this._collectSolidFaceOutlineObjects()}async withForcedPostProcessing(A){if(typeof A!="function")return null;this._forcePostProcessingDepth=Math.max(0,Number(this._forcePostProcessingDepth)||0)+1;try{return await A()}finally{this._forcePostProcessingDepth=Math.max(0,(Number(this._forcePostProcessingDepth)||1)-1);try{this.render()}catch{}}}_applyRendererElementStyles(A){const e=A?.domElement;e&&(e.style.display="block",e.style.outline="none",e.style.userSelect="none",e.style.width="100%",e.style.height="100%",e.style.background=this._clearAlpha===0?"transparent":this._clearColor.getStyle())}_attachRendererEvents(A){A&&(A.addEventListener("pointermove",this._onPointerMove,{passive:!0}),A.addEventListener("pointerleave",this._onPointerLeave,{passive:!0}),A.addEventListener("pointerenter",this._onPointerEnter,{passive:!0}),A.addEventListener("pointerdown",this._onPointerDown,{passive:!1}),A.addEventListener("contextmenu",this._onContextMenu))}_detachRendererEvents(A){A&&(A.removeEventListener("pointermove",this._onPointerMove),A.removeEventListener("pointerleave",this._onPointerLeave),A.removeEventListener("pointerenter",this._onPointerEnter),A.removeEventListener("pointerdown",this._onPointerDown),A.removeEventListener("contextmenu",this._onContextMenu))}_rebuildControls(A){const e=this.controls,t=e?{target:e.target?e.target.clone():null,enabled:e.enabled,minDistance:e.minDistance,maxDistance:e.maxDistance,enableAnimations:e.enableAnimations}:null;try{e?.removeEventListener?.("change",this._onControlsChange)}catch{}try{e?.dispose?.()}catch{}const i=new CCe(this.camera,A,this.scene);i.enableAnimations=t?!!t.enableAnimations:!1,i.setGizmosVisible(!1),i.minDistance=t&&Number.isFinite(t.minDistance)?t.minDistance:.01,t&&Number.isFinite(t.maxDistance)&&(i.maxDistance=t.maxDistance),t?.target&&i.target.copy(t.target),typeof t?.enabled=="boolean"&&(i.enabled=t.enabled),this.controls=i}_onCameraMove(){this.sidebar&&(this.sidebar.style.opacity=.9),this._cameraMoving=!0,this._updateDepthRange()}_onCameraIdle(){this.sidebar&&(this.sidebar.style.opacity=.9),this._cameraMoving=!1,this.scene.traverse(A=>{const e=A&&A.geometry;if(e&&typeof e.computeBoundingSphere=="function")try{e.computeBoundingSphere()}catch{}}),this._updateDepthRange();try{this.render()}catch{}}_configureCameraIdleCallbacks(){try{this.camera?.disableIdleCallbacks?.()}catch{}try{this.camera?.attachControls?.(this.controls)}catch{}if(typeof this.camera?.enableIdleCallbacks=="function")try{this.camera.enableIdleCallbacks({controls:this.controls,idleMs:300,onMove:r(()=>this._onCameraMove(),"onMove"),onIdle:r(()=>this._onCameraIdle(),"onIdle")})}catch{}}_syncActiveTransformGizmosForCamera({resetSize:A=!1}={}){const e=this.camera||null,t=this.renderer?.domElement||null,i=r((n,B=null)=>{if(!n)return;let C=!1;try{typeof n.setCamera=="function"?(n.setCamera(e,{resetSize:A,refresh:!1}),C=!0):e&&(n.camera=e)}catch{}try{typeof n.setDomElement=="function"?n.setDomElement(t):t&&(n.domElement=t)}catch{}if(A&&!C)try{typeof n.resetSize=="function"?n.resetSize():typeof n.setSize=="function"&&n.setSize(2)}catch{}try{typeof B=="function"?B():typeof n.update=="function"?n.update():n.updateMatrixWorld?.(!0)}catch{}},"applyGizmoCamera"),o=r((n,B="cameraChangeHandler",C="cameraChangeSource")=>{if(!n)return;const a=n[B];if(typeof a!="function")return;const Q=n[C];if(Q&&Q!==this.controls&&typeof Q.removeEventListener=="function")try{Q.removeEventListener("change",a)}catch{}if(this.controls&&typeof this.controls.addEventListener=="function")try{this.controls.addEventListener("change",a)}catch{}n[C]=this.controls||null},"rebindCameraChange"),s=this._componentTransformSession;s?.controls&&(i(s.controls,s.globalState?.updateForCamera||null),o(s,"cameraChangeHandler","cameraChangeSource"));const I=AE?.getActiveTransformState?.()||AE?.__activeXform||null;I?.viewer===this&&I.controls&&(i(I.controls,I.controlsChangeHandler||null),o(I,"controlsChangeHandler","controlsChangeSource"));try{const n=typeof window<"u"?window.__BREP_activeXform:null;n?.viewer===this&&n.controls&&i(n.controls,n.updateForCamera||null)}catch{}}_refreshCameraProjectionToggleButton(){const A=this._cameraProjectionToggleButton;if(!A||!this.camera)return;const e=!!this.camera.isOrthographicCamera;A.textContent=e?"ORTHO":"PERSP",A.classList.toggle("is-perspective",!e),A.title=e?"Switch to perspective camera":"Switch to orthographic camera",A.setAttribute("aria-label",A.title)}_positionCameraProjectionToggle(){const A=this._cameraProjectionToggleButton;if(!A)return;if(!this.viewCube||this._rendererMode!=="webgl"){A.style.display="none";return}const e=this.viewCube?._viewportRect?.();if(!e){A.style.display="none";return}A.style.display="";const t=Math.max(10,Math.round(e.xCss-10)),i=Math.round(e.yCss+e.h-8);A.style.left=`${t}px`,A.style.top=`${i}px`}_ensureCameraProjectionToggle(){if(!(!this.container||typeof document>"u")){if(!this._cameraProjectionToggleButton){syi();const A=document.createElement("button");A.type="button",A.className="viewcube-camera-toggle",A.addEventListener("click",this._onCameraProjectionToggleClick),A.addEventListener("pointerdown",e=>{try{e.stopPropagation()}catch{}});try{window.getComputedStyle(this.container)?.position==="static"&&(this.container.style.position="relative")}catch{}this.container.appendChild(A),this._cameraProjectionToggleButton=A}this._refreshCameraProjectionToggleButton(),this._positionCameraProjectionToggle()}}setCameraProjection(A="orthographic"){if(!this.camera)return!1;const e=String(A||"").toLowerCase().startsWith("pers")?"perspective":"orthographic";if(e==="perspective"?this.camera.isPerspectiveCamera:this.camera.isOrthographicCamera)return this._refreshCameraProjectionToggleButton(),this._positionCameraProjectionToggle(),!0;const t=this.camera,i=this.controls?.target?.clone?.()||new j(0,0,0),{width:o,height:s}=this._getContainerSize(),I=Math.max(1e-6,o/Math.max(1,s));let n=null;if(e==="perspective"){const C=Number.isFinite(this._perspectiveFov)?this._perspectiveFov:50,a=Math.max(1e-4,Number(this._defaultPerspectiveNear)||.01),Q=Math.max(100,Number(t.far)||Math.abs(this._defaultFar)||1e6);n=new yC(C,I,a,Q);let E=t.position.distanceTo(i);if(t.isOrthographicCamera){const h=typeof t.zoom=="number"&&t.zoom>0?t.zoom:1,w=Math.abs((Number(t.top)-Number(t.bottom))/h),d=Math.tan(Nt.degToRad(C)*.5);Number.isFinite(w)&&w>1e-6&&Number.isFinite(d)&&d>1e-6&&(E=w*.5/d)}(!Number.isFinite(E)||E<1e-4)&&(E=10);const l=t.position.clone().sub(i);if(l.lengthSq()<1e-12)try{t.getWorldDirection(l),l.multiplyScalar(-1)}catch{l.set(1,1,1)}l.normalize(),n.position.copy(i).addScaledVector(l,E),n.up.copy(t.up),n.lookAt(i),n.zoom=typeof t.zoom=="number"&&t.zoom>0?t.zoom:1,this._perspectiveFov=C}else{let C=this.viewSize*2;if(t.isPerspectiveCamera){const E=Math.max(1e-6,t.position.distanceTo(i)),l=Nt.degToRad(Number(t.fov)||50),h=typeof t.zoom=="number"&&t.zoom>0?t.zoom:1,w=2*Math.tan(l*.5)*E/h;Number.isFinite(w)&&w>1e-6&&(C=w),this._perspectiveFov=Number.isFinite(t.fov)?t.fov:this._perspectiveFov}else if(t.isOrthographicCamera){const E=typeof t.zoom=="number"&&t.zoom>0?t.zoom:1,l=Math.abs((Number(t.top)-Number(t.bottom))/E);Number.isFinite(l)&&l>1e-6&&(C=l)}const a=Math.max(1e-6,C*.5),Q=a*I;n=new PVe(-Q,Q,a,-a,this._defaultNear,this._defaultFar),n.zoom=1,this.viewSize=a,n.position.copy(t.position),n.quaternion.copy(t.quaternion),n.up.copy(t.up)}if(!n)return!1;try{t.disableIdleCallbacks?.()}catch{}const B=Array.isArray(t.children)?t.children.filter(C=>C?.isLight):[];for(const C of B){try{t.remove(C)}catch{}try{n.add(C)}catch{}}try{n.userData={...t.userData||{},preventRemove:!0}}catch{}try{this.scene.add(n)}catch{}try{this.scene.remove(t)}catch{}this.camera=n;try{this.partHistory.camera=n}catch{}this._rebuildControls(this.renderer.domElement);try{this.controls?.addEventListener?.("change",this._onControlsChange)}catch{}try{this.controls?.target?.copy?.(i)}catch{}return this._configureCameraIdleCallbacks(),this._syncActiveTransformGizmosForCamera({resetSize:!0}),this.viewCube&&(this.viewCube.targetCamera=this.camera,this.viewCube.controls=this.controls),this._resizeRendererToDisplaySize(),this._updateDepthRange(),this._refreshCameraProjectionToggleButton(),this._positionCameraProjectionToggle(),this.render(),!0}toggleCameraProjection(){const A=this.camera?.isOrthographicCamera?"perspective":"orthographic";return this.setCameraProjection(A)}_ensureViewCube(){if(this.viewCube&&this.viewCube.renderer===this.renderer){this.viewCube.targetCamera=this.camera,this.viewCube.controls=this.controls,this._ensureCameraProjectionToggle();return}try{this.viewCube?.dispose?.()}catch{}this.viewCube=new cfg({renderer:this.renderer,targetCamera:this.camera,controls:this.controls,size:110,margin:25}),this._ensureCameraProjectionToggle()}setRendererMode(A){const e=A==="svg"?"svg":"webgl";if(e===this._rendererMode&&this.renderer)return;this._rendererMode=e;try{this._stopComponentTransformSession?.()}catch{}const t=this.renderer?.domElement;this._detachRendererEvents(t),t&&t.parentNode&&t.parentNode.removeChild(t);let i=null;e==="svg"?(this._svgRenderer||(this._svgRenderer=this._createSvgRenderer()),i=this._svgRenderer):(this._webglRenderer||(this._webglRenderer=this._createWebGLRenderer()),i=this._webglRenderer),this.renderer=i,this._applyRendererElementStyles(this.renderer),this.container.appendChild(this.renderer.domElement),this._attachRendererEvents(this.renderer.domElement),this._rebuildControls(this.renderer.domElement);try{this.controls?.addEventListener?.("change",this._onControlsChange)}catch{}if(this._configureCameraIdleCallbacks(),this._syncActiveTransformGizmosForCamera({resetSize:!1}),e==="webgl")this._ensureWebglPostProcessing(),this._ensureViewCube();else{try{this.viewCube?.dispose?.()}catch{}this.viewCube=null,this._positionCameraProjectionToggle()}try{this.renderer.domElement.style.marginTop="0px"}catch{}this._resizeRendererToDisplaySize(),this.render()}_setSidebarAutoHideSuspended(A){const e=!!A;this._sidebarAutoHideSuspended!==e&&(this._sidebarAutoHideSuspended=e,this._syncSidebarVisibility())}_setSidebarPinned(A){const e=!!A;this._sidebarPinned!==e&&(this._sidebarPinned=e,!e&&this._sidebarAutoHideSuspended&&(this._sidebarAutoHideSuspended=!1),e?this._sidebarHoverVisible=!1:(this._sidebarHoverTargets&&this._sidebarHoverTargets.clear(),this._sidebarHoverVisible=!1),this._syncSidebarVisibility())}_setSidebarHoverVisible(A){const e=!!A;this._sidebarHoverVisible!==e&&(this._sidebarHoverVisible=e,this._syncSidebarVisibility())}_refreshSidebarHoverTargetsFromPointer(){const A=this._sidebarHoverTargets,e=this._sidebarLastPointer;if(!A||!e)return;A.clear();const{x:t,y:i}=e,o=r((s,I=!1)=>{if(!s||I&&!this._isSidebarVisible())return;const n=s.getBoundingClientRect?s.getBoundingClientRect():null;!n||n.width<=0||n.height<=0||t>=n.left&&t<=n.right&&i>=n.top&&i<=n.bottom&&A.add(s)},"addIfHit");o(this._sidebarHoverStrip),o(this._sidebarPinTab,!0),o(this.sidebar,!0),o(this._sidebarResizer,!0)}_getSidebarShouldShow(){return this.sidebar?this._sidebarAutoHideSuspended||this._sidebarPinned?!0:!!this._sidebarHoverVisible:!1}_isSidebarVisible(){return this.sidebar?!this._sidebarOffscreen&&!this.sidebar.hidden&&this.sidebar.style.display!=="none"&&this.sidebar.style.visibility!=="hidden":!1}_setSidebarElementVisible(A){if(!this.sidebar)return;const e=this._isSidebarVisible();try{this.sidebar.hidden&&(this.sidebar.hidden=!1)}catch{}if(this.sidebar.style.display==="none")if(this._sidebarStoredDisplay!=null)this.sidebar.style.display=this._sidebarStoredDisplay;else{try{this.sidebar.style.removeProperty("display")}catch{}this.sidebar.style.display=this.sidebar.style.display||""}if(this.sidebar.style.visibility==="hidden"){const t=this._sidebarStoredVisibility;this.sidebar.style.visibility=t&&t!=="hidden"?t:"visible"}if(A){if(!e){if(this._sidebarStoredTransform!=null)this.sidebar.style.transform=this._sidebarStoredTransform;else{try{this.sidebar.style.removeProperty("transform")}catch{}this.sidebar.style.transform=this.sidebar.style.transform||""}if(this._sidebarStoredPointerEvents!=null)this.sidebar.style.pointerEvents=this._sidebarStoredPointerEvents;else{try{this.sidebar.style.removeProperty("pointer-events")}catch{}this.sidebar.style.pointerEvents=this.sidebar.style.pointerEvents||""}}this.sidebar.style.opacity=.9,this.sidebar.style.zIndex=String(7),this._sidebarOffscreen=!1}else this._sidebarOffscreen||(this._sidebarStoredDisplay=this.sidebar.style.display||"",this._sidebarStoredVisibility=this.sidebar.style.visibility||"",this._sidebarStoredTransform=this.sidebar.style.transform||"",this._sidebarStoredPointerEvents=this.sidebar.style.pointerEvents||""),this.sidebar.style.transform="translateX(calc(-100% - 12px))",this.sidebar.style.pointerEvents="none",this._sidebarOffscreen=!0;try{this.mainToolbar?._positionWithSidebar?.()}catch{}}_updateSidebarDockUI(){const A=this._sidebarPinTab,e=this._sidebarHoverStrip,t=!!this._sidebarPinned,i=!t&&!this._sidebarAutoHideSuspended;A&&(A.classList.toggle("is-pinned",t),A.setAttribute("aria-pressed",t?"true":"false"),A.textContent="📌",A.title=t?"Collapse sidebar":"Pin sidebar"),e&&(e.classList.toggle("is-active",i),e.style.pointerEvents=i?"auto":"none"),this._positionSidebarPinTab()}_positionSidebarPinTab(){const A=this._sidebarPinTab;if(!A)return;let e=0,t=72;const i=this.sidebar?.getBoundingClientRect?.();if(i&&i.width>0&&(e=Math.max(0,Math.round(i.right-1))),i&&i.height>0){const o=A.getBoundingClientRect?A.getBoundingClientRect().height:A.offsetHeight,s=i.top+(i.height-(o||0))/2;Number.isFinite(s)&&(t=Math.max(0,Math.round(s)))}A.style.left=`${e}px`,A.style.top=`${t}px`}_syncSidebarVisibility(){const A=this._getSidebarShouldShow();this._setSidebarElementVisible(A),this._updateSidebarDockUI()}_syncSidebarHomeBannerHeight(){const A=this._sidebarHomeBanner;if(!A)return;const e=`${hfg}px`;A.style.height=e,A.style.minHeight=e,A.style.maxHeight=e}_bindSidebarHomeBannerHeightSync(){try{this._sidebarHomeBannerRO?.disconnect?.()}catch{}this._sidebarHomeBannerRO=null}_ensureSidebarHomeBanner(){if(!this.sidebar||typeof document>"u")return;const A=!!this._homeBannerUrl;let e=this._sidebarHomeBanner;if(!e||!e.isConnected){try{const o=this.sidebar.querySelector(".cad-sidebar-home-banner");o&&o.parentNode&&o.parentNode.removeChild(o)}catch{}e=document.createElement("button"),e.type="button",e.className="cad-sidebar-home-banner",e.title=A?"Open BREP.io":"Back to workspace",e.setAttribute("aria-label",A?"Open BREP.io":"Back to workspace"),e.addEventListener("click",o=>{if(o.preventDefault(),o.stopPropagation(),this._homeBannerUrl){try{const s=this._homeBannerOpenInNewTab?"_blank":"_self",I=window.open(this._homeBannerUrl,s,this._homeBannerOpenInNewTab?"noopener,noreferrer":"noopener");if(I&&this._homeBannerOpenInNewTab)try{I.opener=null}catch{}}catch{try{window.location.href=this._homeBannerUrl}catch{}}return}sLe(this)});const t=document.createElement("span");t.className="cad-sidebar-home-banner-img",t.setAttribute("aria-hidden","true"),t.innerHTML=x8i;const i=t.querySelector("svg");i&&i.setAttribute("focusable","false"),e.appendChild(t),this.sidebar.prepend(e),this._sidebarHomeBanner=e}else e.parentNode!==this.sidebar&&this.sidebar.prepend(e);this._syncSidebarHomeBannerHeight()}async setupAccordion(){if((!this._viewerOnlyMode||this._homeBannerUrl)&&this._ensureSidebarHomeBanner(),this.accordion=await new NGt,await this.sidebar.appendChild(this.accordion.uiElement),!this._viewerOnlyMode)try{await TRt(this)}catch(B){console.warn("Plugin auto-load failed:",B)}const A=new zqi(this,{autoLoadLast:this._autoLoadLastModel});if(this.fileManagerWidget=A,this.partHistory.callbacks.run=async B=>{},this.partHistory.callbacks.reset=async()=>{},this.partHistory.callbacks.afterRunHistory=()=>{this._refreshAssemblyConstraintsPanelVisibility(),this.refreshWorkbenchUi(),this.applyMetadataColors(),this._axisHelpersDirty=!0,this._syncWireHarnessRoutesFromHistoryState({reason:"after-run-history"})},this.partHistory.callbacks.afterReset=()=>{this._refreshAssemblyConstraintsPanelVisibility(),this.refreshWorkbenchUi(),this.applyMetadataColors(),this._axisHelpersDirty=!0,this.clearWireHarnessRoutes({reason:"after-reset"})},this._viewerOnlyMode){this.sceneManagerUi=await new CWe(this.scene,{onSelection:r(B=>this._applySelectionTarget(B,{triggerOnClick:!1,allowDiagnostics:!1}),"onSelection"),onRender:r(()=>this.render(),"onRender")}),await(await this.accordion.addSection("Scene Manager")).uiElement.appendChild(this.sceneManagerUi.uiElement),this.pmiViewsWidget=new iv(this,{readOnly:!0}),(await this.accordion.addSection("PMI Views")).uiElement.appendChild(this.pmiViewsWidget.uiElement),this.sheet2DWidget=new aWe(this,{readOnly:!0}),(await this.accordion.addSection("2D Sheets")).uiElement.appendChild(this.sheet2DWidget.uiElement),this.cadMaterialsUi=await new w4e(this),await(await this.accordion.addSection("Display Settings")).uiElement.appendChild(this.cadMaterialsUi.uiElement),this._pluginUiReady=!1,await this.accordion.collapseAll(),await this.accordion.expandSection("Scene Manager"),await this.accordion.expandSection("PMI Views"),await this.accordion.expandSection("2D Sheets"),this._refreshAssemblyConstraintsPanelVisibility(),this._syncSidebarHomeBannerHeight(),this._bindSidebarHomeBannerHeightSync();try{this.renderer.domElement.style.marginTop="0px"}catch{}return}this.historyWidget=await new I5i(this),await(await this.accordion.addSection("History")).uiElement.appendChild(await this.historyWidget.uiElement),this.assemblyConstraintsWidget=new O8i(this),this._assemblyConstraintsSection=await this.accordion.addSection(sb),this._assemblyConstraintsSection.uiElement.appendChild(this.assemblyConstraintsWidget.uiElement),this._registerWorkbenchPanel({id:"assemblyConstraints",title:sb,section:this._assemblyConstraintsSection,source:"builtin"}),this.expressionsManager=await new V8i(this),await(await this.accordion.addSection("Expressions")).uiElement.appendChild(await this.expressionsManager.uiElement),this.sceneManagerUi=await new CWe(this.scene,{onSelection:r(B=>this._applySelectionTarget(B,{triggerOnClick:!1,allowDiagnostics:!1}),"onSelection"),onRender:r(()=>this.render(),"onRender")}),await(await this.accordion.addSection("Scene Manager")).uiElement.appendChild(this.sceneManagerUi.uiElement),this.pmiViewsWidget=new iv(this);const e=await this.accordion.addSection("PMI Views");e.uiElement.appendChild(this.pmiViewsWidget.uiElement),this._registerWorkbenchPanel({id:"pmiViews",title:"PMI Views",section:e,source:"builtin",workbenches:["MODELING","IMPORT","SURFACING","SHEET_METAL","ASSEMBLIES","WIRE_HARNESS","PMI","ALL"]}),this.sheet2DWidget=new aWe(this);const t=await this.accordion.addSection("2D Sheets");t.uiElement.appendChild(this.sheet2DWidget.uiElement),this._registerWorkbenchPanel({id:"sheets2D",title:"2D Sheets",section:t,source:"builtin",workbenches:["MODELING","IMPORT","SURFACING","SHEET_METAL","ASSEMBLIES","WIRE_HARNESS","PMI","ALL"]}),this.wireHarnessConnectionsWidget=new lfg(this);const i=await this.accordion.addSection("Wire Harness");i.uiElement.appendChild(this.wireHarnessConnectionsWidget.uiElement),this._registerWorkbenchPanel({id:"wireHarnessConnections",title:"Wire Harness",section:i,source:"builtin"}),this.simulationHistoryWidget=new L5i(this);const o=await this.accordion.addSection("Simulation");o.uiElement.appendChild(this.simulationHistoryWidget.uiElement),this._registerWorkbenchPanel({id:"simulationHistory",title:"Simulation",section:o,source:"builtin",workbenches:["SIMULATION"]}),this.cadMaterialsUi=await new w4e(this);const s=await this.accordion.addSection("Display Settings");await s.uiElement.appendChild(this.cadMaterialsUi.uiElement),this._registerWorkbenchPanel({id:"displaySettings",title:"Display Settings",section:s,source:"builtin",workbenches:["MODELING","IMPORT","SURFACING","SHEET_METAL","ASSEMBLIES","WIRE_HARNESS","PMI","ALL"]}),this._pluginUiReady=!0;try{const B=Array.isArray(this._pendingSidePanels)?this._pendingSidePanels:[];this._pendingSidePanels=[];for(const C of B)try{await this._applyPluginSidePanel(C)}catch{}}catch{}const I=await this.accordion.addSection("Plugins"),n=new r5i(this);I.uiElement.appendChild(n.uiElement),this._registerWorkbenchPanel({id:"plugins",title:"Plugins",section:I,source:"builtin",workbenches:["MODELING","IMPORT","SURFACING","SHEET_METAL","ASSEMBLIES","WIRE_HARNESS","PMI","ALL"]}),await this.accordion.collapseAll(),await this.accordion.expandSection("Scene Manager"),await this.accordion.expandSection("History"),this._getActiveWorkbenchId()==="ASSEMBLIES"&&await this.accordion.expandSection(sb),await this.accordion.expandSection("PMI Views"),this._refreshAssemblyConstraintsPanelVisibility(),this._refreshWorkbenchPanelVisibility(),this.mainToolbar=new fGt(this);try{uMi(this)}catch{}try{JMi(this)}catch{}try{tt.refreshSelectionActions?.()}catch{}try{const B=Array.isArray(this._pendingToolbarButtons)?this._pendingToolbarButtons:[];this._pendingToolbarButtons=[];for(const C of B)try{this.mainToolbar.addCustomButton(C)}catch{}}catch{}try{this.refreshWorkbenchUi()}catch{}this.clearWireHarnessRoutes({reason:"setup-accordion"}),this._syncSidebarHomeBannerHeight(),this._bindSidebarHomeBannerHeightSync();try{this.renderer.domElement.style.marginTop="0px"}catch{}try{await zxt(this)}catch{}}_getActiveWorkbenchId(){return hRe(this.partHistory)}setActiveWorkbench(A,e={}){const t=this._getActiveWorkbenchId(),i=DQt(this.partHistory,hE(A,t));if(t===i)return!1;if(i==="SIMULATION")try{tt.SetSelectionTypes([tt.SOLID])}catch{}return i!=="PMI"&&(this._workbenchReturnTarget=null),this.refreshWorkbenchUi(),e.queueHistorySnapshot!==!1&&this.partHistory?.queueHistorySnapshot?.({debounceMs:0,reason:"workbench"}),!0}_setWorkbenchReturnTarget(A=null){this._workbenchReturnTarget=A?hE(A,null):null}_restoreWorkbenchAfterPMI(){if(this._suspendWorkbenchReturn)return!1;const A=this._workbenchReturnTarget;return this._workbenchReturnTarget=null,A?this.setActiveWorkbench(A,{queueHistorySnapshot:!0}):!1}async _ensureSimulationWorkbenchManager(){return this.simulationWorkbenchManager?this.simulationWorkbenchManager:this._simulationWorkbenchManagerPromise?this._simulationWorkbenchManagerPromise:(this._simulationWorkbenchManagerPromise=(async()=>{try{const A=new URL("data:text/javascript;base64,aW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnOwppbXBvcnQgeyBDb21iaW5lZFRyYW5zZm9ybUNvbnRyb2xzIH0gZnJvbSAnLi4vVUkvY29udHJvbHMvQ29tYmluZWRUcmFuc2Zvcm1Db250cm9scy5qcyc7Cgpjb25zdCBGSVhFRF9NRVRBREFUQV9LRVkgPSAnZml4ZWQnOwpjb25zdCBUUkFOU0ZPUk1fTUVUQURBVEFfS0VZID0gJ3NpbXVsYXRpb25UcmFuc2Zvcm0nOwpjb25zdCBTSU1fUFJPWFlfUFJFRklYID0gJ19fU0lNX1BST1hZX18nOwpjb25zdCBWSEFDRF9PUFRJT05TID0gT2JqZWN0LmZyZWV6ZSh7CiAgbWF4SHVsbHM6IDY0LAogIHZveGVsUmVzb2x1dGlvbjogMTAwMDAwMCwKICBtYXhWZXJ0aWNlc1Blckh1bGw6IDY0LAogIHNocmlua1dyYXA6IHRydWUsCiAgZmlsbE1vZGU6ICdmbG9vZCcsCiAgZmluZEJlc3RQbGFuZTogdHJ1ZSwKICBtaW5FZGdlTGVuZ3RoOiAxLAogIG1lc3NhZ2VzOiAnbm9uZScsCn0pOwpjb25zdCBERUZBVUxUX1RSQU5TRk9STSA9IE9iamVjdC5mcmVlemUoewogIHBvc2l0aW9uOiBbMCwgMCwgMF0sCiAgcm90YXRpb25FdWxlcjogWzAsIDAsIDBdLAp9KTsKCmZ1bmN0aW9uIGNsb25lVmVjMyh2YWx1ZSwgZmFsbGJhY2sgPSBbMCwgMCwgMF0pIHsKICBjb25zdCBzcmMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogZmFsbGJhY2s7CiAgcmV0dXJuIFsKICAgIE51bWJlci5pc0Zpbml0ZShOdW1iZXIoc3JjWzBdKSkgPyBOdW1iZXIoc3JjWzBdKSA6IGZhbGxiYWNrWzBdLAogICAgTnVtYmVyLmlzRmluaXRlKE51bWJlcihzcmNbMV0pKSA/IE51bWJlcihzcmNbMV0pIDogZmFsbGJhY2tbMV0sCiAgICBOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHNyY1syXSkpID8gTnVtYmVyKHNyY1syXSkgOiBmYWxsYmFja1syXSwKICBdOwp9CgpmdW5jdGlvbiBub3JtYWxpemVUZXh0KHZhbHVlLCBmYWxsYmFjayA9ICcnKSB7CiAgY29uc3QgbmV4dCA9IFN0cmluZyh2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZSkudHJpbSgpOwogIHJldHVybiBuZXh0IHx8IGZhbGxiYWNrOwp9CgpmdW5jdGlvbiBub3JtYWxpemVUcmFuc2Zvcm0odmFsdWUpIHsKICBjb25zdCByYXcgPSB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdmFsdWUgOiB7fTsKICByZXR1cm4gewogICAgcG9zaXRpb246IGNsb25lVmVjMyhyYXcucG9zaXRpb24sIERFRkFVTFRfVFJBTlNGT1JNLnBvc2l0aW9uKSwKICAgIHJvdGF0aW9uRXVsZXI6IGNsb25lVmVjMyhyYXcucm90YXRpb25FdWxlciwgREVGQVVMVF9UUkFOU0ZPUk0ucm90YXRpb25FdWxlciksCiAgfTsKfQoKZnVuY3Rpb24gdHJhbnNmb3JtSXNJZGVudGl0eSh0cmFuc2Zvcm0pIHsKICBjb25zdCBwb3NpdGlvbiA9IGNsb25lVmVjMyh0cmFuc2Zvcm0/LnBvc2l0aW9uLCBERUZBVUxUX1RSQU5TRk9STS5wb3NpdGlvbik7CiAgY29uc3Qgcm90YXRpb25FdWxlciA9IGNsb25lVmVjMyh0cmFuc2Zvcm0/LnJvdGF0aW9uRXVsZXIsIERFRkFVTFRfVFJBTlNGT1JNLnJvdGF0aW9uRXVsZXIpOwogIHJldHVybiBwb3NpdGlvbi5ldmVyeSgodmFsdWUpID0+IE1hdGguYWJzKHZhbHVlKSA8PSAxZS05KQogICAgJiYgcm90YXRpb25FdWxlci5ldmVyeSgodmFsdWUpID0+IE1hdGguYWJzKHZhbHVlKSA8PSAxZS05KTsKfQoKZnVuY3Rpb24gY29weUxvY2FsUG9zZShvYmplY3QpIHsKICByZXR1cm4gewogICAgcG9zaXRpb246IG9iamVjdC5wb3NpdGlvbi5jbG9uZSgpLAogICAgcXVhdGVybmlvbjogb2JqZWN0LnF1YXRlcm5pb24uY2xvbmUoKSwKICAgIHNjYWxlOiBvYmplY3Quc2NhbGUuY2xvbmUoKSwKICB9Owp9CgpmdW5jdGlvbiBidWlsZExvY2FsTWF0cml4KHBvc2UpIHsKICByZXR1cm4gbmV3IFRIUkVFLk1hdHJpeDQoKS5jb21wb3NlKAogICAgcG9zZS5wb3NpdGlvbi5jbG9uZSgpLAogICAgcG9zZS5xdWF0ZXJuaW9uLmNsb25lKCksCiAgICBwb3NlLnNjYWxlLmNsb25lKCksCiAgKTsKfQoKZnVuY3Rpb24gcG9zZVRvT2Zmc2V0KGJhc2VQb3NlLCBjdXJyZW50T2JqZWN0KSB7CiAgY29uc3QgYmFzZU1hdHJpeCA9IGJ1aWxkTG9jYWxNYXRyaXgoYmFzZVBvc2UpOwogIGNvbnN0IGN1cnJlbnRNYXRyaXggPSBuZXcgVEhSRUUuTWF0cml4NCgpLmNvbXBvc2UoCiAgICBjdXJyZW50T2JqZWN0LnBvc2l0aW9uLmNsb25lKCksCiAgICBjdXJyZW50T2JqZWN0LnF1YXRlcm5pb24uY2xvbmUoKSwKICAgIGN1cnJlbnRPYmplY3Quc2NhbGUuY2xvbmUoKSwKICApOwogIGNvbnN0IHJlbGF0aXZlID0gbmV3IFRIUkVFLk1hdHJpeDQoKS5jb3B5KGJhc2VNYXRyaXgpLmludmVydCgpLm11bHRpcGx5KGN1cnJlbnRNYXRyaXgpOwogIGNvbnN0IHBvc2l0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKTsKICBjb25zdCBxdWF0ZXJuaW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTsKICBjb25zdCBzY2FsZSA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7CiAgcmVsYXRpdmUuZGVjb21wb3NlKHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSk7CiAgY29uc3Qgcm90YXRpb25FdWxlciA9IG5ldyBUSFJFRS5FdWxlcigpLnNldEZyb21RdWF0ZXJuaW9uKHF1YXRlcm5pb24sICdYWVonKTsKICByZXR1cm4gewogICAgcG9zaXRpb246IFtwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56XSwKICAgIHJvdGF0aW9uRXVsZXI6IFtyb3RhdGlvbkV1bGVyLngsIHJvdGF0aW9uRXVsZXIueSwgcm90YXRpb25FdWxlci56XSwKICB9Owp9CgpmdW5jdGlvbiBub3JtYWxpemVNZXNoQXJyYXlzKG1lc2gpIHsKICBpZiAoIW1lc2gpIHJldHVybiBudWxsOwogIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDMsIE51bWJlcihtZXNoLm51bVByb3ApIHx8IDMpOwogIGNvbnN0IHNvdXJjZVBvc2l0aW9ucyA9IEFycmF5LmlzQXJyYXkobWVzaC52ZXJ0UHJvcGVydGllcykgPyBtZXNoLnZlcnRQcm9wZXJ0aWVzIDogQXJyYXkuZnJvbShtZXNoLnZlcnRQcm9wZXJ0aWVzIHx8IFtdKTsKICBjb25zdCBzb3VyY2VJbmRpY2VzID0gQXJyYXkuaXNBcnJheShtZXNoLnRyaVZlcnRzKSA/IG1lc2gudHJpVmVydHMgOiBBcnJheS5mcm9tKG1lc2gudHJpVmVydHMgfHwgW10pOwogIGlmIChzb3VyY2VQb3NpdGlvbnMubGVuZ3RoIDwgOSB8fCBzb3VyY2VJbmRpY2VzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsOwogIGNvbnN0IHBvc2l0aW9ucyA9IG5ldyBGbG9hdDY0QXJyYXkoKHNvdXJjZVBvc2l0aW9ucy5sZW5ndGggLyBzdHJpZGUpICogMyk7CiAgZm9yIChsZXQgc3JjID0gMCwgZHN0ID0gMDsgc3JjICsgMiA8IHNvdXJjZVBvc2l0aW9ucy5sZW5ndGg7IHNyYyArPSBzdHJpZGUsIGRzdCArPSAzKSB7CiAgICBwb3NpdGlvbnNbZHN0ICsgMF0gPSBOdW1iZXIoc291cmNlUG9zaXRpb25zW3NyYyArIDBdKSB8fCAwOwogICAgcG9zaXRpb25zW2RzdCArIDFdID0gTnVtYmVyKHNvdXJjZVBvc2l0aW9uc1tzcmMgKyAxXSkgfHwgMDsKICAgIHBvc2l0aW9uc1tkc3QgKyAyXSA9IE51bWJlcihzb3VyY2VQb3NpdGlvbnNbc3JjICsgMl0pIHx8IDA7CiAgfQogIHJldHVybiB7CiAgICBwb3NpdGlvbnMsCiAgICBpbmRpY2VzOiBuZXcgVWludDMyQXJyYXkoc291cmNlSW5kaWNlcyksCiAgfTsKfQoKZnVuY3Rpb24gYnVpbGRQcm94eU1hdGVyaWFsKGJhc2VDb2xvciwgaW5kZXgsIHRvdGFsKSB7CiAgY29uc3QgY29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoYmFzZUNvbG9yIHx8ICcjOWNhM2FmJyk7CiAgY29uc3QgaHNsID0geyBoOiAwLCBzOiAwLCBsOiAwIH07CiAgY29sb3IuZ2V0SFNMKGhzbCk7CiAgY29uc3Qgb2Zmc2V0ID0gdG90YWwgPiAxID8gKGluZGV4IC8gTWF0aC5tYXgoMSwgdG90YWwpKSAqIDAuMTggOiAwOwogIGNvbG9yLnNldEhTTCgoaHNsLmggKyBvZmZzZXQpICUgMSwgTWF0aC5taW4oMSwgTWF0aC5tYXgoMC4zNSwgaHNsLnMgfHwgMC41NSkpLCBNYXRoLm1pbigwLjcyLCBNYXRoLm1heCgwLjQyLCBoc2wubCkpKTsKICByZXR1cm4gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsKICAgIGNvbG9yLAogICAgdHJhbnNwYXJlbnQ6IHRydWUsCiAgICBvcGFjaXR5OiAwLjU1LAogICAgcm91Z2huZXNzOiAwLjU1LAogICAgbWV0YWxuZXNzOiAwLjA1LAogICAgZGVwdGhXcml0ZTogdHJ1ZSwKICB9KTsKfQoKZnVuY3Rpb24gZGlzcG9zZUhpZXJhcmNoeShyb290KSB7CiAgaWYgKCFyb290Py50cmF2ZXJzZSkgcmV0dXJuOwogIHJvb3QudHJhdmVyc2UoKG5vZGUpID0+IHsKICAgIGlmIChub2RlPy5nZW9tZXRyeT8uZGlzcG9zZSkgewogICAgICB0cnkgeyBub2RlLmdlb21ldHJ5LmRpc3Bvc2UoKTsgfSBjYXRjaCB7fQogICAgfQogICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZT8ubWF0ZXJpYWwpKSB7CiAgICAgIGZvciAoY29uc3QgbWF0ZXJpYWwgb2Ygbm9kZS5tYXRlcmlhbCkgewogICAgICAgIHRyeSB7IG1hdGVyaWFsPy5kaXNwb3NlPy4oKTsgfSBjYXRjaCB7fQogICAgICB9CiAgICB9IGVsc2UgewogICAgICB0cnkgeyBub2RlPy5tYXRlcmlhbD8uZGlzcG9zZT8uKCk7IH0gY2F0Y2gge30KICAgIH0KICB9KTsKfQoKZXhwb3J0IGNsYXNzIFNpbXVsYXRpb25Xb3JrYmVuY2hNYW5hZ2VyIHsKICBjb25zdHJ1Y3Rvcih2aWV3ZXIpIHsKICAgIHRoaXMudmlld2VyID0gdmlld2VyIHx8IG51bGw7CiAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTsKICAgIHRoaXMuX2Jhc2VMb2NhbFBvc2UgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9ydW50aW1lU3RhdGUgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9zb3VyY2VWaXNpYmlsaXR5ID0gbmV3IE1hcCgpOwogICAgdGhpcy5fZGVjb21wb3NpdGlvbkNhY2hlID0gbmV3IE1hcCgpOwogICAgdGhpcy5fcHJveHlHcm91cHMgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl90cmFuc2Zvcm1TZXNzaW9uID0gbnVsbDsKICAgIHRoaXMuX3JhcGllciA9IG51bGw7CiAgICB0aGlzLl9yYXBpZXJMb2FkUHJvbWlzZSA9IG51bGw7CiAgICB0aGlzLl92aGFjZCA9IG51bGw7CiAgICB0aGlzLl92aGFjZExvYWRQcm9taXNlID0gbnVsbDsKICAgIHRoaXMuX3BoeXNpY3NXb3JsZCA9IG51bGw7CiAgICB0aGlzLl9ib2R5U3RhdGUgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9saXN0ZW5lcnMgPSBuZXcgU2V0KCk7CiAgICB0aGlzLl9yZW1vdmVTdGF0ZU1hbmFnZXJMaXN0ZW5lciA9IG51bGw7CiAgICB0aGlzLl9pc1BsYXlpbmcgPSBmYWxzZTsKICAgIHRoaXMuX21vdGlvblN0YXRlID0gbmV3IE1hcCgpOwogICAgdGhpcy5fbW92ZWRTb2xpZElkcyA9IG5ldyBTZXQoKTsKICAgIHRoaXMuX3JhZiA9IDA7CiAgICB0aGlzLl9sYXN0U3RlcFRpbWUgPSAwOwogICAgdGhpcy5fc2NyYXRjaCA9IHsKICAgICAgcGFyZW50SW52ZXJzZTogbmV3IFRIUkVFLk1hdHJpeDQoKSwKICAgICAgcGFyZW50V29ybGRNYXRyaXg6IG5ldyBUSFJFRS5NYXRyaXg0KCksCiAgICAgIGxvY2FsTWF0cml4OiBuZXcgVEhSRUUuTWF0cml4NCgpLAogICAgICB3b3JsZE1hdHJpeDogbmV3IFRIUkVFLk1hdHJpeDQoKSwKICAgICAgZGVsdGFNYXRyaXg6IG5ldyBUSFJFRS5NYXRyaXg0KCksCiAgICAgIHdvcmxkUG9zaXRpb246IG5ldyBUSFJFRS5WZWN0b3IzKCksCiAgICAgIGxvY2FsUG9zaXRpb246IG5ldyBUSFJFRS5WZWN0b3IzKCksCiAgICAgIHdvcmxkUXVhdGVybmlvbjogbmV3IFRIUkVFLlF1YXRlcm5pb24oKSwKICAgICAgcGFyZW50UXVhdGVybmlvbjogbmV3IFRIUkVFLlF1YXRlcm5pb24oKSwKICAgICAgcGFyZW50UXVhdGVybmlvbkludmVyc2U6IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCksCiAgICAgIGJveDogbmV3IFRIUkVFLkJveDMoKSwKICAgICAgY2VudGVyOiBuZXcgVEhSRUUuVmVjdG9yMygpLAogICAgICBheGlzOiBuZXcgVEhSRUUuVmVjdG9yMygpLAogICAgICB0cmFuc2xhdGlvbjogbmV3IFRIUkVFLlZlY3RvcjMoKSwKICAgIH07CiAgICB0aGlzLl9iaW5kU3RhdGVNYW5hZ2VyKCk7CiAgfQoKICBkaXNwb3NlKCkgewogICAgaWYgKHR5cGVvZiB0aGlzLl9yZW1vdmVTdGF0ZU1hbmFnZXJMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICB0cnkgeyB0aGlzLl9yZW1vdmVTdGF0ZU1hbmFnZXJMaXN0ZW5lcigpOyB9IGNhdGNoIHt9CiAgICB9CiAgICB0aGlzLl9yZW1vdmVTdGF0ZU1hbmFnZXJMaXN0ZW5lciA9IG51bGw7CiAgICB0aGlzLnNldEFjdGl2ZShmYWxzZSk7CiAgfQoKICBpc0FjdGl2ZSgpIHsKICAgIHJldHVybiB0aGlzLl9hY3RpdmU7CiAgfQoKICBpc1NpbXVsYXRpb25Xb3JrYmVuY2hBY3RpdmUoKSB7CiAgICByZXR1cm4gdGhpcy52aWV3ZXI/Ll9nZXRBY3RpdmVXb3JrYmVuY2hJZD8uKCkgPT09ICdTSU1VTEFUSU9OJzsKICB9CgogIGFkZExpc3RlbmVyKGxpc3RlbmVyKSB7CiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gKCkgPT4ge307CiAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKICAgIHJldHVybiAoKSA9PiB7CiAgICAgIHRyeSB7IHRoaXMuX2xpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpOyB9IGNhdGNoIHt9CiAgICB9OwogIH0KCiAgcmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpIHsKICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHJldHVybjsKICAgIHRyeSB7IHRoaXMuX2xpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpOyB9IGNhdGNoIHt9CiAgfQoKICBpc1BsYXlpbmcoKSB7CiAgICByZXR1cm4gdGhpcy5faXNQbGF5aW5nOwogIH0KCiAgc2V0UGxheWluZyhwbGF5aW5nKSB7CiAgICBjb25zdCBuZXh0ID0gISFwbGF5aW5nOwogICAgaWYgKG5leHQgPT09IHRoaXMuX2lzUGxheWluZykgcmV0dXJuIHRoaXMuX2lzUGxheWluZzsKICAgIHRoaXMuX2lzUGxheWluZyA9IG5leHQ7CiAgICBpZiAodGhpcy5fYWN0aXZlKSB7CiAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgdm9pZCB0aGlzLl9wcmVwYXJlU2ltdWxhdGlvbkFzc2V0cygpLnRoZW4oKCkgPT4gewogICAgICAgICAgdGhpcy5fZW5zdXJlUGh5c2ljc0xvb3AoKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLl9zdG9wUGh5c2ljc0xvb3AoKTsKICAgICAgfQogICAgfQogICAgdGhpcy5fZW1pdCgpOwogICAgdHJ5IHsgdGhpcy52aWV3ZXI/LnJlbmRlcj8uKCk7IH0gY2F0Y2gge30KICAgIHJldHVybiB0aGlzLl9pc1BsYXlpbmc7CiAgfQoKICByZXNldFNpbXVsYXRpb25TdGF0ZSgpIHsKICAgIHRoaXMuX3N0b3BUcmFuc2Zvcm1TZXNzaW9uKCk7CiAgICB0aGlzLl9zdG9wUGh5c2ljc0xvb3AoKTsKICAgIHRoaXMuX2Rlc3Ryb3lQaHlzaWNzV29ybGQoKTsKICAgIHRoaXMuX2lzUGxheWluZyA9IGZhbHNlOwogICAgdGhpcy5fbW92ZWRTb2xpZElkcy5jbGVhcigpOwogICAgdGhpcy5fbW90aW9uU3RhdGUuY2xlYXIoKTsKICAgIGZvciAoY29uc3Qgc29saWQgb2YgdGhpcy5fbGlzdFNjZW5lU29saWRzKCkpIHsKICAgICAgdGhpcy5fcnVudGltZVN0YXRlLnNldChzb2xpZC51dWlkLCBub3JtYWxpemVUcmFuc2Zvcm0obnVsbCkpOwogICAgICB0aGlzLnNldFN0b3JlZFRyYW5zZm9ybShzb2xpZCwgbnVsbCk7CiAgICB9CiAgICB0aGlzLl9yZXN0b3JlQmFzZUxvY2FsUG9zZXMoKTsKICAgIGZvciAoY29uc3Qgc29saWQgb2YgdGhpcy5fbGlzdFNjZW5lU29saWRzKCkpIHsKICAgICAgdGhpcy5fc3luY1Byb3h5R3JvdXBUcmFuc2Zvcm0oc29saWQpOwogICAgfQogICAgaWYgKHRoaXMuX2FjdGl2ZSkgewogICAgICB0aGlzLl9yZXNldE1vdGlvblJ1bnRpbWUoKTsKICAgIH0KICAgIHRoaXMuX2VtaXQoKTsKICAgIHRyeSB7IHRoaXMudmlld2VyPy5yZW5kZXI/LigpOyB9IGNhdGNoIHt9CiAgfQoKICBnZXRTb2xpZEZpeGVkKHNvbGlkKSB7CiAgICBpZiAoIXNvbGlkPy5uYW1lKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBvd24gPSB0aGlzLnZpZXdlcj8ucGFydEhpc3Rvcnk/Lm1ldGFkYXRhTWFuYWdlcj8uZ2V0T3duTWV0YWRhdGE/Lihzb2xpZC5uYW1lKSB8fCB7fTsKICAgIHJldHVybiBvd25bRklYRURfTUVUQURBVEFfS0VZXSA9PT0gdHJ1ZTsKICB9CgogIHNldFNvbGlkRml4ZWQoc29saWQsIGZpeGVkKSB7CiAgICBpZiAoIXNvbGlkPy5uYW1lKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy52aWV3ZXI/LnBhcnRIaXN0b3J5Py5tZXRhZGF0YU1hbmFnZXI7CiAgICBpZiAoIW1hbmFnZXIpIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IGRhdGEgPSBtYW5hZ2VyLmdldE93bk1ldGFkYXRhKHNvbGlkLm5hbWUpOwogICAgaWYgKGZpeGVkKSBkYXRhW0ZJWEVEX01FVEFEQVRBX0tFWV0gPSB0cnVlOwogICAgZWxzZSBkZWxldGUgZGF0YVtGSVhFRF9NRVRBREFUQV9LRVldOwogICAgbWFuYWdlci5zZXRNZXRhZGF0YU9iamVjdChzb2xpZC5uYW1lLCBkYXRhKTsKICAgIGlmICh0aGlzLl9hY3RpdmUgJiYgdGhpcy5fcGh5c2ljc1dvcmxkKSB7CiAgICAgIHZvaWQgdGhpcy5fcmVidWlsZFBoeXNpY3NXb3JsZCgpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBnZXRTdG9yZWRUcmFuc2Zvcm0oc29saWQpIHsKICAgIGlmICghc29saWQ/Lm5hbWUpIHJldHVybiBub3JtYWxpemVUcmFuc2Zvcm0obnVsbCk7CiAgICBjb25zdCBvd24gPSB0aGlzLnZpZXdlcj8ucGFydEhpc3Rvcnk/Lm1ldGFkYXRhTWFuYWdlcj8uZ2V0T3duTWV0YWRhdGE/Lihzb2xpZC5uYW1lKSB8fCB7fTsKICAgIHJldHVybiBub3JtYWxpemVUcmFuc2Zvcm0ob3duW1RSQU5TRk9STV9NRVRBREFUQV9LRVldKTsKICB9CgogIHNldFN0b3JlZFRyYW5zZm9ybShzb2xpZCwgdHJhbnNmb3JtKSB7CiAgICBpZiAoIXNvbGlkPy5uYW1lKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy52aWV3ZXI/LnBhcnRIaXN0b3J5Py5tZXRhZGF0YU1hbmFnZXI7CiAgICBpZiAoIW1hbmFnZXIpIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgIGNvbnN0IGRhdGEgPSBtYW5hZ2VyLmdldE93bk1ldGFkYXRhKHNvbGlkLm5hbWUpOwogICAgaWYgKHRyYW5zZm9ybUlzSWRlbnRpdHkobm9ybWFsaXplZCkpIGRlbGV0ZSBkYXRhW1RSQU5TRk9STV9NRVRBREFUQV9LRVldOwogICAgZWxzZSBkYXRhW1RSQU5TRk9STV9NRVRBREFUQV9LRVldID0gbm9ybWFsaXplZDsKICAgIG1hbmFnZXIuc2V0TWV0YWRhdGFPYmplY3Qoc29saWQubmFtZSwgZGF0YSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIHNldEFjdGl2ZShhY3RpdmUpIHsKICAgIGNvbnN0IG5leHQgPSAhIWFjdGl2ZTsKICAgIGlmIChuZXh0ID09PSB0aGlzLl9hY3RpdmUpIHsKICAgICAgaWYgKG5leHQpIHsKICAgICAgICB0aGlzLl9hcHBseVJ1bnRpbWVUcmFuc2Zvcm1zKCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fcmVzdG9yZUJhc2VMb2NhbFBvc2VzKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fYWN0aXZlID0gbmV4dDsKICAgIGlmICh0aGlzLl9hY3RpdmUpIHsKICAgICAgdGhpcy5faXNQbGF5aW5nID0gZmFsc2U7CiAgICAgIHRoaXMuX3N0b3BQaHlzaWNzTG9vcCgpOwogICAgICB0aGlzLl9kZXN0cm95UGh5c2ljc1dvcmxkKCk7CiAgICAgIHRoaXMuX2NhcHR1cmVCYXNlTG9jYWxQb3NlcygpOwogICAgICB0aGlzLl9jYXB0dXJlU291cmNlVmlzaWJpbGl0eSgpOwogICAgICB0aGlzLl9oeWRyYXRlUnVudGltZVN0YXRlRnJvbU1ldGFkYXRhKCk7CiAgICAgIHRoaXMuX3Jlc2V0TW90aW9uUnVudGltZSgpOwogICAgICB0aGlzLl9hcHBseVJ1bnRpbWVUcmFuc2Zvcm1zKCk7CiAgICAgIHRoaXMuX3NldFNvdXJjZVNvbGlkc1Zpc2libGUodHJ1ZSk7CiAgICAgIHZvaWQgdGhpcy5fcHJlcGFyZVZpc3VhbEFzc2V0cygpOwogICAgICB0aGlzLl9lbWl0KCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX3N0b3BUcmFuc2Zvcm1TZXNzaW9uKCk7CiAgICB0aGlzLl9kZXN0cm95UGh5c2ljc1dvcmxkKCk7CiAgICB0aGlzLl9zdG9wUGh5c2ljc0xvb3AoKTsKICAgIHRoaXMuX2NsZWFyUHJveHlHcm91cHMoKTsKICAgIHRoaXMuX3NldFNvdXJjZVNvbGlkc1Zpc2libGUodHJ1ZSk7CiAgICB0aGlzLl9yZXN0b3JlQmFzZUxvY2FsUG9zZXMoKTsKICAgIHRoaXMuX3J1bnRpbWVTdGF0ZS5jbGVhcigpOwogICAgdGhpcy5fYmFzZUxvY2FsUG9zZS5jbGVhcigpOwogICAgdGhpcy5fc291cmNlVmlzaWJpbGl0eS5jbGVhcigpOwogICAgdGhpcy5fZGVjb21wb3NpdGlvbkNhY2hlLmNsZWFyKCk7CiAgICB0aGlzLl9tb3Rpb25TdGF0ZS5jbGVhcigpOwogICAgdGhpcy5fbW92ZWRTb2xpZElkcy5jbGVhcigpOwogICAgdGhpcy5faXNQbGF5aW5nID0gZmFsc2U7CiAgICB0aGlzLl9lbWl0KCk7CiAgfQoKICB0b2dnbGVTb2xpZFRyYW5zZm9ybShzb2xpZCkgewogICAgaWYgKCFzb2xpZCB8fCBzb2xpZC50eXBlICE9PSAnU09MSUQnKSByZXR1cm47CiAgICBpZiAoIXRoaXMuaXNTaW11bGF0aW9uV29ya2JlbmNoQWN0aXZlKCkpIHJldHVybjsKICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl90cmFuc2Zvcm1TZXNzaW9uOwogICAgaWYgKHNlc3Npb24gJiYgc2Vzc2lvbi5zb2xpZCA9PT0gc29saWQpIHsKICAgICAgY29uc3QgY3VycmVudE1vZGUgPSAodHlwZW9mIHNlc3Npb24uY29udHJvbHM/LmdldE1vZGUgPT09ICdmdW5jdGlvbicpCiAgICAgICAgPyBzZXNzaW9uLmNvbnRyb2xzLmdldE1vZGUoKQogICAgICAgIDogKHNlc3Npb24uY29udHJvbHM/Lm1vZGUgfHwgc2Vzc2lvbi5tb2RlIHx8ICd0cmFuc2xhdGUnKTsKICAgICAgaWYgKGN1cnJlbnRNb2RlID09PSAndHJhbnNsYXRlJykgewogICAgICAgIHRyeSB7IHNlc3Npb24uY29udHJvbHM/LnNldE1vZGUoJ3JvdGF0ZScpOyB9IGNhdGNoIHsgc2Vzc2lvbi5jb250cm9scy5tb2RlID0gJ3JvdGF0ZSc7IH0KICAgICAgICBzZXNzaW9uLm1vZGUgPSAncm90YXRlJzsKICAgICAgICB0cnkgeyBzZXNzaW9uLmdsb2JhbFN0YXRlPy51cGRhdGVGb3JDYW1lcmE/LigpOyB9IGNhdGNoIHt9CiAgICAgICAgdHJ5IHsgdGhpcy52aWV3ZXI/LnJlbmRlcj8uKCk7IH0gY2F0Y2gge30KICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy5fc3RvcFRyYW5zZm9ybVNlc3Npb24oKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgdGhpcy5fc3RhcnRUcmFuc2Zvcm1TZXNzaW9uKHNvbGlkKTsKICB9CgogIF9jYXB0dXJlQmFzZUxvY2FsUG9zZXMoKSB7CiAgICBmb3IgKGNvbnN0IHNvbGlkIG9mIHRoaXMuX2xpc3RTY2VuZVNvbGlkcygpKSB7CiAgICAgIGlmICghdGhpcy5fYmFzZUxvY2FsUG9zZS5oYXMoc29saWQudXVpZCkpIHsKICAgICAgICB0aGlzLl9iYXNlTG9jYWxQb3NlLnNldChzb2xpZC51dWlkLCBjb3B5TG9jYWxQb3NlKHNvbGlkKSk7CiAgICAgIH0KICAgIH0KICB9CgogIF9jYXB0dXJlU291cmNlVmlzaWJpbGl0eSgpIHsKICAgIGZvciAoY29uc3Qgc29saWQgb2YgdGhpcy5fbGlzdFNjZW5lU29saWRzKCkpIHsKICAgICAgaWYgKCF0aGlzLl9zb3VyY2VWaXNpYmlsaXR5Lmhhcyhzb2xpZC51dWlkKSkgewogICAgICAgIHRoaXMuX3NvdXJjZVZpc2liaWxpdHkuc2V0KHNvbGlkLnV1aWQsIHNvbGlkLnZpc2libGUgIT09IGZhbHNlKTsKICAgICAgfQogICAgfQogIH0KCiAgX2h5ZHJhdGVSdW50aW1lU3RhdGVGcm9tTWV0YWRhdGEoKSB7CiAgICBmb3IgKGNvbnN0IHNvbGlkIG9mIHRoaXMuX2xpc3RTY2VuZVNvbGlkcygpKSB7CiAgICAgIHRoaXMuX3J1bnRpbWVTdGF0ZS5zZXQoc29saWQudXVpZCwgbm9ybWFsaXplVHJhbnNmb3JtKHRoaXMuZ2V0U3RvcmVkVHJhbnNmb3JtKHNvbGlkKSkpOwogICAgfQogIH0KCiAgX3Jlc3RvcmVCYXNlTG9jYWxQb3NlcygpIHsKICAgIGZvciAoY29uc3Qgc29saWQgb2YgdGhpcy5fbGlzdFNjZW5lU29saWRzKCkpIHsKICAgICAgY29uc3QgYmFzZSA9IHRoaXMuX2Jhc2VMb2NhbFBvc2UuZ2V0KHNvbGlkLnV1aWQpOwogICAgICBpZiAoIWJhc2UpIGNvbnRpbnVlOwogICAgICBzb2xpZC5wb3NpdGlvbi5jb3B5KGJhc2UucG9zaXRpb24pOwogICAgICBzb2xpZC5xdWF0ZXJuaW9uLmNvcHkoYmFzZS5xdWF0ZXJuaW9uKTsKICAgICAgc29saWQuc2NhbGUuY29weShiYXNlLnNjYWxlKTsKICAgICAgc29saWQudXBkYXRlTWF0cml4V29ybGQ/Lih0cnVlKTsKICAgIH0KICAgIHRyeSB7IHRoaXMudmlld2VyPy5yZW5kZXI/LigpOyB9IGNhdGNoIHt9CiAgfQoKICBfYXBwbHlSdW50aW1lVHJhbnNmb3JtcygpIHsKICAgIHRoaXMuX2NhcHR1cmVCYXNlTG9jYWxQb3NlcygpOwogICAgZm9yIChjb25zdCBzb2xpZCBvZiB0aGlzLl9saXN0U2NlbmVTb2xpZHMoKSkgewogICAgICB0aGlzLl9hcHBseVJ1bnRpbWVUcmFuc2Zvcm1Ub1NvbGlkKHNvbGlkKTsKICAgIH0KICAgIHRyeSB7IHRoaXMudmlld2VyPy5yZW5kZXI/LigpOyB9IGNhdGNoIHt9CiAgfQoKICBfYXBwbHlSdW50aW1lVHJhbnNmb3JtVG9Tb2xpZChzb2xpZCkgewogICAgY29uc3QgYmFzZSA9IHRoaXMuX2Jhc2VMb2NhbFBvc2UuZ2V0KHNvbGlkLnV1aWQpOwogICAgaWYgKCFiYXNlKSByZXR1cm47CiAgICBjb25zdCBydW50aW1lID0gbm9ybWFsaXplVHJhbnNmb3JtKHRoaXMuX3J1bnRpbWVTdGF0ZS5nZXQoc29saWQudXVpZCkpOwogICAgY29uc3Qgb2Zmc2V0UXVhdGVybmlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkuc2V0RnJvbUV1bGVyKAogICAgICBuZXcgVEhSRUUuRXVsZXIoLi4ucnVudGltZS5yb3RhdGlvbkV1bGVyLCAnWFlaJyksCiAgICApOwogICAgY29uc3QgbmV4dE1hdHJpeCA9IGJ1aWxkTG9jYWxNYXRyaXgoYmFzZSkubXVsdGlwbHkoCiAgICAgIG5ldyBUSFJFRS5NYXRyaXg0KCkuY29tcG9zZSgKICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyguLi5ydW50aW1lLnBvc2l0aW9uKSwKICAgICAgICBvZmZzZXRRdWF0ZXJuaW9uLAogICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKDEsIDEsIDEpLAogICAgICApLAogICAgKTsKICAgIG5leHRNYXRyaXguZGVjb21wb3NlKHNvbGlkLnBvc2l0aW9uLCBzb2xpZC5xdWF0ZXJuaW9uLCBzb2xpZC5zY2FsZSk7CiAgICBzb2xpZC51cGRhdGVNYXRyaXhXb3JsZD8uKHRydWUpOwogICAgdGhpcy5fc3luY1Byb3h5R3JvdXBUcmFuc2Zvcm0oc29saWQpOwogIH0KCiAgX3VwZGF0ZVJ1bnRpbWVUcmFuc2Zvcm1Gcm9tU29saWQoc29saWQsIHsgcGVyc2lzdCA9IGZhbHNlIH0gPSB7fSkgewogICAgY29uc3QgYmFzZSA9IHRoaXMuX2Jhc2VMb2NhbFBvc2UuZ2V0KHNvbGlkLnV1aWQpOwogICAgaWYgKCFiYXNlKSByZXR1cm47CiAgICBjb25zdCBvZmZzZXQgPSBub3JtYWxpemVUcmFuc2Zvcm0ocG9zZVRvT2Zmc2V0KGJhc2UsIHNvbGlkKSk7CiAgICB0aGlzLl9ydW50aW1lU3RhdGUuc2V0KHNvbGlkLnV1aWQsIG9mZnNldCk7CiAgICBpZiAocGVyc2lzdCkgewogICAgICB0aGlzLnNldFN0b3JlZFRyYW5zZm9ybShzb2xpZCwgb2Zmc2V0KTsKICAgICAgdGhpcy52aWV3ZXI/LnBhcnRIaXN0b3J5Py5xdWV1ZUhpc3RvcnlTbmFwc2hvdD8uKHsgZGVib3VuY2VNczogMCwgcmVhc29uOiAnc2ltdWxhdGlvbi10cmFuc2Zvcm0nIH0pOwogICAgfQogICAgdGhpcy5fc3luY1Byb3h5R3JvdXBUcmFuc2Zvcm0oc29saWQpOwogIH0KCiAgYXN5bmMgX3ByZXBhcmVTaW11bGF0aW9uQXNzZXRzKCkgewogICAgaWYgKCF0aGlzLl9hY3RpdmUpIHJldHVybjsKICAgIHRyeSB7CiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuX2xpc3RTY2VuZVNvbGlkcygpLm1hcCgoc29saWQpID0+IHRoaXMuX2Vuc3VyZURlY29tcG9zaXRpb24oc29saWQpKSk7CiAgICAgIHRoaXMuX2J1aWxkUHJveHlHcm91cHMoKTsKICAgICAgYXdhaXQgdGhpcy5fcmVidWlsZFBoeXNpY3NXb3JsZCgpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdGlvbldvcmtiZW5jaF0gRmFpbGVkIHRvIHByZXBhcmUgc2ltdWxhdGlvbiBhc3NldHM6JywgZXJyb3IpOwogICAgfQogIH0KCiAgYXN5bmMgX3ByZXBhcmVWaXN1YWxBc3NldHMoKSB7CiAgICBpZiAoIXRoaXMuX2FjdGl2ZSkgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5fbGlzdFNjZW5lU29saWRzKCkubWFwKChzb2xpZCkgPT4gdGhpcy5fZW5zdXJlRGVjb21wb3NpdGlvbihzb2xpZCkpKTsKICAgICAgdGhpcy5fYnVpbGRQcm94eUdyb3VwcygpOwogICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdGlvbldvcmtiZW5jaF0gRmFpbGVkIHRvIHByZXBhcmUgc2ltdWxhdGlvbiB2aXN1YWxzOicsIGVycm9yKTsKICAgIH0KICB9CgogIGFzeW5jIF9sb2FkUmFwaWVyKCkgewogICAgaWYgKHRoaXMuX3JhcGllcikgcmV0dXJuIHRoaXMuX3JhcGllcjsKICAgIGlmICghdGhpcy5fcmFwaWVyTG9hZFByb21pc2UpIHsKICAgICAgdGhpcy5fcmFwaWVyTG9hZFByb21pc2UgPSBpbXBvcnQoJ0BkaW1mb3JnZS9yYXBpZXIzZC9yYXBpZXIuanMnKQogICAgICAgIC50aGVuKChtb2R1bGUpID0+IG1vZHVsZT8uZGVmYXVsdCB8fCBtb2R1bGUpCiAgICAgICAgLnRoZW4oKHJhcGllcikgPT4gewogICAgICAgICAgdGhpcy5fcmFwaWVyID0gcmFwaWVyOwogICAgICAgICAgcmV0dXJuIHJhcGllcjsKICAgICAgICB9KQogICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHsKICAgICAgICAgIHRoaXMuX3JhcGllckxvYWRQcm9taXNlID0gbnVsbDsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHRoaXMuX3JhcGllckxvYWRQcm9taXNlOwogIH0KCiAgYXN5bmMgX2xvYWRWaGFjZCgpIHsKICAgIGlmICh0aGlzLl92aGFjZCkgcmV0dXJuIHRoaXMuX3ZoYWNkOwogICAgaWYgKCF0aGlzLl92aGFjZExvYWRQcm9taXNlKSB7CiAgICAgIHRoaXMuX3ZoYWNkTG9hZFByb21pc2UgPSBpbXBvcnQoJ3ZoYWNkLWpzL2xpYi92aGFjZC5qcycpCiAgICAgICAgLnRoZW4oKG1vZHVsZSkgPT4gbW9kdWxlPy5Db252ZXhNZXNoRGVjb21wb3NpdGlvbj8uY3JlYXRlPy4oKSkKICAgICAgICAudGhlbigoaW5zdGFuY2UpID0+IHsKICAgICAgICAgIHRoaXMuX3ZoYWNkID0gaW5zdGFuY2UgfHwgbnVsbDsKICAgICAgICAgIHJldHVybiB0aGlzLl92aGFjZDsKICAgICAgICB9KQogICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHsKICAgICAgICAgIHRoaXMuX3ZoYWNkTG9hZFByb21pc2UgPSBudWxsOwogICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5fdmhhY2RMb2FkUHJvbWlzZTsKICB9CgogIGFzeW5jIF9lbnN1cmVEZWNvbXBvc2l0aW9uKHNvbGlkKSB7CiAgICBpZiAoIXNvbGlkPy51dWlkKSByZXR1cm4gW107CiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLl9kZWNvbXBvc2l0aW9uQ2FjaGUuZ2V0KHNvbGlkLnV1aWQpOwogICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZC5odWxsczsKICAgIGNvbnN0IHJhd01lc2ggPSB0aGlzLl9leHRyYWN0U29saWRNZXNoKHNvbGlkKTsKICAgIGlmICghcmF3TWVzaCkgewogICAgICB0aGlzLl9kZWNvbXBvc2l0aW9uQ2FjaGUuc2V0KHNvbGlkLnV1aWQsIHsgaHVsbHM6IFtdIH0pOwogICAgICByZXR1cm4gW107CiAgICB9CiAgICBsZXQgaHVsbHMgPSBbXTsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHZoYWNkID0gYXdhaXQgdGhpcy5fbG9hZFZoYWNkKCk7CiAgICAgIGlmICh2aGFjZD8uY29tcHV0ZUNvbnZleEh1bGxzKSB7CiAgICAgICAgaHVsbHMgPSB2aGFjZC5jb21wdXRlQ29udmV4SHVsbHMocmF3TWVzaCwgVkhBQ0RfT1BUSU9OUykgfHwgW107CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRpb25Xb3JrYmVuY2hdIEZhaWxlZCB0byBkZWNvbXBvc2UgbWVzaCB3aXRoIHZoYWNkLWpzOicsIGVycm9yKTsKICAgIH0KICAgIGlmICghQXJyYXkuaXNBcnJheShodWxscykgfHwgaHVsbHMubGVuZ3RoID09PSAwKSB7CiAgICAgIGh1bGxzID0gW3Jhd01lc2hdOwogICAgfQogICAgdGhpcy5fZGVjb21wb3NpdGlvbkNhY2hlLnNldChzb2xpZC51dWlkLCB7IGh1bGxzIH0pOwogICAgcmV0dXJuIGh1bGxzOwogIH0KCiAgX2V4dHJhY3RTb2xpZE1lc2goc29saWQpIHsKICAgIGxldCBtZXNoID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIG1lc2ggPSBzb2xpZC5nZXRNZXNoPy4oKTsKICAgICAgcmV0dXJuIG5vcm1hbGl6ZU1lc2hBcnJheXMobWVzaCk7CiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGZpbmFsbHkgewogICAgICB0cnkgeyBpZiAobWVzaCAmJiB0eXBlb2YgbWVzaC5kZWxldGUgPT09ICdmdW5jdGlvbicpIG1lc2guZGVsZXRlKCk7IH0gY2F0Y2gge30KICAgIH0KICB9CgogIF9idWlsZFByb3h5R3JvdXBzKCkgewogICAgdGhpcy5fY2xlYXJQcm94eUdyb3VwcygpOwogICAgZm9yIChjb25zdCBzb2xpZCBvZiB0aGlzLl9saXN0U2NlbmVTb2xpZHMoKSkgewogICAgICBjb25zdCByZWNvcmQgPSB0aGlzLl9kZWNvbXBvc2l0aW9uQ2FjaGUuZ2V0KHNvbGlkLnV1aWQpOwogICAgICBjb25zdCBodWxscyA9IEFycmF5LmlzQXJyYXkocmVjb3JkPy5odWxscykgPyByZWNvcmQuaHVsbHMgOiBbXTsKICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9jcmVhdGVQcm94eUdyb3VwKHNvbGlkLCBodWxscyk7CiAgICAgIGlmICghZ3JvdXApIGNvbnRpbnVlOwogICAgICB0aGlzLl9wcm94eUdyb3Vwcy5zZXQoc29saWQudXVpZCwgZ3JvdXApOwogICAgICB0aGlzLl9zeW5jUHJveHlHcm91cFRyYW5zZm9ybShzb2xpZCk7CiAgICAgIHRyeSB7IHRoaXMudmlld2VyPy5yZW5kZXI/LigpOyB9IGNhdGNoIHt9CiAgICB9CiAgfQoKICBfY3JlYXRlUHJveHlHcm91cChzb2xpZCwgaHVsbHMpIHsKICAgIGNvbnN0IHBhcmVudCA9IHNvbGlkLnBhcmVudCB8fCB0aGlzLnZpZXdlcj8uc2NlbmUgfHwgbnVsbDsKICAgIGlmICghcGFyZW50Py5hZGQgfHwgIUFycmF5LmlzQXJyYXkoaHVsbHMpIHx8IGh1bGxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7CiAgICBjb25zdCBncm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpOwogICAgZ3JvdXAubmFtZSA9IGAke1NJTV9QUk9YWV9QUkVGSVh9OiR7c29saWQubmFtZSB8fCBzb2xpZC51dWlkIHx8ICcnfWA7CiAgICBncm91cC51c2VyRGF0YS5leGNsdWRlRnJvbUZpdCA9IGZhbHNlOwogICAgZ3JvdXAudXNlckRhdGEuc2ltdWxhdGlvblByb3h5ID0gdHJ1ZTsKICAgIGdyb3VwLnZpc2libGUgPSBmYWxzZTsKICAgIGNvbnN0IG1ldGFkYXRhQ29sb3IgPSB0aGlzLnZpZXdlcj8ucGFydEhpc3Rvcnk/Lm1ldGFkYXRhTWFuYWdlcj8uZ2V0TWV0YWRhdGE/Lihzb2xpZC5uYW1lIHx8ICcnKT8uY29sb3IgfHwgbnVsbDsKICAgIGh1bGxzLmZvckVhY2goKGh1bGwsIGluZGV4KSA9PiB7CiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCk7CiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZShBcnJheS5mcm9tKGh1bGwucG9zaXRpb25zIHx8IFtdKSwgMykpOwogICAgICBnZW9tZXRyeS5zZXRJbmRleChBcnJheS5mcm9tKGh1bGwuaW5kaWNlcyB8fCBbXSkpOwogICAgICBnZW9tZXRyeS5jb21wdXRlVmVydGV4Tm9ybWFscygpOwogICAgICBjb25zdCBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIGJ1aWxkUHJveHlNYXRlcmlhbChtZXRhZGF0YUNvbG9yLCBpbmRleCwgaHVsbHMubGVuZ3RoKSk7CiAgICAgIG1lc2gudXNlckRhdGEuZXhjbHVkZUZyb21GaXQgPSBmYWxzZTsKICAgICAgbWVzaC51c2VyRGF0YS5zaW11bGF0aW9uUHJveHkgPSB0cnVlOwogICAgICBtZXNoLnVzZXJEYXRhLnNvdXJjZVNvbGlkVXVpZCA9IHNvbGlkLnV1aWQ7CiAgICAgIGdyb3VwLmFkZChtZXNoKTsKCiAgICAgIGNvbnN0IGVkZ2VzID0gbmV3IFRIUkVFLkxpbmVTZWdtZW50cygKICAgICAgICBuZXcgVEhSRUUuRWRnZXNHZW9tZXRyeShnZW9tZXRyeSwgMjApLAogICAgICAgIG5ldyBUSFJFRS5MaW5lQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiAweDIyZDNlZSwgdHJhbnNwYXJlbnQ6IHRydWUsIG9wYWNpdHk6IDAuOSB9KSwKICAgICAgKTsKICAgICAgZWRnZXMudXNlckRhdGEuZXhjbHVkZUZyb21GaXQgPSBmYWxzZTsKICAgICAgZWRnZXMudXNlckRhdGEuc2ltdWxhdGlvblByb3h5ID0gdHJ1ZTsKICAgICAgZ3JvdXAuYWRkKGVkZ2VzKTsKICAgIH0pOwogICAgcGFyZW50LmFkZChncm91cCk7CiAgICByZXR1cm4gZ3JvdXA7CiAgfQoKICBfc3luY1Byb3h5R3JvdXBUcmFuc2Zvcm0oc29saWQpIHsKICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fcHJveHlHcm91cHMuZ2V0KHNvbGlkLnV1aWQpOwogICAgaWYgKCFncm91cCkgcmV0dXJuOwogICAgZ3JvdXAucG9zaXRpb24uY29weShzb2xpZC5wb3NpdGlvbik7CiAgICBncm91cC5xdWF0ZXJuaW9uLmNvcHkoc29saWQucXVhdGVybmlvbik7CiAgICBncm91cC5zY2FsZS5jb3B5KHNvbGlkLnNjYWxlKTsKICAgIGdyb3VwLnZpc2libGUgPSBmYWxzZTsKICAgIGdyb3VwLnVwZGF0ZU1hdHJpeFdvcmxkPy4odHJ1ZSk7CiAgfQoKICBfY2xlYXJQcm94eUdyb3VwcygpIHsKICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fcHJveHlHcm91cHMudmFsdWVzKCkpIHsKICAgICAgdHJ5IHsgZ3JvdXAucGFyZW50Py5yZW1vdmU/Lihncm91cCk7IH0gY2F0Y2gge30KICAgICAgZGlzcG9zZUhpZXJhcmNoeShncm91cCk7CiAgICB9CiAgICB0aGlzLl9wcm94eUdyb3Vwcy5jbGVhcigpOwogIH0KCiAgX3NldFNvdXJjZVNvbGlkc1Zpc2libGUodmlzaWJsZSkgewogICAgZm9yIChjb25zdCBzb2xpZCBvZiB0aGlzLl9saXN0U2NlbmVTb2xpZHMoKSkgewogICAgICBpZiAodmlzaWJsZSkgewogICAgICAgIHNvbGlkLnZpc2libGUgPSB0aGlzLl9zb3VyY2VWaXNpYmlsaXR5LmdldChzb2xpZC51dWlkKSAhPT0gZmFsc2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc29saWQudmlzaWJsZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX3Byb3h5R3JvdXBzLnZhbHVlcygpKSB7CiAgICAgIGdyb3VwLnZpc2libGUgPSBmYWxzZTsKICAgIH0KICAgIHRyeSB7IHRoaXMudmlld2VyPy5yZW5kZXI/LigpOyB9IGNhdGNoIHt9CiAgfQoKICBhc3luYyBfcmVidWlsZFBoeXNpY3NXb3JsZCgpIHsKICAgIGlmICghdGhpcy5fYWN0aXZlKSByZXR1cm47CiAgICBjb25zdCBbcmFwaWVyXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgdGhpcy5fbG9hZFJhcGllcigpLAogICAgICBQcm9taXNlLmFsbCh0aGlzLl9saXN0U2NlbmVTb2xpZHMoKS5tYXAoKHNvbGlkKSA9PiB0aGlzLl9lbnN1cmVEZWNvbXBvc2l0aW9uKHNvbGlkKSkpLAogICAgXSk7CiAgICBpZiAoIXRoaXMuX2FjdGl2ZSB8fCAhcmFwaWVyKSByZXR1cm47CiAgICB0aGlzLl9kZXN0cm95UGh5c2ljc1dvcmxkKCk7CiAgICB0aGlzLl9ib2R5U3RhdGUuY2xlYXIoKTsKICAgIGNvbnN0IHdvcmxkID0gbmV3IHJhcGllci5Xb3JsZCh7IHg6IDAsIHk6IC05LjgxLCB6OiAwIH0pOwogICAgd29ybGQubWF4Q2NkU3Vic3RlcHMgPSAyOwogICAgdGhpcy5fcGh5c2ljc1dvcmxkID0gd29ybGQ7CiAgICBjb25zdCBzZWxlY3RlZFNvbGlkID0gdGhpcy5fdHJhbnNmb3JtU2Vzc2lvbj8uc29saWQgfHwgbnVsbDsKICAgIGZvciAoY29uc3Qgc29saWQgb2YgdGhpcy5fbGlzdFNjZW5lU29saWRzKCkpIHsKICAgICAgY29uc3QgYm9keURlc2MgPSAoc2VsZWN0ZWRTb2xpZCAmJiBzb2xpZCA9PT0gc2VsZWN0ZWRTb2xpZCkKICAgICAgICA/IHJhcGllci5SaWdpZEJvZHlEZXNjLmtpbmVtYXRpY1Bvc2l0aW9uQmFzZWQoKQogICAgICAgIDogKHRoaXMuX2lzU29saWRNb3Rpb25Ecml2ZW4oc29saWQpCiAgICAgICAgICA/IHJhcGllci5SaWdpZEJvZHlEZXNjLmtpbmVtYXRpY1Bvc2l0aW9uQmFzZWQoKQogICAgICAgICAgOiAodGhpcy5nZXRTb2xpZEZpeGVkKHNvbGlkKSA/IHJhcGllci5SaWdpZEJvZHlEZXNjLmZpeGVkKCkgOiByYXBpZXIuUmlnaWRCb2R5RGVzYy5keW5hbWljKCkpKTsKICAgICAgY29uc3QgcG9zaXRpb24gPSBzb2xpZC5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpOwogICAgICBjb25zdCBxdWF0ZXJuaW9uID0gc29saWQuZ2V0V29ybGRRdWF0ZXJuaW9uKG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkpOwogICAgICBib2R5RGVzYy5zZXRUcmFuc2xhdGlvbihwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KTsKICAgICAgYm9keURlc2Muc2V0Um90YXRpb24oeyB4OiBxdWF0ZXJuaW9uLngsIHk6IHF1YXRlcm5pb24ueSwgejogcXVhdGVybmlvbi56LCB3OiBxdWF0ZXJuaW9uLncgfSk7CiAgICAgIGJvZHlEZXNjLnNldExpbmVhckRhbXBpbmcoMi41KTsKICAgICAgYm9keURlc2Muc2V0QW5ndWxhckRhbXBpbmcoMi41KTsKICAgICAgYm9keURlc2Muc2V0Q2NkRW5hYmxlZCh0cnVlKTsKICAgICAgY29uc3QgYm9keSA9IHdvcmxkLmNyZWF0ZVJpZ2lkQm9keShib2R5RGVzYyk7CiAgICAgIGNvbnN0IGh1bGxzID0gdGhpcy5fZGVjb21wb3NpdGlvbkNhY2hlLmdldChzb2xpZC51dWlkKT8uaHVsbHMgfHwgW107CiAgICAgIGZvciAoY29uc3QgaHVsbCBvZiBodWxscykgewogICAgICAgIGNvbnN0IGNvbGxpZGVyID0gdGhpcy5fY3JlYXRlQ29sbGlkZXJGb3JIdWxsKHJhcGllciwgaHVsbCk7CiAgICAgICAgaWYgKCFjb2xsaWRlcikgY29udGludWU7CiAgICAgICAgY29sbGlkZXIuc2V0UmVzdGl0dXRpb24oMC4wNSk7CiAgICAgICAgY29sbGlkZXIuc2V0RnJpY3Rpb24oMC45KTsKICAgICAgICB3b3JsZC5jcmVhdGVDb2xsaWRlcihjb2xsaWRlciwgYm9keSk7CiAgICAgIH0KICAgICAgdGhpcy5fYm9keVN0YXRlLnNldChzb2xpZC51dWlkLCB7CiAgICAgICAgc29saWQsCiAgICAgICAgYm9keSwKICAgICAgICBwcm94eUdyb3VwOiB0aGlzLl9wcm94eUdyb3Vwcy5nZXQoc29saWQudXVpZCkgfHwgbnVsbCwKICAgICAgfSk7CiAgICB9CiAgfQoKICBfZGVzdHJveVBoeXNpY3NXb3JsZCgpIHsKICAgIHRyeSB7IHRoaXMuX3BoeXNpY3NXb3JsZD8uZnJlZT8uKCk7IH0gY2F0Y2gge30KICAgIHRoaXMuX3BoeXNpY3NXb3JsZCA9IG51bGw7CiAgICB0aGlzLl9ib2R5U3RhdGUuY2xlYXIoKTsKICB9CgogIF9jcmVhdGVDb2xsaWRlckZvckh1bGwocmFwaWVyLCBodWxsKSB7CiAgICBjb25zdCBwb3NpdGlvbnMgPSBodWxsPy5wb3NpdGlvbnMgPyBuZXcgRmxvYXQzMkFycmF5KGh1bGwucG9zaXRpb25zKSA6IG51bGw7CiAgICBjb25zdCBpbmRpY2VzID0gaHVsbD8uaW5kaWNlcyA/IG5ldyBVaW50MzJBcnJheShodWxsLmluZGljZXMpIDogbnVsbDsKICAgIGlmICghcG9zaXRpb25zIHx8IHBvc2l0aW9ucy5sZW5ndGggPCA5IHx8ICFpbmRpY2VzIHx8IGluZGljZXMubGVuZ3RoIDwgMykgcmV0dXJuIG51bGw7CiAgICBjb25zdCBjb2xsaWRlciA9IHJhcGllci5Db2xsaWRlckRlc2MuY29udmV4TWVzaChwb3NpdGlvbnMsIGluZGljZXMpOwogICAgaWYgKGNvbGxpZGVyKSByZXR1cm4gY29sbGlkZXI7CiAgICByZXR1cm4gcmFwaWVyLkNvbGxpZGVyRGVzYy5jb252ZXhIdWxsKHBvc2l0aW9ucyk7CiAgfQoKICBfZW5zdXJlUGh5c2ljc0xvb3AoKSB7CiAgICBpZiAodGhpcy5fcmFmKSByZXR1cm47CiAgICB0aGlzLl9sYXN0U3RlcFRpbWUgPSAwOwogICAgY29uc3Qgc3RlcCA9ICh0cykgPT4gewogICAgICB0aGlzLl9yYWYgPSAwOwogICAgICBpZiAoIXRoaXMuX2FjdGl2ZSkgcmV0dXJuOwogICAgICB0aGlzLl9zdGVwUGh5c2ljcyh0cyk7CiAgICAgIHRoaXMuX3JhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKTsKICAgIH07CiAgICB0aGlzLl9yYWYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgfQoKICBfc3RvcFBoeXNpY3NMb29wKCkgewogICAgaWYgKHRoaXMuX3JhZikgewogICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpOwogICAgICB0aGlzLl9yYWYgPSAwOwogICAgfQogICAgdGhpcy5fbGFzdFN0ZXBUaW1lID0gMDsKICB9CgogIF9zdGVwUGh5c2ljcyh0aW1lc3RhbXApIHsKICAgIGNvbnN0IHdvcmxkID0gdGhpcy5fcGh5c2ljc1dvcmxkOwogICAgaWYgKCF3b3JsZCkgcmV0dXJuOwogICAgaWYgKCF0aGlzLl9pc1BsYXlpbmcpIHsKICAgICAgdGhpcy5fbGFzdFN0ZXBUaW1lID0gdGltZXN0YW1wOwogICAgICByZXR1cm47CiAgICB9CiAgICBjb25zdCBkdCA9IHRoaXMuX2xhc3RTdGVwVGltZSA+IDAKICAgICAgPyBNYXRoLm1pbigxIC8gMjAsIE1hdGgubWF4KDEgLyAyNDAsICh0aW1lc3RhbXAgLSB0aGlzLl9sYXN0U3RlcFRpbWUpIC8gMTAwMCkpCiAgICAgIDogMSAvIDYwOwogICAgdGhpcy5fbGFzdFN0ZXBUaW1lID0gdGltZXN0YW1wOwogICAgd29ybGQudGltZXN0ZXAgPSBkdDsKCiAgICBjb25zdCBzZWxlY3RlZFNvbGlkID0gdGhpcy5fdHJhbnNmb3JtU2Vzc2lvbj8uc29saWQgfHwgbnVsbDsKICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7CiAgICBpZiAodGhpcy5faXNQbGF5aW5nKSB7CiAgICAgIGNoYW5nZWQgPSB0aGlzLl9hcHBseU1vdGlvblN0ZXAoZHQpIHx8IGNoYW5nZWQ7CiAgICB9CiAgICBpZiAoc2VsZWN0ZWRTb2xpZCkgewogICAgICBjb25zdCBib2R5U3RhdGUgPSB0aGlzLl9ib2R5U3RhdGUuZ2V0KHNlbGVjdGVkU29saWQudXVpZCk7CiAgICAgIGlmIChib2R5U3RhdGU/LmJvZHkpIHsKICAgICAgICBjb25zdCB3b3JsZFBvc2l0aW9uID0gc2VsZWN0ZWRTb2xpZC5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpOwogICAgICAgIGNvbnN0IHdvcmxkUXVhdGVybmlvbiA9IHNlbGVjdGVkU29saWQuZ2V0V29ybGRRdWF0ZXJuaW9uKG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkpOwogICAgICAgIGJvZHlTdGF0ZS5ib2R5LnNldE5leHRLaW5lbWF0aWNUcmFuc2xhdGlvbih3b3JsZFBvc2l0aW9uKTsKICAgICAgICBib2R5U3RhdGUuYm9keS5zZXROZXh0S2luZW1hdGljUm90YXRpb24od29ybGRRdWF0ZXJuaW9uKTsKICAgICAgfQogICAgfQogICAgaWYgKHRoaXMuX2lzUGxheWluZykgewogICAgICBmb3IgKGNvbnN0IHNvbGlkIG9mIHRoaXMuX2xpc3RTY2VuZVNvbGlkcygpKSB7CiAgICAgICAgaWYgKCF0aGlzLl9pc1NvbGlkTW90aW9uRHJpdmVuKHNvbGlkKSkgY29udGludWU7CiAgICAgICAgY29uc3QgYm9keVN0YXRlID0gdGhpcy5fYm9keVN0YXRlLmdldChzb2xpZC51dWlkKTsKICAgICAgICBpZiAoIWJvZHlTdGF0ZT8uYm9keSkgY29udGludWU7CiAgICAgICAgY29uc3Qgd29ybGRQb3NpdGlvbiA9IHNvbGlkLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSk7CiAgICAgICAgY29uc3Qgd29ybGRRdWF0ZXJuaW9uID0gc29saWQuZ2V0V29ybGRRdWF0ZXJuaW9uKG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkpOwogICAgICAgIGJvZHlTdGF0ZS5ib2R5LnNldE5leHRLaW5lbWF0aWNUcmFuc2xhdGlvbih3b3JsZFBvc2l0aW9uKTsKICAgICAgICBib2R5U3RhdGUuYm9keS5zZXROZXh0S2luZW1hdGljUm90YXRpb24od29ybGRRdWF0ZXJuaW9uKTsKICAgICAgfQogICAgfQoKICAgIHdvcmxkLnN0ZXAoKTsKICAgIGZvciAoY29uc3QgYm9keVN0YXRlIG9mIHRoaXMuX2JvZHlTdGF0ZS52YWx1ZXMoKSkgewogICAgICBjb25zdCB7IHNvbGlkLCBib2R5IH0gPSBib2R5U3RhdGU7CiAgICAgIGlmICghc29saWQgfHwgIWJvZHkpIGNvbnRpbnVlOwogICAgICBpZiAoc2VsZWN0ZWRTb2xpZCAmJiBzb2xpZCA9PT0gc2VsZWN0ZWRTb2xpZCkgewogICAgICAgIHRoaXMuX3N5bmNQcm94eUdyb3VwVHJhbnNmb3JtKHNvbGlkKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodGhpcy5faXNTb2xpZE1vdGlvbkRyaXZlbihzb2xpZCkpIHsKICAgICAgICB0aGlzLl9zeW5jUHJveHlHcm91cFRyYW5zZm9ybShzb2xpZCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuZ2V0U29saWRGaXhlZChzb2xpZCkpIHsKICAgICAgICB0aGlzLl9zeW5jUHJveHlHcm91cFRyYW5zZm9ybShzb2xpZCk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSBib2R5LnRyYW5zbGF0aW9uKCk7CiAgICAgIGNvbnN0IHJvdGF0aW9uID0gYm9keS5yb3RhdGlvbigpOwogICAgICBpZiAoIXRyYW5zbGF0aW9uIHx8ICFyb3RhdGlvbikgY29udGludWU7CiAgICAgIHRoaXMuX3NldFNvbGlkV29ybGRQb3NlKHNvbGlkLCB0cmFuc2xhdGlvbiwgcm90YXRpb24pOwogICAgICB0aGlzLl91cGRhdGVSdW50aW1lVHJhbnNmb3JtRnJvbVNvbGlkKHNvbGlkLCB7IHBlcnNpc3Q6IGZhbHNlIH0pOwogICAgICB0aGlzLl9tb3ZlZFNvbGlkSWRzLmFkZChzb2xpZC51dWlkKTsKICAgICAgY2hhbmdlZCA9IHRydWU7CiAgICB9CiAgICBpZiAoY2hhbmdlZCkgewogICAgICB0cnkgeyB0aGlzLnZpZXdlcj8ucmVuZGVyPy4oKTsgfSBjYXRjaCB7fQogICAgfQogIH0KCiAgX3NldFNvbGlkV29ybGRQb3NlKHNvbGlkLCB0cmFuc2xhdGlvbiwgcm90YXRpb24pIHsKICAgIGNvbnN0IHBhcmVudCA9IHNvbGlkLnBhcmVudCB8fCB0aGlzLnZpZXdlcj8uc2NlbmUgfHwgbnVsbDsKICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLl9zY3JhdGNoOwogICAgc2NyYXRjaC53b3JsZFBvc2l0aW9uLnNldCh0cmFuc2xhdGlvbi54LCB0cmFuc2xhdGlvbi55LCB0cmFuc2xhdGlvbi56KTsKICAgIHNjcmF0Y2gud29ybGRRdWF0ZXJuaW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56LCByb3RhdGlvbi53KTsKICAgIGlmIChwYXJlbnQ/LmlzT2JqZWN0M0QpIHsKICAgICAgcGFyZW50LnVwZGF0ZU1hdHJpeFdvcmxkPy4odHJ1ZSk7CiAgICAgIHNjcmF0Y2gucGFyZW50SW52ZXJzZS5jb3B5KHBhcmVudC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk7CiAgICAgIHBhcmVudC5nZXRXb3JsZFF1YXRlcm5pb24oc2NyYXRjaC5wYXJlbnRRdWF0ZXJuaW9uKTsKICAgICAgc2NyYXRjaC5wYXJlbnRRdWF0ZXJuaW9uSW52ZXJzZS5jb3B5KHNjcmF0Y2gucGFyZW50UXVhdGVybmlvbikuaW52ZXJ0KCk7CiAgICAgIHNjcmF0Y2gubG9jYWxQb3NpdGlvbi5jb3B5KHNjcmF0Y2gud29ybGRQb3NpdGlvbikuYXBwbHlNYXRyaXg0KHNjcmF0Y2gucGFyZW50SW52ZXJzZSk7CiAgICAgIHNvbGlkLnBvc2l0aW9uLmNvcHkoc2NyYXRjaC5sb2NhbFBvc2l0aW9uKTsKICAgICAgc29saWQucXVhdGVybmlvbi5jb3B5KHNjcmF0Y2gucGFyZW50UXVhdGVybmlvbkludmVyc2UubXVsdGlwbHkoc2NyYXRjaC53b3JsZFF1YXRlcm5pb24pKTsKICAgIH0gZWxzZSB7CiAgICAgIHNvbGlkLnBvc2l0aW9uLmNvcHkoc2NyYXRjaC53b3JsZFBvc2l0aW9uKTsKICAgICAgc29saWQucXVhdGVybmlvbi5jb3B5KHNjcmF0Y2gud29ybGRRdWF0ZXJuaW9uKTsKICAgIH0KICAgIHNvbGlkLnVwZGF0ZU1hdHJpeFdvcmxkPy4odHJ1ZSk7CiAgICB0aGlzLl9zeW5jUHJveHlHcm91cFRyYW5zZm9ybShzb2xpZCk7CiAgfQoKICBfc3RhcnRUcmFuc2Zvcm1TZXNzaW9uKHNvbGlkKSB7CiAgICBpZiAoIXNvbGlkIHx8ICF0aGlzLl9hY3RpdmUpIHJldHVybjsKICAgIHRoaXMuX3N0b3BUcmFuc2Zvcm1TZXNzaW9uKCk7CiAgICBjb25zdCBjb250cm9scyA9IG5ldyBDb21iaW5lZFRyYW5zZm9ybUNvbnRyb2xzKHRoaXMudmlld2VyLmNhbWVyYSwgdGhpcy52aWV3ZXIucmVuZGVyZXI/LmRvbUVsZW1lbnQpOwogICAgdHJ5IHsgY29udHJvbHMuc2V0TW9kZSgndHJhbnNsYXRlJyk7IH0gY2F0Y2ggeyBjb250cm9scy5tb2RlID0gJ3RyYW5zbGF0ZSc7IH0KICAgIGNvbnN0IHRhcmdldCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpOwogICAgdGFyZ2V0Lm5hbWUgPSBgU2ltdWxhdGlvblRyYW5zZm9ybVRhcmdldDoke3NvbGlkLm5hbWUgfHwgc29saWQudXVpZCB8fCAnJ31gOwogICAgdGhpcy52aWV3ZXIuc2NlbmUudXBkYXRlTWF0cml4V29ybGQ/Lih0cnVlKTsKICAgIHNvbGlkLnVwZGF0ZU1hdHJpeFdvcmxkPy4odHJ1ZSk7CiAgICBjb25zdCBib3ggPSB0aGlzLl9zY3JhdGNoLmJveDsKICAgIGNvbnN0IGNlbnRlciA9IGJveC5zZXRGcm9tT2JqZWN0KHRoaXMuX3Byb3h5R3JvdXBzLmdldChzb2xpZC51dWlkKSB8fCBzb2xpZCkuaXNFbXB0eSgpCiAgICAgID8gc29saWQuZ2V0V29ybGRQb3NpdGlvbih0aGlzLl9zY3JhdGNoLmNlbnRlcikKICAgICAgOiBib3guZ2V0Q2VudGVyKHRoaXMuX3NjcmF0Y2guY2VudGVyKTsKICAgIGNvbnN0IHdvcmxkUG9zaXRpb24gPSBzb2xpZC5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpOwogICAgY29uc3Qgd29ybGRRdWF0ZXJuaW9uID0gc29saWQuZ2V0V29ybGRRdWF0ZXJuaW9uKG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkpOwogICAgY29uc3Qgb2Zmc2V0TG9jYWwgPSB3b3JsZFBvc2l0aW9uLmNsb25lKCkuc3ViKGNlbnRlcikuYXBwbHlRdWF0ZXJuaW9uKHdvcmxkUXVhdGVybmlvbi5jbG9uZSgpLmludmVydCgpKTsKICAgIHRhcmdldC5wb3NpdGlvbi5jb3B5KGNlbnRlcik7CiAgICB0YXJnZXQucXVhdGVybmlvbi5jb3B5KHdvcmxkUXVhdGVybmlvbik7CiAgICB0aGlzLnZpZXdlci5zY2VuZS5hZGQodGFyZ2V0KTsKICAgIGNvbnRyb2xzLmF0dGFjaCh0YXJnZXQpOwogICAgdGhpcy52aWV3ZXIuc2NlbmUuYWRkKGNvbnRyb2xzKTsKCiAgICBjb25zdCBhcHBseVRvU29saWQgPSAocGVyc2lzdCA9IGZhbHNlKSA9PiB7CiAgICAgIGNvbnN0IHRhcmdldFdvcmxkUG9zaXRpb24gPSB0YXJnZXQuZ2V0V29ybGRQb3NpdGlvbihuZXcgVEhSRUUuVmVjdG9yMygpKTsKICAgICAgY29uc3QgdGFyZ2V0V29ybGRRdWF0ZXJuaW9uID0gdGFyZ2V0LmdldFdvcmxkUXVhdGVybmlvbihuZXcgVEhSRUUuUXVhdGVybmlvbigpKTsKICAgICAgY29uc3Qgc29saWRXb3JsZFBvc2l0aW9uID0gdGFyZ2V0V29ybGRQb3NpdGlvbi5jbG9uZSgpLmFkZChvZmZzZXRMb2NhbC5jbG9uZSgpLmFwcGx5UXVhdGVybmlvbih0YXJnZXRXb3JsZFF1YXRlcm5pb24pKTsKICAgICAgdGhpcy5fc2V0U29saWRXb3JsZFBvc2Uoc29saWQsIHNvbGlkV29ybGRQb3NpdGlvbiwgdGFyZ2V0V29ybGRRdWF0ZXJuaW9uKTsKICAgICAgdGhpcy5fdXBkYXRlUnVudGltZVRyYW5zZm9ybUZyb21Tb2xpZChzb2xpZCwgeyBwZXJzaXN0IH0pOwogICAgICBpZiAocGVyc2lzdCkgewogICAgICAgIGlmICh0aGlzLl9waHlzaWNzV29ybGQpIHsKICAgICAgICAgIHZvaWQgdGhpcy5fcmVidWlsZFBoeXNpY3NXb3JsZCgpOwogICAgICAgIH0KICAgICAgfQogICAgICB0cnkgeyB0aGlzLnZpZXdlcj8ucmVuZGVyPy4oKTsgfSBjYXRjaCB7fQogICAgfTsKCiAgICBjb25zdCBjaGFuZ2VIYW5kbGVyID0gKCkgPT4gYXBwbHlUb1NvbGlkKGZhbHNlKTsKICAgIGNvbnN0IGRyYWdIYW5kbGVyID0gKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IGRyYWdnaW5nID0gISFldmVudD8udmFsdWU7CiAgICAgIHRyeSB7IGlmICh0aGlzLnZpZXdlcj8uY29udHJvbHMpIHRoaXMudmlld2VyLmNvbnRyb2xzLmVuYWJsZWQgPSAhZHJhZ2dpbmc7IH0gY2F0Y2gge30KICAgICAgaWYgKCFkcmFnZ2luZykgYXBwbHlUb1NvbGlkKHRydWUpOwogICAgfTsKICAgIGNvbnN0IG9iamVjdENoYW5nZUhhbmRsZXIgPSAoKSA9PiB7CiAgICAgIGlmICghY29udHJvbHMuZHJhZ2dpbmcpIGFwcGx5VG9Tb2xpZCh0cnVlKTsKICAgIH07CiAgICBjb25zdCB1cGRhdGVGb3JDYW1lcmEgPSAoKSA9PiB7CiAgICAgIHRyeSB7IGNvbnRyb2xzLnVwZGF0ZT8uKCk7IH0gY2F0Y2gge30KICAgIH07CiAgICBjb25zdCBjYW1lcmFDaGFuZ2VIYW5kbGVyID0gKCkgPT4gdXBkYXRlRm9yQ2FtZXJhKCk7CiAgICBjb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTsKICAgIGNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdnaW5nLWNoYW5nZWQnLCBkcmFnSGFuZGxlcik7CiAgICBjb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdvYmplY3RDaGFuZ2UnLCBvYmplY3RDaGFuZ2VIYW5kbGVyKTsKICAgIHRyeSB7IHRoaXMudmlld2VyPy5jb250cm9scz8uYWRkRXZlbnRMaXN0ZW5lcj8uKCdjaGFuZ2UnLCBjYW1lcmFDaGFuZ2VIYW5kbGVyKTsgfSBjYXRjaCB7fQoKICAgIGNvbnN0IGdsb2JhbFN0YXRlID0geyBjb250cm9scywgdmlld2VyOiB0aGlzLnZpZXdlciwgdGFyZ2V0LCB1cGRhdGVGb3JDYW1lcmEgfTsKICAgIHRyeSB7IHdpbmRvdy5fX0JSRVBfYWN0aXZlWGZvcm0gPSBnbG9iYWxTdGF0ZTsgfSBjYXRjaCB7fQogICAgdGhpcy5fdHJhbnNmb3JtU2Vzc2lvbiA9IHsKICAgICAgc29saWQsCiAgICAgIGNvbnRyb2xzLAogICAgICB0YXJnZXQsCiAgICAgIGNoYW5nZUhhbmRsZXIsCiAgICAgIGRyYWdIYW5kbGVyLAogICAgICBvYmplY3RDaGFuZ2VIYW5kbGVyLAogICAgICBjYW1lcmFDaGFuZ2VIYW5kbGVyLAogICAgICBnbG9iYWxTdGF0ZSwKICAgICAgbW9kZTogJ3RyYW5zbGF0ZScsCiAgICB9OwogICAgaWYgKHRoaXMuX3BoeXNpY3NXb3JsZCkgewogICAgICB2b2lkIHRoaXMuX3JlYnVpbGRQaHlzaWNzV29ybGQoKTsKICAgIH0KICAgIHVwZGF0ZUZvckNhbWVyYSgpOwogICAgYXBwbHlUb1NvbGlkKGZhbHNlKTsKICB9CgogIF9zdG9wVHJhbnNmb3JtU2Vzc2lvbigpIHsKICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLl90cmFuc2Zvcm1TZXNzaW9uOwogICAgaWYgKCFzZXNzaW9uKSByZXR1cm47CiAgICB0cnkgeyBzZXNzaW9uLmNvbnRyb2xzPy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBzZXNzaW9uLmNoYW5nZUhhbmRsZXIpOyB9IGNhdGNoIHt9CiAgICB0cnkgeyBzZXNzaW9uLmNvbnRyb2xzPy5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnZ2luZy1jaGFuZ2VkJywgc2Vzc2lvbi5kcmFnSGFuZGxlcik7IH0gY2F0Y2gge30KICAgIHRyeSB7IHNlc3Npb24uY29udHJvbHM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29iamVjdENoYW5nZScsIHNlc3Npb24ub2JqZWN0Q2hhbmdlSGFuZGxlcik7IH0gY2F0Y2gge30KICAgIHRyeSB7IHRoaXMudmlld2VyPy5jb250cm9scz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcj8uKCdjaGFuZ2UnLCBzZXNzaW9uLmNhbWVyYUNoYW5nZUhhbmRsZXIpOyB9IGNhdGNoIHt9CiAgICB0cnkgeyBzZXNzaW9uLmNvbnRyb2xzPy5kZXRhY2g/LigpOyB9IGNhdGNoIHt9CiAgICB0cnkgeyB0aGlzLnZpZXdlcj8uc2NlbmU/LnJlbW92ZT8uKHNlc3Npb24uY29udHJvbHMpOyB9IGNhdGNoIHt9CiAgICB0cnkgeyB0aGlzLnZpZXdlcj8uc2NlbmU/LnJlbW92ZT8uKHNlc3Npb24udGFyZ2V0KTsgfSBjYXRjaCB7fQogICAgdHJ5IHsgc2Vzc2lvbi5jb250cm9scz8uZGlzcG9zZT8uKCk7IH0gY2F0Y2gge30KICAgIHRyeSB7CiAgICAgIGlmICh3aW5kb3cuX19CUkVQX2FjdGl2ZVhmb3JtID09PSBzZXNzaW9uLmdsb2JhbFN0YXRlKSB7CiAgICAgICAgd2luZG93Ll9fQlJFUF9hY3RpdmVYZm9ybSA9IG51bGw7CiAgICAgIH0KICAgIH0gY2F0Y2gge30KICAgIHRoaXMuX3RyYW5zZm9ybVNlc3Npb24gPSBudWxsOwogICAgdHJ5IHsgaWYgKHRoaXMudmlld2VyPy5jb250cm9scykgdGhpcy52aWV3ZXIuY29udHJvbHMuZW5hYmxlZCA9IHRydWU7IH0gY2F0Y2gge30KICAgIGlmICh0aGlzLl9waHlzaWNzV29ybGQpIHsKICAgICAgdm9pZCB0aGlzLl9yZWJ1aWxkUGh5c2ljc1dvcmxkKCk7CiAgICB9CiAgICB0cnkgeyB0aGlzLnZpZXdlcj8ucmVuZGVyPy4oKTsgfSBjYXRjaCB7fQogIH0KCiAgX2xpc3RTY2VuZVNvbGlkcygpIHsKICAgIGNvbnN0IHNjZW5lID0gdGhpcy52aWV3ZXI/LnBhcnRIaXN0b3J5Py5zY2VuZSB8fCB0aGlzLnZpZXdlcj8uc2NlbmUgfHwgbnVsbDsKICAgIGNvbnN0IHNvbGlkcyA9IFtdOwogICAgaWYgKCFzY2VuZT8udHJhdmVyc2UpIHJldHVybiBzb2xpZHM7CiAgICBzY2VuZS50cmF2ZXJzZSgob2JqKSA9PiB7CiAgICAgIGlmIChvYmo/LnR5cGUgPT09ICdTT0xJRCcpIHNvbGlkcy5wdXNoKG9iaik7CiAgICB9KTsKICAgIHJldHVybiBzb2xpZHM7CiAgfQoKICBfYmluZFN0YXRlTWFuYWdlcigpIHsKICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLnZpZXdlcj8ucGFydEhpc3Rvcnk/LnNpbXVsYXRpb25TdGF0ZU1hbmFnZXI7CiAgICBpZiAoIW1hbmFnZXI/LmFkZExpc3RlbmVyKSByZXR1cm47CiAgICB0aGlzLl9yZW1vdmVTdGF0ZU1hbmFnZXJMaXN0ZW5lciA9IG1hbmFnZXIuYWRkTGlzdGVuZXIoKCkgPT4gewogICAgICB0aGlzLl9yZWNvbmNpbGVNb3Rpb25TdGF0ZSgpOwogICAgICBpZiAodGhpcy5fYWN0aXZlICYmIHRoaXMuX3BoeXNpY3NXb3JsZCkgewogICAgICAgIHZvaWQgdGhpcy5fcmVidWlsZFBoeXNpY3NXb3JsZCgpOwogICAgICB9CiAgICAgIHRoaXMuX2VtaXQoKTsKICAgIH0pOwogIH0KCiAgX2VtaXQoKSB7CiAgICBpZiAoIXRoaXMuX2xpc3RlbmVycyB8fCB0aGlzLl9saXN0ZW5lcnMuc2l6ZSA9PT0gMCkgcmV0dXJuOwogICAgY29uc3QgcGF5bG9hZCA9IHsKICAgICAgYWN0aXZlOiB0aGlzLl9hY3RpdmUsCiAgICAgIHBsYXlpbmc6IHRoaXMuX2lzUGxheWluZywKICAgICAgbWFuYWdlcjogdGhpcywKICAgIH07CiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIEFycmF5LmZyb20odGhpcy5fbGlzdGVuZXJzKSkgewogICAgICB0cnkgeyBsaXN0ZW5lcihwYXlsb2FkKTsgfSBjYXRjaCB7fQogICAgfQogIH0KCiAgX2dldE1vdGlvbkVudHJpZXMoKSB7CiAgICBjb25zdCBtb3Rpb25zID0gdGhpcy52aWV3ZXI/LnBhcnRIaXN0b3J5Py5zaW11bGF0aW9uU3RhdGVNYW5hZ2VyPy5nZXRNb3Rpb25zPy4oKTsKICAgIHJldHVybiBBcnJheS5pc0FycmF5KG1vdGlvbnMpCiAgICAgID8gbW90aW9ucy5tYXAoKGVudHJ5KSA9PiAoZW50cnk/LmlucHV0UGFyYW1zICYmIHR5cGVvZiBlbnRyeS5pbnB1dFBhcmFtcyA9PT0gJ29iamVjdCcpID8gZW50cnkuaW5wdXRQYXJhbXMgOiBlbnRyeSkuZmlsdGVyKEJvb2xlYW4pCiAgICAgIDogW107CiAgfQoKICBfcmVzZXRNb3Rpb25SdW50aW1lKCkgewogICAgdGhpcy5fbW90aW9uU3RhdGUuY2xlYXIoKTsKICAgIGZvciAoY29uc3QgbW90aW9uIG9mIHRoaXMuX2dldE1vdGlvbkVudHJpZXMoKSkgewogICAgICB0aGlzLl9tb3Rpb25TdGF0ZS5zZXQobW90aW9uLmlkLCB7IHByb2dyZXNzOiAwLCBjb21wbGV0ZWQ6IGZhbHNlIH0pOwogICAgfQogIH0KCiAgX3JlY29uY2lsZU1vdGlvblN0YXRlKCkgewogICAgY29uc3QgYWN0aXZlSWRzID0gbmV3IFNldCgpOwogICAgZm9yIChjb25zdCBtb3Rpb24gb2YgdGhpcy5fZ2V0TW90aW9uRW50cmllcygpKSB7CiAgICAgIGFjdGl2ZUlkcy5hZGQobW90aW9uLmlkKTsKICAgICAgaWYgKCF0aGlzLl9tb3Rpb25TdGF0ZS5oYXMobW90aW9uLmlkKSkgewogICAgICAgIHRoaXMuX21vdGlvblN0YXRlLnNldChtb3Rpb24uaWQsIHsgcHJvZ3Jlc3M6IDAsIGNvbXBsZXRlZDogZmFsc2UgfSk7CiAgICAgIH0KICAgIH0KICAgIGZvciAoY29uc3QgaWQgb2YgQXJyYXkuZnJvbSh0aGlzLl9tb3Rpb25TdGF0ZS5rZXlzKCkpKSB7CiAgICAgIGlmICghYWN0aXZlSWRzLmhhcyhpZCkpIHRoaXMuX21vdGlvblN0YXRlLmRlbGV0ZShpZCk7CiAgICB9CiAgfQoKICBfaXNTb2xpZE1vdGlvbkRyaXZlbihzb2xpZCkgewogICAgaWYgKCFzb2xpZCB8fCAhdGhpcy5faXNQbGF5aW5nKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBuYW1lID0gbm9ybWFsaXplVGV4dChzb2xpZC5uYW1lLCAnJyk7CiAgICBpZiAoIW5hbWUpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0aGlzLl9nZXRNb3Rpb25FbnRyaWVzKCkuc29tZSgobW90aW9uKSA9PiBub3JtYWxpemVUZXh0KHRoaXMuX3Jlc29sdmVSZWZlcmVuY2VOYW1lKG1vdGlvbj8uc29saWQpLCAnJykgPT09IG5hbWUpOwogIH0KCiAgX2FwcGx5TW90aW9uU3RlcChkdCkgewogICAgbGV0IGNoYW5nZWQgPSBmYWxzZTsKICAgIGZvciAoY29uc3QgbW90aW9uIG9mIHRoaXMuX2dldE1vdGlvbkVudHJpZXMoKSkgewogICAgICBjb25zdCBzb2xpZCA9IHRoaXMuX3Jlc29sdmVNb3Rpb25Tb2xpZChtb3Rpb24pOwogICAgICBpZiAoIXNvbGlkKSBjb250aW51ZTsKICAgICAgaWYgKG1vdGlvbi50eXBlID09PSAnbGluZWFyJykgY2hhbmdlZCA9IHRoaXMuX2FwcGx5TGluZWFyTW90aW9uU3RlcChzb2xpZCwgbW90aW9uLCBkdCkgfHwgY2hhbmdlZDsKICAgICAgZWxzZSBjaGFuZ2VkID0gdGhpcy5fYXBwbHlSb3RhdGlvbk1vdGlvblN0ZXAoc29saWQsIG1vdGlvbiwgZHQpIHx8IGNoYW5nZWQ7CiAgICB9CiAgICByZXR1cm4gY2hhbmdlZDsKICB9CgogIF9yZXNvbHZlTW90aW9uU29saWQobW90aW9uKSB7CiAgICBjb25zdCBuYW1lID0gbm9ybWFsaXplVGV4dCh0aGlzLl9yZXNvbHZlUmVmZXJlbmNlTmFtZShtb3Rpb24/LnNvbGlkKSwgJycpOwogICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IG9iamVjdCA9IHRoaXMudmlld2VyPy5wYXJ0SGlzdG9yeT8uZ2V0T2JqZWN0QnlOYW1lPy4obmFtZSkgfHwgbnVsbDsKICAgIHJldHVybiBvYmplY3Q/LnR5cGUgPT09ICdTT0xJRCcgPyBvYmplY3QgOiBudWxsOwogIH0KCiAgX3Jlc29sdmVNb3Rpb25BeGlzKG1vdGlvbikgewogICAgY29uc3Qgb2JqZWN0TmFtZSA9IG5vcm1hbGl6ZVRleHQodGhpcy5fcmVzb2x2ZVJlZmVyZW5jZU5hbWUobW90aW9uPy5heGlzKSwgJycpOwogICAgY29uc3Qgb2JqZWN0ID0gb2JqZWN0TmFtZSA/IHRoaXMudmlld2VyPy5wYXJ0SGlzdG9yeT8uZ2V0T2JqZWN0QnlOYW1lPy4ob2JqZWN0TmFtZSkgOiBudWxsOwogICAgaWYgKCFvYmplY3QpIHJldHVybiBudWxsOwogICAgY29uc3QgbGl2ZSA9IHRoaXMuX2V4dHJhY3RBeGlzUG9pbnRzRnJvbU9iamVjdChvYmplY3QpOwogICAgaWYgKCFsaXZlPy5zdGFydCB8fCAhbGl2ZT8uZW5kKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IHN0YXJ0VmVjID0gbmV3IFRIUkVFLlZlY3RvcjMoTnVtYmVyKGxpdmUuc3RhcnRbMF0pIHx8IDAsIE51bWJlcihsaXZlLnN0YXJ0WzFdKSB8fCAwLCBOdW1iZXIobGl2ZS5zdGFydFsyXSkgfHwgMCk7CiAgICBjb25zdCBlbmRWZWMgPSBuZXcgVEhSRUUuVmVjdG9yMyhOdW1iZXIobGl2ZS5lbmRbMF0pIHx8IDAsIE51bWJlcihsaXZlLmVuZFsxXSkgfHwgMCwgTnVtYmVyKGxpdmUuZW5kWzJdKSB8fCAwKTsKICAgIGlmIChzdGFydFZlYy5kaXN0YW5jZVRvU3F1YXJlZChlbmRWZWMpIDw9IDFlLTEyKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydFZlYywgZW5kOiBlbmRWZWMgfTsKICB9CgogIF9yZXNvbHZlUmVmZXJlbmNlTmFtZSh2YWx1ZSkgewogICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgIHJldHVybiB0aGlzLl9yZXNvbHZlUmVmZXJlbmNlTmFtZSh2YWx1ZVswXSB8fCBudWxsKTsKICAgIH0KICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7CiAgICAgIHJldHVybiBub3JtYWxpemVUZXh0KHZhbHVlLm5hbWUgfHwgdmFsdWUub2JqZWN0TmFtZSB8fCB2YWx1ZS5sYWJlbCB8fCAnJywgJycpOwogICAgfQogICAgcmV0dXJuIG5vcm1hbGl6ZVRleHQodmFsdWUsICcnKTsKICB9CgogIF9leHRyYWN0QXhpc1BvaW50c0Zyb21PYmplY3Qob2JqZWN0KSB7CiAgICBpZiAoIW9iamVjdCkgcmV0dXJuIG51bGw7CiAgICB0cnkgewogICAgICBpZiAodHlwZW9mIG9iamVjdC5wb2ludHMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBjb25zdCBwb2ludHMgPSBvYmplY3QucG9pbnRzKHRydWUpOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBvaW50cykgJiYgcG9pbnRzLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICBjb25zdCBmaXJzdCA9IHBvaW50c1swXTsKICAgICAgICAgIGNvbnN0IGxhc3QgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdOwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc3RhcnQ6IFtOdW1iZXIoZmlyc3Q/LngpIHx8IDAsIE51bWJlcihmaXJzdD8ueSkgfHwgMCwgTnVtYmVyKGZpcnN0Py56KSB8fCAwXSwKICAgICAgICAgICAgZW5kOiBbTnVtYmVyKGxhc3Q/LngpIHx8IDAsIE51bWJlcihsYXN0Py55KSB8fCAwLCBOdW1iZXIobGFzdD8ueikgfHwgMF0sCiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQogICAgfSBjYXRjaCB7fQogICAgdHJ5IHsKICAgICAgb2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkPy4odHJ1ZSk7CiAgICAgIGNvbnN0IGF0dHIgPSBvYmplY3QuZ2VvbWV0cnk/LmdldEF0dHJpYnV0ZT8uKCdwb3NpdGlvbicpOwogICAgICBpZiAoIWF0dHIgfHwgYXR0ci5jb3VudCA8IDIpIHJldHVybiBudWxsOwogICAgICBjb25zdCBmaXJzdCA9IG5ldyBUSFJFRS5WZWN0b3IzKGF0dHIuZ2V0WCgwKSwgYXR0ci5nZXRZKDApLCBhdHRyLmdldFooMCkpLmFwcGx5TWF0cml4NChvYmplY3QubWF0cml4V29ybGQpOwogICAgICBjb25zdCBsYXN0SW5kZXggPSBhdHRyLmNvdW50IC0gMTsKICAgICAgY29uc3QgbGFzdCA9IG5ldyBUSFJFRS5WZWN0b3IzKGF0dHIuZ2V0WChsYXN0SW5kZXgpLCBhdHRyLmdldFkobGFzdEluZGV4KSwgYXR0ci5nZXRaKGxhc3RJbmRleCkpLmFwcGx5TWF0cml4NChvYmplY3QubWF0cml4V29ybGQpOwogICAgICByZXR1cm4gewogICAgICAgIHN0YXJ0OiBbZmlyc3QueCwgZmlyc3QueSwgZmlyc3Quel0sCiAgICAgICAgZW5kOiBbbGFzdC54LCBsYXN0LnksIGxhc3Quel0sCiAgICAgIH07CiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBfYXBwbHlSb3RhdGlvbk1vdGlvblN0ZXAoc29saWQsIG1vdGlvbiwgZHQpIHsKICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fbW90aW9uU3RhdGUuZ2V0KG1vdGlvbi5pZCkgfHwgeyBwcm9ncmVzczogMCwgY29tcGxldGVkOiBmYWxzZSB9OwogICAgaWYgKHN0YXRlLmNvbXBsZXRlZCkgcmV0dXJuOwogICAgY29uc3QgYXhpcyA9IHRoaXMuX3Jlc29sdmVNb3Rpb25BeGlzKG1vdGlvbik7CiAgICBpZiAoIWF4aXMpIHJldHVybjsKICAgIGNvbnN0IHNwZWVkRGVnID0gTnVtYmVyKG1vdGlvbj8uc3BlZWQpOwogICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoc3BlZWREZWcpIHx8IE1hdGguYWJzKHNwZWVkRGVnKSA8PSAxZS05KSByZXR1cm47CiAgICBsZXQgZGVsdGFEZWcgPSBzcGVlZERlZyAqIGR0OwogICAgY29uc3QgbGltaXREZWcgPSBOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKG1vdGlvbj8uYW5nbGUpKSA/IE51bWJlcihtb3Rpb24uYW5nbGUpIDogbnVsbDsKICAgIGlmIChsaW1pdERlZyAhPSBudWxsKSB7CiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGxpbWl0RGVnIC0gc3RhdGUucHJvZ3Jlc3M7CiAgICAgIGlmIChNYXRoLmFicyhyZW1haW5pbmcpIDw9IDFlLTkpIHsKICAgICAgICBzdGF0ZS5jb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIHRoaXMuX21vdGlvblN0YXRlLnNldChtb3Rpb24uaWQsIHN0YXRlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKE1hdGguc2lnbihkZWx0YURlZyB8fCAxKSAhPT0gTWF0aC5zaWduKHJlbWFpbmluZyB8fCAxKSkgewogICAgICAgIGRlbHRhRGVnID0gTWF0aC5zaWduKHJlbWFpbmluZyB8fCAxKSAqIE1hdGguYWJzKGRlbHRhRGVnKTsKICAgICAgfQogICAgICBpZiAoTWF0aC5hYnMoZGVsdGFEZWcpID4gTWF0aC5hYnMocmVtYWluaW5nKSkgZGVsdGFEZWcgPSByZW1haW5pbmc7CiAgICB9CiAgICBpZiAoTWF0aC5hYnMoZGVsdGFEZWcpIDw9IDFlLTkpIHJldHVybiBmYWxzZTsKICAgIHRoaXMuX3JvdGF0ZVNvbGlkQXJvdW5kV29ybGRBeGlzKHNvbGlkLCBheGlzLnN0YXJ0LCBheGlzLmVuZCwgVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKGRlbHRhRGVnKSk7CiAgICBzdGF0ZS5wcm9ncmVzcyArPSBkZWx0YURlZzsKICAgIGlmIChsaW1pdERlZyAhPSBudWxsICYmIE1hdGguYWJzKGxpbWl0RGVnIC0gc3RhdGUucHJvZ3Jlc3MpIDw9IDFlLTkpIHN0YXRlLmNvbXBsZXRlZCA9IHRydWU7CiAgICB0aGlzLl9tb3Rpb25TdGF0ZS5zZXQobW90aW9uLmlkLCBzdGF0ZSk7CiAgICB0aGlzLl91cGRhdGVSdW50aW1lVHJhbnNmb3JtRnJvbVNvbGlkKHNvbGlkLCB7IHBlcnNpc3Q6IGZhbHNlIH0pOwogICAgdGhpcy5fbW92ZWRTb2xpZElkcy5hZGQoc29saWQudXVpZCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIF9hcHBseUxpbmVhck1vdGlvblN0ZXAoc29saWQsIG1vdGlvbiwgZHQpIHsKICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fbW90aW9uU3RhdGUuZ2V0KG1vdGlvbi5pZCkgfHwgeyBwcm9ncmVzczogMCwgY29tcGxldGVkOiBmYWxzZSB9OwogICAgaWYgKHN0YXRlLmNvbXBsZXRlZCkgcmV0dXJuOwogICAgY29uc3QgYXhpcyA9IHRoaXMuX3Jlc29sdmVNb3Rpb25BeGlzKG1vdGlvbik7CiAgICBpZiAoIWF4aXMpIHJldHVybjsKICAgIGNvbnN0IHNwZWVkID0gTnVtYmVyKG1vdGlvbj8uc3BlZWQpOwogICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoc3BlZWQpIHx8IE1hdGguYWJzKHNwZWVkKSA8PSAxZS05KSByZXR1cm47CiAgICBsZXQgZGVsdGEgPSBzcGVlZCAqIGR0OwogICAgY29uc3QgbGltaXQgPSBOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKG1vdGlvbj8uZGlzdGFuY2UpKSA/IE51bWJlcihtb3Rpb24uZGlzdGFuY2UpIDogbnVsbDsKICAgIGlmIChsaW1pdCAhPSBudWxsKSB7CiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGxpbWl0IC0gc3RhdGUucHJvZ3Jlc3M7CiAgICAgIGlmIChNYXRoLmFicyhyZW1haW5pbmcpIDw9IDFlLTkpIHsKICAgICAgICBzdGF0ZS5jb21wbGV0ZWQgPSB0cnVlOwogICAgICAgIHRoaXMuX21vdGlvblN0YXRlLnNldChtb3Rpb24uaWQsIHN0YXRlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKE1hdGguc2lnbihkZWx0YSB8fCAxKSAhPT0gTWF0aC5zaWduKHJlbWFpbmluZyB8fCAxKSkgewogICAgICAgIGRlbHRhID0gTWF0aC5zaWduKHJlbWFpbmluZyB8fCAxKSAqIE1hdGguYWJzKGRlbHRhKTsKICAgICAgfQogICAgICBpZiAoTWF0aC5hYnMoZGVsdGEpID4gTWF0aC5hYnMocmVtYWluaW5nKSkgZGVsdGEgPSByZW1haW5pbmc7CiAgICB9CiAgICBpZiAoTWF0aC5hYnMoZGVsdGEpIDw9IDFlLTkpIHJldHVybiBmYWxzZTsKICAgIHRoaXMuX3RyYW5zbGF0ZVNvbGlkQWxvbmdXb3JsZEF4aXMoc29saWQsIGF4aXMuc3RhcnQsIGF4aXMuZW5kLCBkZWx0YSk7CiAgICBzdGF0ZS5wcm9ncmVzcyArPSBkZWx0YTsKICAgIGlmIChsaW1pdCAhPSBudWxsICYmIE1hdGguYWJzKGxpbWl0IC0gc3RhdGUucHJvZ3Jlc3MpIDw9IDFlLTkpIHN0YXRlLmNvbXBsZXRlZCA9IHRydWU7CiAgICB0aGlzLl9tb3Rpb25TdGF0ZS5zZXQobW90aW9uLmlkLCBzdGF0ZSk7CiAgICB0aGlzLl91cGRhdGVSdW50aW1lVHJhbnNmb3JtRnJvbVNvbGlkKHNvbGlkLCB7IHBlcnNpc3Q6IGZhbHNlIH0pOwogICAgdGhpcy5fbW92ZWRTb2xpZElkcy5hZGQoc29saWQudXVpZCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIF9yb3RhdGVTb2xpZEFyb3VuZFdvcmxkQXhpcyhzb2xpZCwgYXhpc1N0YXJ0LCBheGlzRW5kLCBhbmdsZVJhZCkgewogICAgY29uc3QgcGFyZW50ID0gc29saWQucGFyZW50IHx8IHRoaXMudmlld2VyPy5zY2VuZSB8fCBudWxsOwogICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuX3NjcmF0Y2g7CiAgICBzY3JhdGNoLmF4aXMuY29weShheGlzRW5kKS5zdWIoYXhpc1N0YXJ0KS5ub3JtYWxpemUoKTsKICAgIHNjcmF0Y2gucGFyZW50V29ybGRNYXRyaXguY29weShwYXJlbnQ/Lm1hdHJpeFdvcmxkIHx8IG5ldyBUSFJFRS5NYXRyaXg0KCkpOwogICAgc2NyYXRjaC5wYXJlbnRJbnZlcnNlLmNvcHkoc2NyYXRjaC5wYXJlbnRXb3JsZE1hdHJpeCkuaW52ZXJ0KCk7CiAgICBzY3JhdGNoLndvcmxkTWF0cml4LmNvcHkoc29saWQubWF0cml4V29ybGQpOwogICAgc2NyYXRjaC5kZWx0YU1hdHJpeC5tYWtlVHJhbnNsYXRpb24oYXhpc1N0YXJ0LngsIGF4aXNTdGFydC55LCBheGlzU3RhcnQueik7CiAgICBzY3JhdGNoLmRlbHRhTWF0cml4Lm11bHRpcGx5KG5ldyBUSFJFRS5NYXRyaXg0KCkubWFrZVJvdGF0aW9uQXhpcyhzY3JhdGNoLmF4aXMsIGFuZ2xlUmFkKSk7CiAgICBzY3JhdGNoLmRlbHRhTWF0cml4Lm11bHRpcGx5KG5ldyBUSFJFRS5NYXRyaXg0KCkubWFrZVRyYW5zbGF0aW9uKC1heGlzU3RhcnQueCwgLWF4aXNTdGFydC55LCAtYXhpc1N0YXJ0LnopKTsKICAgIHNjcmF0Y2gud29ybGRNYXRyaXgucHJlbXVsdGlwbHkoc2NyYXRjaC5kZWx0YU1hdHJpeCk7CiAgICBzY3JhdGNoLmxvY2FsTWF0cml4LmNvcHkoc2NyYXRjaC5wYXJlbnRJbnZlcnNlKS5tdWx0aXBseShzY3JhdGNoLndvcmxkTWF0cml4KTsKICAgIHNjcmF0Y2gubG9jYWxNYXRyaXguZGVjb21wb3NlKHNvbGlkLnBvc2l0aW9uLCBzb2xpZC5xdWF0ZXJuaW9uLCBzb2xpZC5zY2FsZSk7CiAgICBzb2xpZC51cGRhdGVNYXRyaXhXb3JsZD8uKHRydWUpOwogICAgdGhpcy5fc3luY1Byb3h5R3JvdXBUcmFuc2Zvcm0oc29saWQpOwogIH0KCiAgX3RyYW5zbGF0ZVNvbGlkQWxvbmdXb3JsZEF4aXMoc29saWQsIGF4aXNTdGFydCwgYXhpc0VuZCwgZGlzdGFuY2UpIHsKICAgIGNvbnN0IHBhcmVudCA9IHNvbGlkLnBhcmVudCB8fCB0aGlzLnZpZXdlcj8uc2NlbmUgfHwgbnVsbDsKICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLl9zY3JhdGNoOwogICAgc2NyYXRjaC5heGlzLmNvcHkoYXhpc0VuZCkuc3ViKGF4aXNTdGFydCkubm9ybWFsaXplKCk7CiAgICBzY3JhdGNoLnRyYW5zbGF0aW9uLmNvcHkoc2NyYXRjaC5heGlzKS5tdWx0aXBseVNjYWxhcihkaXN0YW5jZSk7CiAgICBzY3JhdGNoLnBhcmVudFdvcmxkTWF0cml4LmNvcHkocGFyZW50Py5tYXRyaXhXb3JsZCB8fCBuZXcgVEhSRUUuTWF0cml4NCgpKTsKICAgIHNjcmF0Y2gucGFyZW50SW52ZXJzZS5jb3B5KHNjcmF0Y2gucGFyZW50V29ybGRNYXRyaXgpLmludmVydCgpOwogICAgc2NyYXRjaC53b3JsZE1hdHJpeC5jb3B5KHNvbGlkLm1hdHJpeFdvcmxkKTsKICAgIHNjcmF0Y2guZGVsdGFNYXRyaXgubWFrZVRyYW5zbGF0aW9uKHNjcmF0Y2gudHJhbnNsYXRpb24ueCwgc2NyYXRjaC50cmFuc2xhdGlvbi55LCBzY3JhdGNoLnRyYW5zbGF0aW9uLnopOwogICAgc2NyYXRjaC53b3JsZE1hdHJpeC5wcmVtdWx0aXBseShzY3JhdGNoLmRlbHRhTWF0cml4KTsKICAgIHNjcmF0Y2gubG9jYWxNYXRyaXguY29weShzY3JhdGNoLnBhcmVudEludmVyc2UpLm11bHRpcGx5KHNjcmF0Y2gud29ybGRNYXRyaXgpOwogICAgc2NyYXRjaC5sb2NhbE1hdHJpeC5kZWNvbXBvc2Uoc29saWQucG9zaXRpb24sIHNvbGlkLnF1YXRlcm5pb24sIHNvbGlkLnNjYWxlKTsKICAgIHNvbGlkLnVwZGF0ZU1hdHJpeFdvcmxkPy4odHJ1ZSk7CiAgICB0aGlzLl9zeW5jUHJveHlHcm91cFRyYW5zZm9ybShzb2xpZCk7CiAgfQp9Cg==",import.meta.url).href,{SimulationWorkbenchManager:e}=await import(A);return this._disposed?null:(this.simulationWorkbenchManager||(this.simulationWorkbenchManager=new e(this)),this.simulationWorkbenchManager)}catch(A){try{console.warn("[Viewer] Failed to load simulation workbench manager",A)}catch{}return null}finally{this._simulationWorkbenchManagerPromise=null}})(),this._simulationWorkbenchManagerPromise)}refreshWorkbenchUi(){if(!this._viewerOnlyMode){if(this._getActiveWorkbenchId()==="SIMULATION")this._ensureSimulationWorkbenchManager().then(A=>{try{A?.setActive?.(this._getActiveWorkbenchId()==="SIMULATION")}catch{}});else try{this.simulationWorkbenchManager?.setActive?.(!1)}catch{}try{this.historyWidget?.refreshWorkbenchUi?.()}catch{}try{tt.refreshSelectionActions?.()}catch{}try{this._refreshWorkbenchPanelVisibility()}catch{}try{this.mainToolbar?.refreshButtons?.()}catch{}}}_normalizeToolbarButtonInput(A,e,t,i="plugin"){const o=i||"plugin";return A&&typeof A=="object"&&!Array.isArray(A)?{...A,id:String(A.id||`toolbar-${Date.now()}-${Math.random().toString(36).slice(2,7)}`),source:A.source||o}:{id:`toolbar-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,label:A,title:e,onClick:t,source:o}}addToolbarButton(A,e,t){if(this._viewerOnlyMode)return null;const i=this._normalizeToolbarButtonInput(A,e,t,"plugin");if(this.mainToolbar&&typeof this.mainToolbar.addCustomButton=="function")try{return this.mainToolbar.addCustomButton(i)}catch{return null}return this._pendingToolbarButtons=this._pendingToolbarButtons||[],this._pendingToolbarButtons.push(i),null}_syncHistoryUiAfterUndoRedo(){try{this.expressionsManager?.refreshFromPartHistory?.()}catch{}try{this.pmiViewsWidget&&(this.pmiViewsWidget.refreshFromHistory?.(),this.pmiViewsWidget._renderList?.())}catch{}try{this.sheet2DWidget&&(this.sheet2DWidget.refreshFromHistory?.(),this.sheet2DWidget._renderList?.()),this._sheet2DEditorWindow?.refreshFromHistory?.()}catch{}try{this.simulationHistoryWidget?.refreshFromHistory?.()}catch{}try{this.wireHarnessConnectionsWidget&&(this.wireHarnessConnectionsWidget.refreshFromHistory?.(),this.wireHarnessConnectionsWidget._renderList?.())}catch{}try{this.historyWidget?.render?.()}catch{}try{this.refreshWorkbenchUi()}catch{}}async _syncWireHarnessRoutesFromHistoryState(A={}){const e=this.partHistory?.scene||this.scene||null,t=this.partHistory?.wireHarnessManager||null;if(!e||!t)return Bm(e),null;const i=t.consumePendingRestoredRouteResults?.();if(Array.isArray(i)&&i.length){const o=Jbt(this.partHistory,i);l_A(e,i,o),t.setRouteResults?.(i,{preservePendingRestore:!0});try{this.render?.()}catch{}return i}Bm(e),t.clearRouteResults?.();try{this.render?.()}catch{}return null}async refreshWireHarnessRoutes(A={}){const e=this.partHistory?.scene||this.scene||null,t=this.partHistory?.wireHarnessManager||null;if(!e||!t)return Bm(e),null;const i=Array.isArray(t.getConnections?.())?t.getConnections():[];if(!i.length)return Bm(e),t.setRouteResults?.([]),null;try{const{routes:o,bundleSegments:s}=await vbe(this.partHistory,i);l_A(e,o,s),t.setRouteResults?.(o);try{this.render?.()}catch{}return o}catch(o){return console.warn("[Viewer] Failed to refresh wire harness routes:",o),Bm(e),t.setRouteResults?.(i.map(s=>({connectionId:String(s?.id||""),connectionName:String(s?.name||s?.id||"Wire"),feasible:!1,error:o?.message||"Failed to route wire harness connections.",distance:null,polyline:[],segmentIds:[]}))),null}}async clearWireHarnessRoutes(A={}){const e=this.partHistory?.scene||this.scene||null,t=this.partHistory?.wireHarnessManager||null;Bm(e),t?.clearRouteResults?.();try{this.render?.()}catch{}return null}async _runFeatureHistoryUndoRedo(A){if(this._viewerOnlyMode)return!1;const e=this.partHistory;if(!e)return!1;let t=!1;try{A==="redo"?t=await e.redoFeatureHistory():t=await e.undoFeatureHistory()}catch{}try{this._syncHistoryUiAfterUndoRedo()}catch{}return t}_registerWorkbenchPanel(A={}){const e=String(A.id||"").trim();if(!e)return null;const t={...A,id:e};return this._workbenchPanelRecords.set(e,t),t}_refreshWorkbenchPanelVisibility(){if(this._viewerOnlyMode||!this.accordion)return;const A=this._getActiveWorkbenchId();for(const e of this._workbenchPanelRecords.values()){const t=String(e.title||"");t&&(oae(e,A)?this.accordion.showSection?.(t):this.accordion.hideSection?.(t))}}_normalizePluginSidePanelInput(A,e){return A&&typeof A=="object"&&!Array.isArray(A)?{...A,id:String(A.id||`plugin-panel-${Date.now()}-${Math.random().toString(36).slice(2,7)}`),title:String(A.title||A.id||"Plugin"),content:A.content,source:A.source||"plugin"}:{id:`plugin-panel-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,title:String(A||"Plugin"),content:e,source:"plugin"}}async _applyPluginSidePanel(A){if(this._viewerOnlyMode||!this.accordion||typeof this.accordion.addSection!="function")return null;const e=this._normalizePluginSidePanelInput(A),t=String(e.title||"Plugin"),i=await this.accordion.addSection(t);if(!i)return null;try{if(typeof e.content=="function"){const o=await e.content();o&&i.uiElement.appendChild(o)}else if(e.content instanceof HTMLElement)i.uiElement.appendChild(e.content);else if(e.content!=null){const o=document.createElement("pre");o.textContent=String(e.content),i.uiElement.appendChild(o)}try{const o=this.accordion.uiElement,s=o.querySelector('.accordion-title[name="accordion-title-Display Settings"]');if(s){const I=o.querySelector(`.accordion-title[name="accordion-title-${t}"]`);I&&i.uiElement&&I!==s&&(o.insertBefore(I,s),o.insertBefore(i.uiElement,s))}}catch{}}catch{}return this._registerWorkbenchPanel({...e,title:t,section:i}),this._refreshWorkbenchPanelVisibility(),i}async addPluginSidePanel(A,e){if(this._viewerOnlyMode)return null;const t=this._normalizePluginSidePanelInput(A,e);if(this._pluginUiReady)try{return await this._applyPluginSidePanel(t)}catch{return null}return this._pendingSidePanels=this._pendingSidePanels||[],this._pendingSidePanels.push(t),null}_refreshAssemblyConstraintsPanelVisibility(){if(this._viewerOnlyMode||!this.accordion||!this.accordion.uiElement)return;const A=oae({id:"assemblyConstraints",source:"builtin"},this._getActiveWorkbenchId()),e=this._assemblyConstraintsVisible;if(this._assemblyConstraintsVisible=A,A){if(this.accordion.showSection?.(sb),e===!1)try{this.accordion.expandSection?.(sb)}catch{}}else this.accordion.hideSection?.(sb)||setTimeout(()=>{try{this.accordion.hideSection?.(sb)}catch{}},0)}dispose(){if(this._disposed)return;this._disposed=!0;try{this.simulationWorkbenchManager?.dispose?.()}catch{}cancelAnimationFrame(this._raf),this._hoverRefreshRaf!=null&&(cancelAnimationFrame(this._hoverRefreshRaf),this._hoverRefreshRaf=null);try{this.endPMIPreviewMode()}catch{}try{this._stopComponentTransformSession()}catch{}try{this.sheet2DWidget?.dispose?.()}catch{}try{this.wireHarnessConnectionsWidget?.dispose?.()}catch{}try{this._sheet2DEditorWindow?.dispose?.()}catch{}this._sheet2DEditorWindow=null,au(()=>this._sidebarDockController?.dispose()),this._sidebarDockController=null,au(()=>this._sidebarHomeBannerRO?.disconnect?.()),this._sidebarHomeBannerRO=null,au(()=>{this._sidebarHomeBanner&&this._sidebarHomeBanner.parentNode&&this._sidebarHomeBanner.parentNode.removeChild(this._sidebarHomeBanner)}),this._sidebarHomeBanner=null;const A=this.renderer?.domElement;this._detachRendererEvents(A);try{this.camera?.disableIdleCallbacks?.()}catch{}window.removeEventListener("pointerup",this._onPointerUp,{capture:!0}),window.removeEventListener("resize",this._onResize),window.removeEventListener("keydown",this._onKeyDown,{passive:!1}),window.removeEventListener("hover-changed",this._onHoverChanged);try{const e=this._cameraProjectionToggleButton;e&&(e.removeEventListener("click",this._onCameraProjectionToggleClick),e.remove())}catch{}this._cameraProjectionToggleButton=null;try{this.viewCube?.dispose?.()}catch{}if(this.viewCube=null,this.controls?.dispose?.(),this._disposeWebglPostProcessing(),this.renderer?.dispose?.(),this._webglRenderer&&this._webglRenderer!==this.renderer)try{this._webglRenderer.dispose()}catch{}try{for(const e of this._inspectorLinkedWindows||[])try{e.destroy?.()}catch{}this._inspectorLinkedWindows?.clear?.()}catch{}try{this._sketchMode&&this._sketchMode.dispose()}catch{}try{this._splineMode&&this._splineMode.dispose()}catch{}A&&A.parentNode&&A.parentNode.removeChild(A)}deactivateSketchPlaneSelection(){try{return AE.deactivateActiveReferenceSelection?.("sketchPlane",this.partHistory?.scene||this.scene||null)===!0}catch{return!1}}startSketchMode(A){if(!this._viewerOnlyMode){Em(this.partHistory,A,!1),Sy("Starting Sketch Mode for featureID:",A),Sy(this.partHistory.scene),Sy(this.partHistory),Sy(this);try{this._sketchMode&&this._sketchMode.dispose()}catch{}try{this._sketchSidebarPrev||(this._sketchSidebarPrev={pinned:this._sidebarPinned,autoHideSuspended:this._sidebarAutoHideSuspended,hoverVisible:this._sidebarHoverVisible}),this._setSidebarPinned(!1),this._setSidebarAutoHideSuspended(!1),this._setSidebarHoverVisible(!1)}catch{}this._sketchMode=new BRt(this,A,{useFatCurveLines:!0}),this._sketchMode.open()}}onSketchFinished(A,e){const t=this.partHistory;if(!t||!A)return;this.endSketchMode(A);const i=Array.isArray(t.features)?t.features.find(o=>o?.inputParams?.featureID===A):null;if(i){i.lastRunInputParams={},i.timestamp=0,i.dirty=!0,i.persistentData=i.persistentData||{},i.persistentData.sketch=e||{};try{const o=t.runHistory();o&&typeof o.then=="function"?(async()=>{try{await o,t.queueHistorySnapshot?.({debounceMs:0,reason:"sketch"})}catch(s){console.warn("[Viewer] Sketch history run failed:",s)}finally{Em(t,A,!0)}})():(Em(t,A,!0),t.queueHistorySnapshot?.({debounceMs:0,reason:"sketch"}))}catch{Em(t,A,!0)}}}onSketchCancelled(A){this.endSketchMode(A)}endSketchMode(A=null){const e=A||this._sketchMode?.featureID||null;try{this._sketchMode&&this._sketchMode.close()}catch{}this._sketchMode=null,Em(this.partHistory,e,!0);const t=this._sketchSidebarPrev;if(this._sketchSidebarPrev=null,t){try{this._setSidebarPinned(!!t.pinned)}catch{}try{this._setSidebarAutoHideSuspended(!!t.autoHideSuspended)}catch{}try{this._setSidebarHoverVisible(!!t.hoverVisible)}catch{}}else try{this._setSidebarAutoHideSuspended(!1)}catch{}try{this.controls&&(this.controls.enabled=!0)}catch{}try{const i=this.container;i&&typeof i.querySelectorAll=="function"&&i.querySelectorAll(".sketch-overlay").forEach(o=>{try{o.parentNode&&o.parentNode.removeChild(o)}catch{}})}catch{}}startSplineMode(A){this._viewerOnlyMode||(Sy("Starting Spline Mode for session:",A),this._splineMode=A)}endSplineMode(){Sy("Ending Spline Mode"),this._splineMode=null}_collapseExpandedDialogsForModeSwitch(){try{this.historyWidget?.collapseExpandedEntries?.({clearOpenState:!0,notify:!1})}catch{}try{this.assemblyConstraintsWidget?.collapseExpandedDialogs?.()}catch{}try{this._pmiMode?.collapseExpandedDialogs?.()}catch{}}startPMIPreviewMode(A,e,t=this.pmiViewsWidget){if(this._viewerOnlyMode){try{this.endPMIPreviewMode()}catch{}try{this._pmiPreviewMode=new AWe(this,A,e,t,{displayOnly:!0}),this._pmiPreviewMode.open()}catch{this._pmiPreviewMode=null}}}endPMIPreviewMode(){const A=this._pmiPreviewMode;if(this._pmiPreviewMode=null,!!A)try{const e=A.dispose?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}startPMIMode(A,e,t=this.pmiViewsWidget,i={}){if(this._viewerOnlyMode)return;try{this.endPMIPreviewMode()}catch{}const o=!!this._pmiMode,s=!!i?.fromViewClick,I=this._getActiveWorkbenchId();s&&!o&&I!=="PMI"?(this._setWorkbenchReturnTarget(I),this.setActiveWorkbench("PMI",{queueHistorySnapshot:!0})):!s&&!o&&this._setWorkbenchReturnTarget(null);try{this._collapseExpandedDialogsForModeSwitch()}catch{}if(!o)try{this.assemblyConstraintsWidget?.onPMIModeEnter?.()}catch{}try{this._pmiMode&&this._pmiMode.dispose()}catch{}try{o||this._setSidebarAutoHideSuspended(!0),this._pmiMode=new AWe(this,A,e,t),this._pmiMode.open()}catch(n){if(this._pmiMode=null,!o){try{this.assemblyConstraintsWidget?.onPMIModeExit?.()}catch{}try{this._setSidebarAutoHideSuspended(!1)}catch{}}throw n}}onPMIFinished(A){this._restoreWorkbenchAfterPMI(),this.endPMIMode()}onPMICancelled(){this._restoreWorkbenchAfterPMI(),this.endPMIMode()}endPMIMode(){const A=!!this._pmiMode;if(A)try{this._collapseExpandedDialogsForModeSwitch()}catch{}try{this._pmiMode&&this._pmiMode.dispose()}catch{}if(this._pmiMode=null,A)try{this.assemblyConstraintsWidget?.onPMIModeExit?.()}catch{}try{this._setSidebarAutoHideSuspended(!1)}catch{}try{this.controls&&(this.controls.enabled=!0)}catch{}}openSheet2DEditor(A=null){const e=this.partHistory?.sheet2DManager;if(!e)return;let t=A?String(A):"";if(!t){const i=e.getSheets?.()?.[0]||null;i?.id&&(t=String(i.id))}if(!t){const i=e.createSheet?.({name:"Instruction Sheet 1",sizeKey:"A",orientation:"landscape",elements:[]})||null;i?.id&&(t=String(i.id))}this._sheet2DEditorWindow||(this._sheet2DEditorWindow=new aLt(this)),this._sheet2DEditorWindow.open(t||null)}closeSheet2DEditor(){try{this._sheet2DEditorWindow?.close?.()}catch{}}render(){if(this.camera&&this.camera.parent!==this.scene)try{this.scene.add(this.camera)}catch{}if(this._positionCameraProjectionToggle(),this._updateAxisHelpers(),this._updateCameraLightRig(),this._updateDepthRange(),this._rendererMode==="svg")this._renderSvgScene();else{this.renderer.render(this.scene,this.camera);try{this.viewCube&&this.viewCube.render()}catch{}}}_renderSvgScene(){if(!this.renderer||!this.scene||!this.camera)return;const A=this.renderer.domElement;if(!A)return;try{this.scene.updateMatrixWorld(!0)}catch{}try{this.camera.updateMatrixWorld?.()}catch{}this._resizeRendererToDisplaySize();const e=A.getBoundingClientRect(),t=Math.max(1,Math.floor(e.width||this.container?.clientWidth||0)),i=Math.max(1,Math.floor(e.height||this.container?.clientHeight||0));if(!Number.isFinite(t)||!Number.isFinite(i)||t<=1||i<=1)return;try{typeof this.renderer.setClearColor=="function"&&this.renderer.setClearColor(this._clearColor)}catch{}const o=[],s=[],I=[],n=new yo,B=[];try{if(this.camera?.isOrthographicCamera){const E=Number(this.camera.right)-Number(this.camera.left)||0;if(Number.isFinite(E)&&E>0){const l=E/t;this.scene.traverse(h=>{if(!h?.isPoints)return;const w=h.material;if(Array.isArray(w))for(const d of w)!d?.isPointsMaterial||!Number.isFinite(d.size)||(o.push([d,d.size]),d.size=d.size*l);else w?.isPointsMaterial&&Number.isFinite(w.size)&&(o.push([w,w.size]),w.size=w.size*l)})}}const C=this._collectSvgOccluders(s),a=this._svgRaycaster||new aM;this._svgRaycaster=a;const Q=this._computeSvgOcclusionEps();this.scene.traverse(E=>{if(!E?.visible||!E.isLine2&&!E.isLineSegments2)return;const l=this._buildSvgLineFromLine2(E,{camera:this.camera,occluders:C,raycaster:a,occlusionEps:Q});l&&(I.push(l),n.add(l),B.push([E,E.visible]),E.visible=!1)}),I.length&&this.scene.add(n),this._restoreSvgMaterialSides(s),this.renderer.render(this.scene,this.camera);try{A.style.background=this._clearAlpha===0?"transparent":this._clearColor.getStyle()}catch{}}catch{}finally{try{if(I.length){this.scene.remove(n);for(const C of I){try{C.geometry?.dispose?.()}catch{}try{C.material?.dispose?.()}catch{}}}}catch{}for(const[C,a]of B)try{C.visible=a}catch{}this._restoreSvgMaterialSides(s);for(const[C,a]of o)try{C.size=a}catch{}}}_buildSvgLineFromLine2(A,{camera:e,occluders:t,raycaster:i,occlusionEps:o}={}){const s=A.geometry,I=s?.attributes?.instanceStart,n=s?.attributes?.instanceEnd;let B=null;if(I&&n&&Number.isFinite(I.count)&&I.count>0){const D=Math.min(I.count,n.count);B=new Float32Array(D*6);for(let u=0;u<D;u+=1)B[u*6]=I.getX(u),B[u*6+1]=I.getY(u),B[u*6+2]=I.getZ(u),B[u*6+3]=n.getX(u),B[u*6+4]=n.getY(u),B[u*6+5]=n.getZ(u)}else if(s?.attributes?.position?.count>=2){const D=s.attributes.position,u=D.count-1;B=new Float32Array(u*6);for(let M=0;M<u;M+=1)B[M*6]=D.getX(M),B[M*6+1]=D.getY(M),B[M*6+2]=D.getZ(M),B[M*6+3]=D.getX(M+1),B[M*6+4]=D.getY(M+1),B[M*6+5]=D.getZ(M+1)}if(!B||B.length<6)return null;const C=Array.isArray(A.material)?A.material[0]:A.material;if(C?.depthTest!==!1&&A?.type==="EDGE"&&Array.isArray(t)&&t.length&&e&&i){const D=Array.isArray(A.faces)?new Set(A.faces):null,u=this._svgTmpVecA||(this._svgTmpVecA=new j),M=this._svgTmpVecB||(this._svgTmpVecB=new j),y=[];for(let p=0;p<B.length;p+=6)u.set(B[p],B[p+1],B[p+2]).applyMatrix4(A.matrixWorld),M.set(B[p+3],B[p+4],B[p+5]).applyMatrix4(A.matrixWorld),this._isSvgSegmentVisible(u,M,e,i,t,D,o)&&y.push(B[p],B[p+1],B[p+2],B[p+3],B[p+4],B[p+5]);if(!y.length)return null;B=new Float32Array(y)}const a=new bt;a.setAttribute("position",new St(B,3));const Q=C?.color?C.color:new ct("#ffffff"),E=Number.isFinite(C?.opacity)?C.opacity:1,l=!!C?.transparent||E<1,h=Number.isFinite(C?.linewidth)?C.linewidth:1;let w=null;C?.dashed||C?.isLineDashedMaterial?w=new Pv({color:Q,linewidth:h,transparent:l,opacity:E,dashSize:Number.isFinite(C?.dashSize)?C.dashSize:.5,gapSize:Number.isFinite(C?.gapSize)?C.gapSize:.5}):w=new Jg({color:Q,linewidth:h,transparent:l,opacity:E});const d=new sC(a,w);d.matrixAutoUpdate=!1;try{d.matrix.copy(A.matrixWorld)}catch{}try{d.matrixWorld.copy(A.matrixWorld)}catch{}if(d.renderOrder=2,d.visible=!0,w.isLineDashedMaterial)try{d.computeLineDistances()}catch{}return d}_collectSvgOccluders(A){const e=[];try{this.scene.traverse(t=>{if(!t?.visible||!t.isMesh||t.type&&t.type!=="FACE")return;const i=t.material,o=Array.isArray(i)?i:[i];if(o.some(s=>s&&s.opacity!==0)){if(Array.isArray(A))for(const s of o)!s||s.side===co||(A.push([s,s.side]),s.side=co);e.push(t)}})}catch{}return e}_restoreSvgMaterialSides(A){if(!(!Array.isArray(A)||!A.length)){for(const[e,t]of A)if(e)try{e.side=t}catch{}A.length=0}}_computeSvgOcclusionEps(){const A=this.camera;if(!A)return 1e-4;if(A.isOrthographicCamera){const i=Math.abs(Number(A.right)-Number(A.left))||0;return Math.max(1e-4,i*1e-4)}const e=this.controls?.target,t=e&&A.position?.distanceTo?.(e)||A.position?.length?.()||1;return Math.max(1e-4,t*1e-4)}_isSvgSegmentVisible(A,e,t,i,o,s,I){if(!t||!i||!Array.isArray(o)||!o.length)return!0;const n=this._svgEdgeSamples||(this._svgEdgeSamples=[.2,.5,.8]),B=this._svgTmpVecC||(this._svgTmpVecC=new j);for(const C of n)if(B.lerpVectors(A,e,C),!this._isSvgPointOccluded(B,t,i,o,s,I))return!0;return!1}_isSvgPointOccluded(A,e,t,i,o,s){const I=this._svgTmpVecD||(this._svgTmpVecD=new j);if(I.copy(A).project(e),!Number.isFinite(I.x)||!Number.isFinite(I.y)||!Number.isFinite(I.z))return!1;if(I.z<-1||I.z>1)return!0;t.setFromCamera({x:I.x,y:I.y},e);const n=t.ray.origin.distanceTo(A),B=Number.isFinite(s)?s:1e-4;t.near=0,t.far=Math.max(0,n-B);const C=t.intersectObjects(i,!0);if(!C.length)return!1;if(o&&o.size){for(const a of C)if(!this._isSvgHitFromEdgeFace(a,o))return!0;return!1}return!0}_isSvgHitFromEdgeFace(A,e){let t=A?.object||null;for(let i=0;i<3&&t;i+=1){if(e.has(t))return!0;t=t.parent||null}return!1}_updateCameraLightRig(){if(!this._cameraLightRig||!this.camera||!this.renderer)return;const{pointLights:A,lightDirections:e,baseLightRadius:t}=this._cameraLightRig;if(!A?.length||!e?.length)return;const i=this.renderer.getSize?this.renderer.getSize(new Ye):null,o=i?.width||this.renderer?.domElement?.clientWidth||0,s=i?.height||this.renderer?.domElement?.clientHeight||0;if(!o||!s)return;const I=this._worldPerPixel(this.camera,o,s),n=Math.sqrt(o*o+s*s),B=Math.max(t,I*n*1.4);A.forEach((C,a)=>{const Q=e[a]||[0,0,0];C.position.set(Q[0]*B,Q[1]*B,Q[2]*B)})}_collectAxisHelpers(){if(this._axisHelpers=new Set,!this.scene||typeof this.scene.traverse!="function"){this._axisHelpersDirty=!1;return}this.scene.traverse(A=>{A?.userData?.axisHelper&&this._axisHelpers.add(A)}),this._axisHelpersDirty=!1}_updateAxisHelpers(){if(!this.camera||!this.scene||(this._axisHelpersDirty&&this._collectAxisHelpers(),!this._axisHelpers||this._axisHelpers.size===0))return;const{width:A,height:e}=this._getContainerSize(),t=this._worldPerPixel(this.camera,A,e);if(!Number.isFinite(t)||t<=0)return;const i=new j(1,1,1),o=1e-9,s=r(I=>{I?.resolution&&typeof I.resolution.set=="function"&&I.resolution.set(A,e)},"setRes");for(const I of this._axisHelpers){if(!I||!I.isObject3D)continue;const n=Number(I.userData?.axisHelperPx),B=Number.isFinite(n)?n:this._axisHelperPx||CjA,C=t*B;let a=C,Q=C,E=C;if(I.userData?.axisHelperCompensateScale!==!1&&I.parent&&typeof I.parent.getWorldScale=="function"){try{I.parent.updateMatrixWorld?.(!0)}catch{}I.parent.getWorldScale(i);const h=r(w=>Math.abs(w)<o?1:Math.abs(w),"safe");a/=h(i.x),Q/=h(i.y),E/=h(i.z)}const l=I.userData._axisHelperScale;(!l||Math.abs(l.x-a)>1e-6||Math.abs(l.y-Q)>1e-6||Math.abs(l.z-E)>1e-6)&&(I.scale.set(a,Q,E),I.userData._axisHelperScale={x:a,y:Q,z:E}),I.traverse?.(h=>{const w=h?.material;w&&(Array.isArray(w)?w.forEach(s):s(w))})}}_computeSceneBounds({reuse:A=!1,includeExcluded:e=!1}={}){if(A&&this._sceneBoundsCache)return this._sceneBoundsCache;const t=new Eg,i=new Eg;let o=!1;if(!this.scene)return null;try{this.scene.updateMatrixWorld(!0)}catch{}const s=r(n=>{const B=n?.userData;return!!(B?.axisHelper||!e&&B?.excludeFromFit)},"shouldSkip"),I=r((n,B)=>{if(!n)return;const C=B||s(n);if(!C){const Q=n.geometry;if(Q){let E=null;if(n.boundingBox!==void 0){if(n.boundingBox==null&&typeof n.computeBoundingBox=="function")try{n.computeBoundingBox()}catch{}E=n.boundingBox}else{if(Q.boundingBox==null&&typeof Q.computeBoundingBox=="function")try{Q.computeBoundingBox()}catch{}E=Q.boundingBox}E&&(i.copy(E),i.applyMatrix4(n.matrixWorld),t.union(i),o=!0)}}const a=n.children||[];for(const Q of a)I(Q,C)},"visit");return I(this.scene,!1),!o||t.isEmpty()?null:(this._sceneBoundsCache=t,t)}_updateDepthRange({reuseBounds:A=!1}={}){if(!this.camera)return!1;const e=this._computeSceneBounds({reuse:A,includeExcluded:!0});if(!e)return!1;try{this.camera.updateMatrixWorld(!0)}catch{}const t=[new j(e.min.x,e.min.y,e.min.z),new j(e.min.x,e.min.y,e.max.z),new j(e.min.x,e.max.y,e.min.z),new j(e.min.x,e.max.y,e.max.z),new j(e.max.x,e.min.y,e.min.z),new j(e.max.x,e.min.y,e.max.z),new j(e.max.x,e.max.y,e.min.z),new j(e.max.x,e.max.y,e.max.z)],i=new It().copy(this.camera.matrixWorld).invert();let o=1/0,s=-1/0;for(const l of t)l.applyMatrix4(i),l.z<o&&(o=l.z),l.z>s&&(s=l.z);if(!Number.isFinite(o)||!Number.isFinite(s))return!1;const I=Math.max(1e-6,s-o),n=e.min.distanceTo(e.max),B=Math.max(I*.1,n*.1,.5);if(s>-B+1e-6){const l=new j;try{this.camera.getWorldDirection(l)}catch{l.set(0,0,-1)}if(l.lengthSq()>0){const h=s+B;l.normalize(),this.camera.position.addScaledVector(l,-h),o-=h,s-=h;try{this.camera.updateMatrixWorld(!0)}catch{}try{this.controls?.updateMatrixState?.()}catch{}}}const C=Math.max(1,-o+B);if(!Number.isFinite(C))return!1;const a=this.camera.isPerspectiveCamera?Math.max(1e-4,Math.min(1,C*.001)):0,Q=Math.abs((this.camera.near||0)-a)>1e-6,E=Math.abs((this.camera.far||0)-C)>1e-6;if(Q||E){this.camera.near=a,this.camera.far=C;try{this.camera.updateProjectionMatrix()}catch{}}return!0}zoomToFit(A=1.1){try{const e=this.controls;if(!e)return;const t=this._computeSceneBounds();if(!t)return;this.camera.updateMatrixWorld(!0);const i=[new j(t.min.x,t.min.y,t.min.z),new j(t.min.x,t.min.y,t.max.z),new j(t.min.x,t.max.y,t.min.z),new j(t.min.x,t.max.y,t.max.z),new j(t.max.x,t.min.y,t.min.z),new j(t.max.x,t.min.y,t.max.z),new j(t.max.x,t.max.y,t.min.z),new j(t.max.x,t.max.y,t.max.z)],o=new It().copy(this.camera.matrixWorld).invert();let s=1/0,I=1/0,n=-1/0,B=-1/0;for(const E of i)E.applyMatrix4(o),E.x<s&&(s=E.x),E.x>n&&(n=E.x),E.y<I&&(I=E.y),E.y>B&&(B=E.y);const C=Math.max(1e-6,n-s),a=Math.max(1e-6,B-I),Q=t.getCenter(new j);if(this.camera.isOrthographicCamera){const{width:E,height:l}=this._getContainerSize(),h=Math.max(1e-6,E/l),w=this.viewSize,d=C/2*Math.max(1,A),D=a/2*Math.max(1,A),u=w/D,M=w*h/d,y=Math.min(u,M),p=this.camera.zoom||1,m=Math.max(1e-6,y/p);try{e.updateMatrixState&&e.updateMatrixState()}catch{}e.focus(Q,m)}else if(this.camera.isPerspectiveCamera){const E=Nt.degToRad(this.camera.fov||50),l=Math.max(1e-6,a*Math.max(1,A)),h=Math.max(1e-6,C*Math.max(1,A)),w=l*.5/Math.max(1e-6,Math.tan(E*.5)),d=2*Math.atan(Math.tan(E*.5)*Math.max(1e-6,this.camera.aspect||1)),D=h*.5/Math.max(1e-6,Math.tan(d*.5)),u=Math.max(w,D,.001),M=this.camera.position.clone().sub(e.target||Q);M.lengthSq()<1e-12&&M.set(1,1,1),M.normalize(),this.camera.position.copy(Q).addScaledVector(M,u),e.target&&e.target.copy(Q),this.camera.lookAt(Q);try{e.updateMatrixState&&e.updateMatrixState()}catch{}}try{e.update&&e.update()}catch{}this.render()}catch{}}setWireframe(A){this._wireframeEnabled=!!A;try{this.scene.traverse(e=>{if(!e)return;try{let i=e;for(;i;){if(i.isTransformGizmo)return;i=i.parent}}catch{}if(e.type==="EDGE"||e.type==="LOOP"||e.isLine||e.isLine2||e.isLineSegments||e.isLineLoop)return;const t=r(i=>{i&&"wireframe"in i&&(i.wireframe=!!A)},"apply");e.material&&(Array.isArray(e.material)?e.material.forEach(t):t(e.material))})}catch{}this.render()}toggleWireframe(){this.setWireframe(!this._wireframeEnabled)}applyMetadataColors(A=null){const e=this.partHistory?.metadataManager,t=this.partHistory?.scene||this.scene;if(!e||!t)return;const i=this.renderer?.getSize?.(new Ye)||null,o=Math.max(1,i?.width||this.renderer?.domElement?.clientWidth||1),s=Math.max(1,i?.height||this.renderer?.domElement?.clientHeight||1),I=["solidColor","color"],n=["faceColor","color"],B=["edgeColor","color"],C=["edgeColor"],a=r((d,D)=>{if(!d||typeof d!="object")return null;for(const u of D){if(!Object.prototype.hasOwnProperty.call(d,u))continue;const M=d[u];if(M!=null&&!(typeof M=="string"&&M.trim()===""))return M}return null},"pickColorValue"),Q=r(d=>{if(d==null)return null;if(d?.isColor)try{return typeof d.clone=="function"?d.clone():d}catch{return d}if(typeof d=="number"&&Number.isFinite(d))try{return new ct(d)}catch{return null}if(typeof d=="string"){const D=d.trim();if(!D)return null;const u=D.toLowerCase(),M=/^#([0-9a-f]{3}|[0-9a-f]{6})$/.test(u),y=/^0x[0-9a-f]{6}$/.test(u),p=/^(rgb|rgba|hsl|hsla)\(/.test(u);if(!M&&!y&&!p)return null;if(y){const m=Number(D);if(Number.isFinite(m))try{return new ct(m)}catch{return null}}try{return new ct(D)}catch{return null}}if(Array.isArray(d)&&d.length>=3){const D=Number(d[0]),u=Number(d[1]),M=Number(d[2]);if(![D,u,M].every(Number.isFinite))return null;const y=Math.max(D,u,M);try{return y>1?new ct(D/255,u/255,M/255):new ct(D,u,M)}catch{return null}}if(typeof d=="object"){const D=Number(d.r),u=Number(d.g),M=Number(d.b);if([D,u,M].every(Number.isFinite)){const y=Math.max(D,u,M);try{return y>1?new ct(D/255,u/255,M/255):new ct(D,u,M)}catch{return null}}}return null},"parseColor"),E=r(d=>{if(!d||typeof e.getMetadata!="function")return null;try{return e.getMetadata(d)}catch{return null}},"getMeta"),l=r((d,D,u)=>{if(!d||!D)return;d.userData||(d.userData={});const M=d.userData,y=M.__defaultMaterial??D;M.__defaultMaterial||(M.__defaultMaterial=D);const p=r(f=>{bs.setBaseMaterial(d,f)},"applyBase");if(!u){if(M.__metadataMaterial&&M.__metadataMaterial!==y)try{M.__metadataMaterial.dispose?.()}catch{}try{delete M.__metadataMaterial}catch{}try{delete M.__metadataColor}catch{}p(y);return}const m=u.getHexString();if(M.__metadataColor===m&&M.__metadataMaterial){p(M.__metadataMaterial);return}let F=null;try{F=typeof D.clone=="function"?D.clone():null}catch{F=null}if(F){try{F.color&&typeof F.color.set=="function"&&F.color.set(u)}catch{}try{F.resolution&&typeof F.resolution.set=="function"&&F.resolution.set(o,s)}catch{}try{F.needsUpdate=!0}catch{}if(M.__metadataMaterial&&M.__metadataMaterial!==y)try{M.__metadataMaterial.dispose?.()}catch{}M.__metadataColor=m,M.__metadataMaterial=F,p(F)}},"applyMaterial"),h=r(d=>{if(!d||d.type!=="SOLID")return;const D=E(d.name),u=d?.userData?.metadata||null,M=Q(a(D,I)??a(u,I)),y=Q(a(D,C)??a(u,C)),p=Array.isArray(d.children)?d.children:[];for(const m of p)if(m){if(m.type==="FACE"){const F=m.name||m.userData?.faceName||null,f=F?E(F):null;let S=null;if(F&&typeof d.getFaceMetadata=="function")try{S=d.getFaceMetadata(F)}catch{S=null}const N=Q(a(f,n)??a(S,n))||M,G=Co.FACE?.BASE??m.material;l(m,G,N)}else if(m.type==="EDGE"){const F=m.name||null,f=F?E(F):null;let S=null;if(F&&typeof d.getEdgeMetadata=="function")try{S=d.getEdgeMetadata(F)}catch{S=null}let N=Q(a(f,B)??a(S,B));!N&&y&&(N=y);const G=!!(m.userData?.faceA||m.userData?.faceB),Y=m.userData?.__defaultMaterial??m.material,R=G?Y??Co.EDGE?.BASE??m.material:Y;l(m,R,N)}}},"applyToSolid"),w=r(d=>{if(!d)return null;if(d.type==="SOLID")return d;if(d.parentSolid)return d.parentSolid;let D=d.parent;for(;D;){if(D.type==="SOLID")return D;D=D.parent}return null},"resolveSolid");if(A){let d=A;if(typeof d=="string")try{d=t.getObjectByName(d)}catch{d=null}const D=w(d);if(D)h(D);else if(d&&(d.type==="FACE"||d.type==="EDGE")){const u=d.name||null,M=u?E(u):null,y=d.type==="FACE"?n:B,p=Q(a(M,y)),m=d.type==="FACE"?Co.FACE?.BASE??d.material:Co.EDGE?.BASE??d.material;l(d,m,p)}}else t.traverse(d=>{d&&d.type==="SOLID"&&h(d)});try{this.render()}catch{}}_loop(){this._raf=requestAnimationFrame(this._loop),this.controls.update();let A=!1;try{const e=typeof window<"u"&&window.__BREP_activeXform||null,t=e&&e.controls;t&&(A=!0,typeof t.update=="function"?t.update():t.updateMatrixWorld(!0))}catch{}(this._cameraMoving||this._sketchMode||A)&&this.render()}_getPointerNDC(A){const e=this.renderer.domElement.getBoundingClientRect(),t=(A.clientX-e.left)/e.width,i=(A.clientY-e.top)/e.height;return new Ye(t*2-1,-(i*2-1))}_isEventOverRenderer(A){if(!A||!this.renderer?.domElement)return!1;const e=this.renderer.domElement.getBoundingClientRect(),t=A.clientX,i=A.clientY;return t>=e.left&&t<=e.right&&i>=e.top&&i<=e.bottom}_mapIntersectionToTarget(A,e={}){if(!A||!A.object)return null;const{allowAnyAllowedType:t=!1,ignoreSelectionFilter:i=!1}=e,o=r(n=>n?i?!0:t&&typeof tt.matchesAllowedType=="function"?tt.matchesAllowedType(n):typeof tt.IsAllowed=="function"?tt.IsAllowed(n):!0:!1,"isAllowed");let s=A.object;s&&s.type==="POINTS"&&s.parent&&String(s.parent.type||"").toUpperCase()===tt.VERTEX&&(s=s.parent);let I=s;for(;I&&typeof I.onClick!="function"&&I.visible;)I=I.parent;if(I||(I=s),!I)return null;if(typeof o=="function"&&!o(I.type)&&!I.selected){let n=I.parent;for(;n&&!o(n.type);)n=n.parent;if(n&&o(n.type))I=n;else return null}return I}_pickAtEvent(A,e={}){const{collectAll:t=!1,allowAnyAllowedType:i=!1,ignoreSelectionFilter:o=!1}=e;if(this._sketchMode)return t?{hit:null,target:null,candidates:[]}:{hit:null,target:null};if(this._splineMode)try{const B=typeof this._splineMode.isActive=="function",C=B?this._splineMode.isActive():!1;(!B||!C)&&this.endSplineMode()}catch{this.endSplineMode()}if(this._splineMode){if(!A)return t?{hit:null,target:null,candidates:[]}:{hit:null,target:null};const B=this._getPointerNDC(A);try{this.camera.updateMatrixWorld(!0)}catch{}try{this.camera.updateProjectionMatrix?.()}catch{}this.raycaster.setFromCamera(B,this.camera);try{const E=this.renderer.domElement.getBoundingClientRect(),l=this._worldPerPixel(this.camera,E.width,E.height);this.raycaster.params.Points=this.raycaster.params.Points||{},this.raycaster.params.Points.threshold=Math.max(.05,l*6),this.raycaster.params.Line=this.raycaster.params.Line||{},this.raycaster.params.Line.threshold=Math.max(.05,l*6);const h=window.devicePixelRatio||1;this.raycaster.params.Line2=this.raycaster.params.Line2||{},this.raycaster.params.Line2.threshold=Math.max(1,2*h)}catch{}try{const E=this.raycaster.ray,l=E.direction.clone().normalize(),h=Math.max(1,Math.abs(this.camera.far||0),Math.abs(this.camera.near||0),this.viewSize*40);E.origin.addScaledVector(l,-h)}catch{}const C=this._withDoubleSidedPicking(()=>this.raycaster.intersectObjects(this.scene.children,!0)),a=[],Q=r(E=>{const l=E?.userData||{};return l.isSplineVertex?0:l.isPortChild||l.nurbsCageSegment?1:l.nurbsCageQuad?2:3},"splineCategory");for(const E of C){if(!E||!E.object||!(E.object.userData?.isSplineVertex||E.object.userData?.isSplineWeight||E.object.userData?.isPortChild))continue;const l=E.object;typeof l.onClick=="function"&&a.push({hit:E,target:l,category:Q(l),distance:Number.isFinite(E.distance)?E.distance:1/0})}if(a.length){a.sort((l,h)=>{if(l.category!==h.category)return l.category-h.category;const w=l.distance-h.distance;if(Math.abs(w)>1e-7)return w;const d=l.target?.userData?.isSplineVertex?0:1,D=h.target?.userData?.isSplineVertex?0:1;return d-D});const E=a[0];return{hit:E.hit,target:E.target}}return t?{hit:null,target:null,candidates:[]}:{hit:null,target:null}}if(!A)return t?{hit:null,target:null,candidates:[]}:{hit:null,target:null};const s=this._getPointerNDC(A);try{this.camera.updateMatrixWorld(!0)}catch{}this.raycaster.setFromCamera(s,this.camera);try{const B=this.renderer.domElement.getBoundingClientRect(),C=this._worldPerPixel(this.camera,B.width,B.height);this.raycaster.params.Line=this.raycaster.params.Line||{},this.raycaster.params.Line.threshold=Math.max(.05,C*6);const a=window.devicePixelRatio||1;this.raycaster.params.Line2=this.raycaster.params.Line2||{},this.raycaster.params.Line2.threshold=Math.max(1,2*a),this.raycaster.params.Points=this.raycaster.params.Points||{},this.raycaster.params.Points.threshold=Math.max(.05,C*6)}catch{}try{const B=this.raycaster.ray,C=B.direction.clone().normalize(),a=Math.max(1,Math.abs(this.camera.far||0),Math.abs(this.camera.near||0),this.viewSize*40);B.origin.addScaledVector(C,-a)}catch{}const I=this._withDoubleSidedPicking(()=>this.raycaster.intersectObjects(this.scene.children,!0));I.length>0&&(Sy("NORMAL MODE CLICK DEBUG:"),Sy(`- Mouse NDC: (${s.x.toFixed(3)}, ${s.y.toFixed(3)})`),Sy(`- Total intersections found: ${I.length}`));const n=[];for(const B of I){if(!B||!B.object)continue;const C=r(a=>a.parent===null?!0:a.visible===!1?!1:C(a.parent),"testVisible");if(C(B.object)){const a=this._mapIntersectionToTarget(B,{allowAnyAllowedType:i,ignoreSelectionFilter:o});if(a){if(t){n.push({hit:B,target:a,distance:B.distance??1/0});continue}return{hit:B,target:a}}}}return t?{hit:n[0]?.hit||null,target:n[0]?.target||null,candidates:n}:{hit:null,target:null}}_withDoubleSidedPicking(A){if(!A)return null;const e=new Set,t=r(i=>{!i||typeof i.side>"u"||i.side===UC&&(e.add(i),i.side=co)},"markMaterial");try{return this.scene&&typeof this.scene.traverse=="function"&&this.scene.traverse(i=>{if(!i)return;const o=i.material;Array.isArray(o)?o.forEach(t):t(o)}),A()}finally{for(const i of e)try{i.side=UC}catch{}}}_updateHover(A){if(this._shouldSuppressSceneHover()){try{tt.clearHover()}catch{}return}const{primary:e}=this._collectSelectionCandidates(A);if(e)try{tt.setHoverObject(e)}catch{}else try{tt.clearHover()}catch{}}_isFeatureDimensionDragActive(){try{return!!this.historyWidget?.isFeatureDimensionDragging?.()}catch{return!1}}_shouldSuppressSceneHover(){return this._isFeatureDimensionDragActive()}_collectSelectionCandidates(A){const e=(()=>{try{const p=tt.getAvailableTypes?.()||[];if(Array.isArray(p)&&p.length>0)return p;if(Array.isArray(tt.TYPES))return tt.TYPES.filter(m=>m!==tt.ALL)}catch{}return[]})(),t=r(p=>String(p||"").toUpperCase(),"normType"),i=new Set(e.map(t)),o=[tt.VERTEX,tt.EDGE,tt.FACE,tt.PLANE,tt.SKETCH,tt.DATUM,tt.HELIX,tt.LOOP,tt.SOLID,tt.COMPONENT].map(p=>t(p)),s=t(tt.SOLID),I=t(tt.COMPONENT),n=Array.from(i).some(p=>p&&p!==s&&p!==I),B=r(p=>{const m=t(p);if(n&&(m===s||m===I))return o.length+2;const F=o.indexOf(m);return F===-1?o.length:F},"getPriority"),C=r(p=>i.size===0?!0:i.has(t(p)),"isAllowedType"),{target:a,candidates:Q=[]}=this._pickAtEvent(A,{collectAll:!0,allowAnyAllowedType:!0}),E=[],l=new Set,h=r(p=>{if(!p)return null;let m=p;return t(m.type)==="POINTS"&&m.parent&&t(m.parent.type)===t(tt.VERTEX)&&(m=m.parent),!C(m.type)&&m.parent&&C(m.parent.type)&&(m=m.parent),m},"normalizeTarget"),w=r((p,m)=>{const F=h(p);if(!F||!C(F.type))return;const f=F.uuid||F.name||`${F.type}-${l.size}`;l.has(f)||(l.add(f),E.push({target:F,distance:Number.isFinite(m)?m:1/0,label:this._describeSelectionCandidate(F)}))},"addEntry");for(const p of Q){const m=p?.target;if(!m)continue;const F=Number.isFinite(p?.distance)?p.distance:p?.hit?.distance??1/0;w(m,F)}E.sort((p,m)=>p.distance-m.distance);const d=[],D=r((p,m)=>{const F=h(p);if(!F||!C(F.type))return;const f=F.uuid||F.name||`${F.type}-${l.size}`;l.has(f)||(l.add(f),d.push({target:F,distance:Number.isFinite(m)?m:1/0,label:this._describeSelectionCandidate(F)}))},"addExtra"),u=r((p,m)=>{let F=p?.parent||null;for(;F;){if(t(F.type)===t(m))return F;F=F.parent||null}return null},"findAncestorOfType");for(const p of E.slice()){const m=p.target,F=p.distance,f=u(m,tt.SOLID),S=u(m,tt.COMPONENT);D(S,F),D(f,F)}d.sort((p,m)=>p.distance-m.distance);const M=E.concat(d);M.sort((p,m)=>{const F=B(p?.target?.type),f=B(m?.target?.type);return F!==f?F-f:(p?.distance??1/0)-(m?.distance??1/0)});const y=M[0]?.target||a||null;return{ordered:M,primary:y}}_selectAt(A){const{ordered:e,primary:t}=this._collectSelectionCandidates(A);if(t){if(e.length>1){this._scheduleSelectionOverlay(A,e);return}this._hideSelectionOverlay(),this._applySelectionTarget(t,{pointerEvent:A})}}_applySelectionTarget(A,e={}){if(!A)return;if(this._lastInspectorTarget=A,this._lastInspectorSolid=this._findParentSolid(A),this._triangleDebugger&&this._triangleDebugger.isOpen&&this._triangleDebugger.isOpen())try{this._triangleDebugger.refreshTarget(A)}catch{}const{triggerOnClick:t=!0,allowDiagnostics:i=!0,pointerEvent:o=void 0}=e;if(i&&this._diagPickOnce){this._diagPickOnce=!1;try{this._showDiagnosticsFor(A)}catch(n){try{console.warn("Diagnostics failed:",n)}catch{}}if(this._diagRestoreFilter){try{tt.restoreAllowedSelectionTypes&&tt.restoreAllowedSelectionTypes()}catch{}this._diagRestoreFilter=!1}}if(this._inspectorOpen)try{this._updateInspectorFor(A)}catch(n){try{console.warn("Inspector update failed:",n)}catch{}}const s=this.__metadataPanelController;if(s&&typeof s.handleSelection=="function")try{s.handleSelection(A)}catch(n){try{console.warn("Metadata panel update failed:",n)}catch{}}const I=this.__solidOverlapDiagnosticsController;if(I&&typeof I.handleSelection=="function")try{I.handleSelection(A)}catch(n){try{console.warn("Solid overlap diagnostics update failed:",n)}catch{}}if(t&&typeof A.onClick=="function")try{A.onClick(o)}catch{}}_scheduleHoverRefresh(){this._disposed||this._hoverRefreshRaf!=null||(this._hoverRefreshRaf=requestAnimationFrame(()=>{if(this._hoverRefreshRaf=null,!this._disposed)try{this.render()}catch{}}))}_onHoverChanged(){this._scheduleHoverRefresh()}_clearSelectionOverlayTimer(){this._selectionOverlayTimer&&(clearTimeout(this._selectionOverlayTimer),this._selectionOverlayTimer=null),this._pendingSelectionOverlay=null}_isAssemblyChildSelection(A){if(!A)return!1;const e=(A.type||"").toUpperCase();if(!(e===tt.FACE||e===tt.EDGE||e===tt.VERTEX||e==="POINTS"))return!1;const t=r((s,I)=>{const n=r(C=>(C||"").toUpperCase(),"norm");let B=s?.parent||null;for(;B;){if(n(B.type)===n(I))return B;B=B.parent||null}return null},"findAncestorOfType")(A,tt.SOLID);if(!t)return!1;const i=t.parent||null;if(!i)return!1;const o=(i.type||"").toUpperCase();return!!(o===tt.COMPONENT||o==="COMPONENT"||i.isAssemblyComponent)}_shouldDelaySelectionOverlay(A=[]){try{if(tt.allowedSelectionTypes!==tt.ALL)return!1;const e=Array.isArray(A)&&A.length?A[0].target:null;return this._isAssemblyChildSelection(e)}catch{return!1}}_scheduleSelectionOverlay(A,e){if(this._clearSelectionOverlayTimer(),!this._shouldDelaySelectionOverlay(e)){this._showSelectionOverlay(A,e);return}const t=A?{clientX:A.clientX,clientY:A.clientY}:null;this._pendingSelectionOverlay={event:t,candidates:e},this._selectionOverlayTimer=setTimeout(()=>{this._selectionOverlayTimer=null;const i=this._pendingSelectionOverlay;this._pendingSelectionOverlay=null,i&&this._showSelectionOverlay(i.event,i.candidates)},300)}_describeSelectionCandidate(A){if(!A)return"Selection";const e=A.name&&String(A.name).trim()?String(A.name).trim():null,t=A.type||"object";return e||t}_showSelectionOverlay(A,e){if(this._clearSelectionOverlayTimer(),this._hideSelectionOverlay(),!Array.isArray(e)||e.length===0)return;const t=document.createElement("div");t.className="selection-picker",t.classList.add("is-hovered");const i=document.createElement("div");i.className="selection-picker__title selection-picker__handle",i.textContent="Select an object";const o=document.createElement("div");o.className="selection-picker__header",o.appendChild(i);const s=document.createElement("button");s.type="button",s.textContent="Clear Selection",s.className="selection-picker__clear",s.addEventListener("click",f=>{f.stopPropagation(),f.preventDefault();try{const S=this.partHistory?.scene||this.scene;S&&tt.unselectAll(S)}catch{}this._hideSelectionOverlay()}),o.appendChild(s),t.appendChild(o);const I={wrap:t,drag:{active:!1},peekTimer:null},n=r(()=>{I.peekTimer&&(clearTimeout(I.peekTimer),I.peekTimer=null);try{t.style.opacity="0.8"}catch{}I.peekTimer=setTimeout(()=>{try{t.style.opacity=""}catch{}I.peekTimer=null},500)},"triggerPeek"),B=document.createElement("div");B.className="selection-picker__list";const C={itemHeight:0,gap:0,paddingTop:0},a=r(()=>{try{const f=getComputedStyle(B),S=parseFloat(f.rowGap||f.gap||"0")||0,N=parseFloat(f.paddingTop||"0")||0;C.gap=S,C.paddingTop=N}catch{}},"readListStyles"),Q=r(()=>{if(!C.gap&&!C.paddingTop&&a(),C.itemHeight)return C.itemHeight;const f=B.querySelector(".selection-picker__item");if(!f)return 0;const S=f.getBoundingClientRect();return C.itemHeight=S.height||f.offsetHeight||0,C.itemHeight},"ensureItemMetrics"),E=r(()=>{a();const f=B.querySelector(".selection-picker__item");if(!f)return;const S=B.getBoundingClientRect(),N=f.getBoundingClientRect();C.itemHeight=N.height||C.itemHeight||0;const G=Math.max(0,Math.round(S.height-C.paddingTop-N.height));B.style.paddingBottom=`${G}px`},"updateListPadding");e.forEach(f=>{if(!f?.target)return;const S=document.createElement("button");S.type="button",S.className="selection-picker__item";const N=document.createElement("div");N.className="selection-picker__line";const G=document.createElement("div");G.className="selection-picker__type",G.textContent=String(f.target.type||"").toUpperCase()||"OBJECT";const Y=document.createElement("div");Y.className="selection-picker__name",Y.textContent=f.label,N.appendChild(G),N.appendChild(Y),S.appendChild(N),S.addEventListener("mouseenter",()=>{n();try{tt.setHoverObject(f.target,{ignoreFilter:!0})}catch{}}),S.addEventListener("mouseleave",()=>{try{tt.clearHover()}catch{}}),S.addEventListener("click",R=>{R.stopPropagation(),R.preventDefault?.();try{console.log("Selection picker selected:",{type:f.target?.type,label:f.label,target:f.target})}catch{}this._hideSelectionOverlay(),this._applySelectionTarget(f.target)}),B.appendChild(S)});const l=r(f=>{try{f.preventDefault(),f.stopPropagation()}catch{}if(!B||B.children.length===0)return;const S=Math.sign(f.deltaY||0);if(!S)return;const N=Q();if(!N)return;const G=Math.max(1,Math.round(N+C.gap)),Y=Math.max(0,B.scrollHeight-B.clientHeight),R=Math.min(Y,Math.max(0,B.scrollTop+S*G));B.scrollTo({top:R})},"onWheelSnapScroll");B.addEventListener("wheel",l,{passive:!1}),t.appendChild(B);const h=A?.clientX??window.innerWidth/2,w=A?.clientY??window.innerHeight/2;t.style.left=`${h}px`,t.style.top=`${w}px`,document.body.appendChild(t);const d=r(()=>{const f=t.getBoundingClientRect(),S=t.querySelector(".selection-picker__item");let N=h,G=w;if(S){const b=S.getBoundingClientRect(),L=b.left-f.left+b.width/2,H=b.top-f.top+b.height/2;N=h-L,G=w-H}const Y=12,R=f.width,k=f.height;N+R>window.innerWidth-Y&&(N=Math.max(Y,window.innerWidth-R-Y)),G+k>window.innerHeight-Y&&(G=Math.max(Y,window.innerHeight-k-Y)),N<Y&&(N=Y),G<Y&&(G=Y),t.style.left=`${N}px`,t.style.top=`${G}px`},"adjustWithinViewport");requestAnimationFrame(()=>{E(),d()});const D=r(()=>{t.classList.add("is-hovered")},"onEnter"),u=r(()=>{I.drag.active||t.classList.remove("is-hovered")},"onLeave"),M=r(f=>{if(!I.drag.active)return;const S=12,N=t.getBoundingClientRect(),G=N.width,Y=N.height;let R=f.clientX-I.drag.offsetX,k=f.clientY-I.drag.offsetY;R+G>window.innerWidth-S&&(R=Math.max(S,window.innerWidth-G-S)),k+Y>window.innerHeight-S&&(k=Math.max(S,window.innerHeight-Y-S)),R<S&&(R=S),k<S&&(k=S),t.style.left=`${R}px`,t.style.top=`${k}px`},"onDragMove"),y=r(f=>{if(I.drag.active&&(I.drag.active=!1,t.classList.remove("dragging"),t.matches(":hover")||t.classList.remove("is-hovered"),window.removeEventListener("pointermove",M,{passive:!0}),window.removeEventListener("pointerup",y,{passive:!0,capture:!0}),f))try{f.stopPropagation()}catch{}},"stopDrag"),p=r(f=>{if(f.button!==0)return;f.preventDefault(),f.stopPropagation();const S=t.getBoundingClientRect();I.drag.active=!0,I.drag.offsetX=f.clientX-S.left,I.drag.offsetY=f.clientY-S.top,t.classList.add("dragging"),t.classList.add("is-hovered"),window.addEventListener("pointermove",M,{passive:!0}),window.addEventListener("pointerup",y,{passive:!0,capture:!0})},"onDragStart");i.addEventListener("pointerdown",p),t.addEventListener("pointerenter",D),t.addEventListener("pointerleave",u);const m=r(f=>{t.contains(f.target)||this._hideSelectionOverlay()},"onPointerDown"),F=r(f=>{f.key==="Escape"&&this._hideSelectionOverlay()},"onKey");document.addEventListener("pointerdown",m,!0),document.addEventListener("keydown",F,!0),this._selectionOverlay={wrap:t,onPointerDown:m,onKey:F,onEnter:D,onLeave:u,onDragStart:p,onDragMove:M,stopDrag:y,onWheelRotate:l,list:B,overlayState:I}}_hideSelectionOverlay(){const A=this._selectionOverlay;if(A){this._clearSelectionOverlayTimer();try{A.stopDrag?.()}catch{}document.removeEventListener("pointerdown",A.onPointerDown,!0),document.removeEventListener("keydown",A.onKey,!0);try{A.wrap.removeEventListener("pointerenter",A.onEnter)}catch{}try{A.wrap.removeEventListener("pointerleave",A.onLeave)}catch{}try{A.wrap.querySelector(".selection-picker__handle")?.removeEventListener("pointerdown",A.onDragStart)}catch{}try{window.removeEventListener("pointermove",A.onDragMove,{passive:!0})}catch{}try{window.removeEventListener("pointerup",A.stopDrag,{passive:!0,capture:!0})}catch{}try{A.list?.removeEventListener("wheel",A.onWheelRotate,{passive:!1})}catch{}try{A.overlayState?.peekTimer&&(clearTimeout(A.overlayState.peekTimer),A.overlayState.peekTimer=null)}catch{}try{A.wrap.style.opacity=""}catch{}try{A.wrap.remove()}catch{}this._selectionOverlay=null;try{tt.clearHover()}catch{}try{this._lastPointerEvent&&this._updateHover(this._lastPointerEvent)}catch{}}}_onPointerMove(A){if(!this._disposed){this._lastPointerEvent=A;try{if(this.viewCube){try{this.viewCube.handlePointerMove?.(A)}catch{}if(this.viewCube.isEventInside(A))return}}catch{}try{const e=typeof window<"u"&&window.__BREP_activeXform||null;if(e&&typeof e.isOver=="function"&&e.isOver(A))return}catch{}if(this._shouldSuppressSceneHover()){try{tt.clearHover()}catch{}return}this._updateHover(A)}}_onPointerDown(A){if(!this._disposed){this._hideSelectionOverlay();try{const e=typeof window<"u"&&window.__BREP_activeXform||null;if(e&&typeof e.isOver=="function"&&e.isOver(A)){try{A.preventDefault()}catch{}return}}catch{}this._clearSelectionOverlayTimer();try{this._isEventOverRenderer(A)&&(this._lastCanvasPointerDownAt=Date.now())}catch{}try{this._cubeActive=!!(this.viewCube&&this.viewCube.isEventInside(A))}catch{this._cubeActive=!1}this._pointerDown=!0,this._downButton=A.button,this._downPos.x=A.clientX,this._downPos.y=A.clientY,this.controls.enabled=!this._cubeActive;try{A.preventDefault()}catch{}}}_onPointerUp(A){if(this._disposed)return;try{const o=typeof window<"u"&&window.__BREP_activeXform||null;if(o&&typeof o.isOver=="function"&&o.isOver(A)){try{A.preventDefault()}catch{}return}}catch{}if(this._cubeActive){try{if(this.viewCube&&this.viewCube.handleClick(A)){this._cubeActive=!1;return}}catch{}this._cubeActive=!1}const e=Math.abs(A.clientX-this._downPos.x),t=Math.abs(A.clientY-this._downPos.y),i=e+t>this._dragThreshold;this._pointerDown&&this._downButton===0&&!i&&this._selectAt(A),this._pointerDown=!1,this.controls.enabled=!0}_onContextMenu(A){}_handleEscapeAction(){if(!this._disposed){try{this._clearSelectionOverlayTimer()}catch{}try{this._hideSelectionOverlay()}catch{}try{this._splineMode?.clearSelection?.()}catch{}try{this._toggleComponentTransform?.(null)}catch{}try{this._stopComponentTransformSession?.()}catch{}try{const A=this.partHistory?.scene||this.scene;A&&(tt.unselectAll(A),tt.restoreAllowedSelectionTypes())}catch{}}}_onKeyDown(A){if(this._disposed||this._sheet2DEditorActive)return;const e=A?.target||null,t=e?.tagName?String(e.tagName).toLowerCase():"",i=!!(e&&(e.isContentEditable||t==="input"||t==="textarea"||t==="select")),o=(A?.key||"").toLowerCase(),s=!!(A?.ctrlKey||A?.metaKey),I=s&&!A?.altKey&&o==="z"&&!A?.shiftKey,n=s&&!A?.altKey&&(o==="y"||A?.shiftKey&&o==="z");if((I||n)&&!i){if(this._viewerOnlyMode){try{A.preventDefault()}catch{}try{A.stopImmediatePropagation()}catch{}return}if(this._imageEditorActive)return;try{this._sketchMode&&typeof this._sketchMode.undo=="function"&&typeof this._sketchMode.redo=="function"?I?this._sketchMode.undo():this._sketchMode.redo():this.partHistory&&this._runFeatureHistoryUndoRedo(n?"redo":"undo");try{A.preventDefault()}catch{}try{A.stopImmediatePropagation()}catch{}}catch{}return}const B=A?.key||A?.code||"";(B==="Escape"||B==="Esc")&&this._handleEscapeAction()}_findOwningComponent(A){let e=A;for(;e;){if(e.isAssemblyComponent||e.type===tt.COMPONENT||e.type==="COMPONENT")return e;e=e.parent}return null}_stopComponentTransformSession(){const A=this._componentTransformSession;if(!A)return;const{controls:e,helper:t,target:i,changeHandler:o,dragHandler:s,objectChangeHandler:I,cameraChangeHandler:n,cameraChangeSource:B,globalState:C}=A;try{e?.removeEventListener("change",o)}catch{}try{e?.removeEventListener("dragging-changed",s)}catch{}try{e?.removeEventListener("objectChange",I)}catch{}try{B?.removeEventListener?.("change",n)}catch{}try{e?.detach?.()}catch{}if(this.scene){try{e&&e.isObject3D&&this.scene.remove(e)}catch{}try{t&&t.isObject3D&&this.scene.remove(t)}catch{}try{i&&i.isObject3D&&this.scene.remove(i)}catch{}}try{e?.dispose?.()}catch{}try{window.__BREP_activeXform===C&&(window.__BREP_activeXform=null)}catch{}this._componentTransformSession=null;try{this.controls&&(this.controls.enabled=!0)}catch{}try{this.render()}catch{}}_activateComponentTransform(A){if(!A||A.fixed)return;const e=SpA;if(!e){console.warn("[Viewer] TransformControls unavailable; cannot activate component gizmo.");return}this._stopComponentTransformSession();try{AE&&typeof AE.__stopGlobalActiveXform=="function"&&AE.__stopGlobalActiveXform()}catch{}const t=new e(this.camera,this.renderer.domElement),i="translate";try{t.setMode(i)}catch{t.mode=i}try{t.showX=t.showY=t.showZ=!0}catch{}const o=new _g;o.name=`ComponentTransformTarget:${A.name||A.uuid||""}`;try{this.scene.updateMatrixWorld?.(!0)}catch{}try{A.updateMatrixWorld?.(!0)}catch{}const s=new Eg,I=s.setFromObject(A).isEmpty()?A.getWorldPosition(new j):s.getCenter(new j);o.position.copy(I);const n=A.getWorldQuaternion(new ai);o.quaternion.copy(n);const B=A.parent||this.scene;try{B?.updateMatrixWorld?.(!0)}catch{}const C=A.getWorldPosition(new j).sub(I),a=n.clone().invert();C.applyQuaternion(a);const Q=new It;B&&B.isObject3D?Q.copy(B.matrixWorld).invert():Q.identity(),this.scene.add(o);try{t.attach(o)}catch{}try{t.userData=t.userData||{},t.userData.excludeFromFit=!0,this.scene.add(t)}catch{}let E=null;try{E=typeof t.getHelper=="function"?t.getHelper():null,E&&E.isObject3D&&(E.userData=E.userData||{},E.userData.excludeFromFit=!0,this.scene.add(E))}catch{E=null}const l=r(b=>{if(!b||!b.isObject3D)return;const L=r(H=>{if(!H||!H.isObject3D)return;const J=H.userData||(H.userData={});if(J.__brepOverlayHook)return;const Z=H.onBeforeRender;H.onBeforeRender=function(P,x,V,tA,AA,_){try{P.clearDepth()}catch{}typeof Z=="function"&&Z.call(this,P,x,V,tA,AA,_)},J.__brepOverlayHook=!0},"apply");L(b);try{b.traverse(H=>L(H))}catch{}},"markOverlay");try{l(t)}catch{}try{l(E)}catch{}try{l(t?._gizmo)}catch{}try{l(t?.gizmo)}catch{}const h=new j,w=new j,d=new j,D=new j,u=new ai,M=new ai,y=new ai,p=new ai,m=r((b=!1)=>{try{try{this.scene.updateMatrixWorld?.(!0)}catch{}try{o.updateMatrixWorld?.(!0)}catch{}if(B&&B.isObject3D){try{B.updateMatrixWorld?.(!0)}catch{}Q.copy(B.matrixWorld).invert(),B.getWorldQuaternion(M),y.copy(M).invert()}else Q.identity(),M.set(0,0,0,1),y.copy(M);o.getWorldPosition(h),o.getWorldQuaternion(u),D.copy(C).applyQuaternion(u),w.copy(h).add(D),d.copy(w),B&&B.isObject3D&&d.applyMatrix4(Q),A.position.copy(d),B&&B.isObject3D?(p.copy(y).multiply(u),A.quaternion.copy(p)):A.quaternion.copy(u),A.updateMatrixWorld?.(!0),this.render(),b&&this.partHistory&&typeof this.partHistory.syncAssemblyComponentTransforms=="function"&&this.partHistory.syncAssemblyComponentTransforms()}catch(L){console.warn("[Viewer] Failed to apply transform to component:",L)}},"updateComponentTransform"),F=r(()=>{m(!1)},"changeHandler"),f=r(b=>{const L=!!(b&&b.value);try{this.controls&&(this.controls.enabled=!L)}catch{}L||m(!0)},"dragHandler"),S=r(()=>{!t||t.dragging||m(!0)},"objectChangeHandler");t.addEventListener("change",F),t.addEventListener("dragging-changed",f);try{t.addEventListener("objectChange",S)}catch{}const N=r(b=>{try{if(!b)return!1;const L=this._getPointerNDC(b);this.raycaster.setFromCamera(L,this.camera);const H=typeof t.getMode=="function"?t.getMode():t.mode||"translate",J=t._gizmo||t.gizmo||null,Z=(J&&J.picker?J.picker[H]||J.picker.translate||J.picker.rotate||J.picker.scale:J)||J||E||t;return Z?(this.raycaster.intersectObject(Z,!0)||[]).length>0:!1}catch{return!1}},"isOver"),G=r(()=>{try{typeof t.update=="function"?t.update():t.updateMatrixWorld(!0)}catch{}},"updateForCamera"),Y=r(()=>{G()},"cameraChangeHandler");try{this.controls?.addEventListener?.("change",Y)}catch{}const R={controls:t,viewer:this,target:o,isOver:N,updateForCamera:G};try{window.__BREP_activeXform=R}catch{}const k=typeof t.getMode=="function"?t.getMode():t.mode||i;this._componentTransformSession={component:A,controls:t,helper:E,target:o,changeHandler:F,dragHandler:f,objectChangeHandler:S,cameraChangeHandler:Y,cameraChangeSource:this.controls||null,globalState:R,mode:k},m(!1),this.render()}_toggleComponentTransform(A){if(!A){this._stopComponentTransformSession();return}if(A.fixed){try{typeof this._toast=="function"&&this._toast("Component is fixed and cannot be moved.")}catch{}return}const e=this._componentTransformSession;if(e&&e.component===A){const t=e.controls,i=typeof t?.getMode=="function"?t.getMode():t?.mode||e.mode||"translate";if(i==="translate"){const o="rotate";try{t?.setMode(o)}catch{t&&(t.mode=o)}e.mode=o;try{e.globalState?.updateForCamera?.()}catch{}try{this.render()}catch{}return}if(i==="rotate"){this._stopComponentTransformSession();return}this._stopComponentTransformSession();return}this._activateComponentTransform(A)}enableDiagnosticPick(){this._diagPickOnce=!0;try{this._toast("Click an item to inspect")}catch{}}toggleInspectorPanel(){this._inspectorOpen?this._closeInspectorPanel():this._openInspectorPanel()}_getInspectorSelectionTarget(){const A=this._lastInspectorTarget;if(A&&A.selected)return A;const e=this.partHistory?.scene||this.scene||null;if(!e||typeof e.traverse!="function")return null;let t=null;return e.traverse(i=>{t||!i||!i.selected||(t=i)}),t}_openInspectorPanel(){if(this._inspectorOpen)return;this._ensureInspectorPanel(),this._inspectorEl.style.display="flex",this._inspectorOpen=!0;const A=this._getInspectorSelectionTarget();if(A){try{this._updateInspectorFor(A)}catch{}return}try{this._setInspectorPlaceholder("Click an object in the scene to inspect.")}catch{}}_closeInspectorPanel(){if(this._inspectorOpen){this._inspectorOpen=!1;try{this._inspectorEl.style.display="none"}catch{}}}_ensureInspectorPanel(){if(this._inspectorEl)return;const A=Math.max(260,Math.floor((window?.innerHeight||800)*.7)),e=new sf({title:"Inspector",width:520,height:A,x:12,bottom:12,shaded:!1,onClose:r(()=>this._closeInspectorPanel(),"onClose")}),t=document.createElement("button");t.className="fw-btn",t.textContent="Triangle Debugger",t.title="Open triangle debugger for the current selection",t.addEventListener("click",()=>{try{this._openTriangleDebugger()}catch(s){try{console.warn("Triangle debugger failed:",s)}catch{}}}),e.addHeaderAction(t);const i=document.createElement("button");i.className="fw-btn",i.textContent="Download JSON",i.addEventListener("click",()=>{try{const s=this._lastInspectorDownload?this._lastInspectorDownload():this._lastInspectorJSON||"{}",I=new Blob([s],{type:"application/json"}),n=URL.createObjectURL(I),B=document.createElement("a");B.href=n,B.download="diagnostics.json",document.body.appendChild(B),B.click(),setTimeout(()=>{document.body.removeChild(B),URL.revokeObjectURL(n)},0)}catch{}}),e.addHeaderAction(i);const o=document.createElement("div");o.style.display="block",o.style.width="100%",o.style.height="100%",e.content.appendChild(o),this._inspectorFW=e,this._inspectorEl=e.root,this._inspectorContent=o,this._lastInspectorDownload=null,this._lastInspectorJSON="{}"}_setInspectorPlaceholder(A){if(!this._inspectorContent)return;this._inspectorContent.innerHTML="";const e=document.createElement("div");e.textContent=A||"",e.style.color="#9aa4b2",e.style.font='12px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',e.style.opacity="0.9",this._inspectorContent.appendChild(e),this._lastInspectorDownload=null,this._lastInspectorJSON="{}"}_updateInspectorFor(A){if(this._ensureInspectorPanel(),this._lastInspectorTarget=A||null,this._lastInspectorSolid=this._findParentSolid(A),this._triangleDebugger&&this._triangleDebugger.isOpen&&this._triangleDebugger.isOpen())try{this._triangleDebugger.refreshTarget(A)}catch{}if(!A){this._setInspectorPlaceholder("Nothing selected.");return}try{const{out:e,downloadFactory:t}=this._renderInspectorTree(A,this._inspectorContent,{title:"Object Inspector"});this._lastInspectorDownload=t,this._lastInspectorJSON=JSON.stringify(e,null,2)}catch(e){console.warn(e),this._setInspectorPlaceholder("Inspector failed. See console.")}}_renderInspectorTree(A,e,t={}){const i=t?.title||"Object Inspector",{out:o,downloadFactory:s}=this._buildDiagnostics(A);if(e){e.innerHTML="";const I=PLt(o,{title:i,showTypes:!0,collapseChildren:!0,resolveReference:r(n=>this._resolveInspectorReference(A,n),"resolveReference"),onReferenceNavigate:r(n=>this._openDetachedInspectorWindowFor(n?.target||null),"onReferenceNavigate")});e.appendChild(I)}return{out:o,downloadFactory:s}}_formatInspectorTargetLabel(A){const e=String(A?.type||A?.constructor?.name||"Object").toUpperCase(),t=A?.name||A?.userData?.faceName||A?.userData?.edgeName||null;return t?`${e} ${t}`:e}_makeInspectorReference(A,e){if(!A)return null;const t=this._formatInspectorTargetLabel(A),i=String(e||t);return{target:A,label:i,title:`Open ${i} in a new inspector window`}}_nodeHasName(A,e){if(!A||!e)return!1;const t=[A?.name,A?.userData?.faceName,A?.userData?.edgeName,A?.userData?.vertexName,A?.userData?.name];for(const i of t)if(typeof i=="string"&&i===e)return!0;return!1}_findSceneNodeByTypeAndName(A,e,t=null){if(!A||!e)return null;const i=String(A).toUpperCase(),o=[],s=this._findParentSolid(t);s&&o.push(s),t&&o.push(t);const I=this.partHistory?.scene||this.scene||null;I&&o.push(I);const n=new Set;for(const B of o){if(!B||n.has(B))continue;n.add(B);let C=null;if(typeof B.traverse=="function"?B.traverse(a=>{C||!a||String(a.type||"").toUpperCase()===i&&this._nodeHasName(a,e)&&(C=a)}):String(B?.type||"").toUpperCase()===i&&this._nodeHasName(B,e)&&(C=B),C)return C}return null}_resolveInspectorReference(A,e={}){if(!A||!e)return null;const t=Array.isArray(e.path)?e.path:[],i=e.key,o=e.value;if(!t.length||typeof o!="string"||!o)return null;const s=String(A.type||"").toUpperCase(),I=r(C=>Number.isInteger(C)?C:-1,"asIndex"),n=r((C,a=null)=>{const Q=(a&&String(a.type||"").toUpperCase()==="FACE"?a:null)||this._findSceneNodeByTypeAndName("FACE",C,A);return this._makeInspectorReference(Q,`FACE ${C}`)},"faceRef"),B=r((C,a=null)=>{const Q=(a&&String(a.type||"").toUpperCase()==="EDGE"?a:null)||this._findSceneNodeByTypeAndName("EDGE",C,A);return this._makeInspectorReference(Q,`EDGE ${C}`)},"edgeRef");if(s==="EDGE"){if(t[0]==="faces"){const C=I(t[1]),a=Array.isArray(A.faces)&&C>=0?A.faces[C]:null;return n(o,a)}return null}if(s==="FACE"){if(t[0]==="neighbors")return n(o);if(t[0]==="edges"){const C=I(t[1]),a=Array.isArray(A.edges)&&C>=0?A.edges[C]:null;if(t[2]==="name")return B(o,a);if(t[2]==="faces"){const Q=I(t[3]),E=Array.isArray(a?.faces)&&Q>=0?a.faces[Q]:null;return n(o,E)}}}if(s==="SOLID"){if((i==="faceName"||i==="face")&&typeof o=="string")return n(o);if(i==="name"&&t[0]==="edges")return B(o)}return i==="faceName"&&typeof o=="string"?n(o):null}_openDetachedInspectorWindowFor(A){if(!A)return null;const e=this._inspectorLinkedWindowSeed++,t=520,i=Math.max(260,Math.floor((window?.innerHeight||800)*.62)),o=28+e%8*26,s=52+e%8*20;let I=null,n=null,B="{}";const C=`Inspector: ${this._formatInspectorTargetLabel(A)}`;I=new sf({title:C,width:t,height:i,x:o,y:s,shaded:!1,onClose:r(()=>{try{this._inspectorLinkedWindows.delete(I)}catch{}try{I?.destroy?.()}catch{}},"onClose")}),this._inspectorLinkedWindows.add(I);const a=document.createElement("button");a.className="fw-btn",a.textContent="Download JSON",a.addEventListener("click",()=>{try{const E=n?n():B,l=new Blob([E],{type:"application/json"}),h=URL.createObjectURL(l),w=document.createElement("a");w.href=h,w.download="diagnostics.json",document.body.appendChild(w),w.click(),setTimeout(()=>{document.body.removeChild(w),URL.revokeObjectURL(h)},0)}catch{}}),I.addHeaderAction(a);const Q=document.createElement("div");Q.style.display="block",Q.style.width="100%",Q.style.height="100%",I.content.appendChild(Q);try{const E=this._renderInspectorTree(A,Q,{title:"Object Inspector"});n=E.downloadFactory,B=JSON.stringify(E.out,null,2)}catch(E){try{console.warn("Detached inspector render failed:",E)}catch{}Q.innerHTML="";const l=document.createElement("div");l.textContent="Inspector failed. See console.",l.style.color="#9aa4b2",l.style.font='12px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',Q.appendChild(l)}try{I.bringToFront?.()}catch{}return I}_getTriangleDebugger(){return this._triangleDebugger||(this._triangleDebugger=new rfg({viewer:this})),this._triangleDebugger}_openTriangleDebugger(){try{this._getTriangleDebugger().openFor(this._lastInspectorTarget||this._lastInspectorSolid||null)}catch(A){try{console.warn("Triangle debugger open failed:",A)}catch{}}}_findParentSolid(A){const e=r(i=>i&&String(i.type||"").toUpperCase()==="SOLID","isSolid");let t=A||null;if(t&&t.parentSolid&&e(t.parentSolid))return t.parentSolid;if(t&&t.userData&&t.userData.parentSolid&&e(t.userData.parentSolid))return t.userData.parentSolid;for(;t;){if(e(t))return t;if(t.parentSolid&&e(t.parentSolid))return t.parentSolid;if(t.userData&&t.userData.parentSolid&&e(t.userData.parentSolid))return t.userData.parentSolid;t=t.parent||null}return null}_round(A){return Math.abs(A)<1e-12?0:Number(A.toFixed(6))}_edgePointsWorld(A){const e=[],t=new j,i=A?.userData?.polylineLocal,o=!!A?.userData?.polylineWorld;if(Array.isArray(i)&&i.length>=2)if(o)for(const s of i)e.push([this._round(s[0]),this._round(s[1]),this._round(s[2])]);else for(const s of i)t.set(s[0],s[1],s[2]).applyMatrix4(A.matrixWorld),e.push([this._round(t.x),this._round(t.y),this._round(t.z)]);else{const s=A?.geometry?.getAttribute?.("position");if(s&&s.itemSize===3)for(let I=0;I<s.count;I++)t.set(s.getX(I),s.getY(I),s.getZ(I)).applyMatrix4(A.matrixWorld),e.push([this._round(t.x),this._round(t.y),this._round(t.z)])}return e}_buildDiagnostics(A){const e={type:A?.type||String(A?.constructor?.name||"Object"),name:A?.name||null};let t=null;try{A.owningFeatureID?(e.owningFeatureID=A.owningFeatureID,e._owningFeatureFormatted=`Created by: ${A.owningFeatureID}`):A.parentSolid&&A.parentSolid.owningFeatureID&&(e.owningFeatureID=A.parentSolid.owningFeatureID,e._owningFeatureFormatted=`Created by: ${A.parentSolid.owningFeatureID}`)}catch{}if(A.type==="FACE"){let i=A.parent;for(;i&&i.type!=="SOLID";)i=i.parent;const o=A.userData?.faceName||A.name;try{if(i&&typeof i.getFace=="function"&&o){const s=i.getFace(o)||[],I=r(B=>({indices:Array.isArray(B.indices)?B.indices:void 0,p1:B.p1.map(this._round),p2:B.p2.map(this._round),p3:B.p3.map(this._round),normal:(()=>{const C=B.p1,a=B.p2,Q=B.p3,E=a[0]-C[0],l=a[1]-C[1],h=a[2]-C[2],w=Q[0]-C[0],d=Q[1]-C[1],D=Q[2]-C[2],u=l*D-h*d,M=h*w-E*D,y=E*d-l*w,p=Math.hypot(u,M,y)||1;return[this._round(u/p),this._round(M/p),this._round(y/p)]})(),area:(()=>{const C=B.p1,a=B.p2,Q=B.p3,E=a[0]-C[0],l=a[1]-C[1],h=a[2]-C[2],w=Q[0]-C[0],d=Q[1]-C[1],D=Q[2]-C[2],u=l*D-h*d,M=h*w-E*D,y=E*d-l*w;return this._round(.5*Math.hypot(u,M,y))})()}),"mapTri"),n=s.map(I);try{let B=5e3;typeof window<"u"&&Number.isFinite(window.BREP_DIAG_TRI_MAX_FACE)&&(B=window.BREP_DIAG_TRI_MAX_FACE|0),B<0&&(B=n.length);const C=Math.min(n.length,B);e._trianglesSummary=`${n.length} triangles (click to expand)`,e._lazyTriangles=()=>n.slice(0,C),C<n.length&&(e.trianglesTruncated=!0,e.trianglesTotal=n.length,e.trianglesLimit=B)}catch{e._trianglesSummary=`${n.length} triangles (click to expand)`,e._lazyTriangles=()=>n}t=r(()=>{const B=JSON.parse(JSON.stringify(e));return B.triangles=n,delete B.trianglesTruncated,delete B.trianglesLimit,delete B.trianglesTotal,JSON.stringify(B,null,2)},"downloadFactory")}else{const s=A.geometry?.getAttribute?.("position");if(s){const I=new j,n=s.count/3|0,B=new Array(n);for(let C=0;C<n;C++){I.set(s.getX(3*C+0),s.getY(3*C+0),s.getZ(3*C+0)).applyMatrix4(A.matrixWorld);const a=[this._round(I.x),this._round(I.y),this._round(I.z)];I.set(s.getX(3*C+1),s.getY(3*C+1),s.getZ(3*C+1)).applyMatrix4(A.matrixWorld);const Q=[this._round(I.x),this._round(I.y),this._round(I.z)];I.set(s.getX(3*C+2),s.getY(3*C+2),s.getZ(3*C+2)).applyMatrix4(A.matrixWorld);const E=[this._round(I.x),this._round(I.y),this._round(I.z)],l=Q[0]-a[0],h=Q[1]-a[1],w=Q[2]-a[2],d=E[0]-a[0],D=E[1]-a[1],u=E[2]-a[2],M=h*u-w*D,y=w*d-l*u,p=l*D-h*d,m=Math.hypot(M,y,p)||1;B[C]={p1:a,p2:Q,p3:E,normal:[this._round(M/m),this._round(y/m),this._round(p/m)],area:this._round(.5*Math.hypot(M,y,p))}}try{let C=5e3;typeof window<"u"&&Number.isFinite(window.BREP_DIAG_TRI_MAX_FACE)&&(C=window.BREP_DIAG_TRI_MAX_FACE|0),C<0&&(C=B.length);const a=Math.min(B.length,C);e.triangles=B.slice(0,a),a<B.length&&(e.trianglesTruncated=!0,e.trianglesTotal=B.length,e.trianglesLimit=C)}catch{e.triangles=B}t=r(()=>{const C=JSON.parse(JSON.stringify(e));return C.triangles=B,delete C.trianglesTruncated,delete C.trianglesLimit,delete C.trianglesTotal,JSON.stringify(C,null,2)},"downloadFactory")}}}catch{}try{const s=Array.isArray(A.edges)?A.edges:[];e.edges=s.map(I=>({name:I.name||null,faces:Array.isArray(I.faces)?I.faces.map(n=>n?.name||n?.userData?.faceName||null):[],closedLoop:!!I.closedLoop,length:typeof I.length=="function"?this._round(I.length()):void 0,points:this._edgePointsWorld(I)}))}catch{e.edges=[]}try{e._lazyUniqueVertices=()=>{const s=e._lazyTriangles&&typeof e._lazyTriangles=="function"?e._lazyTriangles():[],I=new Map;for(const n of s)for(const B of[n.p1,n.p2,n.p3]){const C=`${B[0]},${B[1]},${B[2]}`;I.has(C)||I.set(C,B)}return Array.from(I.values())}}catch{}try{const s=A.getAverageNormal?.();s&&(e.averageNormal=[this._round(s.x),this._round(s.y),this._round(s.z)])}catch{}try{const s=A.surfaceArea?.();Number.isFinite(s)&&(e.surfaceArea=this._round(s),e._faceAreaFormatted=`${this._round(s)} units²`)}catch{}try{e._lazyBbox=()=>{const s=[];for(const I of e.triangles||[])s.push(I.p1,I.p2,I.p3);if(s.length){let I=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(const B of s)B[0]<I[0]&&(I[0]=B[0]),B[1]<I[1]&&(I[1]=B[1]),B[2]<I[2]&&(I[2]=B[2]),B[0]>n[0]&&(n[0]=B[0]),B[1]>n[1]&&(n[1]=B[1]),B[2]>n[2]&&(n[2]=B[2]);return{min:I,max:n}}return null}}catch{}try{const s=A?.name||A?.userData?.faceName||null;let I=new Set;const n=A?.parentSolid||A?.userData?.parentSolid||null;if(n&&typeof n.getBoundaryEdgePolylines=="function"&&s){const B=n.getBoundaryEdgePolylines()||[];for(const C of B){const a=C?.faceA,Q=C?.faceB;a===s&&Q?I.add(Q):Q===s&&a&&I.add(a)}}if(I.size===0&&n&&Array.isArray(n.children)){for(const B of A.edges||[])if(!(!B||!Array.isArray(B.faces)))for(const C of B.faces){const a=C?.name||C?.userData?.faceName||null;a&&I.add(a)}}s&&I.delete(s),e.neighbors=Array.from(I)}catch{}try{const s=A.userData?.boundaryLoopsWorld;Array.isArray(s)&&s.length&&(e.boundaryLoops=s.map(I=>({isHole:!!I.isHole,pts:(Array.isArray(I.pts)?I.pts:I).map(n=>[this._round(n[0]),this._round(n[1]),this._round(n[2])])})))}catch{}}else if(A.type==="EDGE"){e.closedLoop=!!A.closedLoop,e._lazyPoints=()=>this._edgePointsWorld(A);try{const i=A.length();Number.isFinite(i)&&(e.length=this._round(i),e._edgeLengthFormatted=`${this._round(i)} units`)}catch{}try{e.faces=Array.isArray(A.faces)?A.faces.map(i=>i?.name||i?.userData?.faceName||null):[]}catch{}}else if(A.type==="SOLID"){try{const s=A.getFaces?.(!1)||[];e.faceCount=s.length,e.faces=s.slice(0,10).map(I=>({faceName:I.faceName,triangles:(I.triangles||[]).length})),s.length>10&&(e.facesTruncated=!0)}catch{}let i=null,o=!1;try{const s=A.getMesh?.();s&&s.vertProperties&&s.triVerts&&(i={vp:Array.from(s.vertProperties),tv:Array.from(s.triVerts),ids:Array.isArray(s.faceID)?Array.from(s.faceID):[]})}catch{}if(!i)try{const s=Array.isArray(A._vertProperties)?A._vertProperties.slice():[],I=Array.isArray(A._triVerts)?A._triVerts.slice():[],n=Array.isArray(A._triIDs)?A._triIDs.slice():[];i={vp:s,tv:I,ids:n},o=!0}catch{}if(i){const{vp:s,tv:I,ids:n}=i;e.meshStats={vertices:s.length/3|0,triangles:I.length/3|0,source:o?"authoring":"manifold"};let B=[1/0,1/0,1/0],C=[-1/0,-1/0,-1/0];for(let a=0;a<s.length;a+=3){const Q=this._round(s[a]),E=this._round(s[a+1]),l=this._round(s[a+2]);Q<B[0]&&(B[0]=Q),E<B[1]&&(B[1]=E),l<B[2]&&(B[2]=l),Q>C[0]&&(C[0]=Q),E>C[1]&&(C[1]=E),l>C[2]&&(C[2]=l)}B[0]!==1/0&&(e.bbox={min:B,max:C});try{const a=I.length/3|0;let Q=5e3;try{typeof window<"u"&&Number.isFinite(window.BREP_DIAG_TRI_MAX)&&(Q=window.BREP_DIAG_TRI_MAX|0)}catch{}Q<0&&(Q=a);const E=Math.min(a,Q),l=new Array(E),h=r(w=>A._idToFaceName&&A._idToFaceName.get?A._idToFaceName.get(w):void 0,"nameOf");for(let w=0;w<E;w++){const d=I[3*w+0]>>>0,D=I[3*w+1]>>>0,u=I[3*w+2]>>>0,M=[this._round(s[3*d+0]),this._round(s[3*d+1]),this._round(s[3*d+2])],y=[this._round(s[3*D+0]),this._round(s[3*D+1]),this._round(s[3*D+2])],p=[this._round(s[3*u+0]),this._round(s[3*u+1]),this._round(s[3*u+2])];let m=Array.isArray(n)&&n.length===a?n[w]:void 0;const F=y[0]-M[0],f=y[1]-M[1],S=y[2]-M[2],N=p[0]-M[0],G=p[1]-M[1],Y=p[2]-M[2],R=f*Y-S*G,k=S*N-F*Y,b=F*G-f*N,L=Math.hypot(R,k,b)||1;l[w]={index:w,faceID:m,faceName:m!==void 0&&h(m)||null,p1:M,p2:y,p3:p,normal:[this._round(R/L),this._round(k/L),this._round(b/L)],area:this._round(.5*L)}}e._trianglesSummary=`${a} triangles (click to expand)`,e._lazyTriangles=()=>l,E<a&&(e.trianglesTruncated=!0,e.trianglesTotal=a,e.trianglesLimit=Q),t=r(()=>{const w=new Array(a),d=r(u=>A._idToFaceName&&A._idToFaceName.get?A._idToFaceName.get(u):void 0,"nameOf");for(let u=0;u<a;u++){const M=I[3*u+0]>>>0,y=I[3*u+1]>>>0,p=I[3*u+2]>>>0,m=[this._round(s[3*M+0]),this._round(s[3*M+1]),this._round(s[3*M+2])],F=[this._round(s[3*y+0]),this._round(s[3*y+1]),this._round(s[3*y+2])],f=[this._round(s[3*p+0]),this._round(s[3*p+1]),this._round(s[3*p+2])];let S=Array.isArray(n)&&n.length===a?n[u]:void 0;const N=F[0]-m[0],G=F[1]-m[1],Y=F[2]-m[2],R=f[0]-m[0],k=f[1]-m[1],b=f[2]-m[2],L=G*b-Y*k,H=Y*R-N*b,J=N*k-G*R,Z=Math.hypot(L,H,J)||1;w[u]={index:u,faceID:S,faceName:S!==void 0&&d(S)||null,p1:m,p2:F,p3:f,normal:[this._round(L/Z),this._round(H/Z),this._round(J/Z)],area:this._round(.5*Z)}}const D=JSON.parse(JSON.stringify(e));return D.triangles=w,delete D.trianglesTruncated,delete D.trianglesLimit,delete D.trianglesTotal,JSON.stringify(D,null,2)},"downloadFactory")}catch{}try{const a=s.length/3|0,Q=BigInt(Math.max(1,a)),E=r((G,Y)=>{const R=BigInt(G),k=BigInt(Y);return R<k?R*Q+k:k*Q+R},"eKey"),l=new Map,h=I.length/3|0,w=[],d=new Uint8Array(a);for(let G=0;G<h;G++){const Y=I[3*G+0]>>>0,R=I[3*G+1]>>>0,k=I[3*G+2]>>>0;d[Y]=1,d[R]=1,d[k]=1;const b=s[3*Y+0],L=s[3*Y+1],H=s[3*Y+2],J=s[3*R+0],Z=s[3*R+1],P=s[3*R+2],x=s[3*k+0],V=s[3*k+1],tA=s[3*k+2],AA=J-b,_=Z-L,q=P-H,sA=x-b,QA=V-L,hA=tA-H,oA=_*hA-q*QA,IA=q*sA-AA*hA,X=AA*QA-_*sA;oA*oA+IA*IA+X*X<=1e-30&&w.push(G);const K=r((T,iA)=>{const CA=E(Math.min(T,iA),Math.max(T,iA));l.set(CA,(l.get(CA)||0)+1)},"add");K(Y,R),K(R,k),K(k,Y)}let D=0,u=0,M=0;const y=[],p=[],m=[];for(const[G,Y]of l.entries())Y>2?(D++,y.length<12&&y.push({edge:G.toString(),uses:Y})):Y<2&&(u++,Y===1?(M++,m.length<12&&m.push({edge:G.toString(),uses:Y})):p.length<12&&p.push({edge:G.toString(),uses:Y}));let F=0;for(let G=0;G<a;G++)d[G]||F++;const f=M===0,S=D>0,N=f&&!S;e.topology={isManifold:N,closed:f,nonManifoldEdges:S?D:0,degenerateTriangles:{count:w.length,examples:w.slice(0,12)},edges:{gt2:D,lt2:u,boundary:M,examples_gt2:y,examples_lt2:p,examples_boundary:m},isolatedVertices:F},e.isManifold=N}catch{}if(!e.faceCount||!Array.isArray(e.faces))try{const a=r(h=>A._idToFaceName&&A._idToFaceName.get?A._idToFaceName.get(h):String(h),"nameOf"),Q=new Map,E=I.length/3|0;for(let h=0;h<E;h++){const w=Array.isArray(n)?n[h]:void 0,d=a(w);if(!d)continue;let D=Q.get(d);D||(D=[],Q.set(d,D)),D.push(h)}const l=[];for(const[h,w]of Q.entries())l.push({faceName:h,triangles:w.length});l.sort((h,w)=>w.triangles-h.triangles),e.faceCount=l.length,e.faces=l.slice(0,20),l.length>20&&(e.facesTruncated=!0)}catch{}}try{const s=A.volume?.();Number.isFinite(s)&&(e.volume=this._round(s))}catch{}try{const s=A.surfaceArea?.();Number.isFinite(s)&&(e.surfaceArea=this._round(s))}catch{}}return{out:e,downloadFactory:t||(()=>JSON.stringify(e,null,2))}}_showDiagnosticsFor(A){const{out:e,downloadFactory:t}=this._buildDiagnostics(A),i=JSON.stringify(e,null,2);this._showModal("Selection Diagnostics",i,{onDownload:t})}_toast(A,e=1200){try{const t=document.createElement("div");t.textContent=A,t.style.cssText='position:fixed;top:48px;left:50%;transform:translateX(-50%);background:#111c;backdrop-filter:blur(6px);color:#e5e7eb;padding:6px 10px;border:1px solid #2a3442;border-radius:8px;z-index:7;font:12px/1.2 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;',document.body.appendChild(t),setTimeout(()=>{try{t.parentNode&&t.parentNode.removeChild(t)}catch{}},e)}catch{}}_showModal(A,e,t={}){const i=document.createElement("div");i.style.cssText="position:fixed;inset:0;background:rgba(0,0,0,0.55);backdrop-filter:blur(2px);z-index:7;display:flex;align-items:center;justify-content:center;";const o=document.createElement("div");o.style.cssText="width:min(980px,90vw);height:min(70vh,720px);background:#0b0d10;border:1px solid #2a3442;border-radius:10px;box-shadow:0 12px 28px rgba(0,0,0,.35);display:flex;flex-direction:column;overflow:hidden;";const s=document.createElement("div");s.style.cssText='display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid #1e2430;color:#e5e7eb;font:600 13px ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;',s.textContent=A||"Diagnostics";const I=document.createElement("button");I.textContent="✕",I.title="Close",I.style.cssText='margin-left:auto;background:transparent;border:0;color:#9aa4b2;cursor:pointer;font:700 14px ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;padding:4px;';const n=document.createElement("textarea");n.readOnly=!0,n.value=e||"",n.style.cssText="flex:1;resize:none;background:#0f141a;color:#e5e7eb;border:0;padding:10px 12px;font:12px/1.3 ui-monospace,Menlo,Consolas,monospace;white-space:pre;";const B=document.createElement("div");B.style.cssText="display:flex;gap:8px;justify-content:flex-end;padding:8px 12px;border-top:1px solid #1e2430;";const C=document.createElement("button");C.className="mtb-btn",C.textContent="Copy JSON",C.style.cssText="background:#1b2433;border:1px solid #334155;color:#e5e7eb;padding:6px 10px;border-radius:8px;cursor:pointer;font-weight:700;font-size:12px;",C.addEventListener("click",async()=>{try{await navigator.clipboard.writeText(n.value),C.textContent="Copied!",setTimeout(()=>C.textContent="Copy JSON",900)}catch{}});const a=document.createElement("button");a.className="mtb-btn",a.textContent="Download",a.style.cssText=C.style.cssText,a.addEventListener("click",()=>{try{const Q=t&&typeof t.onDownload=="function"?t.onDownload():n.value,E=new Blob([Q],{type:"application/json"}),l=URL.createObjectURL(E),h=document.createElement("a");h.href=l,h.download="diagnostics.json",document.body.appendChild(h),h.click(),setTimeout(()=>{document.body.removeChild(h),URL.revokeObjectURL(l)},0)}catch{}}),I.addEventListener("click",()=>{try{document.body.removeChild(i)}catch{}}),i.addEventListener("click",Q=>{if(Q.target===i)try{document.body.removeChild(i)}catch{}}),s.appendChild(I),o.appendChild(s),o.appendChild(n),B.appendChild(C),B.appendChild(a),o.appendChild(B),i.appendChild(o),document.body.appendChild(i)}_getContainerSize(){const A=this.container.clientWidth||window.innerWidth||1,e=this.container.clientHeight||window.innerHeight||1;return{width:Math.max(1,A),height:Math.max(1,e)}}_resizeRendererToDisplaySize(){const{width:A,height:e}=this._getContainerSize(),t=!!this.renderer?.isWebGLRenderer;let i=1;if(t&&typeof this.renderer.getPixelRatio=="function"&&typeof this.renderer.setPixelRatio=="function"){const s=window.devicePixelRatio||1;i=Math.max(1,Math.min(this.pixelRatio||s,s)),this.renderer.getPixelRatio()!==i&&this.renderer.setPixelRatio(i)}if(t){const s=this.renderer.domElement;(s.width!==Math.floor(A*i)||s.height!==Math.floor(e*i))&&this.renderer.setSize(A,e,!0),this._webglComposer&&this._webglComposerRenderer===this.renderer&&(typeof this._webglComposer.setPixelRatio=="function"&&this._webglComposer.setPixelRatio(i),this._webglComposer.setSize(A,e)),this._solidFaceOutlineEdgeMaskTarget&&typeof this._solidFaceOutlineEdgeMaskTarget.setSize=="function"&&this._solidFaceOutlineEdgeMaskTarget.setSize(Math.max(1,Math.round(A*i)),Math.max(1,Math.round(e*i)))}else if(this.renderer&&typeof this.renderer.setSize=="function"){this.renderer.setSize(A,e);try{const s=this.renderer.domElement;s&&(s.style.width="100%",s.style.height="100%")}catch{}}try{const s=r(I=>I&&I.resolution&&typeof I.resolution.set=="function"&&I.resolution.set(A,e),"setRes");Co?.EDGE&&(s(Co.EDGE.BASE),s(Co.EDGE.SELECTED),Co.EDGE.OVERLAY&&s(Co.EDGE.OVERLAY),Co.EDGE.THREAD_SYMBOLIC_MAJOR&&s(Co.EDGE.THREAD_SYMBOLIC_MAJOR)),Co?.LOOP&&(s(Co.LOOP.BASE),s(Co.LOOP.SELECTED))}catch{}try{const s=this.partHistory?.scene||this.scene;s&&s.traverse(I=>{const n=I?.material;if(!n)return;const B=r(C=>{C?.resolution&&typeof C.resolution.set=="function"&&C.resolution.set(A,e)},"apply");Array.isArray(n)?n.forEach(B):B(n)})}catch{}this._updateOverlayDashSpacing(A,e);const o=A/e||1;if(this.camera?.isOrthographicCamera){const s=Number.isFinite(this.camera.top)&&Number.isFinite(this.camera.bottom)?this.camera.top-this.camera.bottom:this.viewSize*2,I=Math.abs(s)>1e-6?s:this.viewSize*2,n=Number.isFinite(this.camera.top)&&Number.isFinite(this.camera.bottom)?(this.camera.top+this.camera.bottom)*.5:0,B=Number.isFinite(this.camera.left)&&Number.isFinite(this.camera.right)?(this.camera.left+this.camera.right)*.5:0,C=Math.abs(I)*.5,a=C*o,Q=I>=0?1:-1;this.camera.top=n+C*Q,this.camera.bottom=n-C*Q,this.camera.left=B-a,this.camera.right=B+a}else this.camera?.isPerspectiveCamera&&(this.camera.aspect=o);this.camera?.updateProjectionMatrix?.(),this.controls&&typeof this.controls.update=="function"&&this.controls.update()}_onResize(){this._resizeScheduled||(this._resizeScheduled=!0,requestAnimationFrame(()=>{this._resizeScheduled=!1,this._resizeRendererToDisplaySize(),this.render();try{this._sketchMode?.onCameraChanged?.()}catch{}}))}_onControlsChange(){if(!this._disposed){if(this._shouldSuppressSceneHover())try{tt.clearHover()}catch{}else this._lastPointerEvent&&this._updateHover(this._lastPointerEvent);try{const A=this.renderer?.getSize?.(new Ye)||null,e=A?.width||this.renderer?.domElement?.clientWidth||0,t=A?.height||this.renderer?.domElement?.clientHeight||0;e&&t&&this._updateOverlayDashSpacing(e,t)}catch{}try{this._sketchMode?.onCameraChanged?.()}catch{}}}_worldPerPixel(A,e,t){if(A&&A.isOrthographicCamera){const n=typeof A.zoom=="number"&&A.zoom>0?A.zoom:1,B=(A.right-A.left)/(e*n),C=(A.top-A.bottom)/(t*n);return Math.max(B,C)}const i=this.controls?.target,o=i&&A?.position?.distanceTo?.(i)||A?.position?.length?.()||1,s=(A?.fov||50)*Math.PI/180,I=typeof A?.zoom=="number"&&A.zoom>0?A.zoom:1;return 2*Math.tan(s/2)*o/(t*I)}_updateOverlayDashSpacing(A,e){if(!this.camera||!this.renderer)return;const t=A||this.renderer.domElement?.clientWidth||0,i=e||this.renderer.domElement?.clientHeight||0;if(!t||!i)return;let o=null;try{o=this._worldPerPixel(this.camera,t,i)}catch{o=null}if(!Number.isFinite(o)||o<=0||this._lastDashWpp&&Math.abs(this._lastDashWpp-o)<this._lastDashWpp*5e-4)return;this._lastDashWpp=o;const s=10,I=8,n=r(B=>{if(B)try{B.dashSize=s*o,B.gapSize=I*o,B.needsUpdate=!0}catch{}},"setDash");try{const B=Co?.EDGE||{};n(B.OVERLAY),n(B.THREAD_SYMBOLIC_MAJOR)}catch{}}},c(_MA,"G1e2"),_MA);r(nyi,"Viewer");let WNe=nyi;window.DEBUG_MODE=!1;function Sy(...g){window.DEBUG_MODE&&console.log(...g)}c(Sy,"x0");r(Sy,"debugLog");const dfg="brep:cad",Byi=!0;function h_A(g,A=!1){if(g==null)return A;if(typeof g=="string"){const e=g.trim().toLowerCase();if(e==="false"||e==="0"||e==="off"||e==="no")return!1;if(e==="true"||e==="1"||e==="on"||e==="yes")return!0}return g!==!1&&g!==0}c(h_A,"doe");r(h_A,"normalizeBoolean$1");function ryi(g,A=Byi){return h_A(g,A)}c(ryi,"Qki");r(ryi,"normalizeSidebarExpanded");function Bve(g){const A=String(g||"").replace(/\\/g,"/"),e=[];for(const t of A.split("/")){const i=String(t||"").trim();!i||i==="."||i===".."||e.push(i)}return e.join("/")}c(Bve,"AMt");r(Bve,"normalizeModelPath");function w_A(g){const A=Bve(g);return A?A.toLowerCase().endsWith(".3mf")?A.slice(0,-4):A:""}c(w_A,"woe");r(w_A,"stripModelFileExtension");function Cyi(g){return typeof g=="string"?g:g==null?"":JSON.stringify(g,null,2)}c(Cyi,"Eki");r(Cyi,"toJSONText");function ayi(g){const A=String(g||"").trim().toLowerCase();return A==="github"?"github":A==="mounted"?"mounted":"local"}c(ayi,"cki");r(ayi,"normalizeSource");function nG(g,A=""){const e=String(g||"").trim().toLowerCase();if(e==="github"||e==="mounted"||e==="local")return e;const t=String(A||"").trim();return t?t.includes("/")?"github":"mounted":"local"}c(nG,"pk");r(nG,"resolveStorageSource");function jF(g){return w_A(g)}c(jF,"LN");r(jF,"normalizeFilePath");function _Ne(g){return g instanceof ArrayBuffer?uR(new Uint8Array(g)):ArrayBuffer.isView(g)?uR(new Uint8Array(g.buffer,g.byteOffset,g.byteLength)):Array.isArray(g)?uR(Uint8Array.from(g)):""}c(_Ne,"w7e");r(_Ne,"toBase64FromBinary");function Qyi(g={}){if(typeof g=="string")return{modelPath:w_A(g),options:{source:"local"}};const A=g&&typeof g=="object"?g:{},e=A.modelPath??A.path??A.name??A.model,t=w_A(e),i=ayi(A.source),o={source:i},s=String(A.repoFull||"").trim(),I=String(A.branch||"").trim();return i!=="local"&&s&&(o.repoFull=s),I&&(o.branch=I),{modelPath:t,options:o}}c(Qyi,"lki");r(Qyi,"normalizeModelRequest");var si,Eyi,cyi,LRA,zIe,RNA,Ph,YNA,q9e,VIe,WIe,mS,B4,_Ie,Z9e,X9e,qIe,qvA,ZIe,ZvA,XvA,$9e,AZe,eZe,tZe,iZe,XIe,$Ie,gZe,oZe,sZe,lyi,qMA;const hyi=(qMA=class{constructor({channel:A,instanceId:e}){wI(this,si),this._channel=A,this._instanceId=e,this._viewer=null,this._viewerBootPromise=null,this._viewerOnlyMode=!1,this._sidebarExpanded=Byi,this._historyHooksInstalled=!1,this._saveHookInstalled=!1,this._fileHooksInstalled=!1,this._saveInProgress=!1,this._boundStorageEvent=null,this._boundStorageBackendEvent=null,this._customCssEl=null,this._root=null,this._ownsRoot=!1,this._sidebarEl=null,this._viewportEl=null,this._disposed=!1,this._boundMessage=t=>v(this,si,lyi).call(this,t)}boot(){this._disposed||(v(this,si,Eyi).call(this),v(this,si,cyi).call(this),window.addEventListener("message",this._boundMessage),v(this,si,LRA).call(this,"ready",{version:1}))}dispose(){if(!this._disposed){this._disposed=!0,window.removeEventListener("message",this._boundMessage);try{this._viewer?.dispose?.()}catch{}this._viewer=null,this._viewerBootPromise=null,this._historyHooksInstalled=!1,this._saveHookInstalled=!1,this._fileHooksInstalled=!1,this._saveInProgress=!1;try{this._boundStorageEvent&&window.removeEventListener("storage",this._boundStorageEvent)}catch{}try{this._boundStorageBackendEvent&&window.removeEventListener(i5A,this._boundStorageBackendEvent)}catch{}this._boundStorageEvent=null,this._boundStorageBackendEvent=null;try{this._ownsRoot&&this._root?.parentNode&&this._root.parentNode.removeChild(this._root)}catch{}this._root=null,this._ownsRoot=!1,this._sidebarEl=null,this._viewportEl=null}}},c(qMA,"R1e2"),qMA);si=new WeakSet,Eyi=r(function(){if(document.getElementById("cad-frame-base-styles"))return;const g=document.createElement("style");g.id="cad-frame-base-styles",g.textContent=`
|
|
15467
|
+
`)),i!==t&&(e.uniforms={...e.uniforms||{},edgeMaskTexture:{value:null}},e.fragmentShader=i,e.blending=cR,e.userData={...e.userData||{},__solidOverlayPatched:!0},e.needsUpdate=!0)}_ensureWebglPostProcessing(){if(!(!this.renderer?.isWebGLRenderer||!this.scene||!this.camera)){if(!this._webglComposer||this._webglComposerRenderer!==this.renderer){this._disposeWebglPostProcessing();const{width:A,height:e}=this._getContainerSize(),t=typeof this.renderer.getPixelRatio=="function"?Math.max(1,Number(this.renderer.getPixelRatio())||1):1,i=new GHi(this.renderer),o=new RHi(this.scene,this.camera),s=new QqA(new Ye(A,e),this.scene,this.camera,[]),I=new qn(Math.max(1,Math.round(A*t)),Math.max(1,Math.round(e*t)));I.texture.name="Viewer.SolidFaceOutlineEdgeMask",I.texture.generateMipmaps=!1;const n=new RfA;n.side=co,n.colorWrite=!1,n.depthWrite=!0,n.depthTest=!0,n.blending=Ec,s.downSampleRatio=1,s.visibleEdgeColor.set(16776960),s.hiddenEdgeColor.set(0),s.edgeGlow=0,s.edgeThickness=1,s.edgeStrength=3,this._patchOutlinePassHiddenEdgeAlpha(s),this._patchOutlinePassPerFaceRendering(s),this._patchOutlinePassSolidOverlay(s),i.addPass(o),i.addPass(s),typeof i.setPixelRatio=="function"&&typeof this.renderer.getPixelRatio=="function"&&i.setPixelRatio(this.renderer.getPixelRatio()),i.setSize(A,e),s.setSize(A,e),this._webglComposer=i,this._webglComposerRenderer=this.renderer,this._renderPass=o,this._solidFaceOutlinePass=s,this._solidFaceOutlineEdgeMaskTarget=I,this._solidFaceOutlineDepthMaterial=n}this._renderPass&&(this._renderPass.scene=this.scene,this._renderPass.camera=this.camera),this._solidFaceOutlinePass&&(this._solidFaceOutlinePass.renderScene=this.scene,this._solidFaceOutlinePass.renderCamera=this.camera,this._solidFaceOutlinePass.overlayMaterial?.uniforms?.edgeMaskTexture&&(this._solidFaceOutlinePass.overlayMaterial.uniforms.edgeMaskTexture.value=this._solidFaceOutlineEdgeMaskTarget?.texture||null))}}_isObjectEffectivelyVisible(A){let e=A;for(;e;){if(e.visible===!1)return!1;e=e.parent}return!0}_collectSolidFaceOutlineObjects(){const A=this._solidFaceOutlineSelection||[];A.length=0;const e=this.scene;return e&&e.traverse(t=>{if(!t||t.type!=="SOLID"||!this._isObjectEffectivelyVisible(t))return;const i=Array.isArray(t.children)?t.children:[];for(const o of i)!o||o.type!=="FACE"||!o.isMesh||this._isObjectEffectivelyVisible(o)&&A.push(o)}),A}_renderSolidFaceOutlineEdgeMask(){this._ensureWebglPostProcessing();const A=this.renderer,e=this.scene,t=this.camera,i=this._solidFaceOutlineEdgeMaskTarget,o=this._solidFaceOutlineDepthMaterial;if(!A?.isWebGLRenderer||!e||!t||!i||!o)return;const s=new Map;e.traverse(l=>{l&&s.set(l,l.visible!==!1)});const I=r(l=>{e.traverse(h=>{if(h){if(s.get(h)===!1){h.visible=!1;return}if(h.isMesh||h.isLine||h.isLine2||h.isLineSegments||h.isLineLoop||h.isPoints||h.isSprite){h.visible=!!l(h);return}h.visible=!0}})},"applyRenderableVisibility"),n=new ct;A.getClearColor(n);const B=A.getClearAlpha(),C=A.autoClear,a=typeof A.getRenderTarget=="function"?A.getRenderTarget():null,Q=e.background,E=e.overrideMaterial;try{e.background=null,A.autoClear=!0,A.setRenderTarget(i),A.setClearColor(0,0),A.clear(!0,!0,!0),I(l=>l.isMesh),e.overrideMaterial=o,A.render(e,t),I(l=>l?.type!=="EDGE"||l.userData?.auxEdge?!1:l.material?.depthTest!==!1),e.overrideMaterial=null,A.render(e,t)}finally{e.overrideMaterial=E,e.background=Q,s.forEach((l,h)=>{h&&(h.visible=l)}),A.setRenderTarget(a),A.setClearColor(n,B),A.autoClear=C}}_syncSolidFaceOutlinePass(){if(this._ensureWebglPostProcessing(),!this._solidFaceOutlinePass)return;const A=Co?.EDGE?.BASE?.color;A&&typeof this._solidFaceOutlinePass.visibleEdgeColor?.copy=="function"&&this._solidFaceOutlinePass.visibleEdgeColor.copy(A);const e=Number(Co?.EDGE?.BASE?.linewidth);Number.isFinite(e)&&e>0&&(this._solidFaceOutlinePass.edgeThickness=e*.5),this._solidFaceOutlinePass.selectedObjects=this._collectSolidFaceOutlineObjects()}async withForcedPostProcessing(A){if(typeof A!="function")return null;this._forcePostProcessingDepth=Math.max(0,Number(this._forcePostProcessingDepth)||0)+1;try{return await A()}finally{this._forcePostProcessingDepth=Math.max(0,(Number(this._forcePostProcessingDepth)||1)-1);try{this.render()}catch{}}}_applyRendererElementStyles(A){const e=A?.domElement;e&&(e.style.display="block",e.style.outline="none",e.style.userSelect="none",e.style.width="100%",e.style.height="100%",e.style.background=this._clearAlpha===0?"transparent":this._clearColor.getStyle())}_attachRendererEvents(A){A&&(A.addEventListener("pointermove",this._onPointerMove,{passive:!0}),A.addEventListener("pointerleave",this._onPointerLeave,{passive:!0}),A.addEventListener("pointerenter",this._onPointerEnter,{passive:!0}),A.addEventListener("pointerdown",this._onPointerDown,{passive:!1}),A.addEventListener("contextmenu",this._onContextMenu))}_detachRendererEvents(A){A&&(A.removeEventListener("pointermove",this._onPointerMove),A.removeEventListener("pointerleave",this._onPointerLeave),A.removeEventListener("pointerenter",this._onPointerEnter),A.removeEventListener("pointerdown",this._onPointerDown),A.removeEventListener("contextmenu",this._onContextMenu))}_rebuildControls(A){const e=this.controls,t=e?{target:e.target?e.target.clone():null,enabled:e.enabled,minDistance:e.minDistance,maxDistance:e.maxDistance,enableAnimations:e.enableAnimations}:null;try{e?.removeEventListener?.("change",this._onControlsChange)}catch{}try{e?.dispose?.()}catch{}const i=new CCe(this.camera,A,this.scene);i.enableAnimations=t?!!t.enableAnimations:!1,i.setGizmosVisible(!1),i.minDistance=t&&Number.isFinite(t.minDistance)?t.minDistance:.01,t&&Number.isFinite(t.maxDistance)&&(i.maxDistance=t.maxDistance),t?.target&&i.target.copy(t.target),typeof t?.enabled=="boolean"&&(i.enabled=t.enabled),this.controls=i}_onCameraMove(){this.sidebar&&(this.sidebar.style.opacity=.9),this._cameraMoving=!0,this._updateDepthRange()}_onCameraIdle(){this.sidebar&&(this.sidebar.style.opacity=.9),this._cameraMoving=!1,this.scene.traverse(A=>{const e=A&&A.geometry;if(e&&typeof e.computeBoundingSphere=="function")try{e.computeBoundingSphere()}catch{}}),this._updateDepthRange();try{this.render()}catch{}}_configureCameraIdleCallbacks(){try{this.camera?.disableIdleCallbacks?.()}catch{}try{this.camera?.attachControls?.(this.controls)}catch{}if(typeof this.camera?.enableIdleCallbacks=="function")try{this.camera.enableIdleCallbacks({controls:this.controls,idleMs:300,onMove:r(()=>this._onCameraMove(),"onMove"),onIdle:r(()=>this._onCameraIdle(),"onIdle")})}catch{}}_syncActiveTransformGizmosForCamera({resetSize:A=!1}={}){const e=this.camera||null,t=this.renderer?.domElement||null,i=r((n,B=null)=>{if(!n)return;let C=!1;try{typeof n.setCamera=="function"?(n.setCamera(e,{resetSize:A,refresh:!1}),C=!0):e&&(n.camera=e)}catch{}try{typeof n.setDomElement=="function"?n.setDomElement(t):t&&(n.domElement=t)}catch{}if(A&&!C)try{typeof n.resetSize=="function"?n.resetSize():typeof n.setSize=="function"&&n.setSize(2)}catch{}try{typeof B=="function"?B():typeof n.update=="function"?n.update():n.updateMatrixWorld?.(!0)}catch{}},"applyGizmoCamera"),o=r((n,B="cameraChangeHandler",C="cameraChangeSource")=>{if(!n)return;const a=n[B];if(typeof a!="function")return;const Q=n[C];if(Q&&Q!==this.controls&&typeof Q.removeEventListener=="function")try{Q.removeEventListener("change",a)}catch{}if(this.controls&&typeof this.controls.addEventListener=="function")try{this.controls.addEventListener("change",a)}catch{}n[C]=this.controls||null},"rebindCameraChange"),s=this._componentTransformSession;s?.controls&&(i(s.controls,s.globalState?.updateForCamera||null),o(s,"cameraChangeHandler","cameraChangeSource"));const I=AE?.getActiveTransformState?.()||AE?.__activeXform||null;I?.viewer===this&&I.controls&&(i(I.controls,I.controlsChangeHandler||null),o(I,"controlsChangeHandler","controlsChangeSource"));try{const n=typeof window<"u"?window.__BREP_activeXform:null;n?.viewer===this&&n.controls&&i(n.controls,n.updateForCamera||null)}catch{}}_refreshCameraProjectionToggleButton(){const A=this._cameraProjectionToggleButton;if(!A||!this.camera)return;const e=!!this.camera.isOrthographicCamera;A.textContent=e?"ORTHO":"PERSP",A.classList.toggle("is-perspective",!e),A.title=e?"Switch to perspective camera":"Switch to orthographic camera",A.setAttribute("aria-label",A.title)}_positionCameraProjectionToggle(){const A=this._cameraProjectionToggleButton;if(!A)return;if(!this.viewCube||this._rendererMode!=="webgl"){A.style.display="none";return}const e=this.viewCube?._viewportRect?.();if(!e){A.style.display="none";return}A.style.display="";const t=Math.max(10,Math.round(e.xCss-10)),i=Math.round(e.yCss+e.h-8);A.style.left=`${t}px`,A.style.top=`${i}px`}_ensureCameraProjectionToggle(){if(!(!this.container||typeof document>"u")){if(!this._cameraProjectionToggleButton){syi();const A=document.createElement("button");A.type="button",A.className="viewcube-camera-toggle",A.addEventListener("click",this._onCameraProjectionToggleClick),A.addEventListener("pointerdown",e=>{try{e.stopPropagation()}catch{}});try{window.getComputedStyle(this.container)?.position==="static"&&(this.container.style.position="relative")}catch{}this.container.appendChild(A),this._cameraProjectionToggleButton=A}this._refreshCameraProjectionToggleButton(),this._positionCameraProjectionToggle()}}setCameraProjection(A="orthographic"){if(!this.camera)return!1;const e=String(A||"").toLowerCase().startsWith("pers")?"perspective":"orthographic";if(e==="perspective"?this.camera.isPerspectiveCamera:this.camera.isOrthographicCamera)return this._refreshCameraProjectionToggleButton(),this._positionCameraProjectionToggle(),!0;const t=this.camera,i=this.controls?.target?.clone?.()||new j(0,0,0),{width:o,height:s}=this._getContainerSize(),I=Math.max(1e-6,o/Math.max(1,s));let n=null;if(e==="perspective"){const C=Number.isFinite(this._perspectiveFov)?this._perspectiveFov:50,a=Math.max(1e-4,Number(this._defaultPerspectiveNear)||.01),Q=Math.max(100,Number(t.far)||Math.abs(this._defaultFar)||1e6);n=new yC(C,I,a,Q);let E=t.position.distanceTo(i);if(t.isOrthographicCamera){const h=typeof t.zoom=="number"&&t.zoom>0?t.zoom:1,w=Math.abs((Number(t.top)-Number(t.bottom))/h),d=Math.tan(Nt.degToRad(C)*.5);Number.isFinite(w)&&w>1e-6&&Number.isFinite(d)&&d>1e-6&&(E=w*.5/d)}(!Number.isFinite(E)||E<1e-4)&&(E=10);const l=t.position.clone().sub(i);if(l.lengthSq()<1e-12)try{t.getWorldDirection(l),l.multiplyScalar(-1)}catch{l.set(1,1,1)}l.normalize(),n.position.copy(i).addScaledVector(l,E),n.up.copy(t.up),n.lookAt(i),n.zoom=typeof t.zoom=="number"&&t.zoom>0?t.zoom:1,this._perspectiveFov=C}else{let C=this.viewSize*2;if(t.isPerspectiveCamera){const E=Math.max(1e-6,t.position.distanceTo(i)),l=Nt.degToRad(Number(t.fov)||50),h=typeof t.zoom=="number"&&t.zoom>0?t.zoom:1,w=2*Math.tan(l*.5)*E/h;Number.isFinite(w)&&w>1e-6&&(C=w),this._perspectiveFov=Number.isFinite(t.fov)?t.fov:this._perspectiveFov}else if(t.isOrthographicCamera){const E=typeof t.zoom=="number"&&t.zoom>0?t.zoom:1,l=Math.abs((Number(t.top)-Number(t.bottom))/E);Number.isFinite(l)&&l>1e-6&&(C=l)}const a=Math.max(1e-6,C*.5),Q=a*I;n=new PVe(-Q,Q,a,-a,this._defaultNear,this._defaultFar),n.zoom=1,this.viewSize=a,n.position.copy(t.position),n.quaternion.copy(t.quaternion),n.up.copy(t.up)}if(!n)return!1;try{t.disableIdleCallbacks?.()}catch{}const B=Array.isArray(t.children)?t.children.filter(C=>C?.isLight):[];for(const C of B){try{t.remove(C)}catch{}try{n.add(C)}catch{}}try{n.userData={...t.userData||{},preventRemove:!0}}catch{}try{this.scene.add(n)}catch{}try{this.scene.remove(t)}catch{}this.camera=n;try{this.partHistory.camera=n}catch{}this._rebuildControls(this.renderer.domElement);try{this.controls?.addEventListener?.("change",this._onControlsChange)}catch{}try{this.controls?.target?.copy?.(i)}catch{}return this._configureCameraIdleCallbacks(),this._syncActiveTransformGizmosForCamera({resetSize:!0}),this.viewCube&&(this.viewCube.targetCamera=this.camera,this.viewCube.controls=this.controls),this._resizeRendererToDisplaySize(),this._updateDepthRange(),this._refreshCameraProjectionToggleButton(),this._positionCameraProjectionToggle(),this.render(),!0}toggleCameraProjection(){const A=this.camera?.isOrthographicCamera?"perspective":"orthographic";return this.setCameraProjection(A)}_ensureViewCube(){if(this.viewCube&&this.viewCube.renderer===this.renderer){this.viewCube.targetCamera=this.camera,this.viewCube.controls=this.controls,this._ensureCameraProjectionToggle();return}try{this.viewCube?.dispose?.()}catch{}this.viewCube=new cfg({renderer:this.renderer,targetCamera:this.camera,controls:this.controls,size:110,margin:25}),this._ensureCameraProjectionToggle()}setRendererMode(A){const e=A==="svg"?"svg":"webgl";if(e===this._rendererMode&&this.renderer)return;this._rendererMode=e;try{this._stopComponentTransformSession?.()}catch{}const t=this.renderer?.domElement;this._detachRendererEvents(t),t&&t.parentNode&&t.parentNode.removeChild(t);let i=null;e==="svg"?(this._svgRenderer||(this._svgRenderer=this._createSvgRenderer()),i=this._svgRenderer):(this._webglRenderer||(this._webglRenderer=this._createWebGLRenderer()),i=this._webglRenderer),this.renderer=i,this._applyRendererElementStyles(this.renderer),this.container.appendChild(this.renderer.domElement),this._attachRendererEvents(this.renderer.domElement),this._rebuildControls(this.renderer.domElement);try{this.controls?.addEventListener?.("change",this._onControlsChange)}catch{}if(this._configureCameraIdleCallbacks(),this._syncActiveTransformGizmosForCamera({resetSize:!1}),e==="webgl")this._ensureWebglPostProcessing(),this._ensureViewCube();else{try{this.viewCube?.dispose?.()}catch{}this.viewCube=null,this._positionCameraProjectionToggle()}try{this.renderer.domElement.style.marginTop="0px"}catch{}this._resizeRendererToDisplaySize(),this.render()}_setSidebarAutoHideSuspended(A){const e=!!A;this._sidebarAutoHideSuspended!==e&&(this._sidebarAutoHideSuspended=e,this._syncSidebarVisibility())}_setSidebarPinned(A){const e=!!A;this._sidebarPinned!==e&&(this._sidebarPinned=e,!e&&this._sidebarAutoHideSuspended&&(this._sidebarAutoHideSuspended=!1),e?this._sidebarHoverVisible=!1:(this._sidebarHoverTargets&&this._sidebarHoverTargets.clear(),this._sidebarHoverVisible=!1),this._syncSidebarVisibility())}_setSidebarHoverVisible(A){const e=!!A;this._sidebarHoverVisible!==e&&(this._sidebarHoverVisible=e,this._syncSidebarVisibility())}_refreshSidebarHoverTargetsFromPointer(){const A=this._sidebarHoverTargets,e=this._sidebarLastPointer;if(!A||!e)return;A.clear();const{x:t,y:i}=e,o=r((s,I=!1)=>{if(!s||I&&!this._isSidebarVisible())return;const n=s.getBoundingClientRect?s.getBoundingClientRect():null;!n||n.width<=0||n.height<=0||t>=n.left&&t<=n.right&&i>=n.top&&i<=n.bottom&&A.add(s)},"addIfHit");o(this._sidebarHoverStrip),o(this._sidebarPinTab,!0),o(this.sidebar,!0),o(this._sidebarResizer,!0)}_getSidebarShouldShow(){return this.sidebar?this._sidebarAutoHideSuspended||this._sidebarPinned?!0:!!this._sidebarHoverVisible:!1}_isSidebarVisible(){return this.sidebar?!this._sidebarOffscreen&&!this.sidebar.hidden&&this.sidebar.style.display!=="none"&&this.sidebar.style.visibility!=="hidden":!1}_setSidebarElementVisible(A){if(!this.sidebar)return;const e=this._isSidebarVisible();try{this.sidebar.hidden&&(this.sidebar.hidden=!1)}catch{}if(this.sidebar.style.display==="none")if(this._sidebarStoredDisplay!=null)this.sidebar.style.display=this._sidebarStoredDisplay;else{try{this.sidebar.style.removeProperty("display")}catch{}this.sidebar.style.display=this.sidebar.style.display||""}if(this.sidebar.style.visibility==="hidden"){const t=this._sidebarStoredVisibility;this.sidebar.style.visibility=t&&t!=="hidden"?t:"visible"}if(A){if(!e){if(this._sidebarStoredTransform!=null)this.sidebar.style.transform=this._sidebarStoredTransform;else{try{this.sidebar.style.removeProperty("transform")}catch{}this.sidebar.style.transform=this.sidebar.style.transform||""}if(this._sidebarStoredPointerEvents!=null)this.sidebar.style.pointerEvents=this._sidebarStoredPointerEvents;else{try{this.sidebar.style.removeProperty("pointer-events")}catch{}this.sidebar.style.pointerEvents=this.sidebar.style.pointerEvents||""}}this.sidebar.style.opacity=.9,this.sidebar.style.zIndex=String(7),this._sidebarOffscreen=!1}else this._sidebarOffscreen||(this._sidebarStoredDisplay=this.sidebar.style.display||"",this._sidebarStoredVisibility=this.sidebar.style.visibility||"",this._sidebarStoredTransform=this.sidebar.style.transform||"",this._sidebarStoredPointerEvents=this.sidebar.style.pointerEvents||""),this.sidebar.style.transform="translateX(calc(-100% - 12px))",this.sidebar.style.pointerEvents="none",this._sidebarOffscreen=!0;try{this.mainToolbar?._positionWithSidebar?.()}catch{}}_updateSidebarDockUI(){const A=this._sidebarPinTab,e=this._sidebarHoverStrip,t=!!this._sidebarPinned,i=!t&&!this._sidebarAutoHideSuspended;A&&(A.classList.toggle("is-pinned",t),A.setAttribute("aria-pressed",t?"true":"false"),A.textContent="📌",A.title=t?"Collapse sidebar":"Pin sidebar"),e&&(e.classList.toggle("is-active",i),e.style.pointerEvents=i?"auto":"none"),this._positionSidebarPinTab()}_positionSidebarPinTab(){const A=this._sidebarPinTab;if(!A)return;let e=0,t=72;const i=this.sidebar?.getBoundingClientRect?.();if(i&&i.width>0&&(e=Math.max(0,Math.round(i.right-1))),i&&i.height>0){const o=A.getBoundingClientRect?A.getBoundingClientRect().height:A.offsetHeight,s=i.top+(i.height-(o||0))/2;Number.isFinite(s)&&(t=Math.max(0,Math.round(s)))}A.style.left=`${e}px`,A.style.top=`${t}px`}_syncSidebarVisibility(){const A=this._getSidebarShouldShow();this._setSidebarElementVisible(A),this._updateSidebarDockUI()}_syncSidebarHomeBannerHeight(){const A=this._sidebarHomeBanner;if(!A)return;const e=`${hfg}px`;A.style.height=e,A.style.minHeight=e,A.style.maxHeight=e}_bindSidebarHomeBannerHeightSync(){try{this._sidebarHomeBannerRO?.disconnect?.()}catch{}this._sidebarHomeBannerRO=null}_ensureSidebarHomeBanner(){if(!this.sidebar||typeof document>"u")return;const A=!!this._homeBannerUrl;let e=this._sidebarHomeBanner;if(!e||!e.isConnected){try{const o=this.sidebar.querySelector(".cad-sidebar-home-banner");o&&o.parentNode&&o.parentNode.removeChild(o)}catch{}e=document.createElement("button"),e.type="button",e.className="cad-sidebar-home-banner",e.title=A?"Open BREP.io":"Back to workspace",e.setAttribute("aria-label",A?"Open BREP.io":"Back to workspace"),e.addEventListener("click",o=>{if(o.preventDefault(),o.stopPropagation(),this._homeBannerUrl){try{const s=this._homeBannerOpenInNewTab?"_blank":"_self",I=window.open(this._homeBannerUrl,s,this._homeBannerOpenInNewTab?"noopener,noreferrer":"noopener");if(I&&this._homeBannerOpenInNewTab)try{I.opener=null}catch{}}catch{try{window.location.href=this._homeBannerUrl}catch{}}return}sLe(this)});const t=document.createElement("span");t.className="cad-sidebar-home-banner-img",t.setAttribute("aria-hidden","true"),t.innerHTML=x8i;const i=t.querySelector("svg");i&&i.setAttribute("focusable","false"),e.appendChild(t),this.sidebar.prepend(e),this._sidebarHomeBanner=e}else e.parentNode!==this.sidebar&&this.sidebar.prepend(e);this._syncSidebarHomeBannerHeight()}async setupAccordion(){if((!this._viewerOnlyMode||this._homeBannerUrl)&&this._ensureSidebarHomeBanner(),this.accordion=await new NGt,await this.sidebar.appendChild(this.accordion.uiElement),!this._viewerOnlyMode)try{await TRt(this)}catch(B){console.warn("Plugin auto-load failed:",B)}const A=new zqi(this,{autoLoadLast:this._autoLoadLastModel});if(this.fileManagerWidget=A,this.partHistory.callbacks.run=async B=>{},this.partHistory.callbacks.reset=async()=>{},this.partHistory.callbacks.afterRunHistory=()=>{this._refreshAssemblyConstraintsPanelVisibility(),this.refreshWorkbenchUi(),this.applyMetadataColors(),this._axisHelpersDirty=!0,this._syncWireHarnessRoutesFromHistoryState({reason:"after-run-history"})},this.partHistory.callbacks.afterReset=()=>{this._refreshAssemblyConstraintsPanelVisibility(),this.refreshWorkbenchUi(),this.applyMetadataColors(),this._axisHelpersDirty=!0,this.clearWireHarnessRoutes({reason:"after-reset"})},this._viewerOnlyMode){this.sceneManagerUi=await new CWe(this.scene,{onSelection:r(B=>this._applySelectionTarget(B,{triggerOnClick:!1,allowDiagnostics:!1}),"onSelection"),onRender:r(()=>this.render(),"onRender")}),await(await this.accordion.addSection("Scene Manager")).uiElement.appendChild(this.sceneManagerUi.uiElement),this.pmiViewsWidget=new iv(this,{readOnly:!0}),(await this.accordion.addSection("PMI Views")).uiElement.appendChild(this.pmiViewsWidget.uiElement),this.sheet2DWidget=new aWe(this,{readOnly:!0}),(await this.accordion.addSection("2D Sheets")).uiElement.appendChild(this.sheet2DWidget.uiElement),this.cadMaterialsUi=await new w4e(this),await(await this.accordion.addSection("Display Settings")).uiElement.appendChild(this.cadMaterialsUi.uiElement),this._pluginUiReady=!1,await this.accordion.collapseAll(),await this.accordion.expandSection("Scene Manager"),await this.accordion.expandSection("PMI Views"),await this.accordion.expandSection("2D Sheets"),this._refreshAssemblyConstraintsPanelVisibility(),this._syncSidebarHomeBannerHeight(),this._bindSidebarHomeBannerHeightSync();try{this.renderer.domElement.style.marginTop="0px"}catch{}return}this.historyWidget=await new I5i(this),await(await this.accordion.addSection("History")).uiElement.appendChild(await this.historyWidget.uiElement),this.assemblyConstraintsWidget=new O8i(this),this._assemblyConstraintsSection=await this.accordion.addSection(sb),this._assemblyConstraintsSection.uiElement.appendChild(this.assemblyConstraintsWidget.uiElement),this._registerWorkbenchPanel({id:"assemblyConstraints",title:sb,section:this._assemblyConstraintsSection,source:"builtin"}),this.expressionsManager=await new V8i(this),await(await this.accordion.addSection("Expressions")).uiElement.appendChild(await this.expressionsManager.uiElement),this.sceneManagerUi=await new CWe(this.scene,{onSelection:r(B=>this._applySelectionTarget(B,{triggerOnClick:!1,allowDiagnostics:!1}),"onSelection"),onRender:r(()=>this.render(),"onRender")}),await(await this.accordion.addSection("Scene Manager")).uiElement.appendChild(this.sceneManagerUi.uiElement),this.pmiViewsWidget=new iv(this);const e=await this.accordion.addSection("PMI Views");e.uiElement.appendChild(this.pmiViewsWidget.uiElement),this._registerWorkbenchPanel({id:"pmiViews",title:"PMI Views",section:e,source:"builtin",workbenches:["MODELING","IMPORT","SURFACING","SHEET_METAL","ASSEMBLIES","WIRE_HARNESS","PMI","ALL"]}),this.sheet2DWidget=new aWe(this);const t=await this.accordion.addSection("2D Sheets");t.uiElement.appendChild(this.sheet2DWidget.uiElement),this._registerWorkbenchPanel({id:"sheets2D",title:"2D Sheets",section:t,source:"builtin",workbenches:["MODELING","IMPORT","SURFACING","SHEET_METAL","ASSEMBLIES","WIRE_HARNESS","PMI","ALL"]}),this.wireHarnessConnectionsWidget=new lfg(this);const i=await this.accordion.addSection("Wire Harness");i.uiElement.appendChild(this.wireHarnessConnectionsWidget.uiElement),this._registerWorkbenchPanel({id:"wireHarnessConnections",title:"Wire Harness",section:i,source:"builtin"}),this.simulationHistoryWidget=new L5i(this);const o=await this.accordion.addSection("Simulation");o.uiElement.appendChild(this.simulationHistoryWidget.uiElement),this._registerWorkbenchPanel({id:"simulationHistory",title:"Simulation",section:o,source:"builtin",workbenches:["SIMULATION"]}),this.cadMaterialsUi=await new w4e(this);const s=await this.accordion.addSection("Display Settings");await s.uiElement.appendChild(this.cadMaterialsUi.uiElement),this._registerWorkbenchPanel({id:"displaySettings",title:"Display Settings",section:s,source:"builtin",workbenches:["MODELING","IMPORT","SURFACING","SHEET_METAL","ASSEMBLIES","WIRE_HARNESS","PMI","ALL"]}),this._pluginUiReady=!0;try{const B=Array.isArray(this._pendingSidePanels)?this._pendingSidePanels:[];this._pendingSidePanels=[];for(const C of B)try{await this._applyPluginSidePanel(C)}catch{}}catch{}const I=await this.accordion.addSection("Plugins"),n=new r5i(this);I.uiElement.appendChild(n.uiElement),this._registerWorkbenchPanel({id:"plugins",title:"Plugins",section:I,source:"builtin",workbenches:["MODELING","IMPORT","SURFACING","SHEET_METAL","ASSEMBLIES","WIRE_HARNESS","PMI","ALL"]}),await this.accordion.collapseAll(),await this.accordion.expandSection("Scene Manager"),await this.accordion.expandSection("History"),this._getActiveWorkbenchId()==="ASSEMBLIES"&&await this.accordion.expandSection(sb),await this.accordion.expandSection("PMI Views"),this._refreshAssemblyConstraintsPanelVisibility(),this._refreshWorkbenchPanelVisibility(),this.mainToolbar=new fGt(this);try{uMi(this)}catch{}try{JMi(this)}catch{}try{tt.refreshSelectionActions?.()}catch{}try{const B=Array.isArray(this._pendingToolbarButtons)?this._pendingToolbarButtons:[];this._pendingToolbarButtons=[];for(const C of B)try{this.mainToolbar.addCustomButton(C)}catch{}}catch{}try{this.refreshWorkbenchUi()}catch{}this.clearWireHarnessRoutes({reason:"setup-accordion"}),this._syncSidebarHomeBannerHeight(),this._bindSidebarHomeBannerHeightSync();try{this.renderer.domElement.style.marginTop="0px"}catch{}try{await zxt(this)}catch{}}_getActiveWorkbenchId(){return hRe(this.partHistory)}setActiveWorkbench(A,e={}){const t=this._getActiveWorkbenchId(),i=DQt(this.partHistory,hE(A,t));if(t===i)return!1;if(i==="SIMULATION")try{tt.SetSelectionTypes([tt.SOLID])}catch{}return i!=="PMI"&&(this._workbenchReturnTarget=null),this.refreshWorkbenchUi(),e.queueHistorySnapshot!==!1&&this.partHistory?.queueHistorySnapshot?.({debounceMs:0,reason:"workbench"}),!0}_setWorkbenchReturnTarget(A=null){this._workbenchReturnTarget=A?hE(A,null):null}_restoreWorkbenchAfterPMI(){if(this._suspendWorkbenchReturn)return!1;const A=this._workbenchReturnTarget;return this._workbenchReturnTarget=null,A?this.setActiveWorkbench(A,{queueHistorySnapshot:!0}):!1}async _ensureSimulationWorkbenchManager(){return this.simulationWorkbenchManager?this.simulationWorkbenchManager:this._simulationWorkbenchManagerPromise?this._simulationWorkbenchManagerPromise:(this._simulationWorkbenchManagerPromise=(async()=>{try{const A=new URL("data:text/javascript;base64,aW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnOwppbXBvcnQgeyBDb21iaW5lZFRyYW5zZm9ybUNvbnRyb2xzIH0gZnJvbSAnLi4vVUkvY29udHJvbHMvQ29tYmluZWRUcmFuc2Zvcm1Db250cm9scy5qcyc7Cgpjb25zdCBGSVhFRF9NRVRBREFUQV9LRVkgPSAnZml4ZWQnOwpjb25zdCBUUkFOU0ZPUk1fTUVUQURBVEFfS0VZID0gJ3NpbXVsYXRpb25UcmFuc2Zvcm0nOwpjb25zdCBTSU1fUFJPWFlfUFJFRklYID0gJ19fU0lNX1BST1hZX18nOwpjb25zdCBWSEFDRF9PUFRJT05TID0gT2JqZWN0LmZyZWV6ZSh7CiAgbWF4SHVsbHM6IDY0LAogIHZveGVsUmVzb2x1dGlvbjogMTAwMDAwMCwKICBtYXhWZXJ0aWNlc1Blckh1bGw6IDY0LAogIHNocmlua1dyYXA6IHRydWUsCiAgZmlsbE1vZGU6ICdmbG9vZCcsCiAgZmluZEJlc3RQbGFuZTogdHJ1ZSwKICBtaW5FZGdlTGVuZ3RoOiAxLAogIG1lc3NhZ2VzOiAnbm9uZScsCn0pOwpjb25zdCBERUZBVUxUX1RSQU5TRk9STSA9IE9iamVjdC5mcmVlemUoewogIHBvc2l0aW9uOiBbMCwgMCwgMF0sCiAgcm90YXRpb25FdWxlcjogWzAsIDAsIDBdLAp9KTsKCmZ1bmN0aW9uIGNsb25lVmVjMyh2YWx1ZSwgZmFsbGJhY2sgPSBbMCwgMCwgMF0pIHsKICBjb25zdCBzcmMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogZmFsbGJhY2s7CiAgcmV0dXJuIFsKICAgIE51bWJlci5pc0Zpbml0ZShOdW1iZXIoc3JjWzBdKSkgPyBOdW1iZXIoc3JjWzBdKSA6IGZhbGxiYWNrWzBdLAogICAgTnVtYmVyLmlzRmluaXRlKE51bWJlcihzcmNbMV0pKSA/IE51bWJlcihzcmNbMV0pIDogZmFsbGJhY2tbMV0sCiAgICBOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHNyY1syXSkpID8gTnVtYmVyKHNyY1syXSkgOiBmYWxsYmFja1syXSwKICBdOwp9CgpmdW5jdGlvbiBub3JtYWxpemVUZXh0KHZhbHVlLCBmYWxsYmFjayA9ICcnKSB7CiAgY29uc3QgbmV4dCA9IFN0cmluZyh2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZSkudHJpbSgpOwogIHJldHVybiBuZXh0IHx8IGZhbGxiYWNrOwp9CgpmdW5jdGlvbiBub3JtYWxpemVPcHRpb25hbE1vdGlvbkxpbWl0KHZhbHVlKSB7CiAgY29uc3QgbnVtZXJpYyA9IE51bWJlcih2YWx1ZSk7CiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykpIHJldHVybiBudWxsOwogIHJldHVybiBNYXRoLmFicyhudW1lcmljKSA8PSAxZS05ID8gbnVsbCA6IG51bWVyaWM7Cn0KCmZ1bmN0aW9uIG5vcm1hbGl6ZVRyYW5zZm9ybSh2YWx1ZSkgewogIGNvbnN0IHJhdyA9IHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZSA6IHt9OwogIHJldHVybiB7CiAgICBwb3NpdGlvbjogY2xvbmVWZWMzKHJhdy5wb3NpdGlvbiwgREVGQVVMVF9UUkFOU0ZPUk0ucG9zaXRpb24pLAogICAgcm90YXRpb25FdWxlcjogY2xvbmVWZWMzKHJhdy5yb3RhdGlvbkV1bGVyLCBERUZBVUxUX1RSQU5TRk9STS5yb3RhdGlvbkV1bGVyKSwKICB9Owp9CgpmdW5jdGlvbiB0cmFuc2Zvcm1Jc0lkZW50aXR5KHRyYW5zZm9ybSkgewogIGNvbnN0IHBvc2l0aW9uID0gY2xvbmVWZWMzKHRyYW5zZm9ybT8ucG9zaXRpb24sIERFRkFVTFRfVFJBTlNGT1JNLnBvc2l0aW9uKTsKICBjb25zdCByb3RhdGlvbkV1bGVyID0gY2xvbmVWZWMzKHRyYW5zZm9ybT8ucm90YXRpb25FdWxlciwgREVGQVVMVF9UUkFOU0ZPUk0ucm90YXRpb25FdWxlcik7CiAgcmV0dXJuIHBvc2l0aW9uLmV2ZXJ5KCh2YWx1ZSkgPT4gTWF0aC5hYnModmFsdWUpIDw9IDFlLTkpCiAgICAmJiByb3RhdGlvbkV1bGVyLmV2ZXJ5KCh2YWx1ZSkgPT4gTWF0aC5hYnModmFsdWUpIDw9IDFlLTkpOwp9CgpmdW5jdGlvbiBjb3B5TG9jYWxQb3NlKG9iamVjdCkgewogIHJldHVybiB7CiAgICBwb3NpdGlvbjogb2JqZWN0LnBvc2l0aW9uLmNsb25lKCksCiAgICBxdWF0ZXJuaW9uOiBvYmplY3QucXVhdGVybmlvbi5jbG9uZSgpLAogICAgc2NhbGU6IG9iamVjdC5zY2FsZS5jbG9uZSgpLAogIH07Cn0KCmZ1bmN0aW9uIGJ1aWxkTG9jYWxNYXRyaXgocG9zZSkgewogIHJldHVybiBuZXcgVEhSRUUuTWF0cml4NCgpLmNvbXBvc2UoCiAgICBwb3NlLnBvc2l0aW9uLmNsb25lKCksCiAgICBwb3NlLnF1YXRlcm5pb24uY2xvbmUoKSwKICAgIHBvc2Uuc2NhbGUuY2xvbmUoKSwKICApOwp9CgpmdW5jdGlvbiBwb3NlVG9PZmZzZXQoYmFzZVBvc2UsIGN1cnJlbnRPYmplY3QpIHsKICBjb25zdCBiYXNlTWF0cml4ID0gYnVpbGRMb2NhbE1hdHJpeChiYXNlUG9zZSk7CiAgY29uc3QgY3VycmVudE1hdHJpeCA9IG5ldyBUSFJFRS5NYXRyaXg0KCkuY29tcG9zZSgKICAgIGN1cnJlbnRPYmplY3QucG9zaXRpb24uY2xvbmUoKSwKICAgIGN1cnJlbnRPYmplY3QucXVhdGVybmlvbi5jbG9uZSgpLAogICAgY3VycmVudE9iamVjdC5zY2FsZS5jbG9uZSgpLAogICk7CiAgY29uc3QgcmVsYXRpdmUgPSBuZXcgVEhSRUUuTWF0cml4NCgpLmNvcHkoYmFzZU1hdHJpeCkuaW52ZXJ0KCkubXVsdGlwbHkoY3VycmVudE1hdHJpeCk7CiAgY29uc3QgcG9zaXRpb24gPSBuZXcgVEhSRUUuVmVjdG9yMygpOwogIGNvbnN0IHF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpOwogIGNvbnN0IHNjYWxlID0gbmV3IFRIUkVFLlZlY3RvcjMoKTsKICByZWxhdGl2ZS5kZWNvbXBvc2UocG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlKTsKICBjb25zdCByb3RhdGlvbkV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKCkuc2V0RnJvbVF1YXRlcm5pb24ocXVhdGVybmlvbiwgJ1hZWicpOwogIHJldHVybiB7CiAgICBwb3NpdGlvbjogW3Bvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnpdLAogICAgcm90YXRpb25FdWxlcjogW3JvdGF0aW9uRXVsZXIueCwgcm90YXRpb25FdWxlci55LCByb3RhdGlvbkV1bGVyLnpdLAogIH07Cn0KCmZ1bmN0aW9uIG5vcm1hbGl6ZU1lc2hBcnJheXMobWVzaCkgewogIGlmICghbWVzaCkgcmV0dXJuIG51bGw7CiAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMywgTnVtYmVyKG1lc2gubnVtUHJvcCkgfHwgMyk7CiAgY29uc3Qgc291cmNlUG9zaXRpb25zID0gQXJyYXkuaXNBcnJheShtZXNoLnZlcnRQcm9wZXJ0aWVzKSA/IG1lc2gudmVydFByb3BlcnRpZXMgOiBBcnJheS5mcm9tKG1lc2gudmVydFByb3BlcnRpZXMgfHwgW10pOwogIGNvbnN0IHNvdXJjZUluZGljZXMgPSBBcnJheS5pc0FycmF5KG1lc2gudHJpVmVydHMpID8gbWVzaC50cmlWZXJ0cyA6IEFycmF5LmZyb20obWVzaC50cmlWZXJ0cyB8fCBbXSk7CiAgaWYgKHNvdXJjZVBvc2l0aW9ucy5sZW5ndGggPCA5IHx8IHNvdXJjZUluZGljZXMubGVuZ3RoIDwgMykgcmV0dXJuIG51bGw7CiAgY29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0NjRBcnJheSgoc291cmNlUG9zaXRpb25zLmxlbmd0aCAvIHN0cmlkZSkgKiAzKTsKICBmb3IgKGxldCBzcmMgPSAwLCBkc3QgPSAwOyBzcmMgKyAyIDwgc291cmNlUG9zaXRpb25zLmxlbmd0aDsgc3JjICs9IHN0cmlkZSwgZHN0ICs9IDMpIHsKICAgIHBvc2l0aW9uc1tkc3QgKyAwXSA9IE51bWJlcihzb3VyY2VQb3NpdGlvbnNbc3JjICsgMF0pIHx8IDA7CiAgICBwb3NpdGlvbnNbZHN0ICsgMV0gPSBOdW1iZXIoc291cmNlUG9zaXRpb25zW3NyYyArIDFdKSB8fCAwOwogICAgcG9zaXRpb25zW2RzdCArIDJdID0gTnVtYmVyKHNvdXJjZVBvc2l0aW9uc1tzcmMgKyAyXSkgfHwgMDsKICB9CiAgcmV0dXJuIHsKICAgIHBvc2l0aW9ucywKICAgIGluZGljZXM6IG5ldyBVaW50MzJBcnJheShzb3VyY2VJbmRpY2VzKSwKICB9Owp9CgpmdW5jdGlvbiBidWlsZFByb3h5TWF0ZXJpYWwoYmFzZUNvbG9yLCBpbmRleCwgdG90YWwpIHsKICBjb25zdCBjb2xvciA9IG5ldyBUSFJFRS5Db2xvcihiYXNlQ29sb3IgfHwgJyM5Y2EzYWYnKTsKICBjb25zdCBoc2wgPSB7IGg6IDAsIHM6IDAsIGw6IDAgfTsKICBjb2xvci5nZXRIU0woaHNsKTsKICBjb25zdCBvZmZzZXQgPSB0b3RhbCA+IDEgPyAoaW5kZXggLyBNYXRoLm1heCgxLCB0b3RhbCkpICogMC4xOCA6IDA7CiAgY29sb3Iuc2V0SFNMKChoc2wuaCArIG9mZnNldCkgJSAxLCBNYXRoLm1pbigxLCBNYXRoLm1heCgwLjM1LCBoc2wucyB8fCAwLjU1KSksIE1hdGgubWluKDAuNzIsIE1hdGgubWF4KDAuNDIsIGhzbC5sKSkpOwogIHJldHVybiBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoewogICAgY29sb3IsCiAgICB0cmFuc3BhcmVudDogdHJ1ZSwKICAgIG9wYWNpdHk6IDAuNTUsCiAgICByb3VnaG5lc3M6IDAuNTUsCiAgICBtZXRhbG5lc3M6IDAuMDUsCiAgICBkZXB0aFdyaXRlOiB0cnVlLAogIH0pOwp9CgpmdW5jdGlvbiBkaXNwb3NlSGllcmFyY2h5KHJvb3QpIHsKICBpZiAoIXJvb3Q/LnRyYXZlcnNlKSByZXR1cm47CiAgcm9vdC50cmF2ZXJzZSgobm9kZSkgPT4gewogICAgaWYgKG5vZGU/Lmdlb21ldHJ5Py5kaXNwb3NlKSB7CiAgICAgIHRyeSB7IG5vZGUuZ2VvbWV0cnkuZGlzcG9zZSgpOyB9IGNhdGNoIHt9CiAgICB9CiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlPy5tYXRlcmlhbCkpIHsKICAgICAgZm9yIChjb25zdCBtYXRlcmlhbCBvZiBub2RlLm1hdGVyaWFsKSB7CiAgICAgICAgdHJ5IHsgbWF0ZXJpYWw/LmRpc3Bvc2U/LigpOyB9IGNhdGNoIHt9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHRyeSB7IG5vZGU/Lm1hdGVyaWFsPy5kaXNwb3NlPy4oKTsgfSBjYXRjaCB7fQogICAgfQogIH0pOwp9CgpleHBvcnQgY2xhc3MgU2ltdWxhdGlvbldvcmtiZW5jaE1hbmFnZXIgewogIGNvbnN0cnVjdG9yKHZpZXdlcikgewogICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXIgfHwgbnVsbDsKICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlOwogICAgdGhpcy5fYmFzZUxvY2FsUG9zZSA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX3J1bnRpbWVTdGF0ZSA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX3NvdXJjZVZpc2liaWxpdHkgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9kZWNvbXBvc2l0aW9uQ2FjaGUgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9wcm94eUdyb3VwcyA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX3RyYW5zZm9ybVNlc3Npb24gPSBudWxsOwogICAgdGhpcy5fcmFwaWVyID0gbnVsbDsKICAgIHRoaXMuX3JhcGllckxvYWRQcm9taXNlID0gbnVsbDsKICAgIHRoaXMuX3ZoYWNkID0gbnVsbDsKICAgIHRoaXMuX3ZoYWNkTG9hZFByb21pc2UgPSBudWxsOwogICAgdGhpcy5fcGh5c2ljc1dvcmxkID0gbnVsbDsKICAgIHRoaXMuX2JvZHlTdGF0ZSA9IG5ldyBNYXAoKTsKICAgIHRoaXMuX2xpc3RlbmVycyA9IG5ldyBTZXQoKTsKICAgIHRoaXMuX3JlbW92ZVN0YXRlTWFuYWdlckxpc3RlbmVyID0gbnVsbDsKICAgIHRoaXMuX2lzUGxheWluZyA9IGZhbHNlOwogICAgdGhpcy5fbW90aW9uU3RhdGUgPSBuZXcgTWFwKCk7CiAgICB0aGlzLl9tb3ZlZFNvbGlkSWRzID0gbmV3IFNldCgpOwogICAgdGhpcy5fcmFmID0gMDsKICAgIHRoaXMuX2xhc3RTdGVwVGltZSA9IDA7CiAgICB0aGlzLl9zY3JhdGNoID0gewogICAgICBwYXJlbnRJbnZlcnNlOiBuZXcgVEhSRUUuTWF0cml4NCgpLAogICAgICBwYXJlbnRXb3JsZE1hdHJpeDogbmV3IFRIUkVFLk1hdHJpeDQoKSwKICAgICAgbG9jYWxNYXRyaXg6IG5ldyBUSFJFRS5NYXRyaXg0KCksCiAgICAgIHdvcmxkTWF0cml4OiBuZXcgVEhSRUUuTWF0cml4NCgpLAogICAgICBkZWx0YU1hdHJpeDogbmV3IFRIUkVFLk1hdHJpeDQoKSwKICAgICAgd29ybGRQb3NpdGlvbjogbmV3IFRIUkVFLlZlY3RvcjMoKSwKICAgICAgbG9jYWxQb3NpdGlvbjogbmV3IFRIUkVFLlZlY3RvcjMoKSwKICAgICAgd29ybGRRdWF0ZXJuaW9uOiBuZXcgVEhSRUUuUXVhdGVybmlvbigpLAogICAgICBwYXJlbnRRdWF0ZXJuaW9uOiBuZXcgVEhSRUUuUXVhdGVybmlvbigpLAogICAgICBwYXJlbnRRdWF0ZXJuaW9uSW52ZXJzZTogbmV3IFRIUkVFLlF1YXRlcm5pb24oKSwKICAgICAgYm94OiBuZXcgVEhSRUUuQm94MygpLAogICAgICBjZW50ZXI6IG5ldyBUSFJFRS5WZWN0b3IzKCksCiAgICAgIGF4aXM6IG5ldyBUSFJFRS5WZWN0b3IzKCksCiAgICAgIHRyYW5zbGF0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMygpLAogICAgICB2ZWxvY2l0eTogbmV3IFRIUkVFLlZlY3RvcjMoKSwKICAgICAgYW5ndWxhclZlbG9jaXR5OiBuZXcgVEhSRUUuVmVjdG9yMygpLAogICAgICByYWRpdXM6IG5ldyBUSFJFRS5WZWN0b3IzKCksCiAgICB9OwogICAgdGhpcy5fYmluZFN0YXRlTWFuYWdlcigpOwogIH0KCiAgZGlzcG9zZSgpIHsKICAgIGlmICh0eXBlb2YgdGhpcy5fcmVtb3ZlU3RhdGVNYW5hZ2VyTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdHJ5IHsgdGhpcy5fcmVtb3ZlU3RhdGVNYW5hZ2VyTGlzdGVuZXIoKTsgfSBjYXRjaCB7fQogICAgfQogICAgdGhpcy5fcmVtb3ZlU3RhdGVNYW5hZ2VyTGlzdGVuZXIgPSBudWxsOwogICAgdGhpcy5zZXRBY3RpdmUoZmFsc2UpOwogIH0KCiAgaXNBY3RpdmUoKSB7CiAgICByZXR1cm4gdGhpcy5fYWN0aXZlOwogIH0KCiAgaXNTaW11bGF0aW9uV29ya2JlbmNoQWN0aXZlKCkgewogICAgcmV0dXJuIHRoaXMudmlld2VyPy5fZ2V0QWN0aXZlV29ya2JlbmNoSWQ/LigpID09PSAnU0lNVUxBVElPTic7CiAgfQoKICBhZGRMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuICgpID0+IHt9OwogICAgdGhpcy5fbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CiAgICByZXR1cm4gKCkgPT4gewogICAgICB0cnkgeyB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTsgfSBjYXRjaCB7fQogICAgfTsKICB9CgogIHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKSB7CiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm47CiAgICB0cnkgeyB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTsgfSBjYXRjaCB7fQogIH0KCiAgaXNQbGF5aW5nKCkgewogICAgcmV0dXJuIHRoaXMuX2lzUGxheWluZzsKICB9CgogIHNldFBsYXlpbmcocGxheWluZykgewogICAgY29uc3QgbmV4dCA9ICEhcGxheWluZzsKICAgIGlmIChuZXh0ID09PSB0aGlzLl9pc1BsYXlpbmcpIHJldHVybiB0aGlzLl9pc1BsYXlpbmc7CiAgICB0aGlzLl9pc1BsYXlpbmcgPSBuZXh0OwogICAgaWYgKHRoaXMuX2FjdGl2ZSkgewogICAgICBpZiAobmV4dCkgewogICAgICAgIHZvaWQgdGhpcy5fcHJlcGFyZVNpbXVsYXRpb25Bc3NldHMoKS50aGVuKCgpID0+IHsKICAgICAgICAgIHRoaXMuX2Vuc3VyZVBoeXNpY3NMb29wKCk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5fc3RvcFBoeXNpY3NMb29wKCk7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuX2VtaXQoKTsKICAgIHRyeSB7IHRoaXMudmlld2VyPy5yZW5kZXI/LigpOyB9IGNhdGNoIHt9CiAgICByZXR1cm4gdGhpcy5faXNQbGF5aW5nOwogIH0KCiAgcmVzZXRTaW11bGF0aW9uU3RhdGUoKSB7CiAgICB0aGlzLl9zdG9wVHJhbnNmb3JtU2Vzc2lvbigpOwogICAgdGhpcy5fc3RvcFBoeXNpY3NMb29wKCk7CiAgICB0aGlzLl9kZXN0cm95UGh5c2ljc1dvcmxkKCk7CiAgICB0aGlzLl9pc1BsYXlpbmcgPSBmYWxzZTsKICAgIHRoaXMuX21vdmVkU29saWRJZHMuY2xlYXIoKTsKICAgIHRoaXMuX21vdGlvblN0YXRlLmNsZWFyKCk7CiAgICBmb3IgKGNvbnN0IHNvbGlkIG9mIHRoaXMuX2xpc3RTY2VuZVNvbGlkcygpKSB7CiAgICAgIHRoaXMuX3J1bnRpbWVTdGF0ZS5zZXQoc29saWQudXVpZCwgbm9ybWFsaXplVHJhbnNmb3JtKG51bGwpKTsKICAgICAgdGhpcy5zZXRTdG9yZWRUcmFuc2Zvcm0oc29saWQsIG51bGwpOwogICAgfQogICAgdGhpcy5fcmVzdG9yZUJhc2VMb2NhbFBvc2VzKCk7CiAgICBmb3IgKGNvbnN0IHNvbGlkIG9mIHRoaXMuX2xpc3RTY2VuZVNvbGlkcygpKSB7CiAgICAgIHRoaXMuX3N5bmNQcm94eUdyb3VwVHJhbnNmb3JtKHNvbGlkKTsKICAgIH0KICAgIGlmICh0aGlzLl9hY3RpdmUpIHsKICAgICAgdGhpcy5fcmVzZXRNb3Rpb25SdW50aW1lKCk7CiAgICB9CiAgICB0aGlzLl9lbWl0KCk7CiAgICB0cnkgeyB0aGlzLnZpZXdlcj8ucmVuZGVyPy4oKTsgfSBjYXRjaCB7fQogIH0KCiAgZ2V0U29saWRGaXhlZChzb2xpZCkgewogICAgaWYgKCFzb2xpZD8ubmFtZSkgcmV0dXJuIGZhbHNlOwogICAgY29uc3Qgb3duID0gdGhpcy52aWV3ZXI/LnBhcnRIaXN0b3J5Py5tZXRhZGF0YU1hbmFnZXI/LmdldE93bk1ldGFkYXRhPy4oc29saWQubmFtZSkgfHwge307CiAgICByZXR1cm4gb3duW0ZJWEVEX01FVEFEQVRBX0tFWV0gPT09IHRydWU7CiAgfQoKICBzZXRTb2xpZEZpeGVkKHNvbGlkLCBmaXhlZCkgewogICAgaWYgKCFzb2xpZD8ubmFtZSkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgbWFuYWdlciA9IHRoaXMudmlld2VyPy5wYXJ0SGlzdG9yeT8ubWV0YWRhdGFNYW5hZ2VyOwogICAgaWYgKCFtYW5hZ2VyKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBkYXRhID0gbWFuYWdlci5nZXRPd25NZXRhZGF0YShzb2xpZC5uYW1lKTsKICAgIGlmIChmaXhlZCkgZGF0YVtGSVhFRF9NRVRBREFUQV9LRVldID0gdHJ1ZTsKICAgIGVsc2UgZGVsZXRlIGRhdGFbRklYRURfTUVUQURBVEFfS0VZXTsKICAgIG1hbmFnZXIuc2V0TWV0YWRhdGFPYmplY3Qoc29saWQubmFtZSwgZGF0YSk7CiAgICBpZiAodGhpcy5fYWN0aXZlICYmIHRoaXMuX3BoeXNpY3NXb3JsZCkgewogICAgICB2b2lkIHRoaXMuX3JlYnVpbGRQaHlzaWNzV29ybGQoKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgZ2V0U3RvcmVkVHJhbnNmb3JtKHNvbGlkKSB7CiAgICBpZiAoIXNvbGlkPy5uYW1lKSByZXR1cm4gbm9ybWFsaXplVHJhbnNmb3JtKG51bGwpOwogICAgY29uc3Qgb3duID0gdGhpcy52aWV3ZXI/LnBhcnRIaXN0b3J5Py5tZXRhZGF0YU1hbmFnZXI/LmdldE93bk1ldGFkYXRhPy4oc29saWQubmFtZSkgfHwge307CiAgICByZXR1cm4gbm9ybWFsaXplVHJhbnNmb3JtKG93bltUUkFOU0ZPUk1fTUVUQURBVEFfS0VZXSk7CiAgfQoKICBzZXRTdG9yZWRUcmFuc2Zvcm0oc29saWQsIHRyYW5zZm9ybSkgewogICAgaWYgKCFzb2xpZD8ubmFtZSkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgbWFuYWdlciA9IHRoaXMudmlld2VyPy5wYXJ0SGlzdG9yeT8ubWV0YWRhdGFNYW5hZ2VyOwogICAgaWYgKCFtYW5hZ2VyKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICBjb25zdCBkYXRhID0gbWFuYWdlci5nZXRPd25NZXRhZGF0YShzb2xpZC5uYW1lKTsKICAgIGlmICh0cmFuc2Zvcm1Jc0lkZW50aXR5KG5vcm1hbGl6ZWQpKSBkZWxldGUgZGF0YVtUUkFOU0ZPUk1fTUVUQURBVEFfS0VZXTsKICAgIGVsc2UgZGF0YVtUUkFOU0ZPUk1fTUVUQURBVEFfS0VZXSA9IG5vcm1hbGl6ZWQ7CiAgICBtYW5hZ2VyLnNldE1ldGFkYXRhT2JqZWN0KHNvbGlkLm5hbWUsIGRhdGEpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBzZXRBY3RpdmUoYWN0aXZlKSB7CiAgICBjb25zdCBuZXh0ID0gISFhY3RpdmU7CiAgICBpZiAobmV4dCA9PT0gdGhpcy5fYWN0aXZlKSB7CiAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgdGhpcy5fYXBwbHlSdW50aW1lVHJhbnNmb3JtcygpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuX3Jlc3RvcmVCYXNlTG9jYWxQb3NlcygpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX2FjdGl2ZSA9IG5leHQ7CiAgICBpZiAodGhpcy5fYWN0aXZlKSB7CiAgICAgIHRoaXMuX2lzUGxheWluZyA9IGZhbHNlOwogICAgICB0aGlzLl9zdG9wUGh5c2ljc0xvb3AoKTsKICAgICAgdGhpcy5fZGVzdHJveVBoeXNpY3NXb3JsZCgpOwogICAgICB0aGlzLl9jYXB0dXJlQmFzZUxvY2FsUG9zZXMoKTsKICAgICAgdGhpcy5fY2FwdHVyZVNvdXJjZVZpc2liaWxpdHkoKTsKICAgICAgdGhpcy5faHlkcmF0ZVJ1bnRpbWVTdGF0ZUZyb21NZXRhZGF0YSgpOwogICAgICB0aGlzLl9yZXNldE1vdGlvblJ1bnRpbWUoKTsKICAgICAgdGhpcy5fYXBwbHlSdW50aW1lVHJhbnNmb3JtcygpOwogICAgICB0aGlzLl9zZXRTb3VyY2VTb2xpZHNWaXNpYmxlKHRydWUpOwogICAgICB2b2lkIHRoaXMuX3ByZXBhcmVWaXN1YWxBc3NldHMoKTsKICAgICAgdGhpcy5fZW1pdCgpOwogICAgICByZXR1cm47CiAgICB9CiAgICB0aGlzLl9zdG9wVHJhbnNmb3JtU2Vzc2lvbigpOwogICAgdGhpcy5fZGVzdHJveVBoeXNpY3NXb3JsZCgpOwogICAgdGhpcy5fc3RvcFBoeXNpY3NMb29wKCk7CiAgICB0aGlzLl9jbGVhclByb3h5R3JvdXBzKCk7CiAgICB0aGlzLl9zZXRTb3VyY2VTb2xpZHNWaXNpYmxlKHRydWUpOwogICAgdGhpcy5fcmVzdG9yZUJhc2VMb2NhbFBvc2VzKCk7CiAgICB0aGlzLl9ydW50aW1lU3RhdGUuY2xlYXIoKTsKICAgIHRoaXMuX2Jhc2VMb2NhbFBvc2UuY2xlYXIoKTsKICAgIHRoaXMuX3NvdXJjZVZpc2liaWxpdHkuY2xlYXIoKTsKICAgIHRoaXMuX2RlY29tcG9zaXRpb25DYWNoZS5jbGVhcigpOwogICAgdGhpcy5fbW90aW9uU3RhdGUuY2xlYXIoKTsKICAgIHRoaXMuX21vdmVkU29saWRJZHMuY2xlYXIoKTsKICAgIHRoaXMuX2lzUGxheWluZyA9IGZhbHNlOwogICAgdGhpcy5fZW1pdCgpOwogIH0KCiAgdG9nZ2xlU29saWRUcmFuc2Zvcm0oc29saWQpIHsKICAgIGlmICghc29saWQgfHwgc29saWQudHlwZSAhPT0gJ1NPTElEJykgcmV0dXJuOwogICAgaWYgKCF0aGlzLmlzU2ltdWxhdGlvbldvcmtiZW5jaEFjdGl2ZSgpKSByZXR1cm47CiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fdHJhbnNmb3JtU2Vzc2lvbjsKICAgIGlmIChzZXNzaW9uICYmIHNlc3Npb24uc29saWQgPT09IHNvbGlkKSB7CiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlID0gKHR5cGVvZiBzZXNzaW9uLmNvbnRyb2xzPy5nZXRNb2RlID09PSAnZnVuY3Rpb24nKQogICAgICAgID8gc2Vzc2lvbi5jb250cm9scy5nZXRNb2RlKCkKICAgICAgICA6IChzZXNzaW9uLmNvbnRyb2xzPy5tb2RlIHx8IHNlc3Npb24ubW9kZSB8fCAndHJhbnNsYXRlJyk7CiAgICAgIGlmIChjdXJyZW50TW9kZSA9PT0gJ3RyYW5zbGF0ZScpIHsKICAgICAgICB0cnkgeyBzZXNzaW9uLmNvbnRyb2xzPy5zZXRNb2RlKCdyb3RhdGUnKTsgfSBjYXRjaCB7IHNlc3Npb24uY29udHJvbHMubW9kZSA9ICdyb3RhdGUnOyB9CiAgICAgICAgc2Vzc2lvbi5tb2RlID0gJ3JvdGF0ZSc7CiAgICAgICAgdHJ5IHsgc2Vzc2lvbi5nbG9iYWxTdGF0ZT8udXBkYXRlRm9yQ2FtZXJhPy4oKTsgfSBjYXRjaCB7fQogICAgICAgIHRyeSB7IHRoaXMudmlld2VyPy5yZW5kZXI/LigpOyB9IGNhdGNoIHt9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX3N0b3BUcmFuc2Zvcm1TZXNzaW9uKCk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXMuX3N0YXJ0VHJhbnNmb3JtU2Vzc2lvbihzb2xpZCk7CiAgfQoKICBfY2FwdHVyZUJhc2VMb2NhbFBvc2VzKCkgewogICAgZm9yIChjb25zdCBzb2xpZCBvZiB0aGlzLl9saXN0U2NlbmVTb2xpZHMoKSkgewogICAgICBpZiAoIXRoaXMuX2Jhc2VMb2NhbFBvc2UuaGFzKHNvbGlkLnV1aWQpKSB7CiAgICAgICAgdGhpcy5fYmFzZUxvY2FsUG9zZS5zZXQoc29saWQudXVpZCwgY29weUxvY2FsUG9zZShzb2xpZCkpOwogICAgICB9CiAgICB9CiAgfQoKICBfY2FwdHVyZVNvdXJjZVZpc2liaWxpdHkoKSB7CiAgICBmb3IgKGNvbnN0IHNvbGlkIG9mIHRoaXMuX2xpc3RTY2VuZVNvbGlkcygpKSB7CiAgICAgIGlmICghdGhpcy5fc291cmNlVmlzaWJpbGl0eS5oYXMoc29saWQudXVpZCkpIHsKICAgICAgICB0aGlzLl9zb3VyY2VWaXNpYmlsaXR5LnNldChzb2xpZC51dWlkLCBzb2xpZC52aXNpYmxlICE9PSBmYWxzZSk7CiAgICAgIH0KICAgIH0KICB9CgogIF9oeWRyYXRlUnVudGltZVN0YXRlRnJvbU1ldGFkYXRhKCkgewogICAgZm9yIChjb25zdCBzb2xpZCBvZiB0aGlzLl9saXN0U2NlbmVTb2xpZHMoKSkgewogICAgICB0aGlzLl9ydW50aW1lU3RhdGUuc2V0KHNvbGlkLnV1aWQsIG5vcm1hbGl6ZVRyYW5zZm9ybSh0aGlzLmdldFN0b3JlZFRyYW5zZm9ybShzb2xpZCkpKTsKICAgIH0KICB9CgogIF9yZXN0b3JlQmFzZUxvY2FsUG9zZXMoKSB7CiAgICBmb3IgKGNvbnN0IHNvbGlkIG9mIHRoaXMuX2xpc3RTY2VuZVNvbGlkcygpKSB7CiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLl9iYXNlTG9jYWxQb3NlLmdldChzb2xpZC51dWlkKTsKICAgICAgaWYgKCFiYXNlKSBjb250aW51ZTsKICAgICAgc29saWQucG9zaXRpb24uY29weShiYXNlLnBvc2l0aW9uKTsKICAgICAgc29saWQucXVhdGVybmlvbi5jb3B5KGJhc2UucXVhdGVybmlvbik7CiAgICAgIHNvbGlkLnNjYWxlLmNvcHkoYmFzZS5zY2FsZSk7CiAgICAgIHNvbGlkLnVwZGF0ZU1hdHJpeFdvcmxkPy4odHJ1ZSk7CiAgICB9CiAgICB0cnkgeyB0aGlzLnZpZXdlcj8ucmVuZGVyPy4oKTsgfSBjYXRjaCB7fQogIH0KCiAgX2FwcGx5UnVudGltZVRyYW5zZm9ybXMoKSB7CiAgICB0aGlzLl9jYXB0dXJlQmFzZUxvY2FsUG9zZXMoKTsKICAgIGZvciAoY29uc3Qgc29saWQgb2YgdGhpcy5fbGlzdFNjZW5lU29saWRzKCkpIHsKICAgICAgdGhpcy5fYXBwbHlSdW50aW1lVHJhbnNmb3JtVG9Tb2xpZChzb2xpZCk7CiAgICB9CiAgICB0cnkgeyB0aGlzLnZpZXdlcj8ucmVuZGVyPy4oKTsgfSBjYXRjaCB7fQogIH0KCiAgX2FwcGx5UnVudGltZVRyYW5zZm9ybVRvU29saWQoc29saWQpIHsKICAgIGNvbnN0IGJhc2UgPSB0aGlzLl9iYXNlTG9jYWxQb3NlLmdldChzb2xpZC51dWlkKTsKICAgIGlmICghYmFzZSkgcmV0dXJuOwogICAgY29uc3QgcnVudGltZSA9IG5vcm1hbGl6ZVRyYW5zZm9ybSh0aGlzLl9ydW50aW1lU3RhdGUuZ2V0KHNvbGlkLnV1aWQpKTsKICAgIGNvbnN0IG9mZnNldFF1YXRlcm5pb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpLnNldEZyb21FdWxlcigKICAgICAgbmV3IFRIUkVFLkV1bGVyKC4uLnJ1bnRpbWUucm90YXRpb25FdWxlciwgJ1hZWicpLAogICAgKTsKICAgIGNvbnN0IG5leHRNYXRyaXggPSBidWlsZExvY2FsTWF0cml4KGJhc2UpLm11bHRpcGx5KAogICAgICBuZXcgVEhSRUUuTWF0cml4NCgpLmNvbXBvc2UoCiAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoLi4ucnVudGltZS5wb3NpdGlvbiksCiAgICAgICAgb2Zmc2V0UXVhdGVybmlvbiwKICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMygxLCAxLCAxKSwKICAgICAgKSwKICAgICk7CiAgICBuZXh0TWF0cml4LmRlY29tcG9zZShzb2xpZC5wb3NpdGlvbiwgc29saWQucXVhdGVybmlvbiwgc29saWQuc2NhbGUpOwogICAgc29saWQudXBkYXRlTWF0cml4V29ybGQ/Lih0cnVlKTsKICAgIHRoaXMuX3N5bmNQcm94eUdyb3VwVHJhbnNmb3JtKHNvbGlkKTsKICB9CgogIF91cGRhdGVSdW50aW1lVHJhbnNmb3JtRnJvbVNvbGlkKHNvbGlkLCB7IHBlcnNpc3QgPSBmYWxzZSB9ID0ge30pIHsKICAgIGNvbnN0IGJhc2UgPSB0aGlzLl9iYXNlTG9jYWxQb3NlLmdldChzb2xpZC51dWlkKTsKICAgIGlmICghYmFzZSkgcmV0dXJuOwogICAgY29uc3Qgb2Zmc2V0ID0gbm9ybWFsaXplVHJhbnNmb3JtKHBvc2VUb09mZnNldChiYXNlLCBzb2xpZCkpOwogICAgdGhpcy5fcnVudGltZVN0YXRlLnNldChzb2xpZC51dWlkLCBvZmZzZXQpOwogICAgaWYgKHBlcnNpc3QpIHsKICAgICAgdGhpcy5zZXRTdG9yZWRUcmFuc2Zvcm0oc29saWQsIG9mZnNldCk7CiAgICAgIHRoaXMudmlld2VyPy5wYXJ0SGlzdG9yeT8ucXVldWVIaXN0b3J5U25hcHNob3Q/Lih7IGRlYm91bmNlTXM6IDAsIHJlYXNvbjogJ3NpbXVsYXRpb24tdHJhbnNmb3JtJyB9KTsKICAgIH0KICAgIHRoaXMuX3N5bmNQcm94eUdyb3VwVHJhbnNmb3JtKHNvbGlkKTsKICB9CgogIGFzeW5jIF9wcmVwYXJlU2ltdWxhdGlvbkFzc2V0cygpIHsKICAgIGlmICghdGhpcy5fYWN0aXZlKSByZXR1cm47CiAgICB0cnkgewogICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLl9saXN0U2NlbmVTb2xpZHMoKS5tYXAoKHNvbGlkKSA9PiB0aGlzLl9lbnN1cmVEZWNvbXBvc2l0aW9uKHNvbGlkKSkpOwogICAgICB0aGlzLl9idWlsZFByb3h5R3JvdXBzKCk7CiAgICAgIGF3YWl0IHRoaXMuX3JlYnVpbGRQaHlzaWNzV29ybGQoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRpb25Xb3JrYmVuY2hdIEZhaWxlZCB0byBwcmVwYXJlIHNpbXVsYXRpb24gYXNzZXRzOicsIGVycm9yKTsKICAgIH0KICB9CgogIGFzeW5jIF9wcmVwYXJlVmlzdWFsQXNzZXRzKCkgewogICAgaWYgKCF0aGlzLl9hY3RpdmUpIHJldHVybjsKICAgIHRyeSB7CiAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuX2xpc3RTY2VuZVNvbGlkcygpLm1hcCgoc29saWQpID0+IHRoaXMuX2Vuc3VyZURlY29tcG9zaXRpb24oc29saWQpKSk7CiAgICAgIHRoaXMuX2J1aWxkUHJveHlHcm91cHMoKTsKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRpb25Xb3JrYmVuY2hdIEZhaWxlZCB0byBwcmVwYXJlIHNpbXVsYXRpb24gdmlzdWFsczonLCBlcnJvcik7CiAgICB9CiAgfQoKICBhc3luYyBfbG9hZFJhcGllcigpIHsKICAgIGlmICh0aGlzLl9yYXBpZXIpIHJldHVybiB0aGlzLl9yYXBpZXI7CiAgICBpZiAoIXRoaXMuX3JhcGllckxvYWRQcm9taXNlKSB7CiAgICAgIHRoaXMuX3JhcGllckxvYWRQcm9taXNlID0gaW1wb3J0KCdAZGltZm9yZ2UvcmFwaWVyM2QvcmFwaWVyLmpzJykKICAgICAgICAudGhlbigobW9kdWxlKSA9PiBtb2R1bGU/LmRlZmF1bHQgfHwgbW9kdWxlKQogICAgICAgIC50aGVuKChyYXBpZXIpID0+IHsKICAgICAgICAgIHRoaXMuX3JhcGllciA9IHJhcGllcjsKICAgICAgICAgIHJldHVybiByYXBpZXI7CiAgICAgICAgfSkKICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7CiAgICAgICAgICB0aGlzLl9yYXBpZXJMb2FkUHJvbWlzZSA9IG51bGw7CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9KTsKICAgIH0KICAgIHJldHVybiB0aGlzLl9yYXBpZXJMb2FkUHJvbWlzZTsKICB9CgogIGFzeW5jIF9sb2FkVmhhY2QoKSB7CiAgICBpZiAodGhpcy5fdmhhY2QpIHJldHVybiB0aGlzLl92aGFjZDsKICAgIGlmICghdGhpcy5fdmhhY2RMb2FkUHJvbWlzZSkgewogICAgICB0aGlzLl92aGFjZExvYWRQcm9taXNlID0gaW1wb3J0KCd2aGFjZC1qcy9saWIvdmhhY2QuanMnKQogICAgICAgIC50aGVuKChtb2R1bGUpID0+IG1vZHVsZT8uQ29udmV4TWVzaERlY29tcG9zaXRpb24/LmNyZWF0ZT8uKCkpCiAgICAgICAgLnRoZW4oKGluc3RhbmNlKSA9PiB7CiAgICAgICAgICB0aGlzLl92aGFjZCA9IGluc3RhbmNlIHx8IG51bGw7CiAgICAgICAgICByZXR1cm4gdGhpcy5fdmhhY2Q7CiAgICAgICAgfSkKICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7CiAgICAgICAgICB0aGlzLl92aGFjZExvYWRQcm9taXNlID0gbnVsbDsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIHRoaXMuX3ZoYWNkTG9hZFByb21pc2U7CiAgfQoKICBhc3luYyBfZW5zdXJlRGVjb21wb3NpdGlvbihzb2xpZCkgewogICAgaWYgKCFzb2xpZD8udXVpZCkgcmV0dXJuIFtdOwogICAgY29uc3QgY2FjaGVkID0gdGhpcy5fZGVjb21wb3NpdGlvbkNhY2hlLmdldChzb2xpZC51dWlkKTsKICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQuaHVsbHM7CiAgICBjb25zdCByYXdNZXNoID0gdGhpcy5fZXh0cmFjdFNvbGlkTWVzaChzb2xpZCk7CiAgICBpZiAoIXJhd01lc2gpIHsKICAgICAgdGhpcy5fZGVjb21wb3NpdGlvbkNhY2hlLnNldChzb2xpZC51dWlkLCB7IGh1bGxzOiBbXSB9KTsKICAgICAgcmV0dXJuIFtdOwogICAgfQogICAgbGV0IGh1bGxzID0gW107CiAgICB0cnkgewogICAgICBjb25zdCB2aGFjZCA9IGF3YWl0IHRoaXMuX2xvYWRWaGFjZCgpOwogICAgICBpZiAodmhhY2Q/LmNvbXB1dGVDb252ZXhIdWxscykgewogICAgICAgIGh1bGxzID0gdmhhY2QuY29tcHV0ZUNvbnZleEh1bGxzKHJhd01lc2gsIFZIQUNEX09QVElPTlMpIHx8IFtdOwogICAgICB9CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0aW9uV29ya2JlbmNoXSBGYWlsZWQgdG8gZGVjb21wb3NlIG1lc2ggd2l0aCB2aGFjZC1qczonLCBlcnJvcik7CiAgICB9CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoaHVsbHMpIHx8IGh1bGxzLmxlbmd0aCA9PT0gMCkgewogICAgICBodWxscyA9IFtyYXdNZXNoXTsKICAgIH0KICAgIHRoaXMuX2RlY29tcG9zaXRpb25DYWNoZS5zZXQoc29saWQudXVpZCwgeyBodWxscyB9KTsKICAgIHJldHVybiBodWxsczsKICB9CgogIF9leHRyYWN0U29saWRNZXNoKHNvbGlkKSB7CiAgICBsZXQgbWVzaCA9IG51bGw7CiAgICB0cnkgewogICAgICBtZXNoID0gc29saWQuZ2V0TWVzaD8uKCk7CiAgICAgIHJldHVybiBub3JtYWxpemVNZXNoQXJyYXlzKG1lc2gpOwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBmaW5hbGx5IHsKICAgICAgdHJ5IHsgaWYgKG1lc2ggJiYgdHlwZW9mIG1lc2guZGVsZXRlID09PSAnZnVuY3Rpb24nKSBtZXNoLmRlbGV0ZSgpOyB9IGNhdGNoIHt9CiAgICB9CiAgfQoKICBfYnVpbGRQcm94eUdyb3VwcygpIHsKICAgIHRoaXMuX2NsZWFyUHJveHlHcm91cHMoKTsKICAgIGZvciAoY29uc3Qgc29saWQgb2YgdGhpcy5fbGlzdFNjZW5lU29saWRzKCkpIHsKICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5fZGVjb21wb3NpdGlvbkNhY2hlLmdldChzb2xpZC51dWlkKTsKICAgICAgY29uc3QgaHVsbHMgPSBBcnJheS5pc0FycmF5KHJlY29yZD8uaHVsbHMpID8gcmVjb3JkLmh1bGxzIDogW107CiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5fY3JlYXRlUHJveHlHcm91cChzb2xpZCwgaHVsbHMpOwogICAgICBpZiAoIWdyb3VwKSBjb250aW51ZTsKICAgICAgdGhpcy5fcHJveHlHcm91cHMuc2V0KHNvbGlkLnV1aWQsIGdyb3VwKTsKICAgICAgdGhpcy5fc3luY1Byb3h5R3JvdXBUcmFuc2Zvcm0oc29saWQpOwogICAgICB0cnkgeyB0aGlzLnZpZXdlcj8ucmVuZGVyPy4oKTsgfSBjYXRjaCB7fQogICAgfQogIH0KCiAgX2NyZWF0ZVByb3h5R3JvdXAoc29saWQsIGh1bGxzKSB7CiAgICBjb25zdCBwYXJlbnQgPSBzb2xpZC5wYXJlbnQgfHwgdGhpcy52aWV3ZXI/LnNjZW5lIHx8IG51bGw7CiAgICBpZiAoIXBhcmVudD8uYWRkIHx8ICFBcnJheS5pc0FycmF5KGh1bGxzKSB8fCBodWxscy5sZW5ndGggPT09IDApIHJldHVybiBudWxsOwogICAgY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTsKICAgIGdyb3VwLm5hbWUgPSBgJHtTSU1fUFJPWFlfUFJFRklYfToke3NvbGlkLm5hbWUgfHwgc29saWQudXVpZCB8fCAnJ31gOwogICAgZ3JvdXAudXNlckRhdGEuZXhjbHVkZUZyb21GaXQgPSBmYWxzZTsKICAgIGdyb3VwLnVzZXJEYXRhLnNpbXVsYXRpb25Qcm94eSA9IHRydWU7CiAgICBncm91cC52aXNpYmxlID0gZmFsc2U7CiAgICBjb25zdCBtZXRhZGF0YUNvbG9yID0gdGhpcy52aWV3ZXI/LnBhcnRIaXN0b3J5Py5tZXRhZGF0YU1hbmFnZXI/LmdldE1ldGFkYXRhPy4oc29saWQubmFtZSB8fCAnJyk/LmNvbG9yIHx8IG51bGw7CiAgICBodWxscy5mb3JFYWNoKChodWxsLCBpbmRleCkgPT4gewogICAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpOwogICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoQXJyYXkuZnJvbShodWxsLnBvc2l0aW9ucyB8fCBbXSksIDMpKTsKICAgICAgZ2VvbWV0cnkuc2V0SW5kZXgoQXJyYXkuZnJvbShodWxsLmluZGljZXMgfHwgW10pKTsKICAgICAgZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsKICAgICAgY29uc3QgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LCBidWlsZFByb3h5TWF0ZXJpYWwobWV0YWRhdGFDb2xvciwgaW5kZXgsIGh1bGxzLmxlbmd0aCkpOwogICAgICBtZXNoLnVzZXJEYXRhLmV4Y2x1ZGVGcm9tRml0ID0gZmFsc2U7CiAgICAgIG1lc2gudXNlckRhdGEuc2ltdWxhdGlvblByb3h5ID0gdHJ1ZTsKICAgICAgbWVzaC51c2VyRGF0YS5zb3VyY2VTb2xpZFV1aWQgPSBzb2xpZC51dWlkOwogICAgICBncm91cC5hZGQobWVzaCk7CgogICAgICBjb25zdCBlZGdlcyA9IG5ldyBUSFJFRS5MaW5lU2VnbWVudHMoCiAgICAgICAgbmV3IFRIUkVFLkVkZ2VzR2VvbWV0cnkoZ2VvbWV0cnksIDIwKSwKICAgICAgICBuZXcgVEhSRUUuTGluZUJhc2ljTWF0ZXJpYWwoeyBjb2xvcjogMHgyMmQzZWUsIHRyYW5zcGFyZW50OiB0cnVlLCBvcGFjaXR5OiAwLjkgfSksCiAgICAgICk7CiAgICAgIGVkZ2VzLnVzZXJEYXRhLmV4Y2x1ZGVGcm9tRml0ID0gZmFsc2U7CiAgICAgIGVkZ2VzLnVzZXJEYXRhLnNpbXVsYXRpb25Qcm94eSA9IHRydWU7CiAgICAgIGdyb3VwLmFkZChlZGdlcyk7CiAgICB9KTsKICAgIHBhcmVudC5hZGQoZ3JvdXApOwogICAgcmV0dXJuIGdyb3VwOwogIH0KCiAgX3N5bmNQcm94eUdyb3VwVHJhbnNmb3JtKHNvbGlkKSB7CiAgICBjb25zdCBncm91cCA9IHRoaXMuX3Byb3h5R3JvdXBzLmdldChzb2xpZC51dWlkKTsKICAgIGlmICghZ3JvdXApIHJldHVybjsKICAgIGdyb3VwLnBvc2l0aW9uLmNvcHkoc29saWQucG9zaXRpb24pOwogICAgZ3JvdXAucXVhdGVybmlvbi5jb3B5KHNvbGlkLnF1YXRlcm5pb24pOwogICAgZ3JvdXAuc2NhbGUuY29weShzb2xpZC5zY2FsZSk7CiAgICBncm91cC52aXNpYmxlID0gZmFsc2U7CiAgICBncm91cC51cGRhdGVNYXRyaXhXb3JsZD8uKHRydWUpOwogIH0KCiAgX2NsZWFyUHJveHlHcm91cHMoKSB7CiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHRoaXMuX3Byb3h5R3JvdXBzLnZhbHVlcygpKSB7CiAgICAgIHRyeSB7IGdyb3VwLnBhcmVudD8ucmVtb3ZlPy4oZ3JvdXApOyB9IGNhdGNoIHt9CiAgICAgIGRpc3Bvc2VIaWVyYXJjaHkoZ3JvdXApOwogICAgfQogICAgdGhpcy5fcHJveHlHcm91cHMuY2xlYXIoKTsKICB9CgogIF9zZXRTb3VyY2VTb2xpZHNWaXNpYmxlKHZpc2libGUpIHsKICAgIGZvciAoY29uc3Qgc29saWQgb2YgdGhpcy5fbGlzdFNjZW5lU29saWRzKCkpIHsKICAgICAgaWYgKHZpc2libGUpIHsKICAgICAgICBzb2xpZC52aXNpYmxlID0gdGhpcy5fc291cmNlVmlzaWJpbGl0eS5nZXQoc29saWQudXVpZCkgIT09IGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIHNvbGlkLnZpc2libGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCBncm91cCBvZiB0aGlzLl9wcm94eUdyb3Vwcy52YWx1ZXMoKSkgewogICAgICBncm91cC52aXNpYmxlID0gZmFsc2U7CiAgICB9CiAgICB0cnkgeyB0aGlzLnZpZXdlcj8ucmVuZGVyPy4oKTsgfSBjYXRjaCB7fQogIH0KCiAgYXN5bmMgX3JlYnVpbGRQaHlzaWNzV29ybGQoKSB7CiAgICBpZiAoIXRoaXMuX2FjdGl2ZSkgcmV0dXJuOwogICAgY29uc3QgW3JhcGllcl0gPSBhd2FpdCBQcm9taXNlLmFsbChbCiAgICAgIHRoaXMuX2xvYWRSYXBpZXIoKSwKICAgICAgUHJvbWlzZS5hbGwodGhpcy5fbGlzdFNjZW5lU29saWRzKCkubWFwKChzb2xpZCkgPT4gdGhpcy5fZW5zdXJlRGVjb21wb3NpdGlvbihzb2xpZCkpKSwKICAgIF0pOwogICAgaWYgKCF0aGlzLl9hY3RpdmUgfHwgIXJhcGllcikgcmV0dXJuOwogICAgdGhpcy5fZGVzdHJveVBoeXNpY3NXb3JsZCgpOwogICAgdGhpcy5fYm9keVN0YXRlLmNsZWFyKCk7CiAgICBjb25zdCB3b3JsZCA9IG5ldyByYXBpZXIuV29ybGQoeyB4OiAwLCB5OiAtOS44MSwgejogMCB9KTsKICAgIHdvcmxkLm1heENjZFN1YnN0ZXBzID0gMjsKICAgIHRoaXMuX3BoeXNpY3NXb3JsZCA9IHdvcmxkOwogICAgY29uc3Qgc2VsZWN0ZWRTb2xpZCA9IHRoaXMuX3RyYW5zZm9ybVNlc3Npb24/LnNvbGlkIHx8IG51bGw7CiAgICBmb3IgKGNvbnN0IHNvbGlkIG9mIHRoaXMuX2xpc3RTY2VuZVNvbGlkcygpKSB7CiAgICAgIGNvbnN0IGJvZHlEZXNjID0gKHNlbGVjdGVkU29saWQgJiYgc29saWQgPT09IHNlbGVjdGVkU29saWQpCiAgICAgICAgPyByYXBpZXIuUmlnaWRCb2R5RGVzYy5raW5lbWF0aWNQb3NpdGlvbkJhc2VkKCkKICAgICAgICA6ICh0aGlzLl9pc1NvbGlkS2luZW1hdGljTW90aW9uRHJpdmVuKHNvbGlkKQogICAgICAgICAgPyByYXBpZXIuUmlnaWRCb2R5RGVzYy5raW5lbWF0aWNQb3NpdGlvbkJhc2VkKCkKICAgICAgICAgIDogKHRoaXMuZ2V0U29saWRGaXhlZChzb2xpZCkgPyByYXBpZXIuUmlnaWRCb2R5RGVzYy5maXhlZCgpIDogcmFwaWVyLlJpZ2lkQm9keURlc2MuZHluYW1pYygpKSk7CiAgICAgIGNvbnN0IHBvc2l0aW9uID0gc29saWQuZ2V0V29ybGRQb3NpdGlvbihuZXcgVEhSRUUuVmVjdG9yMygpKTsKICAgICAgY29uc3QgcXVhdGVybmlvbiA9IHNvbGlkLmdldFdvcmxkUXVhdGVybmlvbihuZXcgVEhSRUUuUXVhdGVybmlvbigpKTsKICAgICAgYm9keURlc2Muc2V0VHJhbnNsYXRpb24ocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueik7CiAgICAgIGJvZHlEZXNjLnNldFJvdGF0aW9uKHsgeDogcXVhdGVybmlvbi54LCB5OiBxdWF0ZXJuaW9uLnksIHo6IHF1YXRlcm5pb24ueiwgdzogcXVhdGVybmlvbi53IH0pOwogICAgICBib2R5RGVzYy5zZXRMaW5lYXJEYW1waW5nKDIuNSk7CiAgICAgIGJvZHlEZXNjLnNldEFuZ3VsYXJEYW1waW5nKDIuNSk7CiAgICAgIGJvZHlEZXNjLnNldENjZEVuYWJsZWQodHJ1ZSk7CiAgICAgIGNvbnN0IGJvZHkgPSB3b3JsZC5jcmVhdGVSaWdpZEJvZHkoYm9keURlc2MpOwogICAgICBjb25zdCBodWxscyA9IHRoaXMuX2RlY29tcG9zaXRpb25DYWNoZS5nZXQoc29saWQudXVpZCk/Lmh1bGxzIHx8IFtdOwogICAgICBmb3IgKGNvbnN0IGh1bGwgb2YgaHVsbHMpIHsKICAgICAgICBjb25zdCBjb2xsaWRlciA9IHRoaXMuX2NyZWF0ZUNvbGxpZGVyRm9ySHVsbChyYXBpZXIsIGh1bGwpOwogICAgICAgIGlmICghY29sbGlkZXIpIGNvbnRpbnVlOwogICAgICAgIGNvbGxpZGVyLnNldFJlc3RpdHV0aW9uKDAuMDUpOwogICAgICAgIGNvbGxpZGVyLnNldEZyaWN0aW9uKDAuOSk7CiAgICAgICAgd29ybGQuY3JlYXRlQ29sbGlkZXIoY29sbGlkZXIsIGJvZHkpOwogICAgICB9CiAgICAgIHRoaXMuX2JvZHlTdGF0ZS5zZXQoc29saWQudXVpZCwgewogICAgICAgIHNvbGlkLAogICAgICAgIGJvZHksCiAgICAgICAgcHJveHlHcm91cDogdGhpcy5fcHJveHlHcm91cHMuZ2V0KHNvbGlkLnV1aWQpIHx8IG51bGwsCiAgICAgIH0pOwogICAgfQogIH0KCiAgX2Rlc3Ryb3lQaHlzaWNzV29ybGQoKSB7CiAgICB0cnkgeyB0aGlzLl9waHlzaWNzV29ybGQ/LmZyZWU/LigpOyB9IGNhdGNoIHt9CiAgICB0aGlzLl9waHlzaWNzV29ybGQgPSBudWxsOwogICAgdGhpcy5fYm9keVN0YXRlLmNsZWFyKCk7CiAgfQoKICBfY3JlYXRlQ29sbGlkZXJGb3JIdWxsKHJhcGllciwgaHVsbCkgewogICAgY29uc3QgcG9zaXRpb25zID0gaHVsbD8ucG9zaXRpb25zID8gbmV3IEZsb2F0MzJBcnJheShodWxsLnBvc2l0aW9ucykgOiBudWxsOwogICAgY29uc3QgaW5kaWNlcyA9IGh1bGw/LmluZGljZXMgPyBuZXcgVWludDMyQXJyYXkoaHVsbC5pbmRpY2VzKSA6IG51bGw7CiAgICBpZiAoIXBvc2l0aW9ucyB8fCBwb3NpdGlvbnMubGVuZ3RoIDwgOSB8fCAhaW5kaWNlcyB8fCBpbmRpY2VzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsOwogICAgY29uc3QgY29sbGlkZXIgPSByYXBpZXIuQ29sbGlkZXJEZXNjLmNvbnZleE1lc2gocG9zaXRpb25zLCBpbmRpY2VzKTsKICAgIGlmIChjb2xsaWRlcikgcmV0dXJuIGNvbGxpZGVyOwogICAgcmV0dXJuIHJhcGllci5Db2xsaWRlckRlc2MuY29udmV4SHVsbChwb3NpdGlvbnMpOwogIH0KCiAgX2Vuc3VyZVBoeXNpY3NMb29wKCkgewogICAgaWYgKHRoaXMuX3JhZikgcmV0dXJuOwogICAgdGhpcy5fbGFzdFN0ZXBUaW1lID0gMDsKICAgIGNvbnN0IHN0ZXAgPSAodHMpID0+IHsKICAgICAgdGhpcy5fcmFmID0gMDsKICAgICAgaWYgKCF0aGlzLl9hY3RpdmUpIHJldHVybjsKICAgICAgdGhpcy5fc3RlcFBoeXNpY3ModHMpOwogICAgICB0aGlzLl9yYWYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCk7CiAgICB9OwogICAgdGhpcy5fcmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHN0ZXApOwogIH0KCiAgX3N0b3BQaHlzaWNzTG9vcCgpIHsKICAgIGlmICh0aGlzLl9yYWYpIHsKICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmKTsKICAgICAgdGhpcy5fcmFmID0gMDsKICAgIH0KICAgIHRoaXMuX2xhc3RTdGVwVGltZSA9IDA7CiAgfQoKICBfc3RlcFBoeXNpY3ModGltZXN0YW1wKSB7CiAgICBjb25zdCB3b3JsZCA9IHRoaXMuX3BoeXNpY3NXb3JsZDsKICAgIGlmICghd29ybGQpIHJldHVybjsKICAgIGlmICghdGhpcy5faXNQbGF5aW5nKSB7CiAgICAgIHRoaXMuX2xhc3RTdGVwVGltZSA9IHRpbWVzdGFtcDsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29uc3QgZHQgPSB0aGlzLl9sYXN0U3RlcFRpbWUgPiAwCiAgICAgID8gTWF0aC5taW4oMSAvIDIwLCBNYXRoLm1heCgxIC8gMjQwLCAodGltZXN0YW1wIC0gdGhpcy5fbGFzdFN0ZXBUaW1lKSAvIDEwMDApKQogICAgICA6IDEgLyA2MDsKICAgIHRoaXMuX2xhc3RTdGVwVGltZSA9IHRpbWVzdGFtcDsKICAgIHdvcmxkLnRpbWVzdGVwID0gZHQ7CgogICAgY29uc3Qgc2VsZWN0ZWRTb2xpZCA9IHRoaXMuX3RyYW5zZm9ybVNlc3Npb24/LnNvbGlkIHx8IG51bGw7CiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlOwogICAgaWYgKHRoaXMuX2lzUGxheWluZykgewogICAgICBjaGFuZ2VkID0gdGhpcy5fYXBwbHlNb3Rpb25TdGVwKGR0KSB8fCBjaGFuZ2VkOwogICAgfQogICAgaWYgKHNlbGVjdGVkU29saWQpIHsKICAgICAgY29uc3QgYm9keVN0YXRlID0gdGhpcy5fYm9keVN0YXRlLmdldChzZWxlY3RlZFNvbGlkLnV1aWQpOwogICAgICBpZiAoYm9keVN0YXRlPy5ib2R5KSB7CiAgICAgICAgY29uc3Qgd29ybGRQb3NpdGlvbiA9IHNlbGVjdGVkU29saWQuZ2V0V29ybGRQb3NpdGlvbihuZXcgVEhSRUUuVmVjdG9yMygpKTsKICAgICAgICBjb25zdCB3b3JsZFF1YXRlcm5pb24gPSBzZWxlY3RlZFNvbGlkLmdldFdvcmxkUXVhdGVybmlvbihuZXcgVEhSRUUuUXVhdGVybmlvbigpKTsKICAgICAgICBib2R5U3RhdGUuYm9keS5zZXROZXh0S2luZW1hdGljVHJhbnNsYXRpb24od29ybGRQb3NpdGlvbik7CiAgICAgICAgYm9keVN0YXRlLmJvZHkuc2V0TmV4dEtpbmVtYXRpY1JvdGF0aW9uKHdvcmxkUXVhdGVybmlvbik7CiAgICAgIH0KICAgIH0KICAgIHdvcmxkLnN0ZXAoKTsKICAgIGZvciAoY29uc3QgYm9keVN0YXRlIG9mIHRoaXMuX2JvZHlTdGF0ZS52YWx1ZXMoKSkgewogICAgICBjb25zdCB7IHNvbGlkLCBib2R5IH0gPSBib2R5U3RhdGU7CiAgICAgIGlmICghc29saWQgfHwgIWJvZHkpIGNvbnRpbnVlOwogICAgICBpZiAoc2VsZWN0ZWRTb2xpZCAmJiBzb2xpZCA9PT0gc2VsZWN0ZWRTb2xpZCkgewogICAgICAgIHRoaXMuX3N5bmNQcm94eUdyb3VwVHJhbnNmb3JtKHNvbGlkKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAodGhpcy5nZXRTb2xpZEZpeGVkKHNvbGlkKSkgewogICAgICAgIHRoaXMuX3N5bmNQcm94eUdyb3VwVHJhbnNmb3JtKHNvbGlkKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IGJvZHkudHJhbnNsYXRpb24oKTsKICAgICAgY29uc3Qgcm90YXRpb24gPSBib2R5LnJvdGF0aW9uKCk7CiAgICAgIGlmICghdHJhbnNsYXRpb24gfHwgIXJvdGF0aW9uKSBjb250aW51ZTsKICAgICAgdGhpcy5fc2V0U29saWRXb3JsZFBvc2Uoc29saWQsIHRyYW5zbGF0aW9uLCByb3RhdGlvbik7CiAgICAgIHRoaXMuX3VwZGF0ZVJ1bnRpbWVUcmFuc2Zvcm1Gcm9tU29saWQoc29saWQsIHsgcGVyc2lzdDogZmFsc2UgfSk7CiAgICAgIHRoaXMuX21vdmVkU29saWRJZHMuYWRkKHNvbGlkLnV1aWQpOwogICAgICBjaGFuZ2VkID0gdHJ1ZTsKICAgIH0KICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgIHRyeSB7IHRoaXMudmlld2VyPy5yZW5kZXI/LigpOyB9IGNhdGNoIHt9CiAgICB9CiAgfQoKICBfc2V0U29saWRXb3JsZFBvc2Uoc29saWQsIHRyYW5zbGF0aW9uLCByb3RhdGlvbikgewogICAgY29uc3QgcGFyZW50ID0gc29saWQucGFyZW50IHx8IHRoaXMudmlld2VyPy5zY2VuZSB8fCBudWxsOwogICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuX3NjcmF0Y2g7CiAgICBzY3JhdGNoLndvcmxkUG9zaXRpb24uc2V0KHRyYW5zbGF0aW9uLngsIHRyYW5zbGF0aW9uLnksIHRyYW5zbGF0aW9uLnopOwogICAgc2NyYXRjaC53b3JsZFF1YXRlcm5pb24uc2V0KHJvdGF0aW9uLngsIHJvdGF0aW9uLnksIHJvdGF0aW9uLnosIHJvdGF0aW9uLncpOwogICAgaWYgKHBhcmVudD8uaXNPYmplY3QzRCkgewogICAgICBwYXJlbnQudXBkYXRlTWF0cml4V29ybGQ/Lih0cnVlKTsKICAgICAgc2NyYXRjaC5wYXJlbnRJbnZlcnNlLmNvcHkocGFyZW50Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKTsKICAgICAgcGFyZW50LmdldFdvcmxkUXVhdGVybmlvbihzY3JhdGNoLnBhcmVudFF1YXRlcm5pb24pOwogICAgICBzY3JhdGNoLnBhcmVudFF1YXRlcm5pb25JbnZlcnNlLmNvcHkoc2NyYXRjaC5wYXJlbnRRdWF0ZXJuaW9uKS5pbnZlcnQoKTsKICAgICAgc2NyYXRjaC5sb2NhbFBvc2l0aW9uLmNvcHkoc2NyYXRjaC53b3JsZFBvc2l0aW9uKS5hcHBseU1hdHJpeDQoc2NyYXRjaC5wYXJlbnRJbnZlcnNlKTsKICAgICAgc29saWQucG9zaXRpb24uY29weShzY3JhdGNoLmxvY2FsUG9zaXRpb24pOwogICAgICBzb2xpZC5xdWF0ZXJuaW9uLmNvcHkoc2NyYXRjaC5wYXJlbnRRdWF0ZXJuaW9uSW52ZXJzZS5tdWx0aXBseShzY3JhdGNoLndvcmxkUXVhdGVybmlvbikpOwogICAgfSBlbHNlIHsKICAgICAgc29saWQucG9zaXRpb24uY29weShzY3JhdGNoLndvcmxkUG9zaXRpb24pOwogICAgICBzb2xpZC5xdWF0ZXJuaW9uLmNvcHkoc2NyYXRjaC53b3JsZFF1YXRlcm5pb24pOwogICAgfQogICAgc29saWQudXBkYXRlTWF0cml4V29ybGQ/Lih0cnVlKTsKICAgIHRoaXMuX3N5bmNQcm94eUdyb3VwVHJhbnNmb3JtKHNvbGlkKTsKICB9CgogIF9zdGFydFRyYW5zZm9ybVNlc3Npb24oc29saWQpIHsKICAgIGlmICghc29saWQgfHwgIXRoaXMuX2FjdGl2ZSkgcmV0dXJuOwogICAgdGhpcy5fc3RvcFRyYW5zZm9ybVNlc3Npb24oKTsKICAgIGNvbnN0IGNvbnRyb2xzID0gbmV3IENvbWJpbmVkVHJhbnNmb3JtQ29udHJvbHModGhpcy52aWV3ZXIuY2FtZXJhLCB0aGlzLnZpZXdlci5yZW5kZXJlcj8uZG9tRWxlbWVudCk7CiAgICB0cnkgeyBjb250cm9scy5zZXRNb2RlKCd0cmFuc2xhdGUnKTsgfSBjYXRjaCB7IGNvbnRyb2xzLm1vZGUgPSAndHJhbnNsYXRlJzsgfQogICAgY29uc3QgdGFyZ2V0ID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7CiAgICB0YXJnZXQubmFtZSA9IGBTaW11bGF0aW9uVHJhbnNmb3JtVGFyZ2V0OiR7c29saWQubmFtZSB8fCBzb2xpZC51dWlkIHx8ICcnfWA7CiAgICB0aGlzLnZpZXdlci5zY2VuZS51cGRhdGVNYXRyaXhXb3JsZD8uKHRydWUpOwogICAgc29saWQudXBkYXRlTWF0cml4V29ybGQ/Lih0cnVlKTsKICAgIGNvbnN0IGJveCA9IHRoaXMuX3NjcmF0Y2guYm94OwogICAgY29uc3QgY2VudGVyID0gYm94LnNldEZyb21PYmplY3QodGhpcy5fcHJveHlHcm91cHMuZ2V0KHNvbGlkLnV1aWQpIHx8IHNvbGlkKS5pc0VtcHR5KCkKICAgICAgPyBzb2xpZC5nZXRXb3JsZFBvc2l0aW9uKHRoaXMuX3NjcmF0Y2guY2VudGVyKQogICAgICA6IGJveC5nZXRDZW50ZXIodGhpcy5fc2NyYXRjaC5jZW50ZXIpOwogICAgY29uc3Qgd29ybGRQb3NpdGlvbiA9IHNvbGlkLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSk7CiAgICBjb25zdCB3b3JsZFF1YXRlcm5pb24gPSBzb2xpZC5nZXRXb3JsZFF1YXRlcm5pb24obmV3IFRIUkVFLlF1YXRlcm5pb24oKSk7CiAgICBjb25zdCBvZmZzZXRMb2NhbCA9IHdvcmxkUG9zaXRpb24uY2xvbmUoKS5zdWIoY2VudGVyKS5hcHBseVF1YXRlcm5pb24od29ybGRRdWF0ZXJuaW9uLmNsb25lKCkuaW52ZXJ0KCkpOwogICAgdGFyZ2V0LnBvc2l0aW9uLmNvcHkoY2VudGVyKTsKICAgIHRhcmdldC5xdWF0ZXJuaW9uLmNvcHkod29ybGRRdWF0ZXJuaW9uKTsKICAgIHRoaXMudmlld2VyLnNjZW5lLmFkZCh0YXJnZXQpOwogICAgY29udHJvbHMuYXR0YWNoKHRhcmdldCk7CiAgICB0aGlzLnZpZXdlci5zY2VuZS5hZGQoY29udHJvbHMpOwoKICAgIGNvbnN0IGFwcGx5VG9Tb2xpZCA9IChwZXJzaXN0ID0gZmFsc2UpID0+IHsKICAgICAgY29uc3QgdGFyZ2V0V29ybGRQb3NpdGlvbiA9IHRhcmdldC5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpOwogICAgICBjb25zdCB0YXJnZXRXb3JsZFF1YXRlcm5pb24gPSB0YXJnZXQuZ2V0V29ybGRRdWF0ZXJuaW9uKG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkpOwogICAgICBjb25zdCBzb2xpZFdvcmxkUG9zaXRpb24gPSB0YXJnZXRXb3JsZFBvc2l0aW9uLmNsb25lKCkuYWRkKG9mZnNldExvY2FsLmNsb25lKCkuYXBwbHlRdWF0ZXJuaW9uKHRhcmdldFdvcmxkUXVhdGVybmlvbikpOwogICAgICB0aGlzLl9zZXRTb2xpZFdvcmxkUG9zZShzb2xpZCwgc29saWRXb3JsZFBvc2l0aW9uLCB0YXJnZXRXb3JsZFF1YXRlcm5pb24pOwogICAgICB0aGlzLl91cGRhdGVSdW50aW1lVHJhbnNmb3JtRnJvbVNvbGlkKHNvbGlkLCB7IHBlcnNpc3QgfSk7CiAgICAgIGlmIChwZXJzaXN0KSB7CiAgICAgICAgaWYgKHRoaXMuX3BoeXNpY3NXb3JsZCkgewogICAgICAgICAgdm9pZCB0aGlzLl9yZWJ1aWxkUGh5c2ljc1dvcmxkKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRyeSB7IHRoaXMudmlld2VyPy5yZW5kZXI/LigpOyB9IGNhdGNoIHt9CiAgICB9OwoKICAgIGNvbnN0IGNoYW5nZUhhbmRsZXIgPSAoKSA9PiBhcHBseVRvU29saWQoZmFsc2UpOwogICAgY29uc3QgZHJhZ0hhbmRsZXIgPSAoZXZlbnQpID0+IHsKICAgICAgY29uc3QgZHJhZ2dpbmcgPSAhIWV2ZW50Py52YWx1ZTsKICAgICAgdHJ5IHsgaWYgKHRoaXMudmlld2VyPy5jb250cm9scykgdGhpcy52aWV3ZXIuY29udHJvbHMuZW5hYmxlZCA9ICFkcmFnZ2luZzsgfSBjYXRjaCB7fQogICAgICBpZiAoIWRyYWdnaW5nKSBhcHBseVRvU29saWQodHJ1ZSk7CiAgICB9OwogICAgY29uc3Qgb2JqZWN0Q2hhbmdlSGFuZGxlciA9ICgpID0+IHsKICAgICAgaWYgKCFjb250cm9scy5kcmFnZ2luZykgYXBwbHlUb1NvbGlkKHRydWUpOwogICAgfTsKICAgIGNvbnN0IHVwZGF0ZUZvckNhbWVyYSA9ICgpID0+IHsKICAgICAgdHJ5IHsgY29udHJvbHMudXBkYXRlPy4oKTsgfSBjYXRjaCB7fQogICAgfTsKICAgIGNvbnN0IGNhbWVyYUNoYW5nZUhhbmRsZXIgPSAoKSA9PiB1cGRhdGVGb3JDYW1lcmEoKTsKICAgIGNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNoYW5nZUhhbmRsZXIpOwogICAgY29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2dpbmctY2hhbmdlZCcsIGRyYWdIYW5kbGVyKTsKICAgIGNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ29iamVjdENoYW5nZScsIG9iamVjdENoYW5nZUhhbmRsZXIpOwogICAgdHJ5IHsgdGhpcy52aWV3ZXI/LmNvbnRyb2xzPy5hZGRFdmVudExpc3RlbmVyPy4oJ2NoYW5nZScsIGNhbWVyYUNoYW5nZUhhbmRsZXIpOyB9IGNhdGNoIHt9CgogICAgY29uc3QgZ2xvYmFsU3RhdGUgPSB7IGNvbnRyb2xzLCB2aWV3ZXI6IHRoaXMudmlld2VyLCB0YXJnZXQsIHVwZGF0ZUZvckNhbWVyYSB9OwogICAgdHJ5IHsgd2luZG93Ll9fQlJFUF9hY3RpdmVYZm9ybSA9IGdsb2JhbFN0YXRlOyB9IGNhdGNoIHt9CiAgICB0aGlzLl90cmFuc2Zvcm1TZXNzaW9uID0gewogICAgICBzb2xpZCwKICAgICAgY29udHJvbHMsCiAgICAgIHRhcmdldCwKICAgICAgY2hhbmdlSGFuZGxlciwKICAgICAgZHJhZ0hhbmRsZXIsCiAgICAgIG9iamVjdENoYW5nZUhhbmRsZXIsCiAgICAgIGNhbWVyYUNoYW5nZUhhbmRsZXIsCiAgICAgIGdsb2JhbFN0YXRlLAogICAgICBtb2RlOiAndHJhbnNsYXRlJywKICAgIH07CiAgICBpZiAodGhpcy5fcGh5c2ljc1dvcmxkKSB7CiAgICAgIHZvaWQgdGhpcy5fcmVidWlsZFBoeXNpY3NXb3JsZCgpOwogICAgfQogICAgdXBkYXRlRm9yQ2FtZXJhKCk7CiAgICBhcHBseVRvU29saWQoZmFsc2UpOwogIH0KCiAgX3N0b3BUcmFuc2Zvcm1TZXNzaW9uKCkgewogICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuX3RyYW5zZm9ybVNlc3Npb247CiAgICBpZiAoIXNlc3Npb24pIHJldHVybjsKICAgIHRyeSB7IHNlc3Npb24uY29udHJvbHM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHNlc3Npb24uY2hhbmdlSGFuZGxlcik7IH0gY2F0Y2gge30KICAgIHRyeSB7IHNlc3Npb24uY29udHJvbHM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdnaW5nLWNoYW5nZWQnLCBzZXNzaW9uLmRyYWdIYW5kbGVyKTsgfSBjYXRjaCB7fQogICAgdHJ5IHsgc2Vzc2lvbi5jb250cm9scz8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignb2JqZWN0Q2hhbmdlJywgc2Vzc2lvbi5vYmplY3RDaGFuZ2VIYW5kbGVyKTsgfSBjYXRjaCB7fQogICAgdHJ5IHsgdGhpcy52aWV3ZXI/LmNvbnRyb2xzPy5yZW1vdmVFdmVudExpc3RlbmVyPy4oJ2NoYW5nZScsIHNlc3Npb24uY2FtZXJhQ2hhbmdlSGFuZGxlcik7IH0gY2F0Y2gge30KICAgIHRyeSB7IHNlc3Npb24uY29udHJvbHM/LmRldGFjaD8uKCk7IH0gY2F0Y2gge30KICAgIHRyeSB7IHRoaXMudmlld2VyPy5zY2VuZT8ucmVtb3ZlPy4oc2Vzc2lvbi5jb250cm9scyk7IH0gY2F0Y2gge30KICAgIHRyeSB7IHRoaXMudmlld2VyPy5zY2VuZT8ucmVtb3ZlPy4oc2Vzc2lvbi50YXJnZXQpOyB9IGNhdGNoIHt9CiAgICB0cnkgeyBzZXNzaW9uLmNvbnRyb2xzPy5kaXNwb3NlPy4oKTsgfSBjYXRjaCB7fQogICAgdHJ5IHsKICAgICAgaWYgKHdpbmRvdy5fX0JSRVBfYWN0aXZlWGZvcm0gPT09IHNlc3Npb24uZ2xvYmFsU3RhdGUpIHsKICAgICAgICB3aW5kb3cuX19CUkVQX2FjdGl2ZVhmb3JtID0gbnVsbDsKICAgICAgfQogICAgfSBjYXRjaCB7fQogICAgdGhpcy5fdHJhbnNmb3JtU2Vzc2lvbiA9IG51bGw7CiAgICB0cnkgeyBpZiAodGhpcy52aWV3ZXI/LmNvbnRyb2xzKSB0aGlzLnZpZXdlci5jb250cm9scy5lbmFibGVkID0gdHJ1ZTsgfSBjYXRjaCB7fQogICAgaWYgKHRoaXMuX3BoeXNpY3NXb3JsZCkgewogICAgICB2b2lkIHRoaXMuX3JlYnVpbGRQaHlzaWNzV29ybGQoKTsKICAgIH0KICAgIHRyeSB7IHRoaXMudmlld2VyPy5yZW5kZXI/LigpOyB9IGNhdGNoIHt9CiAgfQoKICBfbGlzdFNjZW5lU29saWRzKCkgewogICAgY29uc3Qgc2NlbmUgPSB0aGlzLnZpZXdlcj8ucGFydEhpc3Rvcnk/LnNjZW5lIHx8IHRoaXMudmlld2VyPy5zY2VuZSB8fCBudWxsOwogICAgY29uc3Qgc29saWRzID0gW107CiAgICBpZiAoIXNjZW5lPy50cmF2ZXJzZSkgcmV0dXJuIHNvbGlkczsKICAgIHNjZW5lLnRyYXZlcnNlKChvYmopID0+IHsKICAgICAgaWYgKG9iaj8udHlwZSA9PT0gJ1NPTElEJykgc29saWRzLnB1c2gob2JqKTsKICAgIH0pOwogICAgcmV0dXJuIHNvbGlkczsKICB9CgogIF9iaW5kU3RhdGVNYW5hZ2VyKCkgewogICAgY29uc3QgbWFuYWdlciA9IHRoaXMudmlld2VyPy5wYXJ0SGlzdG9yeT8uc2ltdWxhdGlvblN0YXRlTWFuYWdlcjsKICAgIGlmICghbWFuYWdlcj8uYWRkTGlzdGVuZXIpIHJldHVybjsKICAgIHRoaXMuX3JlbW92ZVN0YXRlTWFuYWdlckxpc3RlbmVyID0gbWFuYWdlci5hZGRMaXN0ZW5lcigoKSA9PiB7CiAgICAgIHRoaXMuX3JlY29uY2lsZU1vdGlvblN0YXRlKCk7CiAgICAgIGlmICh0aGlzLl9hY3RpdmUgJiYgdGhpcy5fcGh5c2ljc1dvcmxkKSB7CiAgICAgICAgdm9pZCB0aGlzLl9yZWJ1aWxkUGh5c2ljc1dvcmxkKCk7CiAgICAgIH0KICAgICAgdGhpcy5fZW1pdCgpOwogICAgfSk7CiAgfQoKICBfZW1pdCgpIHsKICAgIGlmICghdGhpcy5fbGlzdGVuZXJzIHx8IHRoaXMuX2xpc3RlbmVycy5zaXplID09PSAwKSByZXR1cm47CiAgICBjb25zdCBwYXlsb2FkID0gewogICAgICBhY3RpdmU6IHRoaXMuX2FjdGl2ZSwKICAgICAgcGxheWluZzogdGhpcy5faXNQbGF5aW5nLAogICAgICBtYW5hZ2VyOiB0aGlzLAogICAgfTsKICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgQXJyYXkuZnJvbSh0aGlzLl9saXN0ZW5lcnMpKSB7CiAgICAgIHRyeSB7IGxpc3RlbmVyKHBheWxvYWQpOyB9IGNhdGNoIHt9CiAgICB9CiAgfQoKICBfZ2V0TW90aW9uRW50cmllcygpIHsKICAgIGNvbnN0IG1vdGlvbnMgPSB0aGlzLnZpZXdlcj8ucGFydEhpc3Rvcnk/LnNpbXVsYXRpb25TdGF0ZU1hbmFnZXI/LmdldE1vdGlvbnM/LigpOwogICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobW90aW9ucykKICAgICAgPyBtb3Rpb25zLm1hcCgoZW50cnkpID0+IChlbnRyeT8uaW5wdXRQYXJhbXMgJiYgdHlwZW9mIGVudHJ5LmlucHV0UGFyYW1zID09PSAnb2JqZWN0JykgPyBlbnRyeS5pbnB1dFBhcmFtcyA6IGVudHJ5KS5maWx0ZXIoQm9vbGVhbikKICAgICAgOiBbXTsKICB9CgogIF9yZXNldE1vdGlvblJ1bnRpbWUoKSB7CiAgICB0aGlzLl9tb3Rpb25TdGF0ZS5jbGVhcigpOwogICAgZm9yIChjb25zdCBtb3Rpb24gb2YgdGhpcy5fZ2V0TW90aW9uRW50cmllcygpKSB7CiAgICAgIHRoaXMuX21vdGlvblN0YXRlLnNldChtb3Rpb24uaWQsIHsgcHJvZ3Jlc3M6IDAsIGNvbXBsZXRlZDogZmFsc2UgfSk7CiAgICB9CiAgfQoKICBfcmVjb25jaWxlTW90aW9uU3RhdGUoKSB7CiAgICBjb25zdCBhY3RpdmVJZHMgPSBuZXcgU2V0KCk7CiAgICBmb3IgKGNvbnN0IG1vdGlvbiBvZiB0aGlzLl9nZXRNb3Rpb25FbnRyaWVzKCkpIHsKICAgICAgYWN0aXZlSWRzLmFkZChtb3Rpb24uaWQpOwogICAgICBpZiAoIXRoaXMuX21vdGlvblN0YXRlLmhhcyhtb3Rpb24uaWQpKSB7CiAgICAgICAgdGhpcy5fbW90aW9uU3RhdGUuc2V0KG1vdGlvbi5pZCwgeyBwcm9ncmVzczogMCwgY29tcGxldGVkOiBmYWxzZSB9KTsKICAgICAgfQogICAgfQogICAgZm9yIChjb25zdCBpZCBvZiBBcnJheS5mcm9tKHRoaXMuX21vdGlvblN0YXRlLmtleXMoKSkpIHsKICAgICAgaWYgKCFhY3RpdmVJZHMuaGFzKGlkKSkgdGhpcy5fbW90aW9uU3RhdGUuZGVsZXRlKGlkKTsKICAgIH0KICB9CgogIF9pc1NvbGlkTW90aW9uRHJpdmVuKHNvbGlkKSB7CiAgICBpZiAoIXNvbGlkIHx8ICF0aGlzLl9pc1BsYXlpbmcpIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IG5hbWUgPSBub3JtYWxpemVUZXh0KHNvbGlkLm5hbWUsICcnKTsKICAgIGlmICghbmFtZSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRoaXMuX2dldE1vdGlvbkVudHJpZXMoKS5zb21lKChtb3Rpb24pID0+IG5vcm1hbGl6ZVRleHQodGhpcy5fcmVzb2x2ZVJlZmVyZW5jZU5hbWUobW90aW9uPy5zb2xpZCksICcnKSA9PT0gbmFtZSk7CiAgfQoKICBfaXNTb2xpZEtpbmVtYXRpY01vdGlvbkRyaXZlbihzb2xpZCkgewogICAgcmV0dXJuICEhc29saWQgJiYgdGhpcy5nZXRTb2xpZEZpeGVkKHNvbGlkKSAmJiB0aGlzLl9pc1NvbGlkTW90aW9uRHJpdmVuKHNvbGlkKTsKICB9CgogIF9hcHBseU1vdGlvblN0ZXAoZHQpIHsKICAgIGNvbnN0IHNlbGVjdGVkU29saWQgPSB0aGlzLl90cmFuc2Zvcm1TZXNzaW9uPy5zb2xpZCB8fCBudWxsOwogICAgY29uc3QgY29tbWFuZHMgPSBuZXcgTWFwKCk7CiAgICBmb3IgKGNvbnN0IHNvbGlkIG9mIHRoaXMuX2xpc3RTY2VuZVNvbGlkcygpKSB7CiAgICAgIGlmICghdGhpcy5faXNTb2xpZE1vdGlvbkRyaXZlbihzb2xpZCkpIGNvbnRpbnVlOwogICAgICBpZiAoc2VsZWN0ZWRTb2xpZCAmJiBzb2xpZCA9PT0gc2VsZWN0ZWRTb2xpZCkgY29udGludWU7CiAgICAgIGlmICh0aGlzLl9pc1NvbGlkS2luZW1hdGljTW90aW9uRHJpdmVuKHNvbGlkKSkgY29udGludWU7CiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLl9ib2R5U3RhdGUuZ2V0KHNvbGlkLnV1aWQpPy5ib2R5OwogICAgICBpZiAoIWJvZHkpIGNvbnRpbnVlOwogICAgICBib2R5LnNldExpbnZlbCh7IHg6IDAsIHk6IDAsIHo6IDAgfSwgdHJ1ZSk7CiAgICAgIGJvZHkuc2V0QW5ndmVsKHsgeDogMCwgeTogMCwgejogMCB9LCB0cnVlKTsKICAgIH0KICAgIGZvciAoY29uc3QgbW90aW9uIG9mIHRoaXMuX2dldE1vdGlvbkVudHJpZXMoKSkgewogICAgICBjb25zdCBzb2xpZCA9IHRoaXMuX3Jlc29sdmVNb3Rpb25Tb2xpZChtb3Rpb24pOwogICAgICBpZiAoIXNvbGlkKSBjb250aW51ZTsKICAgICAgaWYgKHNlbGVjdGVkU29saWQgJiYgc29saWQgPT09IHNlbGVjdGVkU29saWQpIGNvbnRpbnVlOwogICAgICBpZiAobW90aW9uLnR5cGUgPT09ICdsaW5lYXInKSB0aGlzLl9hcHBseUxpbmVhck1vdGlvblN0ZXAoc29saWQsIG1vdGlvbiwgZHQsIGNvbW1hbmRzKTsKICAgICAgZWxzZSB0aGlzLl9hcHBseVJvdGF0aW9uTW90aW9uU3RlcChzb2xpZCwgbW90aW9uLCBkdCwgY29tbWFuZHMpOwogICAgfQogICAgZm9yIChjb25zdCBbc29saWRVdWlkLCBjb21tYW5kXSBvZiBjb21tYW5kcy5lbnRyaWVzKCkpIHsKICAgICAgY29uc3QgYm9keSA9IHRoaXMuX2JvZHlTdGF0ZS5nZXQoc29saWRVdWlkKT8uYm9keTsKICAgICAgaWYgKCFib2R5KSBjb250aW51ZTsKICAgICAgYm9keS5zZXRMaW52ZWwoY29tbWFuZC5saW5lYXIsIHRydWUpOwogICAgICBib2R5LnNldEFuZ3ZlbChjb21tYW5kLmFuZ3VsYXIsIHRydWUpOwogICAgfQogICAgcmV0dXJuIGNvbW1hbmRzLnNpemUgPiAwOwogIH0KCiAgX3Jlc29sdmVNb3Rpb25Tb2xpZChtb3Rpb24pIHsKICAgIGNvbnN0IG5hbWUgPSBub3JtYWxpemVUZXh0KHRoaXMuX3Jlc29sdmVSZWZlcmVuY2VOYW1lKG1vdGlvbj8uc29saWQpLCAnJyk7CiAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsOwogICAgY29uc3Qgb2JqZWN0ID0gdGhpcy52aWV3ZXI/LnBhcnRIaXN0b3J5Py5nZXRPYmplY3RCeU5hbWU/LihuYW1lKSB8fCBudWxsOwogICAgcmV0dXJuIG9iamVjdD8udHlwZSA9PT0gJ1NPTElEJyA/IG9iamVjdCA6IG51bGw7CiAgfQoKICBfcmVzb2x2ZU1vdGlvbkF4aXMobW90aW9uKSB7CiAgICBjb25zdCBvYmplY3ROYW1lID0gbm9ybWFsaXplVGV4dCh0aGlzLl9yZXNvbHZlUmVmZXJlbmNlTmFtZShtb3Rpb24/LmF4aXMpLCAnJyk7CiAgICBjb25zdCBvYmplY3QgPSBvYmplY3ROYW1lID8gdGhpcy52aWV3ZXI/LnBhcnRIaXN0b3J5Py5nZXRPYmplY3RCeU5hbWU/LihvYmplY3ROYW1lKSA6IG51bGw7CiAgICBpZiAoIW9iamVjdCkgcmV0dXJuIG51bGw7CiAgICBjb25zdCBsaXZlID0gdGhpcy5fZXh0cmFjdEF4aXNQb2ludHNGcm9tT2JqZWN0KG9iamVjdCk7CiAgICBpZiAoIWxpdmU/LnN0YXJ0IHx8ICFsaXZlPy5lbmQpIHJldHVybiBudWxsOwogICAgY29uc3Qgc3RhcnRWZWMgPSBuZXcgVEhSRUUuVmVjdG9yMyhOdW1iZXIobGl2ZS5zdGFydFswXSkgfHwgMCwgTnVtYmVyKGxpdmUuc3RhcnRbMV0pIHx8IDAsIE51bWJlcihsaXZlLnN0YXJ0WzJdKSB8fCAwKTsKICAgIGNvbnN0IGVuZFZlYyA9IG5ldyBUSFJFRS5WZWN0b3IzKE51bWJlcihsaXZlLmVuZFswXSkgfHwgMCwgTnVtYmVyKGxpdmUuZW5kWzFdKSB8fCAwLCBOdW1iZXIobGl2ZS5lbmRbMl0pIHx8IDApOwogICAgaWYgKHN0YXJ0VmVjLmRpc3RhbmNlVG9TcXVhcmVkKGVuZFZlYykgPD0gMWUtMTIpIHJldHVybiBudWxsOwogICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0VmVjLCBlbmQ6IGVuZFZlYyB9OwogIH0KCiAgX3Jlc29sdmVSZWZlcmVuY2VOYW1lKHZhbHVlKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVSZWZlcmVuY2VOYW1lKHZhbHVlWzBdIHx8IG51bGwpOwogICAgfQogICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHsKICAgICAgcmV0dXJuIG5vcm1hbGl6ZVRleHQodmFsdWUubmFtZSB8fCB2YWx1ZS5vYmplY3ROYW1lIHx8IHZhbHVlLmxhYmVsIHx8ICcnLCAnJyk7CiAgICB9CiAgICByZXR1cm4gbm9ybWFsaXplVGV4dCh2YWx1ZSwgJycpOwogIH0KCiAgX2V4dHJhY3RBeGlzUG9pbnRzRnJvbU9iamVjdChvYmplY3QpIHsKICAgIGlmICghb2JqZWN0KSByZXR1cm4gbnVsbDsKICAgIHRyeSB7CiAgICAgIGlmICh0eXBlb2Ygb2JqZWN0LnBvaW50cyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIGNvbnN0IHBvaW50cyA9IG9iamVjdC5wb2ludHModHJ1ZSk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocG9pbnRzKSAmJiBwb2ludHMubGVuZ3RoID49IDIpIHsKICAgICAgICAgIGNvbnN0IGZpcnN0ID0gcG9pbnRzWzBdOwogICAgICAgICAgY29uc3QgbGFzdCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzdGFydDogW051bWJlcihmaXJzdD8ueCkgfHwgMCwgTnVtYmVyKGZpcnN0Py55KSB8fCAwLCBOdW1iZXIoZmlyc3Q/LnopIHx8IDBdLAogICAgICAgICAgICBlbmQ6IFtOdW1iZXIobGFzdD8ueCkgfHwgMCwgTnVtYmVyKGxhc3Q/LnkpIHx8IDAsIE51bWJlcihsYXN0Py56KSB8fCAwXSwKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIHt9CiAgICB0cnkgewogICAgICBvYmplY3QudXBkYXRlTWF0cml4V29ybGQ/Lih0cnVlKTsKICAgICAgY29uc3QgYXR0ciA9IG9iamVjdC5nZW9tZXRyeT8uZ2V0QXR0cmlidXRlPy4oJ3Bvc2l0aW9uJyk7CiAgICAgIGlmICghYXR0ciB8fCBhdHRyLmNvdW50IDwgMikgcmV0dXJuIG51bGw7CiAgICAgIGNvbnN0IGZpcnN0ID0gbmV3IFRIUkVFLlZlY3RvcjMoYXR0ci5nZXRYKDApLCBhdHRyLmdldFkoMCksIGF0dHIuZ2V0WigwKSkuYXBwbHlNYXRyaXg0KG9iamVjdC5tYXRyaXhXb3JsZCk7CiAgICAgIGNvbnN0IGxhc3RJbmRleCA9IGF0dHIuY291bnQgLSAxOwogICAgICBjb25zdCBsYXN0ID0gbmV3IFRIUkVFLlZlY3RvcjMoYXR0ci5nZXRYKGxhc3RJbmRleCksIGF0dHIuZ2V0WShsYXN0SW5kZXgpLCBhdHRyLmdldFoobGFzdEluZGV4KSkuYXBwbHlNYXRyaXg0KG9iamVjdC5tYXRyaXhXb3JsZCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgc3RhcnQ6IFtmaXJzdC54LCBmaXJzdC55LCBmaXJzdC56XSwKICAgICAgICBlbmQ6IFtsYXN0LngsIGxhc3QueSwgbGFzdC56XSwKICAgICAgfTsKICAgIH0gY2F0Y2ggewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIF9nZXRNb3Rpb25Db21tYW5kKGNvbW1hbmRzLCBzb2xpZCkgewogICAgaWYgKCFzb2xpZD8udXVpZCkgcmV0dXJuIG51bGw7CiAgICBsZXQgY29tbWFuZCA9IGNvbW1hbmRzLmdldChzb2xpZC51dWlkKTsKICAgIGlmICghY29tbWFuZCkgewogICAgICBjb21tYW5kID0gewogICAgICAgIGxpbmVhcjogeyB4OiAwLCB5OiAwLCB6OiAwIH0sCiAgICAgICAgYW5ndWxhcjogeyB4OiAwLCB5OiAwLCB6OiAwIH0sCiAgICAgIH07CiAgICAgIGNvbW1hbmRzLnNldChzb2xpZC51dWlkLCBjb21tYW5kKTsKICAgIH0KICAgIHJldHVybiBjb21tYW5kOwogIH0KCiAgX2FwcGx5Um90YXRpb25Nb3Rpb25TdGVwKHNvbGlkLCBtb3Rpb24sIGR0LCBjb21tYW5kcykgewogICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9tb3Rpb25TdGF0ZS5nZXQobW90aW9uLmlkKSB8fCB7IHByb2dyZXNzOiAwLCBjb21wbGV0ZWQ6IGZhbHNlIH07CiAgICBpZiAoc3RhdGUuY29tcGxldGVkKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBheGlzID0gdGhpcy5fcmVzb2x2ZU1vdGlvbkF4aXMobW90aW9uKTsKICAgIGlmICghYXhpcykgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgYm9keSA9IHRoaXMuX2JvZHlTdGF0ZS5nZXQoc29saWQudXVpZCk/LmJvZHkgfHwgbnVsbDsKICAgIGlmICghYm9keSkgcmV0dXJuIGZhbHNlOwogICAgY29uc3Qgc3BlZWREZWcgPSBOdW1iZXIobW90aW9uPy5zcGVlZCk7CiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShzcGVlZERlZykgfHwgTWF0aC5hYnMoc3BlZWREZWcpIDw9IDFlLTkpIHJldHVybiBmYWxzZTsKICAgIGxldCBkZWx0YURlZyA9IHNwZWVkRGVnICogZHQ7CiAgICBjb25zdCBsaW1pdERlZyA9IG5vcm1hbGl6ZU9wdGlvbmFsTW90aW9uTGltaXQobW90aW9uPy5hbmdsZSk7CiAgICBpZiAobGltaXREZWcgIT0gbnVsbCkgewogICAgICBjb25zdCByZW1haW5pbmcgPSBsaW1pdERlZyAtIHN0YXRlLnByb2dyZXNzOwogICAgICBpZiAoTWF0aC5hYnMocmVtYWluaW5nKSA8PSAxZS05KSB7CiAgICAgICAgc3RhdGUuY29tcGxldGVkID0gdHJ1ZTsKICAgICAgICB0aGlzLl9tb3Rpb25TdGF0ZS5zZXQobW90aW9uLmlkLCBzdGF0ZSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmIChNYXRoLnNpZ24oZGVsdGFEZWcgfHwgMSkgIT09IE1hdGguc2lnbihyZW1haW5pbmcgfHwgMSkpIHsKICAgICAgICBkZWx0YURlZyA9IE1hdGguc2lnbihyZW1haW5pbmcgfHwgMSkgKiBNYXRoLmFicyhkZWx0YURlZyk7CiAgICAgIH0KICAgICAgaWYgKE1hdGguYWJzKGRlbHRhRGVnKSA+IE1hdGguYWJzKHJlbWFpbmluZykpIGRlbHRhRGVnID0gcmVtYWluaW5nOwogICAgfQogICAgaWYgKE1hdGguYWJzKGRlbHRhRGVnKSA8PSAxZS05KSByZXR1cm4gZmFsc2U7CiAgICBpZiAodGhpcy5faXNTb2xpZEtpbmVtYXRpY01vdGlvbkRyaXZlbihzb2xpZCkpIHsKICAgICAgdGhpcy5fcm90YXRlU29saWRBcm91bmRXb3JsZEF4aXMoc29saWQsIGF4aXMuc3RhcnQsIGF4aXMuZW5kLCBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoZGVsdGFEZWcpKTsKICAgICAgY29uc3Qgd29ybGRQb3NpdGlvbiA9IHNvbGlkLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSk7CiAgICAgIGNvbnN0IHdvcmxkUXVhdGVybmlvbiA9IHNvbGlkLmdldFdvcmxkUXVhdGVybmlvbihuZXcgVEhSRUUuUXVhdGVybmlvbigpKTsKICAgICAgYm9keS5zZXROZXh0S2luZW1hdGljVHJhbnNsYXRpb24od29ybGRQb3NpdGlvbik7CiAgICAgIGJvZHkuc2V0TmV4dEtpbmVtYXRpY1JvdGF0aW9uKHdvcmxkUXVhdGVybmlvbik7CiAgICAgIHRoaXMuX3VwZGF0ZVJ1bnRpbWVUcmFuc2Zvcm1Gcm9tU29saWQoc29saWQsIHsgcGVyc2lzdDogZmFsc2UgfSk7CiAgICAgIHRoaXMuX21vdmVkU29saWRJZHMuYWRkKHNvbGlkLnV1aWQpOwogICAgICBzdGF0ZS5wcm9ncmVzcyArPSBkZWx0YURlZzsKICAgICAgaWYgKGxpbWl0RGVnICE9IG51bGwgJiYgTWF0aC5hYnMobGltaXREZWcgLSBzdGF0ZS5wcm9ncmVzcykgPD0gMWUtOSkgc3RhdGUuY29tcGxldGVkID0gdHJ1ZTsKICAgICAgdGhpcy5fbW90aW9uU3RhdGUuc2V0KG1vdGlvbi5pZCwgc3RhdGUpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIGNvbnN0IG9tZWdhID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKGRlbHRhRGVnKSAvIE1hdGgubWF4KGR0LCAxZS05KTsKICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLl9zY3JhdGNoOwogICAgY29uc3QgY29tbWFuZCA9IHRoaXMuX2dldE1vdGlvbkNvbW1hbmQoY29tbWFuZHMsIHNvbGlkKTsKICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gYm9keS50cmFuc2xhdGlvbigpOwogICAgc2NyYXRjaC5heGlzLmNvcHkoYXhpcy5lbmQpLnN1YihheGlzLnN0YXJ0KS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihvbWVnYSk7CiAgICBzY3JhdGNoLnJhZGl1cy5zZXQoCiAgICAgIE51bWJlcih0cmFuc2xhdGlvbj8ueCkgfHwgMCwKICAgICAgTnVtYmVyKHRyYW5zbGF0aW9uPy55KSB8fCAwLAogICAgICBOdW1iZXIodHJhbnNsYXRpb24/LnopIHx8IDAsCiAgICApLnN1YihheGlzLnN0YXJ0KTsKICAgIHNjcmF0Y2gudmVsb2NpdHkuY29weShzY3JhdGNoLmF4aXMpLmNyb3NzKHNjcmF0Y2gucmFkaXVzKTsKICAgIGNvbW1hbmQuYW5ndWxhci54ICs9IHNjcmF0Y2guYXhpcy54OwogICAgY29tbWFuZC5hbmd1bGFyLnkgKz0gc2NyYXRjaC5heGlzLnk7CiAgICBjb21tYW5kLmFuZ3VsYXIueiArPSBzY3JhdGNoLmF4aXMuejsKICAgIGNvbW1hbmQubGluZWFyLnggKz0gc2NyYXRjaC52ZWxvY2l0eS54OwogICAgY29tbWFuZC5saW5lYXIueSArPSBzY3JhdGNoLnZlbG9jaXR5Lnk7CiAgICBjb21tYW5kLmxpbmVhci56ICs9IHNjcmF0Y2gudmVsb2NpdHkuejsKICAgIHN0YXRlLnByb2dyZXNzICs9IGRlbHRhRGVnOwogICAgaWYgKGxpbWl0RGVnICE9IG51bGwgJiYgTWF0aC5hYnMobGltaXREZWcgLSBzdGF0ZS5wcm9ncmVzcykgPD0gMWUtOSkgc3RhdGUuY29tcGxldGVkID0gdHJ1ZTsKICAgIHRoaXMuX21vdGlvblN0YXRlLnNldChtb3Rpb24uaWQsIHN0YXRlKTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgX2FwcGx5TGluZWFyTW90aW9uU3RlcChzb2xpZCwgbW90aW9uLCBkdCwgY29tbWFuZHMpIHsKICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fbW90aW9uU3RhdGUuZ2V0KG1vdGlvbi5pZCkgfHwgeyBwcm9ncmVzczogMCwgY29tcGxldGVkOiBmYWxzZSB9OwogICAgaWYgKHN0YXRlLmNvbXBsZXRlZCkgcmV0dXJuIGZhbHNlOwogICAgY29uc3QgYXhpcyA9IHRoaXMuX3Jlc29sdmVNb3Rpb25BeGlzKG1vdGlvbik7CiAgICBpZiAoIWF4aXMpIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IGJvZHkgPSB0aGlzLl9ib2R5U3RhdGUuZ2V0KHNvbGlkLnV1aWQpPy5ib2R5IHx8IG51bGw7CiAgICBpZiAoIWJvZHkpIHJldHVybiBmYWxzZTsKICAgIGNvbnN0IHNwZWVkID0gTnVtYmVyKG1vdGlvbj8uc3BlZWQpOwogICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoc3BlZWQpIHx8IE1hdGguYWJzKHNwZWVkKSA8PSAxZS05KSByZXR1cm4gZmFsc2U7CiAgICBsZXQgZGVsdGEgPSBzcGVlZCAqIGR0OwogICAgY29uc3QgbGltaXQgPSBub3JtYWxpemVPcHRpb25hbE1vdGlvbkxpbWl0KG1vdGlvbj8uZGlzdGFuY2UpOwogICAgaWYgKGxpbWl0ICE9IG51bGwpIHsKICAgICAgY29uc3QgcmVtYWluaW5nID0gbGltaXQgLSBzdGF0ZS5wcm9ncmVzczsKICAgICAgaWYgKE1hdGguYWJzKHJlbWFpbmluZykgPD0gMWUtOSkgewogICAgICAgIHN0YXRlLmNvbXBsZXRlZCA9IHRydWU7CiAgICAgICAgdGhpcy5fbW90aW9uU3RhdGUuc2V0KG1vdGlvbi5pZCwgc3RhdGUpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoTWF0aC5zaWduKGRlbHRhIHx8IDEpICE9PSBNYXRoLnNpZ24ocmVtYWluaW5nIHx8IDEpKSB7CiAgICAgICAgZGVsdGEgPSBNYXRoLnNpZ24ocmVtYWluaW5nIHx8IDEpICogTWF0aC5hYnMoZGVsdGEpOwogICAgICB9CiAgICAgIGlmIChNYXRoLmFicyhkZWx0YSkgPiBNYXRoLmFicyhyZW1haW5pbmcpKSBkZWx0YSA9IHJlbWFpbmluZzsKICAgIH0KICAgIGlmIChNYXRoLmFicyhkZWx0YSkgPD0gMWUtOSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKHRoaXMuX2lzU29saWRLaW5lbWF0aWNNb3Rpb25Ecml2ZW4oc29saWQpKSB7CiAgICAgIHRoaXMuX3RyYW5zbGF0ZVNvbGlkQWxvbmdXb3JsZEF4aXMoc29saWQsIGF4aXMuc3RhcnQsIGF4aXMuZW5kLCBkZWx0YSk7CiAgICAgIGNvbnN0IHdvcmxkUG9zaXRpb24gPSBzb2xpZC5nZXRXb3JsZFBvc2l0aW9uKG5ldyBUSFJFRS5WZWN0b3IzKCkpOwogICAgICBjb25zdCB3b3JsZFF1YXRlcm5pb24gPSBzb2xpZC5nZXRXb3JsZFF1YXRlcm5pb24obmV3IFRIUkVFLlF1YXRlcm5pb24oKSk7CiAgICAgIGJvZHkuc2V0TmV4dEtpbmVtYXRpY1RyYW5zbGF0aW9uKHdvcmxkUG9zaXRpb24pOwogICAgICBib2R5LnNldE5leHRLaW5lbWF0aWNSb3RhdGlvbih3b3JsZFF1YXRlcm5pb24pOwogICAgICB0aGlzLl91cGRhdGVSdW50aW1lVHJhbnNmb3JtRnJvbVNvbGlkKHNvbGlkLCB7IHBlcnNpc3Q6IGZhbHNlIH0pOwogICAgICB0aGlzLl9tb3ZlZFNvbGlkSWRzLmFkZChzb2xpZC51dWlkKTsKICAgICAgc3RhdGUucHJvZ3Jlc3MgKz0gZGVsdGE7CiAgICAgIGlmIChsaW1pdCAhPSBudWxsICYmIE1hdGguYWJzKGxpbWl0IC0gc3RhdGUucHJvZ3Jlc3MpIDw9IDFlLTkpIHN0YXRlLmNvbXBsZXRlZCA9IHRydWU7CiAgICAgIHRoaXMuX21vdGlvblN0YXRlLnNldChtb3Rpb24uaWQsIHN0YXRlKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBjb25zdCB2ZWxvY2l0eVNjYWxlID0gZGVsdGEgLyBNYXRoLm1heChkdCwgMWUtOSk7CiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5fc2NyYXRjaDsKICAgIGNvbnN0IGNvbW1hbmQgPSB0aGlzLl9nZXRNb3Rpb25Db21tYW5kKGNvbW1hbmRzLCBzb2xpZCk7CiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IGJvZHkudHJhbnNsYXRpb24oKTsKICAgIHNjcmF0Y2guYXhpcy5jb3B5KGF4aXMuZW5kKS5zdWIoYXhpcy5zdGFydCkubm9ybWFsaXplKCk7CiAgICBzY3JhdGNoLnRyYW5zbGF0aW9uLmNvcHkoc2NyYXRjaC5heGlzKS5tdWx0aXBseVNjYWxhcihkZWx0YSk7CiAgICBib2R5LnNldFRyYW5zbGF0aW9uKHsKICAgICAgeDogKE51bWJlcih0cmFuc2xhdGlvbj8ueCkgfHwgMCkgKyBzY3JhdGNoLnRyYW5zbGF0aW9uLngsCiAgICAgIHk6IChOdW1iZXIodHJhbnNsYXRpb24/LnkpIHx8IDApICsgc2NyYXRjaC50cmFuc2xhdGlvbi55LAogICAgICB6OiAoTnVtYmVyKHRyYW5zbGF0aW9uPy56KSB8fCAwKSArIHNjcmF0Y2gudHJhbnNsYXRpb24ueiwKICAgIH0sIHRydWUpOwogICAgc2NyYXRjaC5heGlzLm11bHRpcGx5U2NhbGFyKHZlbG9jaXR5U2NhbGUpOwogICAgY29tbWFuZC5saW5lYXIueCArPSBzY3JhdGNoLmF4aXMueDsKICAgIGNvbW1hbmQubGluZWFyLnkgKz0gc2NyYXRjaC5heGlzLnk7CiAgICBjb21tYW5kLmxpbmVhci56ICs9IHNjcmF0Y2guYXhpcy56OwogICAgYm9keS5zZXRBbmd2ZWwoeyB4OiAwLCB5OiAwLCB6OiAwIH0sIHRydWUpOwogICAgc3RhdGUucHJvZ3Jlc3MgKz0gZGVsdGE7CiAgICBpZiAobGltaXQgIT0gbnVsbCAmJiBNYXRoLmFicyhsaW1pdCAtIHN0YXRlLnByb2dyZXNzKSA8PSAxZS05KSBzdGF0ZS5jb21wbGV0ZWQgPSB0cnVlOwogICAgdGhpcy5fbW90aW9uU3RhdGUuc2V0KG1vdGlvbi5pZCwgc3RhdGUpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBfcm90YXRlU29saWRBcm91bmRXb3JsZEF4aXMoc29saWQsIGF4aXNTdGFydCwgYXhpc0VuZCwgYW5nbGVSYWQpIHsKICAgIGNvbnN0IHBhcmVudCA9IHNvbGlkLnBhcmVudCB8fCB0aGlzLnZpZXdlcj8uc2NlbmUgfHwgbnVsbDsKICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLl9zY3JhdGNoOwogICAgc2NyYXRjaC5heGlzLmNvcHkoYXhpc0VuZCkuc3ViKGF4aXNTdGFydCkubm9ybWFsaXplKCk7CiAgICBzY3JhdGNoLnBhcmVudFdvcmxkTWF0cml4LmNvcHkocGFyZW50Py5tYXRyaXhXb3JsZCB8fCBuZXcgVEhSRUUuTWF0cml4NCgpKTsKICAgIHNjcmF0Y2gucGFyZW50SW52ZXJzZS5jb3B5KHNjcmF0Y2gucGFyZW50V29ybGRNYXRyaXgpLmludmVydCgpOwogICAgc2NyYXRjaC53b3JsZE1hdHJpeC5jb3B5KHNvbGlkLm1hdHJpeFdvcmxkKTsKICAgIHNjcmF0Y2guZGVsdGFNYXRyaXgubWFrZVRyYW5zbGF0aW9uKGF4aXNTdGFydC54LCBheGlzU3RhcnQueSwgYXhpc1N0YXJ0LnopOwogICAgc2NyYXRjaC5kZWx0YU1hdHJpeC5tdWx0aXBseShuZXcgVEhSRUUuTWF0cml4NCgpLm1ha2VSb3RhdGlvbkF4aXMoc2NyYXRjaC5heGlzLCBhbmdsZVJhZCkpOwogICAgc2NyYXRjaC5kZWx0YU1hdHJpeC5tdWx0aXBseShuZXcgVEhSRUUuTWF0cml4NCgpLm1ha2VUcmFuc2xhdGlvbigtYXhpc1N0YXJ0LngsIC1heGlzU3RhcnQueSwgLWF4aXNTdGFydC56KSk7CiAgICBzY3JhdGNoLndvcmxkTWF0cml4LnByZW11bHRpcGx5KHNjcmF0Y2guZGVsdGFNYXRyaXgpOwogICAgc2NyYXRjaC5sb2NhbE1hdHJpeC5jb3B5KHNjcmF0Y2gucGFyZW50SW52ZXJzZSkubXVsdGlwbHkoc2NyYXRjaC53b3JsZE1hdHJpeCk7CiAgICBzY3JhdGNoLmxvY2FsTWF0cml4LmRlY29tcG9zZShzb2xpZC5wb3NpdGlvbiwgc29saWQucXVhdGVybmlvbiwgc29saWQuc2NhbGUpOwogICAgc29saWQudXBkYXRlTWF0cml4V29ybGQ/Lih0cnVlKTsKICAgIHRoaXMuX3N5bmNQcm94eUdyb3VwVHJhbnNmb3JtKHNvbGlkKTsKICB9CgogIF90cmFuc2xhdGVTb2xpZEFsb25nV29ybGRBeGlzKHNvbGlkLCBheGlzU3RhcnQsIGF4aXNFbmQsIGRpc3RhbmNlKSB7CiAgICBjb25zdCBwYXJlbnQgPSBzb2xpZC5wYXJlbnQgfHwgdGhpcy52aWV3ZXI/LnNjZW5lIHx8IG51bGw7CiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5fc2NyYXRjaDsKICAgIHNjcmF0Y2guYXhpcy5jb3B5KGF4aXNFbmQpLnN1YihheGlzU3RhcnQpLm5vcm1hbGl6ZSgpOwogICAgc2NyYXRjaC50cmFuc2xhdGlvbi5jb3B5KHNjcmF0Y2guYXhpcykubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpOwogICAgc2NyYXRjaC5wYXJlbnRXb3JsZE1hdHJpeC5jb3B5KHBhcmVudD8ubWF0cml4V29ybGQgfHwgbmV3IFRIUkVFLk1hdHJpeDQoKSk7CiAgICBzY3JhdGNoLnBhcmVudEludmVyc2UuY29weShzY3JhdGNoLnBhcmVudFdvcmxkTWF0cml4KS5pbnZlcnQoKTsKICAgIHNjcmF0Y2gud29ybGRNYXRyaXguY29weShzb2xpZC5tYXRyaXhXb3JsZCk7CiAgICBzY3JhdGNoLmRlbHRhTWF0cml4Lm1ha2VUcmFuc2xhdGlvbihzY3JhdGNoLnRyYW5zbGF0aW9uLngsIHNjcmF0Y2gudHJhbnNsYXRpb24ueSwgc2NyYXRjaC50cmFuc2xhdGlvbi56KTsKICAgIHNjcmF0Y2gud29ybGRNYXRyaXgucHJlbXVsdGlwbHkoc2NyYXRjaC5kZWx0YU1hdHJpeCk7CiAgICBzY3JhdGNoLmxvY2FsTWF0cml4LmNvcHkoc2NyYXRjaC5wYXJlbnRJbnZlcnNlKS5tdWx0aXBseShzY3JhdGNoLndvcmxkTWF0cml4KTsKICAgIHNjcmF0Y2gubG9jYWxNYXRyaXguZGVjb21wb3NlKHNvbGlkLnBvc2l0aW9uLCBzb2xpZC5xdWF0ZXJuaW9uLCBzb2xpZC5zY2FsZSk7CiAgICBzb2xpZC51cGRhdGVNYXRyaXhXb3JsZD8uKHRydWUpOwogICAgdGhpcy5fc3luY1Byb3h5R3JvdXBUcmFuc2Zvcm0oc29saWQpOwogIH0KfQo=",import.meta.url).href,{SimulationWorkbenchManager:e}=await import(A);return this._disposed?null:(this.simulationWorkbenchManager||(this.simulationWorkbenchManager=new e(this)),this.simulationWorkbenchManager)}catch(A){try{console.warn("[Viewer] Failed to load simulation workbench manager",A)}catch{}return null}finally{this._simulationWorkbenchManagerPromise=null}})(),this._simulationWorkbenchManagerPromise)}refreshWorkbenchUi(){if(!this._viewerOnlyMode){if(this._getActiveWorkbenchId()==="SIMULATION")this._ensureSimulationWorkbenchManager().then(A=>{try{A?.setActive?.(this._getActiveWorkbenchId()==="SIMULATION")}catch{}});else try{this.simulationWorkbenchManager?.setActive?.(!1)}catch{}try{this.historyWidget?.refreshWorkbenchUi?.()}catch{}try{tt.refreshSelectionActions?.()}catch{}try{this._refreshWorkbenchPanelVisibility()}catch{}try{this.mainToolbar?.refreshButtons?.()}catch{}}}_normalizeToolbarButtonInput(A,e,t,i="plugin"){const o=i||"plugin";return A&&typeof A=="object"&&!Array.isArray(A)?{...A,id:String(A.id||`toolbar-${Date.now()}-${Math.random().toString(36).slice(2,7)}`),source:A.source||o}:{id:`toolbar-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,label:A,title:e,onClick:t,source:o}}addToolbarButton(A,e,t){if(this._viewerOnlyMode)return null;const i=this._normalizeToolbarButtonInput(A,e,t,"plugin");if(this.mainToolbar&&typeof this.mainToolbar.addCustomButton=="function")try{return this.mainToolbar.addCustomButton(i)}catch{return null}return this._pendingToolbarButtons=this._pendingToolbarButtons||[],this._pendingToolbarButtons.push(i),null}_syncHistoryUiAfterUndoRedo(){try{this.expressionsManager?.refreshFromPartHistory?.()}catch{}try{this.pmiViewsWidget&&(this.pmiViewsWidget.refreshFromHistory?.(),this.pmiViewsWidget._renderList?.())}catch{}try{this.sheet2DWidget&&(this.sheet2DWidget.refreshFromHistory?.(),this.sheet2DWidget._renderList?.()),this._sheet2DEditorWindow?.refreshFromHistory?.()}catch{}try{this.simulationHistoryWidget?.refreshFromHistory?.()}catch{}try{this.wireHarnessConnectionsWidget&&(this.wireHarnessConnectionsWidget.refreshFromHistory?.(),this.wireHarnessConnectionsWidget._renderList?.())}catch{}try{this.historyWidget?.render?.()}catch{}try{this.refreshWorkbenchUi()}catch{}}async _syncWireHarnessRoutesFromHistoryState(A={}){const e=this.partHistory?.scene||this.scene||null,t=this.partHistory?.wireHarnessManager||null;if(!e||!t)return Bm(e),null;const i=t.consumePendingRestoredRouteResults?.();if(Array.isArray(i)&&i.length){const o=Jbt(this.partHistory,i);l_A(e,i,o),t.setRouteResults?.(i,{preservePendingRestore:!0});try{this.render?.()}catch{}return i}Bm(e),t.clearRouteResults?.();try{this.render?.()}catch{}return null}async refreshWireHarnessRoutes(A={}){const e=this.partHistory?.scene||this.scene||null,t=this.partHistory?.wireHarnessManager||null;if(!e||!t)return Bm(e),null;const i=Array.isArray(t.getConnections?.())?t.getConnections():[];if(!i.length)return Bm(e),t.setRouteResults?.([]),null;try{const{routes:o,bundleSegments:s}=await vbe(this.partHistory,i);l_A(e,o,s),t.setRouteResults?.(o);try{this.render?.()}catch{}return o}catch(o){return console.warn("[Viewer] Failed to refresh wire harness routes:",o),Bm(e),t.setRouteResults?.(i.map(s=>({connectionId:String(s?.id||""),connectionName:String(s?.name||s?.id||"Wire"),feasible:!1,error:o?.message||"Failed to route wire harness connections.",distance:null,polyline:[],segmentIds:[]}))),null}}async clearWireHarnessRoutes(A={}){const e=this.partHistory?.scene||this.scene||null,t=this.partHistory?.wireHarnessManager||null;Bm(e),t?.clearRouteResults?.();try{this.render?.()}catch{}return null}async _runFeatureHistoryUndoRedo(A){if(this._viewerOnlyMode)return!1;const e=this.partHistory;if(!e)return!1;let t=!1;try{A==="redo"?t=await e.redoFeatureHistory():t=await e.undoFeatureHistory()}catch{}try{this._syncHistoryUiAfterUndoRedo()}catch{}return t}_registerWorkbenchPanel(A={}){const e=String(A.id||"").trim();if(!e)return null;const t={...A,id:e};return this._workbenchPanelRecords.set(e,t),t}_refreshWorkbenchPanelVisibility(){if(this._viewerOnlyMode||!this.accordion)return;const A=this._getActiveWorkbenchId();for(const e of this._workbenchPanelRecords.values()){const t=String(e.title||"");t&&(oae(e,A)?this.accordion.showSection?.(t):this.accordion.hideSection?.(t))}}_normalizePluginSidePanelInput(A,e){return A&&typeof A=="object"&&!Array.isArray(A)?{...A,id:String(A.id||`plugin-panel-${Date.now()}-${Math.random().toString(36).slice(2,7)}`),title:String(A.title||A.id||"Plugin"),content:A.content,source:A.source||"plugin"}:{id:`plugin-panel-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,title:String(A||"Plugin"),content:e,source:"plugin"}}async _applyPluginSidePanel(A){if(this._viewerOnlyMode||!this.accordion||typeof this.accordion.addSection!="function")return null;const e=this._normalizePluginSidePanelInput(A),t=String(e.title||"Plugin"),i=await this.accordion.addSection(t);if(!i)return null;try{if(typeof e.content=="function"){const o=await e.content();o&&i.uiElement.appendChild(o)}else if(e.content instanceof HTMLElement)i.uiElement.appendChild(e.content);else if(e.content!=null){const o=document.createElement("pre");o.textContent=String(e.content),i.uiElement.appendChild(o)}try{const o=this.accordion.uiElement,s=o.querySelector('.accordion-title[name="accordion-title-Display Settings"]');if(s){const I=o.querySelector(`.accordion-title[name="accordion-title-${t}"]`);I&&i.uiElement&&I!==s&&(o.insertBefore(I,s),o.insertBefore(i.uiElement,s))}}catch{}}catch{}return this._registerWorkbenchPanel({...e,title:t,section:i}),this._refreshWorkbenchPanelVisibility(),i}async addPluginSidePanel(A,e){if(this._viewerOnlyMode)return null;const t=this._normalizePluginSidePanelInput(A,e);if(this._pluginUiReady)try{return await this._applyPluginSidePanel(t)}catch{return null}return this._pendingSidePanels=this._pendingSidePanels||[],this._pendingSidePanels.push(t),null}_refreshAssemblyConstraintsPanelVisibility(){if(this._viewerOnlyMode||!this.accordion||!this.accordion.uiElement)return;const A=oae({id:"assemblyConstraints",source:"builtin"},this._getActiveWorkbenchId()),e=this._assemblyConstraintsVisible;if(this._assemblyConstraintsVisible=A,A){if(this.accordion.showSection?.(sb),e===!1)try{this.accordion.expandSection?.(sb)}catch{}}else this.accordion.hideSection?.(sb)||setTimeout(()=>{try{this.accordion.hideSection?.(sb)}catch{}},0)}dispose(){if(this._disposed)return;this._disposed=!0;try{this.simulationWorkbenchManager?.dispose?.()}catch{}cancelAnimationFrame(this._raf),this._hoverRefreshRaf!=null&&(cancelAnimationFrame(this._hoverRefreshRaf),this._hoverRefreshRaf=null);try{this.endPMIPreviewMode()}catch{}try{this._stopComponentTransformSession()}catch{}try{this.sheet2DWidget?.dispose?.()}catch{}try{this.wireHarnessConnectionsWidget?.dispose?.()}catch{}try{this._sheet2DEditorWindow?.dispose?.()}catch{}this._sheet2DEditorWindow=null,au(()=>this._sidebarDockController?.dispose()),this._sidebarDockController=null,au(()=>this._sidebarHomeBannerRO?.disconnect?.()),this._sidebarHomeBannerRO=null,au(()=>{this._sidebarHomeBanner&&this._sidebarHomeBanner.parentNode&&this._sidebarHomeBanner.parentNode.removeChild(this._sidebarHomeBanner)}),this._sidebarHomeBanner=null;const A=this.renderer?.domElement;this._detachRendererEvents(A);try{this.camera?.disableIdleCallbacks?.()}catch{}window.removeEventListener("pointerup",this._onPointerUp,{capture:!0}),window.removeEventListener("resize",this._onResize),window.removeEventListener("keydown",this._onKeyDown,{passive:!1}),window.removeEventListener("hover-changed",this._onHoverChanged);try{const e=this._cameraProjectionToggleButton;e&&(e.removeEventListener("click",this._onCameraProjectionToggleClick),e.remove())}catch{}this._cameraProjectionToggleButton=null;try{this.viewCube?.dispose?.()}catch{}if(this.viewCube=null,this.controls?.dispose?.(),this._disposeWebglPostProcessing(),this.renderer?.dispose?.(),this._webglRenderer&&this._webglRenderer!==this.renderer)try{this._webglRenderer.dispose()}catch{}try{for(const e of this._inspectorLinkedWindows||[])try{e.destroy?.()}catch{}this._inspectorLinkedWindows?.clear?.()}catch{}try{this._sketchMode&&this._sketchMode.dispose()}catch{}try{this._splineMode&&this._splineMode.dispose()}catch{}A&&A.parentNode&&A.parentNode.removeChild(A)}deactivateSketchPlaneSelection(){try{return AE.deactivateActiveReferenceSelection?.("sketchPlane",this.partHistory?.scene||this.scene||null)===!0}catch{return!1}}startSketchMode(A){if(!this._viewerOnlyMode){Em(this.partHistory,A,!1),Sy("Starting Sketch Mode for featureID:",A),Sy(this.partHistory.scene),Sy(this.partHistory),Sy(this);try{this._sketchMode&&this._sketchMode.dispose()}catch{}try{this._sketchSidebarPrev||(this._sketchSidebarPrev={pinned:this._sidebarPinned,autoHideSuspended:this._sidebarAutoHideSuspended,hoverVisible:this._sidebarHoverVisible}),this._setSidebarPinned(!1),this._setSidebarAutoHideSuspended(!1),this._setSidebarHoverVisible(!1)}catch{}this._sketchMode=new BRt(this,A,{useFatCurveLines:!0}),this._sketchMode.open()}}onSketchFinished(A,e){const t=this.partHistory;if(!t||!A)return;this.endSketchMode(A);const i=Array.isArray(t.features)?t.features.find(o=>o?.inputParams?.featureID===A):null;if(i){i.lastRunInputParams={},i.timestamp=0,i.dirty=!0,i.persistentData=i.persistentData||{},i.persistentData.sketch=e||{};try{const o=t.runHistory();o&&typeof o.then=="function"?(async()=>{try{await o,t.queueHistorySnapshot?.({debounceMs:0,reason:"sketch"})}catch(s){console.warn("[Viewer] Sketch history run failed:",s)}finally{Em(t,A,!0)}})():(Em(t,A,!0),t.queueHistorySnapshot?.({debounceMs:0,reason:"sketch"}))}catch{Em(t,A,!0)}}}onSketchCancelled(A){this.endSketchMode(A)}endSketchMode(A=null){const e=A||this._sketchMode?.featureID||null;try{this._sketchMode&&this._sketchMode.close()}catch{}this._sketchMode=null,Em(this.partHistory,e,!0);const t=this._sketchSidebarPrev;if(this._sketchSidebarPrev=null,t){try{this._setSidebarPinned(!!t.pinned)}catch{}try{this._setSidebarAutoHideSuspended(!!t.autoHideSuspended)}catch{}try{this._setSidebarHoverVisible(!!t.hoverVisible)}catch{}}else try{this._setSidebarAutoHideSuspended(!1)}catch{}try{this.controls&&(this.controls.enabled=!0)}catch{}try{const i=this.container;i&&typeof i.querySelectorAll=="function"&&i.querySelectorAll(".sketch-overlay").forEach(o=>{try{o.parentNode&&o.parentNode.removeChild(o)}catch{}})}catch{}}startSplineMode(A){this._viewerOnlyMode||(Sy("Starting Spline Mode for session:",A),this._splineMode=A)}endSplineMode(){Sy("Ending Spline Mode"),this._splineMode=null}_collapseExpandedDialogsForModeSwitch(){try{this.historyWidget?.collapseExpandedEntries?.({clearOpenState:!0,notify:!1})}catch{}try{this.assemblyConstraintsWidget?.collapseExpandedDialogs?.()}catch{}try{this._pmiMode?.collapseExpandedDialogs?.()}catch{}}startPMIPreviewMode(A,e,t=this.pmiViewsWidget){if(this._viewerOnlyMode){try{this.endPMIPreviewMode()}catch{}try{this._pmiPreviewMode=new AWe(this,A,e,t,{displayOnly:!0}),this._pmiPreviewMode.open()}catch{this._pmiPreviewMode=null}}}endPMIPreviewMode(){const A=this._pmiPreviewMode;if(this._pmiPreviewMode=null,!!A)try{const e=A.dispose?.();e&&typeof e.then=="function"&&e.catch(()=>{})}catch{}}startPMIMode(A,e,t=this.pmiViewsWidget,i={}){if(this._viewerOnlyMode)return;try{this.endPMIPreviewMode()}catch{}const o=!!this._pmiMode,s=!!i?.fromViewClick,I=this._getActiveWorkbenchId();s&&!o&&I!=="PMI"?(this._setWorkbenchReturnTarget(I),this.setActiveWorkbench("PMI",{queueHistorySnapshot:!0})):!s&&!o&&this._setWorkbenchReturnTarget(null);try{this._collapseExpandedDialogsForModeSwitch()}catch{}if(!o)try{this.assemblyConstraintsWidget?.onPMIModeEnter?.()}catch{}try{this._pmiMode&&this._pmiMode.dispose()}catch{}try{o||this._setSidebarAutoHideSuspended(!0),this._pmiMode=new AWe(this,A,e,t),this._pmiMode.open()}catch(n){if(this._pmiMode=null,!o){try{this.assemblyConstraintsWidget?.onPMIModeExit?.()}catch{}try{this._setSidebarAutoHideSuspended(!1)}catch{}}throw n}}onPMIFinished(A){this._restoreWorkbenchAfterPMI(),this.endPMIMode()}onPMICancelled(){this._restoreWorkbenchAfterPMI(),this.endPMIMode()}endPMIMode(){const A=!!this._pmiMode;if(A)try{this._collapseExpandedDialogsForModeSwitch()}catch{}try{this._pmiMode&&this._pmiMode.dispose()}catch{}if(this._pmiMode=null,A)try{this.assemblyConstraintsWidget?.onPMIModeExit?.()}catch{}try{this._setSidebarAutoHideSuspended(!1)}catch{}try{this.controls&&(this.controls.enabled=!0)}catch{}}openSheet2DEditor(A=null){const e=this.partHistory?.sheet2DManager;if(!e)return;let t=A?String(A):"";if(!t){const i=e.getSheets?.()?.[0]||null;i?.id&&(t=String(i.id))}if(!t){const i=e.createSheet?.({name:"Instruction Sheet 1",sizeKey:"A",orientation:"landscape",elements:[]})||null;i?.id&&(t=String(i.id))}this._sheet2DEditorWindow||(this._sheet2DEditorWindow=new aLt(this)),this._sheet2DEditorWindow.open(t||null)}closeSheet2DEditor(){try{this._sheet2DEditorWindow?.close?.()}catch{}}render(){if(this.camera&&this.camera.parent!==this.scene)try{this.scene.add(this.camera)}catch{}if(this._positionCameraProjectionToggle(),this._updateAxisHelpers(),this._updateCameraLightRig(),this._updateDepthRange(),this._rendererMode==="svg")this._renderSvgScene();else{this.renderer.render(this.scene,this.camera);try{this.viewCube&&this.viewCube.render()}catch{}}}_renderSvgScene(){if(!this.renderer||!this.scene||!this.camera)return;const A=this.renderer.domElement;if(!A)return;try{this.scene.updateMatrixWorld(!0)}catch{}try{this.camera.updateMatrixWorld?.()}catch{}this._resizeRendererToDisplaySize();const e=A.getBoundingClientRect(),t=Math.max(1,Math.floor(e.width||this.container?.clientWidth||0)),i=Math.max(1,Math.floor(e.height||this.container?.clientHeight||0));if(!Number.isFinite(t)||!Number.isFinite(i)||t<=1||i<=1)return;try{typeof this.renderer.setClearColor=="function"&&this.renderer.setClearColor(this._clearColor)}catch{}const o=[],s=[],I=[],n=new yo,B=[];try{if(this.camera?.isOrthographicCamera){const E=Number(this.camera.right)-Number(this.camera.left)||0;if(Number.isFinite(E)&&E>0){const l=E/t;this.scene.traverse(h=>{if(!h?.isPoints)return;const w=h.material;if(Array.isArray(w))for(const d of w)!d?.isPointsMaterial||!Number.isFinite(d.size)||(o.push([d,d.size]),d.size=d.size*l);else w?.isPointsMaterial&&Number.isFinite(w.size)&&(o.push([w,w.size]),w.size=w.size*l)})}}const C=this._collectSvgOccluders(s),a=this._svgRaycaster||new aM;this._svgRaycaster=a;const Q=this._computeSvgOcclusionEps();this.scene.traverse(E=>{if(!E?.visible||!E.isLine2&&!E.isLineSegments2)return;const l=this._buildSvgLineFromLine2(E,{camera:this.camera,occluders:C,raycaster:a,occlusionEps:Q});l&&(I.push(l),n.add(l),B.push([E,E.visible]),E.visible=!1)}),I.length&&this.scene.add(n),this._restoreSvgMaterialSides(s),this.renderer.render(this.scene,this.camera);try{A.style.background=this._clearAlpha===0?"transparent":this._clearColor.getStyle()}catch{}}catch{}finally{try{if(I.length){this.scene.remove(n);for(const C of I){try{C.geometry?.dispose?.()}catch{}try{C.material?.dispose?.()}catch{}}}}catch{}for(const[C,a]of B)try{C.visible=a}catch{}this._restoreSvgMaterialSides(s);for(const[C,a]of o)try{C.size=a}catch{}}}_buildSvgLineFromLine2(A,{camera:e,occluders:t,raycaster:i,occlusionEps:o}={}){const s=A.geometry,I=s?.attributes?.instanceStart,n=s?.attributes?.instanceEnd;let B=null;if(I&&n&&Number.isFinite(I.count)&&I.count>0){const D=Math.min(I.count,n.count);B=new Float32Array(D*6);for(let u=0;u<D;u+=1)B[u*6]=I.getX(u),B[u*6+1]=I.getY(u),B[u*6+2]=I.getZ(u),B[u*6+3]=n.getX(u),B[u*6+4]=n.getY(u),B[u*6+5]=n.getZ(u)}else if(s?.attributes?.position?.count>=2){const D=s.attributes.position,u=D.count-1;B=new Float32Array(u*6);for(let M=0;M<u;M+=1)B[M*6]=D.getX(M),B[M*6+1]=D.getY(M),B[M*6+2]=D.getZ(M),B[M*6+3]=D.getX(M+1),B[M*6+4]=D.getY(M+1),B[M*6+5]=D.getZ(M+1)}if(!B||B.length<6)return null;const C=Array.isArray(A.material)?A.material[0]:A.material;if(C?.depthTest!==!1&&A?.type==="EDGE"&&Array.isArray(t)&&t.length&&e&&i){const D=Array.isArray(A.faces)?new Set(A.faces):null,u=this._svgTmpVecA||(this._svgTmpVecA=new j),M=this._svgTmpVecB||(this._svgTmpVecB=new j),y=[];for(let p=0;p<B.length;p+=6)u.set(B[p],B[p+1],B[p+2]).applyMatrix4(A.matrixWorld),M.set(B[p+3],B[p+4],B[p+5]).applyMatrix4(A.matrixWorld),this._isSvgSegmentVisible(u,M,e,i,t,D,o)&&y.push(B[p],B[p+1],B[p+2],B[p+3],B[p+4],B[p+5]);if(!y.length)return null;B=new Float32Array(y)}const a=new bt;a.setAttribute("position",new St(B,3));const Q=C?.color?C.color:new ct("#ffffff"),E=Number.isFinite(C?.opacity)?C.opacity:1,l=!!C?.transparent||E<1,h=Number.isFinite(C?.linewidth)?C.linewidth:1;let w=null;C?.dashed||C?.isLineDashedMaterial?w=new Pv({color:Q,linewidth:h,transparent:l,opacity:E,dashSize:Number.isFinite(C?.dashSize)?C.dashSize:.5,gapSize:Number.isFinite(C?.gapSize)?C.gapSize:.5}):w=new Jg({color:Q,linewidth:h,transparent:l,opacity:E});const d=new sC(a,w);d.matrixAutoUpdate=!1;try{d.matrix.copy(A.matrixWorld)}catch{}try{d.matrixWorld.copy(A.matrixWorld)}catch{}if(d.renderOrder=2,d.visible=!0,w.isLineDashedMaterial)try{d.computeLineDistances()}catch{}return d}_collectSvgOccluders(A){const e=[];try{this.scene.traverse(t=>{if(!t?.visible||!t.isMesh||t.type&&t.type!=="FACE")return;const i=t.material,o=Array.isArray(i)?i:[i];if(o.some(s=>s&&s.opacity!==0)){if(Array.isArray(A))for(const s of o)!s||s.side===co||(A.push([s,s.side]),s.side=co);e.push(t)}})}catch{}return e}_restoreSvgMaterialSides(A){if(!(!Array.isArray(A)||!A.length)){for(const[e,t]of A)if(e)try{e.side=t}catch{}A.length=0}}_computeSvgOcclusionEps(){const A=this.camera;if(!A)return 1e-4;if(A.isOrthographicCamera){const i=Math.abs(Number(A.right)-Number(A.left))||0;return Math.max(1e-4,i*1e-4)}const e=this.controls?.target,t=e&&A.position?.distanceTo?.(e)||A.position?.length?.()||1;return Math.max(1e-4,t*1e-4)}_isSvgSegmentVisible(A,e,t,i,o,s,I){if(!t||!i||!Array.isArray(o)||!o.length)return!0;const n=this._svgEdgeSamples||(this._svgEdgeSamples=[.2,.5,.8]),B=this._svgTmpVecC||(this._svgTmpVecC=new j);for(const C of n)if(B.lerpVectors(A,e,C),!this._isSvgPointOccluded(B,t,i,o,s,I))return!0;return!1}_isSvgPointOccluded(A,e,t,i,o,s){const I=this._svgTmpVecD||(this._svgTmpVecD=new j);if(I.copy(A).project(e),!Number.isFinite(I.x)||!Number.isFinite(I.y)||!Number.isFinite(I.z))return!1;if(I.z<-1||I.z>1)return!0;t.setFromCamera({x:I.x,y:I.y},e);const n=t.ray.origin.distanceTo(A),B=Number.isFinite(s)?s:1e-4;t.near=0,t.far=Math.max(0,n-B);const C=t.intersectObjects(i,!0);if(!C.length)return!1;if(o&&o.size){for(const a of C)if(!this._isSvgHitFromEdgeFace(a,o))return!0;return!1}return!0}_isSvgHitFromEdgeFace(A,e){let t=A?.object||null;for(let i=0;i<3&&t;i+=1){if(e.has(t))return!0;t=t.parent||null}return!1}_updateCameraLightRig(){if(!this._cameraLightRig||!this.camera||!this.renderer)return;const{pointLights:A,lightDirections:e,baseLightRadius:t}=this._cameraLightRig;if(!A?.length||!e?.length)return;const i=this.renderer.getSize?this.renderer.getSize(new Ye):null,o=i?.width||this.renderer?.domElement?.clientWidth||0,s=i?.height||this.renderer?.domElement?.clientHeight||0;if(!o||!s)return;const I=this._worldPerPixel(this.camera,o,s),n=Math.sqrt(o*o+s*s),B=Math.max(t,I*n*1.4);A.forEach((C,a)=>{const Q=e[a]||[0,0,0];C.position.set(Q[0]*B,Q[1]*B,Q[2]*B)})}_collectAxisHelpers(){if(this._axisHelpers=new Set,!this.scene||typeof this.scene.traverse!="function"){this._axisHelpersDirty=!1;return}this.scene.traverse(A=>{A?.userData?.axisHelper&&this._axisHelpers.add(A)}),this._axisHelpersDirty=!1}_updateAxisHelpers(){if(!this.camera||!this.scene||(this._axisHelpersDirty&&this._collectAxisHelpers(),!this._axisHelpers||this._axisHelpers.size===0))return;const{width:A,height:e}=this._getContainerSize(),t=this._worldPerPixel(this.camera,A,e);if(!Number.isFinite(t)||t<=0)return;const i=new j(1,1,1),o=1e-9,s=r(I=>{I?.resolution&&typeof I.resolution.set=="function"&&I.resolution.set(A,e)},"setRes");for(const I of this._axisHelpers){if(!I||!I.isObject3D)continue;const n=Number(I.userData?.axisHelperPx),B=Number.isFinite(n)?n:this._axisHelperPx||CjA,C=t*B;let a=C,Q=C,E=C;if(I.userData?.axisHelperCompensateScale!==!1&&I.parent&&typeof I.parent.getWorldScale=="function"){try{I.parent.updateMatrixWorld?.(!0)}catch{}I.parent.getWorldScale(i);const h=r(w=>Math.abs(w)<o?1:Math.abs(w),"safe");a/=h(i.x),Q/=h(i.y),E/=h(i.z)}const l=I.userData._axisHelperScale;(!l||Math.abs(l.x-a)>1e-6||Math.abs(l.y-Q)>1e-6||Math.abs(l.z-E)>1e-6)&&(I.scale.set(a,Q,E),I.userData._axisHelperScale={x:a,y:Q,z:E}),I.traverse?.(h=>{const w=h?.material;w&&(Array.isArray(w)?w.forEach(s):s(w))})}}_computeSceneBounds({reuse:A=!1,includeExcluded:e=!1}={}){if(A&&this._sceneBoundsCache)return this._sceneBoundsCache;const t=new Eg,i=new Eg;let o=!1;if(!this.scene)return null;try{this.scene.updateMatrixWorld(!0)}catch{}const s=r(n=>{const B=n?.userData;return!!(B?.axisHelper||!e&&B?.excludeFromFit)},"shouldSkip"),I=r((n,B)=>{if(!n)return;const C=B||s(n);if(!C){const Q=n.geometry;if(Q){let E=null;if(n.boundingBox!==void 0){if(n.boundingBox==null&&typeof n.computeBoundingBox=="function")try{n.computeBoundingBox()}catch{}E=n.boundingBox}else{if(Q.boundingBox==null&&typeof Q.computeBoundingBox=="function")try{Q.computeBoundingBox()}catch{}E=Q.boundingBox}E&&(i.copy(E),i.applyMatrix4(n.matrixWorld),t.union(i),o=!0)}}const a=n.children||[];for(const Q of a)I(Q,C)},"visit");return I(this.scene,!1),!o||t.isEmpty()?null:(this._sceneBoundsCache=t,t)}_updateDepthRange({reuseBounds:A=!1}={}){if(!this.camera)return!1;const e=this._computeSceneBounds({reuse:A,includeExcluded:!0});if(!e)return!1;try{this.camera.updateMatrixWorld(!0)}catch{}const t=[new j(e.min.x,e.min.y,e.min.z),new j(e.min.x,e.min.y,e.max.z),new j(e.min.x,e.max.y,e.min.z),new j(e.min.x,e.max.y,e.max.z),new j(e.max.x,e.min.y,e.min.z),new j(e.max.x,e.min.y,e.max.z),new j(e.max.x,e.max.y,e.min.z),new j(e.max.x,e.max.y,e.max.z)],i=new It().copy(this.camera.matrixWorld).invert();let o=1/0,s=-1/0;for(const l of t)l.applyMatrix4(i),l.z<o&&(o=l.z),l.z>s&&(s=l.z);if(!Number.isFinite(o)||!Number.isFinite(s))return!1;const I=Math.max(1e-6,s-o),n=e.min.distanceTo(e.max),B=Math.max(I*.1,n*.1,.5);if(s>-B+1e-6){const l=new j;try{this.camera.getWorldDirection(l)}catch{l.set(0,0,-1)}if(l.lengthSq()>0){const h=s+B;l.normalize(),this.camera.position.addScaledVector(l,-h),o-=h,s-=h;try{this.camera.updateMatrixWorld(!0)}catch{}try{this.controls?.updateMatrixState?.()}catch{}}}const C=Math.max(1,-o+B);if(!Number.isFinite(C))return!1;const a=this.camera.isPerspectiveCamera?Math.max(1e-4,Math.min(1,C*.001)):0,Q=Math.abs((this.camera.near||0)-a)>1e-6,E=Math.abs((this.camera.far||0)-C)>1e-6;if(Q||E){this.camera.near=a,this.camera.far=C;try{this.camera.updateProjectionMatrix()}catch{}}return!0}zoomToFit(A=1.1){try{const e=this.controls;if(!e)return;const t=this._computeSceneBounds();if(!t)return;this.camera.updateMatrixWorld(!0);const i=[new j(t.min.x,t.min.y,t.min.z),new j(t.min.x,t.min.y,t.max.z),new j(t.min.x,t.max.y,t.min.z),new j(t.min.x,t.max.y,t.max.z),new j(t.max.x,t.min.y,t.min.z),new j(t.max.x,t.min.y,t.max.z),new j(t.max.x,t.max.y,t.min.z),new j(t.max.x,t.max.y,t.max.z)],o=new It().copy(this.camera.matrixWorld).invert();let s=1/0,I=1/0,n=-1/0,B=-1/0;for(const E of i)E.applyMatrix4(o),E.x<s&&(s=E.x),E.x>n&&(n=E.x),E.y<I&&(I=E.y),E.y>B&&(B=E.y);const C=Math.max(1e-6,n-s),a=Math.max(1e-6,B-I),Q=t.getCenter(new j);if(this.camera.isOrthographicCamera){const{width:E,height:l}=this._getContainerSize(),h=Math.max(1e-6,E/l),w=this.viewSize,d=C/2*Math.max(1,A),D=a/2*Math.max(1,A),u=w/D,M=w*h/d,y=Math.min(u,M),p=this.camera.zoom||1,m=Math.max(1e-6,y/p);try{e.updateMatrixState&&e.updateMatrixState()}catch{}e.focus(Q,m)}else if(this.camera.isPerspectiveCamera){const E=Nt.degToRad(this.camera.fov||50),l=Math.max(1e-6,a*Math.max(1,A)),h=Math.max(1e-6,C*Math.max(1,A)),w=l*.5/Math.max(1e-6,Math.tan(E*.5)),d=2*Math.atan(Math.tan(E*.5)*Math.max(1e-6,this.camera.aspect||1)),D=h*.5/Math.max(1e-6,Math.tan(d*.5)),u=Math.max(w,D,.001),M=this.camera.position.clone().sub(e.target||Q);M.lengthSq()<1e-12&&M.set(1,1,1),M.normalize(),this.camera.position.copy(Q).addScaledVector(M,u),e.target&&e.target.copy(Q),this.camera.lookAt(Q);try{e.updateMatrixState&&e.updateMatrixState()}catch{}}try{e.update&&e.update()}catch{}this.render()}catch{}}setWireframe(A){this._wireframeEnabled=!!A;try{this.scene.traverse(e=>{if(!e)return;try{let i=e;for(;i;){if(i.isTransformGizmo)return;i=i.parent}}catch{}if(e.type==="EDGE"||e.type==="LOOP"||e.isLine||e.isLine2||e.isLineSegments||e.isLineLoop)return;const t=r(i=>{i&&"wireframe"in i&&(i.wireframe=!!A)},"apply");e.material&&(Array.isArray(e.material)?e.material.forEach(t):t(e.material))})}catch{}this.render()}toggleWireframe(){this.setWireframe(!this._wireframeEnabled)}applyMetadataColors(A=null){const e=this.partHistory?.metadataManager,t=this.partHistory?.scene||this.scene;if(!e||!t)return;const i=this.renderer?.getSize?.(new Ye)||null,o=Math.max(1,i?.width||this.renderer?.domElement?.clientWidth||1),s=Math.max(1,i?.height||this.renderer?.domElement?.clientHeight||1),I=["solidColor","color"],n=["faceColor","color"],B=["edgeColor","color"],C=["edgeColor"],a=r((d,D)=>{if(!d||typeof d!="object")return null;for(const u of D){if(!Object.prototype.hasOwnProperty.call(d,u))continue;const M=d[u];if(M!=null&&!(typeof M=="string"&&M.trim()===""))return M}return null},"pickColorValue"),Q=r(d=>{if(d==null)return null;if(d?.isColor)try{return typeof d.clone=="function"?d.clone():d}catch{return d}if(typeof d=="number"&&Number.isFinite(d))try{return new ct(d)}catch{return null}if(typeof d=="string"){const D=d.trim();if(!D)return null;const u=D.toLowerCase(),M=/^#([0-9a-f]{3}|[0-9a-f]{6})$/.test(u),y=/^0x[0-9a-f]{6}$/.test(u),p=/^(rgb|rgba|hsl|hsla)\(/.test(u);if(!M&&!y&&!p)return null;if(y){const m=Number(D);if(Number.isFinite(m))try{return new ct(m)}catch{return null}}try{return new ct(D)}catch{return null}}if(Array.isArray(d)&&d.length>=3){const D=Number(d[0]),u=Number(d[1]),M=Number(d[2]);if(![D,u,M].every(Number.isFinite))return null;const y=Math.max(D,u,M);try{return y>1?new ct(D/255,u/255,M/255):new ct(D,u,M)}catch{return null}}if(typeof d=="object"){const D=Number(d.r),u=Number(d.g),M=Number(d.b);if([D,u,M].every(Number.isFinite)){const y=Math.max(D,u,M);try{return y>1?new ct(D/255,u/255,M/255):new ct(D,u,M)}catch{return null}}}return null},"parseColor"),E=r(d=>{if(!d||typeof e.getMetadata!="function")return null;try{return e.getMetadata(d)}catch{return null}},"getMeta"),l=r((d,D,u)=>{if(!d||!D)return;d.userData||(d.userData={});const M=d.userData,y=M.__defaultMaterial??D;M.__defaultMaterial||(M.__defaultMaterial=D);const p=r(f=>{bs.setBaseMaterial(d,f)},"applyBase");if(!u){if(M.__metadataMaterial&&M.__metadataMaterial!==y)try{M.__metadataMaterial.dispose?.()}catch{}try{delete M.__metadataMaterial}catch{}try{delete M.__metadataColor}catch{}p(y);return}const m=u.getHexString();if(M.__metadataColor===m&&M.__metadataMaterial){p(M.__metadataMaterial);return}let F=null;try{F=typeof D.clone=="function"?D.clone():null}catch{F=null}if(F){try{F.color&&typeof F.color.set=="function"&&F.color.set(u)}catch{}try{F.resolution&&typeof F.resolution.set=="function"&&F.resolution.set(o,s)}catch{}try{F.needsUpdate=!0}catch{}if(M.__metadataMaterial&&M.__metadataMaterial!==y)try{M.__metadataMaterial.dispose?.()}catch{}M.__metadataColor=m,M.__metadataMaterial=F,p(F)}},"applyMaterial"),h=r(d=>{if(!d||d.type!=="SOLID")return;const D=E(d.name),u=d?.userData?.metadata||null,M=Q(a(D,I)??a(u,I)),y=Q(a(D,C)??a(u,C)),p=Array.isArray(d.children)?d.children:[];for(const m of p)if(m){if(m.type==="FACE"){const F=m.name||m.userData?.faceName||null,f=F?E(F):null;let S=null;if(F&&typeof d.getFaceMetadata=="function")try{S=d.getFaceMetadata(F)}catch{S=null}const N=Q(a(f,n)??a(S,n))||M,G=Co.FACE?.BASE??m.material;l(m,G,N)}else if(m.type==="EDGE"){const F=m.name||null,f=F?E(F):null;let S=null;if(F&&typeof d.getEdgeMetadata=="function")try{S=d.getEdgeMetadata(F)}catch{S=null}let N=Q(a(f,B)??a(S,B));!N&&y&&(N=y);const G=!!(m.userData?.faceA||m.userData?.faceB),Y=m.userData?.__defaultMaterial??m.material,R=G?Y??Co.EDGE?.BASE??m.material:Y;l(m,R,N)}}},"applyToSolid"),w=r(d=>{if(!d)return null;if(d.type==="SOLID")return d;if(d.parentSolid)return d.parentSolid;let D=d.parent;for(;D;){if(D.type==="SOLID")return D;D=D.parent}return null},"resolveSolid");if(A){let d=A;if(typeof d=="string")try{d=t.getObjectByName(d)}catch{d=null}const D=w(d);if(D)h(D);else if(d&&(d.type==="FACE"||d.type==="EDGE")){const u=d.name||null,M=u?E(u):null,y=d.type==="FACE"?n:B,p=Q(a(M,y)),m=d.type==="FACE"?Co.FACE?.BASE??d.material:Co.EDGE?.BASE??d.material;l(d,m,p)}}else t.traverse(d=>{d&&d.type==="SOLID"&&h(d)});try{this.render()}catch{}}_loop(){this._raf=requestAnimationFrame(this._loop),this.controls.update();let A=!1;try{const e=typeof window<"u"&&window.__BREP_activeXform||null,t=e&&e.controls;t&&(A=!0,typeof t.update=="function"?t.update():t.updateMatrixWorld(!0))}catch{}(this._cameraMoving||this._sketchMode||A)&&this.render()}_getPointerNDC(A){const e=this.renderer.domElement.getBoundingClientRect(),t=(A.clientX-e.left)/e.width,i=(A.clientY-e.top)/e.height;return new Ye(t*2-1,-(i*2-1))}_isEventOverRenderer(A){if(!A||!this.renderer?.domElement)return!1;const e=this.renderer.domElement.getBoundingClientRect(),t=A.clientX,i=A.clientY;return t>=e.left&&t<=e.right&&i>=e.top&&i<=e.bottom}_mapIntersectionToTarget(A,e={}){if(!A||!A.object)return null;const{allowAnyAllowedType:t=!1,ignoreSelectionFilter:i=!1}=e,o=r(n=>n?i?!0:t&&typeof tt.matchesAllowedType=="function"?tt.matchesAllowedType(n):typeof tt.IsAllowed=="function"?tt.IsAllowed(n):!0:!1,"isAllowed");let s=A.object;s&&s.type==="POINTS"&&s.parent&&String(s.parent.type||"").toUpperCase()===tt.VERTEX&&(s=s.parent);let I=s;for(;I&&typeof I.onClick!="function"&&I.visible;)I=I.parent;if(I||(I=s),!I)return null;if(typeof o=="function"&&!o(I.type)&&!I.selected){let n=I.parent;for(;n&&!o(n.type);)n=n.parent;if(n&&o(n.type))I=n;else return null}return I}_pickAtEvent(A,e={}){const{collectAll:t=!1,allowAnyAllowedType:i=!1,ignoreSelectionFilter:o=!1}=e;if(this._sketchMode)return t?{hit:null,target:null,candidates:[]}:{hit:null,target:null};if(this._splineMode)try{const B=typeof this._splineMode.isActive=="function",C=B?this._splineMode.isActive():!1;(!B||!C)&&this.endSplineMode()}catch{this.endSplineMode()}if(this._splineMode){if(!A)return t?{hit:null,target:null,candidates:[]}:{hit:null,target:null};const B=this._getPointerNDC(A);try{this.camera.updateMatrixWorld(!0)}catch{}try{this.camera.updateProjectionMatrix?.()}catch{}this.raycaster.setFromCamera(B,this.camera);try{const E=this.renderer.domElement.getBoundingClientRect(),l=this._worldPerPixel(this.camera,E.width,E.height);this.raycaster.params.Points=this.raycaster.params.Points||{},this.raycaster.params.Points.threshold=Math.max(.05,l*6),this.raycaster.params.Line=this.raycaster.params.Line||{},this.raycaster.params.Line.threshold=Math.max(.05,l*6);const h=window.devicePixelRatio||1;this.raycaster.params.Line2=this.raycaster.params.Line2||{},this.raycaster.params.Line2.threshold=Math.max(1,2*h)}catch{}try{const E=this.raycaster.ray,l=E.direction.clone().normalize(),h=Math.max(1,Math.abs(this.camera.far||0),Math.abs(this.camera.near||0),this.viewSize*40);E.origin.addScaledVector(l,-h)}catch{}const C=this._withDoubleSidedPicking(()=>this.raycaster.intersectObjects(this.scene.children,!0)),a=[],Q=r(E=>{const l=E?.userData||{};return l.isSplineVertex?0:l.isPortChild||l.nurbsCageSegment?1:l.nurbsCageQuad?2:3},"splineCategory");for(const E of C){if(!E||!E.object||!(E.object.userData?.isSplineVertex||E.object.userData?.isSplineWeight||E.object.userData?.isPortChild))continue;const l=E.object;typeof l.onClick=="function"&&a.push({hit:E,target:l,category:Q(l),distance:Number.isFinite(E.distance)?E.distance:1/0})}if(a.length){a.sort((l,h)=>{if(l.category!==h.category)return l.category-h.category;const w=l.distance-h.distance;if(Math.abs(w)>1e-7)return w;const d=l.target?.userData?.isSplineVertex?0:1,D=h.target?.userData?.isSplineVertex?0:1;return d-D});const E=a[0];return{hit:E.hit,target:E.target}}return t?{hit:null,target:null,candidates:[]}:{hit:null,target:null}}if(!A)return t?{hit:null,target:null,candidates:[]}:{hit:null,target:null};const s=this._getPointerNDC(A);try{this.camera.updateMatrixWorld(!0)}catch{}this.raycaster.setFromCamera(s,this.camera);try{const B=this.renderer.domElement.getBoundingClientRect(),C=this._worldPerPixel(this.camera,B.width,B.height);this.raycaster.params.Line=this.raycaster.params.Line||{},this.raycaster.params.Line.threshold=Math.max(.05,C*6);const a=window.devicePixelRatio||1;this.raycaster.params.Line2=this.raycaster.params.Line2||{},this.raycaster.params.Line2.threshold=Math.max(1,2*a),this.raycaster.params.Points=this.raycaster.params.Points||{},this.raycaster.params.Points.threshold=Math.max(.05,C*6)}catch{}try{const B=this.raycaster.ray,C=B.direction.clone().normalize(),a=Math.max(1,Math.abs(this.camera.far||0),Math.abs(this.camera.near||0),this.viewSize*40);B.origin.addScaledVector(C,-a)}catch{}const I=this._withDoubleSidedPicking(()=>this.raycaster.intersectObjects(this.scene.children,!0));I.length>0&&(Sy("NORMAL MODE CLICK DEBUG:"),Sy(`- Mouse NDC: (${s.x.toFixed(3)}, ${s.y.toFixed(3)})`),Sy(`- Total intersections found: ${I.length}`));const n=[];for(const B of I){if(!B||!B.object)continue;const C=r(a=>a.parent===null?!0:a.visible===!1?!1:C(a.parent),"testVisible");if(C(B.object)){const a=this._mapIntersectionToTarget(B,{allowAnyAllowedType:i,ignoreSelectionFilter:o});if(a){if(t){n.push({hit:B,target:a,distance:B.distance??1/0});continue}return{hit:B,target:a}}}}return t?{hit:n[0]?.hit||null,target:n[0]?.target||null,candidates:n}:{hit:null,target:null}}_withDoubleSidedPicking(A){if(!A)return null;const e=new Set,t=r(i=>{!i||typeof i.side>"u"||i.side===UC&&(e.add(i),i.side=co)},"markMaterial");try{return this.scene&&typeof this.scene.traverse=="function"&&this.scene.traverse(i=>{if(!i)return;const o=i.material;Array.isArray(o)?o.forEach(t):t(o)}),A()}finally{for(const i of e)try{i.side=UC}catch{}}}_updateHover(A){if(this._shouldSuppressSceneHover()){try{tt.clearHover()}catch{}return}const{primary:e}=this._collectSelectionCandidates(A);if(e)try{tt.setHoverObject(e)}catch{}else try{tt.clearHover()}catch{}}_isFeatureDimensionDragActive(){try{return!!this.historyWidget?.isFeatureDimensionDragging?.()}catch{return!1}}_shouldSuppressSceneHover(){return this._isFeatureDimensionDragActive()}_collectSelectionCandidates(A){const e=(()=>{try{const p=tt.getAvailableTypes?.()||[];if(Array.isArray(p)&&p.length>0)return p;if(Array.isArray(tt.TYPES))return tt.TYPES.filter(m=>m!==tt.ALL)}catch{}return[]})(),t=r(p=>String(p||"").toUpperCase(),"normType"),i=new Set(e.map(t)),o=[tt.VERTEX,tt.EDGE,tt.FACE,tt.PLANE,tt.SKETCH,tt.DATUM,tt.HELIX,tt.LOOP,tt.SOLID,tt.COMPONENT].map(p=>t(p)),s=t(tt.SOLID),I=t(tt.COMPONENT),n=Array.from(i).some(p=>p&&p!==s&&p!==I),B=r(p=>{const m=t(p);if(n&&(m===s||m===I))return o.length+2;const F=o.indexOf(m);return F===-1?o.length:F},"getPriority"),C=r(p=>i.size===0?!0:i.has(t(p)),"isAllowedType"),{target:a,candidates:Q=[]}=this._pickAtEvent(A,{collectAll:!0,allowAnyAllowedType:!0}),E=[],l=new Set,h=r(p=>{if(!p)return null;let m=p;return t(m.type)==="POINTS"&&m.parent&&t(m.parent.type)===t(tt.VERTEX)&&(m=m.parent),!C(m.type)&&m.parent&&C(m.parent.type)&&(m=m.parent),m},"normalizeTarget"),w=r((p,m)=>{const F=h(p);if(!F||!C(F.type))return;const f=F.uuid||F.name||`${F.type}-${l.size}`;l.has(f)||(l.add(f),E.push({target:F,distance:Number.isFinite(m)?m:1/0,label:this._describeSelectionCandidate(F)}))},"addEntry");for(const p of Q){const m=p?.target;if(!m)continue;const F=Number.isFinite(p?.distance)?p.distance:p?.hit?.distance??1/0;w(m,F)}E.sort((p,m)=>p.distance-m.distance);const d=[],D=r((p,m)=>{const F=h(p);if(!F||!C(F.type))return;const f=F.uuid||F.name||`${F.type}-${l.size}`;l.has(f)||(l.add(f),d.push({target:F,distance:Number.isFinite(m)?m:1/0,label:this._describeSelectionCandidate(F)}))},"addExtra"),u=r((p,m)=>{let F=p?.parent||null;for(;F;){if(t(F.type)===t(m))return F;F=F.parent||null}return null},"findAncestorOfType");for(const p of E.slice()){const m=p.target,F=p.distance,f=u(m,tt.SOLID),S=u(m,tt.COMPONENT);D(S,F),D(f,F)}d.sort((p,m)=>p.distance-m.distance);const M=E.concat(d);M.sort((p,m)=>{const F=B(p?.target?.type),f=B(m?.target?.type);return F!==f?F-f:(p?.distance??1/0)-(m?.distance??1/0)});const y=M[0]?.target||a||null;return{ordered:M,primary:y}}_selectAt(A){const{ordered:e,primary:t}=this._collectSelectionCandidates(A);if(t){if(e.length>1){this._scheduleSelectionOverlay(A,e);return}this._hideSelectionOverlay(),this._applySelectionTarget(t,{pointerEvent:A})}}_applySelectionTarget(A,e={}){if(!A)return;if(this._lastInspectorTarget=A,this._lastInspectorSolid=this._findParentSolid(A),this._triangleDebugger&&this._triangleDebugger.isOpen&&this._triangleDebugger.isOpen())try{this._triangleDebugger.refreshTarget(A)}catch{}const{triggerOnClick:t=!0,allowDiagnostics:i=!0,pointerEvent:o=void 0}=e;if(i&&this._diagPickOnce){this._diagPickOnce=!1;try{this._showDiagnosticsFor(A)}catch(n){try{console.warn("Diagnostics failed:",n)}catch{}}if(this._diagRestoreFilter){try{tt.restoreAllowedSelectionTypes&&tt.restoreAllowedSelectionTypes()}catch{}this._diagRestoreFilter=!1}}if(this._inspectorOpen)try{this._updateInspectorFor(A)}catch(n){try{console.warn("Inspector update failed:",n)}catch{}}const s=this.__metadataPanelController;if(s&&typeof s.handleSelection=="function")try{s.handleSelection(A)}catch(n){try{console.warn("Metadata panel update failed:",n)}catch{}}const I=this.__solidOverlapDiagnosticsController;if(I&&typeof I.handleSelection=="function")try{I.handleSelection(A)}catch(n){try{console.warn("Solid overlap diagnostics update failed:",n)}catch{}}if(t&&typeof A.onClick=="function")try{A.onClick(o)}catch{}}_scheduleHoverRefresh(){this._disposed||this._hoverRefreshRaf!=null||(this._hoverRefreshRaf=requestAnimationFrame(()=>{if(this._hoverRefreshRaf=null,!this._disposed)try{this.render()}catch{}}))}_onHoverChanged(){this._scheduleHoverRefresh()}_clearSelectionOverlayTimer(){this._selectionOverlayTimer&&(clearTimeout(this._selectionOverlayTimer),this._selectionOverlayTimer=null),this._pendingSelectionOverlay=null}_isAssemblyChildSelection(A){if(!A)return!1;const e=(A.type||"").toUpperCase();if(!(e===tt.FACE||e===tt.EDGE||e===tt.VERTEX||e==="POINTS"))return!1;const t=r((s,I)=>{const n=r(C=>(C||"").toUpperCase(),"norm");let B=s?.parent||null;for(;B;){if(n(B.type)===n(I))return B;B=B.parent||null}return null},"findAncestorOfType")(A,tt.SOLID);if(!t)return!1;const i=t.parent||null;if(!i)return!1;const o=(i.type||"").toUpperCase();return!!(o===tt.COMPONENT||o==="COMPONENT"||i.isAssemblyComponent)}_shouldDelaySelectionOverlay(A=[]){try{if(tt.allowedSelectionTypes!==tt.ALL)return!1;const e=Array.isArray(A)&&A.length?A[0].target:null;return this._isAssemblyChildSelection(e)}catch{return!1}}_scheduleSelectionOverlay(A,e){if(this._clearSelectionOverlayTimer(),!this._shouldDelaySelectionOverlay(e)){this._showSelectionOverlay(A,e);return}const t=A?{clientX:A.clientX,clientY:A.clientY}:null;this._pendingSelectionOverlay={event:t,candidates:e},this._selectionOverlayTimer=setTimeout(()=>{this._selectionOverlayTimer=null;const i=this._pendingSelectionOverlay;this._pendingSelectionOverlay=null,i&&this._showSelectionOverlay(i.event,i.candidates)},300)}_describeSelectionCandidate(A){if(!A)return"Selection";const e=A.name&&String(A.name).trim()?String(A.name).trim():null,t=A.type||"object";return e||t}_showSelectionOverlay(A,e){if(this._clearSelectionOverlayTimer(),this._hideSelectionOverlay(),!Array.isArray(e)||e.length===0)return;const t=document.createElement("div");t.className="selection-picker",t.classList.add("is-hovered");const i=document.createElement("div");i.className="selection-picker__title selection-picker__handle",i.textContent="Select an object";const o=document.createElement("div");o.className="selection-picker__header",o.appendChild(i);const s=document.createElement("button");s.type="button",s.textContent="Clear Selection",s.className="selection-picker__clear",s.addEventListener("click",f=>{f.stopPropagation(),f.preventDefault();try{const S=this.partHistory?.scene||this.scene;S&&tt.unselectAll(S)}catch{}this._hideSelectionOverlay()}),o.appendChild(s),t.appendChild(o);const I={wrap:t,drag:{active:!1},peekTimer:null},n=r(()=>{I.peekTimer&&(clearTimeout(I.peekTimer),I.peekTimer=null);try{t.style.opacity="0.8"}catch{}I.peekTimer=setTimeout(()=>{try{t.style.opacity=""}catch{}I.peekTimer=null},500)},"triggerPeek"),B=document.createElement("div");B.className="selection-picker__list";const C={itemHeight:0,gap:0,paddingTop:0},a=r(()=>{try{const f=getComputedStyle(B),S=parseFloat(f.rowGap||f.gap||"0")||0,N=parseFloat(f.paddingTop||"0")||0;C.gap=S,C.paddingTop=N}catch{}},"readListStyles"),Q=r(()=>{if(!C.gap&&!C.paddingTop&&a(),C.itemHeight)return C.itemHeight;const f=B.querySelector(".selection-picker__item");if(!f)return 0;const S=f.getBoundingClientRect();return C.itemHeight=S.height||f.offsetHeight||0,C.itemHeight},"ensureItemMetrics"),E=r(()=>{a();const f=B.querySelector(".selection-picker__item");if(!f)return;const S=B.getBoundingClientRect(),N=f.getBoundingClientRect();C.itemHeight=N.height||C.itemHeight||0;const G=Math.max(0,Math.round(S.height-C.paddingTop-N.height));B.style.paddingBottom=`${G}px`},"updateListPadding");e.forEach(f=>{if(!f?.target)return;const S=document.createElement("button");S.type="button",S.className="selection-picker__item";const N=document.createElement("div");N.className="selection-picker__line";const G=document.createElement("div");G.className="selection-picker__type",G.textContent=String(f.target.type||"").toUpperCase()||"OBJECT";const Y=document.createElement("div");Y.className="selection-picker__name",Y.textContent=f.label,N.appendChild(G),N.appendChild(Y),S.appendChild(N),S.addEventListener("mouseenter",()=>{n();try{tt.setHoverObject(f.target,{ignoreFilter:!0})}catch{}}),S.addEventListener("mouseleave",()=>{try{tt.clearHover()}catch{}}),S.addEventListener("click",R=>{R.stopPropagation(),R.preventDefault?.();try{console.log("Selection picker selected:",{type:f.target?.type,label:f.label,target:f.target})}catch{}this._hideSelectionOverlay(),this._applySelectionTarget(f.target)}),B.appendChild(S)});const l=r(f=>{try{f.preventDefault(),f.stopPropagation()}catch{}if(!B||B.children.length===0)return;const S=Math.sign(f.deltaY||0);if(!S)return;const N=Q();if(!N)return;const G=Math.max(1,Math.round(N+C.gap)),Y=Math.max(0,B.scrollHeight-B.clientHeight),R=Math.min(Y,Math.max(0,B.scrollTop+S*G));B.scrollTo({top:R})},"onWheelSnapScroll");B.addEventListener("wheel",l,{passive:!1}),t.appendChild(B);const h=A?.clientX??window.innerWidth/2,w=A?.clientY??window.innerHeight/2;t.style.left=`${h}px`,t.style.top=`${w}px`,document.body.appendChild(t);const d=r(()=>{const f=t.getBoundingClientRect(),S=t.querySelector(".selection-picker__item");let N=h,G=w;if(S){const b=S.getBoundingClientRect(),L=b.left-f.left+b.width/2,H=b.top-f.top+b.height/2;N=h-L,G=w-H}const Y=12,R=f.width,k=f.height;N+R>window.innerWidth-Y&&(N=Math.max(Y,window.innerWidth-R-Y)),G+k>window.innerHeight-Y&&(G=Math.max(Y,window.innerHeight-k-Y)),N<Y&&(N=Y),G<Y&&(G=Y),t.style.left=`${N}px`,t.style.top=`${G}px`},"adjustWithinViewport");requestAnimationFrame(()=>{E(),d()});const D=r(()=>{t.classList.add("is-hovered")},"onEnter"),u=r(()=>{I.drag.active||t.classList.remove("is-hovered")},"onLeave"),M=r(f=>{if(!I.drag.active)return;const S=12,N=t.getBoundingClientRect(),G=N.width,Y=N.height;let R=f.clientX-I.drag.offsetX,k=f.clientY-I.drag.offsetY;R+G>window.innerWidth-S&&(R=Math.max(S,window.innerWidth-G-S)),k+Y>window.innerHeight-S&&(k=Math.max(S,window.innerHeight-Y-S)),R<S&&(R=S),k<S&&(k=S),t.style.left=`${R}px`,t.style.top=`${k}px`},"onDragMove"),y=r(f=>{if(I.drag.active&&(I.drag.active=!1,t.classList.remove("dragging"),t.matches(":hover")||t.classList.remove("is-hovered"),window.removeEventListener("pointermove",M,{passive:!0}),window.removeEventListener("pointerup",y,{passive:!0,capture:!0}),f))try{f.stopPropagation()}catch{}},"stopDrag"),p=r(f=>{if(f.button!==0)return;f.preventDefault(),f.stopPropagation();const S=t.getBoundingClientRect();I.drag.active=!0,I.drag.offsetX=f.clientX-S.left,I.drag.offsetY=f.clientY-S.top,t.classList.add("dragging"),t.classList.add("is-hovered"),window.addEventListener("pointermove",M,{passive:!0}),window.addEventListener("pointerup",y,{passive:!0,capture:!0})},"onDragStart");i.addEventListener("pointerdown",p),t.addEventListener("pointerenter",D),t.addEventListener("pointerleave",u);const m=r(f=>{t.contains(f.target)||this._hideSelectionOverlay()},"onPointerDown"),F=r(f=>{f.key==="Escape"&&this._hideSelectionOverlay()},"onKey");document.addEventListener("pointerdown",m,!0),document.addEventListener("keydown",F,!0),this._selectionOverlay={wrap:t,onPointerDown:m,onKey:F,onEnter:D,onLeave:u,onDragStart:p,onDragMove:M,stopDrag:y,onWheelRotate:l,list:B,overlayState:I}}_hideSelectionOverlay(){const A=this._selectionOverlay;if(A){this._clearSelectionOverlayTimer();try{A.stopDrag?.()}catch{}document.removeEventListener("pointerdown",A.onPointerDown,!0),document.removeEventListener("keydown",A.onKey,!0);try{A.wrap.removeEventListener("pointerenter",A.onEnter)}catch{}try{A.wrap.removeEventListener("pointerleave",A.onLeave)}catch{}try{A.wrap.querySelector(".selection-picker__handle")?.removeEventListener("pointerdown",A.onDragStart)}catch{}try{window.removeEventListener("pointermove",A.onDragMove,{passive:!0})}catch{}try{window.removeEventListener("pointerup",A.stopDrag,{passive:!0,capture:!0})}catch{}try{A.list?.removeEventListener("wheel",A.onWheelRotate,{passive:!1})}catch{}try{A.overlayState?.peekTimer&&(clearTimeout(A.overlayState.peekTimer),A.overlayState.peekTimer=null)}catch{}try{A.wrap.style.opacity=""}catch{}try{A.wrap.remove()}catch{}this._selectionOverlay=null;try{tt.clearHover()}catch{}try{this._lastPointerEvent&&this._updateHover(this._lastPointerEvent)}catch{}}}_onPointerMove(A){if(!this._disposed){this._lastPointerEvent=A;try{if(this.viewCube){try{this.viewCube.handlePointerMove?.(A)}catch{}if(this.viewCube.isEventInside(A))return}}catch{}try{const e=typeof window<"u"&&window.__BREP_activeXform||null;if(e&&typeof e.isOver=="function"&&e.isOver(A))return}catch{}if(this._shouldSuppressSceneHover()){try{tt.clearHover()}catch{}return}this._updateHover(A)}}_onPointerDown(A){if(!this._disposed){this._hideSelectionOverlay();try{const e=typeof window<"u"&&window.__BREP_activeXform||null;if(e&&typeof e.isOver=="function"&&e.isOver(A)){try{A.preventDefault()}catch{}return}}catch{}this._clearSelectionOverlayTimer();try{this._isEventOverRenderer(A)&&(this._lastCanvasPointerDownAt=Date.now())}catch{}try{this._cubeActive=!!(this.viewCube&&this.viewCube.isEventInside(A))}catch{this._cubeActive=!1}this._pointerDown=!0,this._downButton=A.button,this._downPos.x=A.clientX,this._downPos.y=A.clientY,this.controls.enabled=!this._cubeActive;try{A.preventDefault()}catch{}}}_onPointerUp(A){if(this._disposed)return;try{const o=typeof window<"u"&&window.__BREP_activeXform||null;if(o&&typeof o.isOver=="function"&&o.isOver(A)){try{A.preventDefault()}catch{}return}}catch{}if(this._cubeActive){try{if(this.viewCube&&this.viewCube.handleClick(A)){this._cubeActive=!1;return}}catch{}this._cubeActive=!1}const e=Math.abs(A.clientX-this._downPos.x),t=Math.abs(A.clientY-this._downPos.y),i=e+t>this._dragThreshold;this._pointerDown&&this._downButton===0&&!i&&this._selectAt(A),this._pointerDown=!1,this.controls.enabled=!0}_onContextMenu(A){}_handleEscapeAction(){if(!this._disposed){try{this._clearSelectionOverlayTimer()}catch{}try{this._hideSelectionOverlay()}catch{}try{this._splineMode?.clearSelection?.()}catch{}try{this._toggleComponentTransform?.(null)}catch{}try{this._stopComponentTransformSession?.()}catch{}try{const A=this.partHistory?.scene||this.scene;A&&(tt.unselectAll(A),tt.restoreAllowedSelectionTypes())}catch{}}}_onKeyDown(A){if(this._disposed||this._sheet2DEditorActive)return;const e=A?.target||null,t=e?.tagName?String(e.tagName).toLowerCase():"",i=!!(e&&(e.isContentEditable||t==="input"||t==="textarea"||t==="select")),o=(A?.key||"").toLowerCase(),s=!!(A?.ctrlKey||A?.metaKey),I=s&&!A?.altKey&&o==="z"&&!A?.shiftKey,n=s&&!A?.altKey&&(o==="y"||A?.shiftKey&&o==="z");if((I||n)&&!i){if(this._viewerOnlyMode){try{A.preventDefault()}catch{}try{A.stopImmediatePropagation()}catch{}return}if(this._imageEditorActive)return;try{this._sketchMode&&typeof this._sketchMode.undo=="function"&&typeof this._sketchMode.redo=="function"?I?this._sketchMode.undo():this._sketchMode.redo():this.partHistory&&this._runFeatureHistoryUndoRedo(n?"redo":"undo");try{A.preventDefault()}catch{}try{A.stopImmediatePropagation()}catch{}}catch{}return}const B=A?.key||A?.code||"";(B==="Escape"||B==="Esc")&&this._handleEscapeAction()}_findOwningComponent(A){let e=A;for(;e;){if(e.isAssemblyComponent||e.type===tt.COMPONENT||e.type==="COMPONENT")return e;e=e.parent}return null}_stopComponentTransformSession(){const A=this._componentTransformSession;if(!A)return;const{controls:e,helper:t,target:i,changeHandler:o,dragHandler:s,objectChangeHandler:I,cameraChangeHandler:n,cameraChangeSource:B,globalState:C}=A;try{e?.removeEventListener("change",o)}catch{}try{e?.removeEventListener("dragging-changed",s)}catch{}try{e?.removeEventListener("objectChange",I)}catch{}try{B?.removeEventListener?.("change",n)}catch{}try{e?.detach?.()}catch{}if(this.scene){try{e&&e.isObject3D&&this.scene.remove(e)}catch{}try{t&&t.isObject3D&&this.scene.remove(t)}catch{}try{i&&i.isObject3D&&this.scene.remove(i)}catch{}}try{e?.dispose?.()}catch{}try{window.__BREP_activeXform===C&&(window.__BREP_activeXform=null)}catch{}this._componentTransformSession=null;try{this.controls&&(this.controls.enabled=!0)}catch{}try{this.render()}catch{}}_activateComponentTransform(A){if(!A||A.fixed)return;const e=SpA;if(!e){console.warn("[Viewer] TransformControls unavailable; cannot activate component gizmo.");return}this._stopComponentTransformSession();try{AE&&typeof AE.__stopGlobalActiveXform=="function"&&AE.__stopGlobalActiveXform()}catch{}const t=new e(this.camera,this.renderer.domElement),i="translate";try{t.setMode(i)}catch{t.mode=i}try{t.showX=t.showY=t.showZ=!0}catch{}const o=new _g;o.name=`ComponentTransformTarget:${A.name||A.uuid||""}`;try{this.scene.updateMatrixWorld?.(!0)}catch{}try{A.updateMatrixWorld?.(!0)}catch{}const s=new Eg,I=s.setFromObject(A).isEmpty()?A.getWorldPosition(new j):s.getCenter(new j);o.position.copy(I);const n=A.getWorldQuaternion(new ai);o.quaternion.copy(n);const B=A.parent||this.scene;try{B?.updateMatrixWorld?.(!0)}catch{}const C=A.getWorldPosition(new j).sub(I),a=n.clone().invert();C.applyQuaternion(a);const Q=new It;B&&B.isObject3D?Q.copy(B.matrixWorld).invert():Q.identity(),this.scene.add(o);try{t.attach(o)}catch{}try{t.userData=t.userData||{},t.userData.excludeFromFit=!0,this.scene.add(t)}catch{}let E=null;try{E=typeof t.getHelper=="function"?t.getHelper():null,E&&E.isObject3D&&(E.userData=E.userData||{},E.userData.excludeFromFit=!0,this.scene.add(E))}catch{E=null}const l=r(b=>{if(!b||!b.isObject3D)return;const L=r(H=>{if(!H||!H.isObject3D)return;const J=H.userData||(H.userData={});if(J.__brepOverlayHook)return;const Z=H.onBeforeRender;H.onBeforeRender=function(P,x,V,tA,AA,_){try{P.clearDepth()}catch{}typeof Z=="function"&&Z.call(this,P,x,V,tA,AA,_)},J.__brepOverlayHook=!0},"apply");L(b);try{b.traverse(H=>L(H))}catch{}},"markOverlay");try{l(t)}catch{}try{l(E)}catch{}try{l(t?._gizmo)}catch{}try{l(t?.gizmo)}catch{}const h=new j,w=new j,d=new j,D=new j,u=new ai,M=new ai,y=new ai,p=new ai,m=r((b=!1)=>{try{try{this.scene.updateMatrixWorld?.(!0)}catch{}try{o.updateMatrixWorld?.(!0)}catch{}if(B&&B.isObject3D){try{B.updateMatrixWorld?.(!0)}catch{}Q.copy(B.matrixWorld).invert(),B.getWorldQuaternion(M),y.copy(M).invert()}else Q.identity(),M.set(0,0,0,1),y.copy(M);o.getWorldPosition(h),o.getWorldQuaternion(u),D.copy(C).applyQuaternion(u),w.copy(h).add(D),d.copy(w),B&&B.isObject3D&&d.applyMatrix4(Q),A.position.copy(d),B&&B.isObject3D?(p.copy(y).multiply(u),A.quaternion.copy(p)):A.quaternion.copy(u),A.updateMatrixWorld?.(!0),this.render(),b&&this.partHistory&&typeof this.partHistory.syncAssemblyComponentTransforms=="function"&&this.partHistory.syncAssemblyComponentTransforms()}catch(L){console.warn("[Viewer] Failed to apply transform to component:",L)}},"updateComponentTransform"),F=r(()=>{m(!1)},"changeHandler"),f=r(b=>{const L=!!(b&&b.value);try{this.controls&&(this.controls.enabled=!L)}catch{}L||m(!0)},"dragHandler"),S=r(()=>{!t||t.dragging||m(!0)},"objectChangeHandler");t.addEventListener("change",F),t.addEventListener("dragging-changed",f);try{t.addEventListener("objectChange",S)}catch{}const N=r(b=>{try{if(!b)return!1;const L=this._getPointerNDC(b);this.raycaster.setFromCamera(L,this.camera);const H=typeof t.getMode=="function"?t.getMode():t.mode||"translate",J=t._gizmo||t.gizmo||null,Z=(J&&J.picker?J.picker[H]||J.picker.translate||J.picker.rotate||J.picker.scale:J)||J||E||t;return Z?(this.raycaster.intersectObject(Z,!0)||[]).length>0:!1}catch{return!1}},"isOver"),G=r(()=>{try{typeof t.update=="function"?t.update():t.updateMatrixWorld(!0)}catch{}},"updateForCamera"),Y=r(()=>{G()},"cameraChangeHandler");try{this.controls?.addEventListener?.("change",Y)}catch{}const R={controls:t,viewer:this,target:o,isOver:N,updateForCamera:G};try{window.__BREP_activeXform=R}catch{}const k=typeof t.getMode=="function"?t.getMode():t.mode||i;this._componentTransformSession={component:A,controls:t,helper:E,target:o,changeHandler:F,dragHandler:f,objectChangeHandler:S,cameraChangeHandler:Y,cameraChangeSource:this.controls||null,globalState:R,mode:k},m(!1),this.render()}_toggleComponentTransform(A){if(!A){this._stopComponentTransformSession();return}if(A.fixed){try{typeof this._toast=="function"&&this._toast("Component is fixed and cannot be moved.")}catch{}return}const e=this._componentTransformSession;if(e&&e.component===A){const t=e.controls,i=typeof t?.getMode=="function"?t.getMode():t?.mode||e.mode||"translate";if(i==="translate"){const o="rotate";try{t?.setMode(o)}catch{t&&(t.mode=o)}e.mode=o;try{e.globalState?.updateForCamera?.()}catch{}try{this.render()}catch{}return}if(i==="rotate"){this._stopComponentTransformSession();return}this._stopComponentTransformSession();return}this._activateComponentTransform(A)}enableDiagnosticPick(){this._diagPickOnce=!0;try{this._toast("Click an item to inspect")}catch{}}toggleInspectorPanel(){this._inspectorOpen?this._closeInspectorPanel():this._openInspectorPanel()}_getInspectorSelectionTarget(){const A=this._lastInspectorTarget;if(A&&A.selected)return A;const e=this.partHistory?.scene||this.scene||null;if(!e||typeof e.traverse!="function")return null;let t=null;return e.traverse(i=>{t||!i||!i.selected||(t=i)}),t}_openInspectorPanel(){if(this._inspectorOpen)return;this._ensureInspectorPanel(),this._inspectorEl.style.display="flex",this._inspectorOpen=!0;const A=this._getInspectorSelectionTarget();if(A){try{this._updateInspectorFor(A)}catch{}return}try{this._setInspectorPlaceholder("Click an object in the scene to inspect.")}catch{}}_closeInspectorPanel(){if(this._inspectorOpen){this._inspectorOpen=!1;try{this._inspectorEl.style.display="none"}catch{}}}_ensureInspectorPanel(){if(this._inspectorEl)return;const A=Math.max(260,Math.floor((window?.innerHeight||800)*.7)),e=new sf({title:"Inspector",width:520,height:A,x:12,bottom:12,shaded:!1,onClose:r(()=>this._closeInspectorPanel(),"onClose")}),t=document.createElement("button");t.className="fw-btn",t.textContent="Triangle Debugger",t.title="Open triangle debugger for the current selection",t.addEventListener("click",()=>{try{this._openTriangleDebugger()}catch(s){try{console.warn("Triangle debugger failed:",s)}catch{}}}),e.addHeaderAction(t);const i=document.createElement("button");i.className="fw-btn",i.textContent="Download JSON",i.addEventListener("click",()=>{try{const s=this._lastInspectorDownload?this._lastInspectorDownload():this._lastInspectorJSON||"{}",I=new Blob([s],{type:"application/json"}),n=URL.createObjectURL(I),B=document.createElement("a");B.href=n,B.download="diagnostics.json",document.body.appendChild(B),B.click(),setTimeout(()=>{document.body.removeChild(B),URL.revokeObjectURL(n)},0)}catch{}}),e.addHeaderAction(i);const o=document.createElement("div");o.style.display="block",o.style.width="100%",o.style.height="100%",e.content.appendChild(o),this._inspectorFW=e,this._inspectorEl=e.root,this._inspectorContent=o,this._lastInspectorDownload=null,this._lastInspectorJSON="{}"}_setInspectorPlaceholder(A){if(!this._inspectorContent)return;this._inspectorContent.innerHTML="";const e=document.createElement("div");e.textContent=A||"",e.style.color="#9aa4b2",e.style.font='12px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',e.style.opacity="0.9",this._inspectorContent.appendChild(e),this._lastInspectorDownload=null,this._lastInspectorJSON="{}"}_updateInspectorFor(A){if(this._ensureInspectorPanel(),this._lastInspectorTarget=A||null,this._lastInspectorSolid=this._findParentSolid(A),this._triangleDebugger&&this._triangleDebugger.isOpen&&this._triangleDebugger.isOpen())try{this._triangleDebugger.refreshTarget(A)}catch{}if(!A){this._setInspectorPlaceholder("Nothing selected.");return}try{const{out:e,downloadFactory:t}=this._renderInspectorTree(A,this._inspectorContent,{title:"Object Inspector"});this._lastInspectorDownload=t,this._lastInspectorJSON=JSON.stringify(e,null,2)}catch(e){console.warn(e),this._setInspectorPlaceholder("Inspector failed. See console.")}}_renderInspectorTree(A,e,t={}){const i=t?.title||"Object Inspector",{out:o,downloadFactory:s}=this._buildDiagnostics(A);if(e){e.innerHTML="";const I=PLt(o,{title:i,showTypes:!0,collapseChildren:!0,resolveReference:r(n=>this._resolveInspectorReference(A,n),"resolveReference"),onReferenceNavigate:r(n=>this._openDetachedInspectorWindowFor(n?.target||null),"onReferenceNavigate")});e.appendChild(I)}return{out:o,downloadFactory:s}}_formatInspectorTargetLabel(A){const e=String(A?.type||A?.constructor?.name||"Object").toUpperCase(),t=A?.name||A?.userData?.faceName||A?.userData?.edgeName||null;return t?`${e} ${t}`:e}_makeInspectorReference(A,e){if(!A)return null;const t=this._formatInspectorTargetLabel(A),i=String(e||t);return{target:A,label:i,title:`Open ${i} in a new inspector window`}}_nodeHasName(A,e){if(!A||!e)return!1;const t=[A?.name,A?.userData?.faceName,A?.userData?.edgeName,A?.userData?.vertexName,A?.userData?.name];for(const i of t)if(typeof i=="string"&&i===e)return!0;return!1}_findSceneNodeByTypeAndName(A,e,t=null){if(!A||!e)return null;const i=String(A).toUpperCase(),o=[],s=this._findParentSolid(t);s&&o.push(s),t&&o.push(t);const I=this.partHistory?.scene||this.scene||null;I&&o.push(I);const n=new Set;for(const B of o){if(!B||n.has(B))continue;n.add(B);let C=null;if(typeof B.traverse=="function"?B.traverse(a=>{C||!a||String(a.type||"").toUpperCase()===i&&this._nodeHasName(a,e)&&(C=a)}):String(B?.type||"").toUpperCase()===i&&this._nodeHasName(B,e)&&(C=B),C)return C}return null}_resolveInspectorReference(A,e={}){if(!A||!e)return null;const t=Array.isArray(e.path)?e.path:[],i=e.key,o=e.value;if(!t.length||typeof o!="string"||!o)return null;const s=String(A.type||"").toUpperCase(),I=r(C=>Number.isInteger(C)?C:-1,"asIndex"),n=r((C,a=null)=>{const Q=(a&&String(a.type||"").toUpperCase()==="FACE"?a:null)||this._findSceneNodeByTypeAndName("FACE",C,A);return this._makeInspectorReference(Q,`FACE ${C}`)},"faceRef"),B=r((C,a=null)=>{const Q=(a&&String(a.type||"").toUpperCase()==="EDGE"?a:null)||this._findSceneNodeByTypeAndName("EDGE",C,A);return this._makeInspectorReference(Q,`EDGE ${C}`)},"edgeRef");if(s==="EDGE"){if(t[0]==="faces"){const C=I(t[1]),a=Array.isArray(A.faces)&&C>=0?A.faces[C]:null;return n(o,a)}return null}if(s==="FACE"){if(t[0]==="neighbors")return n(o);if(t[0]==="edges"){const C=I(t[1]),a=Array.isArray(A.edges)&&C>=0?A.edges[C]:null;if(t[2]==="name")return B(o,a);if(t[2]==="faces"){const Q=I(t[3]),E=Array.isArray(a?.faces)&&Q>=0?a.faces[Q]:null;return n(o,E)}}}if(s==="SOLID"){if((i==="faceName"||i==="face")&&typeof o=="string")return n(o);if(i==="name"&&t[0]==="edges")return B(o)}return i==="faceName"&&typeof o=="string"?n(o):null}_openDetachedInspectorWindowFor(A){if(!A)return null;const e=this._inspectorLinkedWindowSeed++,t=520,i=Math.max(260,Math.floor((window?.innerHeight||800)*.62)),o=28+e%8*26,s=52+e%8*20;let I=null,n=null,B="{}";const C=`Inspector: ${this._formatInspectorTargetLabel(A)}`;I=new sf({title:C,width:t,height:i,x:o,y:s,shaded:!1,onClose:r(()=>{try{this._inspectorLinkedWindows.delete(I)}catch{}try{I?.destroy?.()}catch{}},"onClose")}),this._inspectorLinkedWindows.add(I);const a=document.createElement("button");a.className="fw-btn",a.textContent="Download JSON",a.addEventListener("click",()=>{try{const E=n?n():B,l=new Blob([E],{type:"application/json"}),h=URL.createObjectURL(l),w=document.createElement("a");w.href=h,w.download="diagnostics.json",document.body.appendChild(w),w.click(),setTimeout(()=>{document.body.removeChild(w),URL.revokeObjectURL(h)},0)}catch{}}),I.addHeaderAction(a);const Q=document.createElement("div");Q.style.display="block",Q.style.width="100%",Q.style.height="100%",I.content.appendChild(Q);try{const E=this._renderInspectorTree(A,Q,{title:"Object Inspector"});n=E.downloadFactory,B=JSON.stringify(E.out,null,2)}catch(E){try{console.warn("Detached inspector render failed:",E)}catch{}Q.innerHTML="";const l=document.createElement("div");l.textContent="Inspector failed. See console.",l.style.color="#9aa4b2",l.style.font='12px ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace',Q.appendChild(l)}try{I.bringToFront?.()}catch{}return I}_getTriangleDebugger(){return this._triangleDebugger||(this._triangleDebugger=new rfg({viewer:this})),this._triangleDebugger}_openTriangleDebugger(){try{this._getTriangleDebugger().openFor(this._lastInspectorTarget||this._lastInspectorSolid||null)}catch(A){try{console.warn("Triangle debugger open failed:",A)}catch{}}}_findParentSolid(A){const e=r(i=>i&&String(i.type||"").toUpperCase()==="SOLID","isSolid");let t=A||null;if(t&&t.parentSolid&&e(t.parentSolid))return t.parentSolid;if(t&&t.userData&&t.userData.parentSolid&&e(t.userData.parentSolid))return t.userData.parentSolid;for(;t;){if(e(t))return t;if(t.parentSolid&&e(t.parentSolid))return t.parentSolid;if(t.userData&&t.userData.parentSolid&&e(t.userData.parentSolid))return t.userData.parentSolid;t=t.parent||null}return null}_round(A){return Math.abs(A)<1e-12?0:Number(A.toFixed(6))}_edgePointsWorld(A){const e=[],t=new j,i=A?.userData?.polylineLocal,o=!!A?.userData?.polylineWorld;if(Array.isArray(i)&&i.length>=2)if(o)for(const s of i)e.push([this._round(s[0]),this._round(s[1]),this._round(s[2])]);else for(const s of i)t.set(s[0],s[1],s[2]).applyMatrix4(A.matrixWorld),e.push([this._round(t.x),this._round(t.y),this._round(t.z)]);else{const s=A?.geometry?.getAttribute?.("position");if(s&&s.itemSize===3)for(let I=0;I<s.count;I++)t.set(s.getX(I),s.getY(I),s.getZ(I)).applyMatrix4(A.matrixWorld),e.push([this._round(t.x),this._round(t.y),this._round(t.z)])}return e}_buildDiagnostics(A){const e={type:A?.type||String(A?.constructor?.name||"Object"),name:A?.name||null};let t=null;try{A.owningFeatureID?(e.owningFeatureID=A.owningFeatureID,e._owningFeatureFormatted=`Created by: ${A.owningFeatureID}`):A.parentSolid&&A.parentSolid.owningFeatureID&&(e.owningFeatureID=A.parentSolid.owningFeatureID,e._owningFeatureFormatted=`Created by: ${A.parentSolid.owningFeatureID}`)}catch{}if(A.type==="FACE"){let i=A.parent;for(;i&&i.type!=="SOLID";)i=i.parent;const o=A.userData?.faceName||A.name;try{if(i&&typeof i.getFace=="function"&&o){const s=i.getFace(o)||[],I=r(B=>({indices:Array.isArray(B.indices)?B.indices:void 0,p1:B.p1.map(this._round),p2:B.p2.map(this._round),p3:B.p3.map(this._round),normal:(()=>{const C=B.p1,a=B.p2,Q=B.p3,E=a[0]-C[0],l=a[1]-C[1],h=a[2]-C[2],w=Q[0]-C[0],d=Q[1]-C[1],D=Q[2]-C[2],u=l*D-h*d,M=h*w-E*D,y=E*d-l*w,p=Math.hypot(u,M,y)||1;return[this._round(u/p),this._round(M/p),this._round(y/p)]})(),area:(()=>{const C=B.p1,a=B.p2,Q=B.p3,E=a[0]-C[0],l=a[1]-C[1],h=a[2]-C[2],w=Q[0]-C[0],d=Q[1]-C[1],D=Q[2]-C[2],u=l*D-h*d,M=h*w-E*D,y=E*d-l*w;return this._round(.5*Math.hypot(u,M,y))})()}),"mapTri"),n=s.map(I);try{let B=5e3;typeof window<"u"&&Number.isFinite(window.BREP_DIAG_TRI_MAX_FACE)&&(B=window.BREP_DIAG_TRI_MAX_FACE|0),B<0&&(B=n.length);const C=Math.min(n.length,B);e._trianglesSummary=`${n.length} triangles (click to expand)`,e._lazyTriangles=()=>n.slice(0,C),C<n.length&&(e.trianglesTruncated=!0,e.trianglesTotal=n.length,e.trianglesLimit=B)}catch{e._trianglesSummary=`${n.length} triangles (click to expand)`,e._lazyTriangles=()=>n}t=r(()=>{const B=JSON.parse(JSON.stringify(e));return B.triangles=n,delete B.trianglesTruncated,delete B.trianglesLimit,delete B.trianglesTotal,JSON.stringify(B,null,2)},"downloadFactory")}else{const s=A.geometry?.getAttribute?.("position");if(s){const I=new j,n=s.count/3|0,B=new Array(n);for(let C=0;C<n;C++){I.set(s.getX(3*C+0),s.getY(3*C+0),s.getZ(3*C+0)).applyMatrix4(A.matrixWorld);const a=[this._round(I.x),this._round(I.y),this._round(I.z)];I.set(s.getX(3*C+1),s.getY(3*C+1),s.getZ(3*C+1)).applyMatrix4(A.matrixWorld);const Q=[this._round(I.x),this._round(I.y),this._round(I.z)];I.set(s.getX(3*C+2),s.getY(3*C+2),s.getZ(3*C+2)).applyMatrix4(A.matrixWorld);const E=[this._round(I.x),this._round(I.y),this._round(I.z)],l=Q[0]-a[0],h=Q[1]-a[1],w=Q[2]-a[2],d=E[0]-a[0],D=E[1]-a[1],u=E[2]-a[2],M=h*u-w*D,y=w*d-l*u,p=l*D-h*d,m=Math.hypot(M,y,p)||1;B[C]={p1:a,p2:Q,p3:E,normal:[this._round(M/m),this._round(y/m),this._round(p/m)],area:this._round(.5*Math.hypot(M,y,p))}}try{let C=5e3;typeof window<"u"&&Number.isFinite(window.BREP_DIAG_TRI_MAX_FACE)&&(C=window.BREP_DIAG_TRI_MAX_FACE|0),C<0&&(C=B.length);const a=Math.min(B.length,C);e.triangles=B.slice(0,a),a<B.length&&(e.trianglesTruncated=!0,e.trianglesTotal=B.length,e.trianglesLimit=C)}catch{e.triangles=B}t=r(()=>{const C=JSON.parse(JSON.stringify(e));return C.triangles=B,delete C.trianglesTruncated,delete C.trianglesLimit,delete C.trianglesTotal,JSON.stringify(C,null,2)},"downloadFactory")}}}catch{}try{const s=Array.isArray(A.edges)?A.edges:[];e.edges=s.map(I=>({name:I.name||null,faces:Array.isArray(I.faces)?I.faces.map(n=>n?.name||n?.userData?.faceName||null):[],closedLoop:!!I.closedLoop,length:typeof I.length=="function"?this._round(I.length()):void 0,points:this._edgePointsWorld(I)}))}catch{e.edges=[]}try{e._lazyUniqueVertices=()=>{const s=e._lazyTriangles&&typeof e._lazyTriangles=="function"?e._lazyTriangles():[],I=new Map;for(const n of s)for(const B of[n.p1,n.p2,n.p3]){const C=`${B[0]},${B[1]},${B[2]}`;I.has(C)||I.set(C,B)}return Array.from(I.values())}}catch{}try{const s=A.getAverageNormal?.();s&&(e.averageNormal=[this._round(s.x),this._round(s.y),this._round(s.z)])}catch{}try{const s=A.surfaceArea?.();Number.isFinite(s)&&(e.surfaceArea=this._round(s),e._faceAreaFormatted=`${this._round(s)} units²`)}catch{}try{e._lazyBbox=()=>{const s=[];for(const I of e.triangles||[])s.push(I.p1,I.p2,I.p3);if(s.length){let I=[1/0,1/0,1/0],n=[-1/0,-1/0,-1/0];for(const B of s)B[0]<I[0]&&(I[0]=B[0]),B[1]<I[1]&&(I[1]=B[1]),B[2]<I[2]&&(I[2]=B[2]),B[0]>n[0]&&(n[0]=B[0]),B[1]>n[1]&&(n[1]=B[1]),B[2]>n[2]&&(n[2]=B[2]);return{min:I,max:n}}return null}}catch{}try{const s=A?.name||A?.userData?.faceName||null;let I=new Set;const n=A?.parentSolid||A?.userData?.parentSolid||null;if(n&&typeof n.getBoundaryEdgePolylines=="function"&&s){const B=n.getBoundaryEdgePolylines()||[];for(const C of B){const a=C?.faceA,Q=C?.faceB;a===s&&Q?I.add(Q):Q===s&&a&&I.add(a)}}if(I.size===0&&n&&Array.isArray(n.children)){for(const B of A.edges||[])if(!(!B||!Array.isArray(B.faces)))for(const C of B.faces){const a=C?.name||C?.userData?.faceName||null;a&&I.add(a)}}s&&I.delete(s),e.neighbors=Array.from(I)}catch{}try{const s=A.userData?.boundaryLoopsWorld;Array.isArray(s)&&s.length&&(e.boundaryLoops=s.map(I=>({isHole:!!I.isHole,pts:(Array.isArray(I.pts)?I.pts:I).map(n=>[this._round(n[0]),this._round(n[1]),this._round(n[2])])})))}catch{}}else if(A.type==="EDGE"){e.closedLoop=!!A.closedLoop,e._lazyPoints=()=>this._edgePointsWorld(A);try{const i=A.length();Number.isFinite(i)&&(e.length=this._round(i),e._edgeLengthFormatted=`${this._round(i)} units`)}catch{}try{e.faces=Array.isArray(A.faces)?A.faces.map(i=>i?.name||i?.userData?.faceName||null):[]}catch{}}else if(A.type==="SOLID"){try{const s=A.getFaces?.(!1)||[];e.faceCount=s.length,e.faces=s.slice(0,10).map(I=>({faceName:I.faceName,triangles:(I.triangles||[]).length})),s.length>10&&(e.facesTruncated=!0)}catch{}let i=null,o=!1;try{const s=A.getMesh?.();s&&s.vertProperties&&s.triVerts&&(i={vp:Array.from(s.vertProperties),tv:Array.from(s.triVerts),ids:Array.isArray(s.faceID)?Array.from(s.faceID):[]})}catch{}if(!i)try{const s=Array.isArray(A._vertProperties)?A._vertProperties.slice():[],I=Array.isArray(A._triVerts)?A._triVerts.slice():[],n=Array.isArray(A._triIDs)?A._triIDs.slice():[];i={vp:s,tv:I,ids:n},o=!0}catch{}if(i){const{vp:s,tv:I,ids:n}=i;e.meshStats={vertices:s.length/3|0,triangles:I.length/3|0,source:o?"authoring":"manifold"};let B=[1/0,1/0,1/0],C=[-1/0,-1/0,-1/0];for(let a=0;a<s.length;a+=3){const Q=this._round(s[a]),E=this._round(s[a+1]),l=this._round(s[a+2]);Q<B[0]&&(B[0]=Q),E<B[1]&&(B[1]=E),l<B[2]&&(B[2]=l),Q>C[0]&&(C[0]=Q),E>C[1]&&(C[1]=E),l>C[2]&&(C[2]=l)}B[0]!==1/0&&(e.bbox={min:B,max:C});try{const a=I.length/3|0;let Q=5e3;try{typeof window<"u"&&Number.isFinite(window.BREP_DIAG_TRI_MAX)&&(Q=window.BREP_DIAG_TRI_MAX|0)}catch{}Q<0&&(Q=a);const E=Math.min(a,Q),l=new Array(E),h=r(w=>A._idToFaceName&&A._idToFaceName.get?A._idToFaceName.get(w):void 0,"nameOf");for(let w=0;w<E;w++){const d=I[3*w+0]>>>0,D=I[3*w+1]>>>0,u=I[3*w+2]>>>0,M=[this._round(s[3*d+0]),this._round(s[3*d+1]),this._round(s[3*d+2])],y=[this._round(s[3*D+0]),this._round(s[3*D+1]),this._round(s[3*D+2])],p=[this._round(s[3*u+0]),this._round(s[3*u+1]),this._round(s[3*u+2])];let m=Array.isArray(n)&&n.length===a?n[w]:void 0;const F=y[0]-M[0],f=y[1]-M[1],S=y[2]-M[2],N=p[0]-M[0],G=p[1]-M[1],Y=p[2]-M[2],R=f*Y-S*G,k=S*N-F*Y,b=F*G-f*N,L=Math.hypot(R,k,b)||1;l[w]={index:w,faceID:m,faceName:m!==void 0&&h(m)||null,p1:M,p2:y,p3:p,normal:[this._round(R/L),this._round(k/L),this._round(b/L)],area:this._round(.5*L)}}e._trianglesSummary=`${a} triangles (click to expand)`,e._lazyTriangles=()=>l,E<a&&(e.trianglesTruncated=!0,e.trianglesTotal=a,e.trianglesLimit=Q),t=r(()=>{const w=new Array(a),d=r(u=>A._idToFaceName&&A._idToFaceName.get?A._idToFaceName.get(u):void 0,"nameOf");for(let u=0;u<a;u++){const M=I[3*u+0]>>>0,y=I[3*u+1]>>>0,p=I[3*u+2]>>>0,m=[this._round(s[3*M+0]),this._round(s[3*M+1]),this._round(s[3*M+2])],F=[this._round(s[3*y+0]),this._round(s[3*y+1]),this._round(s[3*y+2])],f=[this._round(s[3*p+0]),this._round(s[3*p+1]),this._round(s[3*p+2])];let S=Array.isArray(n)&&n.length===a?n[u]:void 0;const N=F[0]-m[0],G=F[1]-m[1],Y=F[2]-m[2],R=f[0]-m[0],k=f[1]-m[1],b=f[2]-m[2],L=G*b-Y*k,H=Y*R-N*b,J=N*k-G*R,Z=Math.hypot(L,H,J)||1;w[u]={index:u,faceID:S,faceName:S!==void 0&&d(S)||null,p1:m,p2:F,p3:f,normal:[this._round(L/Z),this._round(H/Z),this._round(J/Z)],area:this._round(.5*Z)}}const D=JSON.parse(JSON.stringify(e));return D.triangles=w,delete D.trianglesTruncated,delete D.trianglesLimit,delete D.trianglesTotal,JSON.stringify(D,null,2)},"downloadFactory")}catch{}try{const a=s.length/3|0,Q=BigInt(Math.max(1,a)),E=r((G,Y)=>{const R=BigInt(G),k=BigInt(Y);return R<k?R*Q+k:k*Q+R},"eKey"),l=new Map,h=I.length/3|0,w=[],d=new Uint8Array(a);for(let G=0;G<h;G++){const Y=I[3*G+0]>>>0,R=I[3*G+1]>>>0,k=I[3*G+2]>>>0;d[Y]=1,d[R]=1,d[k]=1;const b=s[3*Y+0],L=s[3*Y+1],H=s[3*Y+2],J=s[3*R+0],Z=s[3*R+1],P=s[3*R+2],x=s[3*k+0],V=s[3*k+1],tA=s[3*k+2],AA=J-b,_=Z-L,q=P-H,sA=x-b,QA=V-L,hA=tA-H,oA=_*hA-q*QA,IA=q*sA-AA*hA,X=AA*QA-_*sA;oA*oA+IA*IA+X*X<=1e-30&&w.push(G);const K=r((T,iA)=>{const CA=E(Math.min(T,iA),Math.max(T,iA));l.set(CA,(l.get(CA)||0)+1)},"add");K(Y,R),K(R,k),K(k,Y)}let D=0,u=0,M=0;const y=[],p=[],m=[];for(const[G,Y]of l.entries())Y>2?(D++,y.length<12&&y.push({edge:G.toString(),uses:Y})):Y<2&&(u++,Y===1?(M++,m.length<12&&m.push({edge:G.toString(),uses:Y})):p.length<12&&p.push({edge:G.toString(),uses:Y}));let F=0;for(let G=0;G<a;G++)d[G]||F++;const f=M===0,S=D>0,N=f&&!S;e.topology={isManifold:N,closed:f,nonManifoldEdges:S?D:0,degenerateTriangles:{count:w.length,examples:w.slice(0,12)},edges:{gt2:D,lt2:u,boundary:M,examples_gt2:y,examples_lt2:p,examples_boundary:m},isolatedVertices:F},e.isManifold=N}catch{}if(!e.faceCount||!Array.isArray(e.faces))try{const a=r(h=>A._idToFaceName&&A._idToFaceName.get?A._idToFaceName.get(h):String(h),"nameOf"),Q=new Map,E=I.length/3|0;for(let h=0;h<E;h++){const w=Array.isArray(n)?n[h]:void 0,d=a(w);if(!d)continue;let D=Q.get(d);D||(D=[],Q.set(d,D)),D.push(h)}const l=[];for(const[h,w]of Q.entries())l.push({faceName:h,triangles:w.length});l.sort((h,w)=>w.triangles-h.triangles),e.faceCount=l.length,e.faces=l.slice(0,20),l.length>20&&(e.facesTruncated=!0)}catch{}}try{const s=A.volume?.();Number.isFinite(s)&&(e.volume=this._round(s))}catch{}try{const s=A.surfaceArea?.();Number.isFinite(s)&&(e.surfaceArea=this._round(s))}catch{}}return{out:e,downloadFactory:t||(()=>JSON.stringify(e,null,2))}}_showDiagnosticsFor(A){const{out:e,downloadFactory:t}=this._buildDiagnostics(A),i=JSON.stringify(e,null,2);this._showModal("Selection Diagnostics",i,{onDownload:t})}_toast(A,e=1200){try{const t=document.createElement("div");t.textContent=A,t.style.cssText='position:fixed;top:48px;left:50%;transform:translateX(-50%);background:#111c;backdrop-filter:blur(6px);color:#e5e7eb;padding:6px 10px;border:1px solid #2a3442;border-radius:8px;z-index:7;font:12px/1.2 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;',document.body.appendChild(t),setTimeout(()=>{try{t.parentNode&&t.parentNode.removeChild(t)}catch{}},e)}catch{}}_showModal(A,e,t={}){const i=document.createElement("div");i.style.cssText="position:fixed;inset:0;background:rgba(0,0,0,0.55);backdrop-filter:blur(2px);z-index:7;display:flex;align-items:center;justify-content:center;";const o=document.createElement("div");o.style.cssText="width:min(980px,90vw);height:min(70vh,720px);background:#0b0d10;border:1px solid #2a3442;border-radius:10px;box-shadow:0 12px 28px rgba(0,0,0,.35);display:flex;flex-direction:column;overflow:hidden;";const s=document.createElement("div");s.style.cssText='display:flex;align-items:center;justify-content:space-between;padding:10px 12px;border-bottom:1px solid #1e2430;color:#e5e7eb;font:600 13px ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;',s.textContent=A||"Diagnostics";const I=document.createElement("button");I.textContent="✕",I.title="Close",I.style.cssText='margin-left:auto;background:transparent;border:0;color:#9aa4b2;cursor:pointer;font:700 14px ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;padding:4px;';const n=document.createElement("textarea");n.readOnly=!0,n.value=e||"",n.style.cssText="flex:1;resize:none;background:#0f141a;color:#e5e7eb;border:0;padding:10px 12px;font:12px/1.3 ui-monospace,Menlo,Consolas,monospace;white-space:pre;";const B=document.createElement("div");B.style.cssText="display:flex;gap:8px;justify-content:flex-end;padding:8px 12px;border-top:1px solid #1e2430;";const C=document.createElement("button");C.className="mtb-btn",C.textContent="Copy JSON",C.style.cssText="background:#1b2433;border:1px solid #334155;color:#e5e7eb;padding:6px 10px;border-radius:8px;cursor:pointer;font-weight:700;font-size:12px;",C.addEventListener("click",async()=>{try{await navigator.clipboard.writeText(n.value),C.textContent="Copied!",setTimeout(()=>C.textContent="Copy JSON",900)}catch{}});const a=document.createElement("button");a.className="mtb-btn",a.textContent="Download",a.style.cssText=C.style.cssText,a.addEventListener("click",()=>{try{const Q=t&&typeof t.onDownload=="function"?t.onDownload():n.value,E=new Blob([Q],{type:"application/json"}),l=URL.createObjectURL(E),h=document.createElement("a");h.href=l,h.download="diagnostics.json",document.body.appendChild(h),h.click(),setTimeout(()=>{document.body.removeChild(h),URL.revokeObjectURL(l)},0)}catch{}}),I.addEventListener("click",()=>{try{document.body.removeChild(i)}catch{}}),i.addEventListener("click",Q=>{if(Q.target===i)try{document.body.removeChild(i)}catch{}}),s.appendChild(I),o.appendChild(s),o.appendChild(n),B.appendChild(C),B.appendChild(a),o.appendChild(B),i.appendChild(o),document.body.appendChild(i)}_getContainerSize(){const A=this.container.clientWidth||window.innerWidth||1,e=this.container.clientHeight||window.innerHeight||1;return{width:Math.max(1,A),height:Math.max(1,e)}}_resizeRendererToDisplaySize(){const{width:A,height:e}=this._getContainerSize(),t=!!this.renderer?.isWebGLRenderer;let i=1;if(t&&typeof this.renderer.getPixelRatio=="function"&&typeof this.renderer.setPixelRatio=="function"){const s=window.devicePixelRatio||1;i=Math.max(1,Math.min(this.pixelRatio||s,s)),this.renderer.getPixelRatio()!==i&&this.renderer.setPixelRatio(i)}if(t){const s=this.renderer.domElement;(s.width!==Math.floor(A*i)||s.height!==Math.floor(e*i))&&this.renderer.setSize(A,e,!0),this._webglComposer&&this._webglComposerRenderer===this.renderer&&(typeof this._webglComposer.setPixelRatio=="function"&&this._webglComposer.setPixelRatio(i),this._webglComposer.setSize(A,e)),this._solidFaceOutlineEdgeMaskTarget&&typeof this._solidFaceOutlineEdgeMaskTarget.setSize=="function"&&this._solidFaceOutlineEdgeMaskTarget.setSize(Math.max(1,Math.round(A*i)),Math.max(1,Math.round(e*i)))}else if(this.renderer&&typeof this.renderer.setSize=="function"){this.renderer.setSize(A,e);try{const s=this.renderer.domElement;s&&(s.style.width="100%",s.style.height="100%")}catch{}}try{const s=r(I=>I&&I.resolution&&typeof I.resolution.set=="function"&&I.resolution.set(A,e),"setRes");Co?.EDGE&&(s(Co.EDGE.BASE),s(Co.EDGE.SELECTED),Co.EDGE.OVERLAY&&s(Co.EDGE.OVERLAY),Co.EDGE.THREAD_SYMBOLIC_MAJOR&&s(Co.EDGE.THREAD_SYMBOLIC_MAJOR)),Co?.LOOP&&(s(Co.LOOP.BASE),s(Co.LOOP.SELECTED))}catch{}try{const s=this.partHistory?.scene||this.scene;s&&s.traverse(I=>{const n=I?.material;if(!n)return;const B=r(C=>{C?.resolution&&typeof C.resolution.set=="function"&&C.resolution.set(A,e)},"apply");Array.isArray(n)?n.forEach(B):B(n)})}catch{}this._updateOverlayDashSpacing(A,e);const o=A/e||1;if(this.camera?.isOrthographicCamera){const s=Number.isFinite(this.camera.top)&&Number.isFinite(this.camera.bottom)?this.camera.top-this.camera.bottom:this.viewSize*2,I=Math.abs(s)>1e-6?s:this.viewSize*2,n=Number.isFinite(this.camera.top)&&Number.isFinite(this.camera.bottom)?(this.camera.top+this.camera.bottom)*.5:0,B=Number.isFinite(this.camera.left)&&Number.isFinite(this.camera.right)?(this.camera.left+this.camera.right)*.5:0,C=Math.abs(I)*.5,a=C*o,Q=I>=0?1:-1;this.camera.top=n+C*Q,this.camera.bottom=n-C*Q,this.camera.left=B-a,this.camera.right=B+a}else this.camera?.isPerspectiveCamera&&(this.camera.aspect=o);this.camera?.updateProjectionMatrix?.(),this.controls&&typeof this.controls.update=="function"&&this.controls.update()}_onResize(){this._resizeScheduled||(this._resizeScheduled=!0,requestAnimationFrame(()=>{this._resizeScheduled=!1,this._resizeRendererToDisplaySize(),this.render();try{this._sketchMode?.onCameraChanged?.()}catch{}}))}_onControlsChange(){if(!this._disposed){if(this._shouldSuppressSceneHover())try{tt.clearHover()}catch{}else this._lastPointerEvent&&this._updateHover(this._lastPointerEvent);try{const A=this.renderer?.getSize?.(new Ye)||null,e=A?.width||this.renderer?.domElement?.clientWidth||0,t=A?.height||this.renderer?.domElement?.clientHeight||0;e&&t&&this._updateOverlayDashSpacing(e,t)}catch{}try{this._sketchMode?.onCameraChanged?.()}catch{}}}_worldPerPixel(A,e,t){if(A&&A.isOrthographicCamera){const n=typeof A.zoom=="number"&&A.zoom>0?A.zoom:1,B=(A.right-A.left)/(e*n),C=(A.top-A.bottom)/(t*n);return Math.max(B,C)}const i=this.controls?.target,o=i&&A?.position?.distanceTo?.(i)||A?.position?.length?.()||1,s=(A?.fov||50)*Math.PI/180,I=typeof A?.zoom=="number"&&A.zoom>0?A.zoom:1;return 2*Math.tan(s/2)*o/(t*I)}_updateOverlayDashSpacing(A,e){if(!this.camera||!this.renderer)return;const t=A||this.renderer.domElement?.clientWidth||0,i=e||this.renderer.domElement?.clientHeight||0;if(!t||!i)return;let o=null;try{o=this._worldPerPixel(this.camera,t,i)}catch{o=null}if(!Number.isFinite(o)||o<=0||this._lastDashWpp&&Math.abs(this._lastDashWpp-o)<this._lastDashWpp*5e-4)return;this._lastDashWpp=o;const s=10,I=8,n=r(B=>{if(B)try{B.dashSize=s*o,B.gapSize=I*o,B.needsUpdate=!0}catch{}},"setDash");try{const B=Co?.EDGE||{};n(B.OVERLAY),n(B.THREAD_SYMBOLIC_MAJOR)}catch{}}},c(_MA,"G1e2"),_MA);r(nyi,"Viewer");let WNe=nyi;window.DEBUG_MODE=!1;function Sy(...g){window.DEBUG_MODE&&console.log(...g)}c(Sy,"x0");r(Sy,"debugLog");const dfg="brep:cad",Byi=!0;function h_A(g,A=!1){if(g==null)return A;if(typeof g=="string"){const e=g.trim().toLowerCase();if(e==="false"||e==="0"||e==="off"||e==="no")return!1;if(e==="true"||e==="1"||e==="on"||e==="yes")return!0}return g!==!1&&g!==0}c(h_A,"doe");r(h_A,"normalizeBoolean$1");function ryi(g,A=Byi){return h_A(g,A)}c(ryi,"Qki");r(ryi,"normalizeSidebarExpanded");function Bve(g){const A=String(g||"").replace(/\\/g,"/"),e=[];for(const t of A.split("/")){const i=String(t||"").trim();!i||i==="."||i===".."||e.push(i)}return e.join("/")}c(Bve,"AMt");r(Bve,"normalizeModelPath");function w_A(g){const A=Bve(g);return A?A.toLowerCase().endsWith(".3mf")?A.slice(0,-4):A:""}c(w_A,"woe");r(w_A,"stripModelFileExtension");function Cyi(g){return typeof g=="string"?g:g==null?"":JSON.stringify(g,null,2)}c(Cyi,"Eki");r(Cyi,"toJSONText");function ayi(g){const A=String(g||"").trim().toLowerCase();return A==="github"?"github":A==="mounted"?"mounted":"local"}c(ayi,"cki");r(ayi,"normalizeSource");function nG(g,A=""){const e=String(g||"").trim().toLowerCase();if(e==="github"||e==="mounted"||e==="local")return e;const t=String(A||"").trim();return t?t.includes("/")?"github":"mounted":"local"}c(nG,"pk");r(nG,"resolveStorageSource");function jF(g){return w_A(g)}c(jF,"LN");r(jF,"normalizeFilePath");function _Ne(g){return g instanceof ArrayBuffer?uR(new Uint8Array(g)):ArrayBuffer.isView(g)?uR(new Uint8Array(g.buffer,g.byteOffset,g.byteLength)):Array.isArray(g)?uR(Uint8Array.from(g)):""}c(_Ne,"w7e");r(_Ne,"toBase64FromBinary");function Qyi(g={}){if(typeof g=="string")return{modelPath:w_A(g),options:{source:"local"}};const A=g&&typeof g=="object"?g:{},e=A.modelPath??A.path??A.name??A.model,t=w_A(e),i=ayi(A.source),o={source:i},s=String(A.repoFull||"").trim(),I=String(A.branch||"").trim();return i!=="local"&&s&&(o.repoFull=s),I&&(o.branch=I),{modelPath:t,options:o}}c(Qyi,"lki");r(Qyi,"normalizeModelRequest");var si,Eyi,cyi,LRA,zIe,RNA,Ph,YNA,q9e,VIe,WIe,mS,B4,_Ie,Z9e,X9e,qIe,qvA,ZIe,ZvA,XvA,$9e,AZe,eZe,tZe,iZe,XIe,$Ie,gZe,oZe,sZe,lyi,qMA;const hyi=(qMA=class{constructor({channel:A,instanceId:e}){wI(this,si),this._channel=A,this._instanceId=e,this._viewer=null,this._viewerBootPromise=null,this._viewerOnlyMode=!1,this._sidebarExpanded=Byi,this._historyHooksInstalled=!1,this._saveHookInstalled=!1,this._fileHooksInstalled=!1,this._saveInProgress=!1,this._boundStorageEvent=null,this._boundStorageBackendEvent=null,this._customCssEl=null,this._root=null,this._ownsRoot=!1,this._sidebarEl=null,this._viewportEl=null,this._disposed=!1,this._boundMessage=t=>v(this,si,lyi).call(this,t)}boot(){this._disposed||(v(this,si,Eyi).call(this),v(this,si,cyi).call(this),window.addEventListener("message",this._boundMessage),v(this,si,LRA).call(this,"ready",{version:1}))}dispose(){if(!this._disposed){this._disposed=!0,window.removeEventListener("message",this._boundMessage);try{this._viewer?.dispose?.()}catch{}this._viewer=null,this._viewerBootPromise=null,this._historyHooksInstalled=!1,this._saveHookInstalled=!1,this._fileHooksInstalled=!1,this._saveInProgress=!1;try{this._boundStorageEvent&&window.removeEventListener("storage",this._boundStorageEvent)}catch{}try{this._boundStorageBackendEvent&&window.removeEventListener(i5A,this._boundStorageBackendEvent)}catch{}this._boundStorageEvent=null,this._boundStorageBackendEvent=null;try{this._ownsRoot&&this._root?.parentNode&&this._root.parentNode.removeChild(this._root)}catch{}this._root=null,this._ownsRoot=!1,this._sidebarEl=null,this._viewportEl=null}}},c(qMA,"R1e2"),qMA);si=new WeakSet,Eyi=r(function(){if(document.getElementById("cad-frame-base-styles"))return;const g=document.createElement("style");g.id="cad-frame-base-styles",g.textContent=`
|
|
15468
15468
|
html, body { width: 100%; height: 100%; margin: 0; overflow: hidden; overscroll-behavior: none; }
|
|
15469
15469
|
body { position: relative; }
|
|
15470
15470
|
`,document.head.appendChild(g)},"#ensureBaseStyles"),cyi=r(function(){let g=document.getElementById("sidebar"),A=document.getElementById("viewport");if(!g||!A){const e=document.createElement("div");e.className="cad-frame-root",e.style.position="relative",e.style.width="100%",e.style.height="100%",e.style.overflow="hidden",g=document.createElement("div"),g.id="sidebar",g.className="app-sidebar",g.setAttribute("aria-label","CAD sidebar"),A=document.createElement("div"),A.id="viewport",e.appendChild(g),e.appendChild(A),document.body.innerHTML="",document.body.appendChild(e),this._root=e,this._ownsRoot=!0}else g.classList.add("app-sidebar"),g.setAttribute("aria-label","CAD sidebar"),this._root=document.body,this._ownsRoot=!1;this._sidebarEl=g,this._viewportEl=A},"#mountShell"),LRA=r(function(g,A={}){window.parent.postMessage({channel:this._channel,instanceId:this._instanceId,type:g,payload:A},"*")},"#post"),zIe=r(function(g,A,e=null,t=null){window.parent.postMessage({channel:this._channel,instanceId:this._instanceId,type:"response",requestId:g,ok:A,payload:e,error:t?{message:t?.message||String(t)}:null},"*")},"#respond"),RNA=r(function(){const g=this._viewer?.fileManagerWidget;return{name:String(g?.currentName||"").trim(),source:String(g?.currentSource||"").trim()||"local",repoFull:String(g?.currentRepoFull||"").trim(),branch:String(g?.currentBranch||"").trim()}},"#collectModelState"),Ph=r(function(){const g=Array.isArray(this._viewer?.partHistory?.features)?this._viewer.partHistory.features:[];return{viewerOnlyMode:!!this._viewerOnlyMode,sidebarExpanded:!!this._sidebarExpanded,featureCount:g.length,currentHistoryStepId:this._viewer?.partHistory?.currentHistoryStepId||null,model:v(this,si,RNA).call(this)}},"#collectState"),YNA=r(async function(){if(!this._viewer){if(this._viewerBootPromise){await this._viewerBootPromise;return}this._viewerBootPromise=(async()=>{try{try{await xd.ready()}catch{}const g=new WNe({container:this._viewportEl,sidebar:this._sidebarEl,autoLoadLastModel:!1,viewerOnlyMode:this._viewerOnlyMode,homeBannerUrl:"https://brep.io",homeBannerOpenInNewTab:!0});this._viewer=g,window.env=g,window.viewer=g,await g.ready,v(this,si,q9e).call(this),v(this,si,Z9e).call(this),v(this,si,X9e).call(this),v(this,si,qvA).call(this,this._sidebarExpanded)}catch(g){try{this._viewer?.dispose?.()}catch{}throw this._viewer=null,g}finally{this._viewerBootPromise=null}})(),await this._viewerBootPromise}},"#ensureViewer"),q9e=r(function(){if(this._historyHooksInstalled)return;const g=this._viewer?.partHistory;if(!g)return;g.callbacks=g.callbacks||{};const A=g.callbacks.afterRunHistory,e=g.callbacks.afterReset;g.callbacks.afterRunHistory=async(...t)=>{typeof A=="function"&&await A(...t),v(this,si,VIe).call(this,"afterRunHistory")},g.callbacks.afterReset=async(...t)=>{typeof e=="function"&&await e(...t),v(this,si,VIe).call(this,"afterReset")},this._historyHooksInstalled=!0},"#attachHistoryHooks"),VIe=r(function(g="update"){v(this,si,LRA).call(this,"historyChanged",{reason:g,...v(this,si,Ph).call(this)})},"#emitHistoryChanged"),WIe=r(function(g="saveCurrent",A=null){v(this,si,LRA).call(this,"saved",{reason:g,...v(this,si,Ph).call(this),detail:A&&typeof A=="object"?A:null})},"#emitSaved"),mS=r(function(g="update",A=null){v(this,si,LRA).call(this,"filesChanged",{reason:g,...v(this,si,Ph).call(this),detail:A&&typeof A=="object"?A:null})},"#emitFilesChanged"),B4=r(function(g,A="",e=""){const t=nG(g,A),i=String(A||"").trim(),o=String(e||"").trim(),s={source:t};return t!=="local"&&i&&(s.repoFull=i),t==="github"&&o&&(s.branch=o),s},"#buildStorageOptions"),_Ie=r(async function(g={}){const A=jF(g?.name);if(!A)return null;const e=String(g?.source||"").trim()||"local",t=String(g?.repoFull||"").trim(),i=String(g?.branch||"").trim(),o=v(this,si,B4).call(this,e,t,i);try{return await ml(A,o)}catch{return null}},"#readModelRecordFromState"),Z9e=r(function(){if(this._fileHooksInstalled)return;const g=this._viewer?.fileManagerWidget;if(g){if(!g.__cadEmbedPatchedSetModel&&typeof g._setModel=="function"){const A=g._setModel.bind(g);g._setModel=async(...e)=>{const[t,i,o]=e,s=await A(...e);if(!this._saveInProgress)try{const I=jF(t),n=nG(o?.source,o?.repoFull),B=String(o?.repoFull||"").trim(),C=String(o?.branch||"").trim(),a=v(this,si,B4).call(this,n,B,C),Q=await ml(I,a);v(this,si,mS).call(this,"setModel",{modelPath:I,source:n,repoFull:B,branch:C,savedAt:String(Q?.savedAt||"").trim()||null})}catch{}return s},g.__cadEmbedPatchedSetModel=!0}if(!g.__cadEmbedPatchedRemoveModel&&typeof g._removeModel=="function"){const A=g._removeModel.bind(g);g._removeModel=async(...e)=>{const[t,i]=e,o=jF(t),s=nG(i?.source,i?.repoFull),I=String(i?.repoFull||"").trim(),n=String(i?.branch||"").trim(),B=v(this,si,B4).call(this,s,I,n),C=await ml(o,B),a=await A(...e);return v(this,si,mS).call(this,"removeModel",{modelPath:o,source:s,repoFull:I,branch:n,existed:!!C}),a},g.__cadEmbedPatchedRemoveModel=!0}this._boundStorageEvent||(this._boundStorageEvent=A=>{try{const e=String(A?.key||A?.detail?.key||"").trim();if(!e||!e.startsWith(oN))return;v(this,si,mS).call(this,"storageEvent",{key:e})}catch{}}),this._boundStorageBackendEvent||(this._boundStorageBackendEvent=()=>{v(this,si,mS).call(this,"storageBackendChanged",{})}),window.addEventListener("storage",this._boundStorageEvent),window.addEventListener(i5A,this._boundStorageBackendEvent),this._fileHooksInstalled=!0}},"#attachFileHooks"),X9e=r(function(){if(this._saveHookInstalled)return;const g=this._viewer?.fileManagerWidget;if(!g||typeof g.saveCurrent!="function")return;const A=g.saveCurrent.bind(g);g.saveCurrent=async(...e)=>{const t=v(this,si,RNA).call(this),i=await v(this,si,_Ie).call(this,t);this._saveInProgress=!0;let o;try{o=await A(...e)}finally{this._saveInProgress=!1}const s=v(this,si,RNA).call(this),I=await v(this,si,_Ie).call(this,s),n=String(i?.savedAt||"").trim(),B=String(I?.savedAt||"").trim(),C=[t.name,t.source,t.repoFull,t.branch].join("|"),a=[s.name,s.source,s.repoFull,s.branch].join("|");if(I&&(C!==a||n!==B)){const Q={modelPath:String(s.name||"").trim(),source:String(s.source||"").trim()||"local",repoFull:String(s.repoFull||"").trim(),branch:String(s.branch||"").trim(),savedAt:B||null};v(this,si,WIe).call(this,"saveCurrent",{...Q}),v(this,si,mS).call(this,"saveCurrent",Q)}return o},this._saveHookInstalled=!0},"#attachSaveHook"),qIe=r(function(g){this._customCssEl||(this._customCssEl=document.createElement("style"),this._customCssEl.id="cad-frame-custom-css",document.head.appendChild(this._customCssEl)),this._customCssEl.textContent=String(g||"")},"#setCustomCss"),qvA=r(function(g){this._sidebarExpanded=ryi(g,this._sidebarExpanded),this._root?.classList.toggle("is-sidebar-collapsed",!this._sidebarExpanded);const A=this._viewer;if(A)try{typeof A._setSidebarPinned=="function"?A._setSidebarPinned(this._sidebarExpanded):this._sidebarEl&&(this._sidebarEl.style.display=this._sidebarExpanded?"":"none"),!this._sidebarExpanded&&typeof A._setSidebarHoverVisible=="function"&&A._setSidebarHoverVisible(!1)}catch{}},"#setSidebarExpanded"),ZIe=r(async function(g){await v(this,si,YNA).call(this);const A=Cyi(g);if(!A)throw new Error("setPartHistoryJSON requires JSON text or object payload");await this._viewer.partHistory.fromJSON(A),await this._viewer.partHistory.runHistory(),await this._viewer.partHistory.flushHistorySnapshot?.({force:!0});try{this._viewer.expressionsManager?.refreshFromPartHistory?.()}catch{}},"#applyPartHistoryJSON"),ZvA=r(async function(g){await v(this,si,YNA).call(this);const A=this._viewer?.fileManagerWidget;if(!A||typeof A.loadModel!="function")throw new Error("CAD frame cannot load models (FileManagerWidget unavailable)");const{modelPath:e,options:t}=Qyi(g);if(!e)throw new Error("loadModel requires modelPath/path/name");return await A.loadModel(e,t),v(this,si,RNA).call(this)},"#loadModel"),XvA=r(function(g={},A="request"){const e=g&&typeof g=="object"?g:{},t=e.modelPath??e.path??e.name,i=jF(t);if(!i)throw new Error(`${A} requires modelPath/path/name`);const o=String(e.repoFull||"").trim(),s=nG(e.source,o),I=String(e.branch||"").trim();if(s==="mounted"&&!o)throw new Error(`${A} requires repoFull for source "mounted"`);return{modelPath:i,source:s,repoFull:o,branch:I,options:v(this,si,B4).call(this,s,o,I)}},"#normalizeStorageRequest"),$9e=r(function(g,A="writeFile"){if(!g||typeof g!="object")throw new Error(`${A} requires a record object`);const e={...g},t=e.data3mfBytes??e.data3mfBinary??e.bytes??e.binary,i=_Ne(t);(!e.data3mf||typeof e.data3mf!="string")&&i&&(e.data3mf=i),typeof e.data3mf=="string"&&(e.data3mf=e.data3mf.trim());const o=e.thumbnailBytes??e.thumbnailBinary,s=_Ne(o);(!e.thumbnail||typeof e.thumbnail!="string")&&s&&(e.thumbnail=`data:image/png;base64,${s}`),e.savedAt||(e.savedAt=new Date().toISOString()),delete e.data3mfBytes,delete e.data3mfBinary,delete e.bytes,delete e.binary,delete e.thumbnailBytes,delete e.thumbnailBinary;const I=typeof e.data3mf=="string"&&e.data3mf.length>0,n=e.data!=null;if(!I&&!n)throw new Error(`${A} record must include data3mf or data`);return e},"#normalizeFileRecordInput"),AZe=r(async function(g={}){const A=v(this,si,XvA).call(this,g,"readFile"),e=await ml(A.modelPath,A.options);return{exists:!!e,modelPath:A.modelPath,source:A.source,repoFull:A.repoFull,branch:A.branch,record:e||null}},"#readFile"),eZe=r(function(g={}){const A=g&&typeof g=="object"?g:{},e=String(A.repoFull||"").trim(),t=nG(A.source,e),i=String(A.branch||"").trim(),o=Bve(A.folder??A.pathPrefix??A.prefix??""),s=h_A(A.includeRecord,!1);return{source:t,repoFull:e,branch:i,folder:o,includeRecord:s,options:v(this,si,B4).call(this,t,e,i)}},"#normalizeListRequest"),tZe=r(async function(g={}){const A=v(this,si,eZe).call(this,g),e=await DR(A.options),t=Array.isArray(e)?e:[],i=A.folder?`${A.folder}/`:"",o=(A.folder?t.filter(s=>{const I=jF(s?.path||s?.name);return I===A.folder||I.startsWith(i)}):t).map(s=>{const I=jF(s?.path||s?.name),n={source:String(s?.source||A.source||"local").trim()||"local",repoFull:String(s?.repoFull||A.repoFull||"").trim(),branch:String(s?.branch||A.branch||"").trim(),path:I,browserPath:String(s?.browserPath||I).trim(),folder:String(s?.folder||"").trim(),displayName:String(s?.displayName||"").trim(),savedAt:s?.savedAt||null,has3mf:!!s?.has3mf};return A.includeRecord&&(n.record=s?.record||null),n});return{source:A.source,repoFull:A.repoFull,branch:A.branch,folder:A.folder,files:o}},"#listFiles"),iZe=r(async function(g={}){const A=v(this,si,XvA).call(this,g,"removeFile"),e=await ml(A.modelPath,A.options);if(await h5A(A.modelPath,A.options),await ml(A.modelPath,A.options))throw new Error(`removeFile failed to remove "${A.modelPath}"`);const t=this._viewer?.fileManagerWidget;if(t){const i=jF(t.currentName||""),o=nG(t.currentSource,t.currentRepoFull),s=String(t.currentRepoFull||"").trim();if(i===A.modelPath&&o===A.source&&s===A.repoFull){t.currentName="",t.currentRepoFull="",t.currentSource="",t.currentBranch="",t._forceSaveTargetDialog=!1;try{t.nameInput&&(t.nameInput.value="")}catch{}}try{await t.refreshList?.()}catch{}}return v(this,si,mS).call(this,"removeFile",{modelPath:A.modelPath,source:A.source,repoFull:A.repoFull,branch:A.branch,removed:!!e}),{ok:!0,removed:!!e,modelPath:A.modelPath,source:A.source,repoFull:A.repoFull,branch:A.branch}},"#removeFile"),XIe=r(async function(g={}){const A=this._viewer?.fileManagerWidget;if(!A)throw new Error("CAD frame cannot set current file (FileManagerWidget unavailable)");const e=g&&typeof g=="object"?g:{},t=e.modelPath??e.path??e.name,i=jF(t);if(!i)throw new Error("setCurrentFile requires modelPath/path/name");const o=String(e.repoFull??A.currentRepoFull??"").trim(),s=nG(e.source??A.currentSource,o),I=String(e.branch??A.currentBranch??"").trim();if(s==="mounted"&&!o)throw new Error('setCurrentFile requires repoFull for source "mounted"');A.currentName=i,A.currentSource=s,A.currentRepoFull=s==="local"?"":o,A.currentBranch=s==="github"?I:"",A._forceSaveTargetDialog=!1;try{A.nameInput&&(A.nameInput.value=i)}catch{}return v(this,si,Ph).call(this)},"#setCurrentFile"),$Ie=r(async function(g={},{create:A=!1}={}){const e=A?"createFile":"writeFile",t=v(this,si,XvA).call(this,g,e),i=v(this,si,$9e).call(this,g?.record,e),o=await ml(t.modelPath,t.options);if(A&&o)throw new Error(`createFile failed: "${t.modelPath}" already exists`);await UUe(t.modelPath,i,t.options);const s=await ml(t.modelPath,t.options);if(!s)throw new Error(`${e} failed to persist "${t.modelPath}"`);const I=this._viewer?.fileManagerWidget;if(I)try{await I.refreshList?.()}catch{}return v(this,si,WIe).call(this,e,{modelPath:t.modelPath,source:t.source,repoFull:t.repoFull,branch:t.branch,savedAt:String(s?.savedAt||"").trim()||null}),v(this,si,mS).call(this,e,{modelPath:t.modelPath,source:t.source,repoFull:t.repoFull,branch:t.branch,savedAt:String(s?.savedAt||"").trim()||null,created:!!A,overwritten:!A&&!!o}),{ok:!0,created:!!A,overwritten:!A&&!!o,modelPath:t.modelPath,source:t.source,repoFull:t.repoFull,branch:t.branch,record:s}},"#writeFile"),gZe=r(async function(g={}){const A=this._viewer?.fileManagerWidget;if(!A||typeof A.saveCurrent!="function")throw new Error("CAD frame cannot save models (FileManagerWidget unavailable)");const e=g&&typeof g=="object"?g:{},t=e?.modelPath!=null||e?.path!=null||e?.name!=null,i=e?.source!=null||e?.repoFull!=null||e?.branch!=null;return(t||i)&&await v(this,si,XIe).call(this,{modelPath:e?.modelPath??e?.path??e?.name??A.currentName,source:e?.source??A.currentSource,repoFull:e?.repoFull??A.currentRepoFull,branch:e?.branch??A.currentBranch}),e?.forceTargetDialog!=null&&(A._forceSaveTargetDialog=!!e.forceTargetDialog),await A.saveCurrent(),v(this,si,Ph).call(this)},"#saveCurrent"),oZe=r(async function(g={}){const A=h_A(g?.viewerOnlyMode,this._viewerOnlyMode);if(!this._viewer)this._viewerOnlyMode=A;else if(A!==this._viewerOnlyMode)throw new Error("viewerOnlyMode cannot be changed after init");if(v(this,si,qvA).call(this,g?.sidebarExpanded),await v(this,si,YNA).call(this),v(this,si,qIe).call(this,g?.cssText||""),g?.partHistoryJSON!=null||g?.partHistory!=null){const e=g?.partHistoryJSON??g?.partHistory;await v(this,si,ZIe).call(this,e)}if(g?.model!=null||g?.modelPath!=null||g?.path!=null||g?.name!=null){const e=g?.model!=null?g.model:g;await v(this,si,ZvA).call(this,e)}return v(this,si,Ph).call(this)},"#handleInit"),sZe=r(async function(g,A){if(g==="init")return v(this,si,oZe).call(this,A||{});if(g==="dispose")return this.dispose(),{ok:!0};if(await v(this,si,YNA).call(this),g==="getState")return v(this,si,Ph).call(this);if(g==="setCss")return v(this,si,qIe).call(this,A?.cssText||""),{ok:!0};if(g==="setSidebarExpanded")return v(this,si,qvA).call(this,A?.sidebarExpanded),{ok:!0,sidebarExpanded:this._sidebarExpanded};if(g==="getPartHistoryJSON")return{json:await this._viewer.partHistory.toJSON()};if(g==="setPartHistoryJSON"){const e=A?.json??A?.partHistoryJSON??A?.partHistory;return await v(this,si,ZIe).call(this,e),v(this,si,Ph).call(this)}if(g==="runHistory")return await this._viewer.partHistory.runHistory(),await this._viewer.partHistory.flushHistorySnapshot?.({force:!0}),v(this,si,Ph).call(this);if(g==="reset")return await this._viewer.partHistory.reset(),await this._viewer.partHistory.runHistory(),v(this,si,Ph).call(this);if(g==="loadModel"){const e=A?.model!=null?A.model:A,t=await v(this,si,ZvA).call(this,e||{});return{...v(this,si,Ph).call(this),loaded:t}}if(g==="loadFile"){const e=A?.model!=null?A.model:A,t=await v(this,si,ZvA).call(this,e||{});return{...v(this,si,Ph).call(this),loaded:t}}if(g==="readFile")return v(this,si,AZe).call(this,A||{});if(g==="listFiles")return v(this,si,tZe).call(this,A||{});if(g==="writeFile")return v(this,si,$Ie).call(this,A||{},{create:!1});if(g==="createFile")return v(this,si,$Ie).call(this,A||{},{create:!0});if(g==="removeFile")return v(this,si,iZe).call(this,A||{});if(g==="setCurrentFile"||g==="setCurrentFileName")return v(this,si,XIe).call(this,A||{});if(g==="saveCurrent")return v(this,si,gZe).call(this,A||{});throw new Error(`Unknown request type: ${g}`)},"#handleRequest"),lyi=r(async function(g){if(this._disposed||g.source!==window.parent)return;const A=g.data;if(!A||A.channel!==this._channel||A.instanceId!==this._instanceId)return;const e=A.requestId,t=A.type;if(t){if(t==="dispose"&&!e){this.dispose();return}if(e)try{const i=await v(this,si,sZe).call(this,t,A.payload||{});v(this,si,zIe).call(this,e,!0,i)}catch(i){v(this,si,zIe).call(this,e,!1,null,i)}}},"#onMessage"),r(hyi,"CadFrameApp");let Dfg=hyi;function wyi(g={}){try{window.__BREP_CADFrameApp&&typeof window.__BREP_CADFrameApp.dispose=="function"&&window.__BREP_CADFrameApp.dispose()}catch{}const A=new Dfg({channel:g.channel||dfg,instanceId:g.instanceId||`cad_${Date.now().toString(36)}`});return window.__BREP_CADFrameApp=A,A.boot(),A}c(wyi,"hki");r(wyi,"bootCadFrame");const WFg=wyi,ufg=`:root {
|