:root{color-scheme:light;--bg:#ffffff;--ink:#1c2026;--muted:#5f6672;--faint:#8d939d;--rule:#e4e6ea;--tint:#f5f6f8;--accent:#1f5a85;--self:#1c2026;--serif:"Source Serif 4", Georgia, "Times New Roman", serif;--sans:"IBM Plex Sans", -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;--mono:ui-monospace, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;--step--1:0.8125rem;--step-0:1.0625rem;--step-1:1.25rem;--step-2:1.625rem}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#15181c;--ink:#e6e8eb;--muted:#a3a9b3;--faint:#7c838e;--rule:#2a2f36;--tint:#1c2025;--accent:#8cbbe0;--self:#ffffff;color-scheme:dark}}:root[data-theme=dark]{--bg:#15181c;--ink:#e6e8eb;--muted:#a3a9b3;--faint:#7c838e;--rule:#2a2f36;--tint:#1c2025;--accent:#8cbbe0;--self:#ffffff;color-scheme:dark}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--serif);font-size:var(--step-0);line-height:1.6;-webkit-font-smoothing:antialiased}img{max-width:100%;height:auto}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline;text-underline-offset:3px}a:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:2px}.wrap{max-width:1120px;margin:0 auto;padding-left:max(24px,env(safe-area-inset-left,0px));padding-right:max(24px,env(safe-area-inset-right,0px))}.mast{border-bottom:1px solid var(--rule)}.mast .wrap{display:flex;align-items:baseline;justify-content:space-between;gap:16px;flex-wrap:wrap;padding-block:18px}.brand{font-family:var(--sans);font-weight:600;font-size:1rem;color:var(--ink);letter-spacing:.01em}.brand:hover{text-decoration:none}.nav{display:flex;gap:28px;font-family:var(--sans);font-size:.9375rem}.nav a{color:var(--muted)}.nav a:hover{color:var(--ink);text-decoration:none}.page{display:grid;grid-template-columns:250px minmax(0,1fr);gap:72px;padding-block:56px 40px}.side{position:sticky;top:32px;align-self:start;font-family:var(--sans)}.mono{width:112px;height:112px;border-radius:50%;background:var(--tint);border:1px solid var(--rule);display:grid;place-items:center;font-family:var(--serif);font-size:2.25rem;color:var(--muted);margin-bottom:22px}.side h1{font-family:var(--serif);font-weight:600;font-size:var(--step-2);line-height:1.2;margin:0 0 2px}.side .cn{font-family:var(--serif);color:var(--muted);font-size:1rem;margin:0 0 14px}.side .role{font-size:.9375rem;line-height:1.5;color:var(--ink);margin:0 0 4px}.side .aff{font-size:.9375rem;line-height:1.5;color:var(--muted);margin:0}.side ul{list-style:none;margin:24px 0 0;padding:22px 0 0;border-top:1px solid var(--rule);display:grid;gap:9px;font-size:.875rem}.side li{display:grid;grid-template-columns:64px 1fr;gap:8px}.side li span{color:var(--faint)}.side li .val{color:var(--ink);user-select:all;word-break:break-all}.side .past{margin-top:22px;padding-top:18px;border-top:1px solid var(--rule);font-size:.8125rem;color:var(--muted);line-height:1.55}main{min-width:0;max-width:760px}section+section{margin-top:64px}h2{font-family:var(--sans);font-size:.8125rem;font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--faint);margin:0 0 24px;display:flex;align-items:center;gap:16px}h2::after{content:"";flex:1;height:1px;background:var(--rule)}h2 a{margin-left:auto;order:2;text-transform:none;letter-spacing:0;font-weight:500;font-size:.875rem;color:var(--muted)}.lede{font-size:1.1875rem;line-height:1.65;margin:0;text-wrap:pretty}.lede p{margin:0}.lede p+p{margin-top:1em}.theme+.theme{margin-top:40px}.theme h3{font-family:var(--serif);font-weight:600;font-size:var(--step-1);margin:0 0 4px;text-wrap:balance}.theme>p{color:var(--muted);margin:0 0 18px;font-size:1rem}.pubs{list-style:none;margin:0;padding:0}.pub{display:grid;grid-template-columns:112px minmax(0,1fr);gap:20px;padding-block:16px;border-top:1px solid var(--rule)}.pub:last-child{border-bottom:1px solid var(--rule)}.venue{font-family:var(--sans);font-size:.75rem;font-weight:500;line-height:1.35;color:var(--muted);padding-top:4px}.venue b{display:block;color:var(--ink);font-weight:600;font-size:.8125rem}.pt{font-weight:600;line-height:1.4;margin:0 0 4px;text-wrap:pretty}.au{font-family:var(--sans);font-size:.875rem;color:var(--muted);margin:0 0 6px;line-height:1.5}.au strong{color:var(--self);font-weight:600}.links{font-family:var(--sans);font-size:.8125rem;display:flex;gap:14px;flex-wrap:wrap}.note{font-family:var(--sans);font-size:.75rem;color:var(--accent);border:1px solid;border-radius:3px;padding:0 5px;margin-left:6px;vertical-align:2px;font-weight:500}.intro{color:var(--muted);font-size:1rem;margin:-8px 0 0}.intro p{margin:0}section+.theme{margin-top:40px}.theme.year h3{margin-bottom:14px;font-variant-numeric:lining-nums}.posts{list-style:none;margin:0;padding:0;display:grid;gap:0}.post{padding-block:20px;border-top:1px solid var(--rule)}.post:last-child{border-bottom:1px solid var(--rule)}.post .meta{font-family:var(--sans);font-size:.8125rem;color:var(--faint);margin:0 0 4px;display:flex;gap:10px;flex-wrap:wrap}.post h4{font-family:var(--serif);font-size:var(--step-1);font-weight:600;line-height:1.3;margin:0 0 6px;text-wrap:balance}.post h4 a{color:var(--ink)}.post p{margin:0;color:var(--muted);font-size:1rem}.empty{margin:0;color:var(--muted);font-size:1rem}.not-found{font-family:var(--sans);font-size:.8125rem;font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--faint)}footer{border-top:1px solid var(--rule);margin-top:24px}footer .wrap{padding-block:20px 28px;font-family:var(--sans);font-size:.8125rem;color:var(--faint);display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap}.post-page main{max-width:800px}.toc-col{min-width:0}.toc-side{position:sticky;top:32px;font-family:var(--sans);font-size:.875rem;line-height:1.4;max-height:calc(100vh - 64px);overflow-y:auto}.toc-label{margin:0 0 12px;font-size:.8125rem;font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--faint)}.toc-side ul,.toc-inline ul{list-style:none;margin:0;padding:0}.toc-side ul ul,.toc-inline ul ul{padding-left:14px}.toc-side li,.toc-inline li{margin:7px 0}.toc-side a,.toc-inline a{color:var(--muted)}.toc-side a:hover,.toc-side a.active{color:var(--ink);text-decoration:none}.toc-inline{display:none;margin:0 0 32px;padding:12px 16px;border:1px solid var(--rule);border-radius:4px;font-family:var(--sans);font-size:.875rem}.toc-inline summary{cursor:pointer;color:var(--muted);font-weight:500}.toc-inline summary+ul{margin-top:8px}.post-head{margin-bottom:36px}.post-head .meta{font-family:var(--sans);font-size:.8125rem;color:var(--faint);margin:0 0 10px;display:flex;gap:10px;flex-wrap:wrap}.post-head h1{font-family:var(--serif);font-weight:600;font-size:2.25rem;line-height:1.2;margin:0;text-wrap:balance}.post-head .dek{margin:12px 0 0;font-size:var(--step-1);line-height:1.5;color:var(--muted)}.prose{font-size:1.125rem;line-height:1.75}.prose>*+*{margin-top:1.1em}.prose p,.prose ul,.prose ol,.prose pre,.prose blockquote,.prose figure,.prose table{margin-bottom:0}.prose h2{margin:2.4em 0 .6em;font-family:var(--serif);font-size:1.625rem;font-weight:600;line-height:1.25;text-transform:none;letter-spacing:0;color:var(--ink);display:block}.prose h2::after{content:none}.prose h3{margin:1.8em 0 .4em;font-size:1.3rem;font-weight:600;line-height:1.3}.prose h4{margin:1.5em 0 .3em;font-size:1.1rem;font-weight:600}.prose a{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px;text-decoration-color:color-mix(in srgb,var(--accent) 40%,transparent)}.prose a:hover{text-decoration-color:initial}.prose ul,.prose ol{padding-left:1.4em}.prose li+li{margin-top:.35em}.prose blockquote{margin-left:0;margin-right:0;padding-left:18px;border-left:3px solid var(--rule);color:var(--muted)}.prose hr{border:0;border-top:1px solid var(--rule);margin:2.5em 0}.prose img{display:block;margin:0 auto;border-radius:4px}.prose figcaption{margin-top:8px;font-family:var(--sans);font-size:.875rem;color:var(--muted);text-align:center}.prose table{border-collapse:collapse;width:100%;font-family:var(--sans);font-size:.9375rem;display:block;overflow-x:auto}.prose th,.prose td{padding:6px 12px;border-bottom:1px solid var(--rule);text-align:left}.prose th{color:var(--muted);font-weight:600}.prose code{font-family:var(--mono);font-size:.85em;background:var(--tint);padding:.1em .3em;border-radius:3px}.prose pre{overflow-x:auto;padding:14px 16px;background:var(--tint)!important;border:1px solid var(--rule);border-radius:4px;font-size:.875rem;line-height:1.55}.prose pre code{background:0 0;padding:0;font-size:inherit}.prose .highlight{margin-top:1.1em}.prose .katex{font-size:1.05em}.prose .katex-display{overflow-x:auto;overflow-y:hidden;padding:4px 0;margin:0}.prose .footnotes{margin-top:3em;font-size:.9375rem;color:var(--muted)}.prose .footnotes hr{margin:0 0 1.2em}.prose .footnote-ref,.prose .footnote-backref{font-family:var(--sans);text-decoration:none}@media(max-width:900px){.page{grid-template-columns:minmax(0,1fr);gap:28px;padding-block:20px 32px}.nav{gap:18px}.side{position:static;display:grid;grid-template-columns:52px auto 1fr;column-gap:14px;align-items:center}.mono{grid-column:1;grid-row:1/span 3;width:52px;height:52px;font-size:1.15rem;margin:0;align-self:start}.side h1{grid-column:2;grid-row:1;font-size:1.375rem;margin:0}.side .cn{grid-column:3;grid-row:1;margin:0;align-self:center;font-size:.9375rem}.side .role{grid-column:2/-1;grid-row:2;margin:2px 0 0;font-size:.875rem}.side .aff{grid-column:2/-1;grid-row:3;font-size:.875rem}.side ul{grid-column:1/-1;display:flex;flex-wrap:wrap;gap:4px 18px;margin:14px 0 0;padding:12px 0 0}.side li{display:block}.side li>span:first-child{display:none}.side li a{font-size:0}.side li a::before{content:attr(data-label);font-size:.875rem}.side .past{grid-column:1/-1;margin-top:10px;padding-top:0;border-top:0;font-size:.8125rem}.post-page{gap:0}.toc-col{display:none}.toc-inline{display:block}.post-head h1{font-size:1.875rem}}@media(max-width:520px){.wrap{padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px))}.pub{grid-template-columns:minmax(0,1fr);gap:4px}.venue b{display:inline;margin-right:6px}.lede{font-size:1.0625rem}.prose{font-size:1.0625rem}}.chroma .err{color:#f6f8fa;background-color:#82071e}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#dedede}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .line{display:flex}.chroma .k{color:#cf222e}.chroma .kc{color:#cf222e}.chroma .kd{color:#cf222e}.chroma .kn{color:#cf222e}.chroma .kp{color:#cf222e}.chroma .kr{color:#cf222e}.chroma .kt{color:#cf222e}.chroma .na{color:#1f2328}.chroma .nc{color:#1f2328}.chroma .no{color:#0550ae}.chroma .nd{color:#0550ae}.chroma .ni{color:#6639ba}.chroma .nl{color:#900;font-weight:700}.chroma .nn{color:#24292e}.chroma .nx{color:#1f2328}.chroma .nt{color:#0550ae}.chroma .nb{color:#6639ba}.chroma .bp{color:#6a737d}.chroma .nv{color:#953800}.chroma .vc{color:#953800}.chroma .vg{color:#953800}.chroma .vi{color:#953800}.chroma .vm{color:#953800}.chroma .nf{color:#6639ba}.chroma .fm{color:#6639ba}.chroma .s{color:#0a3069}.chroma .sa{color:#0a3069}.chroma .sb{color:#0a3069}.chroma .sc{color:#0a3069}.chroma .dl{color:#0a3069}.chroma .sd{color:#0a3069}.chroma .s2{color:#0a3069}.chroma .se{color:#0a3069}.chroma .sh{color:#0a3069}.chroma .si{color:#0a3069}.chroma .sx{color:#0a3069}.chroma .sr{color:#0a3069}.chroma .s1{color:#0a3069}.chroma .ss{color:#032f62}.chroma .m{color:#0550ae}.chroma .mb{color:#0550ae}.chroma .mf{color:#0550ae}.chroma .mh{color:#0550ae}.chroma .mi{color:#0550ae}.chroma .il{color:#0550ae}.chroma .mo{color:#0550ae}.chroma .o{color:#0550ae}.chroma .ow{color:#0550ae}.chroma .or{color:#0550ae}.chroma .p{color:#1f2328}.chroma .c{color:#57606a}.chroma .ch{color:#57606a}.chroma .cm{color:#57606a}.chroma .c1{color:#57606a}.chroma .cs{color:#57606a}.chroma .cp{color:#57606a}.chroma .cpf{color:#57606a}.chroma .gd{color:#82071e;background-color:#ffebe9}.chroma .ge{color:#1f2328}.chroma .gi{color:#116329;background-color:#dafbe1}.chroma .go{color:#1f2328}.chroma .gl{text-decoration:underline}.chroma .w{color:#fff}@media(prefers-color-scheme:dark){:root:not([data-theme=light]) .chroma .err{color:#f85149}:root:not([data-theme=light]) .chroma .lnlinks{outline:none;text-decoration:none;color:inherit}:root:not([data-theme=light]) .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}:root:not([data-theme=light]) .chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}:root:not([data-theme=light]) .chroma .hl{background-color:#6e7681}:root:not([data-theme=light]) .chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#737679}:root:not([data-theme=light]) .chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#6e7681}:root:not([data-theme=light]) .chroma .line{display:flex}:root:not([data-theme=light]) .chroma .k{color:#ff7b72}:root:not([data-theme=light]) .chroma .kc{color:#79c0ff}:root:not([data-theme=light]) .chroma .kd{color:#ff7b72}:root:not([data-theme=light]) .chroma .kn{color:#ff7b72}:root:not([data-theme=light]) .chroma .kp{color:#79c0ff}:root:not([data-theme=light]) .chroma .kr{color:#ff7b72}:root:not([data-theme=light]) .chroma .kt{color:#ff7b72}:root:not([data-theme=light]) .chroma .nc{color:#f0883e;font-weight:700}:root:not([data-theme=light]) .chroma .no{color:#79c0ff;font-weight:700}:root:not([data-theme=light]) .chroma .nd{color:#d2a8ff;font-weight:700}:root:not([data-theme=light]) .chroma .ni{color:#ffa657}:root:not([data-theme=light]) .chroma .ne{color:#f0883e;font-weight:700}:root:not([data-theme=light]) .chroma .nl{color:#79c0ff;font-weight:700}:root:not([data-theme=light]) .chroma .nn{color:#ff7b72}:root:not([data-theme=light]) .chroma .nx{color:#e6edf3}:root:not([data-theme=light]) .chroma .py{color:#79c0ff}:root:not([data-theme=light]) .chroma .nt{color:#7ee787}:root:not([data-theme=light]) .chroma .nv{color:#79c0ff}:root:not([data-theme=light]) .chroma .vc{color:#79c0ff}:root:not([data-theme=light]) .chroma .vg{color:#79c0ff}:root:not([data-theme=light]) .chroma .vi{color:#79c0ff}:root:not([data-theme=light]) .chroma .vm{color:#79c0ff}:root:not([data-theme=light]) .chroma .nf{color:#d2a8ff;font-weight:700}:root:not([data-theme=light]) .chroma .fm{color:#d2a8ff;font-weight:700}:root:not([data-theme=light]) .chroma .l{color:#a5d6ff}:root:not([data-theme=light]) .chroma .ld{color:#79c0ff}:root:not([data-theme=light]) .chroma .s{color:#a5d6ff}:root:not([data-theme=light]) .chroma .sa{color:#79c0ff}:root:not([data-theme=light]) .chroma .sb{color:#a5d6ff}:root:not([data-theme=light]) .chroma .sc{color:#a5d6ff}:root:not([data-theme=light]) .chroma .dl{color:#79c0ff}:root:not([data-theme=light]) .chroma .sd{color:#a5d6ff}:root:not([data-theme=light]) .chroma .s2{color:#a5d6ff}:root:not([data-theme=light]) .chroma .se{color:#79c0ff}:root:not([data-theme=light]) .chroma .sh{color:#79c0ff}:root:not([data-theme=light]) .chroma .si{color:#a5d6ff}:root:not([data-theme=light]) .chroma .sx{color:#a5d6ff}:root:not([data-theme=light]) .chroma .sr{color:#79c0ff}:root:not([data-theme=light]) .chroma .s1{color:#a5d6ff}:root:not([data-theme=light]) .chroma .ss{color:#a5d6ff}:root:not([data-theme=light]) .chroma .m{color:#a5d6ff}:root:not([data-theme=light]) .chroma .mb{color:#a5d6ff}:root:not([data-theme=light]) .chroma .mf{color:#a5d6ff}:root:not([data-theme=light]) .chroma .mh{color:#a5d6ff}:root:not([data-theme=light]) .chroma .mi{color:#a5d6ff}:root:not([data-theme=light]) .chroma .il{color:#a5d6ff}:root:not([data-theme=light]) .chroma .mo{color:#a5d6ff}:root:not([data-theme=light]) .chroma .o{color:#ff7b72;font-weight:700}:root:not([data-theme=light]) .chroma .ow{color:#ff7b72;font-weight:700}:root:not([data-theme=light]) .chroma .or{color:#ff7b72;font-weight:700}:root:not([data-theme=light]) .chroma .c{color:#8b949e;font-style:italic}:root:not([data-theme=light]) .chroma .ch{color:#8b949e;font-style:italic}:root:not([data-theme=light]) .chroma .cm{color:#8b949e;font-style:italic}:root:not([data-theme=light]) .chroma .c1{color:#8b949e;font-style:italic}:root:not([data-theme=light]) .chroma .cs{color:#8b949e;font-weight:700;font-style:italic}:root:not([data-theme=light]) .chroma .cp{color:#8b949e;font-weight:700;font-style:italic}:root:not([data-theme=light]) .chroma .cpf{color:#8b949e;font-weight:700;font-style:italic}:root:not([data-theme=light]) .chroma .gd{color:#ffa198;background-color:#490202}:root:not([data-theme=light]) .chroma .ge{font-style:italic}:root:not([data-theme=light]) .chroma .gr{color:#ffa198}:root:not([data-theme=light]) .chroma .gh{color:#79c0ff;font-weight:700}:root:not([data-theme=light]) .chroma .gi{color:#56d364;background-color:#0f5323}:root:not([data-theme=light]) .chroma .go{color:#8b949e}:root:not([data-theme=light]) .chroma .gp{color:#8b949e}:root:not([data-theme=light]) .chroma .gs{font-weight:700}:root:not([data-theme=light]) .chroma .gu{color:#79c0ff}:root:not([data-theme=light]) .chroma .gt{color:#ff7b72}:root:not([data-theme=light]) .chroma .gl{text-decoration:underline}:root:not([data-theme=light]) .chroma .w{color:#6e7681}}