.pyviz{--bg:#10141a;--grid:#161b23;--panel:#171d25;--panel-2:#1d242e;--ink:#e3e8ef;--muted:#93a1b1;--line:#2b3440;--accent:#7ea2ff;--accent-ink:#0d1424;--accent-soft:#1f2a42;--arrow:#88a9ff;--arrow-dim:#40527a;--hl:#e9c75a;--hl-line:#3a3218;--prev:#556a94;--num:#8cb9ff;--str:#8fd29f;--kw:#d7a3ea;--fn:#f0a560;--none:#8692a0;--cmt:#76838f;--err:#ff8b7c;--err-soft:#3a1e1c;--chg:#b38a14;--ok:#8fd29f;--font-ui:var(--font-home),system-ui,-apple-system,"Segoe UI",sans-serif;--font-code:var(--font-viz-code),ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;color-scheme:dark;background-color:var(--bg);color:var(--ink);background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);background-size:24px 24px;font-family:var(--font-ui);font-size:15px;line-height:1.45;padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px));padding-block:0 40px}.light .pyviz{--bg:#edf0f3;--grid:#e2e7ec;--panel:#ffffff;--panel-2:#f5f7f9;--ink:#17202a;--muted:#5b6876;--line:#d4dbe2;--accent:#2350b8;--accent-ink:#ffffff;--accent-soft:#e4ebfa;--arrow:#2350b8;--arrow-dim:#93a7d4;--hl:#ffe58a;--hl-line:#fff4c4;--prev:#8fa4cf;--num:#1b5ea3;--str:#2c7a3c;--kw:#8b2f9f;--fn:#b0520b;--none:#7a8693;--cmt:#7f8b97;--err:#b42318;--err-soft:#fde8e6;--chg:#f2c230;--ok:#2c7a3c;color-scheme:light}.pyviz *{box-sizing:border-box}.pyviz button,.pyviz input,.pyviz select,.pyviz textarea{font:inherit;color:inherit}.pyviz :focus-visible{outline:2px solid var(--accent);outline-offset:2px}.pyviz code{font-family:var(--font-code)}.pyviz .top{max-width:1440px;margin:0 auto;flex-wrap:wrap;gap:12px 16px;padding-block:20px 16px}.pyviz .brand,.pyviz .top{display:flex;align-items:center}.pyviz .brand{gap:12px;margin-right:auto;min-width:0}.pyviz .mark{width:36px;height:36px;border-radius:9px;background:var(--ink);display:grid;place-items:center;flex:none}.pyviz .mark svg{display:block}.pyviz .brand h1{margin:0;font-size:1.4rem;font-weight:800;letter-spacing:-.025em;line-height:1.1;text-wrap:balance}.pyviz .brand p{margin:2px 0 0;color:var(--muted);font-size:.86rem}.pyviz .picker{display:flex;align-items:center;gap:8px}.pyviz .picker label{font-size:.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.pyviz select{padding:0 10px;max-width:62vw}.pyviz .btn,.pyviz select{height:36px;border:1px solid var(--line);background:var(--panel);border-radius:8px}.pyviz .btn{padding:0 14px;display:inline-flex;align-items:center;gap:7px;font-weight:600;font-size:.9rem;cursor:pointer;white-space:nowrap}.pyviz .btn:hover:not(:disabled){border-color:var(--accent)}.pyviz .btn:disabled{opacity:.4;cursor:default}.pyviz .btn.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}.pyviz .btn.icon{width:36px;padding:0;justify-content:center}.pyviz .btn svg{flex:none}.pyviz .work{max-width:1440px;margin:0 auto;display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:16px;align-items:start}.pyviz .left{display:flex;flex-direction:column;gap:16px;min-width:0}@media (min-width:961px){.pyviz .left{position:sticky;top:72px}}@media (max-width:960px){.pyviz .work{grid-template-columns:minmax(0,1fr)}}.pyviz .card{background:var(--panel);border:1px solid var(--line);border-radius:12px;min-width:0;overflow:hidden}.pyviz .card-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:10px 14px;border-bottom:1px solid var(--line)}.pyviz .label{font-size:.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.pyviz .legend{display:flex;gap:14px;font-size:.78rem;color:var(--muted)}.pyviz .legend span{display:inline-flex;align-items:center;gap:5px}.pyviz .code{font-family:var(--font-code);font-size:13.5px;line-height:1.7;max-height:min(58vh,560px);overflow:auto;padding-block:8px}.pyviz .code-inner{min-width:-moz-max-content;min-width:max-content}.pyviz .ln{display:grid;grid-template-columns:24px 34px auto;white-space:pre;padding-right:16px}.pyviz .ln .mk{display:flex;align-items:center;justify-content:center}.pyviz .ln .no{color:var(--muted);opacity:.65;text-align:right;padding-right:12px;-webkit-user-select:none;-moz-user-select:none;user-select:none;font-variant-numeric:tabular-nums}.pyviz .ln.cur{background:var(--hl-line)}.pyviz .ln.cur .no{opacity:1;color:var(--ink);font-weight:700}.pyviz .ln.err{background:var(--err-soft)}.pyviz .ln.err .no{color:var(--err);opacity:1;font-weight:700}.pyviz .tk-kw{color:var(--kw);font-weight:500}.pyviz .tk-str{color:var(--str)}.pyviz .tk-num{color:var(--num)}.pyviz .tk-cmt{color:var(--cmt);font-style:italic}.pyviz .tk-bi{color:var(--fn)}.pyviz .tk-def{color:var(--accent);font-weight:700}.pyviz .editor{display:grid;grid-template-columns:44px minmax(0,1fr);font-family:var(--font-code);font-size:13.5px;line-height:1.7;max-height:min(58vh,560px);overflow:auto}.pyviz .gutter{margin:0;padding:8px 10px 8px 0;text-align:right;color:var(--muted);opacity:.65;-webkit-user-select:none;-moz-user-select:none;user-select:none;background:var(--panel-2);border-right:1px solid var(--line)}.pyviz #src,.pyviz .gutter{font:inherit;white-space:pre}.pyviz #src{display:block;width:100%;border:0;resize:none;background:transparent;padding:8px 14px;line-height:inherit;overflow-x:auto;overflow-y:hidden;-moz-tab-size:4;-o-tab-size:4;tab-size:4;min-height:12em}.pyviz #src:focus-visible{outline:none}.pyviz #src::-moz-placeholder{color:var(--muted);opacity:1}.pyviz #src::placeholder{color:var(--muted);opacity:1}.pyviz .src-wrap{position:relative;min-width:0;overflow:hidden}.pyviz .src-hl{position:absolute;top:0;left:0;margin:0;border:0;padding:8px 14px;font:inherit;line-height:inherit;white-space:pre;-moz-tab-size:4;-o-tab-size:4;tab-size:4;color:var(--ink);pointer-events:none;will-change:transform}.pyviz .src-wrap #src{position:relative;color:transparent;caret-color:var(--ink);-webkit-text-fill-color:transparent}.pyviz .src-wrap #src::-moz-placeholder{-webkit-text-fill-color:var(--muted)}.pyviz .src-wrap #src::placeholder{-webkit-text-fill-color:var(--muted)}.pyviz .src-wrap #src::-moz-selection{background:color-mix(in srgb,var(--accent) 35%,transparent)}.pyviz .src-wrap #src::selection{background:color-mix(in srgb,var(--accent) 35%,transparent)}.pyviz [hidden]{display:none!important}.pyviz .editor:focus-within{box-shadow:inset 0 0 0 2px var(--accent)}.pyviz .stdin-row{display:flex;flex-direction:column;gap:6px;padding:12px 14px;border-top:1px solid var(--line)}.pyviz .stdin-row label{font-size:.85rem;font-weight:600}.pyviz .stdin-row small{color:var(--muted);font-weight:400}.pyviz #stdin{border:1px solid var(--line);border-radius:8px;background:var(--panel-2);padding:8px 10px;font-family:var(--font-code);font-size:13px;resize:vertical;min-height:56px}.pyviz .edit-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 14px;border-top:1px solid var(--line)}.pyviz .edit-actions .hint{color:var(--muted);font-size:.82rem}.pyviz .compile-err{margin:0;background:var(--err-soft);color:var(--err);font-size:.9rem}.pyviz .compile-err,.pyviz .controls{padding:10px 14px;border-top:1px solid var(--line)}.pyviz .controls{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.pyviz .stepno{font-variant-numeric:tabular-nums;font-size:.86rem;color:var(--muted);margin-left:6px;white-space:nowrap}.pyviz .slider{display:block;width:calc(100% - 28px);margin:0 14px 12px;accent-color:var(--accent)}.pyviz .status{display:flex;gap:10px;align-items:flex-start;padding:10px 14px;border-top:1px solid var(--line);font-size:.9rem;min-height:42px}.pyviz .status .dot{width:8px;height:8px;border-radius:50%;background:var(--accent);flex:none;margin-top:.45em}.pyviz .status.error{background:var(--err-soft);color:var(--err)}.pyviz .status.error .dot{background:var(--err)}.pyviz .status.done .dot{background:var(--ok)}.pyviz .status code{font-family:var(--font-code);font-size:.85em}.pyviz .out{margin:0;padding:10px 14px;font-family:var(--font-code);font-size:13px;line-height:1.6;white-space:pre-wrap;word-break:break-word;max-height:220px;overflow:auto;min-height:3.2em}.pyviz .out.empty{color:var(--muted);font-family:var(--font-ui);font-style:italic}.pyviz .viz-card.stale .viz{opacity:.45}.pyviz .viz-scroll{overflow-x:auto}.pyviz .viz{position:relative;padding:16px;min-width:-moz-min-content;min-width:min-content}.pyviz .cols{display:grid;grid-template-columns:minmax(200px,auto) minmax(240px,1fr);gap:24px 64px;align-items:start}@media (max-width:640px){.pyviz .cols{grid-template-columns:minmax(0,1fr);gap:28px}.pyviz .heap-list{padding-left:26px}}.pyviz .col-title{margin:0 0 10px;font-size:.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}.pyviz .heap-list,.pyviz .stack-list{display:flex;flex-direction:column;gap:12px;align-items:flex-start}.pyviz .frame{border-left:1px solid var(--line);border:1px solid var(--line);border-left-width:4px;background:var(--panel-2);border-radius:0 8px 8px 0;padding:8px 12px 10px;min-width:190px}.pyviz .frame.current{border-left-color:var(--accent);background:var(--accent-soft)}.pyviz .fname{font-family:var(--font-code);font-weight:700;font-size:.84rem;margin-bottom:6px;display:flex;gap:8px;align-items:baseline}.pyviz .fname small{font-family:var(--font-ui);font-weight:600;font-size:.68rem;letter-spacing:.06em;text-transform:uppercase;color:var(--accent)}.pyviz .vars{border-collapse:collapse;font-family:var(--font-code);font-size:.82rem}.pyviz .vars th{font-weight:500;text-align:right;padding:3px 10px 3px 0;border-right:1px solid var(--line);white-space:nowrap;vertical-align:middle}.pyviz .vars td{padding:3px 0 3px 10px;min-width:48px;vertical-align:middle}.pyviz .vars tr.ret th{color:var(--muted);font-family:var(--font-ui);font-style:italic;font-size:.78rem}.pyviz .vars tr.changed td>.prim,.pyviz .vars tr.changed td>.ref{box-shadow:0 0 0 2px var(--chg);border-radius:3px}.pyviz .empty-note{color:var(--muted);font-size:.82rem;font-style:italic;margin:0}.pyviz .prim{white-space:pre;font-family:var(--font-code)}.pyviz .t-float,.pyviz .t-int{color:var(--num)}.pyviz .t-str{color:var(--str)}.pyviz .t-NoneType,.pyviz .t-bool{color:var(--kw)}.pyviz .t-function{color:var(--fn)}.pyviz .t-name{color:var(--ink)}.pyviz .ref{display:inline-block;width:11px;height:11px;border-radius:50%;background:var(--arrow);vertical-align:middle}.pyviz .obj .olabel{font-size:.68rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--muted);margin:0 0 4px 2px;font-family:var(--font-ui)}.pyviz .obj .olabel b{color:var(--ink);text-transform:none;letter-spacing:0;font-family:var(--font-code);font-size:.8rem}.pyviz .seq{display:flex;flex-wrap:wrap;border:1px solid var(--line);border-radius:5px;background:var(--panel);font-family:var(--font-code);font-size:.82rem;max-width:min(560px,80vw)}.pyviz .seq.tuple{background:var(--panel-2)}.pyviz .seq.set{border-radius:14px}.pyviz .cell{display:flex;flex-direction:column;align-items:center;min-width:40px;padding:2px 9px 5px;border-right:1px solid var(--line)}.pyviz .cell:last-child{border-right:0}.pyviz .cell .idx{font-size:.64rem;color:var(--muted);font-variant-numeric:tabular-nums}.pyviz .seq.set .cell{padding-top:5px}.pyviz .seq .none{padding:4px 10px;color:var(--muted);font-style:italic;font-family:var(--font-ui)}.pyviz .kv{border-collapse:collapse;background:var(--panel);font-family:var(--font-code);font-size:.82rem}.pyviz .kv td{border:1px solid var(--line);padding:3px 10px}.pyviz .kv td.k{background:var(--panel-2)}.pyviz .fnbox{font-family:var(--font-code);font-size:.82rem;padding:4px 10px;border:1px dashed var(--line);border-radius:5px;background:var(--panel)}.pyviz .fnbox small{display:block;font-family:var(--font-ui);color:var(--muted);font-size:.72rem}.pyviz .obj.changed .fnbox,.pyviz .obj.changed .kv,.pyviz .obj.changed .seq{box-shadow:0 0 0 2px var(--chg)}.pyviz .obj.fresh{animation:pyviz-pop .35s ease-out}@keyframes pyviz-pop{0%{transform:translateY(4px);opacity:.3}to{transform:none;opacity:1}}@media (prefers-reduced-motion:reduce){.pyviz .obj.fresh{animation:none}}.pyviz #arrows{position:absolute;left:0;top:0;pointer-events:none;overflow:visible}.pyviz #arrows path.arrow{fill:none;stroke:var(--arrow-dim);stroke-width:1.5}.pyviz #arrows path.arrow.active{stroke:var(--arrow);stroke-width:1.8}.pyviz #arrows .head{fill:var(--arrow-dim)}.pyviz #arrows .head.active{fill:var(--arrow)}.pyviz .note{max-width:1440px;margin:14px auto 0;color:var(--muted);font-size:.82rem}.pyviz .note kbd{font-family:var(--font-code);font-size:.78rem;border:solid var(--line);border-width:1px 1px 2px;border-radius:4px;padding:0 5px;background:var(--panel)}