
@font-face{font-family:'Excalifont MN';src:url(/fonts/excalifont-mn.woff2) format('woff2');font-display:swap}
:root{--xd-paper:var(--bg);--xd-ink:#1e1e1e;--xd-muted:#6b6b6b;--xd-blue:#a5d8ff;--xd-green:#b2f2bb;--xd-yellow:#ffec99;--xd-red:#ffc9c9;--xd-violet:#d0bfff;--xd-gray:#e9ecef;--xd-orange:#ffd8a8;
  --xd-blue-ink:#4dabf7;--xd-green-ink:#40c057;--xd-yellow-ink:#fab005;--xd-red-ink:#fa5252;--xd-violet-ink:#9775fa;--xd-gray-ink:#adb5bd;--xd-orange-ink:#fd7e14}
:root[data-theme=dark]{--xd-ink:#e4e4e4;--xd-muted:#9a9a9a;--xd-blue:#1c3d5a;--xd-green:#1f4329;--xd-yellow:#4a3f12;--xd-red:#4f2626;--xd-violet:#36295c;--xd-gray:#2a2a2a;--xd-orange:#4d3318}
figure.diagram{margin:2em 0 2.2em;text-align:center}
figure.diagram svg{max-width:100%;height:auto}
@media (max-width:720px){figure.diagram{overflow-x:auto;margin-left:-16px;margin-right:-16px;padding:0 16px}figure.diagram svg{min-width:var(--w)}}
figure.diagram figcaption{font:14px/1.4 Inter,system-ui,sans-serif;color:var(--muted);margin-top:8px}
:root{--bg:#fdfcfa;--fg:#1a1a1a;--muted:#737373;--line:#e8e6e1;--accent:#111;--head:#111;--code-bg:#f4f3f0;--inline:#efede8;--quote:#f6f5f2}
:root[data-theme=dark]{--bg:#141414;--fg:#e4e4e4;--muted:#949494;--line:#2c2c2c;--accent:#f2f2f2;--head:#fafafa;--code-bg:#1d1d1d;--inline:#262626;--quote:#1b1b1b}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--bg);color:var(--fg);font:19px/1.75 Merriweather,Georgia,serif;font-weight:300;transition:background .2s,color .2s}
.wrap{max-width:672px;margin:0 auto;padding:40px 16px 80px}
.top{display:flex;align-items:center;justify-content:space-between;margin-bottom:40px}
.brand{font:800 22px/1 Inter,system-ui,sans-serif;letter-spacing:-.02em;color:var(--head);text-decoration:none}
.brand.small{font-size:20px}
.tools{display:flex;gap:8px;align-items:center}
.lang{display:flex;border:1px solid var(--line);border-radius:999px;overflow:hidden;font:600 13px/1 Inter,system-ui,sans-serif}
.lang a{padding:12px 12px;color:var(--muted);text-decoration:none}
.lang a.on{background:var(--accent);color:var(--bg)}
.tag{font:600 11px/1 Inter,system-ui,sans-serif;border:1px solid var(--line);border-radius:4px;padding:2px 5px;margin-left:6px;color:var(--muted);vertical-align:middle}
.toggle{background:none;border:1px solid var(--line);border-radius:999px;width:40px;height:40px;cursor:pointer;font-size:18px;color:var(--fg)}
.bio{display:flex;gap:14px;align-items:center;margin-bottom:40px;font-size:15px;line-height:1.6}
.avatar{flex:none;width:44px;height:44px;border-radius:50%;display:grid;place-items:center;font-size:22px;background:var(--inline)}
.bio p{margin:0}
.series{font:600 12px/1 Inter,system-ui,sans-serif;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);margin:40px 0 4px}
article.card{margin:20px 0 28px}
article.card h3{margin:0 0 4px;font:700 19px/1.3 Inter,system-ui,sans-serif;letter-spacing:-.01em}
article.card h3 a{color:var(--head);text-decoration:none}
article.card h3 a:hover{text-decoration:underline;text-underline-offset:4px}
article.card small{font:13px Inter,system-ui,sans-serif;color:var(--muted)}
article.card p{margin:4px 0 0;font-size:15px;line-height:1.55;color:var(--muted)}
.post-head h1{font:800 44px/1.15 Inter,system-ui,sans-serif;letter-spacing:-.025em;color:var(--head);margin:0 0 12px}
.post-head .meta{font:14px Inter,system-ui,sans-serif;color:var(--muted);margin-bottom:40px}
.post-head .meta b{color:var(--fg);font-weight:600}
.content h1:first-child{display:none}
.content>p:first-of-type em:only-child{display:none}
.content h2{font:800 28px/1.3 Inter,system-ui,sans-serif;letter-spacing:-.015em;color:var(--head);margin:2.2em 0 .6em}
.content h3{font:800 22px/1.3 Inter,system-ui,sans-serif;color:var(--head);margin:1.8em 0 .5em}
.content a{color:var(--accent);text-decoration:underline;text-decoration-color:var(--muted);text-underline-offset:3px}
.content a:hover{text-decoration-color:currentColor}
.content strong{font-weight:700}
.content p,.content ul,.content ol{margin:0 0 1.6em}
.content li{margin:.3em 0}
.content blockquote{margin:0 0 1.6em -24px;padding:4px 20px;border-left:3px solid var(--line);background:var(--quote);font-style:italic}
.content blockquote p{margin:.6em 0}
.content hr{border:0;margin:3em 0;text-align:center}
.content hr::before{content:"· · ·";color:var(--muted);letter-spacing:.6em}
.content img{max-width:100%;border-radius:6px}
.content table{border-collapse:collapse;display:block;overflow-x:auto;font:15px/1.5 Inter,system-ui,sans-serif;margin:0 0 1.6em}
.content th,.content td{border-bottom:1px solid var(--line);padding:8px 12px;text-align:left}
code{font-family:'JetBrains Mono',ui-monospace,Menlo,monospace;font-size:.82em}
:not(pre)>code{background:var(--inline);padding:.15em .35em;border-radius:4px}
.codehilite{background:var(--code-bg)!important;border-radius:10px;margin:0 -24px 1.6em;overflow-x:auto}
.codehilite pre{margin:0;padding:20px 24px;font-size:15px;line-height:1.6}
.codehilite code{font-size:inherit}
.next{display:flex;justify-content:space-between;gap:24px;margin-top:64px;padding-top:32px;border-top:1px solid var(--line);font:600 16px/1.4 Inter,system-ui,sans-serif}
.next a{color:var(--accent);text-decoration:none}
.next span{display:block;font-weight:400;font-size:13px;color:var(--muted);margin-bottom:4px}
.next div:last-child{text-align:right}
footer{margin-top:64px;font:14px Inter,system-ui,sans-serif;color:var(--muted)}
footer a{color:var(--accent);text-decoration:none}
@media (max-width:720px){body{font-size:17px}.post-head h1{font-size:34px}.codehilite{margin:0 -16px 1.6em;border-radius:0}.content blockquote{margin-left:-16px}}
pre { line-height: 125%; }
td.linenos .normal { color: #666666; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: #666666; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
:root:not([data-theme=dark]) .codehilite .hll { background-color: #ffffcc }
:root:not([data-theme=dark]) .codehilite { background: #f0f0f0; }
:root:not([data-theme=dark]) .codehilite .c { color: #60A0B0; font-style: italic } /* Comment */
:root:not([data-theme=dark]) .codehilite .err { border: 1px solid #F00 } /* Error */
:root:not([data-theme=dark]) .codehilite .k { color: #007020; font-weight: bold } /* Keyword */
:root:not([data-theme=dark]) .codehilite .o { color: #666 } /* Operator */
:root:not([data-theme=dark]) .codehilite .ch { color: #60A0B0; font-style: italic } /* Comment.Hashbang */
:root:not([data-theme=dark]) .codehilite .cm { color: #60A0B0; font-style: italic } /* Comment.Multiline */
:root:not([data-theme=dark]) .codehilite .cp { color: #007020 } /* Comment.Preproc */
:root:not([data-theme=dark]) .codehilite .cpf { color: #60A0B0; font-style: italic } /* Comment.PreprocFile */
:root:not([data-theme=dark]) .codehilite .c1 { color: #60A0B0; font-style: italic } /* Comment.Single */
:root:not([data-theme=dark]) .codehilite .cs { color: #60A0B0; background-color: #FFF0F0 } /* Comment.Special */
:root:not([data-theme=dark]) .codehilite .gd { color: #A00000 } /* Generic.Deleted */
:root:not([data-theme=dark]) .codehilite .ge { font-style: italic } /* Generic.Emph */
:root:not([data-theme=dark]) .codehilite .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
:root:not([data-theme=dark]) .codehilite .gr { color: #F00 } /* Generic.Error */
:root:not([data-theme=dark]) .codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
:root:not([data-theme=dark]) .codehilite .gi { color: #00A000 } /* Generic.Inserted */
:root:not([data-theme=dark]) .codehilite .go { color: #888 } /* Generic.Output */
:root:not([data-theme=dark]) .codehilite .gp { color: #C65D09; font-weight: bold } /* Generic.Prompt */
:root:not([data-theme=dark]) .codehilite .gs { font-weight: bold } /* Generic.Strong */
:root:not([data-theme=dark]) .codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
:root:not([data-theme=dark]) .codehilite .gt { color: #04D } /* Generic.Traceback */
:root:not([data-theme=dark]) .codehilite .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
:root:not([data-theme=dark]) .codehilite .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
:root:not([data-theme=dark]) .codehilite .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
:root:not([data-theme=dark]) .codehilite .kp { color: #007020 } /* Keyword.Pseudo */
:root:not([data-theme=dark]) .codehilite .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
:root:not([data-theme=dark]) .codehilite .kt { color: #902000 } /* Keyword.Type */
:root:not([data-theme=dark]) .codehilite .m { color: #40A070 } /* Literal.Number */
:root:not([data-theme=dark]) .codehilite .s { color: #4070A0 } /* Literal.String */
:root:not([data-theme=dark]) .codehilite .na { color: #4070A0 } /* Name.Attribute */
:root:not([data-theme=dark]) .codehilite .nb { color: #007020 } /* Name.Builtin */
:root:not([data-theme=dark]) .codehilite .nc { color: #0E84B5; font-weight: bold } /* Name.Class */
:root:not([data-theme=dark]) .codehilite .no { color: #60ADD5 } /* Name.Constant */
:root:not([data-theme=dark]) .codehilite .nd { color: #555; font-weight: bold } /* Name.Decorator */
:root:not([data-theme=dark]) .codehilite .ni { color: #D55537; font-weight: bold } /* Name.Entity */
:root:not([data-theme=dark]) .codehilite .ne { color: #007020 } /* Name.Exception */
:root:not([data-theme=dark]) .codehilite .nf { color: #06287E } /* Name.Function */
:root:not([data-theme=dark]) .codehilite .nl { color: #002070; font-weight: bold } /* Name.Label */
:root:not([data-theme=dark]) .codehilite .nn { color: #0E84B5; font-weight: bold } /* Name.Namespace */
:root:not([data-theme=dark]) .codehilite .nt { color: #062873; font-weight: bold } /* Name.Tag */
:root:not([data-theme=dark]) .codehilite .nv { color: #BB60D5 } /* Name.Variable */
:root:not([data-theme=dark]) .codehilite .ow { color: #007020; font-weight: bold } /* Operator.Word */
:root:not([data-theme=dark]) .codehilite .w { color: #BBB } /* Text.Whitespace */
:root:not([data-theme=dark]) .codehilite .mb { color: #40A070 } /* Literal.Number.Bin */
:root:not([data-theme=dark]) .codehilite .mf { color: #40A070 } /* Literal.Number.Float */
:root:not([data-theme=dark]) .codehilite .mh { color: #40A070 } /* Literal.Number.Hex */
:root:not([data-theme=dark]) .codehilite .mi { color: #40A070 } /* Literal.Number.Integer */
:root:not([data-theme=dark]) .codehilite .mo { color: #40A070 } /* Literal.Number.Oct */
:root:not([data-theme=dark]) .codehilite .sa { color: #4070A0 } /* Literal.String.Affix */
:root:not([data-theme=dark]) .codehilite .sb { color: #4070A0 } /* Literal.String.Backtick */
:root:not([data-theme=dark]) .codehilite .sc { color: #4070A0 } /* Literal.String.Char */
:root:not([data-theme=dark]) .codehilite .dl { color: #4070A0 } /* Literal.String.Delimiter */
:root:not([data-theme=dark]) .codehilite .sd { color: #4070A0; font-style: italic } /* Literal.String.Doc */
:root:not([data-theme=dark]) .codehilite .s2 { color: #4070A0 } /* Literal.String.Double */
:root:not([data-theme=dark]) .codehilite .se { color: #4070A0; font-weight: bold } /* Literal.String.Escape */
:root:not([data-theme=dark]) .codehilite .sh { color: #4070A0 } /* Literal.String.Heredoc */
:root:not([data-theme=dark]) .codehilite .si { color: #70A0D0; font-style: italic } /* Literal.String.Interpol */
:root:not([data-theme=dark]) .codehilite .sx { color: #C65D09 } /* Literal.String.Other */
:root:not([data-theme=dark]) .codehilite .sr { color: #235388 } /* Literal.String.Regex */
:root:not([data-theme=dark]) .codehilite .s1 { color: #4070A0 } /* Literal.String.Single */
:root:not([data-theme=dark]) .codehilite .ss { color: #517918 } /* Literal.String.Symbol */
:root:not([data-theme=dark]) .codehilite .bp { color: #007020 } /* Name.Builtin.Pseudo */
:root:not([data-theme=dark]) .codehilite .fm { color: #06287E } /* Name.Function.Magic */
:root:not([data-theme=dark]) .codehilite .vc { color: #BB60D5 } /* Name.Variable.Class */
:root:not([data-theme=dark]) .codehilite .vg { color: #BB60D5 } /* Name.Variable.Global */
:root:not([data-theme=dark]) .codehilite .vi { color: #BB60D5 } /* Name.Variable.Instance */
:root:not([data-theme=dark]) .codehilite .vm { color: #BB60D5 } /* Name.Variable.Magic */
:root:not([data-theme=dark]) .codehilite .il { color: #40A070 } /* Literal.Number.Integer.Long */pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
:root[data-theme=dark] .codehilite .hll { background-color: #ffffcc }
:root[data-theme=dark] .codehilite { background: #282C34; color: #ABB2BF }
:root[data-theme=dark] .codehilite .c { color: #7F848E } /* Comment */
:root[data-theme=dark] .codehilite .err { color: #ABB2BF } /* Error */
:root[data-theme=dark] .codehilite .esc { color: #ABB2BF } /* Escape */
:root[data-theme=dark] .codehilite .g { color: #ABB2BF } /* Generic */
:root[data-theme=dark] .codehilite .k { color: #C678DD } /* Keyword */
:root[data-theme=dark] .codehilite .l { color: #ABB2BF } /* Literal */
:root[data-theme=dark] .codehilite .n { color: #E06C75 } /* Name */
:root[data-theme=dark] .codehilite .o { color: #56B6C2 } /* Operator */
:root[data-theme=dark] .codehilite .x { color: #ABB2BF } /* Other */
:root[data-theme=dark] .codehilite .p { color: #ABB2BF } /* Punctuation */
:root[data-theme=dark] .codehilite .ch { color: #7F848E } /* Comment.Hashbang */
:root[data-theme=dark] .codehilite .cm { color: #7F848E } /* Comment.Multiline */
:root[data-theme=dark] .codehilite .cp { color: #7F848E } /* Comment.Preproc */
:root[data-theme=dark] .codehilite .cpf { color: #7F848E } /* Comment.PreprocFile */
:root[data-theme=dark] .codehilite .c1 { color: #7F848E } /* Comment.Single */
:root[data-theme=dark] .codehilite .cs { color: #7F848E } /* Comment.Special */
:root[data-theme=dark] .codehilite .gd { color: #E06C75 } /* Generic.Deleted */
:root[data-theme=dark] .codehilite .ge { color: #ABB2BF; font-style: italic } /* Generic.Emph */
:root[data-theme=dark] .codehilite .ges { color: #ABB2BF } /* Generic.EmphStrong */
:root[data-theme=dark] .codehilite .gr { color: #E06C75 } /* Generic.Error */
:root[data-theme=dark] .codehilite .gh { color: #ABB2BF; font-weight: bold } /* Generic.Heading */
:root[data-theme=dark] .codehilite .gi { color: #98C379 } /* Generic.Inserted */
:root[data-theme=dark] .codehilite .go { color: #E06C75 } /* Generic.Output */
:root[data-theme=dark] .codehilite .gp { color: #ABB2BF } /* Generic.Prompt */
:root[data-theme=dark] .codehilite .gs { color: #ABB2BF; font-weight: bold } /* Generic.Strong */
:root[data-theme=dark] .codehilite .gu { color: #ABB2BF; font-weight: bold } /* Generic.Subheading */
:root[data-theme=dark] .codehilite .gt { color: #E06C75 } /* Generic.Traceback */
:root[data-theme=dark] .codehilite .kc { color: #E5C07B } /* Keyword.Constant */
:root[data-theme=dark] .codehilite .kd { color: #C678DD } /* Keyword.Declaration */
:root[data-theme=dark] .codehilite .kn { color: #C678DD } /* Keyword.Namespace */
:root[data-theme=dark] .codehilite .kp { color: #C678DD } /* Keyword.Pseudo */
:root[data-theme=dark] .codehilite .kr { color: #C678DD } /* Keyword.Reserved */
:root[data-theme=dark] .codehilite .kt { color: #E5C07B } /* Keyword.Type */
:root[data-theme=dark] .codehilite .ld { color: #ABB2BF } /* Literal.Date */
:root[data-theme=dark] .codehilite .m { color: #D19A66 } /* Literal.Number */
:root[data-theme=dark] .codehilite .s { color: #98C379 } /* Literal.String */
:root[data-theme=dark] .codehilite .na { color: #E06C75 } /* Name.Attribute */
:root[data-theme=dark] .codehilite .nb { color: #E5C07B } /* Name.Builtin */
:root[data-theme=dark] .codehilite .nc { color: #E5C07B } /* Name.Class */
:root[data-theme=dark] .codehilite .no { color: #E06C75 } /* Name.Constant */
:root[data-theme=dark] .codehilite .nd { color: #61AFEF } /* Name.Decorator */
:root[data-theme=dark] .codehilite .ni { color: #E06C75 } /* Name.Entity */
:root[data-theme=dark] .codehilite .ne { color: #E06C75 } /* Name.Exception */
:root[data-theme=dark] .codehilite .nf { color: #61AFEF; font-weight: bold } /* Name.Function */
:root[data-theme=dark] .codehilite .nl { color: #E06C75 } /* Name.Label */
:root[data-theme=dark] .codehilite .nn { color: #E06C75 } /* Name.Namespace */
:root[data-theme=dark] .codehilite .nx { color: #E06C75 } /* Name.Other */
:root[data-theme=dark] .codehilite .py { color: #E06C75 } /* Name.Property */
:root[data-theme=dark] .codehilite .nt { color: #E06C75 } /* Name.Tag */
:root[data-theme=dark] .codehilite .nv { color: #E06C75 } /* Name.Variable */
:root[data-theme=dark] .codehilite .ow { color: #56B6C2 } /* Operator.Word */
:root[data-theme=dark] .codehilite .pm { color: #ABB2BF } /* Punctuation.Marker */
:root[data-theme=dark] .codehilite .w { color: #ABB2BF } /* Text.Whitespace */
:root[data-theme=dark] .codehilite .mb { color: #D19A66 } /* Literal.Number.Bin */
:root[data-theme=dark] .codehilite .mf { color: #D19A66 } /* Literal.Number.Float */
:root[data-theme=dark] .codehilite .mh { color: #D19A66 } /* Literal.Number.Hex */
:root[data-theme=dark] .codehilite .mi { color: #D19A66 } /* Literal.Number.Integer */
:root[data-theme=dark] .codehilite .mo { color: #D19A66 } /* Literal.Number.Oct */
:root[data-theme=dark] .codehilite .sa { color: #98C379 } /* Literal.String.Affix */
:root[data-theme=dark] .codehilite .sb { color: #98C379 } /* Literal.String.Backtick */
:root[data-theme=dark] .codehilite .sc { color: #98C379 } /* Literal.String.Char */
:root[data-theme=dark] .codehilite .dl { color: #98C379 } /* Literal.String.Delimiter */
:root[data-theme=dark] .codehilite .sd { color: #98C379 } /* Literal.String.Doc */
:root[data-theme=dark] .codehilite .s2 { color: #98C379 } /* Literal.String.Double */
:root[data-theme=dark] .codehilite .se { color: #98C379 } /* Literal.String.Escape */
:root[data-theme=dark] .codehilite .sh { color: #98C379 } /* Literal.String.Heredoc */
:root[data-theme=dark] .codehilite .si { color: #98C379 } /* Literal.String.Interpol */
:root[data-theme=dark] .codehilite .sx { color: #98C379 } /* Literal.String.Other */
:root[data-theme=dark] .codehilite .sr { color: #98C379 } /* Literal.String.Regex */
:root[data-theme=dark] .codehilite .s1 { color: #98C379 } /* Literal.String.Single */
:root[data-theme=dark] .codehilite .ss { color: #98C379 } /* Literal.String.Symbol */
:root[data-theme=dark] .codehilite .bp { color: #E5C07B } /* Name.Builtin.Pseudo */
:root[data-theme=dark] .codehilite .fm { color: #56B6C2; font-weight: bold } /* Name.Function.Magic */
:root[data-theme=dark] .codehilite .vc { color: #E06C75 } /* Name.Variable.Class */
:root[data-theme=dark] .codehilite .vg { color: #E06C75 } /* Name.Variable.Global */
:root[data-theme=dark] .codehilite .vi { color: #E06C75 } /* Name.Variable.Instance */
:root[data-theme=dark] .codehilite .vm { color: #E06C75 } /* Name.Variable.Magic */
:root[data-theme=dark] .codehilite .il { color: #D19A66 } /* Literal.Number.Integer.Long */