@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-cyrillic-ext-400-normal.xuaO2J-f.woff2)format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-ext-400-normal.DMdlQ8Kv.woff)format("woff");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-cyrillic-400-normal.BSMlKf0J.woff2)format("woff2"),url(/_astro/ibm-plex-mono-cyrillic-400-normal.CEL4l2ZJ.woff)format("woff");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-vietnamese-400-normal.BulugwFq.woff2)format("woff2"),url(/_astro/ibm-plex-mono-vietnamese-400-normal.DDuiU_S-.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:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-latin-ext-400-normal.BmRBH3aV.woff2)format("woff2"),url(/_astro/ibm-plex-mono-latin-ext-400-normal.D3D2R8hC.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:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/_astro/ibm-plex-mono-latin-400-normal.DMJ8VG8y.woff2)format("woff2"),url(/_astro/ibm-plex-mono-latin-400-normal.CvHOgSBP.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:Source Han Sans SC;src:url(/fonts/SourceHanSans-subset.woff2)format("woff2");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:Source Han Fallback;src:local(Microsoft YaHei),local(PingFang SC);ascent-override:116%;descent-override:28.8%;line-gap-override:0%}@font-face{font-family:Schibsted Fallback;src:local(Arial),local(Helvetica);ascent-override:97.66%;descent-override:25.78%;line-gap-override:0%}:root{color-scheme:dark}*{box-sizing:border-box;margin:0;padding:0}html,body{background:var(--sp-ground);min-height:100%}html.spine-live,html.spine-live body{width:100%;height:100%;overflow:hidden}canvas[data-forge]{z-index:-1;pointer-events:none;width:100vw;height:100vh;display:block;position:fixed;inset:0}html.spine-live canvas[data-forge]{z-index:auto;pointer-events:auto}.perc-anchor{opacity:0;pointer-events:none;width:1px;height:1px;position:fixed;top:0;left:0}main.spine-truth{max-width:44rem;color:var(--sp-paper);letter-spacing:.01em;margin:0 auto;padding:4.5rem 1.5rem 7rem;font-family:Schibsted Grotesk Variable,Schibsted Fallback,PingFang SC,Microsoft YaHei,system-ui,sans-serif;line-height:1.85}.stele-face pre,.stele-face code,.stele-face kbd{font-family:IBM Plex Mono,Microsoft YaHei,monospace}.spine-truth-head h1,.stele-face h2{font-family:Schibsted Grotesk Variable,Schibsted Fallback,Source Han Sans SC,Source Han Fallback,PingFang SC,Microsoft YaHei,system-ui,sans-serif}html.spine-live main.spine-truth{max-width:none;margin:0;padding:0}.spine-truth-head h1{margin:0 0 .5rem;font-size:clamp(1.6rem,3vw,2.2rem);font-weight:700}.spine-truth-head p{color:color-mix(in srgb, var(--sp-paper) 68%, transparent);margin:0 0 3.5rem}html.spine-live .spine-truth-head{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.stele-face{border-top:1px solid color-mix(in srgb, var(--sp-paper) 14%, transparent);--stele-dim:color-mix(in srgb, var(--sp-paper) 68%, transparent);--stele-hair:color-mix(in srgb, var(--sp-paper) 20%, transparent);margin:0 0 4.2rem;padding:2.6rem 0 0;font-size:clamp(.9rem,1.1vw,1.02rem)}.stele-face:focus-visible{outline:1px solid var(--sp-phosphor);outline-offset:-1px}html.spine-live .stele-face{overscroll-behavior:contain;pointer-events:none;will-change:transform;border-top:0;width:34vw;max-height:62vh;margin:0;padding:.25rem 1.1rem 1.4rem 0;font-size:clamp(.82rem,1.24vw,1.08rem);position:fixed;top:0;left:0;overflow-y:auto;transform:translate(-200vw);mask:url(#stele-ink)}html.spine-live .stele-face[data-perceive-state=open]{pointer-events:auto}html.spine-live .stele-face[data-stele=contact]{width:26vw}html.spine-live .stele-face::-webkit-scrollbar{width:4px}html.spine-live .stele-face::-webkit-scrollbar-thumb{background:var(--stele-hair)}.stele-face h2{margin:0 0 .35rem;font-size:clamp(1.2rem,1.9vw,1.7rem);font-weight:700;line-height:1.3}.stele-face .stele-meta{color:var(--stele-dim);letter-spacing:.04em;margin:0 0 1.1rem;font-size:.8rem}.stele-face .stele-summary{margin:0 0 1.05rem;font-size:.98rem}.stele-face .stele-para{color:var(--stele-dim);margin:0 0 .85rem}.stele-face .stele-highlights{margin:0 0 1.05rem;padding:0;list-style:none}.stele-face .stele-highlights li{margin-bottom:.3rem;padding-left:.95rem;position:relative}.stele-face .stele-highlights li:before{content:"";background:var(--sp-phosphor);width:.42rem;height:1px;position:absolute;top:.78em;left:0}.stele-face .stele-metrics{grid-template-columns:auto auto;justify-content:start;gap:.22rem 1.6rem;margin:0 0 1.1rem;display:grid}.stele-face .stele-metrics dt{color:var(--stele-dim);letter-spacing:.04em;align-self:baseline;font-size:.78rem}.stele-face .stele-metrics dd{align-self:baseline;margin:0;font-size:.9rem}.stele-face .num{font-variant-numeric:tabular-nums lining-nums;letter-spacing:-.005em}.stele-face .stele-link a,.stele-face .stele-md a{color:var(--sp-phosphor);border-bottom:1px solid var(--stele-hair);padding-bottom:1px;text-decoration:none}.stele-face .stele-shot{border:1px solid var(--stele-hair);margin:0 0 1.05rem}.stele-face .stele-shot img{width:100%;height:auto;display:block}.stele-face .stele-md h2{margin:1.2rem 0 .5rem;font-size:1.02rem}.stele-face .stele-md p{color:var(--stele-dim);margin:0 0 .85rem}.stele-face .stele-md strong{color:var(--sp-paper)}.stele-face .stele-md pre{border:1px solid var(--stele-hair);margin:0 0 .9rem;padding:.7rem .9rem;font-size:.76rem;line-height:1.6;overflow-x:auto;background:0 0!important}.stele-face .stele-md :not(pre)>code{color:var(--sp-paper);font-size:.85em}.stele-face .stele-timeline{margin:0 0 1.05rem}.stele-face .stele-timeline dt{margin-top:.6rem;font-size:.92rem;font-weight:600}.stele-face .stele-timeline dt .num{color:var(--sp-phosphor);margin-right:.55rem;font-weight:700}.stele-face .stele-timeline dd{color:var(--stele-dim);margin:.1rem 0 0;font-size:.88rem}.stele-face .stele-skills{margin:0;padding:0;list-style:none}.stele-face .stele-skills li{color:var(--stele-dim);margin-bottom:.35rem;font-size:.88rem}.stele-face .stele-skills strong{color:var(--sp-paper);margin-right:.6rem;font-weight:600}.stele-face .stele-fork{margin:0 0 1.05rem;padding-left:.95rem;position:relative}.stele-face .stele-fork:before{content:"";background:var(--sp-phosphor);width:1px;position:absolute;top:.4em;bottom:.55em;left:0}.stele-face .stele-fork-note{color:var(--sp-paper);margin:0 0 .55rem;font-size:.98rem}.stele-face .stele-fork .stele-link{margin:0}.stele-face .stele-form{border-top:1px solid var(--stele-hair);margin:1.4rem 0 0;padding-top:1.1rem}.stele-face .stele-form-title{color:var(--stele-dim);letter-spacing:.04em;margin:0 0 .7rem;font-size:.78rem}.stele-face .stele-form label{margin:0 0 .75rem;display:block}.stele-face .stele-form label span{color:var(--stele-dim);letter-spacing:.04em;margin-bottom:.2rem;font-size:.78rem;display:block}.stele-face .stele-form input,.stele-face .stele-form textarea{border:0;border-bottom:1px solid var(--stele-hair);width:100%;color:var(--sp-paper);font:inherit;resize:vertical;background:0 0;outline:none;padding:.15rem 0 .3rem;font-size:.92rem;display:block}.stele-face .stele-form input:focus-visible,.stele-face .stele-form textarea:focus-visible{border-bottom-color:var(--sp-phosphor)}.stele-face .stele-form button{border:0;border-bottom:1px solid var(--stele-hair);color:var(--sp-phosphor);font:inherit;cursor:pointer;background:0 0;padding:.1rem 0 .25rem;font-size:.92rem}.stele-face .stele-form button:focus-visible{outline:1px solid var(--sp-phosphor);outline-offset:3px}.stele-face .stele-status{color:var(--stele-dim);margin:.8rem 0 0;font-size:.85rem}html.spine-live .stele-face.is-signing{filter:saturate(.4)brightness(.94);transition:filter .55s cubic-bezier(.2,.7,.2,1)}.stele-face a.is-signed{animation:.9s cubic-bezier(.2,.7,.2,1) forwards stele-sign-flare}@keyframes stele-sign-flare{0%{color:var(--sp-phosphor);border-bottom-color:var(--sp-phosphor);text-shadow:0 0 16px color-mix(in srgb, var(--sp-phosphor) 45%, transparent)}to{color:var(--sp-paper);border-bottom-color:color-mix(in srgb, var(--sp-paper) 55%, transparent);text-shadow:0 0 0 color-mix(in srgb, var(--sp-phosphor) 0%, transparent)}}.stele-face .stele-status.is-fixed{animation:.9s cubic-bezier(.2,.7,.2,1) forwards stele-sign-flare}html.spine-leaving:after{content:"";z-index:60;background:var(--sp-ground);opacity:0;pointer-events:none;animation:.34s cubic-bezier(.2,.7,.2,1) forwards spine-sink;position:fixed;inset:0}@keyframes spine-sink{to{opacity:1}}@media (prefers-reduced-motion:reduce){html.spine-live .stele-face.is-signing{filter:none;transition:none}.stele-face a.is-signed,.stele-face .stele-status.is-fixed{animation:none}html.spine-leaving:after{opacity:0;animation:none}}
