:root{--ok:#15803d;--warn:#b45309;--bad:#b91c1c}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--ok:#4ade80;--warn:#fbbf24;--bad:#f87171}}:root[data-theme=dark]{--ok:#4ade80;--warn:#fbbf24;--bad:#f87171}:root{--bg:#fff;--text:#2b2b2b;--title:#141414;--muted:#666;--rule:#e6e6e6;--band:#f4f6f5;--code:#eff1f0;--accent:#0f6e5c;color-scheme:light}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--bg:#1d2126;--text:#ffffffdb;--title:#fff;--muted:#9aa3ad;--rule:#323840;--band:#242a30;--code:#2b3138;--accent:#5fd3b8;color-scheme:dark}}:root[data-theme=dark]{--bg:#1d2126;--text:#ffffffdb;--title:#fff;--muted:#9aa3ad;--rule:#323840;--band:#242a30;--code:#2b3138;--accent:#5fd3b8;color-scheme:dark}*{box-sizing:border-box}html{scrollbar-gutter:stable;scroll-padding-top:5rem}body{background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;margin:0;font:18px/1.7 -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.wrap{max-width:44rem;padding-left:max(20px,env(safe-area-inset-left,0px));padding-right:max(20px,env(safe-area-inset-right,0px));margin:0 auto}a{color:var(--accent);text-underline-offset:.16em;text-decoration-thickness:1px}a:hover{text-decoration-thickness:2px}a:focus-visible{outline:2px solid var(--accent);outline-offset:2px}h1,h2,h3{color:var(--title);text-wrap:balance;letter-spacing:-.015em;line-height:1.2}header.site{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.3rem 1.5rem;padding:1.6rem 0;display:flex}header.site .name{color:var(--title);font-size:1.05em;font-weight:800;text-decoration:none}header.site nav{gap:1.3rem;font-size:.92em;display:flex}header.site nav a{color:var(--muted);text-decoration:none}header.site nav a:hover,header.site nav a[aria-current]{color:var(--title)}.hero{padding:2.2rem 0 1.4rem}.hero h1{letter-spacing:-.035em;margin:0 0 1rem;font-size:clamp(2.3rem,7vw,3.4rem);font-weight:800;line-height:1.05}.hero p{margin:0 0 .7rem;font-size:1.12em;line-height:1.6}.hero .reach{color:var(--muted);margin-top:1.2rem;font-size:.95em}.band{background:var(--band);padding:2.6rem 0 2.8rem}.kicker{color:var(--muted);margin:0 0 .5rem;font-size:.8em;font-weight:700}.kicker b{color:var(--accent)}.feat h2{margin:0 0 .8rem;font-size:clamp(1.7rem,4.6vw,2.3rem);font-weight:800}.feat h2 a{color:var(--title);text-decoration:none}.feat h2 a:hover{color:var(--accent)}.feat p{margin:0 0 .9rem}.feat .go{margin:0;font-weight:700}h2.sec{margin:0 0 1.2rem;font-size:1.35em;font-weight:800}.sec-wrap{padding:2.8rem 0 1rem}.list{margin:0;padding:0;list-style:none}.list li{border-top:1px solid var(--rule);grid-template-columns:7.5rem minmax(0,1fr);gap:1.2rem;padding:1.05rem 0;display:grid}.list time{color:var(--muted);padding-top:.25rem;font-size:.85em}.list h3{margin:0 0 .2rem;font-size:1.15em;font-weight:700}.list h3 a{color:var(--title);text-decoration:none}.list h3 a:hover{color:var(--accent);text-decoration:underline}.list p{color:var(--muted);margin:0;font-size:.95em;line-height:1.55}.projects{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.8rem 2.4rem;display:grid}.projects h3{margin:0;font-size:1.15em;font-weight:800}.projects .st{color:var(--muted);margin:.1rem 0 .35rem;font-size:.85em}.projects p{margin:0;font-size:.97em;line-height:1.6}.about p{margin:0 0 1rem}footer{border-top:1px solid var(--rule);color:var(--muted);flex-wrap:wrap;justify-content:space-between;gap:.5rem;margin-top:3rem;padding:1.1rem 0 3rem;font-size:.85em;display:flex}footer a{color:var(--muted)}.article{padding:1.6rem 0 0}.article h1{letter-spacing:-.03em;margin:0 0 .7rem;font-size:clamp(2rem,5.5vw,2.6rem);font-weight:800;line-height:1.1}.article .by{color:var(--muted);border-bottom:1px solid var(--rule);margin:0 0 2.2rem;padding-bottom:1.2rem;font-size:.9em}.article h2{margin:2.2rem 0 .6rem;font-size:1.3em;font-weight:800}.article ul{padding-left:1.3rem}.article li{margin:.3rem 0}.article code{background:var(--code);border-radius:3px;padding:.1em .3em;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:.85em}.article pre{background:var(--code);border-radius:4px;padding:1rem 1.1rem;line-height:1.5;overflow-x:auto}.article pre code{background:0 0;padding:0}.article table{border-collapse:collapse;font-size:.92em;display:block;overflow-x:auto}.article th,.article td{border-bottom:1px solid var(--rule);text-align:left;padding:.4rem .8rem .4rem 0}.author{border-top:2px solid var(--title);margin-top:3rem;padding-top:1.4rem}.author p{margin:0 0 .4rem}.next{margin-top:2.6rem}.next h2{margin:0 0 .4rem;font-size:1.1em}.cv h1{margin:1.4rem 0 .2rem;font-size:2.2em;font-weight:800}.cv .lede{color:var(--muted);margin:0 0 2rem}.cv h2{border-bottom:1px solid var(--rule);margin:2.2rem 0 .8rem;padding-bottom:.3rem;font-size:1.2em;font-weight:800}.role{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:0 1rem;display:flex}.role h3{margin:0;font-size:1.05em}.role span,.where{color:var(--muted);font-size:.9em}.where{margin:0}.cv ul{margin:.4rem 0 1.4rem;padding-left:1.2rem}@media (width<=600px){body{font-size:17px}.projects{grid-template-columns:1fr}.list li{grid-template-columns:1fr;gap:.1rem}.list time{padding:0}header.site nav{gap:1.1rem}.hero{padding:1rem 0 .6rem}}@media print{header.site,footer,.noprint{display:none}body{font-size:12pt}}.crumbs{color:var(--muted);margin:.4rem 0 0;font-size:.85em}.crumbs a{color:var(--muted)}.crumbs span{margin:0 .45em}.hero h1 .aside{letter-spacing:0;color:var(--muted);margin-top:.6rem;font-size:1.1rem;font-weight:500;line-height:1.4;display:block}.v{font-weight:700}.v.confirmed{color:var(--ok)}.v.vendor-reported,.v.misleading,.v.hype{color:var(--warn)}.v.false{color:var(--bad)}.v.pending{color:var(--muted)}.newsl .v{font-size:.85em}.more{margin:1.2rem 0 0;font-weight:700}.upcoming{margin:0;padding-left:1.2rem}.upcoming li{margin:.25rem 0}.page{padding:1.2rem 0 0}.page h1{letter-spacing:-.03em;margin:.6rem 0;font-size:clamp(2rem,5.5vw,2.6rem);font-weight:800;line-height:1.1}.page .intro{margin:0 0 .6rem}.page .sub{color:var(--muted);margin:0 0 2rem;font-size:.9em}.item{border-top:1px solid var(--rule);padding:1.6rem 0}.item .when{color:var(--muted);margin:0 0 .3rem;font-size:.85em}.item h2{margin:0 0 .4rem;font-size:1.3em;font-weight:800}.item h2 a{color:var(--title);text-decoration:none}.item .verdict{margin:0 0 .7rem}.item .sum{color:var(--title);margin:0 0 .7rem;font-weight:600}.item .body p{margin:0 0 .7rem}.item .meta{color:var(--muted);margin:.2rem 0 0;font-size:.88em}.item .meta a{color:var(--muted)}.item details{color:var(--muted);margin:.3rem 0 0;font-size:.88em}.item summary{cursor:pointer}.item ol{margin:.3rem 0 0;padding-left:1.2rem}figure{margin:2rem 0}figure svg{width:100%;height:auto;display:block}figcaption{color:var(--muted);margin-top:.5rem;font-size:.85em}@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}.skip{background:var(--bg);padding:.5rem 1rem;position:absolute;top:0;left:-999px}.skip:focus{z-index:10;left:1rem}.crumbs .here{color:var(--muted);margin:0}.article .by{margin-bottom:2.2rem}.topbar{z-index:5;background:var(--bg);border-bottom:1px solid var(--rule);position:sticky;top:0}.topbar header.site{padding:1rem 0}.crumbs{margin:1rem 0 0}.page .topics{color:var(--muted);margin:0 0 .5rem;font-size:.95em}.page .topics b{color:var(--title);font-weight:700}.cv .lede{margin:0 0 .9rem}.contact{flex-wrap:wrap;align-items:center;gap:.6rem 1.4rem;margin:0 0 2.2rem;display:flex}.pdf{font:inherit;border:1px solid var(--rule);cursor:pointer;background:0 0;border-radius:6px;padding:.3rem .9rem;font-size:.9em;color:var(--title)!important;text-decoration:none!important}.pdf:hover{border-color:var(--muted)}.pdf:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.list h3 a,.feat h2 a{text-decoration:underline;text-decoration-color:var(--rule);text-underline-offset:.2em;text-decoration-thickness:2px}.list h3 a:hover,.feat h2 a:hover{color:var(--accent);text-decoration-color:currentColor}@media print{.topbar,.crumbs{display:none}}.cv .summary{border-left:3px solid var(--accent);max-width:40rem;margin:0 0 .5rem;padding-left:1rem;font-size:1.08em;line-height:1.65}.cv .company{margin:0 0 1rem}.cv .company span{color:var(--muted);font-size:.9em;display:block}.cv .job{margin:0 0 1.2rem}.cv .job ul{margin-top:.3rem}.skills{grid-template-columns:10rem minmax(0,1fr);gap:.4rem 1.2rem;margin:0;display:grid}.skills dt{color:var(--title);font-weight:700}.skills dd{margin:0}@media (width<=600px){.skills{grid-template-columns:1fr;gap:.1rem}.skills dd{margin-bottom:.5rem}}@media print{.cv .summary{border-left-color:#999}}.filter{color:var(--muted);margin:0 0 1.6rem;font-size:.92em;line-height:1.9}.filter ul{flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.filter li{white-space:nowrap}.filter li:not(:last-child):after{content:"·";margin:0 .55em}.filter b{color:var(--title)}.month h2{color:var(--muted);text-transform:none;margin:1.8rem 0 .3rem;font-size:1rem;font-weight:700}.rows{margin:0;padding:0;list-style:none}.rows li{border-top:1px solid var(--rule);grid-template-columns:4.2rem minmax(0,1fr);gap:1rem;padding:.7rem 0;display:grid}.rows time{color:var(--muted);white-space:nowrap;padding-top:.15rem;font-size:.85em}.rows .t{color:var(--title);text-decoration:underline;text-decoration-color:var(--rule);text-underline-offset:.2em;font-weight:700;line-height:1.35;text-decoration-thickness:2px}.rows .t:hover{color:var(--accent);text-decoration-color:currentColor}.rows .m{color:var(--muted);margin:.2rem 0 0;font-size:.85em}.rows .m a,.item .verdict a{color:var(--muted)}.rows .m a:hover,.item .verdict a:hover{color:var(--accent)}.item.page{border-top:0;padding-top:1.2rem}.item.page h1{margin:.2rem 0 .5rem}.pager{border-top:1px solid var(--rule);justify-content:space-between;gap:1.5rem;margin:2.2rem 0 0;padding-top:1rem;font-size:.9em;display:flex}.pager a{max-width:48%}.pager a:last-child{text-align:right}@media (width<=600px){.pager{flex-direction:column}.pager a{max-width:none}.pager a:last-child{text-align:left}}.item .body ul{margin:.4rem 0 .9rem;padding-left:1.2rem}.item .body li{margin:.45rem 0}.item .body li strong{color:var(--text)}.item .body li a{color:var(--muted);text-underline-offset:2px;font-size:.8em;text-decoration:underline}.rows .s{color:var(--muted);margin:.25rem 0 0;font-size:.92em;line-height:1.55}.rows .m a,.rows .m .v,.item .verdict a{white-space:nowrap}.crumbs{align-items:baseline;gap:0 .5em;min-width:0;display:flex}.crumbs .here{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.crumbs a,.crumbs span{flex:none;margin:0}.crumbs .here{flex:0 auto}@media (width<=600px){.rows li{grid-template-columns:1fr;gap:.15rem}.rows time{padding:0;font-size:.8em}}header.site .who{flex-wrap:wrap;align-items:baseline;gap:.2rem 1rem;min-width:0;display:flex}header.site .ids{flex-wrap:wrap;gap:0 .9rem;font-size:.8em;display:flex}header.site .ids a{white-space:nowrap;color:var(--accent)}@media (width<=600px){header.site .ids{gap:0 .7rem;font-size:.74em}.topbar header.site{row-gap:.15rem;padding:.7rem 0}}:root{--desk:#f3f4f5;--sheet:#fff;--card:#fff;--band:#eef5f2;--lift:0 1px 2px #1018200f,0 8px 24px -12px #10182038;--lift-h:0 2px 4px #1018200f,0 14px 32px -12px #10182047}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--desk:#141619;--sheet:#1d2126;--card:#20252b;--band:#1f2b28;--lift:0 1px 2px #0006,0 10px 28px -12px #000c;--lift-h:0 2px 4px #0006,0 16px 36px -12px #000000e6}}:root[data-theme=dark]{--desk:#141619;--sheet:#1d2126;--card:#20252b;--band:#1f2b28;--lift:0 1px 2px #0006,0 10px 28px -12px #000c;--lift-h:0 2px 4px #0006,0 16px 36px -12px #000000e6}body{background:var(--desk)}.topbar{background:color-mix(in srgb,var(--desk) 88%,transparent);-webkit-backdrop-filter:blur(8px);border-bottom:1px solid var(--rule)}main{padding:.2rem 0 1rem}.rows{gap:12px;display:grid}.rows li{background:var(--card);box-shadow:var(--lift);border:0;border-radius:10px;padding:16px 18px;transition:box-shadow .2s,transform .2s}.rows li:hover{box-shadow:var(--lift-h);transform:translateY(-1px)}.month h2{border:0}.projects>div{background:var(--card);box-shadow:var(--lift);border-radius:10px;padding:18px 20px}@media (prefers-reduced-motion:reduce){.rows li{transition:none}.rows li:hover{transform:none}}main>.wrap:first-child:empty{display:none}header.site .name:before{content:"";background:var(--accent);vertical-align:.08em;border-radius:50%;width:.5em;height:.5em;margin-right:.5em;display:inline-block}.hero h1{letter-spacing:-.04em}.hero h1 .accent{color:var(--accent)}.hero h1 .aside{white-space:nowrap;font-size:min(1.1rem,3.15vw)}h2.sec{align-items:center;gap:.7rem;display:flex}h2.sec:before{content:"";background:var(--accent);flex:none;width:1.4rem;height:2px}.rows .t{text-decoration-color:color-mix(in srgb,var(--accent) 35%,transparent)}.rows time{color:var(--accent);font-variant-numeric:tabular-nums}.projects h3 a{text-underline-offset:.18em;text-decoration-thickness:2px}@media (width<=600px){.rows li{padding:14px}}@media print{body{background:#fff}.topbar,main{box-shadow:none;clip-path:none;border-radius:0;max-width:none;margin:0}}.projects h2{margin:0;font-size:1.15em;font-weight:800}.projects h2 a{text-underline-offset:.18em;text-decoration-thickness:2px}.page .projects{margin-top:1.4rem}.hero .here{color:var(--muted);margin:.8rem 0 0;font-size:.9em}.hero .here b{color:var(--title);font-variant-numeric:tabular-nums;font-weight:600}.box{background:var(--card);box-shadow:var(--lift);border-radius:10px;min-width:0;padding:16px 18px}.now{gap:.55rem;margin:0;padding:0;list-style:none;display:grid}.now li{padding-left:1.1rem;line-height:1.5;position:relative}.now li:before{content:"";background:var(--accent);border-radius:50%;width:.42rem;height:.42rem;position:absolute;top:.62em;left:0}.pipe{margin:.4rem 0 0}.pipe svg{width:100%;max-width:100%;height:auto;display:block}.pipe .lane{stroke:var(--rule);stroke-width:2px}.pipe .node{fill:var(--card);stroke:var(--accent);stroke-width:2px}.pipe .node.hot{fill:color-mix(in srgb,var(--accent) 14%,var(--card))}.pipe text{fill:var(--muted);font:600 12px/1 -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.pipe text.hot{fill:var(--title)}.pipe .dot{fill:var(--accent);animation:6s cubic-bezier(.3,.7,.4,1) infinite flow;animation-delay:var(--d)}@keyframes flow{0%{opacity:0;transform:translate(0)}6%{opacity:1}35%{transform:translateX(var(--to))}to{transform:translateX(var(--to));opacity:1}}@media (prefers-reduced-motion:reduce){.pipe .dot{transform:translateX(var(--to));animation:none}}.pipe figcaption{color:var(--text);margin-top:.6rem;font-size:.95em;line-height:1.55}@media print{.pipe .dot{transform:translateX(var(--to));animation:none}}@media (width<=600px){.pipe text{font-size:18px}}.log{gap:18px;margin:0;padding:0;list-style:none;display:grid}.problem{padding:20px 22px 18px}.problem time{color:var(--accent);font-variant-numeric:tabular-nums;margin:0 0 .25rem;font-size:.85em;display:block}.problem h3{margin:0 0 .9rem;font-size:1.25em;font-weight:800}.problem .stage{margin:0 -4px .8rem}.problem .what p{margin:0;line-height:1.6}.problem .what p+p{margin-top:.6rem}.elsewhere{color:var(--muted);margin:2.2rem 0 0;font-size:.95em}.anim{width:100%;height:auto;display:block;overflow:visible}.anim.game{border-radius:6px;overflow:hidden}.anim .lane{stroke:var(--rule);stroke-width:2px}.anim .node{fill:var(--card);stroke:var(--accent);stroke-width:2px}.anim .node.hot{fill:color-mix(in srgb,var(--accent) 14%,var(--card))}.anim .lbl,.anim .count,.anim .mode{fill:var(--muted);font:600 11px/1 -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.anim .lbl.hot,.anim .count.hot{fill:var(--title)}.anim .count tspan{font-variant-numeric:tabular-nums;fill:var(--title);font-weight:800}.anim .count.hot tspan{fill:var(--warn)}.anim .dot{fill:var(--accent);transition:fill 1.2s,opacity .5s}.anim .dot.wait{fill:color-mix(in srgb,var(--accent) 45%,var(--muted))}.anim .dot.gone{opacity:0}.anim .live{transition:opacity 1.6s}.anim .live.out{opacity:0}.anim .card{fill:var(--card);stroke:var(--rule);stroke-width:1.5px}@media (width<=600px){.problem{padding:16px 14px 14px}.problem h3{font-size:1.12em}.anim .lbl,.anim .count,.anim .mode{font-size:14px}}.tracer .spark{fill:none;stroke:var(--muted);stroke-width:2px;stroke-linejoin:round}.tracer .alert{fill:var(--warn);transform-box:fill-box;transform-origin:50%;animation:12s infinite tr-alert}.tracer .wire{stroke:var(--rule);stroke-width:2px}.tracer .sig{fill:var(--accent);animation:12s infinite tr-sig}.tracer .probe{stroke:var(--accent);stroke-width:2px;stroke-dasharray:4 4}.tracer .src{opacity:.3}.tracer .src .card{stroke:var(--accent)}.tracer .s-nr{animation:12s infinite tr-nr}.tracer .s-ph{animation:12s infinite tr-ph}.tracer .s-gc{animation:12s infinite tr-gc}.tracer .report{opacity:0;animation:12s infinite tr-rep}.tracer .slack{stroke:var(--accent)}.tracer .ok{fill:var(--ok);animation:12s infinite tr-ok}.tracer .mode{fill:var(--title)}.tracer .m1{animation:12s infinite tr-m1}.tracer .m2{opacity:0;animation:12s infinite tr-m2}@keyframes tr-alert{0%,50%,to{opacity:1;transform:scale(1)}4%,54%{opacity:.6;transform:scale(1.9)}8%,58%{opacity:1;transform:scale(1)}}@keyframes tr-sig{0%,3%{opacity:0;transform:translate(0)}4%{opacity:1}9%{opacity:1;transform:translate(49px)}10%,53%{opacity:0;transform:translate(49px)}53.1%{transform:translate(0)}54%{opacity:1;transform:translate(0)}59%{opacity:1;transform:translate(49px)}60%,to{opacity:0;transform:translate(49px)}}@keyframes tr-nr{0%,11%{opacity:.3}13%,18%{opacity:1}21%,to{opacity:.3}}@keyframes tr-gc{0%,23%{opacity:.3}25%,30%{opacity:1}33%,to{opacity:.3}}@keyframes tr-ph{0%,17%{opacity:.3}19%,46%{opacity:1}49%,60%{opacity:.3}62%,95%{opacity:1}98%,to{opacity:.3}}@keyframes tr-rep{0%,34%{opacity:0}37%,46%{opacity:1}49%,65%{opacity:0}68%,95%{opacity:1}98%,to{opacity:0}}@keyframes tr-ok{0%,40%{opacity:0}42%,to{opacity:1}}@keyframes tr-m1{0%,46%{opacity:1}49%,97%{opacity:0}to{opacity:1}}@keyframes tr-m2{0%,47%{opacity:0}50%,96%{opacity:1}99%,to{opacity:0}}@media (prefers-reduced-motion:reduce){.tracer .src,.tracer .report,.tracer .m2{opacity:1}.tracer .s-nr,.tracer .s-gc{opacity:.3}.tracer .sig,.tracer .m1{opacity:0}}.game .road{fill:none;stroke:var(--rule);stroke-width:18px;stroke-linecap:round;stroke-linejoin:round}.game .road-line{fill:none;stroke:var(--card);stroke-width:2px;stroke-dasharray:3 9}.game .enemy{fill:var(--warn)}.game .base{fill:var(--card);stroke:var(--accent);stroke-width:2px}.game .core{fill:var(--accent);transform-box:fill-box;transform-origin:50%;animation:1.6s infinite td-fire}.game .ring{fill:none;stroke:var(--accent);stroke-width:2px;opacity:0;transform-box:fill-box;transform-origin:50%;animation:1.6s ease-out infinite td-ring}.game .ring.r2{animation-delay:.8s}.game .bar{fill:var(--accent);transform-box:fill-box;transform-origin:50% 100%;animation:.8s ease-in-out infinite alternate td-bar;animation-delay:calc(var(--i) * -.23s)}.game .bar:nth-child(odd){animation-duration:1.1s}@keyframes td-fire{0%,to{transform:scale(1)}8%{transform:scale(1.35)}}@keyframes td-ring{0%{opacity:.8;transform:scale(1)}to{opacity:0;transform:scale(4.2)}}@keyframes td-bar{0%{transform:scaleY(.2)}to{transform:scaleY(1)}}@media (prefers-reduced-motion:reduce){.game .ring{opacity:.35;transform:scale(2)}.game .bar{transform:scaleY(calc(.3 + var(--i) * .1))}}@media (width<=600px){header.site .ids{gap:0 1.1rem;font-size:.88em}header.site .ids a{padding:.35rem 0;display:inline-block}}
