*,:before,:after{box-sizing:border-box}*{margin:0}img,picture,video,canvas,svg{max-width:100%;display:block}input,button,textarea,select{font:inherit}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}:root{--color-white:#fff;--color-light:#faf8f4;--color-lighter:#fff;--color-light-darker:#8f8777;--color-dark:#222;--color-dark-lighter:#cfc6b6;--color-dark-blue:#f1ede5;--color-accent:#af2a2b;--color-accent-darker:#8c1c21;--color-accent2:#8b1e23;--space-very-very-small:.2rem;--space-very-small:.25rem;--space-small:.5rem;--space:1rem;--space-large:1.5rem;--space-very-large:3rem;--border-width:2px;--border-color:var(--color-dark-lighter);--text-size:1.125rem;--text-line-height:1.65}body{--_background-color:var(--color-light);font-size:var(--text-size);font-variant:diagonal-fractions slashed-zero;font-family:Iowan Old Style,Palatino Linotype,URW Palladio L,P052,serif;font-weight:400;line-height:var(--text-line-height);color:var(--color-dark);accent-color:var(--color-accent);background:var(--_background-color);letter-spacing:.01em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;scroll-behavior:smooth}a{color:var(--color-accent);text-decoration:none;&:hover,&:focus{text-decoration-color:var(--color-accent-darker);text-decoration-line:underline;text-decoration-thickness:3px}}a:focus-visible,button:focus-visible,summary:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}#reading-progress{background:var(--color-accent);transform-origin:0;z-index:1000;pointer-events:none;height:3px;position:fixed;top:0;left:0;right:0;transform:scaleX(0)}h1,h2,h3,h4,h5,h6{line-height:1.25em;&.separator{--_color:var(--color-light-darker);color:var(--_color);text-align:center;max-width:60%;margin-inline:auto;font-size:1em;font-weight:400;position:relative;&>span{padding-inline:var(--space);background:var(--_background-color);max-width:57%;display:inline-block}&:before{--_width:var(--border-width);content:"";z-index:-1;top:calc(50% - var(--_width)/2);border-top:var(--_width)var(--_color)solid;position:absolute;left:0;right:0}}}:is(h1,h2,h3,h4,h5,h6){--_margin-block-start:var(--space-very-large);margin-block:var(--_margin-block-start)var(--space-large);:not(section:not(:first-child))>&:is(:first-child,:last-child){--_margin-block-start:0}&.separator{margin-block:var(--space-very-large)}}h1{font-size:1.8em}h2,.h2{font-size:1.4em}h3,.h3{font-size:1.2em}p{--paragraph-margin:1.5rem;text-align:justify;text-wrap:pretty;hyphens:auto;hyphenate-limit-chars:8 4 4;orphans:3;widows:3;margin-block:var(--paragraph-margin);&:first-child{margin-block-start:0}&:last-child{margin-block-end:0}}ul{padding-inline-start:var(--space-large);list-style:none;position:relative;&>li:before{content:"•";text-align:center;width:var(--space-large);display:inline-block;position:absolute;left:0}}ol{padding-inline-start:2ch}li{&+li{margin-block-start:var(--space-small)}& p{--paragraph-margin:var(--space-small)}}small{font-size:.75em}code{hyphens:none;padding:var(--space-very-small);background:var(--color-dark-blue);font-family:ui-monospace,Cascadia Code,Source Code Pro,Menlo,Consolas,DejaVu Sans Mono,monospace;font-size:.9em;font-weight:400}pre{--_padding:var(--space);margin-block:var(--space);background:var(--color-dark-blue);border:var(--border-width)var(--border-color)solid;line-height:1.5em;overflow-x:scroll;& code{margin:var(--_padding);background:0 0;padding-inline:0;display:block}&[class^=language-]{--text:"Code";&:before{content:var(--text);padding:var(--space-small)var(--_padding);background:var(--border-color);color:var(--color-dark);font-size:.85em;position:sticky;top:0;left:0}}&.language-rust{--text:"Rust"}&.language-sh{--text:"Shell"}&.language-java{--text:"Java"}&.language-sql{--text:"SQL"}&.language-php{--text:"PHP"}&.language-xml{--text:"XML"}&.language-json{--text:"JSON"}&.language-html{--text:"HTML"}&.language-toml{--text:"TOML"}&.language-haskell{--text:"Haskell"}&.language-scala{--text:"Scala"}&.language-typescript,&.language-ts{--text:"TypeScript"}&.language-ocaml{--text:"OCaml"}&.language-python,&.language-py{--text:"Python"}&.language-purescript{--text:"PureScript"}&.language-go{--text:"Go"}&.language-erlang{--text:"Erlang"}&.language-kotlin{--text:"Kotlin"}&.language-koka{--text:"Koka"}&.language-fstar{--text:"F*"}&.language-agda{--text:"Agda"}&.language-idris{--text:"Idris"}&.language-coq{--text:"Coq"}&.language-granule{--text:"Granule"}&.language-text{--text:""}}.copy-button{top:var(--space-small);right:var(--space-small);padding:var(--space-very-small)var(--space-small);color:var(--color-light-darker);background:var(--color-dark-blue);border:1px solid var(--color-dark-lighter);border-radius:var(--space-very-small);cursor:pointer;opacity:0;font-size:.75em;transition:opacity .15s,background-color .15s;position:absolute;&:hover{background:var(--color-dark-lighter);color:var(--color-dark)}&.copied{color:var(--color-accent)}}pre:hover .copy-button,pre:focus-within .copy-button{opacity:1}figure{--_block-space:var(--space);--_inline-space:var(--space);margin-block:var(--space-large);&:last-child{margin-block-end:0}&:has(img,picture,.youtube-player){--_figcaption-color:var(--color-light-darker);padding:var(--_block-space)var(--_inline-space);background:var(--color-lighter);& code{background:0 0}}& .youtube-player{aspect-ratio:16/9;width:100%}& figcaption{color:var(--_figcaption-color,currentColor);text-align:center;text-wrap:balance;max-width:70%;margin-block-start:var(--_block-space);margin-inline:auto;& a,& a:hover,& a:focus{color:currentColor;text-decoration-line:underline;text-decoration-color:currentColor;text-decoration-thickness:3px}}& :not(figcaption){max-height:50vh;margin-inline:auto}&>p{margin:0}&:has(>table){overflow:scroll hidden}}table{font-variant:tabular-nums;border-collapse:collapse;& th,& td{padding:var(--space-small)var(--space);border:var(--border-width)var(--border-color)solid}}blockquote{padding:var(--space);padding-left:var(--space-large);border-left:4px var(--color-accent)solid;background:var(--color-dark-blue);border-radius:0 var(--space-very-small)var(--space-very-small)0;font-size:1.05em;font-style:normal}q{font-size:1.05em;font-style:italic}time{font-variant:oldstyle-nums}details{--_padding:var(--space);padding:var(--_padding);border:var(--border-width)var(--border-color)solid;position:relative;& summary{cursor:pointer;padding-inline-end:var(--space-very-large);&::marker{content:none}&:after{top:var(--_padding);right:var(--_padding);content:"+";font-weight:700;position:absolute}}&:open summary:after{content:"−"}}.content-grid{--padding-inline:1rem;--content-max-width:70ch;--breakout-max-width:85ch;--breakout-size:calc((var(--breakout-max-width) - var(--content-max-width))/2);grid-template-columns:[full-width-start]minmax(var(--padding-inline),1fr)[breakout-start]minmax(0,var(--breakout-size))[content-start]min(100% - (var(--padding-inline)*2),var(--content-max-width))[content-end]minmax(0,var(--breakout-size))[breakout-end]minmax(var(--padding-inline),1fr)[full-width-end];display:grid;&>*{grid-column:content}&>.breakout{grid-column:breakout}&>.full-width{grid-column:full-width}}main{margin-block:var(--space-very-large)}.breadcrumbs{margin-block-end:var(--space-large);& ol{gap:var(--space-small);color:var(--color-light-darker);flex-wrap:wrap;padding:0;font-size:.9em;list-style:none;display:flex}& li{align-items:center;display:flex;&:not(:last-child):after{content:"›";margin-inline-start:var(--space-small)}&:before{display:none}}& a{color:var(--color-light-darker);&:hover,&:focus{color:var(--color-accent)}}}#menu{color:var(--color-white);background:var(--color-accent2);&>ul{height:var(--space-very-large);grid-template-columns:repeat(5,auto);align-items:center;padding:0;display:grid;@media (width>=901px){grid-template-columns:repeat(6,auto)}}&>ul>li{text-align:center;margin:0;padding:0;&:before{display:none}}& a{color:inherit;text-decoration:none;&:hover,&:focus{text-decoration-color:currentColor}&[aria-current=page]{text-underline-offset:4px;text-decoration:underline 2px}}}footer{padding:var(--space);border-top:var(--border-width)var(--border-color)solid;& .footer{column-gap:var(--space-very-large);row-gap:var(--space-large);flex-wrap:wrap;display:flex;&>*{min-width:fit-content}& h2{font-size:var(--text-size);margin-block:var(--space)}& ul{padding-inline-start:0;& li:before{content:""}}}}.newsletter{margin-block:var(--space-very-large);padding-block:var(--space-very-large);border-block:var(--border-width)var(--border-color)solid;text-align:center}.newsletter-cta{margin-block:0 var(--space);color:var(--color-light-darker);font-style:italic}.newsletter-form{justify-content:center;gap:var(--space-small);flex-wrap:wrap;max-width:400px;margin-inline:auto;display:flex;& input[type=email]{padding:var(--space-small)var(--space);border:var(--border-width)var(--color-dark)solid;background:var(--color-lighter);color:var(--color-dark);flex:200px;&::placeholder{color:var(--color-light-darker)}&:focus{border-color:var(--color-accent);outline:none}}& button{padding:var(--space-small)var(--space-large);border:var(--border-width)var(--color-dark)solid;background:var(--color-dark);color:var(--color-light);cursor:pointer;transition:background-color .15s,border-color .15s;&:hover{background:var(--color-accent);border-color:var(--color-accent)}}}article{&>header{margin-block-end:var(--space-very-large);&>h1{display:inline-block}&>.metadata{margin-block-start:var(--space)}}&.series-episode{&>header{&>h1{margin-block-end:0}&>nav{&>p{margin-block-start:0}}}& .previous-next-episodes{gap:var(--space-large);flex-wrap:wrap;margin-block-start:var(--space-very-large);display:flex;&>*{flex:1;min-width:fit-content}}}}.button{padding:var(--space-small)var(--space);color:var(--color-white);background:var(--color-accent);a&:hover,a&:focus{outline:var(--border-width)var(--color-accent)solid;color:var(--color-accent);background:0 0;text-decoration:none}&.button--disabled{color:currentColor;border:var(--border-width)var(--color-accent)solid;background:0 0}}.metadata>*{color:var(--color-light-darker);display:inline-block;:has(+&){margin-inline-end:var(--space-large)}}.reading-time{padding:var(--space-very-small)var(--space-small);background:var(--color-dark-blue);border-radius:var(--space-very-small);font-variant-numeric:tabular-nums;&:before{content:"⏱ "}}.article-poster,.series-poster{padding:var(--space);border:var(--border-width)var(--border-color)solid;:has(+&){margin-block-end:var(--space)}&>a{display:inline-block;&:has(+.label){margin-inline-end:var(--space)}}&>div:last-child{margin-block-start:var(--space)}}.label{color:var(--color-white);padding:var(--space-very-very-small)var(--space-small);vertical-align:text-top;border-radius:var(--space-very-small);background:var(--color-accent2);font-size:.7rem;font-weight:700}.conversation{--_space:var(--space);color:var(--color-dark);padding:var(--_space);border-radius:var(--space-small);background:var(--color-accent-darker);background-size:100px;position:relative;&>.conversation--character{float:inline-start;min-width:80px;max-width:16%;margin-inline-end:var(--_space);position:relative;& picture{margin-block-end:1rem}& span{text-align:center;width:100%;font-size:.8em;font-style:italic;position:absolute;bottom:0;left:0}}&:after{content:"";clear:both;display:block}&>p:first-of-type{margin-block-start:0}& a,& a:hover,& a:focus{color:currentColor;text-decoration-line:underline;text-decoration-color:currentColor;text-decoration-thickness:3px}& code{background-color:#0000;padding-inline:0}& blockquote{border:0}}.text-align-start{text-align:start}.text-align-end{text-align:end}.footnote-reference a{margin-inline:var(--space-very-very-small);&:before{content:"( "}&:after{content:" )"}}.footnote-definition{--_margin:var(--space-very-large);--_title-space:calc(1em*var(--text-line-height) + var(--space));margin-block-start:calc(var(--_margin) + var(--_title-space));position:relative;&:before{content:"Notes & References";top:calc(-1*var(--_title-space) - var(--space));padding-block-start:var(--space);font-weight:700;display:block;position:absolute;left:0;right:0}&~&{border:0;margin-block-start:var(--space);padding-block-start:0;&:before{display:none}}& .footnote-definition-label{font-size:inherit;vertical-align:initial;margin-inline-end:var(--space-small);display:inline-block;&:after{content:"."}&+p{display:inline}}&:target{padding:var(--space);outline:var(--border-width)var(--color-accent)dotted}}.toc{margin-block:var(--space-large);padding:var(--space);border-left:4px var(--color-accent)solid;padding-inline-start:var(--space-large);& h2{margin-block:0 var(--space);color:var(--color-light-darker);font-size:1em;font-weight:700}& ul{margin:0;padding-inline-start:var(--space-large);list-style:outside}& li{margin-block:var(--space-very-small);&:before{display:none}&::marker{color:var(--color-light-darker)}}& a{color:var(--color-dark);&:hover,&:focus{color:var(--color-accent)}}}@media (width<=600px){.content-grid{--padding-inline:1.5rem}p{text-align:left!important;hyphens:none!important}:root{--text-size:1rem;--text-line-height:1.7;--space-very-large:2rem;--space-large:1.25rem}#menu>ul{height:3.5rem}h1.separator,h2.separator,h3.separator{max-width:85%}.article-poster,.series-poster{padding:.875rem}.metadata>*{font-size:.9em}figure figcaption{max-width:100%}}@media (prefers-color-scheme:dark){:root{--color-light:#1a1a1a;--color-lighter:#252525;--color-light-darker:#aaa;--color-dark:#e0e0e0;--color-dark-lighter:#444;--color-dark-blue:#2a2a2a;--color-accent:#e04545;--color-accent-darker:#c03030;--color-accent2:#8b1e23}}@media print{#menu,footer,.toc{display:none}body{color:#000;background:#fff;font-size:12pt}a{color:#000;text-decoration:underline}pre{white-space:pre-wrap;border:1px solid #ccc}}.theme-toggle-wrapper{display:none}@media (width>=901px){.theme-toggle-wrapper{display:block}}.theme-toggle{cursor:pointer;padding:var(--space-very-small);color:inherit;background:0 0;border:none;font-size:1.2em;line-height:1;transition:transform .2s;&:hover{transform:scale(1.1)}}[data-theme=ghost]{--color-light:#080c08;--color-lighter:#0e140e;--color-light-darker:#607860;--color-dark:#d8e8d8;--color-dark-lighter:#142014;--color-dark-blue:#0a100a;--color-accent:#4ade80;--color-accent-darker:#22c55e;--color-accent2:#fbbf24}[data-theme=ghost] body{background:radial-gradient(ellipse at 50% 0%,#4ade800d 0%,transparent 50%),radial-gradient(ellipse at 50% 100%,#fbbf2408 0%,transparent 50%),var(--color-light)}[data-theme=ghost] #menu{backdrop-filter:blur(10px);background:#080c08f2;border-bottom:1px solid #4ade8040}[data-theme=ghost] #menu a[aria-current=page]{color:#4ade80}[data-theme=ghost] a{color:#4ade80;transition:all .15s}[data-theme=ghost] a:hover{color:#86efac;text-shadow:0 0 10px #4ade8066}[data-theme=ghost] h1,[data-theme=ghost] h2,[data-theme=ghost] h3{color:#4ade80}[data-theme=ghost] article>header h1{color:#86efac;text-shadow:0 0 25px #4ade804d}[data-theme=ghost] .button{color:#4ade80;background:0 0;border:1px solid #4ade80;transition:all .2s}[data-theme=ghost] .button:hover{background:#4ade801a;box-shadow:0 0 15px #4ade8040}[data-theme=ghost] #reading-progress{background:linear-gradient(90deg,#22c55e,#4ade80);box-shadow:0 0 12px #4ade8066}[data-theme=ghost] pre{border:1px solid #4ade801f}[data-theme=ghost] :not(pre)>code{color:#fbbf24;background:#fbbf241a}[data-theme=ghost] blockquote{background:#fbbf240a;border-left-color:#fbbf24}[data-theme=ghost] .label{background:#22c55e}[data-theme=ghost] .reading-time{color:#4ade80;background:#4ade801a;border:1px solid #4ade8033}[data-theme=ghost] footer{border-top-color:#4ade8033}[data-theme=ghost] .article-poster,[data-theme=ghost] .series-poster{border-color:#142014;transition:all .2s}[data-theme=ghost] .article-poster:hover,[data-theme=ghost] .series-poster:hover{border-color:#4ade80;box-shadow:0 0 20px #4ade801a}[data-theme=ghost] .toc{border-left-color:#4ade80}[data-theme=ghost] .newsletter{background:linear-gradient(#4ade8005 0%,#fbbf2405 100%);border-color:#fbbf24}[data-theme=ghost] .newsletter-form input[type=email]{background:var(--color-lighter);color:var(--color-dark);border-color:#4ade80}[data-theme=ghost] .newsletter-form input[type=email]:focus{box-shadow:0 0 12px #4ade8040}[data-theme=ghost] .newsletter-form button{color:#fbbf24;background:0 0;border-color:#fbbf24}[data-theme=ghost] .newsletter-form button:hover{background:#fbbf241a;box-shadow:0 0 12px #fbbf2440}[data-theme=ghost] .theme-toggle:hover{text-shadow:0 0 10px #4ade8099}[data-theme=ghost] ::selection{color:#fff;background:#4ade804d}