@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/inconsolata-vietnamese-400-normal.DfC_iMic.woff2)format("woff2"),url(/_astro/inconsolata-vietnamese-400-normal.ByiM2lek.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/inconsolata-latin-ext-400-normal.BaHVOdFB.woff2)format("woff2"),url(/_astro/inconsolata-latin-ext-400-normal.yvPjCxxx.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/inconsolata-latin-400-normal.DTZQ6lD6.woff2)format("woff2"),url(/_astro/inconsolata-latin-400-normal.HYADljCo.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/inconsolata-vietnamese-500-normal.DbMHBz2W.woff2)format("woff2"),url(/_astro/inconsolata-vietnamese-500-normal.vAHA3KlV.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/inconsolata-latin-ext-500-normal.DdbGUZeM.woff2)format("woff2"),url(/_astro/inconsolata-latin-ext-500-normal.B-I2YwP2.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:500;src:url(/_astro/inconsolata-latin-500-normal.DSRic-1t.woff2)format("woff2"),url(/_astro/inconsolata-latin-500-normal.DgSXXU4V.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:700;src:url(/_astro/inconsolata-vietnamese-700-normal.DuasYmn8.woff2)format("woff2"),url(/_astro/inconsolata-vietnamese-700-normal.DLCFFAUf.woff)format("woff");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:700;src:url(/_astro/inconsolata-latin-ext-700-normal.D0Kpgs_9.woff2)format("woff2"),url(/_astro/inconsolata-latin-ext-700-normal.Dlt-daqV.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inconsolata;font-style:normal;font-display:swap;font-weight:700;src:url(/_astro/inconsolata-latin-700-normal.ByjKuJjN.woff2)format("woff2"),url(/_astro/inconsolata-latin-700-normal.DzgUY3Rl.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Gilda Display;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/gilda-display-latin-ext-400-normal.BRPPCUGV.woff2)format("woff2"),url(/_astro/gilda-display-latin-ext-400-normal.DbgQQKWx.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Gilda Display;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/gilda-display-latin-400-normal.gyfWcafy.woff2)format("woff2"),url(/_astro/gilda-display-latin-400-normal.PMqH6bj4.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--ink:#1f1f1d;--soft:#3a3a37;--muted:#75736d;--faint:#a8a6a0;--line:#cdcbc4;--rule:#d8d6cf;--paper:#fbfaf7;--chip:#4a4844;--sepia:#7d6547;--code-bg:#f3f2ee;--code-line:#e3e1d9}*{box-sizing:border-box;margin:0;padding:0}html{height:100%}body{min-height:100%;color:var(--ink);background:var(--paper);-webkit-font-smoothing:antialiased;padding:62px 40px 80px;font-family:Inconsolata,monospace;font-size:14.5px;line-height:1.72;animation:.55s both fade}@keyframes fade{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}a{color:inherit}.layout{max-width:1060px;min-height:calc(100vh - 142px);margin:0 auto;display:flex}.sidebar{flex:none;align-self:flex-start;width:304px;padding-right:44px;position:sticky;top:62px}.name{letter-spacing:.3px;font-family:Gilda Display,serif;font-size:33px;font-weight:400;line-height:1.1}.name a{text-decoration:none}.tagline{margin-top:14px;font-size:14px;font-weight:700}.bio{color:var(--muted);margin-top:9px}.socials{gap:9px;margin-top:20px;display:flex}.social{background:var(--chip);color:#fff;border-radius:3px;justify-content:center;align-items:center;width:35px;height:35px;transition:background .18s,transform .18s;display:flex}.social svg{width:15px;height:15px;display:block}.social:hover{background:#000;transform:translateY(-1px)}.signal{border:1px dashed var(--line);margin-top:30px;padding:22px 22px 24px}.signal-title{letter-spacing:.2px;font-size:14px;font-weight:700}.signal p{color:var(--muted);margin-top:12px}.signal p:first-of-type{margin-top:14px}.signup-btn{color:#fff;background:var(--chip);border-radius:2px;align-items:center;gap:7px;margin-top:18px;padding:10px 18px;font-size:13.5px;text-decoration:none;transition:background .18s,transform .18s;display:inline-flex}.signup-btn:hover{background:#000;transform:translateY(-1px)}.signup-btn .material-symbol{font-size:15px}.side-footer{color:var(--faint);letter-spacing:.3px;margin-top:26px;font-size:12px}.content{border-left:1px dashed var(--line);flex:1;min-width:0;padding-left:44px}.block{margin-bottom:46px}.block:last-child{margin-bottom:0}.section-title{letter-spacing:.3px;margin-bottom:19px;font-family:Gilda Display,serif;font-size:23px;font-weight:400}.rows{list-style:none}.row{align-items:flex-start;gap:13px;padding:7px 0;display:flex}.row-icon{color:#595959;flex:none;justify-content:center;align-items:center;width:22px;height:1.72em;display:flex}.row-icon .brand-icon{width:16px;height:16px;display:block}.row-text{color:var(--muted)}.row-text b{color:var(--ink);font-weight:500}.row-link{color:var(--ink);border-bottom:1px solid #0000;align-items:center;gap:6px;text-decoration:none;transition:border-color .16s;display:inline-flex}.row-link .material-symbol{color:var(--faint);font-size:16px}.row-link:hover{border-color:var(--soft)}.row-link:hover .material-symbol{color:var(--soft)}.material-symbol{font-variation-settings:"FILL" 0, "wght" 100, "GRAD" 0, "opsz" 24;-webkit-user-select:none;user-select:none;font-family:Material Symbols Rounded;font-size:21px;line-height:1}.row-icon .material-symbol{color:var(--soft)}.back{color:var(--muted);align-items:center;gap:6px;font-size:13px;text-decoration:none;transition:color .16s;display:inline-flex}.back:hover{color:var(--ink)}.back .material-symbol{font-size:16px}.eyebrow{letter-spacing:1.6px;text-transform:uppercase;color:var(--faint);margin-top:26px;font-size:11.5px}.article-title{letter-spacing:.2px;margin-top:8px;font-family:Gilda Display,serif;font-size:34px;font-weight:400;line-height:1.16}.lede{color:var(--sepia);margin-top:14px;font-size:15px}.article{margin-top:6px}.article h2{letter-spacing:.2px;margin:36px 0 12px;font-family:Gilda Display,serif;font-size:21px;font-weight:400}.article p{color:var(--soft);margin:0 0 14px}.article ul{margin:0 0 14px;padding-left:4px;list-style:none}.article li{color:var(--soft);margin-bottom:7px;padding-left:20px;position:relative}.article li:before{content:"–";color:var(--faint);position:absolute;left:2px}.article strong{color:var(--ink);font-weight:700}.article code{border:1px solid var(--code-line);background:#eeede8;border-radius:2px;padding:1px 5px;font-family:Inconsolata,monospace;font-size:.92em}.article pre{background:var(--code-bg);border:1px solid var(--code-line);border-radius:2px;margin:0 0 16px;padding:14px 16px;overflow-x:auto}.article pre code{color:var(--ink);background:0 0;border:none;padding:0;font-size:13px;line-height:1.6}.article table{border-collapse:collapse;width:100%;margin:0 0 16px;font-size:13px}.article th,.article td{border:1px solid var(--rule);text-align:left;vertical-align:top;padding:8px 12px}.article th{background:#f1f0ec;font-weight:700}.article td{color:var(--soft)}.article hr{border:none;border-top:1px dashed var(--line);margin:30px 0}.article .diagram{width:100%;height:auto;margin:30px auto 6px;display:block}.article .diagram-caption{letter-spacing:.6px;color:var(--faint);text-align:center;margin:0 0 30px;font-family:Inconsolata,monospace;font-size:11.5px}.article .pull-quote{color:var(--ink);border-left:2px solid var(--ink);letter-spacing:.2px;margin:30px 0;padding:4px 0 4px 20px;font-family:Gilda Display,serif;font-size:22px;line-height:1.4}.article .pull-quote em{color:var(--soft);font-style:italic}.article .stages{grid-template-columns:repeat(2,1fr);gap:18px;margin:26px 0 32px;display:grid}.article .stage{border:1px dashed var(--line);background:0 0;padding:22px 22px 20px;position:relative}.article .stage-num{letter-spacing:1.4px;color:var(--faint);margin-bottom:8px;font-family:Inconsolata,monospace;font-size:11px;display:block}.article .stage h3{letter-spacing:.2px;color:var(--ink);margin:0 0 10px;font-family:Gilda Display,serif;font-size:19px;font-weight:400}.article .stage p{color:var(--soft);margin:0 0 14px;font-size:13.5px;line-height:1.65}.article .stage-io{border-top:1px dashed var(--line);gap:18px;margin-top:auto;padding-top:12px;display:flex}.article .stage-io>div{flex:1;min-width:0}.article .stage-io b{letter-spacing:1.4px;color:var(--faint);text-transform:uppercase;margin-bottom:4px;font-family:Inconsolata,monospace;font-size:10px;font-weight:700;display:block}.article .stage-io span{color:var(--ink);font-size:12.5px}.article .safety-nets{gap:12px;margin:22px 0 30px;display:grid}.article .safety-net{background:var(--code-bg);border:1px solid var(--code-line);border-radius:2px;align-items:flex-start;gap:16px;padding:16px 18px;display:flex}.article .safety-net .material-symbol{color:var(--soft);flex:none;font-size:22px;line-height:1.4}.article .safety-net-body strong{color:var(--ink);margin-bottom:3px;font-size:14px;font-weight:700;display:block}.article .safety-net-body span{color:var(--soft);font-size:13.5px;line-height:1.6}.article .principles{counter-reset:principle;margin:22px 0 30px}.article .principle{border-top:1px dashed var(--line);padding:18px 0 18px 56px;position:relative}.article .principle:last-child{border-bottom:1px dashed var(--line)}.article .principle:before{counter-increment:principle;content:"0" counter(principle);color:var(--faint);letter-spacing:.5px;font-family:Gilda Display,serif;font-size:26px;line-height:1;position:absolute;top:14px;left:0}.article .principle strong{color:var(--ink);margin-bottom:4px;font-size:14px;font-weight:700;display:block}.article .principle span{color:var(--soft);font-size:14px;line-height:1.65}@media (width<=720px){.article .stages{grid-template-columns:1fr}.article .pull-quote{font-size:19px}}.notfound h1{font-family:Gilda Display,serif;font-size:34px;font-weight:400}.notfound p{color:var(--muted);margin-top:12px;margin-bottom:16px}@media (width<=720px){body{padding:40px 24px 60px}.layout{flex-direction:column;min-height:0}.sidebar{width:auto;padding-right:0;position:static}.content{border-left:none;border-top:1px dashed var(--line);margin-top:38px;padding-top:38px;padding-left:0}.article-title{font-size:28px}}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.skip-link{z-index:100;background:var(--ink);color:#fff;padding:10px 16px;position:fixed;top:-60px;left:16px}.skip-link:focus{top:16px}a:focus-visible,button:focus-visible{outline:2px solid var(--sepia);outline-offset:4px}.row-link>svg,.back>svg,.signup-btn>svg{flex:none;width:16px;height:16px}.row-link>svg{color:var(--faint)}.brand-icon{fill:currentColor}.article-meta{color:var(--muted);margin:14px 0 24px;font-size:12px}.cover-image,.article img{max-width:100%;height:auto}.article h3{margin:24px 0 10px}.article ol{margin-bottom:16px;padding-left:24px}.article ol li{padding-left:0}.article ol li:before{content:none}.article a{overflow-wrap:anywhere}.article table{display:block;overflow-x:auto}button{font:inherit;cursor:pointer;color:var(--ink);background:var(--paper);border:1px solid var(--line);padding:8px 12px}@media (prefers-reduced-motion:reduce){body{animation:none}*,:before,:after{scroll-behavior:auto!important;transition:none!important}}.signal form{margin-top:18px}.signal label{color:var(--muted);margin:10px 0 4px;font-size:13px;display:block}.signal input:not([type=hidden]){border:1px dashed var(--line);width:100%;min-width:0;color:var(--ink);font:inherit;background:0 0;border-radius:2px;padding:7px 9px}.signal input:focus-visible{outline:2px solid var(--sepia);outline-offset:2px}.cf-turnstile{margin-top:14px}.signal .signup-btn{font-family:inherit;line-height:inherit;border:0}.signup-btn:disabled{opacity:.6;cursor:wait}#signup-message{overflow-wrap:anywhere;font-size:13px}
