@marimo-team/frontend 0.25.3-dev40 → 0.25.3-dev42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{CellStatus-BGIWF94J.js → CellStatus-BpOBz-8m.js} +1 -1
- package/dist/assets/{ErrorBoundary-hliG40Pk.js → ErrorBoundary-DmXl4Nre.js} +2 -2
- package/dist/assets/{JsonOutput-9tmC-p6h.js → JsonOutput-BJraU9kp.js} +1 -1
- package/dist/assets/{MarimoErrorOutput-BaHdbtck.js → MarimoErrorOutput-DVjK8RgY.js} +1 -1
- package/dist/assets/{RenderHTML-B1FzB5NY.js → RenderHTML-BFaztTR0.js} +1 -1
- package/dist/assets/{RunButton-DpGokdF1.js → RunButton-B44xE_d5.js} +1 -1
- package/dist/assets/{add-cell-with-ai-BYWG0iKO.js → add-cell-with-ai-CkjslziO.js} +1 -1
- package/dist/assets/{add-connection-dialog-BWbUVPJk.js → add-connection-dialog-CWLLVKju.js} +1 -1
- package/dist/assets/{agent-panel-DKNiQrAl.js → agent-panel-DYdQ_2pp.js} +1 -1
- package/dist/assets/{ai-model-dropdown-CIg9eu47.js → ai-model-dropdown-F3mm17Wa.js} +1 -1
- package/dist/assets/{app-config-button-BvkL2eSY.js → app-config-button-D0uDs5nC.js} +1 -1
- package/dist/assets/{blob-BQfLiwKr.js → blob-BSfsdCNF.js} +1 -1
- package/dist/assets/{cell-editor-BKKUv4d5.js → cell-editor-DzvvHs9g.js} +1 -1
- package/dist/assets/{cell-link-B_QkRkm-.js → cell-link-DFPHORAO.js} +1 -1
- package/dist/assets/{cells-CdH98VSn.js → cells-BdgzY0of.js} +1 -1
- package/dist/assets/{chat-display-CNbRSebo.js → chat-display-BrcwdhKJ.js} +1 -1
- package/dist/assets/{chat-panel-HbEKDf0c.js → chat-panel-C__3iSyI.js} +1 -1
- package/dist/assets/{chat-ui-BwMev8Bf.js → chat-ui-NlBK3kK6.js} +1 -1
- package/dist/assets/{code-visibility-sQ37CBNo.js → code-visibility-Cs-Vv3jV.js} +1 -1
- package/dist/assets/{column-preview-CsEBzIUE.js → column-preview-ivm1b-GY.js} +1 -1
- package/dist/assets/{command-palette-BzZ86pUz.js → command-palette-TgwswwvD.js} +1 -1
- package/dist/assets/{common-S2v8dsEy.js → common-BcEY1yDS.js} +1 -1
- package/dist/assets/{components-D-TnFWjo.js → components-lkCfd2vy.js} +1 -1
- package/dist/assets/{config-CYsbZpwa.js → config-BwHT0yGp.js} +2 -2
- package/dist/assets/{config-BoBwH7CU.js → config-DXjnAwtL.js} +1 -1
- package/dist/assets/{datasource-BA7YF4eo.js → datasource-dKk3JHSQ.js} +1 -1
- package/dist/assets/{dependency-graph-panel-DsjI61Qa.js → dependency-graph-panel-BaisS9Zt.js} +1 -1
- package/dist/assets/{documentation-panel-hk3IdeXy.js → documentation-panel-CpSUoM8r.js} +1 -1
- package/dist/assets/{download-CCZkq0y4.js → download-RV4i1fWI.js} +1 -1
- package/dist/assets/{edit-page-BgS6tjth.js → edit-page-C8RUVAaO.js} +4 -4
- package/dist/assets/{error-entries-BVXrGOTZ.js → error-entries-CJS0gOId.js} +1 -1
- package/dist/assets/{error-panel-DYethUUR.js → error-panel-BxCKpZtN.js} +1 -1
- package/dist/assets/feedback-button-BLvwvndE.js +1 -0
- package/dist/assets/{feedback-button-DaNc3uJa.js → feedback-button-DYjae3_b.js} +1 -1
- package/dist/assets/{file-explorer-panel-CqnzSSYc.js → file-explorer-panel-BmjAJusg.js} +1 -1
- package/dist/assets/{file-name-input-D4AvwZV9.js → file-name-input-BpfSzvEB.js} +1 -1
- package/dist/assets/{floating-outline-CTy-Iakk.js → floating-outline-CrWdiNQ2.js} +1 -1
- package/dist/assets/{gallery-page-ByjlvM6k.js → gallery-page-W_b-XWq6.js} +1 -1
- package/dist/assets/{glide-data-editor-CABBj2b0.js → glide-data-editor-C_bIL30J.js} +1 -1
- package/dist/assets/{home-page-DejRSjeJ.js → home-page-D1teQDdF.js} +1 -1
- package/dist/assets/{hooks-BJgCcVXZ.js → hooks-CZF85I2f.js} +1 -1
- package/dist/assets/{index-PDJQd7X6.js → index-4Nwpioic.js} +5 -5
- package/dist/assets/{layout-Ct0rjb-5.js → layout-ByZveRPN.js} +3 -3
- package/dist/assets/{logs-panel-TyeqEvOY.js → logs-panel-DVSgfMgv.js} +1 -1
- package/dist/assets/{markdown-renderer-BFyD6Jhs.js → markdown-renderer-DX2O5YiE.js} +1 -1
- package/dist/assets/{name-cell-input-D-0VF3qd.js → name-cell-input-DL1i8Mj0.js} +1 -1
- package/dist/assets/{outline-panel-DMTjk2WC.js → outline-panel-DPKPT2eg.js} +1 -1
- package/dist/assets/{packages-panel-DrT69k9L.js → packages-panel-CZZwD9YV.js} +1 -1
- package/dist/assets/{panel-accordion-state-Ban6j---.js → panel-accordion-state-C7vvsYz1.js} +1 -1
- package/dist/assets/panels-BT2oosq8.js +4 -0
- package/dist/assets/{process-output-DzpQYlpY.js → process-output-BKhybJBb.js} +1 -1
- package/dist/assets/{readonly-code-display-Cyn3k5TX.js → readonly-code-display-9QrSm_7D.js} +1 -1
- package/dist/assets/{readonly-python-code-DrXDDAnA.js → readonly-python-code-BLotL3XP.js} +1 -1
- package/dist/assets/{reveal-component-_lKImPWP.js → reveal-component-2QaMbLNx.js} +1 -1
- package/dist/assets/{run-page-7UNg--Rj.js → run-page-DyZ8JFKU.js} +1 -1
- package/dist/assets/{runtime-details-state-CKOKhMhv.js → runtime-details-state-B25uM-Ps.js} +1 -1
- package/dist/assets/{scratchpad-panel-C7h4MgqN.js → scratchpad-panel-Dt83MaaA.js} +1 -1
- package/dist/assets/{session-panel-CLiWXc5y.js → session-panel-xVWVwa1U.js} +1 -1
- package/dist/assets/{snippets-panel-Wrqaorxa.js → snippets-panel-IxIxfxNc.js} +1 -1
- package/dist/assets/{state-TVREh4u4.js → state-BHuYDaxs.js} +1 -1
- package/dist/assets/{state-_uXVmwuN.js → state-CVgqwwCU.js} +1 -1
- package/dist/assets/{terminal-Dp5gyJ7l.js → terminal-CjvCrRrA.js} +1 -1
- package/dist/assets/{tracing-fUNLyKuj.js → tracing-V5zejPsw.js} +1 -1
- package/dist/assets/{tracing-panel-Cx4OqOoP.js → tracing-panel-DLS3iwK6.js} +2 -2
- package/dist/assets/{tree-actions-B1vsdenY.js → tree-actions-Be_mzC1C.js} +1 -1
- package/dist/assets/{useAddCell-DZ-50qEG.js → useAddCell-DK79W1vA.js} +1 -1
- package/dist/assets/{useBoolean-5g-bBaYF.js → useBoolean-j0qHaJxu.js} +1 -1
- package/dist/assets/{useCellActionButton-DINnRstv.js → useCellActionButton-Cw9Ob12j.js} +1 -1
- package/dist/assets/{useDeleteCell-CREJXVNp.js → useDeleteCell-BNqX6PPu.js} +1 -1
- package/dist/assets/{useDependencyPanelTab-Cw5VT16Q.js → useDependencyPanelTab-GnTnqKJo.js} +1 -1
- package/dist/assets/{useInstallPackage-Cw0dVELh.js → useInstallPackage-CVItDn1e.js} +1 -1
- package/dist/assets/{useNotebookActions-B4av4mLc.js → useNotebookActions-_qJ1Sjtj.js} +1 -1
- package/dist/assets/{useRunCells-BHBMk9zW.js → useRunCells-DP09DHT6.js} +1 -1
- package/dist/assets/{useSplitCell-DAgwZV0q.js → useSplitCell-IfumZ4sm.js} +1 -1
- package/dist/assets/{vega-component-pQE2mKc1.js → vega-component-CMn031HF.js} +1 -1
- package/dist/index.html +24 -24
- package/package.json +2 -4
- package/src/__tests__/host-imports.test.ts +1 -0
- package/src/core/attachments/state.ts +2 -2
- package/src/core/host/AGENTS.md +6 -2
- package/src/core/host/__tests__/attachments.test.ts +9 -10
- package/src/core/host/__tests__/document.test.ts +18 -16
- package/src/core/host/__tests__/events.test.ts +5 -2
- package/src/core/host/__tests__/fixtures.ts +6 -4
- package/src/core/host/events.ts +18 -2
- package/src/core/host/notebook-client.ts +46 -13
- package/src/core/host/resources/attachments.ts +3 -3
- package/src/core/host/resources/document.ts +3 -3
- package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +1 -1
- package/dist/assets/feedback-button-DDzObtF2.js +0 -1
- package/dist/assets/panels-BLYQRkEc.js +0 -4
- package/src/core/host/__tests__/protocol.test.ts +0 -229
- package/src/core/host/__tests__/stream.test.ts +0 -209
- package/src/core/host/protocol.ts +0 -1948
- package/src/core/host/resources/resource.ts +0 -47
- package/src/core/host/stream.ts +0 -211
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-B0Z9INg1.js";import{c as t,d as n,f as r,l as i,r as a,t as o,u as s}from"./useEvent-Dfcbgjhg.js";import{t as c}from"./react-DVplv7_D.js";import{$ as l,B as u,D as d,Dt as f,Et as p,Gn as m,Hr as h,I as g,Ii as _,Jn as v,Kn as ee,Mr as y,Oo as b,Ot as x,R as S,So as C,St as te,T as w,Vi as ne,Wn as re,b as T,ei as ie,g as ae,h as oe,l as se,mr as ce,pr as le,qn as ue,r as E}from"./cells-CdH98VSn.js";import{D,E as O,P as de,S as fe,T as k,i as pe,l as me,o as he,u as ge,v as _e}from"./config-CYsbZpwa.js";import{t as ve}from"./compiler-runtime-BrajqUja.js";import{D as ye,d as be,w as xe}from"./config-DGX7JYor.js";import{_ as Se,c as Ce,g as we,i as Te,m as Ee,n as De,o as Oe,p as ke,r as Ae,s as je,t as A}from"./state-TVREh4u4.js";import{g as j,t as M}from"./useEventListener-CjDeLqFC.js";import{t as Me}from"./objects-rLPlQ3X_.js";import{i as N}from"./utils-B4K466FK.js";import{a as P,f as Ne,m as Pe,r as Fe,v as Ie}from"./session-B8Y-GJnS.js";import{r as F}from"./state-C0irhlOZ.js";import{i as Le,o as Re,r as ze}from"./state-DaWgt-rn.js";import{r as Be}from"./ErrorBoundary-hliG40Pk.js";import{n as Ve,t as I}from"./cn-ldLVeaqm.js";import{t as He}from"./jsx-runtime-B74pBk57.js";import{i as L,s as Ue}from"./fullscreen-BWTs8pYZ.js";import{a as R,c as z,i as B,l as We,n as Ge,o as V,r as Ke,s as qe}from"./use-restore-focus-DdS7Tl0F.js";import{Dt as Je,Ot as H,St as U}from"./JsonOutput-9tmC-p6h.js";import{p as W}from"./download-CCZkq0y4.js";import{t as G}from"./tooltip-CkGm8X7m.js";import{t as K}from"./button-D8gVKwe-.js";import{t as q}from"./createLucideIcon-DfJ2oMlA.js";import{P as J,a as Ye,c as Y,i as Xe,n as Ze}from"./layout-Ct0rjb-5.js";import{d as Qe,n as $e}from"./markdown-renderer-BFyD6Jhs.js";import{v as et}from"./write-secret-modal-usRSi1bb.js";import{n as tt}from"./spinner-DyNE-o8o.js";import{c as nt,l as rt,s as it}from"./readonly-python-code-DrXDDAnA.js";import{s as at}from"./MarimoErrorOutput-BaHdbtck.js";import{t as ot}from"./use-toast-Wu434mLr.js";import{i as st}from"./strings-C25fhMR_.js";import{t as ct}from"./requests-lt0JK8Jt.js";import{n as lt}from"./useAsyncData-DhhdOGGd.js";import{t as ut}from"./RenderHTML-B1FzB5NY.js";import{t as dt}from"./package-data-dv4FBHxR.js";import{f as ft}from"./useInstallPackage-Cw0dVELh.js";import{a as pt}from"./errors-CNsgAw6m.js";import{s as mt}from"./react-icons.esm-D6tfmvq8.js";import{r as ht}from"./events-CbeVJ6OD.js";import{i as gt}from"./cell-link-B_QkRkm-.js";import{t as _t}from"./requests-CgSY1X4a.js";import{r as vt,s as yt,t as bt}from"./state-Ck7FMD5A.js";import{t as xt}from"./ws-BXWY541V.js";import{n as St}from"./runs-6lJxKV1w.js";var Ct=q(`hourglass`,[[`path`,{d:`M5 22h14`,key:`ehvnwv`}],[`path`,{d:`M5 2h14`,key:`pdyrp9`}],[`path`,{d:`M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22`,key:`1d314k`}],[`path`,{d:`M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2`,key:`1vvvr6`}]]),wt=q(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),Tt=q(`unlink`,[[`path`,{d:`m18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71`,key:`yqzxt4`}],[`path`,{d:`m5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71`,key:`4qinb0`}],[`line`,{x1:`8`,x2:`8`,y1:`2`,y2:`5`,key:`1041cp`}],[`line`,{x1:`2`,x2:`5`,y1:`8`,y2:`8`,key:`14m1p5`}],[`line`,{x1:`16`,x2:`16`,y1:`19`,y2:`22`,key:`rzdirn`}],[`line`,{x1:`19`,x2:`22`,y1:`16`,y2:`16`,key:`ox905f`}]]),X=He(),Z=ve(),Q=e(c(),1);function Et(e){let t=(0,Z.c)(3),[n,r]=(0,Q.useState)(e<=0),i,a;return t[0]===e?(i=t[1],a=t[2]):(i=()=>{if(e<=0){r(!0);return}r(!1);let t=setTimeout(()=>r(!0),e);return()=>clearTimeout(t)},a=[e],t[0]=e,t[1]=i,t[2]=a),(0,Q.useLayoutEffect)(i,a),n}var Dt=e=>{let{requires:t,fallback:n,delay:r,children:a}=e,o=n===void 0?null:n,s=r===void 0?0:r,c=i(t),l=Et(c?0:s);return c?a:l?o:null},Ot=e=>{let t=(0,Z.c)(10),{title:n}=e,[r,i]=(0,Q.useState)(n),[a,o]=(0,Q.useState)(!0),s,c;t[0]!==r||t[1]!==n?(s=()=>{if(n!==r){o(!1);let e=setTimeout(()=>{i(n),o(!0)},300);return()=>clearTimeout(e)}},c=[n,r],t[0]=r,t[1]=n,t[2]=s,t[3]=c):(s=t[2],c=t[3]),(0,Q.useEffect)(s,c);let l;t[4]===Symbol.for(`react.memo_cache_sentinel`)?(l=(0,X.jsx)(tt,{className:`size-20 animate-spin text-primary`,"data-testid":`large-spinner`,strokeWidth:1}),t[4]=l):l=t[4];let u=a?`opacity-100`:`opacity-0`,d;t[5]===u?d=t[6]:(d=I(`mt-2 text-muted-foreground font-semibold text-lg transition-opacity duration-300`,u),t[5]=u,t[6]=d);let f;return t[7]!==r||t[8]!==d?(f=(0,X.jsxs)(`div`,{className:`flex flex-col h-full flex-1 items-center justify-center p-4`,children:[l,(0,X.jsx)(`div`,{className:d,children:r})]}),t[7]=r,t[8]=d,t[9]=f):f=t[9],f};function kt(e,t){return e===`edit`||e===`home`||e===`gallery`?!0:e===`present`||P(N.includeCode,`false`)||P(N.showCode,`false`)?!1:P(N.showCode,`true`)?!0:t}function At(e){let t=kt(e.mode,e.showAppCode),n=e.hasCells&&e.hasCachedOutputs;return{showCode:t,showCachedOutputs:n,canPaint:e.hasCells&&(t||n||e.allCellsIdle)}}var jt=r(e=>{let t=!1,n=!0;for(let r of Object.values(e(T).cellRuntime))$e(r.output)||(t=!0),r.status!==`idle`&&(n=!1);return{hasCachedOutputs:t,allCellsIdle:n}}),Mt=r(e=>e(jt).hasCachedOutputs),Nt=r(e=>e(jt).allCellsIdle),Pt=r(e=>At({mode:e(Ne),showAppCode:e(F),hasCells:e(ae),hasCachedOutputs:e(Mt),allCellsIdle:e(Nt)})),Ft=r(e=>e(Pt).canPaint),It=e=>{let t=(0,Z.c)(2),{children:n}=e;if(!de())return n;let r;return t[0]===n?r=t[1]:(r=(0,X.jsx)(Lt,{children:n}),t[0]=n,t[1]=r),r},Lt=e=>{let t=(0,Z.c)(8),{children:n}=e,r;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(r=[],t[0]=r):r=t[0];let{error:a}=lt(zt,r),o=i(Ft),s=(0,Q.useRef)(!1),c,l;if(t[1]!==o||t[2]!==a?(c=()=>{a&&o&&!s.current&&(s.current=!0,j.error(`Pyodide failed to initialize`,a),ot({title:`Failed to start the notebook runtime`,description:pt(a),variant:`danger`}))},l=[a,o],t[1]=o,t[2]=a,t[3]=c,t[4]=l):(c=t[3],l=t[4]),(0,Q.useEffect)(c,l),a&&!o)throw a;let u;t[5]===Symbol.for(`react.memo_cache_sentinel`)?(u=(0,X.jsx)(Rt,{}),t[5]=u):u=t[5];let d;return t[6]===n?d=t[7]:(d=(0,X.jsx)(Dt,{requires:Ft,fallback:u,children:n}),t[6]=n,t[7]=d),d},Rt=()=>{let e=(0,Z.c)(2),t=i(Re),n=t.kind===`loading`?t.message:`Loading…`,r;return e[0]===n?r=e[1]:(r=(0,X.jsx)(Ot,{title:n}),e[0]=n,e[1]=r),r};async function zt(){return await ke.INSTANCE.initialized.promise,!0}var $={idle:`./favicon.ico`,success:`data:image/x-icon;base64,AAABAAEAMDAAAAEACACoDgAAFgAAACgAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAAAAAAAAAAAAEAAAABAAAAAAAAXXQAAFd3AwBWeAQAVngEAFd4AwBXeAQAVnkEAFh3AwBXdwQAVXcGAFd4BQBXeAQAWHgEAFd6AwBXeAMAVnkEAFZ5AwBXdwQAV3cFAFd4BABYeAQAV3gEAFh4BABXeAQA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYYGAYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcYGBgYGBgYGBgYGBgYGAcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGBgYGBgYGBgYGBgYGBgYGBgYCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAsYGBgYGBgYDA0OChkZGRkKDg0MGBgYGBgYGAsAAAAAAAAAAAAAAAAAAAAAAAAAAxgYGBgYGA8QGRkZGRkZGRkZGRkZEA8YGBgYGBgDAAAAAAAAAAAAAAAAAAAAAAARGBgYGBgSChkZGRkZGRkZGRkZGRkZGRkKEhgYGBgYEQAAAAAAAAAAAAAAAAAAAAMYGBgYGBMZGRkZGRkZGRkZGRkZGRkZGRkZGRMYGBgYGAMAAAAAAAAAAAAAAAAACxgYGBgUEBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkQFBgYGBgLAAAAAAAAAAAAAAAKGBgYGBQKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChQYGBgYCgAAAAAAAAAAAAAEGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYBAAAAAAAAAAAAAgYGBgYExkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkTGBgYGAgAAAAAAAAAAAkYGBgSGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZEhgYGAkAAAAAAAAAAhgYGBgKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChgYGBgCAAAAAAAABxgYGA8ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ8YGBgHAAAAAAABGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYAQAAAAACGBgYDBkZGRkZGRkZGRkZGRkXFhYVGRkZGRkZGRkZGRkZGRkZGRkMGBgYAgAAAAADGBgYDRkZGRkZGRkZGRkZGRcYGBgYFxkZGRkZGRkZGRkZGRkZGRkNGBgYAwAAAAAEGBgYDhkZGRkZGRkZGRkZFxgYGBgYGBcZGRkZGRkZGRkZGRkZGRkOGBgYBAAAAAAFGBgYChkZGRkZGRkZGRkXGBgYGBgYGBgXGRkZGRkZGRkZGRkZGRkKGBgYBQAAAAAGGBgYGRkZGRkZGRkZGRUYGBgYGBgYGBgYFxkZGRkZGRkZGRkZGRkZGBgYBgAAAAAYGBgYGRkZGRkZGRkZGRYYGBgYFxcYGBgYGBcZGRkZGRkZGRkZGRkZGBgYGAAAAAAYGBgYGRkZGRkZGRkZGRYYGBgXGRkXGBgYGBgXGRkZGRkZGRkZGRkZGBgYGAAAAAAGGBgYGRkZGRkZGRkZGRUWFhcZGRkZFxgYGBgYFxkZGRkZGRkZGRkZGBgYBgAAAAAFGBgYChkZGRkZGRkZGRkZGRkZGRkZGRcYGBgYGBcZGRkZGRkZGRkKGBgYBQAAAAAEGBgYDhkZGRkZGRkZGRkZGRkZGRkZGRkXGBgYGBYZGRkZGRkZGRkOGBgYBAAAAAADGBgYDRkZGRkZGRkZGRkZGRkZGRkZGRkZFxgYGBYZGRkZGRkZGRkNGBgYAwAAAAACGBgYDBkZGRkZGRkZGRkZGRkZGRkZGRkZGRUWFhUZGRkZGRkZGRkMGBgYAgAAAAABGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYAQAAAAAABxgYGA8ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQ8YGBgHAAAAAAAAAhgYGBgKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChgYGBgCAAAAAAAAAAkYGBgSGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZEhgYGAkAAAAAAAAAAAgYGBgYExkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkTGBgYGAgAAAAAAAAAAAAEGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYBAAAAAAAAAAAAAAKGBgYGBQKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChQYGBgYCgAAAAAAAAAAAAAACxgYGBgUEBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkQFBgYGBgLAAAAAAAAAAAAAAAAAAMYGBgYGBMZGRkZGRkZGRkZGRkZGRkZGRkZGRMYGBgYGAMAAAAAAAAAAAAAAAAAAAARGBgYGBgSChkZGRkZGRkZGRkZGRkZGRkKEhgYGBgYEQAAAAAAAAAAAAAAAAAAAAAAAxgYGBgYGA8QGRkZGRkZGRkZGRkZEA8YGBgYGBgDAAAAAAAAAAAAAAAAAAAAAAAAAAsYGBgYGBgYDA0OChkZGRkKDg0MGBgYGBgYGAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGBgYGBgYGBgYGBgYGBgYGBgYCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcYGBgYGBgYGBgYGBgYGAcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYYGAYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD///////8AAP//gAH//wAA//4AAH//AAD/+AAAH/8AAP/gAAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA+AAAAAAfAADwAAAAAA8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAAAA8AAPgAAAAAHwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/AAAAD/wAA/+AAAAf/AAD/+AAAH/8AAP/+AAB//wAA//+AAf//AAD///////8AAP///////wAA`,running:`data:image/x-icon;base64,AAABAAEAMDAAAAEACACoDgAAFgAAACgAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAAAAAAAAAAAAEAAAABAAAAAAAA0YsAAMWEAwDHgwIAx4QBAMeEAgDGhAIAyIUBAMaFAwDGhAIAxoIAAMaFAgDHhAIAx4QCAMiFAwDHhAIAx4YAAMaFAgDHhQEAxoMCAMeEAgDHgwQAx4QDAMeDAgDHhAIA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYYGAYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcYGBgYGBgYGBgYGBgYGAcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGBgYGBgYGBgYGBgYGBgYGBgYCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAsYGBgYGBgYDA0OChkZGRkKDg0MGBgYGBgYGAsAAAAAAAAAAAAAAAAAAAAAAAAAAxgYGBgYGA8QGRkZGRkZGRkZGRkZEA8YGBgYGBgDAAAAAAAAAAAAAAAAAAAAAAARGBgYGBgSChkZGRkZGRkZGRkZGRkZGRkKEhgYGBgYEQAAAAAAAAAAAAAAAAAAAAMYGBgYGBMZGRkZGRkZGRkZGRkZGRkZGRkZGRMYGBgYGAMAAAAAAAAAAAAAAAAACxgYGBgUEBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkQFBgYGBgLAAAAAAAAAAAAAAAKGBgYGBQKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChQYGBgYCgAAAAAAAAAAAAAEGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYBAAAAAAAAAAAAAgYGBgYExkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkTGBgYGAgAAAAAAAAAAAkYGBgSGRkZGRkZGRkZFRgWFxkZGRkZGRkZGRkZGRkZGRkZEhgYGAkAAAAAAAAAAhgYGBgKGRkZGRkZGRkZFhgYGBYVGRkZGRkZGRkZGRkZGRkZChgYGBgCAAAAAAAABxgYGA8ZGRkZGRkZGRkZGBgYGBgYFxkZGRkZGRkZGRkZGRkZGQ8YGBgHAAAAAAABGBgYGBAZGRkZGRkZGRkZGBgYGBgYGBYVGRkZGRkZGRkZGRkZGRAYGBgYAQAAAAACGBgYDBkZGRkZGRkZGRkZGBgYGBgYGBgYFxkZGRkZGRkZGRkZGRkMGBgYAgAAAAADGBgYDRkZGRkZGRkZGRkZGBgYGBgYGBgYGBYVGRkZGRkZGRkZGRkNGBgYAwAAAAAEGBgYDhkZGRkZGRkZGRkZGBgYGBUWGBgYGBgYFxkZGRkZGRkZGRkOGBgYBAAAAAAFGBgYChkZGRkZGRkZGRkZGBgYGBkZFxgYGBgYGBYVGRkZGRkZGRkKGBgYBQAAAAAGGBgYGRkZGRkZGRkZGRkZGBgYGBkZGRUWGBgYGBgYFxkZGRkZGRkZGBgYBgAAAAAYGBgYGRkZGRkZGRkZGRkZGBgYGBkZGRkZFxgYGBgYFxkZGRkZGRkZGBgYGAAAAAAYGBgYGRkZGRkZGRkZGRkZGBgYGBkZGRkZFxgYGBgYFhkZGRkZGRkZGBgYGAAAAAAGGBgYGRkZGRkZGRkZGRkZGBgYGBkZGRkXGBgYGBgYFRkZGRkZGRkZGBgYBgAAAAAFGBgYChkZGRkZGRkZGRkZGBgYGBkZFxgYGBgYGBcZGRkZGRkZGRkKGBgYBQAAAAAEGBgYDhkZGRkZGRkZGRkZGBgYGBkXGBgYGBgYFxkZGRkZGRkZGRkOGBgYBAAAAAADGBgYDRkZGRkZGRkZGRkZGBgYGBgYGBgYGBcZGRkZGRkZGRkZGRkNGBgYAwAAAAACGBgYDBkZGRkZGRkZGRkZGBgYGBgYGBgYFxkZGRkZGRkZGRkZGRkMGBgYAgAAAAABGBgYGBAZGRkZGRkZGRkZGBgYGBgYGBcZGRkZGRkZGRkZGRkZGRAYGBgYAQAAAAAABxgYGA8ZGRkZGRkZGRkZGBgYGBgYFxkZGRkZGRkZGRkZGRkZGQ8YGBgHAAAAAAAAAhgYGBgKGRkZGRkZGRkZFhgYGBcZGRkZGRkZGRkZGRkZGRkZChgYGBgCAAAAAAAAAAkYGBgSGRkZGRkZGRkZFRYWFxkZGRkZGRkZGRkZGRkZGRkZEhgYGAkAAAAAAAAAAAgYGBgYExkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkTGBgYGAgAAAAAAAAAAAAEGBgYGBAZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRAYGBgYBAAAAAAAAAAAAAAKGBgYGBQKGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZChQYGBgYCgAAAAAAAAAAAAAACxgYGBgUEBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkQFBgYGBgLAAAAAAAAAAAAAAAAAAMYGBgYGBMZGRkZGRkZGRkZGRkZGRkZGRkZGRMYGBgYGAMAAAAAAAAAAAAAAAAAAAARGBgYGBgSChkZGRkZGRkZGRkZGRkZGRkKEhgYGBgYEQAAAAAAAAAAAAAAAAAAAAAAAxgYGBgYGA8QGRkZGRkZGRkZGRkZEA8YGBgYGBgDAAAAAAAAAAAAAAAAAAAAAAAAAAsYGBgYGBgYDA0OChkZGRkKDg0MGBgYGBgYGAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGBgYGBgYGBgYGBgYGBgYGBgYCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcYGBgYGBgYGBgYGBgYGAcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYYGAYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD///////8AAP//gAH//wAA//4AAH//AAD/+AAAH/8AAP/gAAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA+AAAAAAfAADwAAAAAA8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAAAA8AAPgAAAAAHwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/AAAAD/wAA/+AAAAf/AAD/+AAAH/8AAP/+AAB//wAA//+AAf//AAD///////8AAP///////wAA`,error:`data:image/x-icon;base64,AAABAAEAMDAAAAEACACoDgAAFgAAACgAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAAAAAAAAAAAAEAAAABAAAAAAAALi7oACcn2wAlJdsAJibcACYm3AAmJtsAJyfdACUl3QAmJtsAKCjdACUl3AAmJtwAJyfcACYm3AAoKNcAJibcACcn3AAmJt0AJibcACUl3AAmJtwAKCjbACcn3AAmJtsAJibcAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYZGQYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcZGRkZGRkZGRkZGRkZGQcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGRkZGRkZGRkZGRkZGRkZGRkZCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAsZGRkZGRkZDA0ODxoaGhoPDg0MGRkZGRkZGQsAAAAAAAAAAAAAAAAAAAAAAAAAAxkZGRkZGRARGhoaGhoaGhoaGhoaERAZGRkZGRkDAAAAAAAAAAAAAAAAAAAAAAASGRkZGRkTDxoaGhoaGhoaGhoaGhoaGhoPExkZGRkZEgAAAAAAAAAAAAAAAAAAAAMZGRkZGRQaGhoaGhoaGhoaGhoaGhoaGhoaGhQZGRkZGQMAAAAAAAAAAAAAAAAACxkZGRkVERoaGhoaGhoaGhoaGhoaGhoaGhoaGhoRFRkZGRkLAAAAAAAAAAAAAAAKGRkZGRUPGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaDxUZGRkZCgAAAAAAAAAAAAAEGRkZGREaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhEZGRkZBAAAAAAAAAAAAAgZGRkZFBoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoUGRkZGQgAAAAAAAAAAAkZGRkTGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaExkZGQkAAAAAAAAAAhkZGRkPGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaDxkZGRkCAAAAAAAABxkZGRAaGhoaGhoaGhYXFxYaGhoaGhoaGhgXFxYaGhoaGhoaGhAZGRkHAAAAAAABGRkZGREaGhoaGhoaGhcZGRkYGhoaGhoaGBkZGRcaGhoaGhoaGhEZGRkZAQAAAAACGRkZDBoaGhoaGhoaGhcZGRkZGBoaGhoYGRkZGRcaGhoaGhoaGhoMGRkZAgAAAAADGRkZDRoaGhoaGhoaGhgZGRkZGRgaGhgZGRkZGRYaGhoaGhoaGhoNGRkZAwAAAAAEGRkZDhoaGhoaGhoaGhoYGRkZGRkYGBkZGRkZGBoaGhoaGhoaGhoOGRkZBAAAAAAFGRkZDxoaGhoaGhoaGhoaGBkZGRkZGRkZGRkYGhoaGhoaGhoaGhoPGRkZBQAAAAAGGRkZGhoaGhoaGhoaGhoaGhgZGRkZGRkZGRgaGhoaGhoaGhoaGhoaGRkZBgAAAAAZGRkZGhoaGhoaGhoaGhoaGhoYGRkZGRkZGBoaGhoaGhoaGhoaGhoaGRkZGQAAAAAZGRkZGhoaGhoaGhoaGhoaGhoYGRkZGRkZGBoaGhoaGhoaGhoaGhoaGRkZGQAAAAAGGRkZGhoaGhoaGhoaGhoaGhgZGRkZGRkZGRgaGhoaGhoaGhoaGhoaGRkZBgAAAAAFGRkZDxoaGhoaGhoaGhoaGBkZGRkZGRkZGRkYGhoaGhoaGhoaGhoPGRkZBQAAAAAEGRkZDhoaGhoaGhoaGhoYGRkZGRkYGBkZGRkZGBoaGhoaGhoaGhoOGRkZBAAAAAADGRkZDRoaGhoaGhoaGhYZGRkZGRgaGhgZGRkZGRgaGhoaGhoaGhoNGRkZAwAAAAACGRkZDBoaGhoaGhoaGhcZGRkZGBoaGhoYGRkZGRcaGhoaGhoaGhoMGRkZAgAAAAABGRkZGREaGhoaGhoaGhcZGRkYGhoaGhoaGBkZGRcaGhoaGhoaGhEZGRkZAQAAAAAABxkZGRAaGhoaGhoaGhYXFxgaGhoaGhoaGhYXFxYaGhoaGhoaGhAZGRkHAAAAAAAAAhkZGRkPGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaDxkZGRkCAAAAAAAAAAkZGRkTGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaExkZGQkAAAAAAAAAAAgZGRkZFBoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoUGRkZGQgAAAAAAAAAAAAEGRkZGREaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhEZGRkZBAAAAAAAAAAAAAAKGRkZGRUPGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaDxUZGRkZCgAAAAAAAAAAAAAACxkZGRkVERoaGhoaGhoaGhoaGhoaGhoaGhoaGhoRFRkZGRkLAAAAAAAAAAAAAAAAAAMZGRkZGRQaGhoaGhoaGhoaGhoaGhoaGhoaGhQZGRkZGQMAAAAAAAAAAAAAAAAAAAASGRkZGRkTDxoaGhoaGhoaGhoaGhoaGhoPExkZGRkZEgAAAAAAAAAAAAAAAAAAAAAAAxkZGRkZGRARGhoaGhoaGhoaGhoaERAZGRkZGRkDAAAAAAAAAAAAAAAAAAAAAAAAAAsZGRkZGRkZDA0ODxoaGhoPDg0MGRkZGRkZGQsAAAAAAAAAAAAAAAAAAAAAAAAAAAAKBBkZGRkZGRkZGRkZGRkZGRkZGRkZGRkECgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJGRkZGRkZGRkZGRkZGRkZGRkZCQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcZGRkZGRkZGRkZGRkZGQcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMEBQYZGQYFBAMCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////AAD///////8AAP//gAH//wAA//4AAH//AAD/+AAAH/8AAP/gAAAH/wAA/8AAAAP/AAD/gAAAAf8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA+AAAAAAfAADwAAAAAA8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAMAAAAAAAwAAwAAAAAADAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAADwAAAAAA8AAPgAAAAAHwAA+AAAAAAfAAD8AAAAAD8AAP4AAAAAfwAA/wAAAAD/AAD/gAAAAf8AAP/AAAAD/wAA/+AAAAf/AAD/+AAAH/8AAP/+AAB//wAA//+AAf//AAD///////8AAP///////wAA`};function Bt(){let e=document.querySelector(`link[rel~='icon']`);if(e)return e;let t=document.createElement(`link`);return t.rel=`icon`,document.head.append(t),t}function Vt(e){if(document.visibilityState===`visible`)return;let t=()=>{e===0?new Notification(`Execution completed`,{body:`Your notebook run completed successfully.`,icon:$.success}):new Notification(`Execution failed`,{body:`Your notebook run encountered ${e} error(s).`,icon:$.error})};!(`Notification`in window)||Notification.permission===`denied`||(Notification.permission===`granted`?t():Notification.permission==="default"&&Notification.requestPermission().then(e=>{e===`granted`&&t()}))}var Ht=e=>{let t=(0,Z.c)(11),{isRunning:n}=e,r=i(E),a,o;t[0]!==n||t[1]!==r?(a=()=>{let e=Bt();if(!n&&e.href.includes(`favicon`)||(e.href=$[n?`running`:r===0?`success`:`error`],!document.hasFocus()))return;let t=setTimeout(()=>{e.href=$.idle},3e3);return()=>clearTimeout(t)},o=[n,r],t[0]=n,t[1]=r,t[2]=a,t[3]=o):(a=t[2],o=t[3]),(0,Q.useEffect)(a,o);let s=J(n)??n,c,l;t[4]!==n||t[5]!==r||t[6]!==s?(c=()=>{s&&!n&&Vt(r)},l=[r,s,n],t[4]=n,t[5]=r,t[6]=s,t[7]=c,t[8]=l):(c=t[7],l=t[8]),(0,Q.useEffect)(c,l);let u;return t[9]===n?u=t[10]:(u=()=>{if(!n){let e=Bt();e.href=$.idle}},t[9]=n,t[10]=u),M(window,`focus`,u),null};function Ut(){let{cellIds:e,cellRuntime:t}=a.get(T),n=e.inOrderIds.find(e=>t[e]?.status===`running`);n&>(n,`focus`)}var Wt=e=>{let t=(0,Z.c)(18),{connection:n,isRunning:r,onReconnect:a}=e,{mode:o}=i(Ie),s=n.state===O.CLOSED&&(o===`read`||n.code!==k.KERNEL_STARTUP_ERROR),c=n.state===O.OPEN,l=s&&n.code===k.KERNEL_DISCONNECTED,u;t[0]===s?u=t[1]:(u=s&&(0,X.jsx)(Jt,{}),t[0]=s,t[1]=u);let d=o===`read`?`fixed`:`absolute`,f;t[2]===d?f=t[3]:(f=I(`z-50 top-4 left-4`,d),t[2]=d,t[3]=f);let p;t[4]!==c||t[5]!==r?(p=c&&r&&(0,X.jsx)(qt,{}),t[4]=c,t[5]=r,t[6]=p):p=t[6];let m;t[7]!==l||t[8]!==s||t[9]!==a?(m=s&&(0,X.jsx)(Kt,{onReconnect:l?a:void 0}),t[7]=l,t[8]=s,t[9]=a,t[10]=m):m=t[10];let h;t[11]!==f||t[12]!==p||t[13]!==m?(h=(0,X.jsxs)(`div`,{className:f,children:[p,m]}),t[11]=f,t[12]=p,t[13]=m,t[14]=h):h=t[14];let g;return t[15]!==u||t[16]!==h?(g=(0,X.jsxs)(X.Fragment,{children:[u,h]}),t[15]=u,t[16]=h,t[17]=g):g=t[17],g},Gt=`print:hidden pointer-events-auto hover:cursor-pointer`,Kt=e=>{let t=(0,Z.c)(12),{onReconnect:n}=e,r=!n,i=r?`App disconnected`:`App disconnected — click to reconnect`,a=r?0:-1,o;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(o=I(Gt,`bg-transparent border-0 p-0`),t[0]=o):o=t[0];let s=r?`App disconnected`:`Reconnect to app`,c;t[1]===Symbol.for(`react.memo_cache_sentinel`)?(c=(0,X.jsx)(Tt,{className:`w-[25px] h-[25px] text-(--red-11)`}),t[1]=c):c=t[1];let l;t[2]!==r||t[3]!==n||t[4]!==s?(l=(0,X.jsx)(`button`,{type:`button`,className:o,"aria-label":s,"data-testid":`disconnected-indicator`,onClick:n,disabled:r,children:c}),t[2]=r,t[3]=n,t[4]=s,t[5]=l):l=t[5];let u;t[6]!==a||t[7]!==l?(u=(0,X.jsx)(`span`,{tabIndex:a,children:l}),t[6]=a,t[7]=l,t[8]=u):u=t[8];let d;return t[9]!==i||t[10]!==u?(d=(0,X.jsx)(G,{content:i,children:u}),t[9]=i,t[10]=u,t[11]=d):d=t[11],d},qt=()=>{let e=(0,Z.c)(6),t=i(w),n=t?`Scratchpad is running`:`Jump to running cell`,r=t?void 0:Ut,a;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,X.jsx)(Ct,{className:`running-app-icon`,size:30,strokeWidth:1}),e[0]=a):a=e[0];let o;e[1]===r?o=e[2]:(o=(0,X.jsx)(`div`,{className:Gt,"data-testid":`loading-indicator`,onClick:r,children:a}),e[1]=r,e[2]=o);let s;return e[3]!==o||e[4]!==n?(s=(0,X.jsx)(G,{content:n,side:`right`,children:o}),e[3]=o,e[4]=n,e[5]=s):s=e[5],s},Jt=()=>{let e=(0,Z.c)(1),t;return e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`div`,{className:`noise`}),(0,X.jsx)(`div`,{className:`disconnected-gradient`})]}),e[0]=t):t=e[0],t},Yt=Ge,Xt=We,Zt=L(qe),Qt=Q.forwardRef((e,t)=>{let n=(0,Z.c)(9),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a;n[3]===r?a=n[4]:(a=I(`fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0`,r),n[3]=r,n[4]=a);let o;return n[5]!==i||n[6]!==t||n[7]!==a?(o=(0,X.jsx)(V,{className:a,...i,ref:t}),n[5]=i,n[6]=t,n[7]=a,n[8]=o):o=n[8],o});Qt.displayName=V.displayName;var $t=Ve(`fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500`,{variants:{side:{top:`inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top`,bottom:`inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom`,left:`inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm`,right:`inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm`}},defaultVariants:{side:`right`}}),en=Q.forwardRef((e,t)=>{let n=(0,Z.c)(15),r,i,a,o;n[0]===e?(r=n[1],i=n[2],a=n[3],o=n[4]):({side:o,className:i,children:r,...a}=e,n[0]=e,n[1]=r,n[2]=i,n[3]=a,n[4]=o);let s=o===void 0?`right`:o,c;n[5]===Symbol.for(`react.memo_cache_sentinel`)?(c=(0,X.jsx)(Qt,{}),n[5]=c):c=n[5];let l;n[6]!==i||n[7]!==s?(l=I($t({side:s}),i),n[6]=i,n[7]=s,n[8]=l):l=n[8];let u;n[9]===Symbol.for(`react.memo_cache_sentinel`)?(u=(0,X.jsxs)(Ke,{className:`absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary`,children:[(0,X.jsx)(mt,{className:`h-4 w-4`}),(0,X.jsx)(`span`,{className:`sr-only`,children:`Close`})]}),n[9]=u):u=n[9];let d;return n[10]!==r||n[11]!==a||n[12]!==t||n[13]!==l?(d=(0,X.jsx)(Zt,{children:(0,X.jsxs)(Ue,{children:[c,(0,X.jsxs)(B,{ref:t,className:l,...a,children:[r,u]})]})}),n[10]=r,n[11]=a,n[12]=t,n[13]=l,n[14]=d):d=n[14],d});en.displayName=B.displayName;var tn=Q.forwardRef((e,t)=>{let n=(0,Z.c)(9),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a;n[3]===r?a=n[4]:(a=I(`text-lg font-semibold text-foreground`,r),n[3]=r,n[4]=a);let o;return n[5]!==i||n[6]!==t||n[7]!==a?(o=(0,X.jsx)(z,{ref:t,className:a,...i}),n[5]=i,n[6]=t,n[7]=a,n[8]=o):o=n[8],o});tn.displayName=z.displayName;var nn=Q.forwardRef((e,t)=>{let n=(0,Z.c)(9),r,i;n[0]===e?(r=n[1],i=n[2]):({className:r,...i}=e,n[0]=e,n[1]=r,n[2]=i);let a;n[3]===r?a=n[4]:(a=I(`text-sm text-muted-foreground`,r),n[3]=r,n[4]=a);let o;return n[5]!==i||n[6]!==t||n[7]!==a?(o=(0,X.jsx)(R,{ref:t,className:a,...i}),n[5]=i,n[6]=t,n[7]=a,n[8]=o):o=n[8],o});nn.displayName=R.displayName;var rn=(0,Q.memo)(()=>{let e=(0,Z.c)(1),t;return e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=(0,X.jsx)(Je,{name:U.SIDEBAR}),e[0]=t):t=e[0],t});rn.displayName=`SidebarSlot`;var an=e=>{let t=(0,Z.c)(6),{openWidth:n}=e,r;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(r=(0,X.jsx)(Xt,{className:`lg:hidden`,asChild:!0,children:(0,X.jsx)(K,{variant:`ghost`,className:`bg-background`,children:(0,X.jsx)(wt,{className:`w-5 h-5`})})}),t[0]=r):r=t[0];let i;t[1]===n?i=t[2]:(i={maxWidth:n},t[1]=n,t[2]=i);let a;t[3]===Symbol.for(`react.memo_cache_sentinel`)?(a=(0,X.jsx)(rn,{}),t[3]=a):a=t[3];let o;return t[4]===i?o=t[5]:(o=(0,X.jsxs)(Yt,{children:[r,(0,X.jsx)(en,{className:`w-full px-3 h-full flex flex-col overflow-y-auto`,style:i,side:`left`,children:a})]}),t[4]=i,t[5]=o),o},on=e=>{let t=(0,Z.c)(7),{isOpen:n,toggle:r}=e,i=n?`rotate-0`:`rotate-180`,a;t[0]===i?a=t[1]:(a=I(`h-5 w-5 transition-transform ease-in-out duration-700`,i),t[0]=i,t[1]=a);let o;t[2]===a?o=t[3]:(o=(0,X.jsx)(W,{className:a}),t[2]=a,t[3]=o);let s;return t[4]!==o||t[5]!==r?(s=(0,X.jsx)(`div`,{className:`invisible lg:visible absolute top-[12px] right-[16px] z-20`,children:(0,X.jsx)(K,{onClick:r,className:`w-10 h-8`,variant:`ghost`,size:`icon`,children:o})}),t[4]=o,t[5]=r,t[6]=s):s=t[6],s},sn=e=>{let t=(0,Z.c)(11),{isOpen:n,toggle:r,width:i}=e,a=n?i:A,o;t[0]===a?o=t[1]:(o={width:a},t[0]=a,t[1]=o);let s;t[2]===Symbol.for(`react.memo_cache_sentinel`)?(s=I(`app-sidebar auto-collapse-nav`,`top-0 left-0 z-20 h-full hidden lg:block relative transition-[width] ease-in-out duration-300`),t[2]=s):s=t[2];let c;t[3]!==n||t[4]!==r?(c=(0,X.jsx)(on,{isOpen:n,toggle:r}),t[3]=n,t[4]=r,t[5]=c):c=t[5];let l;t[6]===Symbol.for(`react.memo_cache_sentinel`)?(l=(0,X.jsx)(`div`,{className:`relative h-full flex flex-col px-3 pb-16 pt-14 overflow-y-auto shadow-sm border-l`,children:(0,X.jsx)(rn,{})}),t[6]=l):l=t[6];let u;return t[7]!==n||t[8]!==o||t[9]!==c?(u=(0,X.jsxs)(`aside`,{"data-expanded":n,style:o,className:s,children:[c,l]}),t[7]=n,t[8]=o,t[9]=c,t[10]=u):u=t[10],u},cn=e=>{let n=(0,Z.c)(15),{children:r}=e,[i,a]=t(Ae),{isOpen:o,width:s}=i;if(H(U.SIDEBAR).length===0)return r;let c;n[0]===s?c=n[1]:(c=De(s),n[0]=s,n[1]=c);let l=c,u;n[2]!==a||n[3]!==o?(u=()=>a({type:`toggle`,isOpen:!o}),n[2]=a,n[3]=o,n[4]=u):u=n[4];let d;n[5]!==o||n[6]!==l||n[7]!==u?(d=(0,X.jsx)(sn,{isOpen:o,width:l,toggle:u}),n[5]=o,n[6]=l,n[7]=u,n[8]=d):d=n[8];let f;n[9]===l?f=n[10]:(f=(0,X.jsx)(`div`,{className:`absolute top-3 left-4 flex items-center z-50`,children:(0,X.jsx)(an,{openWidth:l})}),n[9]=l,n[10]=f);let p;return n[11]!==r||n[12]!==d||n[13]!==f?(p=(0,X.jsxs)(`div`,{className:`inset-0 absolute flex`,children:[d,f,r]}),n[11]=r,n[12]=d,n[13]=f,n[14]=p):p=n[14],p},ln=e=>{let t=(0,Z.c)(19),{width:n,connection:r,isRunning:i,children:a,onReconnect:o}=e,s=r.state,c;t[0]===i?c=t[1]:(c=(0,X.jsx)(Ht,{isRunning:i}),t[0]=i,t[1]=c);let l;t[2]!==r||t[3]!==i||t[4]!==o?(l=(0,X.jsx)(Wt,{connection:r,isRunning:i,onReconnect:o}),t[2]=r,t[3]=i,t[4]=o,t[5]=l):l=t[5];let u=r.state===O.CLOSED&&r.code!==k.KERNEL_STARTUP_ERROR&&`disconnected`,d=n===`full`&&`config-width-full`,f=n===`columns`?`overflow-x-auto`:`overflow-x-auto sm:overflow-x-hidden`,p;t[6]!==u||t[7]!==d||t[8]!==f?(p=I(`mathjax_ignore`,u,`bg-background w-full h-full text-textColor`,`flex flex-col overflow-y-auto`,d,f,`print:height-fit`),t[6]=u,t[7]=d,t[8]=f,t[9]=p):p=t[9];let m;t[10]!==a||t[11]!==s||t[12]!==p||t[13]!==n?(m=(0,X.jsx)(It,{children:(0,X.jsx)(cn,{children:(0,X.jsx)(`div`,{id:`App`,"data-config-width":n,"data-connection-state":s,className:p,children:a})})}),t[10]=a,t[11]=s,t[12]=p,t[13]=n,t[14]=m):m=t[14];let h;return t[15]!==c||t[16]!==l||t[17]!==m?(h=(0,X.jsxs)(X.Fragment,{children:[c,l,m]}),t[15]=c,t[16]=l,t[17]=m,t[18]=h):h=t[18],h},un=(0,Q.memo)(e=>{let t=(0,Z.c)(9),{appConfig:n,mode:r,children:a}=e,{selectedLayout:o}=rt();if(!i(Pe)&&(r===`edit`||r===`present`&&o===`vertical`))return a;let s=r===`read`,c;t[0]!==o||t[1]!==s?(c=it({selectedLayout:o,isReading:s,searchParams:new URLSearchParams(window.location.search)}),t[0]=o,t[1]=s,t[2]=c):c=t[2];let l=c,u;t[3]===l?u=t[4]:(u=Ye.find(e=>e.type===l),t[3]=l,t[4]=u);let d=u;if(!d)return a;let f;return t[5]!==n||t[6]!==r||t[7]!==d?(f=(0,X.jsx)(dn,{appConfig:n,mode:r,plugin:d}),t[5]=n,t[6]=r,t[7]=d,t[8]=f):f=t[8],f});un.displayName=`CellsRenderer`;var dn=e=>{let t=(0,Z.c)(12),{appConfig:n,mode:r,plugin:i}=e,a=rt(),o=g(),{setCurrentLayoutData:s}=nt(),c,l;t[0]!==a||t[1]!==o||t[2]!==i?(c=se(o),l=Xe({state:a,plugin:i,cells:c}),t[0]=a,t[1]=o,t[2]=i,t[3]=c,t[4]=l):(c=t[3],l=t[4]);let u=l,d=i.Component,f;return t[5]!==d||t[6]!==n||t[7]!==c||t[8]!==u||t[9]!==r||t[10]!==s?(f=(0,X.jsx)(d,{appConfig:n,mode:r,cells:c,layout:u,setLayout:s}),t[5]=d,t[6]=n,t[7]=c,t[8]=u,t[9]=r,t[10]=s,t[11]=f):f=t[11],f},fn=class e{hasStarted=!1;static get INSTANCE(){let t=`_marimo_private_RuntimeState`;return window[t]||(window[t]=new e(Oe)),window[t]}_sendComponentValues;uiElementRegistry;constructor(e){this.uiElementRegistry=e}get sendComponentValues(){if(!this._sendComponentValues)throw Error(`sendComponentValues is not set`);return this._sendComponentValues}start(e){if(this.hasStarted){j.warn(`RuntimeState already started`);return}this._sendComponentValues=e,document.addEventListener(ht.TYPE,this.handleReadyEvent),this.hasStarted=!0}stop(){if(!this.hasStarted){j.warn(`RuntimeState already stopped`);return}document.removeEventListener(ht.TYPE,this.handleReadyEvent),this.hasStarted=!1}handleReadyEvent=e=>{let t=e.detail.objectId;if(!this.uiElementRegistry.has(t))return;let n=this.uiElementRegistry.lookupValue(t);n!==void 0&&this.sendComponentValues({objectIds:[t],values:[n]}).catch(e=>{j.warn(e)})}},pn={initial:[],on:{attachment:(e,{data:{attachment:t}})=>e.some(e=>e.id===t.id)?e.map(e=>e.id===t.id?t:e):[...e,t],"attachment.removed":(e,{data:t})=>e.some(e=>e.id===t.id)?e.filter(e=>e.id!==t.id):e}};function mn(e){return e.pending??{revision:e.current?.revision??null,cells:e.current?.cells??new Map}}function hn(e,t){let n=new Set(e.order);if(n.size!==e.order.length||n.size!==t.size||[...n].some(e=>!t.has(e))||[...t.values()].some(t=>t.version>e.version))throw Error(`Document records do not match its revision and order`);return{current:{revision:e,cells:t},pending:null}}var gn={initial:{current:null,pending:null},on:{cell:(e,{data:t})=>{let n=mn(e);return{...e,pending:{revision:n.revision,cells:new Map(n.cells).set(t.cell.id,t.cell)}}},"cell.removed":(e,{data:t})=>{let n=mn(e);if(!n.cells.has(t.id))return e;let r=new Map(n.cells);return r.delete(t.id),{...e,pending:{...n,cells:r}}},document:(e,{data:t},{phase:n})=>{let{cells:r}=mn(e);return n===`snapshot`?{...e,pending:{revision:t.document,cells:r}}:hn(t.document,r)},ready:(e,t,{phase:n})=>{if(e.pending===null)return e;if(n===`live`)throw Error(`Stream ended with an incomplete document update`);return e.pending.revision===null?{current:null,pending:null}:hn(e.pending.revision,e.pending.cells)}}},_n=new Set([`reset`,`marimo`,`unknown`]);function vn(e){switch(e.event){case`document`:return e.data.document.notebook_id;case`cell`:return e.data.cell.notebook_id;case`analysis`:return e.data.analysis.notebook_id;case`runtime`:return e.data.runtime.notebook_id;case`attachment`:return e.data.attachment.notebook_id;case`run`:return e.data.run.notebook_id;default:return}}function yn(e){let t=Object.keys(e),n=Object.fromEntries(t.map(t=>[t,e[t].initial])),r={phase:`snapshot`,notebookId:null,cursor:null,resources:n};function i(e,t){if(e.notebookId===t)return e;if(e.notebookId!==null)throw Error(`Notebook stream changed identity`);return{...e,notebookId:t}}function a(e){return e.resources===n?e:{...e,resources:n}}function o(n,r){let i={phase:n.phase},a=n.resources;for(let n of t){let t=e[n].on[r.event];if(t===void 0)continue;let o=a[n],s=t(o,r,i);s!==o&&(a={...a,[n]:s})}return a===n.resources?n:{...n,resources:a}}function s(e,t){return e.phase===`live`&&t!==void 0&&t!==e.cursor?{...e,cursor:t}:e}return{initial:r,reduce(e,t){if(e.phase===`live`&&t.id===void 0&&!_n.has(t.event))throw Error(`Live notebook event is missing its cursor`);switch(t.event){case`marimo`:case`unknown`:return s(e,t.id);case`reset`:return{...r,notebookId:e.notebookId};case`ready`:return{...o(e,t),phase:`live`,cursor:t.id};case`notebook`:return s(i(e,t.data.notebook.id),t.id);case`notebook.removed`:return s(e.notebookId!==null&&t.data.id!==e.notebookId?e:a(e),t.id);default:{let n=vn(t);return s(o(n===void 0?e:i(e,n),t),t.id)}}},resume(e){return e.phase===`snapshot`?{...r,notebookId:e.notebookId}:e}}}function bn(e){let t=r({state:O.NOT_STARTED}),n=yn({document:gn,attachments:pn}),i=r(n.initial),a=r(!1),o=r(e=>e(i).resources.document.current),s=r(e=>e(a)&&e(t).state===O.OPEN?e(i).resources.attachments:pn.initial),c,l={connectionAtom:t,documentAtom:o,attachmentsAtom:s,reconnect:async()=>c?.()};function u({createTransport:r,url:o,messageFormat:s,signal:l,waitUntilReady:u,checkHealth:d,onNotification:f,onMessageError:p,decodeJson:m,classifyClose:h}){if(l.aborted)return;let g=!0,_=!1,v=!1,ee,y=r(()=>{if(s===`session`)return o();let t=new URL(o());if(t.searchParams.delete(`cursor`),l.aborted)return t.toString();let r=new URL(t);r.searchParams.delete(`access_token`),r.searchParams.sort();let c=r.toString(),u=c===ee?n.resume(e.get(i)):n.initial;return ee=c,e.set(a,!1),e.set(i,u),u.cursor!==null&&t.searchParams.set(`cursor`,u.cursor),t.toString()}),b=n=>{e.set(a,!1),e.set(t,n)},x={state:O.CLOSED,code:k.KERNEL_DISCONNECTED,reason:`kernel not found`};function S(e,t){!l.aborted&&!_&&g&&(g=!1,y.reconnect(e,t))}function C(){l.aborted||_||(g=!0,b({state:O.OPEN}))}function te(e){if(l.aborted||_)return;j.warn(`Notebook connection closed`,e.code,e.reason);let t=h(e);b(t.status),t.kind===`terminal`?(_=!0,y.close()):t.kind===`retry`?S(e.code,e.reason):_=!0}function w(e){l.aborted||_||(j.warn(`Notebook connection error`,e),b(x),S())}function ne(t){if(l.aborted||_)return;let r;try{r=ge(m(t.data)),e.set(i,n.reduce(e.get(i),r)),(r.event===`ready`||r.event===`reset`)&&e.set(a,r.event===`ready`)}catch(t){if(j.error(`Failed to decode notebook message`,t),s===`session`){p(t);return}e.set(i,n.initial),_=!0,b({...x,reason:`Failed to decode notebook message`}),y.close();return}r.event===`marimo`&&f(r.data.marimo)}c=async()=>{if(!(l.aborted||v||y.readyState===D.OPEN||y.readyState===D.CONNECTING)){v=!0,b({state:O.CONNECTING});try{let e=await d();if(l.aborted)return;if(!e){g=!1,b(x);return}_=!1,g=!0,y.reconnect()}catch(e){l.aborted||(j.error(`Notebook health check failed`,e),g=!1,b(x))}finally{v=!1}}},l.addEventListener(`abort`,()=>{y.removeEventListener(`open`,C),y.removeEventListener(`close`,te),y.removeEventListener(`error`,w),y.removeEventListener(`message`,ne),y.close(),c=void 0,e.set(i,n.initial),b({state:O.NOT_STARTED})},{once:!0}),y.addEventListener(`open`,C),y.addEventListener(`close`,te),y.addEventListener(`error`,w),y.addEventListener(`message`,ne),y.readyState===D.CLOSED&&(b({state:O.CONNECTING}),u().then(()=>{l.aborted||y.reconnect()}).catch(e=>{l.aborted||(j.error(`Healthy connection never made`,e),_=!0,b(x),y.close())}))}return{client:l,connect:u}}var xn=`MARIMO_TRANSPORT_EXHAUSTED`,Sn=class{inner;closeWrappers=new WeakMap;constructor(e){this.inner=new xt(e,void 0,{maxRetries:10,debug:!1,startClosed:!0,connectionTimeout:1e4})}get readyState(){return this.inner.readyState}reconnect(e,t){this.inner.reconnect(e,t)}close(){this.inner.close()}send(e){this.inner.send(e)}addEventListener(e,t){if(e===`close`){let e=t;if(this.closeWrappers.has(e))return;let n=t=>{this.inner.retryCount>=10?e(new CloseEvent(`close`,{code:t.code,reason:xn,wasClean:t.wasClean})):e(t)};this.closeWrappers.set(e,n),this.inner.addEventListener(`close`,n);return}this.inner.addEventListener(e,t)}removeEventListener(e,t){if(e===`close`){let e=t,n=this.closeWrappers.get(e);n&&(this.closeWrappers.delete(e),this.inner.removeEventListener(`close`,n));return}this.inner.removeEventListener(e,t)}};function Cn(e){switch(e.reason){case xn:return{kind:`gave-up`,status:{state:O.CLOSED,code:k.KERNEL_DISCONNECTED,reason:`kernel not found`}};case`MARIMO_NO_FILE_KEY`:case`MARIMO_NO_SESSION_ID`:case`MARIMO_NO_SESSION`:case`MARIMO_SHUTDOWN`:return{kind:`terminal`,status:{state:O.CLOSED,code:k.KERNEL_DISCONNECTED,reason:`kernel not found`}};case`MARIMO_UNAUTHORIZED`:return{kind:`terminal`,status:{state:O.CLOSED,code:k.KERNEL_DISCONNECTED,reason:`not authorized`}};case`MARIMO_KIOSK_NOT_ALLOWED`:return{kind:`terminal`,status:{state:O.CLOSED,code:k.KERNEL_DISCONNECTED,reason:`kiosk mode is not available for this session`}};case`MARIMO_KERNEL_STARTUP_ERROR`:return{kind:`terminal`,status:{state:O.CLOSED,code:k.KERNEL_STARTUP_ERROR,reason:`Failed to start kernel sandbox`}};default:e.reason&&j.warn(`Unrecognized connection close reason`,e.reason)}return{kind:`retry`,status:{state:O.CONNECTING}}}var wn=1e4,Tn=1e3,En=1e4,Dn=1.3,On=1006,kn=class{subscriptions=new Se;urlProvider;headersProvider;abortController=null;retryTimer=null;retryCount=0;userClosed=!1;state=WebSocket.CLOSED;constructor(e,t=()=>({})){this.urlProvider=e,this.headersProvider=t}get readyState(){return this.state}reconnect(e,t){this.userClosed=!1,this.retryCount=0,this.clearRetryTimer(),this.abortController?.abort(),this.connect()}close(){this.userClosed=!0,this.clearRetryTimer(),this.state=WebSocket.CLOSED,this.abortController?.abort(),this.abortController=null}send(e){j.warn(`SseTransport does not support send(); dropping message`)}addEventListener(e,t){this.subscriptions.addSubscription(e,t)}removeEventListener(e,t){this.subscriptions.removeSubscription(e,t)}connect(){this.state=WebSocket.CONNECTING,this.run()}async run(){let e=new AbortController;this.abortController=e;let t=setTimeout(()=>e.abort(),wn),n=null;try{let r=await fetch(this.urlProvider(),{headers:{...this.headersProvider(),Accept:`text/event-stream`},signal:e.signal});if(clearTimeout(t),!r.ok||r.body===null)throw Error(`Unexpected SSE response: ${r.status}`);this.state=WebSocket.OPEN,this.subscriptions.notify(`open`,new Event(`open`)),n=await this.readEvents(r.body)}catch(n){if(clearTimeout(t),this.isSuperseded(e))return;j.warn(`SSE connection failed`,n),this.subscriptions.notify(`error`,new Event(`error`))}if(this.isSuperseded(e))return;e.abort(),this.state=WebSocket.CLOSED,this.retryCount+=1;let r=this.retryCount>=10;this.subscriptions.notify(`close`,new CloseEvent(`close`,{code:n?.code??On,reason:r?xn:n?.reason??``,wasClean:n!==null})),!(r||this.isSuperseded(e))&&this.scheduleRetry()}isSuperseded(e){return this.userClosed||this.abortController!==e}scheduleRetry(){this.clearRetryTimer(),this.state=WebSocket.CONNECTING;let e=Math.min(Tn*Dn**this.retryCount,En);this.retryTimer=setTimeout(()=>{this.retryTimer=null,this.connect()},e)}clearRetryTimer(){this.retryTimer!==null&&(clearTimeout(this.retryTimer),this.retryTimer=null)}async readEvents(e){let t=e.getReader(),n=new TextDecoder,r=``,i=null,a=[],o=()=>{if(a.length===0)return i=null,null;let e=a.join(`
|
|
2
|
-
`),t=i;return i=null,a=[],t===`close`?An(e):(this.retryCount=0,this.subscriptions.notify(`message`,new MessageEvent(`message`,{data:e})),null)};for(;;){let{done:e,value:s}=await t.read();if(e)return null;r+=n.decode(s,{stream:!0});let c=0,l=r.indexOf(`
|
|
3
|
-
`,c);for(;l!==-1;){let e=r.slice(c,l);if(c=l+1,l=r.indexOf(`
|
|
4
|
-
`,c),e.endsWith(`\r`)&&(e=e.slice(0,-1)),e===``){let e=o();if(e!==null)return e;continue}if(e.startsWith(`:`))continue;let t=e.indexOf(`:`),n=t===-1?e:e.slice(0,t),s=t===-1?``:e.slice(t+1);s.startsWith(` `)&&(s=s.slice(1)),n===`data`?a.push(s):n===`event`&&(i=s)}c>0&&(r=r.slice(c))}}};function An(e){try{let t=JSON.parse(e);return{code:typeof t.code==`number`?t.code:1e3,reason:typeof t.reason==`string`?t.reason:``}}catch{return j.warn(`Failed to parse SSE close event`,e),{code:1e3,reason:``}}}function jn(e){return e.static?we.empty():de()?Ee():e.transportType===`sse`?new kn(e.url,e.headers):new Sn(e.url)}function Mn(e){let t=(0,Z.c)(27),r=n(),{sessionId:i,static:a,transportType:s,messageFormat:c}=e,l;t[0]===r?l=t[1]:(l=bn(r),t[0]=r,t[1]=l);let u=l,d=o(e.url),f=o(e.headers),p=o(e.waitUntilReady),m=o(e.checkHealth),h=o(e.onNotification),g=o(e.onMessageError),_;t[2]!==m||t[3]!==u||t[4]!==f||t[5]!==a||t[6]!==c||t[7]!==g||t[8]!==h||t[9]!==r||t[10]!==s||t[11]!==d||t[12]!==p?(_=()=>{let e=new AbortController;return r.set(at,u.client),u.connect({createTransport:e=>jn({url:e,headers:f,static:a,transportType:s}),url:d,messageFormat:c,signal:e.signal,waitUntilReady:p,checkHealth:m,onMessageError:g,onNotification:e=>h({data:e}),decodeJson:b,classifyClose:Cn}),()=>{e.abort(),r.get(at)===u.client&&r.set(at,null)}},t[2]=m,t[3]=u,t[4]=f,t[5]=a,t[6]=c,t[7]=g,t[8]=h,t[9]=r,t[10]=s,t[11]=d,t[12]=p,t[13]=_):_=t[13];let v;return t[14]!==m||t[15]!==u||t[16]!==f||t[17]!==a||t[18]!==c||t[19]!==g||t[20]!==h||t[21]!==i||t[22]!==r||t[23]!==s||t[24]!==d||t[25]!==p?(v=[u,r,i,a,s,c,d,f,p,m,h,g],t[14]=m,t[15]=u,t[16]=f,t[17]=a,t[18]=c,t[19]=g,t[20]=h,t[21]=i,t[22]=r,t[23]=s,t[24]=d,t[25]=p,t[26]=v):v=t[26],(0,Q.useEffect)(_,v),u.client}function Nn(e){let{codes:t,names:n,configs:r,cell_ids:i,last_executed_code:a,last_execution_time:o}=e,s=a||{},c=o||{};return t.map((e,t)=>{let a=i[t],o=s[a];return S({id:a,code:e,edited:o?o!==e:!1,name:n[t],lastCodeRun:s[a]??null,lastExecutionTime:c[a]??null,config:r[t]})})}function Pn(e,t,n){let{layout:r}=e,i=Ze(r,t);return r&&r.type===i.selectedLayout&&n({layoutView:i.selectedLayout,data:i.layoutData[i.selectedLayout]}),i}function Fn(){let e=[],t=[];return Oe.entries.forEach((n,r)=>{e.push(r),t.push(n.value)}),{objectIds:e,values:t}}function In(e,t){let{existingCells:n,autoInstantiate:r,setCells:i,setLayoutData:a,setAppConfig:o,setCapabilities:s,setKernelState:c,onError:l}=t,{resumed:u,ui_values:d,app_config:f,capabilities:p,auto_instantiated:m}=e,h=n&&n.length>0,g=h&&!u?n:Nn(e);i(g,Pn(e,g,a));let _=ye.safeParse(f);if(_.success?o(_.data):j.error(`Failed to parse app config`,_.error),s(p),m)return;if(u){for(let[e,t]of Me.entries(d||{})){let n=e;Oe.set(n,t)}return}let{objectIds:v,values:ee}=Fn(),y=h?Object.fromEntries(n.map(e=>[e.id,e.code])):void 0;ct().sendInstantiate({objectIds:v,values:ee,autoRun:r,codes:y}).then(()=>{c({isInstantiated:!0,error:null})}).catch(e=>{c({isInstantiated:!1,error:e}),l(Error(`Failed to instantiate`,{cause:e}))})}function Ln(e){let t=e.cell_id;Oe.removeElementsByCell(t),Y.INSTANCE.removeForCellId(t)}function Rn(e,t){t(e),Y.INSTANCE.track(e)}var zn={append:e=>{let t=new URL(window.location.href);t.searchParams.append(e.key,e.value),window.history.pushState({},``,`${t.pathname}${t.search}`)},set:e=>{let t=new URL(window.location.href);Array.isArray(e.value)?(t.searchParams.delete(e.key),e.value.forEach(n=>t.searchParams.append(e.key,n))):t.searchParams.set(e.key,e.value),window.history.pushState({},``,`${t.pathname}${t.search}`)},delete:e=>{let t=new URL(window.location.href);e.value==null?t.searchParams.delete(e.key):t.searchParams.delete(e.key,e.value),window.history.pushState({},``,`${t.pathname}${t.search}`)},clear:()=>{let e=new URL(window.location.href);e.search=``,window.history.pushState({},``,`${e.pathname}${e.search}`)}};function Bn(){return Object.values(oe().cellData).filter(e=>e.id!==C)}function Vn(e){let r=(0,Z.c)(70),{autoInstantiate:a,sessionId:o,setCells:c}=e,{showBoundary:g}=Be(),{handleCellMessage:b}=d(),S;r[0]===Symbol.for(`react.memo_cache_sentinel`)?(S={skipMiddleware:!0},r[0]=S):S=r[0];let C=d(S),w;r[1]===C?w=r[2]:(w=e=>{l(e.changes,C,qn)},r[1]=C,r[2]=w);let T=w,{addCellNotification:ae}=St(),se=s(Le),E=s(ze),D=xe(),{setVariables:ge,setMetadata:ve}=ie(),{addColumnPreview:ye}=ne(),{addDatasets:Se,filterDatasetsFromVariables:we}=ne(),{addDataSourceConnection:Ee,filterDataSourcesFromVariables:De}=_(),{setLayoutData:ke}=nt(),[Ae,A]=t(_e),M=s(fe),{addBanner:Me}=vt(),{addMissingPackageAlert:N,updateEnvironment:P,setEnvironment:Ne,addStartupLog:Ie}=yt(),F=s(Pe),Re=s(Fe),Ve=s(h),I=he(),{notebookId:He}=i(pe),L=i(be),Ue=s(_t),R=s(bt),{setNamespaces:z,filterFromVariables:B}=te(),We;r[3]!==Me||r[4]!==ae||r[5]!==ye||r[6]!==Ee||r[7]!==Se||r[8]!==N||r[9]!==Ie||r[10]!==a||r[11]!==De||r[12]!==we||r[13]!==B||r[14]!==b||r[15]!==T||r[16]!==D||r[17]!==Ue||r[18]!==Ve||r[19]!==c||r[20]!==A||r[21]!==Ne||r[22]!==E||r[23]!==R||r[24]!==se||r[25]!==F||r[26]!==ke||r[27]!==ve||r[28]!==Re||r[29]!==z||r[30]!==ge||r[31]!==g||r[32]!==P||r[33]!==M?(We=e=>{switch(e.data.op){case`reload`:ft();return;case`startup-progress`:{let{phase:t}=e.data;M(e.data),A(e=>e.state===O.OPEN||e.state===O.CONNECTING&&e.phase===t?e:{state:O.CONNECTING,phase:t});return}case`kernel-ready`:{R(null),A({state:O.OPEN}),E(!!(e.data.resumed||e.data.auto_instantiated));let t=Bn();In(e.data,{autoInstantiate:a,setCells:c,setLayoutData:ke,setAppConfig:D,setCapabilities:Ve,setKernelState:se,onError:g,existingCells:t}),e.data.resumed||x(),F(e.data.kiosk),Re(e.data.stable_session_id??null),ce(null),le();return}case`completed-run`:E(!0);return;case`execution`:return;case`interrupted`:return;case`kernel-startup-error`:R(e.data.error);return;case`send-ui-element-message`:{let t=e.data.ui_element;if(t){let n=Qe(e.data);Oe.broadcastMessage(t,e.data.message,n)}return}case`model-lifecycle`:Ce(je,e.data);return;case`remove-ui-elements`:Ln(e.data);return;case`completion-result`:y.resolve(e.data.completion_id,e.data);return;case`function-call-result`:Te.resolve(e.data.function_call_id,e.data);return;case`cell-op`:{Rn(e.data,b);let t=oe().cellData[e.data.cell_id];if(!t)return;ae({cellNotification:e.data,code:t.code});return}case`variables`:{let t=e.data.variables.map(Kn);ge(e.data.variables.map(Gn)),we(t),De(t),B(t);return}case`variable-values`:ve(e.data.variables.map(Wn));return;case`alert`:ot({title:e.data.title,description:ut({html:e.data.description}),variant:e.data.variant});return;case`banner`:Me(e.data);return;case`missing-package-alert`:N({...e.data,kind:`missing`});return;case`environment-operation`:e.data.source===`kernel`&&e.data.status.kind!==`running`&&dt(),P(e.data);return;case`environment-state`:Ne(e.data),e.data.source===`kernel`&&dt();return;case`startup-logs`:Ie({content:e.data.content,status:e.data.status});return;case`query-params-append`:zn.append(e.data);return;case`query-params-set`:zn.set(e.data);return;case`query-params-delete`:zn.delete(e.data);return;case`query-params-clear`:zn.clear();return;case`datasets`:Se(e.data);return;case`data-column-preview`:ye(e.data);return;case`sql-table-preview`:ee.resolve(e.data.request_id,e.data);return;case`sql-table-list-preview`:ue.resolve(e.data.request_id,e.data);return;case`sql-schema-list-preview`:m.resolve(e.data.request_id,e.data);return;case`validate-sql-result`:v.resolve(e.data.request_id,e.data);return;case`data-source-discovery-result`:re.resolve(e.data.request_id,e.data);return;case`secret-keys-result`:et.resolve(e.data.request_id,e.data);return;case`cache-info`:Ue(e.data);return;case`cache-cleared`:return;case`data-source-connections`:Ee({connections:e.data.connections.map(Un)});return;case`storage-namespaces`:z(e.data);return;case`storage-entries`:f.resolve(e.data.request_id,e.data);return;case`storage-download-ready`:p.resolve(e.data.request_id,e.data);return;case`reconnected`:R(null),A({state:O.OPEN});return;case`focus-cell`:u(e.data.cell_id);return;case`active-line`:ce(e.data.line==null?null:{cellId:e.data.cell_id,line:e.data.line});return;case`notebook-document-transaction`:T(e.data.transaction);return;case`consumer-capabilities`:F(!e.data.consumer_capabilities.edit);return;default:st(e.data)}},r[3]=Me,r[4]=ae,r[5]=ye,r[6]=Ee,r[7]=Se,r[8]=N,r[9]=Ie,r[10]=a,r[11]=De,r[12]=we,r[13]=B,r[14]=b,r[15]=T,r[16]=D,r[17]=Ue,r[18]=Ve,r[19]=c,r[20]=A,r[21]=Ne,r[22]=E,r[23]=R,r[24]=se,r[25]=F,r[26]=ke,r[27]=ve,r[28]=Re,r[29]=z,r[30]=ge,r[31]=g,r[32]=P,r[33]=M,r[34]=We):We=r[34];let Ge=We,V=n(),Ke=Hn,qe;r[35]===Symbol.for(`react.memo_cache_sentinel`)?(qe=me(),r[35]=qe):qe=r[35];let Je=He&&L===`websocket`?`host`:`session`,H;r[36]!==I||r[37]!==o||r[38]!==L?(H=()=>L===`sse`?I.getSseURL(o).toString():I.getWsURL(o).toString(),r[36]=I,r[37]=o,r[38]=L,r[39]=H):H=r[39];let U,W,G;r[40]===I?(U=r[41],W=r[42],G=r[43]):(U=()=>I.headers(),W=async()=>{!me()&&!de()&&!I.isSameOrigin&&await I.waitForHealthy()},G=()=>I.reconcileFromHealth(),r[40]=I,r[41]=U,r[42]=W,r[43]=G);let K;r[44]===Ge?K=r[45]:(K=e=>{try{Ge(e)}catch(t){let n=t;j.error(`Failed to handle notification`,e,n),Ke(n)}},r[44]=Ge,r[45]=K);let q;r[46]!==o||r[47]!==Je||r[48]!==H||r[49]!==U||r[50]!==W||r[51]!==G||r[52]!==K||r[53]!==L?(q={sessionId:o,static:qe,transportType:L,messageFormat:Je,url:H,headers:U,waitUntilReady:W,checkHealth:G,onMessageError:Ke,onNotification:K},r[46]=o,r[47]=Je,r[48]=H,r[49]=U,r[50]=W,r[51]=G,r[52]=K,r[53]=L,r[54]=q):q=r[54];let J=Mn(q),Ye;r[55]!==J.connectionAtom||r[56]!==A||r[57]!==R||r[58]!==V||r[59]!==M?(Ye=()=>{let e=()=>{let e=V.get(J.connectionAtom);if(e.state!==O.NOT_STARTED){if(e.state===O.OPEN){M(null);return}e.state===O.CONNECTING&&R(null),A(t=>e.state===O.CLOSED&&e.code===k.KERNEL_STARTUP_ERROR&&(t.state===O.CONNECTING||t.state===O.CLOSED)?{...e,phase:t.phase}:e.state===O.CONNECTING&&(t.state===O.OPEN||t.state===O.CONNECTING&&t.phase===`reconnecting`)?{...e,phase:`reconnecting`}:e)}},t=V.sub(J.connectionAtom,e);return e(),t},r[55]=J.connectionAtom,r[56]=A,r[57]=R,r[58]=V,r[59]=M,r[60]=Ye):Ye=r[60];let Y;r[61]!==J||r[62]!==A||r[63]!==R||r[64]!==V||r[65]!==M?(Y=[J,V,A,R,M],r[61]=J,r[62]=A,r[63]=R,r[64]=V,r[65]=M,r[66]=Y):Y=r[66],(0,Q.useLayoutEffect)(Ye,Y);let Xe;return r[67]!==Ae||r[68]!==J?(Xe={notebook:J,connection:Ae,reconnect:J.reconnect},r[67]=Ae,r[68]=J,r[69]=Xe):Xe=r[69],Xe}function Hn(e){ot({title:`Failed to handle message`,description:pt(e),variant:`danger`})}function Un(e){return{...e,name:e.name}}function Wn(e){return{name:e.name,dataType:e.datatype,value:e.value}}function Gn(e){return{name:e.name,declaredBy:e.declared_by,usedBy:e.used_by}}function Kn(e){return e.name}function qn(){return oe().cellIds.inOrderIds}var Jn=e=>{let t=(0,Z.c)(2),{children:n}=e,r;return t[0]===n?r=t[1]:(r=(0,X.jsx)(`div`,{"data-testid":`chrome-wrapper`,className:`flex flex-col flex-1 overflow-hidden absolute inset-0 print:relative`,children:n}),t[0]=n,t[1]=r),r};export{ln as a,wt as c,un as i,Vn as n,Dt as o,fn as r,Et as s,Jn as t};
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
|
|
3
|
-
import NodeFs from "node:fs";
|
|
4
|
-
import NodeUrl from "node:url";
|
|
5
|
-
import { describe, expect, expectTypeOf, it } from "vitest";
|
|
6
|
-
import * as Protocol from "../protocol";
|
|
7
|
-
|
|
8
|
-
const fixtures = new NodeUrl.URL(
|
|
9
|
-
"../../../../../protocols/host/fixtures/",
|
|
10
|
-
import.meta.url,
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
function readFixture(name: string): unknown {
|
|
14
|
-
return JSON.parse(
|
|
15
|
-
NodeFs.readFileSync(new NodeUrl.URL(name, fixtures), "utf8"),
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const records = {
|
|
20
|
-
"record.json": Protocol.HostRecord,
|
|
21
|
-
"cell.json": Protocol.Cell,
|
|
22
|
-
"cell-withheld.json": Protocol.Cell,
|
|
23
|
-
"analysis.json": Protocol.Analysis,
|
|
24
|
-
"diagnostic.json": Protocol.Error,
|
|
25
|
-
"edit.json": Protocol.EditRequest,
|
|
26
|
-
"edit-conflict-request.json": Protocol.EditRequest,
|
|
27
|
-
"edit-response.json": Protocol.EditResponse,
|
|
28
|
-
"execution-restored.json": Protocol.Execution,
|
|
29
|
-
"run-cells-request.json": Protocol.RunRequest,
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
describe("host protocol fixtures", () => {
|
|
33
|
-
it.each(Object.entries(records))("parses %s unchanged", (name, schema) => {
|
|
34
|
-
const input = readFixture(name);
|
|
35
|
-
const original = structuredClone(input);
|
|
36
|
-
expect(schema.parse(input)).toEqual(original);
|
|
37
|
-
expect(input).toEqual(original);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it.each(NodeFs.readdirSync(new NodeUrl.URL("problems/", fixtures)))(
|
|
41
|
-
"parses problem %s",
|
|
42
|
-
(name) => {
|
|
43
|
-
const input = readFixture(`problems/${name}`);
|
|
44
|
-
expect(Protocol.Problem.parse(input)).toEqual(input);
|
|
45
|
-
},
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
it.each(NodeFs.readdirSync(fixtures).filter((name) => name.endsWith(".sse")))(
|
|
49
|
-
"parses events in %s unchanged",
|
|
50
|
-
(name) => {
|
|
51
|
-
const stream = NodeFs.readFileSync(
|
|
52
|
-
new NodeUrl.URL(name, fixtures),
|
|
53
|
-
"utf8",
|
|
54
|
-
);
|
|
55
|
-
let count = 0;
|
|
56
|
-
for (const frame of stream.split(/\r?\n\r?\n/)) {
|
|
57
|
-
const event = /^event: (.+)$/m.exec(frame)?.[1];
|
|
58
|
-
if (!event && !/^data:/m.test(frame)) {
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
const data = frame
|
|
62
|
-
.split(/\r?\n/)
|
|
63
|
-
.filter((line) => line.startsWith("data:"))
|
|
64
|
-
.map((line) => line.slice(5).trimStart())
|
|
65
|
-
.join("\n");
|
|
66
|
-
const id = /^id: (.+)$/m.exec(frame)?.[1];
|
|
67
|
-
const payload: unknown = JSON.parse(data);
|
|
68
|
-
const input = { event, data: payload, ...(id ? { id } : {}) };
|
|
69
|
-
const original = structuredClone(input);
|
|
70
|
-
expect(Protocol.Event.parse(input)).toEqual(original);
|
|
71
|
-
expect(input).toEqual(original);
|
|
72
|
-
count += 1;
|
|
73
|
-
}
|
|
74
|
-
expect(count).toBeGreaterThan(0);
|
|
75
|
-
},
|
|
76
|
-
);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
describe("host protocol bindings", () => {
|
|
80
|
-
it("preserves native marimo payloads without interpreting them", () => {
|
|
81
|
-
expectTypeOf<Protocol.MarimoEvent["data"]["marimo"]>().toBeUnknown();
|
|
82
|
-
const input = {
|
|
83
|
-
event: "marimo",
|
|
84
|
-
id: "42",
|
|
85
|
-
data: {
|
|
86
|
-
marimo: {
|
|
87
|
-
future_payload: { value: Number.NaN },
|
|
88
|
-
},
|
|
89
|
-
},
|
|
90
|
-
};
|
|
91
|
-
expect(Protocol.Event.parse(input)).toEqual(input);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it("accepts additive fields and preserves arbitrary notebook settings", () => {
|
|
95
|
-
const cell = Protocol.Cell.parse(readFixture("cell.json"));
|
|
96
|
-
const input = {
|
|
97
|
-
...cell,
|
|
98
|
-
future: { enabled: true },
|
|
99
|
-
config: { ...cell.config, future: 42 },
|
|
100
|
-
};
|
|
101
|
-
const original = structuredClone(input);
|
|
102
|
-
expect(Protocol.Cell.parse(input)).toEqual(cell);
|
|
103
|
-
expect(input).toEqual(original);
|
|
104
|
-
|
|
105
|
-
const { document } = Protocol.EditResponse.parse(
|
|
106
|
-
readFixture("edit-response.json"),
|
|
107
|
-
);
|
|
108
|
-
const configured = {
|
|
109
|
-
...document,
|
|
110
|
-
app_config: { extension: { values: [1, null, false] } },
|
|
111
|
-
};
|
|
112
|
-
expect(Protocol.Document.parse(configured)).toEqual(configured);
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it("requires source in edits while allowing withheld source in records", () => {
|
|
116
|
-
expectTypeOf<Protocol.Cell["code"]>().toEqualTypeOf<string | null>();
|
|
117
|
-
expectTypeOf<Protocol.CellInput["code"]>().toEqualTypeOf<string>();
|
|
118
|
-
const cell = Protocol.Cell.parse(readFixture("cell.json"));
|
|
119
|
-
const { code, ...missing } = cell;
|
|
120
|
-
expect(Protocol.Cell.safeParse(missing).success).toBe(false);
|
|
121
|
-
expect(Protocol.Cell.parse({ ...cell, code: "" }).code).toBe("");
|
|
122
|
-
for (const input of [{ id: cell.id }, { id: cell.id, code: null }]) {
|
|
123
|
-
expect(Protocol.CellInput.safeParse(input).success).toBe(false);
|
|
124
|
-
}
|
|
125
|
-
expect(Protocol.CellInput.parse({ id: cell.id, code }).code).toBe(code);
|
|
126
|
-
expect(Protocol.CellInput.parse({ id: cell.id, code: "" }).code).toBe("");
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
it("applies the defaults declared for cell inputs", () => {
|
|
130
|
-
expect(
|
|
131
|
-
Protocol.CellInput.parse({ id: "c3", code: "x = 1", config: {} }),
|
|
132
|
-
).toEqual({
|
|
133
|
-
id: "c3",
|
|
134
|
-
code: "x = 1",
|
|
135
|
-
name: "_",
|
|
136
|
-
config: {
|
|
137
|
-
column: null,
|
|
138
|
-
disabled: false,
|
|
139
|
-
hide_code: false,
|
|
140
|
-
expand_output: false,
|
|
141
|
-
},
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
it.each(["run_id", "runtime_id", "caused_by"] as const)(
|
|
146
|
-
"requires the nullable execution field %s",
|
|
147
|
-
(field) => {
|
|
148
|
-
const execution = Protocol.Execution.parse(
|
|
149
|
-
readFixture("execution-restored.json"),
|
|
150
|
-
);
|
|
151
|
-
const missing = Object.fromEntries(
|
|
152
|
-
Object.entries(execution).filter(([key]) => key !== field),
|
|
153
|
-
);
|
|
154
|
-
expect(Protocol.Execution.safeParse(missing).success).toBe(false);
|
|
155
|
-
expect(
|
|
156
|
-
Protocol.Execution.safeParse({ ...execution, [field]: null }).success,
|
|
157
|
-
).toBe(true);
|
|
158
|
-
},
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
it("preserves snapshot metadata omissions and validates live timestamps", () => {
|
|
162
|
-
const cell = Protocol.Cell.parse(readFixture("cell.json"));
|
|
163
|
-
expect(Protocol.CellMessage.parse({ cell })).toEqual({ cell });
|
|
164
|
-
const message = { cell, time: "2026-01-01T12:00:00+05:30" };
|
|
165
|
-
expect(Protocol.CellMessage.parse(message)).toEqual(message);
|
|
166
|
-
for (const time of [
|
|
167
|
-
null,
|
|
168
|
-
"yesterday",
|
|
169
|
-
"2026-02-30T12:00:00Z",
|
|
170
|
-
"2026-01-01T12:00:00",
|
|
171
|
-
]) {
|
|
172
|
-
expect(Protocol.CellMessage.safeParse({ cell, time }).success).toBe(
|
|
173
|
-
false,
|
|
174
|
-
);
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
it("rejects invalid cell fields without coercing their values", () => {
|
|
179
|
-
const cell = Protocol.Cell.parse(readFixture("cell.json"));
|
|
180
|
-
for (const patch of [
|
|
181
|
-
{ id: "" },
|
|
182
|
-
{ code: 42 },
|
|
183
|
-
{ etag: 42 },
|
|
184
|
-
{ version: "2" },
|
|
185
|
-
{ version: 0 },
|
|
186
|
-
{ version: 1.5 },
|
|
187
|
-
{ config: { ...cell.config, disabled: "false" } },
|
|
188
|
-
]) {
|
|
189
|
-
expect(Protocol.Cell.safeParse({ ...cell, ...patch }).success).toBe(
|
|
190
|
-
false,
|
|
191
|
-
);
|
|
192
|
-
}
|
|
193
|
-
const result = Protocol.Cell.safeParse({ ...cell, code: 42 });
|
|
194
|
-
expect(result.success).toBe(false);
|
|
195
|
-
if (result.success) {
|
|
196
|
-
throw new Error("Expected an invalid cell");
|
|
197
|
-
}
|
|
198
|
-
expect(result.error.issues).toEqual([
|
|
199
|
-
expect.objectContaining({ path: ["code"], code: "invalid_type" }),
|
|
200
|
-
]);
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
it("requires the fields of the selected change kind", () => {
|
|
204
|
-
const change = { kind: "delete_cell", id: "c3", base_etag: "*" };
|
|
205
|
-
expect(Protocol.Change.parse(change)).toEqual(change);
|
|
206
|
-
expect(
|
|
207
|
-
Protocol.Change.safeParse({ kind: "delete_cell", id: "c3" }).success,
|
|
208
|
-
).toBe(false);
|
|
209
|
-
expect(
|
|
210
|
-
Protocol.Change.safeParse({ ...change, kind: "unknown" }).success,
|
|
211
|
-
).toBe(false);
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
it("requires custom payloads while allowing any JSON value", () => {
|
|
215
|
-
for (const data of [
|
|
216
|
-
null,
|
|
217
|
-
false,
|
|
218
|
-
42,
|
|
219
|
-
"text",
|
|
220
|
-
{ nested: [1, null, false] },
|
|
221
|
-
]) {
|
|
222
|
-
const custom = { type: "example.event", data };
|
|
223
|
-
expect(Protocol.Custom.parse(custom)).toEqual(custom);
|
|
224
|
-
}
|
|
225
|
-
expect(Protocol.Custom.safeParse({ type: "example.event" }).success).toBe(
|
|
226
|
-
false,
|
|
227
|
-
);
|
|
228
|
-
});
|
|
229
|
-
});
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
-
|
|
3
|
-
import { describe, expect, it } from "vitest";
|
|
4
|
-
import type { NotebookEvent } from "../events";
|
|
5
|
-
import type { Resource } from "../resources/resource";
|
|
6
|
-
import { createStream } from "../stream";
|
|
7
|
-
import { fixtureEvents } from "./fixtures";
|
|
8
|
-
|
|
9
|
-
interface CellIds {
|
|
10
|
-
readonly ids: readonly string[];
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/** A resource whose events are complete on their own. */
|
|
14
|
-
const cells: Resource<CellIds> = {
|
|
15
|
-
initial: { ids: [] },
|
|
16
|
-
on: {
|
|
17
|
-
cell: (state, event) =>
|
|
18
|
-
state.ids.includes(event.data.cell.id)
|
|
19
|
-
? state
|
|
20
|
-
: { ids: [...state.ids, event.data.cell.id] },
|
|
21
|
-
"cell.removed": (state, event) =>
|
|
22
|
-
state.ids.includes(event.data.id)
|
|
23
|
-
? { ids: state.ids.filter((id) => id !== event.data.id) }
|
|
24
|
-
: state,
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
interface Revisions {
|
|
29
|
-
/** Cells changed since the last revision. */
|
|
30
|
-
readonly pending: readonly string[];
|
|
31
|
-
readonly published: readonly (readonly string[])[];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function publish(state: Revisions): Revisions {
|
|
35
|
-
return { pending: [], published: [...state.published, state.pending] };
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/** A resource assembled from groups of events, like a document from its cells. */
|
|
39
|
-
const revisions: Resource<Revisions> = {
|
|
40
|
-
initial: { pending: [], published: [] },
|
|
41
|
-
on: {
|
|
42
|
-
cell: (state, event) => ({
|
|
43
|
-
...state,
|
|
44
|
-
pending: [...state.pending, event.data.cell.id],
|
|
45
|
-
}),
|
|
46
|
-
"cell.removed": (state, event) => ({
|
|
47
|
-
...state,
|
|
48
|
-
pending: [...state.pending, event.data.id],
|
|
49
|
-
}),
|
|
50
|
-
// A live revision completes a group. A snapshot's revision waits for ready.
|
|
51
|
-
document: (state, _event, { phase }) =>
|
|
52
|
-
phase === "live" ? publish(state) : state,
|
|
53
|
-
ready: publish,
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
function createTestStream() {
|
|
58
|
-
return createStream({ cells, revisions });
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function replay(
|
|
62
|
-
stream: ReturnType<typeof createTestStream>,
|
|
63
|
-
events: readonly NotebookEvent[],
|
|
64
|
-
from = stream.initial,
|
|
65
|
-
) {
|
|
66
|
-
return events.reduce((state, event) => stream.reduce(state, event), from);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const snapshot = fixtureEvents("notebook-events.sse");
|
|
70
|
-
const ready = snapshot.findIndex((event) => event.event === "ready");
|
|
71
|
-
const cellEvent = snapshot.find((event) => event.event === "cell");
|
|
72
|
-
if (cellEvent?.event !== "cell") {
|
|
73
|
-
throw new Error("Fixture is missing a cell event");
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
describe("notebook stream", () => {
|
|
77
|
-
it("reads the snapshot, goes live at ready, and rebuilds after reset", () => {
|
|
78
|
-
const stream = createTestStream();
|
|
79
|
-
const partial = replay(stream, snapshot.slice(0, ready));
|
|
80
|
-
expect(partial).toMatchObject({
|
|
81
|
-
phase: "snapshot",
|
|
82
|
-
notebookId: "n1",
|
|
83
|
-
cursor: null,
|
|
84
|
-
});
|
|
85
|
-
expect(partial.resources.cells.ids).toEqual(["c1", "c3", "k7f2"]);
|
|
86
|
-
expect(partial.resources.revisions).toEqual({
|
|
87
|
-
pending: ["c1", "c3", "k7f2"],
|
|
88
|
-
published: [],
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
const live = replay(stream, snapshot.slice(ready), partial);
|
|
92
|
-
expect(live).toMatchObject({ phase: "live", cursor: "97" });
|
|
93
|
-
expect(live.resources.cells).toBe(partial.resources.cells);
|
|
94
|
-
expect(live.resources.revisions).toEqual({
|
|
95
|
-
pending: [],
|
|
96
|
-
published: [["c1", "c3", "k7f2"]],
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
const resetEvents = fixtureEvents("events-reset.sse");
|
|
100
|
-
const afterReset = stream.reduce(live, resetEvents[0]);
|
|
101
|
-
expect(afterReset).toEqual({ ...stream.initial, notebookId: "n1" });
|
|
102
|
-
expect(replay(stream, resetEvents, live).phase).toBe("live");
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it("keeps resource state by reference when an event does not apply", () => {
|
|
106
|
-
const stream = createTestStream();
|
|
107
|
-
const state = replay(stream, snapshot);
|
|
108
|
-
const runtime = snapshot.find((event) => event.event === "runtime");
|
|
109
|
-
const unhandled = stream.reduce(state, { ...runtime!, id: "100" });
|
|
110
|
-
expect(unhandled.resources).toBe(state.resources);
|
|
111
|
-
expect(unhandled.cursor).toBe("100");
|
|
112
|
-
expect(
|
|
113
|
-
stream.reduce(state, { event: "unknown", name: "x", id: "101" })
|
|
114
|
-
.resources,
|
|
115
|
-
).toBe(state.resources);
|
|
116
|
-
expect(
|
|
117
|
-
stream.reduce(state, { event: "marimo", data: { marimo: {} } }),
|
|
118
|
-
).toBe(state);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it("clears resources when its notebook is removed and ignores other notebooks", () => {
|
|
122
|
-
const stream = createTestStream();
|
|
123
|
-
const state = replay(stream, snapshot);
|
|
124
|
-
const time = "2026-10-01T09:30:00Z";
|
|
125
|
-
expect(
|
|
126
|
-
stream.reduce(state, {
|
|
127
|
-
event: "notebook.removed",
|
|
128
|
-
id: "100",
|
|
129
|
-
data: { id: "n2", time },
|
|
130
|
-
}).resources,
|
|
131
|
-
).toBe(state.resources);
|
|
132
|
-
const removed = stream.reduce(state, {
|
|
133
|
-
event: "notebook.removed",
|
|
134
|
-
id: "100",
|
|
135
|
-
data: { id: "n1", time },
|
|
136
|
-
});
|
|
137
|
-
expect(removed).toMatchObject({ phase: "live", notebookId: "n1" });
|
|
138
|
-
expect(removed.resources).toBe(stream.initial.resources);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it("rejects objects from another notebook", () => {
|
|
142
|
-
const stream = createTestStream();
|
|
143
|
-
const state = replay(stream, snapshot.slice(0, ready));
|
|
144
|
-
const notebook = snapshot[0];
|
|
145
|
-
if (notebook.event !== "notebook") {
|
|
146
|
-
throw new Error("Fixture does not start with its notebook");
|
|
147
|
-
}
|
|
148
|
-
expect(() =>
|
|
149
|
-
stream.reduce(state, {
|
|
150
|
-
...notebook,
|
|
151
|
-
data: { notebook: { ...notebook.data.notebook, id: "n2" } },
|
|
152
|
-
}),
|
|
153
|
-
).toThrow("changed identity");
|
|
154
|
-
expect(() =>
|
|
155
|
-
stream.reduce(state, {
|
|
156
|
-
...cellEvent,
|
|
157
|
-
data: { cell: { ...cellEvent.data.cell, notebook_id: "n2" } },
|
|
158
|
-
}),
|
|
159
|
-
).toThrow("changed identity");
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it("records each live event's cursor and resumes in place", () => {
|
|
163
|
-
const stream = createTestStream();
|
|
164
|
-
const partial = replay(stream, snapshot.slice(0, ready));
|
|
165
|
-
expect(stream.resume(partial)).toEqual({
|
|
166
|
-
...stream.initial,
|
|
167
|
-
notebookId: "n1",
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
const live = replay(stream, snapshot.slice(ready), partial);
|
|
171
|
-
const [cell, , removed, published, saved] = fixtureEvents("edits.sse");
|
|
172
|
-
const editing = replay(stream, [cell], live);
|
|
173
|
-
expect(editing.cursor).toBe("110");
|
|
174
|
-
expect(editing.resources.revisions.pending).toEqual(["c2"]);
|
|
175
|
-
expect(stream.resume(editing)).toBe(editing);
|
|
176
|
-
|
|
177
|
-
const edited = replay(stream, [removed, published], editing);
|
|
178
|
-
expect(edited.cursor).toBe("113");
|
|
179
|
-
expect(edited.resources.revisions).toEqual({
|
|
180
|
-
pending: [],
|
|
181
|
-
published: [
|
|
182
|
-
["c1", "c3", "k7f2"],
|
|
183
|
-
["c2", "k7f2"],
|
|
184
|
-
],
|
|
185
|
-
});
|
|
186
|
-
expect(stream.reduce(edited, saved).cursor).toBe("114");
|
|
187
|
-
expect(
|
|
188
|
-
stream.reduce(edited, { event: "ready", id: "116", data: {} }).cursor,
|
|
189
|
-
).toBe("116");
|
|
190
|
-
expect(stream.reduce(edited, { event: "reset", data: {} }).cursor).toBe(
|
|
191
|
-
null,
|
|
192
|
-
);
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
it("requires a cursor on live events other than reset and notifications", () => {
|
|
196
|
-
const stream = createTestStream();
|
|
197
|
-
const state = replay(stream, snapshot);
|
|
198
|
-
expect(() => stream.reduce(state, cellEvent)).toThrow("cursor");
|
|
199
|
-
expect(
|
|
200
|
-
stream.reduce(state, { ...cellEvent, id: "100" }).resources.cells,
|
|
201
|
-
).toBe(state.resources.cells);
|
|
202
|
-
expect(stream.reduce(state, { event: "reset", data: {} }).phase).toBe(
|
|
203
|
-
"snapshot",
|
|
204
|
-
);
|
|
205
|
-
expect(
|
|
206
|
-
stream.reduce(state, { event: "marimo", data: { marimo: null } }),
|
|
207
|
-
).toBe(state);
|
|
208
|
-
});
|
|
209
|
-
});
|