@fnndsc/argus 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- import{t as T,E as R,e as M,B as We,v as Ae,a as ne,b as F,s as ke,c as Fe,f as oe,cw as ue,c8 as Ne,bW as P,aK as z,cx as fe,aJ as Y,ag as se,V as G,cy as ge,cz as D,cA as Ue,cB as Ge,cC as Be,bL as He,at as O,aO as ze,bi as B,cD as me,bN as je,cE as he,bt as $e,b_ as qe,cF as ie,cG as E,cH as H,cI as J,cJ as L,cK as re,cL as Je,cM as Ke,cN as Ze,bC as pe,am as Q,b8 as ee,cO as Xe,cP as Ye,ai as Qe,ar as we,bm as te,i as Ie,L as Ve,bK as Se,cQ as be,bA as Z,bG as et,bc as ve,bz as N,cR as ae,cS as Ee,bP as ye,cT as tt,cr as nt,K as ot,cU as st,cV as it,c1 as rt,cW as at,cX as ct,bf as lt,cY as dt,cZ as ut,c_ as ft,c$ as gt,bp as mt,d0 as ht,d1 as pt,d2 as wt,d3 as It,d4 as Vt,d5 as St,d6 as bt,d7 as vt,bg as Et,d8 as yt,av as Rt,d9 as Ct,da as Pt,H as Tt,b7 as xt,bk as Mt,db as Dt,dc as Ot,J as _t,dd as Lt,bo as Wt,de as At,df as kt,bq as Ft,dg as Nt,bs as Ut,dh as Gt,bR as Bt,di as Ht,dj as zt,bF as jt,bj as $t,dk as qt,bh as Jt,bn as Kt,dl as Zt,dm as Xt,dn as Yt,dp as Qt,dq as en,dr as tn,ds as nn,dt as on,bl as sn,bZ as rn,du as an,bT as cn,dv as ln,bS as dn,bv as un,br as fn,ct as gn,dw as mn,dx as hn,bI as pn,dy as wn,M as In,dz as Vn,dA as Sn,bw as bn,dB as vn,bD as En,bJ as yn,dC as Rn,dD as Cn,bM as Pn,dE as Tn,dF as xn,dG as Mn,bY as Dn}from"./Settings-CKWXQZHN.js";import"./Texture-CIGczsau.js";import"./cornerstoneEngine-hAkB6jjG.js";function On(e){return!!(e&&typeof e.setVolumes=="function"&&typeof e.addVolumes=="function")}async function _n(e,t,n,o=!1,i=!1){const s=n.map(r=>{const a=e.getViewport(r);if(!a)throw new Error(`Viewport with Id ${r} does not exist`);if(!On(a))throw new Error("setVolumesForViewports only supports viewports that implement setVolumes");return a});await Promise.all(s.map(r=>r.setVolumes(t,o,i)))}function Ln(e,t,n=0){const o=e.getOpenGLRenderWindow?.()?.getCanvas?.();o&&(o.addEventListener("webglcontextlost",()=>{console.warn(`CornerstoneRender: WebGL context lost (renderingEngine=${t}, context=${n})`),T(M,R.WEBGL_CONTEXT_LOST,{renderingEngineId:t,contextIndex:n})}),o.addEventListener("webglcontextrestored",()=>{T(M,R.WEBGL_CONTEXT_RESTORED,{renderingEngineId:t,contextIndex:n})}))}class Wn extends We{constructor(t){super(t),this._renderFlaggedViewports=()=>{this._throwIfDestroyed(),this.offscreenMultiRenderWindow&&this.performVtkDrawCall();const n=this._getViewportsAsArray(),o=[];for(let i=0;i<n.length;i++){const s=n[i];if(this._needsRender.has(s.id)){const r=this.renderViewportUsingCustomOrVtkPipeline(s);if(o.push(r),s.setRendered(),this._needsRender.delete(s.id),this._needsRender.size===0)break}}this._animationFrameSet=!1,this._animationFrameHandle=null,o.forEach(i=>{i?.element&&T(i.element,R.IMAGE_RENDERED,i)})},this.useCPURendering||this.ensureOffscreenResources()}ensureOffscreenResources(){this.offscreenMultiRenderWindow||(this.offscreenMultiRenderWindow=Ae.newInstance(),this.offScreenCanvasContainer=document.createElement("div"),this.offscreenMultiRenderWindow.setContainer(this.offScreenCanvasContainer),Ln(this.offscreenMultiRenderWindow,this.id))}enableVTKjsDrivenViewport(t){this.ensureOffscreenResources();const o=this._getViewportsAsArray().filter(l=>ne(l.type)===!1),i=o.map(l=>l.canvas),s=F(t.element);i.push(s);const{offScreenCanvasWidth:r,offScreenCanvasHeight:a}=this._resizeOffScreenCanvas(i),c=this._resize(o,r,a),d={...t,canvas:s};this.addVtkjsDrivenViewport(d,{offScreenCanvasWidth:r,offScreenCanvasHeight:a,xOffset:c})}addVtkjsDrivenViewport(t,n){this.ensureOffscreenResources();const{element:o,canvas:i,viewportId:s,type:r,defaultOptions:a}=t;o.tabIndex=-1,ke(o);const{offScreenCanvasWidth:c,offScreenCanvasHeight:d,xOffset:l}=n,{sxStartDisplayCoords:u,syStartDisplayCoords:f,sxEndDisplayCoords:m,syEndDisplayCoords:w,sx:V,sy:h,sWidth:g,sHeight:b}=this._getViewportCoordsOnOffScreenCanvas(t,c,d,l);this.offscreenMultiRenderWindow.addRenderer({viewport:[u,f,m,w],id:s,background:a.background?a.background:[0,0,0]});const S={id:s,element:o,renderingEngineId:this.id,type:r,canvas:i,sx:V,sy:h,sWidth:g,sHeight:b,defaultOptions:a||{}},v=Fe(t);if(!v)throw new Error(`Viewport Type ${r} is not supported`);const p=new v(S);p.requestedType=t.requestedType??r,this._viewports.set(s,p);const y={element:o,viewportId:s,renderingEngineId:this.id};p.suppressEvents||T(M,R.ELEMENT_ENABLED,y)}setVtkjsDrivenViewports(t){if(t.length){const n=t.map(r=>F(r.element));n.forEach(r=>{const a=window.devicePixelRatio||1,c=r.getBoundingClientRect();r.width=c.width*a,r.height=c.height*a});const{offScreenCanvasWidth:o,offScreenCanvasHeight:i}=this._resizeOffScreenCanvas(n);let s=0;for(let r=0;r<t.length;r++){const a=t[r],c=n[r],d={...a,canvas:c};this.addVtkjsDrivenViewport(d,{offScreenCanvasWidth:o,offScreenCanvasHeight:i,xOffset:s}),s+=c.width}}}_resizeVTKViewports(t,n=!0,o=!0){const i=t.map(s=>F(s.element));if(i.forEach(s=>{const r=window.devicePixelRatio||1;s.width=s.clientWidth*r,s.height=s.clientHeight*r}),i.length){const{offScreenCanvasWidth:s,offScreenCanvasHeight:r}=this._resizeOffScreenCanvas(i);this._resize(t,s,r)}t.forEach(s=>{const r=s.getCamera(),a=s.getRotation(),{flipHorizontal:c}=r,d=s;d.resetViewStateForResize?d.resetViewStateForResize():d.resetCameraForResize();const l=s.getDisplayArea();n&&(l?(c&&s.setCamera({flipHorizontal:c}),a&&s.setViewPresentation({rotation:a})):s.setCamera(r))}),o&&this.render()}performVtkDrawCall(){const{offscreenMultiRenderWindow:t}=this,n=t.getRenderWindow(),o=t.getRenderers();if(o.length){for(let i=0;i<o.length;i++){const{renderer:s,id:r}=o[i],a=r.split("::")[0];this._needsRender.has(a)?s.setDraw(!0):s.setDraw(!1)}n.render();for(let i=0;i<o.length;i++)o[i].renderer.setDraw(!1)}}renderViewportUsingCustomOrVtkPipeline(t){let n;if(t.sWidth<oe||t.sHeight<oe){console.warn("Viewport is too small",t.sWidth,t.sHeight);return}if(ne(t.type)===!0)n=t.customRenderViewportToCanvas();else{if(!this.offscreenMultiRenderWindow)throw new Error("GPU not available, and using a viewport with no custom render pipeline.");const{offscreenMultiRenderWindow:o}=this,r=o.getOpenGLRenderWindow().get3DContext().canvas;n=this._renderViewportFromVtkCanvasToOnscreenCanvas(t,r)}return n}_renderViewportFromVtkCanvasToOnscreenCanvas(t,n){const{element:o,canvas:i,sx:s,sy:r,sWidth:a,sHeight:c,id:d,renderingEngineId:l,suppressEvents:u}=t,{width:f,height:m}=i;return i.getContext("2d").drawImage(n,s,r,a,c,0,0,f,m),{element:o,suppressEvents:u,viewportId:d,renderingEngineId:l,viewportStatus:t.viewportStatus}}_resizeOffScreenCanvas(t){const{offScreenCanvasContainer:n,offscreenMultiRenderWindow:o}=this,i=Math.max(...t.map(r=>r.height));let s=0;return t.forEach(r=>{s+=r.width}),n.width=s,n.height=i,o.resize(),{offScreenCanvasWidth:s,offScreenCanvasHeight:i}}_resize(t,n,o){let i=0;for(let s=0;s<t.length;s++){const r=t[s],{sxStartDisplayCoords:a,syStartDisplayCoords:c,sxEndDisplayCoords:d,syEndDisplayCoords:l,sx:u,sy:f,sWidth:m,sHeight:w}=this._getViewportCoordsOnOffScreenCanvas(r,n,o,i);i+=r.canvas.width,r.sx=u,r.sy=f,r.sWidth=m,r.sHeight=w,this.offscreenMultiRenderWindow.getRenderer(r.id).setViewport(a,c,d,l)}return i}_getViewportCoordsOnOffScreenCanvas(t,n,o,i){const{canvas:s}=t,{width:r,height:a}=s,c=i,d=0,l=c/n,u=d+(o-a)/o,f=r/n,m=a/o;return{sxStartDisplayCoords:l,syStartDisplayCoords:u,sxEndDisplayCoords:l+f,syEndDisplayCoords:u+m,sx:c,sy:d,sWidth:r,sHeight:a}}}function No(e){return!!(e&&typeof e.canvasToWorld=="function"&&typeof e.worldToCanvas=="function")}function Uo(e){return!!(e&&typeof e.getZoom=="function"&&typeof e.setZoom=="function")}function Go(e){return!!(e&&typeof e.getPan=="function"&&typeof e.setPan=="function")}function An(e){return!!(e&&typeof e.getFrameOfReferenceUID=="function")}class kn{constructor(){this._targetsEventListeners=new Map}addEventListener(t,n,o,i){let s=this._targetsEventListeners.get(t);s||(s=new ue(t),this._targetsEventListeners.set(t,s)),s.addEventListener(n,o,i)}removeEventListener(t,n,o,i){const s=this._targetsEventListeners.get(t);s&&(s.removeEventListener(n,o,i),s.isEmpty&&this._targetsEventListeners.delete(t))}reset(){Array.from(this._targetsEventListeners.entries()).forEach(([t,n])=>{n.reset(),this._targetsEventListeners.delete(t)})}}const Fn=Object.freeze(Object.defineProperty({__proto__:null,MultiTargetEventListenerManager:kn,TargetEventListeners:ue},Symbol.toStringTag,{value:"Module"}));function Nn(e,t){const n=e.getSize();for(let o=0;o<n;o++){const i=[];e.getNodeValue(o,i),i[1]=i[1]*t,i[2]=i[2]*t,i[3]=i[3]*t,e.setNodeValue(o,i)}}const Un=Symbol("LastRuntimeId"),Gn={},Bn=4294967295,Hn="-";function zn(e,t,n){return jn(e!==null&&typeof e=="object"?e:Gn,Un,(typeof n=="number"&&n>0?n:Bn)>>>0).join(typeof t=="string"?t:Hn)}function jn(e,t,n){let o=e[t];o instanceof Array||(o=[0],Object.defineProperty(e,t,{value:o}));for(let i=!0,s=0;i&&s<o.length;++s){let r=o[s]|0;r<n?(i=!1,r=r+1):(r=0,s+1===o.length&&o.push(0)),o[s]=r}return o}const $n=Ne;function qn(e,t,n=1e-5){return Math.abs(e[0]+t[0])<n&&Math.abs(e[1]+t[1])<n&&Math.abs(e[2]+t[2])<n}function Jn(e,t){return!(e[0]<0||e[0]>=t[0]||e[1]<0||e[1]>=t[1]||e[2]<0||e[2]>=t[2])}function Kn(e,t){return!(e[0]<-P||e[0]>=t[0]+P||e[1]<-P||e[1]>=t[1]+P||e[2]<-P||e[2]>=t[2]+P)}function Zn(e,t){let n;t?n=[Y(t)]:n=z();const o=[];return n.forEach(i=>{const s=e.getActors(),r=i.getViewports().filter(fe);for(const a of r){const c=a.getActors();if(c.length!==s.length)continue;s.every(({uid:l})=>c.find(u=>l===u.uid))&&o.push(a)}}),o}function Re(e,t,n=void 0,o="_thumbnails",i={displayArea:{imageArea:[1,1]}}){if(!e||!(e instanceof HTMLCanvasElement))throw new Error("canvas element is required");const s=!t.imageId,r=!s&&t,a=s&&t,d=`renderGPUViewport-${r.imageId||a.volumeId}`,l=document.createElement("div"),u=window.devicePixelRatio||1;i.displayArea||(i.displayArea={imageArea:[1,1]});const f=e.width,m=e.height;l.style.width=`${f/u+se}px`,l.style.height=`${m/u+se}px`,l.style.visibility="hidden",l.style.position="absolute",document.body.appendChild(l);const w=d.split(":").join("-");l.setAttribute("viewport-id-for-remove",w);const V=F(l),h=Y(o)||new Wn(o);let g=h.getViewport(d);if(!g){const b={viewportId:d,type:s?G.ORTHOGRAPHIC:G.STACK,element:l,defaultOptions:{...i,suppressEvents:!0}};h.enableElement(b),g=h.getViewport(d)}return new Promise(b=>{let S=!1,{viewReference:v}=i;const p=y=>{if(S)return;if(v){const A=v;v=null,g.setViewReference(A),g.render();return}e.getContext("2d").drawImage(V,0,0,V.width,V.height,0,0,e.width,e.height);const I=g.canvasToWorld([0,0]),C=g.canvasToWorld([V.width/u,0]),$=g.canvasToWorld([0,V.height/u]),_=D([0,0,0],g.canvasToWorld([1/u,0]),I),W=D([0,0,0],g.canvasToWorld([0,1/u]),I),q=1;S=!0,l.removeEventListener(R.IMAGE_RENDERED,p),setTimeout(()=>{h.disableElement(d),document.querySelectorAll(`[viewport-id-for-remove="${w}"]`).forEach(Le=>{Le.remove()})},0),b({origin:I,bottomLeft:$,topRight:C,thicknessMm:q,rightVector:_,downVector:W})};l.addEventListener(R.IMAGE_RENDERED,p),s?g.setVolumes([a],!1,!0):g.renderImageObject(t),g.resetCamera(),n==="PT"&&!ge(r)&&g.setProperties({voiRange:{lower:r.minPixelValue,upper:r.maxPixelValue}}),g.render()})}function Ce(e,t,n,o,i){if(t.volumeId)throw new Error("Unsupported volume rendering for CPU");const r=t,a=Ue(e,r,n),c={canvas:e,viewport:a,image:r,renderingTools:{}};c.transform=Ge(c);const d=!0;return new Promise((l,u)=>{Be(c,d),l(null)})}function Xn(e){const{canvas:t,imageId:n,viewReference:o,requestType:i=He.Thumbnail,priority:s=-5,renderingEngineId:r="_thumbnails",useCPURendering:a=!1,thumbnail:c=!1,imageAspect:d=!1,viewportOptions:l}=e,u=o?.volumeId,f=u&&!n,m=o&&l?{...l,viewReference:o}:l,w=a?Ce:Re;return new Promise((V,h)=>{function g(p,y){const{modality:x}=B(me.GENERAL_SERIES,y)||{},I=!f&&p,C=f&&p;I&&(I.isPreScaled=I.isPreScaled||I.preScale?.scaled),c&&(t.height=256,t.width=256),d&&I&&(t.width=I&&t.height*I.width/I.height),t.style.width=`${t.width/devicePixelRatio}px`,t.style.height=`${t.height/devicePixelRatio}px`,C&&a&&h(new Error("CPU rendering of volume not supported")),w(t,p,x,r,m).then(V)}function b(p,y){console.error(p,y),h(p)}function S(p,y,x){return je(p,x).then(I=>{g.call(this,I,p)},I=>{b.call(this,I,p)})}const v={useRGBA:!!a,requestType:i};if(u){const p=O.getVolume(u);p||h(new Error(`Volume id ${u} not found in cache`));const y=p.imageIds[0];g(p,y)}else ze.addRequest(S.bind(null,n,null,v),i,{imageId:n},s)})}function Yn(e){const t=z(),n=[];return t.forEach(o=>{o.getViewports().filter(he).forEach(s=>{s.hasImageURI(e)&&n.push(s)})}),n}function Qn(e,t){const n=eo(e,t);return n?n.index:null}function eo(e,t){const n=t.getImageIds(),o=t.getCurrentImageIdIndex();if(n.length===0)return null;const i=c=>{const d=to(c);if(!d)return null;const l=$e(d.planeNormal,d.imagePositionPatient);return qe(l,e)},s={distance:i(n[o])??1/0,index:o},r=n.slice(o+1);for(let c=0;c<r.length;c++){const d=r[c],l=i(d);if(l!==null)if(l<=s.distance)s.distance=l,s.index=c+o+1;else break}const a=n.slice(0,o);for(let c=a.length-1;c>=0;c--){const d=a[c],l=i(d);if(!(l===null||l===s.distance))if(l<s.distance)s.distance=l,s.index=c;else break}return s.distance===1/0?null:s}function to(e){const t=B(me.IMAGE_PLANE,e);if(!t||!(t.rowCosines instanceof Array&&t.rowCosines.length===3)||!(t.columnCosines instanceof Array&&t.columnCosines.length===3)||!(t.imagePositionPatient instanceof Array&&t.imagePositionPatient.length===3))return null;const{rowCosines:n,columnCosines:o,imagePositionPatient:i}=t,s=ie(E(),...n),r=ie(E(),...o),a=H(E(),s,r);return{rowCosines:n,columnCosines:o,imagePositionPatient:i,planeNormal:a}}function no(e){const{width:t,height:n}=e.getCanvas(),{sliceToIndexMatrix:o,indexToSliceMatrix:i}=e.getSliceViewInfo(),s=J(e,[0,0]),r=J(e,[t-1,0]),a=J(e,[0,n-1]),c=D(E(),r,s),d=D(E(),a,s),l=H(E(),c,d);L(c,c),L(d,d),L(l,l);const u=Math.max(Math.abs(c[0]),Math.abs(c[1]),Math.abs(c[2])),f=Math.max(Math.abs(d[0]),Math.abs(d[1]),Math.abs(d[2]));if(!re(1,u)||!re(1,f))throw new Error("getCurrentVolumeViewportSlice is not available for rotate/oblique viewports");const{voxelManager:m}=e.getImageData(),w=e.getSliceViewInfo(),V=m.getSliceData(w);return{width:w.width,height:w.height,scalarData:V,sliceToIndexMatrix:o,indexToSliceMatrix:i}}const oo=.05;function so(e,t){const n=e.getSliceIndex(),o=t.getSliceIndex(),i=B("imagePlaneModule",n.toString()),s=B("imagePlaneModule",o.toString());if(!i||!s){console.log("Viewport spatial registration requires image plane module");return}const{imageOrientationPatient:r}=s;if(!i.imageOrientationPatient.every((f,m)=>Math.abs(f-r[m])<oo)){console.log("Viewport spatial registration only supported for same orientation (hence translation only) for now",i?.imageOrientationPatient,s?.imageOrientationPatient);return}const c=i.imagePositionPatient,d=s.imagePositionPatient,l=Je(E(),c,d),u=Ke(Ze(),l);pe.add([e.id,t.id],u)}function io(e){const{imageData:t,dimensions:n}=e.getImageData()||{};if(!t||!n)return[];const{canvas:o}=e,i=window.devicePixelRatio,s=[0,0],r=[o.width/i,0],a=[o.width/i,o.height/i],c=[0,o.height/i],d=e.canvasToWorld(s),l=e.canvasToWorld(r),u=e.canvasToWorld(a),f=e.canvasToWorld(c),m=t.worldToIndex(d),w=t.worldToIndex(l),V=t.worldToIndex(u),h=t.worldToIndex(f);return ro({dimensions:n,imageData:t,topLeftImage:m,topRightImage:w,bottomRightImage:V,bottomLeftImage:h,topLeftWorld:d,topRightWorld:l,bottomRightWorld:u,bottomLeftWorld:f})}function ro({dimensions:e,imageData:t,topLeftImage:n,topRightImage:o,bottomRightImage:i,bottomLeftImage:s,topLeftWorld:r,topRightWorld:a,bottomRightWorld:c,bottomLeftWorld:d}){const l=k(n,e)?r:t.indexToWorld([0,0,0]),u=k(o,e)?a:t.indexToWorld([e[0]-1,0,0]),f=k(i,e)?c:t.indexToWorld([e[0]-1,e[1]-1,0]),m=k(s,e)?d:t.indexToWorld([0,e[1]-1,0]);return[l,u,m,f]}function k(e,t){return e[0]>0||e[0]<t[0]-1||e[1]>0||e[1]<t[1]-1||e[2]>0||e[2]<t[2]-1}function j(e){if(!e)return;const{viewportUid:t,renderingEngineUid:n}=e.dataset;return Pe(t,n)}function Pe(e,t){if(!t||!e)return;const n=Y(t);if(!n||n.hasBeenDestroyed)return;const o=n.getViewport(e);if(!o)return;const i=An(o)?o.getFrameOfReferenceUID():void 0;return{viewport:o,renderingEngine:n,viewportId:e,renderingEngineId:t,FrameOfReferenceUID:i}}function Bo(e){const t=z();for(let n=0;n<t.length;n++){const o=t[n];if(o.getViewport(e))return Pe(e,o.id)}}function Ho(){const e=[];return z().forEach(n=>{n.getViewports().forEach(({element:i})=>{e.push(j(i))})}),e}function ao(e){const t=j(e);if(!t)return;const{viewport:n}=t;if(!(n instanceof Q))throw new Error(`An image can only be fetched for a stack viewport and not for a viewport of type: ${n.type}`);return n.getCornerstoneImage()}async function co({viewport:e,options:t={}}){const n=e.getRenderingEngine();let o=t.volumeId||`${ee()}`;o.split(":").length===0&&(o=`${Xe()}:${o}`);const{id:i,element:s}=e,r=t.viewportId||i,a=e.getImageIds(),c=e.getViewPresentation(),d=e.getViewReference();n.enableElement({viewportId:r,type:G.ORTHOGRAPHIC,element:s,defaultOptions:{background:t.background,orientation:t.orientation}}),(await Ye(o,{imageIds:a})).load();const u=n.getViewport(r);await _n(n,[{volumeId:o}],[r]);const f=()=>{u.render(),s.removeEventListener(R.VOLUME_VIEWPORT_NEW_VOLUME,f)};return s.addEventListener(R.VOLUME_VIEWPORT_NEW_VOLUME,f),u.setViewPresentation(c),u.setViewReference(d),u.render(),u}async function lo({viewport:e,options:t}){const n=e,{id:o,element:i}=n,s=e.getRenderingEngine(),{background:r}=t,a=t.viewportId||o,c=O.getVolume(n.getVolumeId());if(!(c instanceof Qe))throw new Error("Currently, you cannot decache a volume that is not an ImageVolume. So, unfortunately, volumes such as nifti (which are basic Volume, without imageIds) cannot be decached.");const d={viewportId:a,type:G.STACK,element:i,defaultOptions:{background:r}},l=n.getViewReference();s.enableElement(d);const u=s.getViewport(a);return await u.setStack(c.imageIds),u.setViewReference(l),u.render(),u}function Te(e,t=2){if(Array.isArray(e))return e.map(i=>Te(i,t)).join(", ");if(e==null||e==="")return"NaN";e=Number(e);const n=Math.abs(e);if(n<1e-4)return`${e}`;const o=n>=100?t-2:n>=10?t-1:n>=1?t:n>=.1?t+1:n>=.01?t+2:n>=.001?t+3:t+4;return e.toFixed(o)}function uo(e){return Math.round(e/P)*P}function fo(e,t,n){const o=e.length===t*n*4,i=e.length===t*n*3;if(o||i){const s=new Float32Array(t*n);let r=0,a=0;const c=o?4:3;for(let d=0;d<t;d++)for(let l=0;l<n;l++){const u=e[r],f=e[r+1],m=e[r+2];s[a]=(u+f+m)/3,r+=c,a++}return s}else return e}function go(e){if(e instanceof we)return O.getVolume(e.getVolumeId()).imageIds;if(e.getImageIds)return e.getImageIds()}function mo(e,t){const n=[...e];return t>=n.length?(ce(n),n):(ce(n),n.slice(0,t))}function ce(e){for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}}function K(e){const t=e.toString(16);return t.length==1?"0"+t:t}function ho(e,t,n){return"#"+K(e)+K(t)+K(n)}function po(e){const t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}const wo=Object.freeze(Object.defineProperty({__proto__:null,hexToRgb:po,rgbToHex:ho},Symbol.toStringTag,{value:"Module"}));function Io(e,t){if(e===t)return!0;if(e==null||t==null)return!1;try{return JSON.stringify(e)===JSON.stringify(t)}catch(n){return console.debug("Error in JSON.stringify during deep comparison:",n),e===t}}function xe(e,t){const n=e,o=n.getActors?.()??[];return(t?o.find(s=>s.referencedId===t)??o.find(s=>s.referencedId?.endsWith(`:${t}`)):void 0)?.referencedId??(t?te(t):void 0)??n.getDefaultActor?.()?.referencedId}function Me(e,t,n){if(!n)throw new Error("getVolume is required, use the utilities export instead");if(Ie(e)){const o=xe(e,t),i=o?n(o):void 0,s=e.getImageData?.();return{modality:i?.metadata?.Modality??s?.metadata?.Modality,isPreScaled:le(i?.scaling)}}if(typeof e.setVolumes=="function"){const i=t?te(t):e.getVolumeId(),s=i?n(i):void 0;return{modality:s?.metadata?.Modality,isPreScaled:le(s?.scaling)}}if(typeof e.setStack=="function"){const o=e,{preScale:i}=o.getImageData()||{};return{modality:o.modality,isPreScaled:!!i?.scaled}}}function le(e){return!!e&&Object.keys(e).length>0}function Vo(e,t,n){const o=Me(e,t,n);if(!o)throw new Error("Invalid viewport type");return o.modality}function So(e){const{imageIdGroups:t,splittingTag:n}=Ve(e);return{isDynamicVolume:t.length>1,timePoints:t,splittingTag:n}}function bo(e,t){const n=e.length,{rescaleSlope:o,rescaleIntercept:i,suvbw:s}=t;if(t.modality==="PT"&&typeof s=="number")for(let r=0;r<n;r++)e[r]=s*(e[r]*o+i);else for(let r=0;r<n;r++)e[r]=e[r]*o+i;return e}function De(e,t,n){return Math.min(Math.max(t,e),n)}function Oe(e,t){if(!j(e.element))throw new Error("Scroll::Viewport is not enabled (it might be disabled)");if(e instanceof Q&&e.getImageIds().length===0)throw new Error("Scroll::Stack Viewport has no images");const{volumeId:o,delta:i,scrollSlabs:s}=t;if(e instanceof we)vo(e,o,i,s);else{if(typeof e.getCurrentImageIdIndex!="function"||typeof e.scroll!="function")return;const r=e.getCurrentImageIdIndex();if(r+i>e.getImageIds().length-1||r+i<0){const a={imageIdIndex:r,direction:i};T(M,R.STACK_SCROLL_OUT_OF_BOUNDS,a)}e.scroll(i,t.debounceLoading,t.loop)}}function vo(e,t,n,o=!1){const i=o,{numScrollSteps:s,currentStepIndex:r,sliceRangeInfo:a}=Se(e,t,i);if(s===0||!a)return;const{sliceRange:c,spacingInNormalDirection:d,camera:l}=a,{focalPoint:u,viewPlaneNormal:f,position:m}=l,{newFocalPoint:w,newPosition:V}=be(u,m,c,f,d,n);e.setCamera({focalPoint:w,position:V}),e.render();const h=r+n,g={volumeId:t,viewport:e,delta:n,desiredStepIndex:h,currentStepIndex:r,numScrollSteps:s,currentImageId:e.getCurrentImageId()};(h>s||h<0)&&e.getCurrentImageId()?T(M,R.VOLUME_VIEWPORT_SCROLL_OUT_OF_BOUNDS,g):T(M,R.VOLUME_VIEWPORT_SCROLL,g)}async function Eo(e,t={}){const{imageIndex:n,debounceLoading:o,volumeId:i}=t,s=j(e);if(!s)throw new Error("Element has been disabled");const{viewport:r}=s,{imageIndex:a,numberOfSlices:c}=yo(r,o),l=Ro(c,n)-a;Oe(r,{delta:l,debounceLoading:o,volumeId:i})}function yo(e,t){return e instanceof Q?{numberOfSlices:e.getImageIds().length,imageIndex:t?e.getTargetImageIdIndex():e.getCurrentImageIdIndex()}:{numberOfSlices:e.getNumberOfSlices(),imageIndex:e.getSliceIndex()}}function Ro(e,t){const n=e-1;return De(t,0,n)}function Co(e,t,n={}){const o=O.getVolume(e);if(!o)throw new Error(`Referenced volume with id ${e} does not exist.`);const{metadata:i,spacing:s,direction:r,dimensions:a}=o,{minX:c,maxX:d,minY:l,maxY:u,minZ:f,maxZ:m}=t,w=[Math.min(c,d),Math.min(l,u),Math.min(f,m)],V=Z(o.imageData,w),h=[Math.abs(d-c)+1,Math.abs(u-l)+1,Math.abs(m-f)+1],{targetBuffer:g}=n,b={metadata:i,dimensions:h,spacing:s,origin:V,direction:r,targetBuffer:g,scalarData:g?.type==="Float32Array"?new Float32Array(h[0]*h[1]*h[2]):void 0},S=et(ee(),b),v=S.voxelManager.getCompleteScalarDataArray(),p=h[0]*h[1],y=a[0]*a[1],x=o.voxelManager.getCompleteScalarDataArray();for(let I=0;I<h[2];I++)for(let C=0;C<h[1];C++){const $=Z(S.imageData,[0,C,I]),_=ve(o.imageData,$),W=_[2]*y+_[1]*a[0]+_[0],q=x.slice(W,W+h[0]),A=I*p+C*h[0];v.set(q,A)}return S.voxelManager.setCompleteScalarDataArray(v),S}function Po(e,t){const{viewUp:n,viewPlaneNormal:o}=t,i=N(e,[0,0,0]),s=ae(E(),n),r=ae(E(),o),a=H(E(),s,r),c=D(E(),N(e,s),i),d=D(E(),N(e,r),i);L(c,c),L(d,d);const l=H(E(),c,d);return{worldVecRowDir:a,worldVecColDir:s,worldVecSliceDir:r,ijkVecRowDir:l,ijkVecColDir:c,ijkVecSliceDir:d}}function To(e,t,n,o){const[i,s,r]=t,a=i*s;let c=0,d=0,l=0;const[u,f,m]=n.map(Math.round);for(let g=m-o;g<=m+o;g++)if(!(g<0||g>=r)){for(let b=f-o;b<=f+o;b++)if(!(b<0||b>=s))for(let S=u-o;S<=u+o;S++){if(S<0||S>=i)continue;const v=g*a+b*i+S,p=e[v];c+=p,d+=p*p,l++}}if(l===0){const g=m*a+f*i+u;return g>=0&&g<e.length?{mean:e[g],stdDev:0,count:1}:{mean:0,stdDev:0,count:0}}const w=c/l,V=d/l-w*w,h=Math.sqrt(Math.max(0,V));return{mean:w,stdDev:h,count:l}}const de=1e-6;function xo(e,t){const{lower:n,upper:o}=t.voiRange,i=o-n,s=t.VOILUTFunction,r=a=>t.invert===!0?1-a:a;if(s===Ee.SAMPLED_SIGMOID||s==="SIGMOID"){const{windowCenter:a,windowWidth:c}=ye(n,o),d=Math.max(Math.abs(c),1e-12);return r(1/(1+Math.exp(-4*(e-a)/d)))}return i===0||!Number.isFinite(i)?r(0):r(U((e-n)/i))}function X(e,t){const{lower:n,upper:o}=t.voiRange,i=t.VOILUTFunction,s=t.invert===!0?U(1-U(e)):U(e);if(i===Ee.SAMPLED_SIGMOID||i==="SIGMOID"){const{windowCenter:a,windowWidth:c}=ye(n,o),d=_e(s,de,1-de);return tt(d,a,c)}const r=o-n;return r===0||!Number.isFinite(r)?n:n+s*r}function Mo(e,t,n){const o=Math.min(e,t),i=Math.max(e,t),s=X(o,n),r=X(i,n);return{rawMin:Math.min(s,r),rawMax:Math.max(s,r)}}function U(e){return Number.isFinite(e)?_e(e,0,1):0}function _e(e,t,n){return Math.min(n,Math.max(t,e))}const{getPixelSpacingInformation:Do,calculateRadiographicPixelSpacing:Oo,getERMF:_o}=nt,Lo=(e,t)=>Vo(e,t,O.getVolume),Wo=(e,t)=>Me(e,t,O.getVolume),zo=Object.freeze(Object.defineProperty({__proto__:null,ECGUtilities:ft,FrameRange:gt,HistoryMemo:mt,PointsManager:at,ProgressiveIterator:it,RLEVoxelMap:st,VideoUtilities:ht,VoxelManager:ot,WSIUtilities:pt,actorIsA:wt,applyPreset:It,asArray:Vt,autoLoad:St,buildMetadata:bt,calculateNeighborhoodStats:To,calculateRadiographicPixelSpacing:Oo,calculateSpacingBetweenImageIds:vt,calculateViewportsSpatialRegistration:so,calibratedPixelSpacingMetadataProvider:$n,clamp:ut,clip:De,clonePoint3:Et,color:wo,colormap:yt,convertColorArrayToRgbString:Rt,convertStackToVolumeViewport:co,convertToGrayscale:fo,convertVolumeToStackViewport:lo,createLinearRGBTransferFunction:Ct,createSigmoidRGBTransferFunction:Pt,createSubVolume:Co,decimate:Tt,deepClone:xt,deepEqual:Io,deepMerge:Mt,eventListener:Fn,fnv1aHash:Dt,generateFrameImageId:Ot,generateVolumePropsFromImageIds:_t,genericMetadataProvider:Lt,genericViewportDisplaySetMetadataProvider:Wt,getAcquisitionPlaneOrientation:At,getBufferConfiguration:kt,getClosestImageId:Ft,getClosestStackImageIndexForPoint:Qn,getCubeSizeInView:Nt,getCurrentVolumeViewportSlice:no,getDynamicVolumeInfo:So,getERMF:_o,getImageDataMetadata:Ut,getImageLegacy:ao,getImageSliceDataForVolumeViewport:Gt,getMinMax:Bt,getNormalizedAspectRatio:dt,getPixelSpacingInformation:Do,getRandomSampleFromArray:mo,getRuntimeId:zn,getScalingDescriptor:Wo,getScalingParameters:Ht,getSliceRange:zt,getSpacingInNormalDirection:jt,getTargetVolumeAndSpacingInNormalDir:$t,getVOIRangeFromWindowLevel:qt,getViewportContentMode:Jt,getViewportImageCornersInWorld:io,getViewportImageIds:go,getViewportModality:Lo,getViewportsWithImageURI:Yn,getViewportsWithVolumeId:Kt,getVoiFromSigmoidRGBTransferFunction:Zt,getVolumeActorCorners:Xt,getVolumeDirectionVectors:Po,getVolumeId:te,getVolumeSliceRangeInfo:Yt,getVolumeViewReferenceId:Qt,getVolumeViewportScrollInfo:Se,getVolumeViewportsContainingSameVolumes:Zn,handleMultiframe4D:en,hasFloatScalingParameters:tn,hasNaNValues:nn,hasOwn:on,imageIdToURI:sn,imageRetrieveMetadataProvider:ct,imageToWorldCoords:rn,indexAlmostWithinDimensions:Kn,indexWithinDimensions:Jn,invertRgbTransferFunction:an,isEqual:lt,isEqualAbs:cn,isEqualNegative:ln,isGenericViewport:Ie,isImageActor:dn,isNumber:un,isOpposite:qn,isPTPrescaledWithSUV:ge,isValidVolume:fn,isVideoTransferSyntax:gn,jumpToSlice:Eo,loadImageToCanvas:Xn,logger:rt,makeVolumeMetadata:mn,mapMappedBandToRawRange:Mo,mapScalarToViewportVoiIntensity:xo,mapViewportVoiIntensityToScalar:X,planar:hn,pointInShapeCallback:pn,renderToCanvasCPU:Ce,renderToCanvasGPU:Re,resolveGenericViewportVolumeId:xe,rotateToViewCoordinates:wn,roundNumber:Te,roundToPrecision:uo,scaleArray:bo,scaleRgbTransferFunction:Nn,scroll:Oe,snapFocalPointToSlice:be,sortImageIdsAndGetSpacing:In,spatialRegistrationMetadataProvider:pe,splitImageIdsBy4DTags:Ve,transferFunctionUtils:Vn,transformIndexToWorld:Z,transformWorldToIndex:ve,transformWorldToIndexContinuous:N,triggerEvent:T,updatePlaneRestriction:Sn,updateVTKImageDataWithCornerstoneImage:bn,uuidv4:ee,viewportIsInStackMode:vn,viewportIsInVolumeMode:En,viewportSupportsDisplaySetPresentation:yn,viewportSupportsImageSlices:he,viewportSupportsStackCalibration:Rn,viewportSupportsStackCompatibility:Cn,viewportSupportsVolumeActors:fe,viewportSupportsVolumeCompatibility:Pn,viewportSupportsVolumeId:Tn,viewportSupportsVolumeURI:xn,windowLevel:Mn,worldToImageCoords:Dn},Symbol.toStringTag,{value:"Module"}));export{Oe as A,no as B,De as C,qn as D,io as E,fo as F,On as G,kn as M,Wn as T,Ln as a,Pe as b,Bo as c,Ho as d,An as e,Go as f,j as g,Uo as h,zn as i,Io as j,mo as k,Wo as l,Yn as m,Kn as n,Qn as o,so as p,Eo as q,Te as r,_n as s,Jn as t,zo as u,No as v,uo as w,Po as x,Co as y,To as z};
1
+ import{t as T,E as R,e as M,B as We,v as Ae,a as ne,b as F,s as ke,c as Fe,f as oe,cw as ue,c8 as Ne,bW as P,aK as z,cx as fe,aJ as Y,ag as se,V as G,cy as ge,cz as D,cA as Ue,cB as Ge,cC as Be,bL as He,at as O,aO as ze,bi as B,cD as me,bN as je,cE as he,bt as $e,b_ as qe,cF as ie,cG as E,cH as H,cI as J,cJ as L,cK as re,cL as Je,cM as Ke,cN as Ze,bC as pe,am as Q,b8 as ee,cO as Xe,cP as Ye,ai as Qe,ar as we,bm as te,i as Ie,L as Ve,bK as Se,cQ as be,bA as Z,bG as et,bc as ve,bz as N,cR as ae,cS as Ee,bP as ye,cT as tt,cr as nt,K as ot,cU as st,cV as it,c1 as rt,cW as at,cX as ct,bf as lt,cY as dt,cZ as ut,c_ as ft,c$ as gt,bp as mt,d0 as ht,d1 as pt,d2 as wt,d3 as It,d4 as Vt,d5 as St,d6 as bt,d7 as vt,bg as Et,d8 as yt,av as Rt,d9 as Ct,da as Pt,H as Tt,b7 as xt,bk as Mt,db as Dt,dc as Ot,J as _t,dd as Lt,bo as Wt,de as At,df as kt,bq as Ft,dg as Nt,bs as Ut,dh as Gt,bR as Bt,di as Ht,dj as zt,bF as jt,bj as $t,dk as qt,bh as Jt,bn as Kt,dl as Zt,dm as Xt,dn as Yt,dp as Qt,dq as en,dr as tn,ds as nn,dt as on,bl as sn,bZ as rn,du as an,bT as cn,dv as ln,bS as dn,bv as un,br as fn,ct as gn,dw as mn,dx as hn,bI as pn,dy as wn,M as In,dz as Vn,dA as Sn,bw as bn,dB as vn,bD as En,bJ as yn,dC as Rn,dD as Cn,bM as Pn,dE as Tn,dF as xn,dG as Mn,bY as Dn}from"./Settings-CepUR3VB.js";import"./Texture-CA0OMvaZ.js";import"./cornerstoneEngine-oWB9T9Cs.js";function On(e){return!!(e&&typeof e.setVolumes=="function"&&typeof e.addVolumes=="function")}async function _n(e,t,n,o=!1,i=!1){const s=n.map(r=>{const a=e.getViewport(r);if(!a)throw new Error(`Viewport with Id ${r} does not exist`);if(!On(a))throw new Error("setVolumesForViewports only supports viewports that implement setVolumes");return a});await Promise.all(s.map(r=>r.setVolumes(t,o,i)))}function Ln(e,t,n=0){const o=e.getOpenGLRenderWindow?.()?.getCanvas?.();o&&(o.addEventListener("webglcontextlost",()=>{console.warn(`CornerstoneRender: WebGL context lost (renderingEngine=${t}, context=${n})`),T(M,R.WEBGL_CONTEXT_LOST,{renderingEngineId:t,contextIndex:n})}),o.addEventListener("webglcontextrestored",()=>{T(M,R.WEBGL_CONTEXT_RESTORED,{renderingEngineId:t,contextIndex:n})}))}class Wn extends We{constructor(t){super(t),this._renderFlaggedViewports=()=>{this._throwIfDestroyed(),this.offscreenMultiRenderWindow&&this.performVtkDrawCall();const n=this._getViewportsAsArray(),o=[];for(let i=0;i<n.length;i++){const s=n[i];if(this._needsRender.has(s.id)){const r=this.renderViewportUsingCustomOrVtkPipeline(s);if(o.push(r),s.setRendered(),this._needsRender.delete(s.id),this._needsRender.size===0)break}}this._animationFrameSet=!1,this._animationFrameHandle=null,o.forEach(i=>{i?.element&&T(i.element,R.IMAGE_RENDERED,i)})},this.useCPURendering||this.ensureOffscreenResources()}ensureOffscreenResources(){this.offscreenMultiRenderWindow||(this.offscreenMultiRenderWindow=Ae.newInstance(),this.offScreenCanvasContainer=document.createElement("div"),this.offscreenMultiRenderWindow.setContainer(this.offScreenCanvasContainer),Ln(this.offscreenMultiRenderWindow,this.id))}enableVTKjsDrivenViewport(t){this.ensureOffscreenResources();const o=this._getViewportsAsArray().filter(l=>ne(l.type)===!1),i=o.map(l=>l.canvas),s=F(t.element);i.push(s);const{offScreenCanvasWidth:r,offScreenCanvasHeight:a}=this._resizeOffScreenCanvas(i),c=this._resize(o,r,a),d={...t,canvas:s};this.addVtkjsDrivenViewport(d,{offScreenCanvasWidth:r,offScreenCanvasHeight:a,xOffset:c})}addVtkjsDrivenViewport(t,n){this.ensureOffscreenResources();const{element:o,canvas:i,viewportId:s,type:r,defaultOptions:a}=t;o.tabIndex=-1,ke(o);const{offScreenCanvasWidth:c,offScreenCanvasHeight:d,xOffset:l}=n,{sxStartDisplayCoords:u,syStartDisplayCoords:f,sxEndDisplayCoords:m,syEndDisplayCoords:w,sx:V,sy:h,sWidth:g,sHeight:b}=this._getViewportCoordsOnOffScreenCanvas(t,c,d,l);this.offscreenMultiRenderWindow.addRenderer({viewport:[u,f,m,w],id:s,background:a.background?a.background:[0,0,0]});const S={id:s,element:o,renderingEngineId:this.id,type:r,canvas:i,sx:V,sy:h,sWidth:g,sHeight:b,defaultOptions:a||{}},v=Fe(t);if(!v)throw new Error(`Viewport Type ${r} is not supported`);const p=new v(S);p.requestedType=t.requestedType??r,this._viewports.set(s,p);const y={element:o,viewportId:s,renderingEngineId:this.id};p.suppressEvents||T(M,R.ELEMENT_ENABLED,y)}setVtkjsDrivenViewports(t){if(t.length){const n=t.map(r=>F(r.element));n.forEach(r=>{const a=window.devicePixelRatio||1,c=r.getBoundingClientRect();r.width=c.width*a,r.height=c.height*a});const{offScreenCanvasWidth:o,offScreenCanvasHeight:i}=this._resizeOffScreenCanvas(n);let s=0;for(let r=0;r<t.length;r++){const a=t[r],c=n[r],d={...a,canvas:c};this.addVtkjsDrivenViewport(d,{offScreenCanvasWidth:o,offScreenCanvasHeight:i,xOffset:s}),s+=c.width}}}_resizeVTKViewports(t,n=!0,o=!0){const i=t.map(s=>F(s.element));if(i.forEach(s=>{const r=window.devicePixelRatio||1;s.width=s.clientWidth*r,s.height=s.clientHeight*r}),i.length){const{offScreenCanvasWidth:s,offScreenCanvasHeight:r}=this._resizeOffScreenCanvas(i);this._resize(t,s,r)}t.forEach(s=>{const r=s.getCamera(),a=s.getRotation(),{flipHorizontal:c}=r,d=s;d.resetViewStateForResize?d.resetViewStateForResize():d.resetCameraForResize();const l=s.getDisplayArea();n&&(l?(c&&s.setCamera({flipHorizontal:c}),a&&s.setViewPresentation({rotation:a})):s.setCamera(r))}),o&&this.render()}performVtkDrawCall(){const{offscreenMultiRenderWindow:t}=this,n=t.getRenderWindow(),o=t.getRenderers();if(o.length){for(let i=0;i<o.length;i++){const{renderer:s,id:r}=o[i],a=r.split("::")[0];this._needsRender.has(a)?s.setDraw(!0):s.setDraw(!1)}n.render();for(let i=0;i<o.length;i++)o[i].renderer.setDraw(!1)}}renderViewportUsingCustomOrVtkPipeline(t){let n;if(t.sWidth<oe||t.sHeight<oe){console.warn("Viewport is too small",t.sWidth,t.sHeight);return}if(ne(t.type)===!0)n=t.customRenderViewportToCanvas();else{if(!this.offscreenMultiRenderWindow)throw new Error("GPU not available, and using a viewport with no custom render pipeline.");const{offscreenMultiRenderWindow:o}=this,r=o.getOpenGLRenderWindow().get3DContext().canvas;n=this._renderViewportFromVtkCanvasToOnscreenCanvas(t,r)}return n}_renderViewportFromVtkCanvasToOnscreenCanvas(t,n){const{element:o,canvas:i,sx:s,sy:r,sWidth:a,sHeight:c,id:d,renderingEngineId:l,suppressEvents:u}=t,{width:f,height:m}=i;return i.getContext("2d").drawImage(n,s,r,a,c,0,0,f,m),{element:o,suppressEvents:u,viewportId:d,renderingEngineId:l,viewportStatus:t.viewportStatus}}_resizeOffScreenCanvas(t){const{offScreenCanvasContainer:n,offscreenMultiRenderWindow:o}=this,i=Math.max(...t.map(r=>r.height));let s=0;return t.forEach(r=>{s+=r.width}),n.width=s,n.height=i,o.resize(),{offScreenCanvasWidth:s,offScreenCanvasHeight:i}}_resize(t,n,o){let i=0;for(let s=0;s<t.length;s++){const r=t[s],{sxStartDisplayCoords:a,syStartDisplayCoords:c,sxEndDisplayCoords:d,syEndDisplayCoords:l,sx:u,sy:f,sWidth:m,sHeight:w}=this._getViewportCoordsOnOffScreenCanvas(r,n,o,i);i+=r.canvas.width,r.sx=u,r.sy=f,r.sWidth=m,r.sHeight=w,this.offscreenMultiRenderWindow.getRenderer(r.id).setViewport(a,c,d,l)}return i}_getViewportCoordsOnOffScreenCanvas(t,n,o,i){const{canvas:s}=t,{width:r,height:a}=s,c=i,d=0,l=c/n,u=d+(o-a)/o,f=r/n,m=a/o;return{sxStartDisplayCoords:l,syStartDisplayCoords:u,sxEndDisplayCoords:l+f,syEndDisplayCoords:u+m,sx:c,sy:d,sWidth:r,sHeight:a}}}function No(e){return!!(e&&typeof e.canvasToWorld=="function"&&typeof e.worldToCanvas=="function")}function Uo(e){return!!(e&&typeof e.getZoom=="function"&&typeof e.setZoom=="function")}function Go(e){return!!(e&&typeof e.getPan=="function"&&typeof e.setPan=="function")}function An(e){return!!(e&&typeof e.getFrameOfReferenceUID=="function")}class kn{constructor(){this._targetsEventListeners=new Map}addEventListener(t,n,o,i){let s=this._targetsEventListeners.get(t);s||(s=new ue(t),this._targetsEventListeners.set(t,s)),s.addEventListener(n,o,i)}removeEventListener(t,n,o,i){const s=this._targetsEventListeners.get(t);s&&(s.removeEventListener(n,o,i),s.isEmpty&&this._targetsEventListeners.delete(t))}reset(){Array.from(this._targetsEventListeners.entries()).forEach(([t,n])=>{n.reset(),this._targetsEventListeners.delete(t)})}}const Fn=Object.freeze(Object.defineProperty({__proto__:null,MultiTargetEventListenerManager:kn,TargetEventListeners:ue},Symbol.toStringTag,{value:"Module"}));function Nn(e,t){const n=e.getSize();for(let o=0;o<n;o++){const i=[];e.getNodeValue(o,i),i[1]=i[1]*t,i[2]=i[2]*t,i[3]=i[3]*t,e.setNodeValue(o,i)}}const Un=Symbol("LastRuntimeId"),Gn={},Bn=4294967295,Hn="-";function zn(e,t,n){return jn(e!==null&&typeof e=="object"?e:Gn,Un,(typeof n=="number"&&n>0?n:Bn)>>>0).join(typeof t=="string"?t:Hn)}function jn(e,t,n){let o=e[t];o instanceof Array||(o=[0],Object.defineProperty(e,t,{value:o}));for(let i=!0,s=0;i&&s<o.length;++s){let r=o[s]|0;r<n?(i=!1,r=r+1):(r=0,s+1===o.length&&o.push(0)),o[s]=r}return o}const $n=Ne;function qn(e,t,n=1e-5){return Math.abs(e[0]+t[0])<n&&Math.abs(e[1]+t[1])<n&&Math.abs(e[2]+t[2])<n}function Jn(e,t){return!(e[0]<0||e[0]>=t[0]||e[1]<0||e[1]>=t[1]||e[2]<0||e[2]>=t[2])}function Kn(e,t){return!(e[0]<-P||e[0]>=t[0]+P||e[1]<-P||e[1]>=t[1]+P||e[2]<-P||e[2]>=t[2]+P)}function Zn(e,t){let n;t?n=[Y(t)]:n=z();const o=[];return n.forEach(i=>{const s=e.getActors(),r=i.getViewports().filter(fe);for(const a of r){const c=a.getActors();if(c.length!==s.length)continue;s.every(({uid:l})=>c.find(u=>l===u.uid))&&o.push(a)}}),o}function Re(e,t,n=void 0,o="_thumbnails",i={displayArea:{imageArea:[1,1]}}){if(!e||!(e instanceof HTMLCanvasElement))throw new Error("canvas element is required");const s=!t.imageId,r=!s&&t,a=s&&t,d=`renderGPUViewport-${r.imageId||a.volumeId}`,l=document.createElement("div"),u=window.devicePixelRatio||1;i.displayArea||(i.displayArea={imageArea:[1,1]});const f=e.width,m=e.height;l.style.width=`${f/u+se}px`,l.style.height=`${m/u+se}px`,l.style.visibility="hidden",l.style.position="absolute",document.body.appendChild(l);const w=d.split(":").join("-");l.setAttribute("viewport-id-for-remove",w);const V=F(l),h=Y(o)||new Wn(o);let g=h.getViewport(d);if(!g){const b={viewportId:d,type:s?G.ORTHOGRAPHIC:G.STACK,element:l,defaultOptions:{...i,suppressEvents:!0}};h.enableElement(b),g=h.getViewport(d)}return new Promise(b=>{let S=!1,{viewReference:v}=i;const p=y=>{if(S)return;if(v){const A=v;v=null,g.setViewReference(A),g.render();return}e.getContext("2d").drawImage(V,0,0,V.width,V.height,0,0,e.width,e.height);const I=g.canvasToWorld([0,0]),C=g.canvasToWorld([V.width/u,0]),$=g.canvasToWorld([0,V.height/u]),_=D([0,0,0],g.canvasToWorld([1/u,0]),I),W=D([0,0,0],g.canvasToWorld([0,1/u]),I),q=1;S=!0,l.removeEventListener(R.IMAGE_RENDERED,p),setTimeout(()=>{h.disableElement(d),document.querySelectorAll(`[viewport-id-for-remove="${w}"]`).forEach(Le=>{Le.remove()})},0),b({origin:I,bottomLeft:$,topRight:C,thicknessMm:q,rightVector:_,downVector:W})};l.addEventListener(R.IMAGE_RENDERED,p),s?g.setVolumes([a],!1,!0):g.renderImageObject(t),g.resetCamera(),n==="PT"&&!ge(r)&&g.setProperties({voiRange:{lower:r.minPixelValue,upper:r.maxPixelValue}}),g.render()})}function Ce(e,t,n,o,i){if(t.volumeId)throw new Error("Unsupported volume rendering for CPU");const r=t,a=Ue(e,r,n),c={canvas:e,viewport:a,image:r,renderingTools:{}};c.transform=Ge(c);const d=!0;return new Promise((l,u)=>{Be(c,d),l(null)})}function Xn(e){const{canvas:t,imageId:n,viewReference:o,requestType:i=He.Thumbnail,priority:s=-5,renderingEngineId:r="_thumbnails",useCPURendering:a=!1,thumbnail:c=!1,imageAspect:d=!1,viewportOptions:l}=e,u=o?.volumeId,f=u&&!n,m=o&&l?{...l,viewReference:o}:l,w=a?Ce:Re;return new Promise((V,h)=>{function g(p,y){const{modality:x}=B(me.GENERAL_SERIES,y)||{},I=!f&&p,C=f&&p;I&&(I.isPreScaled=I.isPreScaled||I.preScale?.scaled),c&&(t.height=256,t.width=256),d&&I&&(t.width=I&&t.height*I.width/I.height),t.style.width=`${t.width/devicePixelRatio}px`,t.style.height=`${t.height/devicePixelRatio}px`,C&&a&&h(new Error("CPU rendering of volume not supported")),w(t,p,x,r,m).then(V)}function b(p,y){console.error(p,y),h(p)}function S(p,y,x){return je(p,x).then(I=>{g.call(this,I,p)},I=>{b.call(this,I,p)})}const v={useRGBA:!!a,requestType:i};if(u){const p=O.getVolume(u);p||h(new Error(`Volume id ${u} not found in cache`));const y=p.imageIds[0];g(p,y)}else ze.addRequest(S.bind(null,n,null,v),i,{imageId:n},s)})}function Yn(e){const t=z(),n=[];return t.forEach(o=>{o.getViewports().filter(he).forEach(s=>{s.hasImageURI(e)&&n.push(s)})}),n}function Qn(e,t){const n=eo(e,t);return n?n.index:null}function eo(e,t){const n=t.getImageIds(),o=t.getCurrentImageIdIndex();if(n.length===0)return null;const i=c=>{const d=to(c);if(!d)return null;const l=$e(d.planeNormal,d.imagePositionPatient);return qe(l,e)},s={distance:i(n[o])??1/0,index:o},r=n.slice(o+1);for(let c=0;c<r.length;c++){const d=r[c],l=i(d);if(l!==null)if(l<=s.distance)s.distance=l,s.index=c+o+1;else break}const a=n.slice(0,o);for(let c=a.length-1;c>=0;c--){const d=a[c],l=i(d);if(!(l===null||l===s.distance))if(l<s.distance)s.distance=l,s.index=c;else break}return s.distance===1/0?null:s}function to(e){const t=B(me.IMAGE_PLANE,e);if(!t||!(t.rowCosines instanceof Array&&t.rowCosines.length===3)||!(t.columnCosines instanceof Array&&t.columnCosines.length===3)||!(t.imagePositionPatient instanceof Array&&t.imagePositionPatient.length===3))return null;const{rowCosines:n,columnCosines:o,imagePositionPatient:i}=t,s=ie(E(),...n),r=ie(E(),...o),a=H(E(),s,r);return{rowCosines:n,columnCosines:o,imagePositionPatient:i,planeNormal:a}}function no(e){const{width:t,height:n}=e.getCanvas(),{sliceToIndexMatrix:o,indexToSliceMatrix:i}=e.getSliceViewInfo(),s=J(e,[0,0]),r=J(e,[t-1,0]),a=J(e,[0,n-1]),c=D(E(),r,s),d=D(E(),a,s),l=H(E(),c,d);L(c,c),L(d,d),L(l,l);const u=Math.max(Math.abs(c[0]),Math.abs(c[1]),Math.abs(c[2])),f=Math.max(Math.abs(d[0]),Math.abs(d[1]),Math.abs(d[2]));if(!re(1,u)||!re(1,f))throw new Error("getCurrentVolumeViewportSlice is not available for rotate/oblique viewports");const{voxelManager:m}=e.getImageData(),w=e.getSliceViewInfo(),V=m.getSliceData(w);return{width:w.width,height:w.height,scalarData:V,sliceToIndexMatrix:o,indexToSliceMatrix:i}}const oo=.05;function so(e,t){const n=e.getSliceIndex(),o=t.getSliceIndex(),i=B("imagePlaneModule",n.toString()),s=B("imagePlaneModule",o.toString());if(!i||!s){console.log("Viewport spatial registration requires image plane module");return}const{imageOrientationPatient:r}=s;if(!i.imageOrientationPatient.every((f,m)=>Math.abs(f-r[m])<oo)){console.log("Viewport spatial registration only supported for same orientation (hence translation only) for now",i?.imageOrientationPatient,s?.imageOrientationPatient);return}const c=i.imagePositionPatient,d=s.imagePositionPatient,l=Je(E(),c,d),u=Ke(Ze(),l);pe.add([e.id,t.id],u)}function io(e){const{imageData:t,dimensions:n}=e.getImageData()||{};if(!t||!n)return[];const{canvas:o}=e,i=window.devicePixelRatio,s=[0,0],r=[o.width/i,0],a=[o.width/i,o.height/i],c=[0,o.height/i],d=e.canvasToWorld(s),l=e.canvasToWorld(r),u=e.canvasToWorld(a),f=e.canvasToWorld(c),m=t.worldToIndex(d),w=t.worldToIndex(l),V=t.worldToIndex(u),h=t.worldToIndex(f);return ro({dimensions:n,imageData:t,topLeftImage:m,topRightImage:w,bottomRightImage:V,bottomLeftImage:h,topLeftWorld:d,topRightWorld:l,bottomRightWorld:u,bottomLeftWorld:f})}function ro({dimensions:e,imageData:t,topLeftImage:n,topRightImage:o,bottomRightImage:i,bottomLeftImage:s,topLeftWorld:r,topRightWorld:a,bottomRightWorld:c,bottomLeftWorld:d}){const l=k(n,e)?r:t.indexToWorld([0,0,0]),u=k(o,e)?a:t.indexToWorld([e[0]-1,0,0]),f=k(i,e)?c:t.indexToWorld([e[0]-1,e[1]-1,0]),m=k(s,e)?d:t.indexToWorld([0,e[1]-1,0]);return[l,u,m,f]}function k(e,t){return e[0]>0||e[0]<t[0]-1||e[1]>0||e[1]<t[1]-1||e[2]>0||e[2]<t[2]-1}function j(e){if(!e)return;const{viewportUid:t,renderingEngineUid:n}=e.dataset;return Pe(t,n)}function Pe(e,t){if(!t||!e)return;const n=Y(t);if(!n||n.hasBeenDestroyed)return;const o=n.getViewport(e);if(!o)return;const i=An(o)?o.getFrameOfReferenceUID():void 0;return{viewport:o,renderingEngine:n,viewportId:e,renderingEngineId:t,FrameOfReferenceUID:i}}function Bo(e){const t=z();for(let n=0;n<t.length;n++){const o=t[n];if(o.getViewport(e))return Pe(e,o.id)}}function Ho(){const e=[];return z().forEach(n=>{n.getViewports().forEach(({element:i})=>{e.push(j(i))})}),e}function ao(e){const t=j(e);if(!t)return;const{viewport:n}=t;if(!(n instanceof Q))throw new Error(`An image can only be fetched for a stack viewport and not for a viewport of type: ${n.type}`);return n.getCornerstoneImage()}async function co({viewport:e,options:t={}}){const n=e.getRenderingEngine();let o=t.volumeId||`${ee()}`;o.split(":").length===0&&(o=`${Xe()}:${o}`);const{id:i,element:s}=e,r=t.viewportId||i,a=e.getImageIds(),c=e.getViewPresentation(),d=e.getViewReference();n.enableElement({viewportId:r,type:G.ORTHOGRAPHIC,element:s,defaultOptions:{background:t.background,orientation:t.orientation}}),(await Ye(o,{imageIds:a})).load();const u=n.getViewport(r);await _n(n,[{volumeId:o}],[r]);const f=()=>{u.render(),s.removeEventListener(R.VOLUME_VIEWPORT_NEW_VOLUME,f)};return s.addEventListener(R.VOLUME_VIEWPORT_NEW_VOLUME,f),u.setViewPresentation(c),u.setViewReference(d),u.render(),u}async function lo({viewport:e,options:t}){const n=e,{id:o,element:i}=n,s=e.getRenderingEngine(),{background:r}=t,a=t.viewportId||o,c=O.getVolume(n.getVolumeId());if(!(c instanceof Qe))throw new Error("Currently, you cannot decache a volume that is not an ImageVolume. So, unfortunately, volumes such as nifti (which are basic Volume, without imageIds) cannot be decached.");const d={viewportId:a,type:G.STACK,element:i,defaultOptions:{background:r}},l=n.getViewReference();s.enableElement(d);const u=s.getViewport(a);return await u.setStack(c.imageIds),u.setViewReference(l),u.render(),u}function Te(e,t=2){if(Array.isArray(e))return e.map(i=>Te(i,t)).join(", ");if(e==null||e==="")return"NaN";e=Number(e);const n=Math.abs(e);if(n<1e-4)return`${e}`;const o=n>=100?t-2:n>=10?t-1:n>=1?t:n>=.1?t+1:n>=.01?t+2:n>=.001?t+3:t+4;return e.toFixed(o)}function uo(e){return Math.round(e/P)*P}function fo(e,t,n){const o=e.length===t*n*4,i=e.length===t*n*3;if(o||i){const s=new Float32Array(t*n);let r=0,a=0;const c=o?4:3;for(let d=0;d<t;d++)for(let l=0;l<n;l++){const u=e[r],f=e[r+1],m=e[r+2];s[a]=(u+f+m)/3,r+=c,a++}return s}else return e}function go(e){if(e instanceof we)return O.getVolume(e.getVolumeId()).imageIds;if(e.getImageIds)return e.getImageIds()}function mo(e,t){const n=[...e];return t>=n.length?(ce(n),n):(ce(n),n.slice(0,t))}function ce(e){for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}}function K(e){const t=e.toString(16);return t.length==1?"0"+t:t}function ho(e,t,n){return"#"+K(e)+K(t)+K(n)}function po(e){const t=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return t?{r:parseInt(t[1],16),g:parseInt(t[2],16),b:parseInt(t[3],16)}:null}const wo=Object.freeze(Object.defineProperty({__proto__:null,hexToRgb:po,rgbToHex:ho},Symbol.toStringTag,{value:"Module"}));function Io(e,t){if(e===t)return!0;if(e==null||t==null)return!1;try{return JSON.stringify(e)===JSON.stringify(t)}catch(n){return console.debug("Error in JSON.stringify during deep comparison:",n),e===t}}function xe(e,t){const n=e,o=n.getActors?.()??[];return(t?o.find(s=>s.referencedId===t)??o.find(s=>s.referencedId?.endsWith(`:${t}`)):void 0)?.referencedId??(t?te(t):void 0)??n.getDefaultActor?.()?.referencedId}function Me(e,t,n){if(!n)throw new Error("getVolume is required, use the utilities export instead");if(Ie(e)){const o=xe(e,t),i=o?n(o):void 0,s=e.getImageData?.();return{modality:i?.metadata?.Modality??s?.metadata?.Modality,isPreScaled:le(i?.scaling)}}if(typeof e.setVolumes=="function"){const i=t?te(t):e.getVolumeId(),s=i?n(i):void 0;return{modality:s?.metadata?.Modality,isPreScaled:le(s?.scaling)}}if(typeof e.setStack=="function"){const o=e,{preScale:i}=o.getImageData()||{};return{modality:o.modality,isPreScaled:!!i?.scaled}}}function le(e){return!!e&&Object.keys(e).length>0}function Vo(e,t,n){const o=Me(e,t,n);if(!o)throw new Error("Invalid viewport type");return o.modality}function So(e){const{imageIdGroups:t,splittingTag:n}=Ve(e);return{isDynamicVolume:t.length>1,timePoints:t,splittingTag:n}}function bo(e,t){const n=e.length,{rescaleSlope:o,rescaleIntercept:i,suvbw:s}=t;if(t.modality==="PT"&&typeof s=="number")for(let r=0;r<n;r++)e[r]=s*(e[r]*o+i);else for(let r=0;r<n;r++)e[r]=e[r]*o+i;return e}function De(e,t,n){return Math.min(Math.max(t,e),n)}function Oe(e,t){if(!j(e.element))throw new Error("Scroll::Viewport is not enabled (it might be disabled)");if(e instanceof Q&&e.getImageIds().length===0)throw new Error("Scroll::Stack Viewport has no images");const{volumeId:o,delta:i,scrollSlabs:s}=t;if(e instanceof we)vo(e,o,i,s);else{if(typeof e.getCurrentImageIdIndex!="function"||typeof e.scroll!="function")return;const r=e.getCurrentImageIdIndex();if(r+i>e.getImageIds().length-1||r+i<0){const a={imageIdIndex:r,direction:i};T(M,R.STACK_SCROLL_OUT_OF_BOUNDS,a)}e.scroll(i,t.debounceLoading,t.loop)}}function vo(e,t,n,o=!1){const i=o,{numScrollSteps:s,currentStepIndex:r,sliceRangeInfo:a}=Se(e,t,i);if(s===0||!a)return;const{sliceRange:c,spacingInNormalDirection:d,camera:l}=a,{focalPoint:u,viewPlaneNormal:f,position:m}=l,{newFocalPoint:w,newPosition:V}=be(u,m,c,f,d,n);e.setCamera({focalPoint:w,position:V}),e.render();const h=r+n,g={volumeId:t,viewport:e,delta:n,desiredStepIndex:h,currentStepIndex:r,numScrollSteps:s,currentImageId:e.getCurrentImageId()};(h>s||h<0)&&e.getCurrentImageId()?T(M,R.VOLUME_VIEWPORT_SCROLL_OUT_OF_BOUNDS,g):T(M,R.VOLUME_VIEWPORT_SCROLL,g)}async function Eo(e,t={}){const{imageIndex:n,debounceLoading:o,volumeId:i}=t,s=j(e);if(!s)throw new Error("Element has been disabled");const{viewport:r}=s,{imageIndex:a,numberOfSlices:c}=yo(r,o),l=Ro(c,n)-a;Oe(r,{delta:l,debounceLoading:o,volumeId:i})}function yo(e,t){return e instanceof Q?{numberOfSlices:e.getImageIds().length,imageIndex:t?e.getTargetImageIdIndex():e.getCurrentImageIdIndex()}:{numberOfSlices:e.getNumberOfSlices(),imageIndex:e.getSliceIndex()}}function Ro(e,t){const n=e-1;return De(t,0,n)}function Co(e,t,n={}){const o=O.getVolume(e);if(!o)throw new Error(`Referenced volume with id ${e} does not exist.`);const{metadata:i,spacing:s,direction:r,dimensions:a}=o,{minX:c,maxX:d,minY:l,maxY:u,minZ:f,maxZ:m}=t,w=[Math.min(c,d),Math.min(l,u),Math.min(f,m)],V=Z(o.imageData,w),h=[Math.abs(d-c)+1,Math.abs(u-l)+1,Math.abs(m-f)+1],{targetBuffer:g}=n,b={metadata:i,dimensions:h,spacing:s,origin:V,direction:r,targetBuffer:g,scalarData:g?.type==="Float32Array"?new Float32Array(h[0]*h[1]*h[2]):void 0},S=et(ee(),b),v=S.voxelManager.getCompleteScalarDataArray(),p=h[0]*h[1],y=a[0]*a[1],x=o.voxelManager.getCompleteScalarDataArray();for(let I=0;I<h[2];I++)for(let C=0;C<h[1];C++){const $=Z(S.imageData,[0,C,I]),_=ve(o.imageData,$),W=_[2]*y+_[1]*a[0]+_[0],q=x.slice(W,W+h[0]),A=I*p+C*h[0];v.set(q,A)}return S.voxelManager.setCompleteScalarDataArray(v),S}function Po(e,t){const{viewUp:n,viewPlaneNormal:o}=t,i=N(e,[0,0,0]),s=ae(E(),n),r=ae(E(),o),a=H(E(),s,r),c=D(E(),N(e,s),i),d=D(E(),N(e,r),i);L(c,c),L(d,d);const l=H(E(),c,d);return{worldVecRowDir:a,worldVecColDir:s,worldVecSliceDir:r,ijkVecRowDir:l,ijkVecColDir:c,ijkVecSliceDir:d}}function To(e,t,n,o){const[i,s,r]=t,a=i*s;let c=0,d=0,l=0;const[u,f,m]=n.map(Math.round);for(let g=m-o;g<=m+o;g++)if(!(g<0||g>=r)){for(let b=f-o;b<=f+o;b++)if(!(b<0||b>=s))for(let S=u-o;S<=u+o;S++){if(S<0||S>=i)continue;const v=g*a+b*i+S,p=e[v];c+=p,d+=p*p,l++}}if(l===0){const g=m*a+f*i+u;return g>=0&&g<e.length?{mean:e[g],stdDev:0,count:1}:{mean:0,stdDev:0,count:0}}const w=c/l,V=d/l-w*w,h=Math.sqrt(Math.max(0,V));return{mean:w,stdDev:h,count:l}}const de=1e-6;function xo(e,t){const{lower:n,upper:o}=t.voiRange,i=o-n,s=t.VOILUTFunction,r=a=>t.invert===!0?1-a:a;if(s===Ee.SAMPLED_SIGMOID||s==="SIGMOID"){const{windowCenter:a,windowWidth:c}=ye(n,o),d=Math.max(Math.abs(c),1e-12);return r(1/(1+Math.exp(-4*(e-a)/d)))}return i===0||!Number.isFinite(i)?r(0):r(U((e-n)/i))}function X(e,t){const{lower:n,upper:o}=t.voiRange,i=t.VOILUTFunction,s=t.invert===!0?U(1-U(e)):U(e);if(i===Ee.SAMPLED_SIGMOID||i==="SIGMOID"){const{windowCenter:a,windowWidth:c}=ye(n,o),d=_e(s,de,1-de);return tt(d,a,c)}const r=o-n;return r===0||!Number.isFinite(r)?n:n+s*r}function Mo(e,t,n){const o=Math.min(e,t),i=Math.max(e,t),s=X(o,n),r=X(i,n);return{rawMin:Math.min(s,r),rawMax:Math.max(s,r)}}function U(e){return Number.isFinite(e)?_e(e,0,1):0}function _e(e,t,n){return Math.min(n,Math.max(t,e))}const{getPixelSpacingInformation:Do,calculateRadiographicPixelSpacing:Oo,getERMF:_o}=nt,Lo=(e,t)=>Vo(e,t,O.getVolume),Wo=(e,t)=>Me(e,t,O.getVolume),zo=Object.freeze(Object.defineProperty({__proto__:null,ECGUtilities:ft,FrameRange:gt,HistoryMemo:mt,PointsManager:at,ProgressiveIterator:it,RLEVoxelMap:st,VideoUtilities:ht,VoxelManager:ot,WSIUtilities:pt,actorIsA:wt,applyPreset:It,asArray:Vt,autoLoad:St,buildMetadata:bt,calculateNeighborhoodStats:To,calculateRadiographicPixelSpacing:Oo,calculateSpacingBetweenImageIds:vt,calculateViewportsSpatialRegistration:so,calibratedPixelSpacingMetadataProvider:$n,clamp:ut,clip:De,clonePoint3:Et,color:wo,colormap:yt,convertColorArrayToRgbString:Rt,convertStackToVolumeViewport:co,convertToGrayscale:fo,convertVolumeToStackViewport:lo,createLinearRGBTransferFunction:Ct,createSigmoidRGBTransferFunction:Pt,createSubVolume:Co,decimate:Tt,deepClone:xt,deepEqual:Io,deepMerge:Mt,eventListener:Fn,fnv1aHash:Dt,generateFrameImageId:Ot,generateVolumePropsFromImageIds:_t,genericMetadataProvider:Lt,genericViewportDisplaySetMetadataProvider:Wt,getAcquisitionPlaneOrientation:At,getBufferConfiguration:kt,getClosestImageId:Ft,getClosestStackImageIndexForPoint:Qn,getCubeSizeInView:Nt,getCurrentVolumeViewportSlice:no,getDynamicVolumeInfo:So,getERMF:_o,getImageDataMetadata:Ut,getImageLegacy:ao,getImageSliceDataForVolumeViewport:Gt,getMinMax:Bt,getNormalizedAspectRatio:dt,getPixelSpacingInformation:Do,getRandomSampleFromArray:mo,getRuntimeId:zn,getScalingDescriptor:Wo,getScalingParameters:Ht,getSliceRange:zt,getSpacingInNormalDirection:jt,getTargetVolumeAndSpacingInNormalDir:$t,getVOIRangeFromWindowLevel:qt,getViewportContentMode:Jt,getViewportImageCornersInWorld:io,getViewportImageIds:go,getViewportModality:Lo,getViewportsWithImageURI:Yn,getViewportsWithVolumeId:Kt,getVoiFromSigmoidRGBTransferFunction:Zt,getVolumeActorCorners:Xt,getVolumeDirectionVectors:Po,getVolumeId:te,getVolumeSliceRangeInfo:Yt,getVolumeViewReferenceId:Qt,getVolumeViewportScrollInfo:Se,getVolumeViewportsContainingSameVolumes:Zn,handleMultiframe4D:en,hasFloatScalingParameters:tn,hasNaNValues:nn,hasOwn:on,imageIdToURI:sn,imageRetrieveMetadataProvider:ct,imageToWorldCoords:rn,indexAlmostWithinDimensions:Kn,indexWithinDimensions:Jn,invertRgbTransferFunction:an,isEqual:lt,isEqualAbs:cn,isEqualNegative:ln,isGenericViewport:Ie,isImageActor:dn,isNumber:un,isOpposite:qn,isPTPrescaledWithSUV:ge,isValidVolume:fn,isVideoTransferSyntax:gn,jumpToSlice:Eo,loadImageToCanvas:Xn,logger:rt,makeVolumeMetadata:mn,mapMappedBandToRawRange:Mo,mapScalarToViewportVoiIntensity:xo,mapViewportVoiIntensityToScalar:X,planar:hn,pointInShapeCallback:pn,renderToCanvasCPU:Ce,renderToCanvasGPU:Re,resolveGenericViewportVolumeId:xe,rotateToViewCoordinates:wn,roundNumber:Te,roundToPrecision:uo,scaleArray:bo,scaleRgbTransferFunction:Nn,scroll:Oe,snapFocalPointToSlice:be,sortImageIdsAndGetSpacing:In,spatialRegistrationMetadataProvider:pe,splitImageIdsBy4DTags:Ve,transferFunctionUtils:Vn,transformIndexToWorld:Z,transformWorldToIndex:ve,transformWorldToIndexContinuous:N,triggerEvent:T,updatePlaneRestriction:Sn,updateVTKImageDataWithCornerstoneImage:bn,uuidv4:ee,viewportIsInStackMode:vn,viewportIsInVolumeMode:En,viewportSupportsDisplaySetPresentation:yn,viewportSupportsImageSlices:he,viewportSupportsStackCalibration:Rn,viewportSupportsStackCompatibility:Cn,viewportSupportsVolumeActors:fe,viewportSupportsVolumeCompatibility:Pn,viewportSupportsVolumeId:Tn,viewportSupportsVolumeURI:xn,windowLevel:Mn,worldToImageCoords:Dn},Symbol.toStringTag,{value:"Module"}));export{Oe as A,no as B,De as C,qn as D,io as E,fo as F,On as G,kn as M,Wn as T,Ln as a,Pe as b,Bo as c,Ho as d,An as e,Go as f,j as g,Uo as h,zn as i,Io as j,mo as k,Wo as l,Yn as m,Kn as n,Qn as o,so as p,Eo as q,Te as r,_n as s,Jn as t,zo as u,No as v,uo as w,Po as x,Co as y,To as z};
@@ -1 +1 @@
1
- import{v as H,B as U,t as E,E as M,g as L,a as W,b as S,u as G,s as $,V as q,c as Z,e as y,i as F,d as k,f as v,R as O,h as J,j as K,k as Y,l as Q,m as X,n as ee,o as te,p as ne,r as se,q as oe,w as ie,x as ae,y as re,z as de,A as ce,C as le,D as ge,F as me,G as he,I as ue,H as pe,J as N,S as xe,K as j,L as we,M as fe,N as Ie,O as Ve,P as Ce,Q as Pe,W as De,T as Re,U as Se,X as ve,Y as Ee,Z as Me,_ as _e,$ as Ge,a0 as ye,a1 as be,a2 as ze,a3 as Te,a4 as We,a5 as Fe,a6 as ke,a7 as Oe,a8 as Ae,a9 as Le,aa as Ne,ab as je}from"./Settings-CKWXQZHN.js";import{ac as xt,ad as wt,ae as ft,af as It,ag as Vt,ah as Ct,ai as Pt,aj as Dt,ak as Rt,al as St,am as vt,an as Et,ao as Mt,ap as _t,aq as Gt,ar as yt,as as bt,at as zt,au as Tt,av as Wt,aw as Ft,ax as kt,ay as Ot,az as At,aA as Lt,aB as Nt,aC as jt,aD as Bt,aE as Ht,aF as Ut,aG as $t,aH as qt,aI as Zt,aJ as Jt,aK as Kt,aL as Yt,aM as Qt,aN as Xt,aO as en,aP as tn,aQ as nn,aR as sn,aS as on,aT as an,aU as rn,aV as dn,aW as cn,aX as ln,aY as gn,aZ as mn,aO as hn,a_ as un,a$ as pn,b0 as xn,b1 as wn,b2 as fn,b3 as In,b4 as Vn,b5 as Cn,b6 as Pn}from"./Settings-CKWXQZHN.js";import{a as Be,T as He}from"./index-DdXuWqY6.js";import{g as Rn,b as Sn,c as vn,d as En,s as Mn,u as _n,v as Gn,e as yn,f as bn,h as zn}from"./index-DdXuWqY6.js";import"./cornerstoneEngine-hAkB6jjG.js";import"./Texture-CIGczsau.js";import{a as Wn}from"./addVolumesToViewports-BsIV1_Qz.js";import"./dcmjs.es-DfWkgqfk.js";import"./index-QlzdWpod.js";import"./_commonjsHelpers-CE1G-McA.js";function rt(l,e,t){for(const n of t){const o=l.getViewport(n);if(!o)throw new Error(`Viewport with Id ${n} does not exist`);if(!o.addImages){console.warn(`Viewport with Id ${n} does not have addImages. Cannot add image segmentation to this viewport.`);return}}t.forEach(n=>{l.getViewport(n).addImages(e)})}class Ue{constructor(e,t=""){this.contexts=[],this.offScreenCanvasContainers=[],this.viewportToContext=new Map,this.viewportSizes=new Map,this.contextMaxSizes=new Map;for(let n=0;n<e;n++){const o=H.newInstance(),s=document.createElement("div");o.setContainer(s),Be(o,t,n),this.contexts.push(o),this.offScreenCanvasContainers.push(s)}}getContextByIndex(e){return e>=0&&e<this.contexts.length?{context:this.contexts[e],container:this.offScreenCanvasContainers[e]}:null}assignViewportToContext(e,t){this.viewportToContext.set(e,t)}getContextIndexForViewport(e){return this.viewportToContext.get(e)}getAllContexts(){return this.contexts}getContextCount(){return this.contexts.length}updateViewportSize(e,t,n){const o=this.viewportToContext.get(e);if(o===void 0)return!1;this.viewportSizes.set(e,{width:t,height:n});const s=this.contextMaxSizes.get(o),i=this.calculateMaxSizeForContext(o);return this.contextMaxSizes.set(o,i),!s||s.width!==i.width||s.height!==i.height}getMaxSizeForContext(e){return this.contextMaxSizes.get(e)}calculateMaxSizeForContext(e){let t=0,n=0;return this.viewportToContext.forEach((o,s)=>{if(o===e){const i=this.viewportSizes.get(s);i&&(t=Math.max(t,i.width),n=Math.max(n,i.height))}}),{width:t,height:n}}removeViewport(e){const t=this.viewportToContext.get(e);if(this.viewportToContext.delete(e),this.viewportSizes.delete(e),t!==void 0){const n=this.calculateMaxSizeForContext(t);this.contextMaxSizes.set(t,n)}}destroy(){this.contexts.forEach(e=>{e.delete()}),this.contexts=[],this.offScreenCanvasContainers=[],this.viewportToContext.clear(),this.viewportSizes.clear(),this.contextMaxSizes.clear()}}class A extends U{constructor(e){super(e),this._renderFlaggedViewports=()=>{this._throwIfDestroyed();const n=this._getViewportsAsArray().filter(s=>this._needsRender.has(s.id));if(n.length===0){this._animationFrameSet=!1,this._animationFrameHandle=null;return}const o=n.map(s=>{const i=this.renderViewportUsingCustomOrVtkPipeline(s);return s.setRendered(),this._needsRender.delete(s.id),i});this._animationFrameSet=!1,this._animationFrameHandle=null,o.forEach(s=>{s?.element&&E(s.element,M.IMAGE_RENDERED,s)})},this.useCPURendering||this.ensureContextPool()}ensureContextPool(){if(!this.contextPool){const{rendering:e}=L(),{webGlContextCount:t}=e;this.contextPool=new Ue(t,this.id)}return this.contextPool}enableVTKjsDrivenViewport(e){const o=this._getViewportsAsArray().filter(a=>W(a.type)===!1).map(a=>a.canvas),s=S(e.element);G(s),o.push(s);const i={...e,canvas:s};this.addVtkjsDrivenViewport(i)}addVtkjsDrivenViewport(e){const t=this.ensureContextPool(),{element:n,canvas:o,viewportId:s,type:i,defaultOptions:a}=e;n.tabIndex=-1,$(n);let r=0;if(i===q.STACK){const u=t.getAllContexts();r=this._viewports.size%u.length}t.assignViewportToContext(s,r),t.updateViewportSize(s,o.width,o.height);const d=t.getContextByIndex(r),{context:g,container:m}=d,p=t.getMaxSizeForContext(r);m.width=p.width,m.height=p.height,g.resize(),g.addRenderer({viewport:[0,0,1,1],id:s,background:a.background?a.background:[0,0,0]});const x={id:s,element:n,renderingEngineId:this.id,type:i,canvas:o,sx:0,sy:0,sWidth:o.width,sHeight:o.height,defaultOptions:a||{}},f=Z(e);if(!f)throw new Error(`Viewport Type ${i} is not supported`);const h=new f(x);h.requestedType=e.requestedType??i,this._viewports.set(s,h);const c={element:n,viewportId:s,renderingEngineId:this.id};h.suppressEvents||E(y,M.ELEMENT_ENABLED,c)}setVtkjsDrivenViewports(e){if(e.length){const t=e.map(n=>S(n.element));t.forEach(n=>G(n));for(let n=0;n<e.length;n++){const o=e[n],s=t[n],i={...o,canvas:s};this.addVtkjsDrivenViewport(i)}}}_getDisplayedSize(e){const t=window.devicePixelRatio||1,n=F(e)?e.element:S(e.element);return{displayedWidth:Math.round(n.clientWidth*t),displayedHeight:Math.round(n.clientHeight*t)}}_resizeVTKViewports(e,t=!0,n=!0){const o=[];for(const s of e){const i=S(s.element),{displayedWidth:a,displayedHeight:r}=this._getDisplayedSize(s);if(a===0||r===0)continue;const d=i.width,g=i.height;a===d&&r===g||o.push(s)}if(o.length!==0){for(const s of o){const{displayedWidth:i,displayedHeight:a}=this._getDisplayedSize(s),r=Math.max(v,i),d=Math.max(v,a);s.sWidth=r,s.sHeight=d}this._animationFrameSet||(e.length&&this._resize(e),e.forEach(s=>{if(s.resize?.(),F(s))return;const i=s.getCamera(),a=s.getRotation?.()??0,{flipHorizontal:r}=i,d=s;d.resetViewStateForResize?d.resetViewStateForResize():d.resetCameraForResize?.();const g=s.getDisplayArea();t&&(g?(r&&s.setCamera({flipHorizontal:r}),a&&s.setViewPresentation({rotation:a})):s.setCamera(i))}),n&&this.render())}}renderViewportUsingCustomOrVtkPipeline(e){if(k(e))return e.customRenderViewportToCanvas();if(!this.contextPool)throw new Error("GPU not available, and using a viewport with no custom render pipeline.");const t=this.contextPool.getContextIndexForViewport(e.id),n=this.contextPool.getContextByIndex(t),{context:o,container:s}=n;return this._renderViewportWithContext(e,o,s)}_renderViewportWithContext(e,t,n){if(e.canvas.clientWidth===0||e.canvas.clientHeight===0)return;if(e.sWidth<v||e.sHeight<v){console.warn("Viewport is too small",e.sWidth,e.sHeight);return}if(k(e))return e.customRenderViewportToCanvas();if(!this.contextPool)throw new Error("GPU not available, and using a viewport with no custom render pipeline.");t.getRenderer(e.id)||t.addRenderer({viewport:[0,0,1,1],id:e.id,background:e.defaultOptions?.background||[0,0,0]});const o=t.getRenderWindow(),s=o.getViews()[0],i=s.getRenderPasses(),a=this.getViewportRenderPasses(e.id);a&&s.setRenderPasses(a),this._resizeOffScreenCanvasForViewport(e,n,t);const r=t.getRenderer(e.id),d=this.contextPool.getContextIndexForViewport(e.id),g=this.contextPool.getMaxSizeForContext(d),m=e.sWidth,p=e.sHeight,x=Math.min(1,m/g.width),f=Math.min(1,p/g.height);r.setViewport(0,0,x,f);const h=t.getRenderers();h.forEach(({renderer:w,id:V})=>{const _=V.split("::")[0];w.setDraw(_===e.id)});const c=this.getWidgetRenderers();c.forEach((w,V)=>{V.setDraw(w===e.id)}),o.render(),h.forEach(({renderer:w})=>w.setDraw(!1)),c.forEach((w,V)=>{V.setDraw(!1)}),i&&s.setRenderPasses(i);const I=t.getOpenGLRenderWindow().get3DContext().canvas;return this._copyToOnscreenCanvas(e,I)}_renderViewportFromVtkCanvasToOnscreenCanvas(e,t){return this._copyToOnscreenCanvas(e,t)}_resizeOffScreenCanvasForViewport(e,t,n){const o=this.contextPool.getContextIndexForViewport(e.id);if(o===void 0||!this.contextPool.updateViewportSize(e.id,e.sWidth,e.sHeight))return;const i=this.contextPool.getMaxSizeForContext(o);t.width===i.width&&t.height===i.height||(t.width=i.width,t.height=i.height,n.resize())}_copyToOnscreenCanvas(e,t){const{element:n,canvas:o,id:s,renderingEngineId:i,suppressEvents:a}=e,r=e.sWidth,d=e.sHeight;G(o,{width:r,height:d});const g=o.getContext("2d"),m=this.contextPool.getContextIndexForViewport(s),x=this.contextPool.getMaxSizeForContext(m).height-d;return g.drawImage(t,0,x,r,d,0,0,r,d),{element:n,suppressEvents:a,viewportId:s,renderingEngineId:i,viewportStatus:e.viewportStatus}}_resize(e){const t=new Set;for(const n of e){n.sx=0,n.sy=0;const o=this.contextPool.getContextIndexForViewport(n.id);this.contextPool.updateViewportSize(n.id,n.sWidth,n.sHeight)&&t.add(o);const i=this.contextPool.getContextByIndex(o),{context:a}=i,r=a.getRenderer(n.id),d=this.contextPool.getMaxSizeForContext(o),g=Math.min(1,n.sWidth/d.width),m=Math.min(1,n.sHeight/d.height);r.setViewport(0,0,g,m)}t.forEach(n=>{const o=this.contextPool.getContextByIndex(n);if(o){const{context:s,container:i}=o,a=this.contextPool.getMaxSizeForContext(n);i.width=a.width,i.height=a.height,s.resize()}})}getWidgetRenderers(){const e=this._getViewportsAsArray(),t=new Map;return e.forEach(n=>{(n.getWidgets?n.getWidgets():[]).forEach(s=>{const i=s.getRenderer?s.getRenderer():null;i&&t.set(i,n.id)})}),t}getViewportRenderPasses(e){const t=this.getViewport(e);return t?.getRenderPasses?t.getRenderPasses():null}getRenderer(e){const t=this.contextPool?.getContextIndexForViewport(e);if(t===void 0||!this.contextPool)return;const n=this.contextPool.getContextByIndex(t);if(!n)return;const{context:o}=n;return o.getRenderer(e)}disableElement(e){const t=this.getViewport(e);if(t&&(super.disableElement(e),!W(t.type)&&this.contextPool)){const n=this.contextPool.getContextIndexForViewport(e);if(n!==void 0){const o=this.contextPool.getContextByIndex(n);if(o){const{context:s}=o;s.removeRenderer(e)}}this.contextPool.removeViewport(e)}}destroy(){super.destroy(),this.contextPool&&this.contextPool.destroy()}getOffscreenMultiRenderWindow(e){if(!this.contextPool)throw new Error("Offscreen multi render window is not available.");const t=this.contextPool.getContextIndexForViewport(e);if(t===void 0)throw new Error(`Offscreen multi render window is not available for viewport ${e}.`);const n=this.contextPool.getContextByIndex(t);if(!n)throw new Error(`Offscreen multi render window is not available for viewport ${e}.`);return n.context}}class dt{constructor(e){const n=L()?.rendering?.renderingEngineMode;switch(n){case O.Tiled:this._implementation=new He(e);break;case O.ContextPool:this._implementation=new A(e);break;default:console.warn(`RenderingEngine: Unknown rendering engine mode "${n}". Defaulting to Next rendering engine.`),this._implementation=new A(e);break}}get id(){return this._implementation.id}disableViewport(e){return this._implementation.disableElement(e)}enableElement(e){return this._implementation.enableElement(e)}disableElement(e){return this._implementation.disableElement(e)}setViewports(e){return this._implementation.setViewports(e)}resize(e=!0,t=!0){return this._implementation.resize(e,t)}getViewport(e){return this._implementation.getViewport(e)}getViewports(){return this._implementation.getViewports()}getRenderer(e){return this._implementation.getRenderer(e)}fillCanvasWithBackgroundColor(e,t){return this._implementation.fillCanvasWithBackgroundColor(e,t)}render(){return this._implementation.render()}renderViewports(e){return this._implementation.renderViewports(e)}renderViewport(e){return this._implementation.renderViewport(e)}destroy(){return this._implementation.destroy()}getOffscreenMultiRenderWindow(e){return this._implementation.getOffscreenMultiRenderWindow(e)}}const $e={adapter:K,getSnapshot:J},qe={adapter:Q,getSnapshot:Y},Ze={adapter:de,getSnapshot:re,getZoom:ae,getScale:ie,getPan:oe,resolveICamera:se,derivePresentation:ne,applyToRenderer:te,createImageSliceBasis:ee,createVolumeSliceBasis:X},Je={adapter:le,getSnapshot:ce},Ke={adapter:me,getSnapshot:ge},ct="5.8.2";class Ye extends he{constructor(e,t){super(e,t),this._dimensionGroupNumber=1,this._loadedDimensionGroups=new Set,this._getImageIdRequests=(s,i)=>this.getImageIdsRequests(s,i),this.getImageLoadRequests=s=>{const i=this.getImageIdsToLoad();return this._getImageIdRequests(i,s)};const{imageIdGroups:n,splittingTag:o}=e;this._splittingTag=o,this._imageIdGroups=n,this.numDimensionGroups=this._imageIdGroups.length}_getImageIdsToLoad(){const e=this._imageIdGroups,t=this._dimensionGroupNumber-1,n=[...e[t]];let o=t-1,s=t+1;for(;o>=0||s<e.length;)o>=0&&n.push(...e[o--]),s<e.length&&n.push(...e[s++]);return n}getImageIdsToLoad(){return this._getImageIdsToLoad()}get dimensionGroupNumber(){return this._dimensionGroupNumber}set dimensionGroupNumber(e){this._dimensionGroupNumber!==e&&(this._dimensionGroupNumber=e,this.voxelManager.setDimensionGroupNumber(e),this.invalidateVolume(!0),E(y,M.DYNAMIC_VOLUME_DIMENSION_GROUP_CHANGED,{volumeId:this.volumeId,dimensionGroupNumber:e,numDimensionGroups:this.numDimensionGroups,imageIdGroupIndex:e-1,numImageIdGroups:this.numDimensionGroups,splittingTag:this.splittingTag}))}scroll(e){const t=this._dimensionGroupNumber+e;t<1?this.dimensionGroupNumber=this.numDimensionGroups:t>this.numDimensionGroups?this.dimensionGroupNumber=1:this.dimensionGroupNumber=t}getCurrentDimensionGroupImageIds(){return this._imageIdGroups[this._dimensionGroupNumber-1]}flatImageIdIndexToDimensionGroupNumber(e){return Math.floor(e/this._imageIdGroups[0].length)+1}flatImageIdIndexToImageIdIndex(e){return e%this._imageIdGroups[0].length}get splittingTag(){return this._splittingTag}isDimensionGroupLoaded(e){return this._loadedDimensionGroups.has(e)}markDimensionGroupAsLoaded(e){this._loadedDimensionGroups.add(e),E(y,M.DYNAMIC_VOLUME_DIMENSION_GROUP_LOADED,{volumeId:this.volumeId,dimensionGroupNumber:e})}checkDimensionGroupCompletion(e){const t=this.flatImageIdIndexToDimensionGroupNumber(e);this._imageIdGroups[t-1].every(s=>{const i=this.getImageIdIndex(s);return this.cachedFrames[i]===ue.FULL_RESOLUTION})&&!this.isDimensionGroupLoaded(t)&&this.markDimensionGroupAsLoaded(t)}}function Qe(l,e,t){return e.reduce((n,o)=>o.apply(n,t),l)}const Xe={name:"InPlaneDecimationModifier",apply(l,e){const[t=1,n=t]=e.options.ijkDecimation??[],o=Math.max(1,Math.floor(t)),s=Math.max(1,Math.floor(n));if(o===1&&s===1)return l;const[i,a]=l.dimensions,r=Math.max(1,Math.floor(i/o)),d=Math.max(1,Math.floor(a/s)),g=[r,d,l.dimensions[2]],m=[l.spacing[0]*o,l.spacing[1]*s,l.spacing[2]],p={...l.metadata,Columns:r,Rows:d,PixelSpacing:[m[1],m[0]]};return{...l,dimensions:g,spacing:m,metadata:p}}};function lt(l,e){if(!e||!e.imageIds||!e.imageIds.length)throw new Error("ImageIds must be provided to create a streaming image volume ");const[t=1,n=t,o=1]=e.ijkDecimation??[],s=Math.max(1,Math.floor(t)),i=n>1?Math.max(1,Math.floor(n)):s,a=Math.max(1,Math.floor(o)),r=s>1||i>1,d={ijkDecimation:[s,i,a]},g=[Xe];function m(c,u){return u===1?c:`${c}#decimation=${u}`}const p=Math.floor(e.imageIds.length/a),x=a>1&&e.imageIds.length<=p+1;if(a>1&&!x){const c=pe(e.imageIds,a),u=Array.isArray(c)&&c.length&&typeof c[0]=="number"?c.map(P=>e.imageIds[P]):c;e.imageIds=u}s>1&&(e.imageIds=e.imageIds.map(c=>m(c,s)));async function f(){const c=N(e.imageIds,l),u={volumeId:l,imageIds:e.imageIds,options:d},P=Qe(c,g,u),{dimensions:I,spacing:R,origin:w,direction:V,metadata:_,imageIds:b,dataType:B,numberOfComponents:z}=P,C=new xe({volumeId:l,metadata:_,dimensions:I,spacing:R,origin:w,direction:V,imageIds:b,dataType:B,numberOfComponents:z},{imageIds:b,loadStatus:{loaded:!1,loading:!1,cancelled:!1,cachedFrames:[],callbacks:[]}});if(r){const D=C.imageData;D&&(D.setDimensions(C.dimensions),D.setSpacing(C.spacing),D.modified());const T=j.createImageVolumeVoxelManager({dimensions:C.dimensions,imageIds:C.imageIds,numberOfComponents:z});C.voxelManager=T,D&&D.set({voxelManager:T})}return C}const h=f();return{promise:h,decache:()=>{h.then(c=>{c.destroy(),c=null})},cancel:()=>{h.then(c=>{c.cancelLoading()})}}}function gt(l,e){if(!e||!e.imageIds||!e.imageIds.length)throw new Error("ImageIds must be provided to create a 4D streaming image volume");const{imageIds:t}=e,{splittingTag:n,imageIdGroups:o}=we(t),s=Math.floor(o.length/2),i=N(o[s],l),{metadata:a,dimensions:r,spacing:d,direction:g,sizeInBytes:m,origin:p,numberOfComponents:x,dataType:f}=i,h=g.slice(6,9),c=o.map(R=>fe(R,h).sortedImageIds),u=c.flat(),P=j.createScalarDynamicVolumeVoxelManager({dimensions:r,imageIdGroups:c,dimensionGroupNumber:1,numberOfComponents:x});let I=new Ye({volumeId:l,metadata:a,dimensions:r,spacing:d,origin:p,direction:g,sizeInBytes:m,imageIds:u,imageIdGroups:c,splittingTag:n,voxelManager:P,numberOfComponents:x,dataType:f},{imageIds:u,loadStatus:{loaded:!1,loading:!1,cancelled:!1,cachedFrames:[],callbacks:[]}});return{promise:Promise.resolve(I),decache:()=>{I.destroy(),I=null},cancel:()=>{I.cancelLoading()}}}const mt={GenericViewport:je,DefaultRenderPathResolver:Ne,defaultRenderPathResolver:Le,ECGGenericViewport:Ae,createDefaultECGRenderPaths:Oe,createECGRenderPathResolver:ke,DefaultECGDataProvider:Fe,ecgProjection:$e,VideoGenericViewport:We,createDefaultVideoRenderPaths:Te,createVideoRenderPathResolver:ze,DefaultVideoDataProvider:be,videoProjection:qe,PlanarViewport:ye,createDefaultPlanarRenderPaths:Ge,createPlanarRenderPathResolver:_e,DefaultPlanarDataProvider:Me,planarProjection:Ze,VolumeViewport3D:Ee,createDefaultVolume3DRenderPaths:ve,createVolume3DRenderPathResolver:Se,DefaultVolume3DDataProvider:Re,volume3DProjection:Je,WSIGenericViewport:De,createDefaultWSIRenderPaths:Pe,createWSIRenderPathResolver:Ce,DefaultWSIDataProvider:Ve,wsiProjection:Ke},ht=Ie;export{xt as ActorRenderMode,U as BaseRenderingEngine,wt as BaseVolumeViewport,ft as CONSTANTS,A as ContextPoolRenderingEngine,Fe as DefaultECGDataProvider,Me as DefaultPlanarDataProvider,Ne as DefaultRenderPathResolver,be as DefaultVideoDataProvider,Re as DefaultVolume3DDataProvider,Ve as DefaultWSIDataProvider,Ae as ECGGenericViewport,It as ECGViewport,Vt as EPSILON,M as EVENTS,Ct as Enums,je as GenericViewport,Ee as GenericVolumeViewport3D,Pt as ImageVolume,ht as LegacyVolumeViewport3D,ye as PlanarViewport,Dt as ProgressiveRetrieveImages,Rt as RenderBackends,dt as RenderingEngine,St as Settings,vt as StackViewport,Ye as StreamingDynamicImageVolume,xe as StreamingImageVolume,Et as Surface,He as TiledRenderingEngine,We as VideoGenericViewport,Mt as VideoViewport,_t as Viewport,Gt as ViewportProjectionService,yt as VolumeViewport,Ie as VolumeViewport3D,De as WSIGenericViewport,bt as WSIViewport,rt as addImageSlicesToViewports,Wn as addVolumesToViewports,zt as cache,Tt as canRenderFloatTextures,Wt as convertColorArrayToRgbString,Ft as convertMapperToNotSharedMapper,kt as cornerstoneMeshLoader,gt as cornerstoneStreamingDynamicImageVolumeLoader,Ot as cornerstoneStreamingImageVolumeLoader,At as createCanvas,Oe as createDefaultECGRenderPaths,Ge as createDefaultPlanarRenderPaths,Te as createDefaultVideoRenderPaths,ve as createDefaultVolume3DRenderPaths,Pe as createDefaultWSIRenderPaths,ke as createECGRenderPathResolver,_e as createPlanarRenderPathResolver,ze as createVideoRenderPathResolver,Lt as createViewportElement,Se as createVolume3DRenderPathResolver,Nt as createVolumeActor,jt as createVolumeMapper,Ce as createWSIRenderPathResolver,lt as decimatedVolumeLoader,Le as defaultRenderPathResolver,Bt as detectRenderingCapabilities,$e as ecgProjection,y as eventTarget,Ht as geometryLoader,L as getConfiguration,Ut as getEffectiveRenderBackend,Rn as getEnabledElement,Sn as getEnabledElementByIds,vn as getEnabledElementByViewportId,En as getEnabledElements,S as getOrCreateCanvas,$t as getProjectionScaleMatrix,qt as getRenderBackend,Zt as getRenderingCapabilities,Jt as getRenderingEngine,Kt as getRenderingEngines,Yt as getShouldUseCPURendering,Qt as getUseGenericViewport,Xt as getWebWorkerManager,en as imageLoadPoolManager,tn as imageLoader,nn as imageRetrievalPoolManager,sn as init,on as isCornerstoneInitialized,an as isRegisteredRenderBackend,rn as isRegisteredViewportType,dn as metaData,cn as peerImport,Ze as planarProjection,ln as registerImageLoader,gn as registerRenderBackend,mn as registerViewportType,mt as renderingEngineExportsV2,hn as requestPoolManager,un as resetInitialization,pn as resetUseCPURendering,xn as setCanvasCreator,wn as setConfiguration,fn as setPreferSizeOverAccuracy,In as setRenderBackend,Vn as setUseCPURendering,Mn as setVolumesForViewports,E as triggerEvent,G as updateCanvasSizeAndAspectRatio,_n as utilities,ct as version,qe as videoProjection,Gn as viewportHasCanvasWorldTransform,yn as viewportHasFrameOfReferenceUID,bn as viewportHasPan,zn as viewportHasZoom,Cn as viewportProjection,Je as volume3DProjection,Pn as volumeLoader,Ke as wsiProjection};
1
+ import{v as H,B as U,t as E,E as M,g as L,a as W,b as S,u as G,s as $,V as q,c as Z,e as y,i as F,d as k,f as v,R as O,h as J,j as K,k as Y,l as Q,m as X,n as ee,o as te,p as ne,r as se,q as oe,w as ie,x as ae,y as re,z as de,A as ce,C as le,D as ge,F as me,G as he,I as ue,H as pe,J as N,S as xe,K as j,L as we,M as fe,N as Ie,O as Ve,P as Ce,Q as Pe,W as De,T as Re,U as Se,X as ve,Y as Ee,Z as Me,_ as _e,$ as Ge,a0 as ye,a1 as be,a2 as ze,a3 as Te,a4 as We,a5 as Fe,a6 as ke,a7 as Oe,a8 as Ae,a9 as Le,aa as Ne,ab as je}from"./Settings-CepUR3VB.js";import{ac as xt,ad as wt,ae as ft,af as It,ag as Vt,ah as Ct,ai as Pt,aj as Dt,ak as Rt,al as St,am as vt,an as Et,ao as Mt,ap as _t,aq as Gt,ar as yt,as as bt,at as zt,au as Tt,av as Wt,aw as Ft,ax as kt,ay as Ot,az as At,aA as Lt,aB as Nt,aC as jt,aD as Bt,aE as Ht,aF as Ut,aG as $t,aH as qt,aI as Zt,aJ as Jt,aK as Kt,aL as Yt,aM as Qt,aN as Xt,aO as en,aP as tn,aQ as nn,aR as sn,aS as on,aT as an,aU as rn,aV as dn,aW as cn,aX as ln,aY as gn,aZ as mn,aO as hn,a_ as un,a$ as pn,b0 as xn,b1 as wn,b2 as fn,b3 as In,b4 as Vn,b5 as Cn,b6 as Pn}from"./Settings-CepUR3VB.js";import{a as Be,T as He}from"./index-NTe9svEs.js";import{g as Rn,b as Sn,c as vn,d as En,s as Mn,u as _n,v as Gn,e as yn,f as bn,h as zn}from"./index-NTe9svEs.js";import"./cornerstoneEngine-oWB9T9Cs.js";import"./Texture-CA0OMvaZ.js";import{a as Wn}from"./addVolumesToViewports-DA_rtwe9.js";import"./dcmjs.es-DfWkgqfk.js";import"./index-BSiKqAGW.js";import"./_commonjsHelpers-CE1G-McA.js";function rt(l,e,t){for(const n of t){const o=l.getViewport(n);if(!o)throw new Error(`Viewport with Id ${n} does not exist`);if(!o.addImages){console.warn(`Viewport with Id ${n} does not have addImages. Cannot add image segmentation to this viewport.`);return}}t.forEach(n=>{l.getViewport(n).addImages(e)})}class Ue{constructor(e,t=""){this.contexts=[],this.offScreenCanvasContainers=[],this.viewportToContext=new Map,this.viewportSizes=new Map,this.contextMaxSizes=new Map;for(let n=0;n<e;n++){const o=H.newInstance(),s=document.createElement("div");o.setContainer(s),Be(o,t,n),this.contexts.push(o),this.offScreenCanvasContainers.push(s)}}getContextByIndex(e){return e>=0&&e<this.contexts.length?{context:this.contexts[e],container:this.offScreenCanvasContainers[e]}:null}assignViewportToContext(e,t){this.viewportToContext.set(e,t)}getContextIndexForViewport(e){return this.viewportToContext.get(e)}getAllContexts(){return this.contexts}getContextCount(){return this.contexts.length}updateViewportSize(e,t,n){const o=this.viewportToContext.get(e);if(o===void 0)return!1;this.viewportSizes.set(e,{width:t,height:n});const s=this.contextMaxSizes.get(o),i=this.calculateMaxSizeForContext(o);return this.contextMaxSizes.set(o,i),!s||s.width!==i.width||s.height!==i.height}getMaxSizeForContext(e){return this.contextMaxSizes.get(e)}calculateMaxSizeForContext(e){let t=0,n=0;return this.viewportToContext.forEach((o,s)=>{if(o===e){const i=this.viewportSizes.get(s);i&&(t=Math.max(t,i.width),n=Math.max(n,i.height))}}),{width:t,height:n}}removeViewport(e){const t=this.viewportToContext.get(e);if(this.viewportToContext.delete(e),this.viewportSizes.delete(e),t!==void 0){const n=this.calculateMaxSizeForContext(t);this.contextMaxSizes.set(t,n)}}destroy(){this.contexts.forEach(e=>{e.delete()}),this.contexts=[],this.offScreenCanvasContainers=[],this.viewportToContext.clear(),this.viewportSizes.clear(),this.contextMaxSizes.clear()}}class A extends U{constructor(e){super(e),this._renderFlaggedViewports=()=>{this._throwIfDestroyed();const n=this._getViewportsAsArray().filter(s=>this._needsRender.has(s.id));if(n.length===0){this._animationFrameSet=!1,this._animationFrameHandle=null;return}const o=n.map(s=>{const i=this.renderViewportUsingCustomOrVtkPipeline(s);return s.setRendered(),this._needsRender.delete(s.id),i});this._animationFrameSet=!1,this._animationFrameHandle=null,o.forEach(s=>{s?.element&&E(s.element,M.IMAGE_RENDERED,s)})},this.useCPURendering||this.ensureContextPool()}ensureContextPool(){if(!this.contextPool){const{rendering:e}=L(),{webGlContextCount:t}=e;this.contextPool=new Ue(t,this.id)}return this.contextPool}enableVTKjsDrivenViewport(e){const o=this._getViewportsAsArray().filter(a=>W(a.type)===!1).map(a=>a.canvas),s=S(e.element);G(s),o.push(s);const i={...e,canvas:s};this.addVtkjsDrivenViewport(i)}addVtkjsDrivenViewport(e){const t=this.ensureContextPool(),{element:n,canvas:o,viewportId:s,type:i,defaultOptions:a}=e;n.tabIndex=-1,$(n);let r=0;if(i===q.STACK){const u=t.getAllContexts();r=this._viewports.size%u.length}t.assignViewportToContext(s,r),t.updateViewportSize(s,o.width,o.height);const d=t.getContextByIndex(r),{context:g,container:m}=d,p=t.getMaxSizeForContext(r);m.width=p.width,m.height=p.height,g.resize(),g.addRenderer({viewport:[0,0,1,1],id:s,background:a.background?a.background:[0,0,0]});const x={id:s,element:n,renderingEngineId:this.id,type:i,canvas:o,sx:0,sy:0,sWidth:o.width,sHeight:o.height,defaultOptions:a||{}},f=Z(e);if(!f)throw new Error(`Viewport Type ${i} is not supported`);const h=new f(x);h.requestedType=e.requestedType??i,this._viewports.set(s,h);const c={element:n,viewportId:s,renderingEngineId:this.id};h.suppressEvents||E(y,M.ELEMENT_ENABLED,c)}setVtkjsDrivenViewports(e){if(e.length){const t=e.map(n=>S(n.element));t.forEach(n=>G(n));for(let n=0;n<e.length;n++){const o=e[n],s=t[n],i={...o,canvas:s};this.addVtkjsDrivenViewport(i)}}}_getDisplayedSize(e){const t=window.devicePixelRatio||1,n=F(e)?e.element:S(e.element);return{displayedWidth:Math.round(n.clientWidth*t),displayedHeight:Math.round(n.clientHeight*t)}}_resizeVTKViewports(e,t=!0,n=!0){const o=[];for(const s of e){const i=S(s.element),{displayedWidth:a,displayedHeight:r}=this._getDisplayedSize(s);if(a===0||r===0)continue;const d=i.width,g=i.height;a===d&&r===g||o.push(s)}if(o.length!==0){for(const s of o){const{displayedWidth:i,displayedHeight:a}=this._getDisplayedSize(s),r=Math.max(v,i),d=Math.max(v,a);s.sWidth=r,s.sHeight=d}this._animationFrameSet||(e.length&&this._resize(e),e.forEach(s=>{if(s.resize?.(),F(s))return;const i=s.getCamera(),a=s.getRotation?.()??0,{flipHorizontal:r}=i,d=s;d.resetViewStateForResize?d.resetViewStateForResize():d.resetCameraForResize?.();const g=s.getDisplayArea();t&&(g?(r&&s.setCamera({flipHorizontal:r}),a&&s.setViewPresentation({rotation:a})):s.setCamera(i))}),n&&this.render())}}renderViewportUsingCustomOrVtkPipeline(e){if(k(e))return e.customRenderViewportToCanvas();if(!this.contextPool)throw new Error("GPU not available, and using a viewport with no custom render pipeline.");const t=this.contextPool.getContextIndexForViewport(e.id),n=this.contextPool.getContextByIndex(t),{context:o,container:s}=n;return this._renderViewportWithContext(e,o,s)}_renderViewportWithContext(e,t,n){if(e.canvas.clientWidth===0||e.canvas.clientHeight===0)return;if(e.sWidth<v||e.sHeight<v){console.warn("Viewport is too small",e.sWidth,e.sHeight);return}if(k(e))return e.customRenderViewportToCanvas();if(!this.contextPool)throw new Error("GPU not available, and using a viewport with no custom render pipeline.");t.getRenderer(e.id)||t.addRenderer({viewport:[0,0,1,1],id:e.id,background:e.defaultOptions?.background||[0,0,0]});const o=t.getRenderWindow(),s=o.getViews()[0],i=s.getRenderPasses(),a=this.getViewportRenderPasses(e.id);a&&s.setRenderPasses(a),this._resizeOffScreenCanvasForViewport(e,n,t);const r=t.getRenderer(e.id),d=this.contextPool.getContextIndexForViewport(e.id),g=this.contextPool.getMaxSizeForContext(d),m=e.sWidth,p=e.sHeight,x=Math.min(1,m/g.width),f=Math.min(1,p/g.height);r.setViewport(0,0,x,f);const h=t.getRenderers();h.forEach(({renderer:w,id:V})=>{const _=V.split("::")[0];w.setDraw(_===e.id)});const c=this.getWidgetRenderers();c.forEach((w,V)=>{V.setDraw(w===e.id)}),o.render(),h.forEach(({renderer:w})=>w.setDraw(!1)),c.forEach((w,V)=>{V.setDraw(!1)}),i&&s.setRenderPasses(i);const I=t.getOpenGLRenderWindow().get3DContext().canvas;return this._copyToOnscreenCanvas(e,I)}_renderViewportFromVtkCanvasToOnscreenCanvas(e,t){return this._copyToOnscreenCanvas(e,t)}_resizeOffScreenCanvasForViewport(e,t,n){const o=this.contextPool.getContextIndexForViewport(e.id);if(o===void 0||!this.contextPool.updateViewportSize(e.id,e.sWidth,e.sHeight))return;const i=this.contextPool.getMaxSizeForContext(o);t.width===i.width&&t.height===i.height||(t.width=i.width,t.height=i.height,n.resize())}_copyToOnscreenCanvas(e,t){const{element:n,canvas:o,id:s,renderingEngineId:i,suppressEvents:a}=e,r=e.sWidth,d=e.sHeight;G(o,{width:r,height:d});const g=o.getContext("2d"),m=this.contextPool.getContextIndexForViewport(s),x=this.contextPool.getMaxSizeForContext(m).height-d;return g.drawImage(t,0,x,r,d,0,0,r,d),{element:n,suppressEvents:a,viewportId:s,renderingEngineId:i,viewportStatus:e.viewportStatus}}_resize(e){const t=new Set;for(const n of e){n.sx=0,n.sy=0;const o=this.contextPool.getContextIndexForViewport(n.id);this.contextPool.updateViewportSize(n.id,n.sWidth,n.sHeight)&&t.add(o);const i=this.contextPool.getContextByIndex(o),{context:a}=i,r=a.getRenderer(n.id),d=this.contextPool.getMaxSizeForContext(o),g=Math.min(1,n.sWidth/d.width),m=Math.min(1,n.sHeight/d.height);r.setViewport(0,0,g,m)}t.forEach(n=>{const o=this.contextPool.getContextByIndex(n);if(o){const{context:s,container:i}=o,a=this.contextPool.getMaxSizeForContext(n);i.width=a.width,i.height=a.height,s.resize()}})}getWidgetRenderers(){const e=this._getViewportsAsArray(),t=new Map;return e.forEach(n=>{(n.getWidgets?n.getWidgets():[]).forEach(s=>{const i=s.getRenderer?s.getRenderer():null;i&&t.set(i,n.id)})}),t}getViewportRenderPasses(e){const t=this.getViewport(e);return t?.getRenderPasses?t.getRenderPasses():null}getRenderer(e){const t=this.contextPool?.getContextIndexForViewport(e);if(t===void 0||!this.contextPool)return;const n=this.contextPool.getContextByIndex(t);if(!n)return;const{context:o}=n;return o.getRenderer(e)}disableElement(e){const t=this.getViewport(e);if(t&&(super.disableElement(e),!W(t.type)&&this.contextPool)){const n=this.contextPool.getContextIndexForViewport(e);if(n!==void 0){const o=this.contextPool.getContextByIndex(n);if(o){const{context:s}=o;s.removeRenderer(e)}}this.contextPool.removeViewport(e)}}destroy(){super.destroy(),this.contextPool&&this.contextPool.destroy()}getOffscreenMultiRenderWindow(e){if(!this.contextPool)throw new Error("Offscreen multi render window is not available.");const t=this.contextPool.getContextIndexForViewport(e);if(t===void 0)throw new Error(`Offscreen multi render window is not available for viewport ${e}.`);const n=this.contextPool.getContextByIndex(t);if(!n)throw new Error(`Offscreen multi render window is not available for viewport ${e}.`);return n.context}}class dt{constructor(e){const n=L()?.rendering?.renderingEngineMode;switch(n){case O.Tiled:this._implementation=new He(e);break;case O.ContextPool:this._implementation=new A(e);break;default:console.warn(`RenderingEngine: Unknown rendering engine mode "${n}". Defaulting to Next rendering engine.`),this._implementation=new A(e);break}}get id(){return this._implementation.id}disableViewport(e){return this._implementation.disableElement(e)}enableElement(e){return this._implementation.enableElement(e)}disableElement(e){return this._implementation.disableElement(e)}setViewports(e){return this._implementation.setViewports(e)}resize(e=!0,t=!0){return this._implementation.resize(e,t)}getViewport(e){return this._implementation.getViewport(e)}getViewports(){return this._implementation.getViewports()}getRenderer(e){return this._implementation.getRenderer(e)}fillCanvasWithBackgroundColor(e,t){return this._implementation.fillCanvasWithBackgroundColor(e,t)}render(){return this._implementation.render()}renderViewports(e){return this._implementation.renderViewports(e)}renderViewport(e){return this._implementation.renderViewport(e)}destroy(){return this._implementation.destroy()}getOffscreenMultiRenderWindow(e){return this._implementation.getOffscreenMultiRenderWindow(e)}}const $e={adapter:K,getSnapshot:J},qe={adapter:Q,getSnapshot:Y},Ze={adapter:de,getSnapshot:re,getZoom:ae,getScale:ie,getPan:oe,resolveICamera:se,derivePresentation:ne,applyToRenderer:te,createImageSliceBasis:ee,createVolumeSliceBasis:X},Je={adapter:le,getSnapshot:ce},Ke={adapter:me,getSnapshot:ge},ct="5.8.2";class Ye extends he{constructor(e,t){super(e,t),this._dimensionGroupNumber=1,this._loadedDimensionGroups=new Set,this._getImageIdRequests=(s,i)=>this.getImageIdsRequests(s,i),this.getImageLoadRequests=s=>{const i=this.getImageIdsToLoad();return this._getImageIdRequests(i,s)};const{imageIdGroups:n,splittingTag:o}=e;this._splittingTag=o,this._imageIdGroups=n,this.numDimensionGroups=this._imageIdGroups.length}_getImageIdsToLoad(){const e=this._imageIdGroups,t=this._dimensionGroupNumber-1,n=[...e[t]];let o=t-1,s=t+1;for(;o>=0||s<e.length;)o>=0&&n.push(...e[o--]),s<e.length&&n.push(...e[s++]);return n}getImageIdsToLoad(){return this._getImageIdsToLoad()}get dimensionGroupNumber(){return this._dimensionGroupNumber}set dimensionGroupNumber(e){this._dimensionGroupNumber!==e&&(this._dimensionGroupNumber=e,this.voxelManager.setDimensionGroupNumber(e),this.invalidateVolume(!0),E(y,M.DYNAMIC_VOLUME_DIMENSION_GROUP_CHANGED,{volumeId:this.volumeId,dimensionGroupNumber:e,numDimensionGroups:this.numDimensionGroups,imageIdGroupIndex:e-1,numImageIdGroups:this.numDimensionGroups,splittingTag:this.splittingTag}))}scroll(e){const t=this._dimensionGroupNumber+e;t<1?this.dimensionGroupNumber=this.numDimensionGroups:t>this.numDimensionGroups?this.dimensionGroupNumber=1:this.dimensionGroupNumber=t}getCurrentDimensionGroupImageIds(){return this._imageIdGroups[this._dimensionGroupNumber-1]}flatImageIdIndexToDimensionGroupNumber(e){return Math.floor(e/this._imageIdGroups[0].length)+1}flatImageIdIndexToImageIdIndex(e){return e%this._imageIdGroups[0].length}get splittingTag(){return this._splittingTag}isDimensionGroupLoaded(e){return this._loadedDimensionGroups.has(e)}markDimensionGroupAsLoaded(e){this._loadedDimensionGroups.add(e),E(y,M.DYNAMIC_VOLUME_DIMENSION_GROUP_LOADED,{volumeId:this.volumeId,dimensionGroupNumber:e})}checkDimensionGroupCompletion(e){const t=this.flatImageIdIndexToDimensionGroupNumber(e);this._imageIdGroups[t-1].every(s=>{const i=this.getImageIdIndex(s);return this.cachedFrames[i]===ue.FULL_RESOLUTION})&&!this.isDimensionGroupLoaded(t)&&this.markDimensionGroupAsLoaded(t)}}function Qe(l,e,t){return e.reduce((n,o)=>o.apply(n,t),l)}const Xe={name:"InPlaneDecimationModifier",apply(l,e){const[t=1,n=t]=e.options.ijkDecimation??[],o=Math.max(1,Math.floor(t)),s=Math.max(1,Math.floor(n));if(o===1&&s===1)return l;const[i,a]=l.dimensions,r=Math.max(1,Math.floor(i/o)),d=Math.max(1,Math.floor(a/s)),g=[r,d,l.dimensions[2]],m=[l.spacing[0]*o,l.spacing[1]*s,l.spacing[2]],p={...l.metadata,Columns:r,Rows:d,PixelSpacing:[m[1],m[0]]};return{...l,dimensions:g,spacing:m,metadata:p}}};function lt(l,e){if(!e||!e.imageIds||!e.imageIds.length)throw new Error("ImageIds must be provided to create a streaming image volume ");const[t=1,n=t,o=1]=e.ijkDecimation??[],s=Math.max(1,Math.floor(t)),i=n>1?Math.max(1,Math.floor(n)):s,a=Math.max(1,Math.floor(o)),r=s>1||i>1,d={ijkDecimation:[s,i,a]},g=[Xe];function m(c,u){return u===1?c:`${c}#decimation=${u}`}const p=Math.floor(e.imageIds.length/a),x=a>1&&e.imageIds.length<=p+1;if(a>1&&!x){const c=pe(e.imageIds,a),u=Array.isArray(c)&&c.length&&typeof c[0]=="number"?c.map(P=>e.imageIds[P]):c;e.imageIds=u}s>1&&(e.imageIds=e.imageIds.map(c=>m(c,s)));async function f(){const c=N(e.imageIds,l),u={volumeId:l,imageIds:e.imageIds,options:d},P=Qe(c,g,u),{dimensions:I,spacing:R,origin:w,direction:V,metadata:_,imageIds:b,dataType:B,numberOfComponents:z}=P,C=new xe({volumeId:l,metadata:_,dimensions:I,spacing:R,origin:w,direction:V,imageIds:b,dataType:B,numberOfComponents:z},{imageIds:b,loadStatus:{loaded:!1,loading:!1,cancelled:!1,cachedFrames:[],callbacks:[]}});if(r){const D=C.imageData;D&&(D.setDimensions(C.dimensions),D.setSpacing(C.spacing),D.modified());const T=j.createImageVolumeVoxelManager({dimensions:C.dimensions,imageIds:C.imageIds,numberOfComponents:z});C.voxelManager=T,D&&D.set({voxelManager:T})}return C}const h=f();return{promise:h,decache:()=>{h.then(c=>{c.destroy(),c=null})},cancel:()=>{h.then(c=>{c.cancelLoading()})}}}function gt(l,e){if(!e||!e.imageIds||!e.imageIds.length)throw new Error("ImageIds must be provided to create a 4D streaming image volume");const{imageIds:t}=e,{splittingTag:n,imageIdGroups:o}=we(t),s=Math.floor(o.length/2),i=N(o[s],l),{metadata:a,dimensions:r,spacing:d,direction:g,sizeInBytes:m,origin:p,numberOfComponents:x,dataType:f}=i,h=g.slice(6,9),c=o.map(R=>fe(R,h).sortedImageIds),u=c.flat(),P=j.createScalarDynamicVolumeVoxelManager({dimensions:r,imageIdGroups:c,dimensionGroupNumber:1,numberOfComponents:x});let I=new Ye({volumeId:l,metadata:a,dimensions:r,spacing:d,origin:p,direction:g,sizeInBytes:m,imageIds:u,imageIdGroups:c,splittingTag:n,voxelManager:P,numberOfComponents:x,dataType:f},{imageIds:u,loadStatus:{loaded:!1,loading:!1,cancelled:!1,cachedFrames:[],callbacks:[]}});return{promise:Promise.resolve(I),decache:()=>{I.destroy(),I=null},cancel:()=>{I.cancelLoading()}}}const mt={GenericViewport:je,DefaultRenderPathResolver:Ne,defaultRenderPathResolver:Le,ECGGenericViewport:Ae,createDefaultECGRenderPaths:Oe,createECGRenderPathResolver:ke,DefaultECGDataProvider:Fe,ecgProjection:$e,VideoGenericViewport:We,createDefaultVideoRenderPaths:Te,createVideoRenderPathResolver:ze,DefaultVideoDataProvider:be,videoProjection:qe,PlanarViewport:ye,createDefaultPlanarRenderPaths:Ge,createPlanarRenderPathResolver:_e,DefaultPlanarDataProvider:Me,planarProjection:Ze,VolumeViewport3D:Ee,createDefaultVolume3DRenderPaths:ve,createVolume3DRenderPathResolver:Se,DefaultVolume3DDataProvider:Re,volume3DProjection:Je,WSIGenericViewport:De,createDefaultWSIRenderPaths:Pe,createWSIRenderPathResolver:Ce,DefaultWSIDataProvider:Ve,wsiProjection:Ke},ht=Ie;export{xt as ActorRenderMode,U as BaseRenderingEngine,wt as BaseVolumeViewport,ft as CONSTANTS,A as ContextPoolRenderingEngine,Fe as DefaultECGDataProvider,Me as DefaultPlanarDataProvider,Ne as DefaultRenderPathResolver,be as DefaultVideoDataProvider,Re as DefaultVolume3DDataProvider,Ve as DefaultWSIDataProvider,Ae as ECGGenericViewport,It as ECGViewport,Vt as EPSILON,M as EVENTS,Ct as Enums,je as GenericViewport,Ee as GenericVolumeViewport3D,Pt as ImageVolume,ht as LegacyVolumeViewport3D,ye as PlanarViewport,Dt as ProgressiveRetrieveImages,Rt as RenderBackends,dt as RenderingEngine,St as Settings,vt as StackViewport,Ye as StreamingDynamicImageVolume,xe as StreamingImageVolume,Et as Surface,He as TiledRenderingEngine,We as VideoGenericViewport,Mt as VideoViewport,_t as Viewport,Gt as ViewportProjectionService,yt as VolumeViewport,Ie as VolumeViewport3D,De as WSIGenericViewport,bt as WSIViewport,rt as addImageSlicesToViewports,Wn as addVolumesToViewports,zt as cache,Tt as canRenderFloatTextures,Wt as convertColorArrayToRgbString,Ft as convertMapperToNotSharedMapper,kt as cornerstoneMeshLoader,gt as cornerstoneStreamingDynamicImageVolumeLoader,Ot as cornerstoneStreamingImageVolumeLoader,At as createCanvas,Oe as createDefaultECGRenderPaths,Ge as createDefaultPlanarRenderPaths,Te as createDefaultVideoRenderPaths,ve as createDefaultVolume3DRenderPaths,Pe as createDefaultWSIRenderPaths,ke as createECGRenderPathResolver,_e as createPlanarRenderPathResolver,ze as createVideoRenderPathResolver,Lt as createViewportElement,Se as createVolume3DRenderPathResolver,Nt as createVolumeActor,jt as createVolumeMapper,Ce as createWSIRenderPathResolver,lt as decimatedVolumeLoader,Le as defaultRenderPathResolver,Bt as detectRenderingCapabilities,$e as ecgProjection,y as eventTarget,Ht as geometryLoader,L as getConfiguration,Ut as getEffectiveRenderBackend,Rn as getEnabledElement,Sn as getEnabledElementByIds,vn as getEnabledElementByViewportId,En as getEnabledElements,S as getOrCreateCanvas,$t as getProjectionScaleMatrix,qt as getRenderBackend,Zt as getRenderingCapabilities,Jt as getRenderingEngine,Kt as getRenderingEngines,Yt as getShouldUseCPURendering,Qt as getUseGenericViewport,Xt as getWebWorkerManager,en as imageLoadPoolManager,tn as imageLoader,nn as imageRetrievalPoolManager,sn as init,on as isCornerstoneInitialized,an as isRegisteredRenderBackend,rn as isRegisteredViewportType,dn as metaData,cn as peerImport,Ze as planarProjection,ln as registerImageLoader,gn as registerRenderBackend,mn as registerViewportType,mt as renderingEngineExportsV2,hn as requestPoolManager,un as resetInitialization,pn as resetUseCPURendering,xn as setCanvasCreator,wn as setConfiguration,fn as setPreferSizeOverAccuracy,In as setRenderBackend,Vn as setUseCPURendering,Mn as setVolumesForViewports,E as triggerEvent,G as updateCanvasSizeAndAspectRatio,_n as utilities,ct as version,qe as videoProjection,Gn as viewportHasCanvasWorldTransform,yn as viewportHasFrameOfReferenceUID,bn as viewportHasPan,zn as viewportHasZoom,Cn as viewportProjection,Je as volume3DProjection,Pn as volumeLoader,Ke as wsiProjection};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-CTKW4bNT.js","./_commonjsHelpers-CE1G-McA.js","./index-QlzdWpod.js","./index-BizDkoHX.css"])))=>i.map(i=>d[i]);
2
- import{_ as h,I as u}from"./index-QlzdWpod.js";const c={gray:"gray",hot:"hot",jet:"jet",cool:"cool"},d={wl:"contrast",pan:"pan",length:"measurement",angle:"angle"};class v{name="niivue";host;path;nv=null;module=null;layout="mpr";tool="wl";colormap="gray";slice=0;slices=0;refused=0;disposed=!1;constructor(s,t){this.host=s,this.path=t}async open(s){const t=document.createElement("canvas");t.className="image-canvas",s.appendChild(t),this.host.readout_set("LOADING"),this.host.progress_set({label:"READING VOLUME",done:0,total:0});const e=performance.now();if(this.module=await h(()=>import("./index-CTKW4bNT.js"),__vite__mapDeps([0,1,2,3]),import.meta.url),this.disposed)return;const i=new this.module.Niivue({isResizeCanvas:!0,logLevel:"error",dragAndDropEnabled:!1,crosshairWidth:.4,crosshairWidthUnit:"percent"});i.onLocationChange=o=>{const r=o,l=r.vox?.[2];l!==void 0&&(this.slice=l+1),this.host.readout_set(`${this.slices>0?`SLICE ${this.slice} OF ${this.slices} · `:""}${r.string??""}`)},await i.attachToCanvas(t);const n=this.path.split("/").pop()??"volume.nii.gz";try{await i.loadVolumes([{url:`${location.origin}${this.host.source.url_of(this.path)}`,name:n}])}catch(o){this.refused=1,this.host.progress_set(null),this.host.readout_set("REFUSED 1 OF 1"),this.host.note(`image: ${this.path}: ${o instanceof Error?o.message:String(o)}`);return}if(this.host.progress_set(null),this.disposed)return;this.nv=i;const a=i.volumes[0]?.dims;this.slices=a?.[3]??0,i.setSliceType(i.sliceTypeMultiplanar),this.layout="mpr",this.host.readout_set(`${this.slices} SLICES`),this.host.note(`image: ${n} drawn in ${Math.round(performance.now()-e)} ms`),this.host.regard(this.path)}async layout_set(s){return s==="slab"||this.nv===null?!1:(this.nv.setSliceType(s==="single"?this.nv.sliceTypeAxial:s==="mpr"?this.nv.sliceTypeMultiplanar:this.nv.sliceTypeRender),this.layout=s,this.host.readout_set(`${this.slices} SLICES`),!0)}slice_set(s){if(this.nv===null||this.slices===0)return!1;const t=Math.max(1,Math.min(s,this.slices)),e=this.slice>0?this.slice:Math.ceil(this.slices/2);return this.nv.moveCrosshairInVox(0,0,t-e),this.slice=t,!0}wl_set(s,t){const e=this.nv?.volumes[0];return this.nv===null||e===void 0?!1:(e.cal_min=s,e.cal_max=t,this.nv.updateGLVolume(),!0)}colormap_set(s){const t=this.nv?.volumes[0];return this.nv===null||t?.id===void 0?!1:(this.colormap=s,this.nv.setColormap(t.id,c[s]),!0)}toolsOffered_get(){return u}ghost_set(s){return!1}tool_set(s){const t=d[s];return this.nv===null||t===void 0?!1:(this.nv.setDragMode(t),this.tool=s,!0)}annotations_export(){return Promise.resolve(null)}annotations_import(){return Promise.resolve(0)}async slices_fill(){return this.nv!==null}state_get(){return{engine:"niivue",layout:this.layout,slice:this.slice,slices:this.slices,tool:this.tool,primaryTool:this.tool,refused:this.refused,annotations:0,filled:this.nv!==null,colormap:this.colormap}}dispose(){this.disposed=!0,this.nv=null}}export{v as NiivueEngine};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./index-D-JhIsWB.js","./_commonjsHelpers-CE1G-McA.js","./index-BSiKqAGW.js","./index-DKs-EoU5.css"])))=>i.map(i=>d[i]);
2
+ import{_ as h,I as u}from"./index-BSiKqAGW.js";const c={gray:"gray",hot:"hot",jet:"jet",cool:"cool"},d={wl:"contrast",pan:"pan",length:"measurement",angle:"angle"};class v{name="niivue";host;path;nv=null;module=null;layout="mpr";tool="wl";colormap="gray";slice=0;slices=0;refused=0;disposed=!1;constructor(s,t){this.host=s,this.path=t}async open(s){const t=document.createElement("canvas");t.className="image-canvas",s.appendChild(t),this.host.readout_set("LOADING"),this.host.progress_set({label:"READING VOLUME",done:0,total:0});const e=performance.now();if(this.module=await h(()=>import("./index-D-JhIsWB.js"),__vite__mapDeps([0,1,2,3]),import.meta.url),this.disposed)return;const i=new this.module.Niivue({isResizeCanvas:!0,logLevel:"error",dragAndDropEnabled:!1,crosshairWidth:.4,crosshairWidthUnit:"percent"});i.onLocationChange=o=>{const r=o,l=r.vox?.[2];l!==void 0&&(this.slice=l+1),this.host.readout_set(`${this.slices>0?`SLICE ${this.slice} OF ${this.slices} · `:""}${r.string??""}`)},await i.attachToCanvas(t);const n=this.path.split("/").pop()??"volume.nii.gz";try{await i.loadVolumes([{url:`${location.origin}${this.host.source.url_of(this.path)}`,name:n}])}catch(o){this.refused=1,this.host.progress_set(null),this.host.readout_set("REFUSED 1 OF 1"),this.host.note(`image: ${this.path}: ${o instanceof Error?o.message:String(o)}`);return}if(this.host.progress_set(null),this.disposed)return;this.nv=i;const a=i.volumes[0]?.dims;this.slices=a?.[3]??0,i.setSliceType(i.sliceTypeMultiplanar),this.layout="mpr",this.host.readout_set(`${this.slices} SLICES`),this.host.note(`image: ${n} drawn in ${Math.round(performance.now()-e)} ms`),this.host.regard(this.path)}async layout_set(s){return s==="slab"||this.nv===null?!1:(this.nv.setSliceType(s==="single"?this.nv.sliceTypeAxial:s==="mpr"?this.nv.sliceTypeMultiplanar:this.nv.sliceTypeRender),this.layout=s,this.host.readout_set(`${this.slices} SLICES`),!0)}slice_set(s){if(this.nv===null||this.slices===0)return!1;const t=Math.max(1,Math.min(s,this.slices)),e=this.slice>0?this.slice:Math.ceil(this.slices/2);return this.nv.moveCrosshairInVox(0,0,t-e),this.slice=t,!0}wl_set(s,t){const e=this.nv?.volumes[0];return this.nv===null||e===void 0?!1:(e.cal_min=s,e.cal_max=t,this.nv.updateGLVolume(),!0)}colormap_set(s){const t=this.nv?.volumes[0];return this.nv===null||t?.id===void 0?!1:(this.colormap=s,this.nv.setColormap(t.id,c[s]),!0)}toolsOffered_get(){return u}ghost_set(s){return!1}tool_set(s){const t=d[s];return this.nv===null||t===void 0?!1:(this.nv.setDragMode(t),this.tool=s,!0)}annotations_export(){return Promise.resolve(null)}annotations_import(){return Promise.resolve(0)}async slices_fill(){return this.nv!==null}state_get(){return{engine:"niivue",layout:this.layout,slice:this.slice,slices:this.slices,tool:this.tool,primaryTool:this.tool,refused:this.refused,annotations:0,filled:this.nv!==null,colormap:this.colormap}}dispose(){this.disposed=!0,this.nv=null}}export{v as NiivueEngine};
@@ -1,4 +1,4 @@
1
- import{m as v,as as _e,R as gt,K as Pe,L as Ge,W as ke,N as Le,k as de,E as j,t as ft,i as Me,x as ce,F as vt,Z as ht,h as St,D as dt,al as Tt,c as wt,at as yt,d as Ve,au as Ct,y as ue,ak as le,av as We,j as pe}from"./cornerstoneEngine-hAkB6jjG.js";import{ae as ze,am as De,an as ae,K as D,k as Q,al as W,D as se,U as Ne,X as Be,B as b,J as xt,E as Et,ak as Rt,$ as $e,a2 as _t,Z as Mt,b as Vt,_ as Ke,ao as Dt,ap as He,aq as Bt,ar as Te,as as mt,z as Ot,at as Ut,au as Ft,av as re,ad as Pt,R as Gt,aw as I,ah as kt,ai as Lt,C as Wt,P as zt,I as Nt,a as $t}from"./Texture-CIGczsau.js";import"./index-QlzdWpod.js";import"./_commonjsHelpers-CE1G-McA.js";function Kt(t){return t}function ye(t){if(t===null||t==="null")return null;if(t==="true")return!0;if(t==="false")return!1;if(!(t===void 0||t==="undefined"))return t[0]==="["&&t[t.length-1]==="]"?t.substring(1,t.length-1).split(",").map(e=>ye(e.trim())):t===""||Number.isNaN(Number(t))?t:Number(t)}function Ht(t=!0,e=window.location.search){const a={},s=t?ye:Kt;return new URLSearchParams(e).forEach((n,r)=>{r&&(a[r]=n?s(n):!0)}),a}var bt={toNativeType:ye,extractURLParameters:Ht},It={IS_START:0,IS_NONE:0,IS_ROTATE:1,IS_PAN:2,IS_SPIN:3,IS_DOLLY:4,IS_CAMERA_POSE:11,IS_WINDOW_LEVEL:1024,IS_SLICE:1025},Ce={States:It},{vtkErrorMacro:jt,VOID:Qt}=v;function Yt(t,e,a,s){return t.getRenderWindow().getViews()[0].worldToDisplay(e,a,s,t)}function Xt(t,e,a,s){return t.getRenderWindow().getViews()[0].displayToWorld(e,a,s,t)}var Zt={computeWorldToDisplay:Yt,computeDisplayToWorld:Xt};function Jt(t,e){e.classHierarchy.push("vtkInteractorObserver");const a={...t};function s(){for(;e.subscribedEvents.length;)e.subscribedEvents.pop().unsubscribe()}function n(){ze.handledEvents.forEach(r=>{t[`handle${r}`]&&e.subscribedEvents.push(e._interactor[`on${r}`](o=>e.processEvents?t[`handle${r}`](o):Qt,e.priority))})}t.setInteractor=r=>{r!==e._interactor&&(s(),e._interactor=r,r&&e.enabled&&n(),t.modified())},t.setEnabled=r=>{r!==e.enabled&&(s(),r&&(e._interactor?n():jt(`
1
+ import{m as v,as as _e,R as gt,K as Pe,L as Ge,W as ke,N as Le,k as de,E as j,t as ft,i as Me,x as ce,F as vt,Z as ht,h as St,D as dt,al as Tt,c as wt,at as yt,d as Ve,au as Ct,y as ue,ak as le,av as We,j as pe}from"./cornerstoneEngine-oWB9T9Cs.js";import{ae as ze,am as De,an as ae,K as D,k as Q,al as W,D as se,U as Ne,X as Be,B as b,J as xt,E as Et,ak as Rt,$ as $e,a2 as _t,Z as Mt,b as Vt,_ as Ke,ao as Dt,ap as He,aq as Bt,ar as Te,as as mt,z as Ot,at as Ut,au as Ft,av as re,ad as Pt,R as Gt,aw as I,ah as kt,ai as Lt,C as Wt,P as zt,I as Nt,a as $t}from"./Texture-CA0OMvaZ.js";import"./index-BSiKqAGW.js";import"./_commonjsHelpers-CE1G-McA.js";function Kt(t){return t}function ye(t){if(t===null||t==="null")return null;if(t==="true")return!0;if(t==="false")return!1;if(!(t===void 0||t==="undefined"))return t[0]==="["&&t[t.length-1]==="]"?t.substring(1,t.length-1).split(",").map(e=>ye(e.trim())):t===""||Number.isNaN(Number(t))?t:Number(t)}function Ht(t=!0,e=window.location.search){const a={},s=t?ye:Kt;return new URLSearchParams(e).forEach((n,r)=>{r&&(a[r]=n?s(n):!0)}),a}var bt={toNativeType:ye,extractURLParameters:Ht},It={IS_START:0,IS_NONE:0,IS_ROTATE:1,IS_PAN:2,IS_SPIN:3,IS_DOLLY:4,IS_CAMERA_POSE:11,IS_WINDOW_LEVEL:1024,IS_SLICE:1025},Ce={States:It},{vtkErrorMacro:jt,VOID:Qt}=v;function Yt(t,e,a,s){return t.getRenderWindow().getViews()[0].worldToDisplay(e,a,s,t)}function Xt(t,e,a,s){return t.getRenderWindow().getViews()[0].displayToWorld(e,a,s,t)}var Zt={computeWorldToDisplay:Yt,computeDisplayToWorld:Xt};function Jt(t,e){e.classHierarchy.push("vtkInteractorObserver");const a={...t};function s(){for(;e.subscribedEvents.length;)e.subscribedEvents.pop().unsubscribe()}function n(){ze.handledEvents.forEach(r=>{t[`handle${r}`]&&e.subscribedEvents.push(e._interactor[`on${r}`](o=>e.processEvents?t[`handle${r}`](o):Qt,e.priority))})}t.setInteractor=r=>{r!==e._interactor&&(s(),e._interactor=r,r&&e.enabled&&n(),t.modified())},t.setEnabled=r=>{r!==e.enabled&&(s(),r&&(e._interactor?n():jt(`
2
2
  The interactor must be set before subscribing to events
3
3
  `)),e.enabled=r,t.modified())},t.computeDisplayToWorld=(r,o,i,u)=>r?e._interactor.getView().displayToWorld(o,i,u,r):null,t.computeWorldToDisplay=(r,o,i,u)=>r?e._interactor.getView().worldToDisplay(o,i,u,r):null,t.setPriority=r=>{a.setPriority(r)&&e._interactor&&(s(),n())}}var qt={enabled:!0,priority:0,processEvents:!0,subscribedEvents:[]};function be(t,e,a={}){Object.assign(e,qt,a),v.obj(t,e),v.event(t,e,"InteractionEvent"),v.event(t,e,"StartInteractionEvent"),v.event(t,e,"EndInteractionEvent"),v.get(t,e,["_interactor","enabled"]),v.setGet(t,e,["priority","processEvents"]),v.moveToProtected(t,e,["interactor"]),Jt(t,e)}var At=v.newInstance(be,"vtkInteractorObserver"),en={newInstance:At,extend:be,...Zt},{States:L}=Ce,ge={Rotate:L.IS_ROTATE,Pan:L.IS_PAN,Spin:L.IS_SPIN,Dolly:L.IS_DOLLY,CameraPose:L.IS_CAMERA_POSE,WindowLevel:L.IS_WINDOW_LEVEL,Slice:L.IS_SLICE};function tn(t,e){e.classHierarchy.push("vtkInteractorStyle"),Object.keys(ge).forEach(a=>{v.event(t,e,`Start${a}Event`),t[`start${a}`]=()=>{e.state===L.IS_NONE&&(e.state=ge[a],e._interactor.requestAnimation(t),t.invokeStartInteractionEvent({type:"StartInteractionEvent"}),t[`invokeStart${a}Event`]({type:`Start${a}Event`}))},v.event(t,e,`End${a}Event`),t[`end${a}`]=()=>{e.state===ge[a]&&(e.state=L.IS_NONE,e._interactor.cancelAnimation(t),t.invokeEndInteractionEvent({type:"EndInteractionEvent"}),t[`invokeEnd${a}Event`]({type:`End${a}Event`}),e._interactor.render())}}),e.getRenderer=a=>e.focusedRenderer||a.pokedRenderer,t.handleKeyPress=a=>{const s=e._interactor;let n=null;switch(a.key){case"r":case"R":e.getRenderer(a).resetCamera(),s.render();break;case"w":case"W":n=e.getRenderer(a).getActors(),n.forEach(r=>{const o=r.getProperty();o.setRepresentationToWireframe&&o.setRepresentationToWireframe()}),s.render();break;case"s":case"S":n=e.getRenderer(a).getActors(),n.forEach(r=>{const o=r.getProperty();o.setRepresentationToSurface&&o.setRepresentationToSurface()}),s.render();break;case"v":case"V":n=e.getRenderer(a).getActors(),n.forEach(r=>{const o=r.getProperty();o.setRepresentationToPoints&&o.setRepresentationToPoints()}),s.render();break}}}var nn={state:L.IS_NONE,handleObservers:1,autoAdjustCameraClippingRange:1};function Ie(t,e,a={}){Object.assign(e,nn,a),en.extend(t,e,a),v.setGet(t,e,["focusedRenderer"]),tn(t,e)}var an=v.newInstance(Ie,"vtkInteractorStyle"),xe={newInstance:an,extend:Ie,...Ce},{States:G}=Ce;function rn(t,e){e.classHierarchy.push("vtkInteractorStyleTrackballCamera"),t.handleMouseMove=a=>{const s=a.position,n=e.getRenderer(a);switch(e.state){case G.IS_ROTATE:t.handleMouseRotate(n,s),t.invokeInteractionEvent({type:"InteractionEvent"});break;case G.IS_PAN:t.handleMousePan(n,s),t.invokeInteractionEvent({type:"InteractionEvent"});break;case G.IS_DOLLY:e.wheelDolly||(t.handleMouseDolly(n,s),t.invokeInteractionEvent({type:"InteractionEvent"}));break;case G.IS_SPIN:t.handleMouseSpin(n,s),t.invokeInteractionEvent({type:"InteractionEvent"});break}e.previousPosition=s},t.handleButton3D=a=>{if(a&&a.pressed&&a.device===De.RightController&&(a.input===ae.Trigger||a.input===ae.TrackPad)){t.startCameraPose();return}a&&!a.pressed&&a.device===De.RightController&&(a.input===ae.Trigger||a.input===ae.TrackPad)&&e.state===G.IS_CAMERA_POSE&&t.endCameraPose()},t.handleMove3D=a=>{e.state===G.IS_CAMERA_POSE&&t.updateCameraPose(a)},t.updateCameraPose=a=>{const s=e.getRenderer(a).getActiveCamera(),n=s.getPhysicalTranslation(),r=.5*.05*s.getPhysicalScale(),o=s.physicalOrientationToWorldDirection([a.orientation.x,a.orientation.y,a.orientation.z,a.orientation.w]);s.setPhysicalTranslation(n[0]+o[0]*r,n[1]+o[1]*r,n[2]+o[2]*r)},t.handleLeftButtonPress=a=>{e.previousPosition=a.position,a.shiftKey?a.controlKey||a.altKey?t.startDolly():t.startPan():a.controlKey||a.altKey?t.startSpin():t.startRotate()},t.handleLeftButtonRelease=()=>{switch(e.state){case G.IS_DOLLY:t.endDolly();break;case G.IS_PAN:t.endPan();break;case G.IS_SPIN:t.endSpin();break;case G.IS_ROTATE:t.endRotate();break}},t.handleStartMouseWheel=()=>{e.wheelDolly=!0,t.startDolly()},t.handleEndMouseWheel=()=>{t.endDolly(),e.wheelDolly=!1},t.handleStartPinch=a=>{e.previousScale=a.scale,t.startDolly()},t.handleEndPinch=()=>{t.endDolly()},t.handleStartRotate=a=>{e.previousRotation=a.rotation,t.startRotate()},t.handleEndRotate=()=>{t.endRotate()},t.handleStartPan=a=>{e.previousTranslation=a.translation,t.startPan()},t.handleEndPan=()=>{t.endPan()},t.handlePinch=a=>{t.dollyByFactor(e.getRenderer(a),a.scale/e.previousScale),e.previousScale=a.scale},t.handlePan=a=>{const s=e.getRenderer(a).getActiveCamera();let n=s.getFocalPoint();n=t.computeWorldToDisplay(e.getRenderer(a),n[0],n[1],n[2]);const r=n[2],o=a.translation,i=e.previousTranslation,u=t.computeDisplayToWorld(e.getRenderer(a),n[0]+o[0]-i[0],n[1]+o[1]-i[1],r),p=t.computeDisplayToWorld(e.getRenderer(a),n[0],n[1],r),c=[];c[0]=p[0]-u[0],c[1]=p[1]-u[1],c[2]=p[2]-u[2],n=s.getFocalPoint();const l=s.getPosition();s.setFocalPoint(c[0]+n[0],c[1]+n[1],c[2]+n[2]),s.setPosition(c[0]+l[0],c[1]+l[1],c[2]+l[2]),e._interactor.getLightFollowCamera()&&e.getRenderer(a).updateLightsGeometryToFollowCamera(),s.orthogonalizeViewUp(),e.previousTranslation=a.translation},t.handleRotate=a=>{const s=e.getRenderer(a).getActiveCamera();s.roll(a.rotation-e.previousRotation),s.orthogonalizeViewUp(),e.previousRotation=a.rotation},t.handleMouseRotate=(a,s)=>{if(!e.previousPosition)return;const n=e._interactor,r=s.x-e.previousPosition.x,o=s.y-e.previousPosition.y,i=n.getView().getViewportSize(a);let u=-.1,p=-.1;i[0]&&i[1]&&(u=-20/i[1],p=-20/i[0]);const c=r*p*e.motionFactor,l=o*u*e.motionFactor,g=a.getActiveCamera();!Number.isNaN(c)&&!Number.isNaN(l)&&(g.azimuth(c),g.elevation(l),g.orthogonalizeViewUp()),e.autoAdjustCameraClippingRange&&a.resetCameraClippingRange(),n.getLightFollowCamera()&&a.updateLightsGeometryToFollowCamera()},t.handleMouseSpin=(a,s)=>{if(!e.previousPosition)return;const n=e._interactor,r=a.getActiveCamera(),o=n.getView().getViewportCenter(a),i=_e(Math.atan2(e.previousPosition.y-o[1],e.previousPosition.x-o[0])),u=_e(Math.atan2(s.y-o[1],s.x-o[0]))-i;Number.isNaN(u)||(r.roll(u),r.orthogonalizeViewUp())},t.handleMousePan=(a,s)=>{if(!e.previousPosition)return;const n=a.getActiveCamera();let r=n.getFocalPoint();r=t.computeWorldToDisplay(a,r[0],r[1],r[2]);const o=r[2],i=t.computeDisplayToWorld(a,s.x,s.y,o),u=t.computeDisplayToWorld(a,e.previousPosition.x,e.previousPosition.y,o),p=[];p[0]=u[0]-i[0],p[1]=u[1]-i[1],p[2]=u[2]-i[2],r=n.getFocalPoint();const c=n.getPosition();n.setFocalPoint(p[0]+r[0],p[1]+r[1],p[2]+r[2]),n.setPosition(p[0]+c[0],p[1]+c[1],p[2]+c[2]),e._interactor.getLightFollowCamera()&&a.updateLightsGeometryToFollowCamera()},t.handleMouseDolly=(a,s)=>{if(!e.previousPosition)return;const n=s.y-e.previousPosition.y,r=e._interactor.getView().getViewportCenter(a),o=e.motionFactor*n/r[1];t.dollyByFactor(a,1.1**o)},t.handleMouseWheel=a=>{const s=1-a.spinY/e.zoomFactor;t.dollyByFactor(e.getRenderer(a),s)},t.dollyByFactor=(a,s)=>{if(Number.isNaN(s))return;const n=a.getActiveCamera();n.getParallelProjection()?n.setParallelScale(n.getParallelScale()/s):(n.dolly(s),e.autoAdjustCameraClippingRange&&a.resetCameraClippingRange()),e._interactor.getLightFollowCamera()&&a.updateLightsGeometryToFollowCamera()}}var sn={motionFactor:10,zoomFactor:10,wheelDolly:!1};function je(t,e,a={}){Object.assign(e,sn,a),xe.extend(t,e,a),v.setGet(t,e,["motionFactor","zoomFactor"]),rn(t,e)}var on=v.newInstance(je,"vtkInteractorStyleTrackballCamera"),cn={newInstance:on,extend:je},{vtkErrorMacro:un}=gt,fe=["setBindGroup","setIndexBuffer","setVertexBuffer","draw","drawIndexed"];function ln(t,e){e.classHierarchy.push("vtkWebGPURenderEncoder"),t.begin=a=>{e.drawCallbacks=[],e.handle=a.beginRenderPass(e.description),e.label&&e.handle.pushDebugGroup(e.label)},t.end=()=>{for(let a=0;a<e.drawCallbacks.length;a++){const s=e.drawCallbacks[a],n=s.pipeline;t.setPipeline(n);for(let r=0;r<s.callbacks.length;r++)s.callbacks[r](t)}e.label&&e.handle.popDebugGroup(),e.handle.end(),e.boundPipeline=null},t.setPipeline=a=>{if(e.boundPipeline===a)return;e.handle.setPipeline(a.getHandle());const s=a.getPipelineDescription(),n=s.fragment?.targets;if(e.colorTextureViews.length!==n.length)console.log(`mismatched attachment counts on pipeline ${n.length} while encoder has ${e.colorTextureViews.length}`),console.trace();else for(let r=0;r<e.colorTextureViews.length;r++){const o=e.colorTextureViews[r].getTexture()?.getFormat();o&&o!==n[r].format&&(console.log(`mismatched attachments for attachment ${r} on pipeline ${n[r].format} while encoder has ${o}`),console.trace())}if(!!e.depthTextureView!="depthStencil"in s)console.log("mismatched depth attachments"),console.trace();else if(e.depthTextureView){const r=e.depthTextureView.getTexture()?.getFormat();r&&r!==s.depthStencil.format&&(console.log(`mismatched depth attachments on pipeline ${s.depthStencil.format} while encoder has ${r}`),console.trace())}e.boundPipeline=a},t.replaceShaderCode=a=>{e.replaceShaderCodeFunction(a)},t.setColorTextureView=(a,s)=>{e.colorTextureViews[a]!==s&&(e.colorTextureViews[a]=s)},t.activateBindGroup=a=>{const s=e.boundPipeline.getDevice(),n=e.boundPipeline.getBindGroupLayoutIndex(a.getLabel());if(n<0){un(`vtkWebGPURenderEncoder: could not find bind group layout ${a.getLabel()}`);return}e.handle.setBindGroup(n,a.getBindGroup(s));const r=s.getBindGroupLayoutDescription(a.getBindGroupLayout(s)),o=s.getBindGroupLayoutDescription(e.boundPipeline.getBindGroupLayout(n));r!==o&&(console.log(`renderEncoder ${e.pipelineHash} mismatched bind group layouts bind group has
4
4
  ${r}
package/dist/index.html CHANGED
@@ -12,8 +12,8 @@
12
12
  href="https://fonts.googleapis.com/css2?family=Share+Tech+Mono&display=swap"
13
13
  rel="stylesheet"
14
14
  />
15
- <script type="module" crossorigin src="./assets/index-QlzdWpod.js"></script>
16
- <link rel="stylesheet" crossorigin href="./assets/index-BizDkoHX.css">
15
+ <script type="module" crossorigin src="./assets/index-BSiKqAGW.js"></script>
16
+ <link rel="stylesheet" crossorigin href="./assets/index-DKs-EoU5.css">
17
17
  </head>
18
18
  <body>
19
19
  <!-- ARGUS's own four sounds, synthesised rather than borrowed
@@ -305,7 +305,8 @@
305
305
  <span class="mode-elbow"></span>
306
306
  <aside class="mode-frame">
307
307
  <button class="strategy-pill universe-projection" title="projection: sculpted 3D or flat schematic">3D</button>
308
- <button class="strategy-pill universe-scale" title="what sizes a sphere: its jobs (log scale) or nothing, shape alone">JOBS</button>
308
+ <button class="strategy-pill universe-view" title="every feed its own molecule, or the shapes folded to one molecule each">FEEDS</button>
309
+ <button class="strategy-pill universe-scale" title="what sizes a sphere: its jobs (log scale) or nothing, every sphere alike">JOBS</button>
309
310
  <button class="strategy-pill universe-refresh" title="ask the session for the space again">REFRESH</button>
310
311
  <button class="strategy-pill universe-open" title="this feed in a RUNS pane of its own">OPEN FEED</button>
311
312
  <button class="strategy-pill universe-back" title="climb out to the whole space (Esc)">BACK</button>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnndsc/argus",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "ARGUS: the LCARS web surface for mise — a browser console over a calypso session",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -1 +0,0 @@
1
- @font-face{font-family:Antonio;src:url(./antonio-latin-400-normal-CZjzwNAN.woff2) format("woff2");font-weight:400;font-display:swap}@font-face{font-family:Antonio;src:url(./antonio-latin-700-normal-DSH-lEDG.woff2) format("woff2");font-weight:700;font-display:swap}html{font-size:22px;color:#fff}:root{--lfw: 168px;--bar-height: 28px;--left-frame-padding: .75rem;--elbow-radius: 100px;--elbow-inner: 60px;--elbow-inner-radius: 44px;--bar-spur: 8px;--bar-spur-lift: 22px;--bar-bite-radius: 8px;--panel-border: 8px solid #000}body{display:flex;flex-direction:row;margin:0;padding:10px 0 0 5px;background-color:#000;color:var(--daybreak);font-family:Antonio,Arial Narrow,Avenir Next Condensed,sans-serif;line-height:1.5}.wrap-all{display:flex;flex-direction:column;flex:1 1 auto;min-width:auto;min-height:auto;width:100%}.wrap{display:flex;flex:1 1 auto;width:100%;padding:0 15px 0 5px;overflow:hidden}#gap.wrap{margin-top:var(--left-frame-padding)}main{display:block;flex:1 1 auto;padding:60px 0 11px 50px}.left-frame{display:flex;flex-direction:column;justify-content:space-between;position:relative;flex:none;width:var(--lfw);background-color:var(--orange);color:#000;text-align:right;font-weight:700;line-height:1.2}.left-frame-top{display:flex;flex-direction:column;flex:none;width:var(--lfw);border-bottom-left-radius:var(--elbow-radius);background-color:var(--october-sunset);color:#000;text-align:right;font-weight:700;line-height:1.2}button[class^=panel-]{display:flex;justify-content:flex-end;width:var(--lfw);padding:var(--left-frame-padding);border:none;border-bottom:8px solid #000;color:#000;text-align:right;font-family:inherit;font-weight:700;font-size:inherit;line-height:1.2;cursor:pointer}button.panel-1{min-height:160px;flex-direction:column;justify-content:space-between;align-items:flex-end;overflow:hidden}button.panel-2{position:relative;flex:1 1 auto;border-bottom:0;border-bottom-left-radius:var(--elbow-radius)}button.panel-3{align-items:flex-end;border-top-left-radius:var(--elbow-radius)}button.panel-7{border-top:8px solid #000;border-bottom:0}button.panel-console,button.panel-lang{border-bottom:8px solid #000}.banner{min-width:0;min-height:0;padding-left:5px;padding-bottom:4.4px;color:var(--honey);text-align:right;text-transform:uppercase;line-height:1.1}.panel-1,.panel-4,.panel-spacer{background-color:var(--orange)}.panel-2,.panel-3,.panel-6{background-color:var(--october-sunset)}.panel-5,.panel-7,.panel-gather{background-color:var(--harvestgold)}.panel-spacer{width:var(--lfw);background-color:var(--orange);color:#000;text-align:right;font-weight:700;line-height:1.2}.hop{font-family:inherit;font-size:inherit;font-weight:700;line-height:1.2;text-align:right}h1{margin:0;font-size:4rem;font-weight:400;letter-spacing:.2em;line-height:1.2;text-align:right;text-transform:uppercase}.right-frame{position:relative;display:flex;flex-direction:column;flex:1 1 auto}.right-frame-top{position:relative;display:block;width:100%}.bar-panel{display:flex;width:100%}.data-cascade-button-group{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:flex-start;min-width:0;min-height:0;padding-bottom:var(--left-frame-padding)}.first-bar-panel{position:relative;margin-top:2.5vh}.bar-1,.bar-2,.bar-3,.bar-4,.bar-5,.bar-6,.bar-7,.bar-8,.bar-9,.bar-10{height:var(--bar-height)}.bar-1,.bar-6{width:10%;background-color:var(--october-sunset);border-right:8px solid #000}.bar-2,.bar-7{width:12%;background-color:var(--orange);border-right:8px solid #000}.bar-3,.bar-8{width:17%;background-color:var(--honey);border-right:8px solid #000}.bar-5,.bar-10{width:5%;background-color:var(--october-sunset);border-left:8px solid #000}.bar-4,.bar-9{position:relative;width:56.0022%;background-color:var(--harvestgold);z-index:-1}.bar-4:before,.bar-9:before,.bar-4:after,.bar-9:after{content:"";position:absolute}.bar-4:before,.bar-9:before{right:60%;width:40%;height:var(--bar-spur);background-color:var(--october-sunset)}.bar-4:before{top:calc(-1 * var(--bar-spur-lift))}.bar-9:before{bottom:calc(-1 * var(--bar-spur-lift))}.bar-4:after,.bar-9:after{right:68%;width:32%;height:48%;background-color:#000;z-index:-1}.bar-4:after{top:52%;border-top-right-radius:var(--bar-bite-radius)}.bar-9:after{bottom:52%;border-bottom-right-radius:var(--bar-bite-radius)}.headtrim,.baseboard{position:fixed;left:0;right:0;height:10px;background-color:#000;z-index:999}.headtrim{top:0}.baseboard{bottom:0}*{box-sizing:border-box}button{margin:0;padding:0;font-family:inherit;font-size:inherit;font-weight:700;line-height:1.5;color:inherit}input,select,textarea{margin:0;padding:0;font-family:inherit;font-size:inherit;line-height:1.5;color:inherit}.argus-input-line input{font-weight:400}a{color:var(--honey);text-decoration:none;text-transform:uppercase;line-height:1.3}.banner a{line-height:1.1}.about-footer a{color:var(--october-sunset);text-transform:none}p{margin:0}label{line-height:1.5}:root{--face-label: "Antonio", sans-serif;--face-data: inherit;--lfw: 168px;--state-done: var(--daybreak);--state-running: var(--orange);--state-error: color-mix(in srgb, #f2402a 80%, var(--october-sunset));--mars: #f2402a}@font-face{font-family:MesloLGS NF;src:url(./MesloLGS-NF-Regular-DAUcZJjt.ttf) format("truetype");font-weight:400;font-display:swap}@font-face{font-family:MesloLGS NF;src:url(./MesloLGS-NF-Bold-DbxbaV6p.ttf) format("truetype");font-weight:700;font-display:swap}@font-face{font-family:Chakra Petch;src:url(./chakra-petch-latin-400-normal-SafcrIr2.woff2) format("woff2");font-weight:400;font-display:swap}@font-face{font-family:Chakra Petch;src:url(./chakra-petch-latin-500-normal-BR1ody1F.woff2) format("woff2");font-weight:500;font-display:swap}@font-face{font-family:Chakra Petch;src:url(./chakra-petch-latin-600-normal-DVQm9bgb.woff2) format("woff2");font-weight:600;font-display:swap}@font-face{font-family:Chakra Petch;src:url(./chakra-petch-latin-700-normal-CnDBPjkL.woff2) format("woff2");font-weight:700;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(./jetbrains-mono-latin-400-normal-V6pRDFza.woff2) format("woff2");font-weight:400;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(./jetbrains-mono-latin-500-normal-BWZEU5yA.woff2) format("woff2");font-weight:500;font-display:swap}#status-strip{display:flex;flex-wrap:wrap;gap:.6rem 1.2rem;margin-bottom:.8rem;font-size:.8rem;letter-spacing:.05em;text-transform:uppercase}#status-strip .readout{color:var(--honey)}#status-strip .readout:empty{display:none}#status-strip .lamp-online{color:#000}#status-strip .mismatch{color:#ff5f5f;font-weight:700}.lamp-online{background:#6f6;color:#000;padding:0 .5rem;border-radius:.6rem}.lamp-host{background:#ffaf00;color:#000;padding:0 .5rem;border-radius:.6rem}#status-strip .lamp-host{color:#000}.lamp-offline{background:var(--state-error);color:var(--butter);padding:0 .5rem;border-radius:.6rem}.wrap:not(#gap),.left-frame{transition:translate .5s cubic-bezier(.22,1,.36,1),margin .5s cubic-bezier(.22,1,.36,1)}body[data-zoom]{height:100dvh;overflow:hidden}body[data-zoom] .wrap:not(#gap){translate:0 calc(-1 * var(--zoom-header-height, 100vh));margin-bottom:calc(-1 * var(--zoom-header-height, 0px))}body[data-zoom] .left-frame,body[data-gutter=away] .left-frame{translate:calc(-100% - 20px) 0;margin-right:calc(-1 * var(--lfw))}#gutter-restore{display:none}body[data-gutter=away] #gutter-restore{display:block;position:fixed;left:0;top:20%;bottom:20%;width:12px;z-index:1000;border-radius:0 6px 6px 0;background-color:var(--october-sunset);cursor:pointer;animation:beckon 3.5s ease-in-out infinite}#gutter-restore:hover{animation:none;background-color:var(--harvestgold);box-shadow:0 0 8px color-mix(in srgb,var(--harvestgold) 60%,transparent)}#drawer{transition:height .5s cubic-bezier(.22,1,.36,1)}#drawer.drawer-dragging{transition:none}body[data-zoom=console] #drawer{height:auto!important;flex:1 1 auto;min-height:0}body[data-zoom=console] main{display:none}body[data-zoom]:not([data-zoom=console]) #drawer{height:0!important}body[data-zoom] .pane-zoomed .files-panel{max-height:calc(100dvh - 7rem)}.lcars-bar-zoom{width:40px;height:28px;background-color:var(--butter);margin-left:.5rem;cursor:pointer}.lcars-bar-zoom:hover{filter:brightness(1.18)}body[data-zoom=console] #drawer .lcars-bar-zoom{background-color:var(--october-sunset)}.files-header-bar{margin:.2rem 0 .5rem}.pane-zoomed .files-header-bar .lcars-bar-zoom{background-color:var(--october-sunset)}.lcars-bar-split{width:28px;height:28px;margin-left:.5rem;cursor:pointer;background:linear-gradient(to right,var(--pumpkin-pie) 45%,transparent 45%,transparent 55%,var(--pumpkin-pie) 55%)}.lcars-bar-split.lcars-split-row{background:linear-gradient(to bottom,var(--pumpkin-pie) 45%,transparent 45%,transparent 55%,var(--pumpkin-pie) 55%)}.lcars-bar-split:hover{filter:brightness(1.4);box-shadow:0 0 10px var(--pumpkin-pie)}.pane-handle{cursor:pointer}.pane-handle:hover .lcars-bar-end{filter:brightness(1.25)}.pane-drawer{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;padding:.35rem .6rem;margin:-.3rem 0 .5rem;background-color:#00000059;border-left:6px solid var(--pumpkin-pie);border-radius:0 12px 12px 0}.pane-drawer[hidden]{display:none}.pane-drawer button:focus{outline:2px solid var(--butter);outline-offset:2px;box-shadow:0 0 8px var(--butter)}.pane-drawer .drawer-children{display:inline-flex;gap:.4rem}.drawer-group{display:inline-flex;align-items:center;gap:.4rem}.drawer-group+.drawer-group{margin-left:.7rem;padding-left:.7rem;border-left:2px solid color-mix(in srgb,var(--harvestgold) 35%,transparent)}.drawer-group:empty{display:none}.drawer-label{color:var(--harvestgold);font-family:var(--face-label);font-size:.7rem;letter-spacing:.14em;margin-right:.1rem}.drawer-structure .pacs-capsule{background-color:var(--harvestgold);color:#000}.drawer-binding .drawer-bind,.drawer-binding .drawer-cwdbind{background-color:#ffeecc38;color:var(--butter)}.drawer-binding .drawer-label-cwd{margin-left:.5rem}.drawer-binding .drawer-bind.drawer-bind-selected,.drawer-binding .drawer-cwdbind.drawer-bind-selected{background-color:var(--butter);color:#000;box-shadow:0 0 8px #fec9}.drawer-children .drawer-child{background-color:var(--orange);color:#000}.drawer-children .drawer-child.drawer-destructive{background-color:#d22;color:var(--butter)}.pane-zoomed .pane-drawer .drawer-zoom{background-color:var(--butter)}.pane-view .view-body{flex:1 1 0;min-height:0;overflow:auto}#pacs-workspace{--roster-gap: .8rem;--roster-pad: 6px;display:flex;flex-direction:column;height:100%;overflow:auto;scrollbar-gutter:stable;min-width:0;min-height:0}.workspace-pane{display:none}.layout-leaf>.workspace-pane{display:flex;flex-direction:column;flex:1;min-width:0;min-height:0;overflow:hidden}.roster-order{position:sticky;top:0;z-index:2;background:#000}.files-panel>.roster-order{position:static;z-index:auto;flex:none}.files-body{--roster-gap: 0px;--roster-pad: 0px}.dag-roster{--roster-gap: .8rem;--roster-pad: 6px}.roster-caps{display:grid;grid-template-columns:var(--roster-cols);column-gap:var(--roster-gap);padding:0 calc(var(--roster-pad) + var(--elbow-clear, 0px)) 0 var(--roster-pad);margin:.2rem 0 .45rem;font-size:.8rem}.roster-cap{min-width:0;height:24px;margin-right:calc(3px - var(--roster-gap));border:none;border-radius:0;background-color:var(--harvestgold);color:#000;font-family:var(--face-label);font-size:.66rem;letter-spacing:.12em;text-align:left;padding:0 .15rem;cursor:pointer}.pane-dag .roster-cap[data-key=id],.files-body .roster-cap[data-key=size],.files-body .roster-cap[data-key=owner],.files-body .roster-cap[data-key=date]{text-align:right}.roster-cap:first-of-type{border-radius:9px 0 0 9px;padding-left:.7rem}.roster-cap:last-of-type{border-radius:0 9px 9px 0;padding-right:.7rem;margin-right:0}.roster-cap:nth-of-type(3n+2),.mode-frame .strategy-pill:nth-of-type(3n+2){background-color:var(--daybreak)}.roster-cap:nth-of-type(3n+3),.mode-frame .strategy-pill:nth-of-type(3n+3){background-color:var(--orange)}.roster-cap.roster-active{background-color:var(--butter)}.roster-filter[hidden]{display:none}.roster-filter{display:flex;align-items:stretch;height:26px;margin:0 0 .4rem;background:#000}.roster-filter-glyph{display:flex;align-items:center;padding:0 .8rem 0 1rem;background:var(--harvestgold);color:#000;font-family:var(--face-label);font-size:.7rem;letter-spacing:.12em;border-radius:13px 0 0 13px}.roster-filter-input{flex:1;background:transparent;border:none;border-bottom:2px solid var(--pumpkin-pie);outline:none;padding:0 .7rem;color:var(--butter);font-family:Share Tech Mono,monospace;font-size:.74rem}.pane-mode{margin-left:auto;font-family:Share Tech Mono,monospace;font-size:.6rem;letter-spacing:.06em;text-transform:none;opacity:.85}.pane-mode:empty{display:none}.pane-legend .legend-swatch{display:inline-block;width:.55rem;height:.55rem;margin:0 .25rem 0 0;border-radius:2px;vertical-align:-1px}.pane-state{margin-left:1rem;font-family:Share Tech Mono,monospace;font-size:.6rem;letter-spacing:.06em;text-transform:none;opacity:.85}.pane-state.state-live{color:var(--harvestgold);opacity:1}.pane-state.state-settled{opacity:.7}.pane-state.state-stale{color:color-mix(in srgb,var(--orange) 40%,#000);opacity:1;text-decoration:underline dotted}.pane-state.state-wait{color:var(--butter);opacity:1}.left-frame-top .panel-1{flex-direction:column;align-items:flex-end;justify-content:space-between}.brand-mark{width:4.2rem;aspect-ratio:111 / 78;background-color:#000;mask:url(./ChRISlogo-color-t-i99soF.svg) no-repeat center / contain;-webkit-mask:url(./ChRISlogo-color-t-i99soF.svg) no-repeat center / contain}.left-frame>div:first-child{position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column}.left-frame>div:first-child:before{content:"";position:absolute;top:0;left:0;width:var(--elbow-radius);height:var(--elbow-radius);background-color:#000}.right-frame-top:before,.right-frame-top:after,.right-frame:before,.right-frame:after{content:"";position:absolute;left:0;z-index:-1;width:var(--elbow-inner);height:var(--elbow-inner)}.right-frame-top:before,.right-frame-top:after{bottom:var(--bar-height)}.right-frame:before,.right-frame:after{top:var(--bar-height)}.right-frame-top:before{background-image:linear-gradient(to right top,var(--october-sunset) 50%,#000 50%)}.right-frame-top:after{background-color:#000;border-bottom-left-radius:var(--elbow-inner-radius)}.right-frame:before{background-image:linear-gradient(to right bottom,var(--october-sunset) 50%,#000 50%)}.right-frame:after{background-color:#000;border-top-left-radius:var(--elbow-inner-radius)}body[data-zoom] .right-frame:before,body[data-zoom] .right-frame:after,body[data-zoom] .right-frame-top:before,body[data-zoom] .right-frame-top:after,body[data-gutter=away] .right-frame:before,body[data-gutter=away] .right-frame:after,body[data-gutter=away] .right-frame-top:before,body[data-gutter=away] .right-frame-top:after{display:none}.left-frame button[class^=panel-],.left-frame .panel-spacer{position:relative}.left-frame .panel-3{height:auto;max-height:none;flex:3 1 0;min-height:3.5rem}.left-frame .panel-4{height:auto;min-height:3rem;flex:2 1 0}.left-frame .panel-5{height:auto;flex:4 1 0;min-height:3rem}.left-frame .panel-6{height:auto;flex:2 1 0;min-height:3rem}.left-frame .panel-spacer{height:auto;flex:1 1 0;min-height:.8rem}.left-frame .panel-7{height:clamp(3.5rem,12vh,30vh)}html,body{height:100dvh}body{overflow:hidden}.wrap-all{height:100%;display:flex;flex-direction:column}.wrap-all>.wrap{width:100%}.wrap:not(#gap){flex:none}#gap{flex:1;min-height:0}.right-frame{display:flex;flex-direction:column;min-height:0}.bar-panel{flex:none}main{flex:1;min-height:0;display:flex;flex-direction:column}#status-strip{flex:none}#layout-root{flex:1;min-height:0}#layout-root>.layout-split,#layout-root>.layout-leaf{height:100%}.layout-split{min-height:0}.layout-leaf{display:flex;min-height:0}#pacs-form{display:grid;grid-template-columns:var(--roster-cols);align-items:end;column-gap:var(--roster-gap);padding:0 calc(var(--roster-pad) + var(--elbow-clear, 0px)) 0 var(--roster-pad);margin:.3rem 0 .5rem;font-size:.8rem}#pacs-form label{display:flex;flex-direction:column;gap:.15rem;min-width:0;color:var(--honey);font-family:var(--face-label);font-size:.66rem;letter-spacing:.12em}#pacs-form .pacs-form-gutter,#pacs-form .pacs-form-blank{min-width:0}#pacs-form #pacs-run{min-width:0;justify-self:stretch}#pacs-form input{min-width:0;width:100%}#pacs-form input{background:#000;border:1px solid var(--pumpkin-pie);border-radius:.4rem;color:var(--butter);font-family:Share Tech Mono,monospace;font-size:.8rem;padding:.15rem .5rem;outline:none}#pacs-form input:focus,#pacs-command:focus{border-color:var(--harvestgold);box-shadow:0 0 6px #fa46}#pacs-commandline{display:flex;gap:.6rem;margin-bottom:.6rem}#pacs-command{flex:1;background:#000;border:1px solid var(--pumpkin-pie);border-radius:.4rem;color:var(--daybreak);font-family:Share Tech Mono,monospace;font-size:.85rem;padding:.2rem .6rem;outline:none}.pacs-capsule{border:none;border-radius:.8rem;padding:.1rem .9rem;background-color:var(--harvestgold);color:#000;font-family:var(--face-label);font-weight:700;font-size:.7rem;letter-spacing:.1em;cursor:pointer}.pacs-capsule-off{background-color:color-mix(in srgb,var(--harvestgold) 28%,transparent);color:var(--honey)}.pacs-capsule:hover{filter:brightness(1.3);box-shadow:0 0 8px var(--harvestgold)}.pacs-capsule:active{background-color:color-mix(in srgb,var(--harvestgold) 45%,#000);color:var(--butter);filter:none;box-shadow:none}.pacs-capsule:disabled{opacity:.35;cursor:default}.pacs-provenance{display:block;max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-align:right;padding-right:.6rem;color:var(--honey);font-family:var(--face-label);font-size:.66rem;letter-spacing:.12em}.pacs-capsule.pacs-capsule-requery{background-color:var(--october-sunset);color:#000}.pacs-capsule.pacs-capsule-requery:hover{box-shadow:0 0 8px var(--october-sunset)}.pacs-listing{position:relative;display:flex;flex-direction:column;flex:1 1 0;min-height:0;padding-right:var(--spine-w);margin-bottom:.6rem}#pacs-results{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:hidden;padding-top:calc(var(--rule-h) + .3rem)}#pacs-results>.roster-order{position:static;z-index:auto;flex:none}#pacs-results>.listing-field{flex:1 1 auto;padding-right:.5rem}.pacs-study{margin-bottom:.7rem}.pacs-study-row{padding-block:3px;color:var(--orange);border-bottom:2px solid var(--orange);cursor:pointer}.pacs-study-row:hover{background:color-mix(in srgb,var(--harvestgold) 12%,transparent)}.pacs-study-row>span{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pacs-study-patient,.pacs-study-desc{color:var(--butter)}.pacs-study-mrn,.pacs-study-accession{color:var(--harvestgold)}.pacs-study-date,.pacs-study-modalities,.pacs-study-server,.pacs-study-count{color:var(--pumpkin-pie)}#pacs-results .listing-level[data-depth="2"]{font-size:.8rem;padding-left:1.4em}#pacs-results .listing-level[data-depth="2"] .roster-caps{margin:.35rem 0 .3rem}.pacs-series{padding-block:2px}.pacs-series:hover{background:color-mix(in srgb,var(--harvestgold) 12%,transparent)}.pacs-series-desc{color:var(--butter);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pacs-series-modality{color:var(--harvestgold)}.pacs-series-files{color:var(--pumpkin-pie);text-align:right}#pacs-results .roster-cap[data-key=files]{text-align:right}.pacs-badge{display:grid;grid-template-columns:1fr 9.5em;align-items:center;gap:.4rem;min-width:0;font-size:.7rem;color:var(--honey)}.pacs-badge:not(:has(>.listing-progress,>.pacs-bar-full,>.pacs-bar)){grid-template-columns:1fr}.pacs-badge .listing-progress,.pacs-badge .pacs-bar{min-width:0}.pacs-badge-note{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pacs-badge[data-state=running]{color:var(--state-running)}.pacs-badge[data-state=done]{color:var(--state-done)}.pacs-badge[data-state=error]{color:var(--state-error)}.pacs-badge[data-state=unconfirmed]{color:var(--honey)}.pane-gather{display:flex;flex-direction:column;min-height:0}.gather-listing{--roster-gap: .8rem;--roster-pad: 6px;position:relative;display:flex;flex-direction:column;flex:1 1 0;min-height:0;padding-right:var(--spine-w)}.gather-rows{display:flex;flex-direction:column;flex:1 1 0;min-height:0;overflow-y:auto}.gather-cohort-name{color:var(--harvestgold);font-weight:700}.gather-series-desc{color:var(--butter)}.gather-series-state{color:var(--honey);text-transform:uppercase;font-size:.75rem}#layout-root{width:100%}#layout-root.layout-arrive{animation:layout-arrive .45s cubic-bezier(.22,1,.36,1)}@keyframes layout-arrive{0%{transform:translate(60px);opacity:0}to{transform:translate(0);opacity:1}}.layout-split{display:flex;width:100%;min-width:0}.layout-col{flex-direction:row}.layout-row{flex-direction:column}.layout-leaf{min-width:0;overflow:hidden;border-radius:4px}.layout-leaf.pane-focused{position:relative}.layout-leaf.pane-focused:after{content:"";position:absolute;inset:0;pointer-events:none;z-index:20;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--harvestgold) 45%,transparent)}.layout-divider{flex:none;background:var(--pumpkin-pie);opacity:.35;border-radius:3px}.layout-col>.layout-divider{width:6px;margin:0 4px;cursor:col-resize}.layout-row>.layout-divider{height:6px;margin:4px 0;cursor:row-resize}.layout-divider:hover{opacity:1;background:var(--harvestgold);box-shadow:0 0 8px color-mix(in srgb,var(--harvestgold) 60%,transparent)}.dag-canvas{flex:1 1 0;min-height:0;overflow:hidden;position:relative}.node-overlay{position:absolute;inset:0;z-index:4;display:flex;flex-direction:column;background:#000000eb;border-left:6px solid var(--harvestgold);opacity:0;transition:opacity .3s ease;overflow:hidden}.node-overlay-open{opacity:1}.node-overlay-header{display:flex;justify-content:space-between;gap:.6rem;padding:.3rem .6rem;color:var(--harvestgold);font-size:.72rem;letter-spacing:.08em;border-bottom:1px solid var(--pumpkin-pie);white-space:nowrap;overflow:hidden}.node-overlay-hint{color:var(--butter);opacity:.7}.node-overlay-body{flex:1;min-height:0;padding:.4rem 0 0 .6rem}.dag-node-tip{position:absolute;z-index:5;pointer-events:none;padding:.15rem .55rem;background:#000000d9;border:1px solid var(--pumpkin-pie);border-radius:.6rem .2rem;color:var(--butter);font-size:.72rem;letter-spacing:.06em;text-transform:uppercase;white-space:nowrap}.dag-canvas canvas,.universe-canvas canvas{display:block;width:100%!important;height:100%!important}.universe-canvas{flex:1 1 0;min-height:0;overflow:hidden;position:relative}body[data-zoom]:not([data-zoom=console]) .layout-leaf:not(.pane-zoomed),body[data-zoom]:not([data-zoom=console]) .layout-divider{display:none}body[data-zoom]:not([data-zoom=console]) .pane-zoomed-path,body[data-zoom]:not([data-zoom=console]) .pane-zoomed{flex:1 1 100%!important;width:100%!important;height:100%!important}body[data-zoom]:not([data-zoom=console]) .pane-zoomed-path>:not(.pane-zoomed,.pane-zoomed-path,.layout-divider){display:none}.dag-facts{position:absolute;left:.6rem;bottom:.5rem;z-index:3;max-width:46%;padding:.25rem .6rem;font-size:.75rem;background:#000000b8;border-left:4px solid var(--harvestgold);border-radius:0 10px 10px 0}.dag-facts:empty{display:none}.dag-subway{display:flex;align-items:flex-start;margin-top:.5rem;padding-bottom:.1rem}.subway-step{display:flex;flex-direction:column;align-items:center;gap:.2rem;flex:none;margin-top:0}.subway-stop{width:10px;height:10px;border-radius:50%;border:1px solid var(--pumpkin-pie);background:transparent;flex:none}.subway-label{font-family:var(--face-label);font-size:.5rem;letter-spacing:.06em;line-height:1;color:var(--pumpkin-pie);white-space:nowrap}.subway-step-here .subway-label{color:var(--orange);font-weight:700}.subway-step:has(.subway-passed) .subway-label,.subway-step:has(.subway-done) .subway-label{color:var(--harvestgold)}.subway-step:has(.subway-failed) .subway-label{color:var(--state-error)}.subway-step-here .subway-stop{width:13px;height:13px;margin-top:-1.5px}.subway-stop.subway-passed{background:var(--harvestgold);border-color:var(--harvestgold)}.subway-stop.subway-here{background:var(--orange);border-color:var(--orange);box-shadow:0 0 7px var(--orange)}.subway-stop.subway-terminal.subway-done{background:var(--butter);border-color:var(--butter)}.subway-stop.subway-terminal.subway-failed{background:var(--state-error);border-color:var(--state-error);box-shadow:0 0 7px var(--state-error)}.subway-link{height:2px;flex:1 1 8px;min-width:10px;margin-top:4px;background:#cc550073}.subway-link.subway-passed{background:var(--harvestgold)}.dag-roster{display:none;position:relative;flex:1 1 0;min-height:0;padding-right:var(--spine-w)}.dag-roster.roster-shown{display:flex;flex-direction:column}.dag-feedlist{display:none;flex:1 1 0;min-height:0;flex-direction:column;overflow:hidden;font-size:.8rem}.dag-feedlist>.roster-order{position:static;z-index:auto;flex:none}.dag-feedlist .roster-order{margin-bottom:calc(var(--rule-h) + .3rem)}.feedlist-loading{padding:.5rem .6rem;color:var(--harvestgold);letter-spacing:.12em;animation:roster-breathe 1.2s ease-in-out infinite}.feedlist-refusal{padding:.5rem .9rem .15rem;color:var(--honey);font-family:var(--face-label);font-size:.72rem;letter-spacing:.08em;text-transform:uppercase}.feedlist-warming{padding:.15rem .9rem .5rem;color:var(--daybreak);font-family:Share Tech Mono,monospace;font-size:.7rem}@keyframes roster-breathe{0%,to{opacity:.35}50%{opacity:1}}.feedlist-row:hover{background:color-mix(in srgb,var(--harvestgold) 18%,transparent)}.feedlist-row.feedlist-arrived .feedlist-id,.feedlist-row.feedlist-arrived .feedlist-title{animation:roster-breathe 1.6s ease-in-out infinite}.feedlist-id{color:var(--daybreak);text-align:right}.feedlist-title{color:var(--butter);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.feedlist-status{color:var(--honey);font-size:.7rem}.feedlist-finishedWithError .feedlist-status,.feedlist-cancelled .feedlist-status{color:var(--state-error)}.feedlist-started .feedlist-status,.feedlist-running .feedlist-status{color:var(--orange)}.feedlist-owner,.feedlist-created{color:var(--daybreak);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}*{scrollbar-width:thin;scrollbar-color:var(--harvestgold) #000}*::-webkit-scrollbar{width:7px;height:7px}*::-webkit-scrollbar-track{background:#000}*::-webkit-scrollbar-thumb{background:var(--harvestgold);border-radius:4px}*::-webkit-scrollbar-button{display:none;height:0}.files-body,.image-body,.tags-body,.dag-canvas,.universe-canvas,.dag-roster,.gather-listing,.header-gather-field,.files-table-field,.pacs-listing{--frame-top: var(--mode-frame-top, 0px);--spine-w: 21px;--rule-h: 6px;--bar-w: 7.2rem;--elbow-h: 30px;--elbow-clear: 36px}.workspace-pane[data-modes=open] .files-body,.workspace-pane[data-modes=open] .image-body,.workspace-pane[data-modes=open] .tags-body,.workspace-pane[data-modes=open] .dag-canvas,.workspace-pane[data-modes=open] .dag-roster,.workspace-pane[data-modes=open] .gather-listing,.workspace-pane[data-modes=open] .files-table-field,.workspace-pane[data-modes=open] .pacs-listing,.header-gather-field[data-modes=open]{--spine-w: var(--bar-w)}.header-gather-field[data-modes=open] .mode-frame{visibility:visible;opacity:1;transition:opacity .12s ease-out .16s,visibility 0s linear .16s}.field-rule{position:absolute;top:var(--frame-top);left:0;right:var(--spine-w);height:var(--rule-h);background-color:var(--harvestgold);transition:right .22s ease-out;z-index:4;pointer-events:none}.mode-strip{color:#000;position:absolute;top:var(--frame-top);right:0;bottom:0;width:var(--spine-w);margin:0;padding:0;border:none;border-radius:0 22px 4px 4px;background-color:var(--harvestgold);cursor:pointer;transition:width .22s ease-out;z-index:4}.mode-strip:hover{filter:brightness(1.18)}.mode-elbow{position:absolute;top:var(--frame-top);right:0;width:calc(var(--spine-w) + var(--elbow-clear));height:var(--elbow-h);background-color:var(--harvestgold);border-top-right-radius:22px;transition:width .22s ease-out;z-index:5;pointer-events:none}.mode-elbow:after{content:"";position:absolute;left:0;bottom:0;width:var(--elbow-clear);height:calc(var(--elbow-h) - var(--rule-h));background-color:#000;border-top-right-radius:12px}.mode-frame{position:absolute;top:calc(var(--frame-top) + var(--elbow-h) + 3px);right:0;bottom:0;width:var(--spine-w);display:flex;flex-direction:column;gap:3px;background-color:#000;visibility:hidden;opacity:0;transition:opacity .12s ease-out,visibility 0s linear .12s;z-index:5;overflow-y:auto;scrollbar-width:thin}.workspace-pane[data-modes=open] .mode-frame{visibility:visible;opacity:1;transition:opacity .12s ease-out .16s,visibility 0s linear .16s}.mode-frame .strategy-pill{flex:none;width:100%;min-width:0;height:1.6rem;line-height:1.6rem;margin:0;padding:0 .6rem 0 .4rem;border:none;border-radius:0;background-color:var(--harvestgold);color:#000;text-align:right}.mode-frame .strategy-pill:hover{filter:brightness(1.18)}.mode-fill{flex:1 1 0;min-height:1rem;background-color:var(--daybreak);border-radius:0 0 4px 4px;cursor:pointer}.mode-fill:hover{filter:brightness(1.18)}.mode-frame .strategy-pill.rail-off{background-color:color-mix(in srgb,var(--harvestgold) 30%,transparent);color:var(--honey)}.mode-frame .strategy-pill.rail-na{background-color:color-mix(in srgb,var(--harvestgold) 30%,transparent);color:var(--honey);text-decoration:line-through}.files-body.content-view>.field-rule,.files-body.content-view>.mode-strip,.files-body.content-view>.mode-elbow,.files-body.content-view>.mode-frame,.dag-canvas:has(>.node-overlay)>.field-rule,.dag-canvas:has(>.node-overlay)>.mode-strip,.dag-canvas:has(>.node-overlay)>.mode-elbow,.dag-canvas:has(>.node-overlay)>.mode-frame{display:none}.strategy-pill{border:none;border-radius:.7rem;padding:0 .7rem;background-color:#000;color:var(--harvestgold);font-family:var(--face-label);font-weight:700;font-size:.65rem;letter-spacing:.1em;cursor:pointer}.strategy-pill:hover{filter:brightness(1.18)}#header-dag{gap:2rem}body:not([data-header]) #header-dag,body[data-header=dag] #header-dag{display:flex}#pipeline-cycler{position:relative;flex:0 1 30%;min-width:10rem;height:7.5rem}#header-dag-info{flex:1 1 68%;min-width:0;font-family:Share Tech Mono,monospace;font-size:.72rem}#index-instrument{column-span:all;margin-bottom:.35rem}#index-instrument .index-row{margin-bottom:.15rem}#index-instrument .index-bar{flex:0 1 16rem;min-width:6rem}#index-instrument .status-degraded .telemetry-value{color:var(--state-error)}#index-instrument .index-verb{flex:none;margin-left:.4rem;background-color:var(--state-error);color:var(--butter)}#about-rows{columns:3;column-gap:2rem}#pipeline-cycler canvas{display:block;width:100%!important;height:100%!important}#pipeline-cycler-name{position:absolute;bottom:.2rem;left:.6rem;color:var(--pumpkin-pie);font-family:var(--face-label);font-size:.65rem;letter-spacing:.12em;text-transform:uppercase}.files-panel{flex:1 1 0;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden}.status-degraded{color:var(--state-error)}.listing-progress{display:block;position:relative;height:.45rem;min-width:2rem;border-radius:.25rem;background:color-mix(in srgb,var(--pumpkin-pie) 22%,transparent);overflow:hidden}.listing-progress-idle{background:transparent;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--harvestgold) 60%,transparent)}.listing-progress-fill{display:block;height:100%;border-radius:.25rem;transition:width .25s linear}.listing-progress-running .listing-progress-fill{background:var(--state-running)}.listing-progress-done .listing-progress-fill{background:var(--pumpkin-pie)}.listing-progress-failed .listing-progress-fill{background:var(--state-error)}.listing-index-cell{display:flex;align-items:center;padding-inline-end:.5rem}.listing-index{box-sizing:border-box;min-width:4.4rem;padding:.05rem .45rem;border-radius:.7rem;font:600 .78rem/1.3 var(--lcars-font, inherit);letter-spacing:.04em;text-align:center;color:#ffffff61;background:#ffffff0f}.listing-index.numbered{color:#000;background:var(--listing-index-hue, var(--butter))}.pane-files{--listing-index-hue: var(--harvestgold)}.pane-pacs,.pacs-panel,[class*=pacs-]{--listing-index-hue: var(--daybreak)}.pane-gather,.gather-rows,#header-gather{--listing-index-hue: var(--butter)}.pane-dag,.pane-tags{--listing-index-hue: var(--harvestgold)}.listing-actions{--listing-action-height: 1.35rem;box-sizing:border-box;display:flex;gap:.4rem;align-items:center;min-height:var(--listing-action-height)}.listing-action{box-sizing:border-box;height:var(--listing-action-height);border:none;border-radius:.8rem;padding:.1rem .9rem;background:var(--harvestgold);color:#000;font-family:var(--face-label);font-weight:700;font-size:.7rem;letter-spacing:.1em;cursor:pointer}.listing-action:hover:not(:disabled){filter:brightness(1.3);box-shadow:0 0 8px var(--harvestgold)}.listing-action:active:not(:disabled),.listing-action-selected:not(:disabled){background:color-mix(in srgb,var(--harvestgold) 42%,#000);color:var(--butter);filter:none;box-shadow:none}.listing-action-selected:hover:not(:disabled){filter:brightness(1.2);box-shadow:0 0 8px color-mix(in srgb,var(--harvestgold) 60%,transparent)}.listing-action:disabled{opacity:.35;cursor:default}.listing-readout{color:var(--honey);font-size:.7rem;letter-spacing:.06em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.files-row-indicated .files-name,.files-row-indicated .files-glyph,.feedlist-row.listing-indicated .feedlist-title,.feedlist-row.listing-indicated .feedlist-id{color:var(--butter);text-shadow:0 0 8px rgb(255 238 204 / 60%)}.listing-row{display:grid;grid-template-columns:var(--roster-cols);align-items:center;column-gap:var(--roster-gap);padding:2px calc(var(--roster-pad) + var(--elbow-clear, 0px)) 2px var(--roster-pad);font-size:.8rem}.listing-row>span{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.listing-row>.listing-actions{padding-block:0}.listing-activatable{cursor:pointer}.listing-group{display:block}.listing-level{padding-left:0}.listing-indicated>span:first-child,.listing-indicated>span:nth-child(2){color:var(--butter);text-shadow:0 0 8px rgb(255 238 204 / 60%)}.listing-selected>span{color:var(--butter)}.mode-frame .listing-zone{display:flex;flex-direction:column;gap:3px;margin-top:.75rem}.mode-frame .listing-zone[hidden]{display:none}.mode-frame .listing-zone .listing-action{flex:none;width:100%;min-width:0;height:auto;min-height:1.6rem;line-height:1.2;margin:0;padding:.2rem .6rem .2rem .4rem;border-radius:0;font-size:.65rem;text-align:right;white-space:normal;overflow-wrap:anywhere}.mode-frame .listing-zone .listing-readout{padding:.1rem .6rem 0 .4rem;text-align:right;white-space:normal;overflow:visible;line-height:1.25}.listing-framed .listing-indicated{background:var(--harvestgold);margin-right:-.5rem;padding-right:calc(var(--roster-pad) + var(--elbow-clear, 0px) + .5rem)}.listing-framed .listing-indicated>span,.listing-framed .listing-indicated>span:first-child,.listing-framed .listing-indicated>span:nth-child(2){color:#000;text-shadow:none}.listing-framed .listing-indicated .files-name{font-weight:700}.listing-framed .listing-indicated .listing-progress{background:#00000047}.listing-framed .listing-indicated .listing-progress-idle{background:transparent;box-shadow:inset 0 0 0 1px #0000008c}.listing-framed .listing-indicated .listing-progress-fill,.listing-framed .listing-indicated .pacs-bar-full{background:#000}.listing-framed .listing-indicated .pacs-badge,.listing-framed .listing-indicated .pacs-badge[data-state]{color:#000}.listing-framed:not(.listing-selecting):has(.listing-indicated) .listing-row:not(.listing-indicated):not(.files-lead-up){opacity:.25;transition:opacity .12s ease-out}.listing-framed:not(.listing-selecting):has(.listing-indicated) .listing-row:not(.listing-indicated):not(.files-lead-up):hover{opacity:1}.files-row.files-denied{opacity:.55}.files-row.files-denied .files-glyph{color:var(--state-error)}.files-row.files-denied .files-name{text-decoration:line-through;text-decoration-color:color-mix(in srgb,var(--state-error) 70%,transparent)}.files-content-refused{color:var(--state-error)}.files-refused{padding:.6rem .2rem}.files-refused-lede{margin:0 0 .4rem;color:var(--state-error);font-family:var(--face-label);font-weight:700;letter-spacing:.12em}.files-refused-said{margin:0;color:var(--daybreak);font-family:Share Tech Mono,monospace;font-size:.8rem;white-space:pre-wrap;opacity:.9}.listing-field{flex:1 1 0;min-height:0;overflow-y:auto}.files-panel>.listing-field{padding-right:.5rem}.empty-shortcuts{display:flex;gap:.6rem;margin:.3rem 0 .6rem}.empty-promptline{display:flex;margin-bottom:.6rem}.empty-prompt{flex:1;background:#000;border:1px solid var(--pumpkin-pie);border-radius:.4rem;color:var(--daybreak);font-family:Share Tech Mono,monospace;font-size:.85rem;padding:.2rem .6rem;outline:none}.empty-prompt:focus{border-color:var(--harvestgold);box-shadow:0 0 6px color-mix(in srgb,var(--harvestgold) 40%,transparent)}.empty-result{flex:1 1 0;min-height:0;overflow:auto;font-family:Share Tech Mono,monospace;font-size:.8rem;color:var(--daybreak);white-space:pre-wrap}.files-empty{color:var(--honey);opacity:.6;font-size:.8rem;letter-spacing:.08em}.files-listing{margin-bottom:1rem;overflow-x:auto}.files-path{position:sticky;top:0;z-index:2;background:#000;color:var(--orange);font-weight:700;letter-spacing:.05em;padding-bottom:.2rem;margin-bottom:calc(var(--rule-h, 6px) + .4rem);font-size:.9rem;min-width:0;overflow-wrap:anywhere;word-break:break-word}.files-content-header{position:static;border-bottom:2px solid var(--orange);margin-bottom:.3rem}.files-row>span{padding:2px 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.files-glyph{font-family:MesloLGS NF,Inconsolata,monospace;font-size:.95rem;line-height:1;color:var(--console-white, var(--butter))}.files-glyph-dir,.files-type-dir .files-name{color:var(--console-yellow, var(--harvestgold));font-weight:700}.files-glyph-file,.files-type-file .files-name{color:var(--console-white, var(--butter))}.files-glyph-link,.files-type-link .files-name{color:var(--console-cyan, var(--daybreak))}.files-glyph-plugin,.files-type-plugin .files-name{color:var(--console-green, var(--honey));font-weight:700}.files-glyph-pipeline,.files-type-pipeline .files-name{color:var(--console-magenta, var(--honey));font-weight:700}.files-glyph-vfs,.files-type-vfs .files-name{color:var(--console-magenta, var(--harvestgold));font-weight:700}.files-glyph-job,.files-type-job .files-name{color:var(--console-cyan, var(--harvestgold));font-weight:700}.files-name{color:var(--console-white, var(--butter))}.files-version{color:var(--console-white, var(--butter));font-variant-numeric:tabular-nums}.files-run-strip{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem .6rem;min-width:0;padding:.3rem var(--roster-pad, 6px) .4rem;margin-right:calc(var(--elbow-clear, 0px) + .5rem)}.files-binding{flex:0 1 auto;min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;color:var(--honey);font-family:var(--face-label);font-size:.66rem;letter-spacing:.12em;text-transform:uppercase;white-space:nowrap}.files-command{flex:1 1 14em;min-width:0;background:#000;border:1px solid var(--pumpkin-pie);border-radius:.4rem;color:var(--daybreak);font-family:Share Tech Mono,monospace;font-size:.85rem;padding:.2rem .6rem;outline:none}.files-command:focus{border-color:var(--harvestgold)}.files-feed{flex:none;border:none}.files-body.files-catalogue .files-home,.files-body.files-catalogue .files-back,.files-body.files-catalogue .files-mkdir,.files-body.files-catalogue .files-upload,.files-body.files-catalogue .files-select{display:none}.files-capsule,.listing-capsule,.listing-control.pacs-fold{display:inline-flex;align-items:center;justify-content:center;align-self:center;box-sizing:border-box;min-height:24px;margin:2px 0;padding:.1rem .7rem;border-radius:.8rem;background:color-mix(in srgb,var(--harvestgold) 38%,transparent);color:#000;font-family:var(--face-label);font-weight:700;font-size:.62rem;letter-spacing:.1em;line-height:1;cursor:pointer;transition:background-color .12s ease-out}.files-capsule:hover,.listing-capsule:hover,.listing-control.pacs-fold:hover{background:var(--harvestgold)}.files-control.files-capsule{font-family:MesloLGS NF,Inconsolata,monospace;font-size:.95rem;letter-spacing:0;padding:.1rem .5rem;color:#000}.files-control.files-capsule.files-glyph-dir{background:var(--console-yellow, var(--harvestgold))}.files-control.files-capsule.files-glyph-file,.files-control.files-capsule.files-glyph-job{background:var(--console-white, var(--butter))}.files-control.files-capsule.files-glyph-link{background:var(--console-cyan, var(--daybreak))}.files-control.files-capsule.files-glyph-plugin{background:var(--console-green, var(--honey))}.files-control.files-capsule.files-glyph-pipeline,.files-control.files-capsule.files-glyph-vfs{background:var(--console-magenta, var(--honey))}.listing-framed .listing-indicated .files-capsule,.listing-framed .listing-indicated .listing-capsule,.listing-framed .listing-indicated .listing-control.pacs-fold{background:#00000047}.listing-framed .listing-indicated .files-capsule:hover,.listing-framed .listing-indicated .listing-capsule:hover,.listing-framed .listing-indicated .listing-control.pacs-fold:hover{background:#000;color:var(--harvestgold)}.files-type{color:var(--honey);font-size:.7rem;letter-spacing:.04em;opacity:.85}.files-size,.files-owner,.files-date{color:var(--pumpkin-pie);text-align:right;white-space:nowrap}.files-activatable{cursor:pointer}.files-activatable:hover>span{background:color-mix(in srgb,var(--harvestgold) 18%,transparent)}.files-content-header{display:flex;align-items:center;gap:.5rem}.files-content-header>span:first-child{flex:1 1 auto;min-width:0}.files-close-pill{border:none;background:var(--mars);color:#000;font-family:inherit;font-size:.6rem;font-weight:700;letter-spacing:.1em;border-radius:.6rem;padding:.1rem .8rem;cursor:pointer}.files-close-pill:hover{filter:brightness(1.3)}.files-image{display:block;max-width:100%;max-height:60vh;margin:.5rem 0;border:1px solid var(--pumpkin-pie)}.files-body{position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column;padding-right:var(--spine-w)}.files-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(16rem,1fr));gap:.6rem;padding:.3rem .5rem .6rem 0}.files-card{background:linear-gradient(135deg,#161616,#070707);border:2px solid var(--october-sunset);border-radius:10px;padding:.55rem .7rem;min-width:0;transition:border-color .15s,transform .15s}.files-card.files-activatable{cursor:pointer}.files-cards.files-previews{grid-template-columns:repeat(auto-fill,minmax(13rem,1fr))}.files-card-thumb{height:6.5rem;margin:-.55rem -.7rem .45rem;border-radius:8px 8px 0 0;background-color:#000;display:flex;align-items:center;justify-content:center;overflow:hidden;color:var(--pumpkin-pie);font-family:var(--face-label);font-size:2rem}.files-card-thumb.thumb-wait{opacity:.45}.files-card-thumb svg{width:100%;height:100%;color:var(--harvestgold)}.files-card-thumb.thumb-count{font-size:.8rem;letter-spacing:.12em}.files-target{margin-left:.6em;opacity:.6;font-size:.85em}.files-card-target{margin-top:.25rem;color:var(--pumpkin-pie);font-family:Share Tech Mono,monospace;font-size:.62rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.files-card-thumb img{width:100%;height:100%;object-fit:cover}.files-card-thumb pre{margin:0;padding:.3rem .5rem;width:100%;height:100%;font:.55rem/1.3 Share Tech Mono,monospace;color:var(--honey);white-space:pre;overflow:auto;overscroll-behavior:contain;text-align:left}.files-card-thumb pre::-webkit-scrollbar{width:6px;height:6px}.files-card-thumb pre::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--honey) 45%,transparent);border-radius:3px}.files-card:hover .files-card-thumb pre::-webkit-scrollbar-thumb{background:var(--honey)}.files-card.files-activatable:hover{border-color:var(--honey);transform:translateY(-2px)}.files-card-up{display:flex;align-items:center;color:var(--pumpkin-pie);font-family:var(--face-label);letter-spacing:.08em}.files-card-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:.35rem}.files-card-badge{background:var(--harvestgold);color:#000;border-radius:9px;padding:0 .6rem;font-family:var(--face-label);font-size:.62rem;letter-spacing:.12em;line-height:1.6}.files-card.files-type-plugin .files-card-badge{background:var(--daybreak)}.files-card.files-type-pipeline .files-card-badge{background:var(--orange)}.files-card.files-type-dir .files-card-badge,.files-card.files-type-vfs .files-card-badge,.files-card.files-type-job .files-card-badge{background:var(--butter)}.files-card-size{color:var(--pumpkin-pie);font-family:Share Tech Mono,monospace;font-size:.68rem}.files-card-title{color:var(--honey);font-family:var(--face-label);font-size:.95rem;letter-spacing:.03em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-card-meta{display:flex;justify-content:space-between;margin-top:.3rem;color:var(--pumpkin-pie);font-family:Share Tech Mono,monospace;font-size:.66rem}.files-content-view{display:flex;flex-direction:column;min-height:100%}.dag-scene-canvas{display:block;width:100%!important;height:100%!important}.files-diagram{flex:1 1 0;min-height:14rem;position:relative;overflow:hidden}.files-diagram-empty{display:flex;align-items:center;justify-content:center;color:var(--pumpkin-pie);font-family:var(--face-label);letter-spacing:.1em}.man-head{color:var(--harvestgold);font-weight:600}.man-key{color:var(--honey)}.man-flag{color:var(--daybreak)}.man-str{color:var(--orange)}.files-content{margin:0;padding:.4rem 0;font-family:MesloLGS NF,Inconsolata,Courier New,monospace;font-size:.7rem;line-height:1.35;color:var(--butter);white-space:pre-wrap;word-break:break-word;text-shadow:0 0 5px rgb(255 238 204 / 30%)}.data-column{transition:filter .3s ease}.dc-sweep{filter:brightness(1.6)}.dc-sweep>div{color:var(--butter)!important;text-shadow:0 0 8px rgb(255 238 204 / 60%)}#data-cascade.dc-stale{filter:brightness(.45) saturate(.5)}.banner{font-size:clamp(1.1rem,1.4vw,1.8rem);padding-bottom:.2rem}.header-face{display:none;padding:.2rem .5rem;columns:3;column-gap:2rem;font-family:Share Tech Mono,monospace;font-size:.75rem;letter-spacing:.06em;height:var(--header-band-h, 19vh);max-height:var(--header-band-h, 19vh);overflow:hidden auto}.header-gather-field{position:relative;display:flex;flex-direction:column;flex:1 1 0;min-height:0;padding-right:var(--spine-w);transition:padding-right .22s ease-out}.header-gather-field .gather-rows{display:flex;flex-direction:column;flex:1 1 0;min-height:0;overflow:auto;scrollbar-width:thin;padding-top:calc(var(--rule-h) + .3rem);--roster-gap: .6rem;--roster-pad: .4rem}.header-gather-field .gather-rows>.roster-order{position:sticky;top:0;z-index:2;flex:none;background:#000}.gather-state{flex:none;padding:0 .6rem .2rem;font-family:var(--face-label);font-size:.62rem;letter-spacing:.1em;color:var(--butter)}button.panel-gather{flex:none;min-height:3.2rem;align-items:flex-end;justify-content:flex-end;white-space:nowrap;border-bottom:8px solid #000}button.panel-gather.panel-gather-empty{background-color:color-mix(in srgb,var(--harvestgold) 38%,#000);color:color-mix(in srgb,#000 70%,var(--harvestgold))}body[data-header=stats] #header-telemetry{display:block}body[data-header=gather] #header-gather{display:flex;flex-direction:column;columns:auto;flex:1 1 100%;width:100%;min-width:0}body[data-header=away] .wrap:not(#gap){position:absolute;inset:0 0 auto;translate:0 -100%}#header-restore,body[data-zoom] .headtrim,body[data-zoom] .baseboard{display:none}body[data-zoom]:not([data-zoom=console]) #drawer-toggle,body[data-zoom]:not([data-zoom=console]) #status-strip,body[data-zoom]:not([data-zoom=console]) .right-frame:before{display:none}body[data-header=away]:not([data-zoom]) #gap,body[data-zoom]:not([data-zoom=console]) #gap{margin-top:12px}body[data-header=away] #header-restore,body[data-zoom] #header-restore{display:block;position:fixed;top:0;left:20%;right:20%;height:12px;z-index:1000;border-radius:0 0 6px 6px;background-color:var(--october-sunset);cursor:pointer;animation:beckon 3.5s ease-in-out infinite}#header-restore:hover{animation:none;background-color:var(--harvestgold);box-shadow:0 0 8px color-mix(in srgb,var(--harvestgold) 60%,transparent)}.header-controls{column-span:all;display:flex;gap:.7rem;margin-bottom:.3rem}.telemetry-row{display:flex;align-items:center;gap:.7rem;break-inside:avoid;margin-bottom:.2rem;min-width:0}.telemetry-label{flex:none;min-width:9.5rem;padding:0 .7rem;border-radius:.6rem 0 0 .6rem;background-color:var(--honey);color:#000;font-family:var(--face-label);font-weight:700;font-size:.7rem;line-height:1.2rem;letter-spacing:.08em;text-align:right;text-transform:uppercase}#header-about .telemetry-label{background-color:var(--october-sunset)}:root[data-theme=medical] #header-about .telemetry-label,:root[data-theme=pharos] #header-about .telemetry-label{color:var(--butter)}.telemetry-value{color:var(--daybreak);font-size:.9rem;min-width:0}#header-dag-info .telemetry-value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.about-footer{column-span:all;margin-top:.15rem;padding-bottom:0;padding-left:0;font-size:.62rem;line-height:1.3;opacity:.75}.audio-pill,.theme-pill,.door-pill{padding:.1rem .9rem;border:none;border-radius:.8rem;color:#000;font-family:var(--face-label);font-weight:700;font-size:.75rem;letter-spacing:.1em;cursor:pointer}.audio-pill{background-color:var(--state-done)}.theme-pill{background-color:var(--harvestgold)}.door-pill{background-color:var(--orange)}.audio-pill:hover,.theme-pill:hover,.door-pill:hover{filter:brightness(1.3);box-shadow:0 0 8px currentcolor}.audio-pill.audio-off{background-color:var(--state-error)}.audio-pill.audio-off:after{content:" OFF"}:root{--butter: #fec;--daybreak: #f91;--harvestgold: #fa4;--honey: #fc9;--october-sunset: #f40;--orange: #f70;--pumpkin-pie: #c50}:root[data-theme=gold]{--butter: #fff3cd;--daybreak: #fc3;--harvestgold: #ffd75e;--honey: #ffe49c;--october-sunset: #c99700;--orange: #e9b200;--pumpkin-pie: #a07800}:root[data-theme=medical]{--butter: #dff5fd;--daybreak: #7edcf7;--harvestgold: #1ebef0;--honey: #7fd9f7;--october-sunset: #30619d;--orange: #1d7bb9;--pumpkin-pie: #0f3566}:root[data-theme=nemesis]{--butter: #f0e4fc;--daybreak: #cfa0ff;--harvestgold: #d0a8f0;--honey: #e0c8f8;--october-sunset: #8c5fc0;--orange: #b48ae0;--pumpkin-pie: #7a4ea8}:root[data-theme=pharos]{--butter: #dff5fd;--daybreak: #7edcf7;--harvestgold: #1ebef0;--honey: #7fd9f7;--october-sunset: #30619d;--orange: #1d7bb9;--pumpkin-pie: #0f3566;--face-label: "Chakra Petch", "Arial Narrow", sans-serif;--face-data: "JetBrains Mono", "MesloLGS NF", monospace;--elbow-radius: 0;--elbow-inner-radius: 0;--radius-top: 0;--radius-bottom: 0;--radius-content-top: 0;--radius-content-bottom: 0;--pharos-lit: rgba(255, 255, 255, .55);--pharos-cut: 9px;--pharos-cut-small: 5px;--pharos-inset: 18px;--pharos-flank: 26px}[data-theme=pharos] body{font-family:var(--face-label)}[data-theme=pharos] .listing-row,[data-theme=pharos] .roster-filter-input{font-family:var(--face-data)}[data-theme=pharos] .left-frame-top .panel-1,[data-theme=pharos] .left-frame-top .panel-2,[data-theme=pharos] .left-frame-top .panel-gather,[data-theme=pharos] .left-frame button[class^=panel-],[data-theme=pharos] .left-frame .panel-spacer,[data-theme=pharos] .lcars-bar-horizontal,[data-theme=pharos] .lcars-bar-end,[data-theme=pharos] .mode-strip,[data-theme=pharos] .mode-fill{box-shadow:inset 0 3px 0 var(--pharos-lit)}[data-theme=pharos] .left-frame button[class^=panel-]{clip-path:polygon(var(--pharos-cut) 0,100% 0,100% 100%,0 100%,0 var(--pharos-cut));transition:margin-left .18s ease-out,width .18s ease-out}[data-theme=pharos] .roster-cap,[data-theme=pharos] .roster-cap:first-of-type,[data-theme=pharos] .roster-cap:last-of-type,[data-theme=pharos] .strategy-pill,[data-theme=pharos] .listing-action,[data-theme=pharos] .pacs-capsule,[data-theme=pharos] .ask-capsule,[data-theme=pharos] .theme-pill,[data-theme=pharos] .audio-pill,[data-theme=pharos] .telemetry-label,[data-theme=pharos] .lamp-online,[data-theme=pharos] .lamp-host,[data-theme=pharos] .lamp-offline{border-radius:0;clip-path:polygon(0 0,calc(100% - var(--pharos-cut-small)) 0,100% var(--pharos-cut-small),100% 100%,0 100%)}[data-theme=pharos] .pacs-capsule,[data-theme=pharos] .listing-action,[data-theme=pharos] .strategy-pill{white-space:nowrap;letter-spacing:.04em}[data-theme=pharos] body[data-focus=files] #gutter-files,[data-theme=pharos] body[data-focus=dag] #gutter-runs,[data-theme=pharos] body[data-focus=pacs] #gutter-tools{margin-left:var(--pharos-inset);width:calc(var(--lfw) - var(--pharos-inset))}[data-theme=pharos] .left-frame-top{position:relative;overflow:hidden}[data-theme=pharos] .left-frame-top:after{content:"";position:absolute;left:0;bottom:0;width:78px;height:78px;pointer-events:none;background:radial-gradient(circle at 0 100%,var(--butter) 0 11px,transparent 11.5px),repeating-radial-gradient(circle at 0 100%,var(--butter) 0 2px,transparent 2px 9px);clip-path:circle(78px at 0 100%);animation:pharos-lamp 5s ease-in-out infinite}@keyframes pharos-lamp{0%,to{opacity:.55}50%{opacity:1}}[data-theme=pharos] .wrap-all{border-left:3px solid var(--october-sunset);border-radius:var(--pharos-flank) 0 0 var(--pharos-flank)}[data-theme=pharos] .left-frame-top{border-top-left-radius:calc(var(--pharos-flank) - 3px)}[data-theme=pharos] .left-frame>div:last-child .panel-7{clip-path:none;border-bottom-left-radius:calc(var(--pharos-flank) - 3px)}[data-theme=pharos] .lcars-bar-horizontal{border-radius:0}[data-theme=pharos] .lcars-bar-end{border-radius:0;clip-path:polygon(0 0,calc(100% - 12px) 0,100% 100%,0 100%)}[data-theme=pharos] .mode-elbow,[data-theme=pharos] .mode-elbow:after{border-top-right-radius:0}[data-theme=pharos] .mode-strip,[data-theme=pharos] .mode-fill{border-radius:0}[data-theme=pharos] .listing-indicated>span:first-child,[data-theme=pharos] .listing-indicated>span:nth-child(2){text-shadow:none}[data-theme=pharos] .listing-action:hover:not(:disabled),[data-theme=pharos] .audio-pill:hover,[data-theme=pharos] .theme-pill:hover,[data-theme=pharos] .pacs-capsule:hover{box-shadow:none;filter:brightness(1.15)}@media(prefers-reduced-motion:reduce){[data-theme=pharos] .left-frame-top:after{animation:none}[data-theme=pharos] .left-frame button[class^=panel-]{transition:none}}[data-theme=pharos] body,[data-theme=pharos] .banner,[data-theme=pharos] h1,[data-theme=pharos] a,[data-theme=pharos] button,[data-theme=pharos] #status-strip,[data-theme=pharos] .dag-node-tip,[data-theme=pharos] .feedlist-refusal,[data-theme=pharos] .telemetry-label,[data-theme=pharos] .lcars-bar-horizontal{text-transform:lowercase}[data-theme=pharos] .listing-row,[data-theme=pharos] .argus-output,[data-theme=pharos] #pacs-results,[data-theme=pharos] #files-results,[data-theme=pharos] #pipeline-cycler-name,[data-theme=pharos] input,[data-theme=pharos] textarea,[data-theme=pharos] select,[data-theme=pharos] .about-footer,[data-theme=pharos] .about-footer a{text-transform:none}#drawer{display:flex;flex-direction:column;flex:none;height:28vh;min-height:0;overflow:hidden}#drawer.drawer-closed{height:0}.lcars-terminal-header-bar{flex:none;display:flex;height:28px;align-items:flex-end}.lcars-bar-horizontal{flex:1;height:28px;background-color:var(--harvestgold);display:flex;align-items:center;justify-content:space-between;padding-inline:1rem;color:#000;font-weight:700;text-transform:uppercase;font-family:var(--face-label);font-size:.8rem;letter-spacing:1px}.lcars-bar-horizontal>.lcars-title{flex:0 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.lcars-bar-horizontal>.pane-mode,.lcars-bar-horizontal>.pane-state{flex:none;white-space:nowrap}.lcars-terminal-status{font-size:.6rem;opacity:.8;margin-left:1rem;font-family:Share Tech Mono,monospace;text-transform:none}.lcars-bar-end{width:60px;height:28px;background-color:var(--harvestgold);border-radius:0 14px 14px 0;margin-left:.5rem}#terminal{flex:1;min-height:0;display:flex}.argus-screen{flex:1;min-width:0;background-color:#000;padding:.8rem 1rem;display:flex;flex-direction:column;font-family:Share Tech Mono,MesloLGS NF,monospace;color:var(--daybreak)}.argus-output{flex:1;overflow-y:auto;margin-bottom:.5rem;font-size:.75rem;line-height:1.35;letter-spacing:1px;white-space:pre-wrap;word-break:break-word}.argus-line{min-height:1em}.argus-echo .user-input,.user-input{color:var(--butter);text-shadow:none}.argus-echo .prompt-glyph{color:var(--sky, #9cf)}.argus-result.error{color:#f24444}.argus-banner-line{opacity:.9}.argus-splash{display:flex;align-items:center;gap:1.5rem;margin-bottom:.4rem}.argus-splash-brain{flex:none;margin:0;font-size:.42em;line-height:1;letter-spacing:0;white-space:pre;opacity:.9}.argus-splash-greeting{flex:1 1 auto;min-width:0}.pane-universe:not(.universe-inside) .universe-open,.pane-universe:not(.universe-inside):not(.universe-cluster) .universe-back,.universe-facts[hidden]{display:none}.universe-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.universe-node-verbs{display:flex;gap:.4rem;margin-top:.35rem}.argus-greeting-line{white-space:pre-wrap;min-height:1em}.dim{opacity:.45}.argus-progress{flex:none;font-size:.7rem;letter-spacing:0;text-shadow:none;line-height:1.6}.argus-progress-row{display:flex;align-items:center;gap:.5rem;color:var(--butter);opacity:.85}.argus-progress-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.argus-progress-counts{opacity:.6}.argus-progress-elapsed{flex:none;opacity:.5;font-variant-numeric:tabular-nums}.argus-progress-spin{flex:none;width:.6rem;height:.6rem;border:2px solid var(--pumpkin-pie);border-top-color:transparent;border-radius:50%;animation:argus-progress-turn .8s linear infinite}.argus-progress-bar{flex:2;height:.4rem;background:#ffffff1f;border-radius:.2rem;overflow:hidden}.argus-progress-fill{display:block;height:100%;width:0;background:var(--pumpkin-pie);transition:width .12s linear}@keyframes argus-progress-turn{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.argus-progress-spin{animation:none}.argus-progress-fill{transition:none}}.argus-prompt-bar{flex:none;font-size:.7rem;letter-spacing:0;text-shadow:none;line-height:1.5;white-space:pre;overflow-x:hidden}.argus-input-line{flex:none;display:flex;align-items:center;border-top:1px solid var(--pumpkin-pie);padding-top:.4rem;margin-top:.2rem}.argus-input-glyph{color:#00d787;font-size:.8rem}.argus-input-line input{background:transparent;border:none;color:var(--butter);font-family:inherit;font-size:.75rem;letter-spacing:1px;flex:1;outline:none;margin-left:.6rem}#drawer-strip{flex:none;height:4px;margin:3px 0;background:var(--pumpkin-pie);border-radius:0;cursor:row-resize}#drawer-strip:hover,#drawer-strip:active{animation:none;background:var(--harvestgold);box-shadow:0 0 8px color-mix(in srgb,var(--harvestgold) 60%,transparent)}#drawer-toggle{cursor:pointer}@keyframes beckon{0%,to{filter:brightness(1)}50%{filter:brightness(1.2);box-shadow:0 0 8px #ff770073}}@keyframes beckon-mars{0%,to{filter:brightness(1);box-shadow:none}50%{filter:brightness(1.3);box-shadow:0 0 10px #f229}}.attach-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:#000000e0;z-index:100}.attach-hidden{display:none}.attach-card{width:20rem;border:2px solid var(--orange);border-radius:1.2rem 0;padding:1.2rem 1.4rem;background:#000}.attach-card h1{margin:0 0 .3rem;color:var(--orange);letter-spacing:.2em}.attach-card p{margin:0 0 .7rem;font-size:.7rem;color:var(--honey)}.attach-card input{width:100%;background:#111;color:var(--butter);border:1px solid var(--harvestgold);border-radius:4px;padding:.4rem .5rem;font-family:inherit;font-size:.75rem;letter-spacing:.1em;margin-bottom:.6rem;box-sizing:border-box}.attach-card button{background:var(--orange);color:#000;border:none;border-radius:.65rem;padding:.4rem 1.1rem;font-family:inherit;font-size:.75rem;font-weight:700;letter-spacing:.1em;cursor:pointer}.attach-card button:hover{filter:brightness(1.15)}.attach-error{color:var(--state-error);min-height:1.2em;margin-top:.5rem}.domain-inert{background-color:color-mix(in srgb,var(--inert-ground, var(--october-sunset)) 50%,#000);color:var(--butter)}.panel-1.domain-inert,.panel-4.domain-inert,.panel-spacer.domain-inert{--inert-ground: var(--orange)}.panel-2.domain-inert,.panel-3.domain-inert,.panel-6.domain-inert{--inert-ground: var(--october-sunset)}.panel-5.domain-inert,.panel-7.domain-inert{--inert-ground: var(--harvestgold)}.pacs-study-progress{display:block;min-width:0}.listing-control.pacs-fold-none{background:transparent;cursor:default}.pacs-fold:before{content:"OPEN"}.listing-group.listing-open>.listing-row>.pacs-fold:before{content:"CLOSE"}.pacs-fold.pacs-fold-none:before{content:""}.pacs-capsule-study{background-color:var(--october-sunset);color:#000}.pacs-capsule-study:hover{box-shadow:0 0 8px var(--october-sunset)}.pacs-bar-full{min-width:2rem;height:.45rem;border-radius:.25rem;background:var(--state-done)}.pacs-waiting{display:flex;align-items:center;gap:.7rem;padding:.6rem .2rem}.pacs-waiting .pacs-bar{flex:0 0 12rem}.pacs-waiting-note{color:var(--harvestgold);font-family:var(--face-label);letter-spacing:.12em;font-size:.8rem}.pacs-bar{position:relative;flex:1 1 auto;min-width:2rem;height:.45rem;border-radius:.25rem;background:color-mix(in srgb,var(--state-running) 18%,transparent);overflow:hidden}.listing-framed .listing-indicated .pacs-bar{background:#00000047}.listing-framed .listing-indicated .pacs-bar-fill{background:#000}.pacs-bar-fill{display:block;width:0;height:100%;border-radius:.25rem;background:var(--state-running);transition:width .25s linear}.pacs-bar-pacing .pacs-bar-fill{width:35%;animation:pacs-pace 1.4s ease-in-out infinite}@keyframes pacs-pace{0%{transform:translate(-100%)}to{transform:translate(300%)}}#lang-palette{position:fixed;top:0;left:50%;transform:translate(-50%);z-index:1200;display:flex;align-items:stretch;width:min(52rem,70vw);height:30px;background:#000}#lang-palette[hidden]{display:none}.lang-glyph{display:flex;align-items:center;padding:0 .9rem 0 1.1rem;background:var(--harvestgold);color:#000;font-family:var(--face-label);font-size:.8rem;letter-spacing:.12em;border-radius:0 0 0 14px}#lang-input{flex:1;background:transparent;border:none;border-bottom:2px solid var(--pumpkin-pie);outline:none;padding:0 .7rem;color:var(--butter);font-family:Share Tech Mono,monospace;font-size:.78rem;letter-spacing:.04em}#lang-palette:after{content:"";width:34px;background:var(--harvestgold);border-radius:0 0 14px}#lang-result{position:absolute;top:100%;left:0;right:0;padding:.25rem .9rem;color:var(--honey);font-family:Share Tech Mono,monospace;font-size:.72rem;white-space:pre-wrap;background:#000000eb;border-bottom:1px solid color-mix(in srgb,var(--orange) 55%,transparent)}#lang-result:empty{display:none}.left-frame .panel-lang{display:flex;justify-content:flex-end;height:auto;flex:1.2 1 0;min-height:2.4rem;padding:var(--left-frame-padding);background-color:var(--harvestgold);border-bottom:var(--panel-border)}.left-frame .panel-console{display:flex;justify-content:flex-end;height:auto;flex:2 1 0;min-height:3rem;padding:var(--left-frame-padding);background-color:var(--october-sunset);border-bottom:var(--panel-border)}.left-frame .panel-lang.lang-live{background-color:var(--butter)}#drawer~.bar-panel{flex-wrap:nowrap;cursor:pointer}#drawer~.bar-panel:hover .bar-10{filter:brightness(1.2)}#drawer.drawer-closed~.bar-panel .bar-10{animation:lid-beckon 3.5s ease-in-out infinite}@keyframes lid-beckon{0%,to{filter:brightness(1)}50%{filter:brightness(1.35)}}.feedlist-size,.feedlist-time{text-align:right;font-family:Share Tech Mono,monospace}.dag-roster .roster-cap[data-key=sizeBytes],.dag-roster .roster-cap[data-key=wallSeconds]{text-align:right}.files-body .diagram-strategy,.files-body .diagram-projection,.files-body .diagram-pulse,.files-body.diagram-shown .files-view,.files-body.diagram-shown .files-filter,.files-body.diagram-shown .files-home,.files-body.diagram-shown .files-back,.files-body.diagram-shown .files-mkdir,.files-body.diagram-shown .files-upload,.files-body.diagram-shown .files-select,.files-body.diagram-shown .files-row-zone{display:none}.files-row-selected .files-name,.files-row-selected .files-glyph,.files-row-selected .files-type,.files-row-selected .files-size{background:color-mix(in srgb,var(--butter) 22%,transparent);color:var(--butter)}.files-body.diagram-shown .diagram-strategy,.files-body.diagram-shown .diagram-projection,.files-body.diagram-shown .diagram-pulse{display:block}.files-body .diagram-run{display:none}.files-body.files-catalogue.diagram-shown .diagram-run{display:block;background-color:var(--october-sunset);color:#000}.telemetry-input{flex:1 1 8em;min-width:0;background:#000;border:1px solid var(--pumpkin-pie);border-radius:.4rem;color:var(--daybreak);font-family:Share Tech Mono,monospace;font-size:.85rem;padding:.1rem .5rem;outline:none}.telemetry-input:focus{border-color:var(--harvestgold)}.telemetry-input[type=checkbox]{flex:none;width:1rem;height:1rem;accent-color:var(--harvestgold)}.telemetry-hint{flex:none;color:var(--honey);font-size:.7rem;opacity:.8}.mode-frame .strategy-pill.diagram-pulse.pulse-running{background-color:var(--october-sunset);color:#000}.dag-facts-immersed{max-width:72%;max-height:70%;overflow-y:auto;border-left-color:var(--october-sunset)}.pacs-patient{margin-bottom:.9rem}.pacs-patient-row{padding-block:4px;color:var(--harvestgold);border-bottom:2px solid var(--harvestgold);cursor:pointer}.pacs-patient-row:hover{background:color-mix(in srgb,var(--harvestgold) 12%,transparent)}.pacs-patient-row>span{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pacs-patient-name{color:var(--butter)}.pacs-patient-mrn{color:var(--harvestgold)}.pacs-patient-count,.pacs-patient-server,.pacs-patient-answered{color:var(--pumpkin-pie)}.pacs-unasked,.pacs-patient-unasked .pacs-patient-count{color:var(--mars)}.pacs-patient-progress{display:block;min-width:0}#pacs-results .listing-level[data-depth="1"]{box-shadow:inset 2px 0 #ffcc6659}#pacs-results .listing-level[data-depth="1"] .roster-caps{margin:.35rem 0 .3rem}#pacs-form .pacs-form-field{display:flex;flex-direction:column;gap:.15rem;min-width:0;color:var(--honey);font-family:var(--face-label);font-size:.66rem;letter-spacing:.12em}.pacs-server-cell{min-width:0;width:100%;background:#000;border:1px solid var(--pumpkin-pie);border-radius:.4rem;color:var(--butter);font-family:Share Tech Mono,monospace;font-size:.8rem;padding:.15rem .5rem;text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;cursor:pointer}.pacs-server-cell:hover,.pacs-server-open{border-color:var(--harvestgold);color:var(--harvestgold)}.pacs-server-many{color:var(--october-sunset);border-color:var(--october-sunset)}.pacs-server-strip{display:flex;flex-wrap:wrap;gap:.3rem;padding:.35rem var(--roster-pad) .5rem;margin-bottom:.4rem;border-bottom:2px solid var(--pumpkin-pie)}.pacs-server-segment{background:#000;border:1px solid var(--pumpkin-pie);border-radius:.9rem;color:var(--pumpkin-pie);font-family:var(--face-label);font-size:.7rem;letter-spacing:.1em;padding:.1rem .7rem;cursor:pointer}.pacs-server-segment:hover{color:var(--harvestgold);border-color:var(--harvestgold)}.pacs-server-chosen{background:var(--harvestgold);border-color:var(--harvestgold);color:#000}.argus-ask{color:var(--harvestgold)}.ask-glyph{color:var(--butter);margin-right:.35rem}.ask-answer,.argus-ask-answered .ask-glyph{color:var(--pumpkin-pie)}.ask-capsule{background:var(--harvestgold);border:none;border-radius:.9rem;color:#000;font-family:var(--face-label);font-size:.7rem;letter-spacing:.1em;padding:.1rem .9rem;cursor:pointer}.ask-capsule-no{background:var(--october-sunset)}.ask-capsule:hover{filter:brightness(1.3)}.errand-bar{display:flex;align-items:center;gap:.6rem;padding:.35rem .6rem;margin-bottom:.3rem;border-bottom:2px solid var(--october-sunset);flex:none}.errand-caption{color:var(--butter);font-family:var(--face-label);font-size:.7rem;letter-spacing:.1em;white-space:nowrap;align-self:center}.errand-path{flex:1 1 14em;min-width:0;background:#000;border:1px solid var(--pumpkin-pie);border-radius:.4rem;color:var(--daybreak);font-family:Share Tech Mono,monospace;font-size:.75rem;padding:.1rem .5rem;outline:none}.errand-path:focus{border-color:var(--harvestgold)}.errand-commit{background-color:var(--october-sunset)}.pacs-wrote{color:var(--pumpkin-pie);font-family:var(--face-label);font-size:.68rem;letter-spacing:.1em;align-self:center;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pane-image{display:flex;flex-direction:column;min-height:0}.image-body{position:relative;flex:1 1 0;min-height:0;overflow:hidden}.pane-image[data-modality=MR] .image-body{--harvestgold: var(--daybreak)}.pane-image[data-modality=CT] .image-body{--harvestgold: var(--honey)}.pane-image[data-modality=PT] .image-body{--harvestgold: var(--tomato, #f77)}.pane-image[data-modality=NIFTI] .image-body{--harvestgold: var(--daybreak)}.image-field{position:absolute;top:calc(var(--frame-top) + var(--rule-h));left:0;right:var(--spine-w);bottom:0;background:#000;outline:none;transition:right .22s ease-out}.image-working{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:flex;flex-direction:column;align-items:center;gap:.5rem;min-width:14rem;padding:1rem 1.4rem;background:#000000b8;border-radius:.4rem;font-family:var(--face-label);letter-spacing:.12em;color:var(--harvestgold);font-size:.75rem;pointer-events:none;z-index:3}.image-working-track{width:100%;height:.35rem;border-radius:.2rem;background:color-mix(in srgb,var(--harvestgold) 22%,transparent);overflow:hidden}.image-working-fill{display:block;height:100%;width:0;border-radius:.2rem;background:var(--harvestgold);transition:width .12s linear}.image-working-fill.image-working-pacing{width:35%;animation:image-pacing 1.1s ease-in-out infinite}@keyframes image-pacing{0%{transform:translate(-100%)}to{transform:translate(285%)}}.image-working-count{font-size:.7rem;color:var(--honey)}.image-working-failed{color:var(--tomato, #f77)}.image-working-failed .image-working-track{display:none}.image-working-failed .image-working-count{color:var(--tomato, #f77);letter-spacing:.04em}.image-overlay-note{position:absolute;left:.8rem;top:.6rem;display:flex;flex-direction:column;gap:.05rem;font-family:var(--face-label);font-size:.62rem;letter-spacing:.09em;line-height:1.35;color:var(--honey);text-shadow:0 0 4px #000,0 0 2px #000;pointer-events:none;z-index:2}.image-probe-note{position:absolute;left:.8rem;bottom:.6rem;font-family:var(--face-label);font-size:.66rem;letter-spacing:.1em;color:var(--harvestgold);text-shadow:0 0 4px #000,0 0 2px #000;pointer-events:none;z-index:2}.pane-image.image-field-focused .image-field{box-shadow:inset 0 0 0 2px var(--harvestgold)}.image-viewport{position:absolute;inset:0}.image-mpr,.image-render{position:absolute;inset:0;display:grid;gap:2px}.image-mpr{grid-template-columns:1fr 1fr 1fr}.image-mpr .image-viewport,.image-render .image-viewport{position:relative;inset:auto;min-width:0;min-height:0}.image-canvas{display:block;width:100%!important;height:100%!important}.mode-frame .image-focus{text-align:right;padding:0 .6rem 0 .4rem;height:1.6rem;line-height:1.6rem;background-color:var(--harvestgold);color:#000}.pane-tags{display:flex;flex-direction:column;min-height:0}.tags-body{--roster-gap: 0px;--roster-pad: 0px;position:relative;flex:1 1 0;min-height:0;display:flex;flex-direction:column;padding-right:var(--spine-w)}.pane-tags[data-modality=MR] .tags-body{--harvestgold: var(--daybreak)}.pane-tags[data-modality=CT] .tags-body{--harvestgold: var(--honey)}.pane-tags[data-modality=PT] .tags-body{--harvestgold: var(--tomato, #f77)}.tags-panel{flex:1 1 0;min-height:0;display:flex;flex-direction:column;overflow:hidden}.tags-panel>.roster-order{position:static;z-index:auto;flex:none}.tags-panel>.listing-field{padding-right:.5rem}.tags-fold{color:var(--harvestgold)}.tags-fold:before{content:"▸"}.listing-group.listing-open>.listing-row>.tags-fold:before{content:"▾"}.tags-fold.tags-fold-none:before{content:""}.tags-group-row{font-weight:700}.tags-tag,.tags-vr{opacity:.7;font-family:monospace}.tags-name,.tags-value-cell{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.tags-decoded{opacity:.6}.tags-redacted .tags-phi .tags-value{letter-spacing:.15em;opacity:.6}.tags-note{padding:1rem;opacity:.7}.files-card-thumb.thumb-series{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.3rem}.thumb-series-mark{font-weight:700;letter-spacing:.1em;color:var(--harvestgold)}.thumb-series-text{font-size:.8em;opacity:.8;text-align:center;padding:0 .4rem}@keyframes lcars-breath{0%{filter:brightness(.82)}to{filter:brightness(1.28)}}#header-restore,.mode-strip,.mode-fill{animation:lcars-breath 2.2s ease-in-out infinite alternate}@keyframes lcars-breath-spine{0%{filter:brightness(.45)}to{filter:brightness(1.6)}}.mode-strip{animation:lcars-breath-spine 1.6s ease-in-out infinite alternate}#header-restore{animation-duration:2s}#header-restore:hover,.mode-strip:hover,.mode-fill:hover{animation:none}@media(prefers-reduced-motion:reduce){#drawer.drawer-closed~.bar-panel .bar-10,#header-restore,.mode-strip,.mode-fill,.image-working-fill.image-working-pacing{animation:none!important}}[data-theme=pharos] .left-frame-top,[data-theme=pharos] button.panel-2,[data-theme=pharos] button.panel-3{border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-right-radius:0}[data-theme=pharos] button.panel-3{border-top-left-radius:0}.launcher-body{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;position:relative;padding:0 .6rem .6rem .2rem}.launcher-grid{display:grid;grid-template-columns:repeat(3,1fr);grid-auto-rows:1fr;gap:.85rem;flex:1 1 auto;min-height:0}.launcher-tile{display:flex;flex-direction:column;gap:.45rem;align-items:stretch;text-align:left;border:none;cursor:pointer;padding:.9rem 1.1rem .8rem;border-radius:8px 28px 28px 8px;background-color:var(--tile-hue);color:#000;overflow:hidden}.launcher-tile-wide{grid-column:span 2}.launcher-tile:hover{filter:brightness(1.08)}.launcher-head{display:flex;align-items:baseline;gap:.7rem}.launcher-name{font-family:var(--face-label);font-weight:700;font-size:1.5rem;letter-spacing:.14em}.launcher-tile-wide .launcher-name{font-size:1.9rem}.launcher-numeral{margin-left:auto;font-family:Share Tech Mono,monospace;font-size:.85rem}.launcher-figure{border:none;border-radius:.8rem;padding:.1rem .7rem;background-color:var(--butter);color:#000;font-family:Share Tech Mono,monospace;font-size:.8rem;cursor:inherit}button.launcher-figure{cursor:pointer}.launcher-figure-errored{background-color:var(--state-error);color:#000}.launcher-rule{display:block;height:3px;background-color:#000}.launcher-rows{display:flex;flex-direction:column;gap:.15rem;overflow:hidden}.launcher-row{display:flex;align-items:center;gap:.55rem;border:none;background:none;padding:.12rem .3rem;border-radius:.5rem;color:#000;font-family:Share Tech Mono,monospace;font-size:.85rem;text-align:left;cursor:inherit}button.launcher-row{cursor:pointer}button.launcher-row:hover,.launcher-row-arrived{background-color:color-mix(in srgb,#000 12%,var(--tile-hue))}.launcher-row-text{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.launcher-dot{flex:none;width:.5rem;height:.5rem;border-radius:50%;background-color:#000}.launcher-dot-errored{background-color:var(--state-error)}.launcher-go{flex:none;font-family:Share Tech Mono,monospace}.launcher-verb{margin-top:auto;align-self:flex-start;background-color:#000;color:var(--tile-hue);font-family:var(--face-label);font-weight:700;font-size:.7rem;letter-spacing:.12em;padding:.22rem .85rem;border-radius:.9rem}.launcher-start{position:absolute;right:.9rem;bottom:-.1rem}.panes-body{overflow:auto;padding:.9rem;min-height:0}.panes-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:.9rem;align-content:start}.panes-empty{color:var(--honey);font-family:var(--face-data);font-size:.8rem;padding:1.2rem .4rem}.panes-card{display:grid;grid-template-rows:auto auto auto;gap:.4rem;padding:.6rem;border:none;border-radius:.6rem;background-color:color-mix(in srgb,var(--harvestgold) 14%,transparent);text-align:left;cursor:pointer;position:relative}.panes-card:hover{background-color:color-mix(in srgb,var(--harvestgold) 26%,transparent);box-shadow:0 0 8px var(--harvestgold)}.panes-card-figure{display:block;aspect-ratio:4 / 3;max-width:100%;background-color:#000;border-radius:.3rem;overflow:hidden}.panes-card-figure img{width:100%;height:100%;object-fit:contain;display:block}.panes-card-glyph{display:flex;align-items:center;justify-content:center;color:var(--harvestgold);font-size:2.4rem;line-height:1}.panes-card-label{color:var(--daybreak);font-family:var(--face-label);font-weight:700;font-size:.78rem;letter-spacing:.04em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.panes-card-badges{display:flex;flex-wrap:wrap;gap:.3rem}.panes-card-badge{font-family:var(--face-label);font-size:.56rem;letter-spacing:.12em;color:#000;background-color:var(--harvestgold);border-radius:.5rem;padding:.05rem .45rem}.panes-card-dismiss{position:absolute;top:.5rem;right:.5rem;border:none;border-radius:.5rem;padding:.05rem .45rem;font-family:var(--face-label);font-size:.56rem;letter-spacing:.12em;color:var(--honey);background-color:color-mix(in srgb,var(--october-sunset) 55%,transparent);cursor:pointer;opacity:0}.panes-card:hover .panes-card-dismiss{opacity:1}.panes-card-dismiss:hover{color:#000;background-color:var(--october-sunset)}.ask-bar{display:flex;align-items:center;gap:.6rem;padding:0 .6rem;flex:none;max-height:0;overflow:hidden;border-bottom:2px solid var(--harvestgold);transition:max-height .16s ease-out,padding .16s ease-out}.ask-bar-shown{max-height:3rem;padding:.35rem .6rem;margin-bottom:.3rem}.ask-bar-glyph{color:var(--harvestgold);font-family:var(--face-label);font-weight:700;font-size:.85rem}.ask-bar-caption{color:var(--butter);font-family:var(--face-label);font-size:.7rem;letter-spacing:.1em;white-space:nowrap;align-self:center}.ask-bar-field{flex:1 1 12em;min-width:0;background:#000;border:1px solid var(--pumpkin-pie);border-radius:.4rem;color:var(--daybreak);font-family:Share Tech Mono,monospace;font-size:.75rem;padding:.1rem .5rem;outline:none}.ask-bar-field:focus{border-color:var(--harvestgold)}.ask-bar-commit,.ask-bar-yes{background-color:var(--harvestgold)}.ask-bar-no,.ask-bar-abandon{background-color:var(--october-sunset)}.dag-process{align-self:flex-start;margin-top:.6rem}.files-projection .files-mkdir,.files-projection .files-upload{display:none}.pacs-wrote-opens{cursor:pointer;text-decoration:underline;text-underline-offset:3px}.files-table-view{display:flex;flex-direction:column;flex:1 1 0;min-height:0}.files-table-field{position:relative;display:flex;flex-direction:column;flex:1 1 0;min-height:0;padding-right:var(--spine-w);transition:padding-right .22s ease-out;--mode-frame-top: 0px}.files-table-rows{display:flex;flex-direction:column;flex:1 1 0;min-height:0;overflow:auto;scrollbar-width:thin;padding-top:calc(var(--rule-h) + .3rem);--roster-gap: .6rem;--roster-pad: .4rem}.files-table-rows>.roster-order{position:sticky;top:0;z-index:2;flex:none;background:#000}.files-table-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-raw-pill,.files-download-pill{background-color:var(--october-sunset)}.gather-series-study{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#header-strip{position:fixed;left:var(--lfw);right:0;height:10px;z-index:40;cursor:ns-resize;background:transparent}#header-strip:after{content:"";position:absolute;left:50%;top:4px;width:6rem;height:2px;transform:translate(-50%);background:color-mix(in srgb,var(--harvestgold) 45%,transparent)}body[data-header=away] #header-strip,body[data-zoom] #header-strip,body:not([data-header]) #header-strip{display:none}