diff options
Diffstat (limited to '')
33 files changed, 3547 insertions, 0 deletions
diff --git a/www/causal.agency/.gitignore b/www/causal.agency/.gitignore new file mode 100644 index 00000000..7935a3c1 --- /dev/null +++ b/www/causal.agency/.gitignore @@ -0,0 +1,3 @@ +*.html +scheme.css +scheme.png diff --git a/www/causal.agency/Makefile b/www/causal.agency/Makefile new file mode 100644 index 00000000..fdb1748e --- /dev/null +++ b/www/causal.agency/Makefile @@ -0,0 +1,31 @@ +WEBROOT = /usr/local/www/causal.agency + +FILES = index.html scheme.png + +all: ${FILES} + +install: ${FILES} + install -C -m 644 ${FILES} ${WEBROOT} + +INCLUDES = scheme.css torus.html play.html catgirl.html scheme.html + +index.html: index.html.in index.sed ${INCLUDES} + sed -f index.sed index.html.in > index.html + +FLAGS.torus.pty = -n -h 25 +FLAGS.scheme.pty = -n -h 10 +FLAGS.play.pty = -h 16 + +.SUFFIXES: .html .pty + +.pty.html: + shotty ${FLAGS.$<} $< > $@ + +scheme.css: + scheme -s > scheme.css + +scheme.png: + scheme -g > scheme.png + +clean: + rm -f ${FILES} ${INCLUDES} diff --git a/www/causal.agency/catgirl.pty b/www/causal.agency/catgirl.pty new file mode 100644 index 00000000..651e83db --- /dev/null +++ b/www/causal.agency/catgirl.pty @@ -0,0 +1,97 @@ +[?1049h[22;0;0t[1;24r(B[m[4l[?7h[39;49m[?1h=[?1004h[?2004h[39;49m(B[m[H[2J(B[0;7m[90m 0 <network> [21d(B[0m[95mcatgirl[39m(B[m is GPLv3 fwee softwawe ^w^ code is avaiwable fwom[22;9Hhttps://git.causal.agency/catgirl +Traveling... +]2;chat.freenode.net <network>[H +[3M[21d[31m-adams.freenode.net-[37m *** Looking up your hostname... +[31m-adams.freenode.net-[37m *** Checking Ident +[31m-adams.freenode.net-[37m *** Couldn't look up your hostname +[39m(B[m[H +[M[23d[31m-adams.freenode.net-[37m *** No Ident response +[39m(B[m[H +[M[23dYou arrive in freenode +[H +[6M[18d[90m-[39m(B[m Welcome to adams.freenode.net. Thanks to ATW Internet Kft +[90m-[39m(B[m (http://www.atw.hu) for sponsoring this server! +[90m- +-[39m(B[m ADAMS, DOUGLAS (1952-2001). Author of The Hitch Hikers Guide +[90m-[39m(B[m to the Galaxy and many other witty and humourous books, +[90m-[39m(B[m portrayed in his uniquely British irony. He is sorely missed +[H +[6M[18d[90m-[39m(B[m by many millions of devoted fans. "So long and thanks for all +[90m-[39m(B[m the books!" +[90m- +-[39m(B[m Welcome to freenode - supporting the free and open source +[90m-[39m(B[m software communities since 1998. +[90m- +[39m(B[m[H +[3M[21d[90m-[39m(B[m By connecting to freenode you indicate that you have read and +[90m-[39m(B[m accept our policies and guidelines as set out on https://freenode.net +[90m- +[39m(B[m[H +[3M[21d[90m-[39m(B[m In the event that you observe behaviour that contravenes our policies, +[90m-[39m(B[m please notify a volunteer staff member via private message, or send us an +[90m-[39m(B[m e-mail to complaints@freenode.net -- we will do our best to address the +[H +[4M[20d[90m-[39m(B[m situation within a reasonable period of time, and we may request further +[90m-[39m(B[m information or, as appropriate, involve other parties such as channel + operators +[90m-[39m(B[m Group Contacts representing an on-topic group. +[H +[6M[18d[90m- +-[39m(B[m freenode runs an open proxy scanner. +[90m- +-[39m(B[m If you are looking for assistance, you may be able to find a list of +[90m-[39m(B[m volunteer staff on '/stats p' (shows only on-call staff) or by joining +[90m-[39m(B[m #freenode and using the '/who freenode/staff/*' command. You may message +[H +[5M[19d[90m-[39m(B[m any of us at any time. Please note that freenode predominantly provides +[90m-[39m(B[m assistance via private message, and while we have a network channel the +[90m-[39m(B[m primary venue for support requests is via private message to a member +[90m-[39m(B[m of the volunteer staff team. +[90m- +[39m(B[m[H +[5M[19d[90m-[39m(B[m From time to time, volunteer staff may send server-wide notices relating to +[90m-[39m(B[m the project, or the communities that we host. The majority of such notices +[90m-[39m(B[m will be sent as wallops, and you can '/mode <yournick> +w' to ensure that you +[90m-[39m(B[m do not miss them. Important messages relating to the freenode project, + including +[H +[7M[17d[90m-[39m(B[m notices of upcoming maintenance and other scheduled downtime will be issued + as +[90m-[39m(B[m global notices. +[90m- +-[39m(B[m Representing an on-topic project? Don't forget to register, more information +[90m-[39m(B[m can be found on the https://freenode.net website under "Group Registration". +[90m- +[39m(B[m[H +[5M[19d[90m-[39m(B[m Thank you also to our server sponsors for the sustained support in keeping + the +[90m-[39m(B[m network going for close to two decades. +[90m- +-[39m(B[m Thank you for using freenode! +[1;14H[95m 1 freenode-connect ([97m2[95m) [24d[39m(B[m]2;freenode <network> (+2!)[H[95m 1 freenode-connect ([97m2[95m) (B[0;7m[31m 2 #ascii.town +[39m(B[m[K +[K +[K +[K +[K +[K +[K +[K +[K +[K +[K +[K +[K +[K +[K +[K +[K +[96mcatgirl[39m(B[m arrives in [31m#ascii.town[39m(B[m[K +The sign in [31m#ascii.town[39m(B[m reads: https://ascii.town public SSH services and IRC +things <3 AGPL[K +In [31m#ascii.town[39m(B[m are catgirl, gjabell, danopia, larbob, ep, nonlinear, epilys, +benharri, june, yourfate, josuah +[96m<catgirl> [39m(B[m]2;freenode #ascii.town (+2!) /[Kclose 1[H(B[0;7m[31m 1[39m(B[m[24P [24d[96m<catgirl> [39m(B[m]2;freenode #ascii.townhello, world![H +[M[23;10H +[96m<catgirl> [39m(B[m[2;23r[23;1H[1S[1;24r[1;16H(B[0;7m[31m(1) [23d(B[0m[3m[34m* june[39m(B[0m[3m waves +(B[m]2;freenode #ascii.town (1)[1;16H[K[24;11H]2;freenode #ascii.town \ No newline at end of file diff --git a/www/causal.agency/index.html.in b/www/causal.agency/index.html.in new file mode 100644 index 00000000..82f2457e --- /dev/null +++ b/www/causal.agency/index.html.in @@ -0,0 +1,125 @@ +<!DOCTYPE html> +<title>Causal Agency</title> +<meta name="viewport" content="width=device-width, initial-scale=1.0"> +<style> +html { + font-family: monospace; + color: var(--ansi15); + background-color: var(--ansi0); +} +body { + max-width: 80ch; + margin: 2em auto; + padding: 0 1ch; +} +h1 { + font-size: inherit; + font-weight: inherit; + margin: 1em 0 0; +} +p { + margin: 0 0 1em 4ch; +} +a { + color: var(--ansi12); + text-decoration: none; +} +a:visited { + color: var(--ansi13); +} +pre { + border: 1px dashed var(--ansi8); +} +hr { + visibility: hidden; +} +/* include:scheme.css */ +</style> + +<p> +Hi. +I make mostly IRC software in C. +I like FreeBSD and OpenBSD +but also the GPL. +You can find me in +<a href="ircs://chat.freenode.net:6697/#ascii.town">#ascii.town</a> +on freenode +or send mail to june@. + +<p> +<a href="https://git.causal.agency">code</a> +-- +<a href="https://text.causal.agency">words</a> + +<h1><a href="https://git.causal.agency/pounce/about">pounce</a></h1> +<p> +multi-client IRC bouncer + +<h1><a href="https://git.causal.agency/catgirl/about">catgirl</a></h1> +<p> +artisanal IRC client +<p> +demo: <a href="ssh://chat@ascii.town">ssh chat@ascii.town</a> +<p> +<!-- include:catgirl.html --> + +<h1><a href="https://git.causal.agency/litterbox/about">litterbox</a></h1> +<p> +full-text search IRC logger + +<h1><a href="https://git.causal.agency/scooper/about">scooper</a></h1> +<p> +web interface for litterbox + +<h1><a href="https://git.causal.agency/catsit/about">catsit</a></h1> +<p> +process supervisor + +<hr> + +<h1><a href="https://git.causal.agency/imbox/about">imbox & git-fetch-email</a></h1> +<p> +IMAP to mbox + +<h1><a href="https://git.causal.agency/notemap/about">notemap</a></h1> +<p> +mirror notes to IMAP + +<hr> + +<h1><a href="https://ascii.town/explore.html">torus</a></h1> +<p> +collaborative ASCII art +<p> +<a href="ssh://torus@ascii.town">ssh torus@ascii.town</a> +-- +<a href="https://git.causal.agency/torus">src</a> +<p> +<!-- include:torus.html --> + +<h1>play</h1> +<p> +2048 over SSH +<p> +<a href="ssh://play@ascii.town">ssh play@ascii.town</a> +-- +<a href="https://git.causal.agency/play">src</a> +<p> +<!-- include:play.html --> + +<hr> + +<h1><a href="https://git.causal.agency/cards/about">cards</a></h1> +<p> +CARDS.DLL loader for SDL + +<h1><a href="bin/scheme.html">scheme</a></h1> +<p> +earthy terminal colours +<p> +<a href="scheme.png">palette</a> +<!-- include:scheme.html --> + +<h1><a href="bin/">bin</a></h1> +<p> +other little tools diff --git a/www/causal.agency/index.sed b/www/causal.agency/index.sed new file mode 100644 index 00000000..ea32675f --- /dev/null +++ b/www/causal.agency/index.sed @@ -0,0 +1,5 @@ +/include:scheme[.]css/r scheme.css +/include:torus[.]html/r torus.html +/include:play[.]html/r play.html +/include:catgirl[.]html/r catgirl.html +/include:scheme[.]html/r scheme.html diff --git a/www/causal.agency/play.pty b/www/causal.agency/play.pty new file mode 100644 index 00000000..3da44fb7 --- /dev/null +++ b/www/causal.agency/play.pty @@ -0,0 +1,23 @@ +[1;24r[m[4l[?12l[?25h[?1h=[39;49m[?25l[?1h=[39;49m[m[H[2J[1;30H0 + + [38;5;7m[48;5;0m [7C[39;49m[mUse the arrow keys to + [38;5;7m[48;5;0m . . . . [7C[39;49m[mslide and merge tiles. + [38;5;7m[48;5;0m [7C[39;49m[mPress q to quit. + [38;5;7m[48;5;0m +[28D . . . . +[28D +[28D [38;5;15m[48;5;1m[1m +[28D[m[38;5;7m[48;5;0m . . [38;5;15m[48;5;1m[1m 2 2 +[28D[m[38;5;7m[48;5;0m [38;5;15m[48;5;1m[1m +[28D[m[38;5;7m[48;5;0m +[28D . . . . +[28D [39;49m[m[1;30H4[6;10H[38;5;15m[48;5;1m[1m [7;10H 2 [8;10H +[14D[38;5;15m[48;5;2m [7C[m[38;5;7m[48;5;0m +[28D[38;5;15m[48;5;2m[1m 4 [7C[m[38;5;7m[48;5;0m . . +[28D[38;5;15m[48;5;2m[1m [7C[m[38;5;7m[48;5;0m [39;49m[m[3;24H[38;5;15m[48;5;1m[1m [4;24H 2 [5;24H [6;10H[m[38;5;7m[48;5;0m [7;10H . [8;10H +[14D +[7D . +[7D +[7D[38;5;15m[48;5;2m[1m [38;5;15m[48;5;1m +[14D[38;5;15m[48;5;2m 4 [38;5;15m[48;5;1m 2 +[14D[38;5;15m[48;5;2m [38;5;15m[48;5;1m [39;49m[m \ No newline at end of file diff --git a/www/causal.agency/scheme.pty b/www/causal.agency/scheme.pty new file mode 100644 index 00000000..74be2196 --- /dev/null +++ b/www/causal.agency/scheme.pty @@ -0,0 +1,10 @@ +[40m [41m [42m [43m [44m [45m [46m [47m [m +[40m [41m [42m [43m [44m [45m [46m [47m [m +[40m [41m [42m [43m [44m [45m [46m [47m [m +[40m [41m [42m [43m [44m [45m [46m [47m [m +[40m [41m [42m [43m [44m [45m [46m [47m [m +[100m [101m [102m [103m [104m [105m [106m [107m [m +[100m [101m [102m [103m [104m [105m [106m [107m [m +[100m [101m [102m [103m [104m [105m [106m [107m [m +[100m [101m [102m [103m [104m [105m [106m [107m [m +[100m [101m [102m [103m [104m [105m [106m [107m [m[H diff --git a/www/causal.agency/torus.pty b/www/causal.agency/torus.pty new file mode 100644 index 00000000..1e147970 --- /dev/null +++ b/www/causal.agency/torus.pty @@ -0,0 +1,774 @@ +[1;25r[m[4l[39;49m[?1h=[?25l[39;49m[38;5;0m[48;5;0m[m[39;49m[38;5;0m[48;5;0m[H[2J[38;5;3m[48;5;0m┌──────────────────────────────────────────────────────────────────────────────┐[2;1H│[38;5;7m[48;5;0m Welcome to [38;5;12m[48;5;0ma[38;5;14m[48;5;0ms[38;5;10m[48;5;0mc[38;5;11m[48;5;0mi[38;5;9m[48;5;0mi[38;5;13m[48;5;0m.[38;5;12m[48;5;0mt[38;5;14m[48;5;0mo[38;5;10m[48;5;0mw[38;5;11m[48;5;0mn[38;5;7m[48;5;0m! [38;5;15m[48;5;0mq[38;5;7m[48;5;0m quit [38;5;15m[48;5;0mQ[38;5;7m[48;5;0m teleport [38;5;15m[48;5;0mm[38;5;7m[48;5;0m mini-map [38;5;15m[48;5;0m?[38;5;7m[48;5;0m help [38;5;3m[48;5;0m│[3;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[4;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mk[38;5;7m[48;5;0m [38;5;8m[48;5;0m0[38;5;7m[48;5;0m [38;5;1m[48;5;0m1[38;5;7m[48;5;0m [38;5;2m[48;5;0m2[38;5;7m[48;5;0m [38;5;3m[48;5;0m3[38;5;7m[48;5;0m [38;5;4m[48;5;0m4[38;5;7m[48;5;0m [38;5;5m[48;5;0m5[38;5;7m[48;5;0m [38;5;6m[48;5;0m6[38;5;7m[48;5;0m 7 [38;5;15m[48;5;0mesc[38;5;7m[48;5;0m navigation mode [38;5;15m[48;5;0ms[38;5;7m[48;5;0m copy [38;5;3m[48;5;0m│[5;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0my[38;5;7m[48;5;0m ↑ [38;5;15m[48;5;0mu[38;5;7m[48;5;0m [38;5;15m[48;5;0mi[38;5;7m[48;5;0m insert mode [38;5;15m[48;5;0mp[38;5;7m[48;5;0m paste [38;5;3m[48;5;0m│[6;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mh[38;5;7m[48;5;0m ←∙→ [38;5;15m[48;5;0ml[38;5;7m[48;5;0m [38;5;8m[48;5;0m)[38;5;7m[48;5;0m [38;5;0m[48;5;1m![38;5;7m[48;5;0m [38;5;0m[48;5;2m@[38;5;7m[48;5;0m [38;5;0m[48;5;3m#[38;5;7m[48;5;0m [38;5;0m[48;5;4m$[38;5;7m[48;5;0m [38;5;0m[48;5;5m%[38;5;7m[48;5;0m [38;5;0m[48;5;6m^[38;5;7m[48;5;0m [38;5;0m[48;5;7m&[38;5;7m[48;5;0m [38;5;15m[48;5;0ma[38;5;7m[48;5;0m insert after [38;5;15m[48;5;0m~[38;5;7m[48;5;0m paint color [38;5;3m[48;5;0m│[7;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mb[38;5;7m[48;5;0m ↓ [38;5;15m[48;5;0mn[38;5;7m[48;5;0m [38;5;15m[48;5;0mI[38;5;7m[48;5;0m insert direction [38;5;15m[48;5;0m*[38;5;7m[48;5;0m paint bright [38;5;3m[48;5;0m│[8;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mj[38;5;7m[48;5;0m [38;5;15m[48;5;0m8[38;5;7m[48;5;0m bright [38;5;15m[48;5;0m9[38;5;7m[48;5;0m invert [38;5;15m[48;5;0mR[38;5;7m[48;5;0m draw mode [38;5;15m[48;5;0m([38;5;7m[48;5;0m paint invert [38;5;3m[48;5;0m│[9;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0m`[38;5;7m[48;5;0m pipette [38;5;15m[48;5;0m.[38;5;7m[48;5;0m line mode [38;5;15m[48;5;0mC-a[38;5;7m[48;5;0m increment [38;5;3m[48;5;0m│[10;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0m\[38;5;7m[48;5;0m fast [38;5;15m[48;5;0mr[38;5;7m[48;5;0m replace [38;5;15m[48;5;0mC-x[38;5;7m[48;5;0m decrement [38;5;3m[48;5;0m│[11;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mx[38;5;7m[48;5;0m erase [38;5;15m[48;5;0mHJKLYUBN[38;5;7m[48;5;0m swap cell [38;5;3m[48;5;0m│[12;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[13;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mF1[38;5;7m[48;5;0m @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmno [38;5;3m[48;5;0m│[14;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mF2[38;5;7m[48;5;0m ☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ [38;5;3m[48;5;0m│[15;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mF3[38;5;7m[48;5;0m αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ [38;5;3m[48;5;0m│[16;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mF4[38;5;7m[48;5;0m ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ [38;5;3m[48;5;0m│[17;1H│[38;5;7m[48;5;0m [38;5;15m[48;5;0mF5[38;5;7m[48;5;0m ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«» [38;5;3m[48;5;0m│[18;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[19;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[20;1H│[38;5;7m[48;5;0m This is [38;5;3m[48;5;0mAGPLv3[38;5;7m[48;5;0m Free Software! [38;5;3m[48;5;0m│[21;1H│[38;5;7m[48;5;0m Code is available from [38;5;6m[48;5;0m<https://code.causal.agency/june/torus>[38;5;7m[48;5;0m. [38;5;3m[48;5;0m│[22;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[23;1H│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[24;1H│[38;5;7m[48;5;0m Press [38;5;15m[48;5;0m? [38;5;7m[48;5;0mto open this help again. Press any key to continue... [38;5;3m[48;5;0m│[25;1H└──────────────────────────────────────────────────────────────────────────────┘[4h─[4l[m[39;49m[38;5;0m[48;5;0m[?12l[?25h[H[38;5;7m[48;5;0mPress [38;5;15m[48;5;0m?[38;5;7m[48;5;0m for help![38;5;3m[48;5;0m│[38;5;7m[48;5;0m this space now frees [38;5;9m[48;5;0m [38;5;5m[48;5;0m\[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m\[38;5;7m[48;5;0m [38;5;6m[48;5;0mCP437[38;5;14m[48;5;0m [38;5;11m[48;5;0m☻ [38;5;9m[48;5;7m♥♦[38;5;0m[48;5;7m♣♠[38;5;14m[48;5;0m [38;5;4m[48;5;0m░▒▓█[38;5;3m[48;5;0m [38;5;6m[48;5;0m [38;5;7m[48;5;0m(000,000)[2;1H[38;5;3m[48;5;0m─────────────────┘ [38;5;7m[48;5;0m [38;5;11m[48;5;0mIt's Free Real Estate[38;5;7m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;5m[48;5;0m\[38;5;3m[48;5;0m [38;5;5m[48;5;0my[38;5;3m[48;5;0m [38;5;5m[48;5;0m\ [38;5;3m[48;5;0m ╒══════════════════════╕[K +[38;5;9m[48;5;0mFor a good [3;25H[38;5;5m[48;5;0m(0_0)[3;41H[m[39;49m[38;5;0m[48;5;0m [7C[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;13m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;15m[48;5;0mascii.town guestbook[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;1m[48;5;0m [38;5;7m[48;5;0m[K +[38;5;9m[48;5;0mtime, go in[38;5;7m[48;5;0m a [m[39;49m[38;5;0m[48;5;0m [38;5;3m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m [38;5;5m[48;5;0my[38;5;3m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m ╞[38;5;7m[48;5;0m══════════════════════[38;5;3m[48;5;0m╡[38;5;7m[48;5;0m[K +[38;5;9m[48;5;0many direction.[5;31H[38;5;10m[48;5;0m [38;5;7m[48;5;0m RR w [38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m-[38;5;7m[48;5;0m [38;5;6m[48;5;0mjune [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P +[38;5;12m[48;5;0mPls don't[38;5;7m[48;5;0m publicg@conferencRRRRuRRRRR.forsale [38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;13m[48;5;0m-[38;5;5m[48;5;0m [38;5;13m[48;5;0mscott [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P +[38;5;12m[48;5;0mvandal. There[7;28H[38;5;7m[48;5;0mRRRRRRRRRR [38;5;5m[48;5;0m | | [38;5;3m[48;5;0m│ [38;5;4m[48;5;0m- cjm [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P +[38;5;12m[48;5;0mare huuuuuge[38;5;15m[48;5;0m [38;5;7m[48;5;0m [38;5;4m[48;5;0mhelo woldr[38;5;7m[48;5;0m RRRRRRRR r a [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0ml[38;5;2m[48;5;0m?[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;10m[48;5;0m-[38;5;7m[48;5;0m [38;5;10m[48;5;0merik[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P +[38;5;12m[48;5;0mtracts of [6C[38;5;7m[48;5;0m aaaac RRRRRR What's up?j[38;5;2m[48;5;0m/[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;7m[48;5;5m-[38;5;10m[48;5;0m [38;5;3m[48;5;0mswgillespie[38;5;7m[48;5;0m[2P +[38;5;12m[48;5;0munused land.[10;31H[38;5;7m[48;5;0mRRRR [38;5;9m[48;5;0m [38;5;7m[48;5;0m poop [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0ma[38;5;2m[48;5;0m▼[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;3m[48;5;0m [38;5;7m[48;5;0mdikaiosune[2P +[38;5;10m[48;5;0mif u do vandal[38;5;3m[48;5;0m [38;5;7m[48;5;0mRR[38;5;3m[48;5;0m [38;5;7m[48;5;0mtest[38;5;3m[48;5;0m [38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0mo[38;5;7m[48;5;0m [38;5;12m[48;5;0m-[38;5;7m[48;5;0m [38;5;12m[48;5;0mdanopia[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P +[38;5;10m[48;5;0mmake it funny[38;5;7m[48;5;0m [38;5;7m[48;5;5mbut maybe dont[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0mhey [m[39;49m[38;5;0m[48;5;0m [38;5;1m[48;5;0m000[38;5;7m[48;5;0m sdddddd[38;5;5m[48;5;0m| |[38;5;7m[48;5;3m [38;5;3m[48;5;0m│[38;5;8m[48;5;0m - [38;5;7m[48;5;0mConnor[38;5;8m[48;5;0m_____[38;5;7m[48;5;0m[2P +PROTIP: Press [38;5;15m[48;5;0mESC[38;5;7m[48;5;0m to escape input modes [38;5;1m[48;5;0m [38;5;7m[48;5;0mq,,,,,,[38;5;5m[48;5;0m| a[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;2m[48;5;0m- tokenrove [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K +[38;5;3m[48;5;0m2048 clone: [38;5;11m[48;5;0mssh play@ascii.town[38;5;7m[48;5;0m <3 aa [38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m-[38;5;7m[48;5;0m [38;5;3m[48;5;0mmykey[14;72H[38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;1m[48;5;0m [38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K +[38;5;5m[48;5;0m [38;5;7m[48;5;0mG O O D B Y E W I T C H E S . T Os[38;5;5m[48;5;0mjjj[38;5;7m[48;5;0m :( [38;5;5m[48;5;0m | y |[m[39;49m[38;5;0m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m [38;5;7m[48;5;0m-[38;5;2m[48;5;0m [38;5;7m[48;5;0mdmrd[38;5;9m[48;5;0m [38;5;1m[48;5;0m [38;5;5m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;3m[48;5;0m│[38;5;5m[48;5;0m [38;5;7m[48;5;0m[K +[38;5;1m[48;5;0mvim controls, eh?[38;5;7m[48;5;0m.__________________. Con[38;5;5m[48;5;0mj[38;5;7m[48;5;0mor [38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - hiya [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;9m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[C[K +[38;5;11m[48;5;0m [38;5;10m[48;5;0m.[38;5;11m[48;5;0m [38;5;10m[48;5;0m.[38;5;11m[48;5;0m [38;5;10m[48;5;0m.[38;5;13m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m |[38;5;15m[48;5;0m Out of space? [38;5;7m[48;5;0m|[38;5;15m[48;5;0m [38;5;7m[48;5;0mWas[38;5;5m[48;5;0mj[38;5;7m[48;5;0m whut?[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;1m[48;5;0marke [38;5;7m[48;5;0m[2P +[38;5;10m[48;5;0m.[38;5;13m[48;5;0m [38;5;10m[48;5;0mWelcome to.[38;5;14m[48;5;0m [38;5;10m[48;5;0m.[38;5;14m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m|[38;5;15m[48;5;0mTry typing[38;5;11m[48;5;0m [38;5;9m[48;5;0m1Q[38;5;15m[48;5;0m,[38;5;11m[48;5;0m [38;5;10m[48;5;0m2Q[38;5;15m[48;5;0m,[38;5;7m[48;5;0m|[38;5;11m[48;5;0m [38;5;7m[48;5;0mHer[38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - cmr[2P + [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m. the [38;5;12m[48;5;0mT[38;5;9m[48;5;0mO[38;5;11m[48;5;0mW[38;5;14m[48;5;0mN[38;5;10m[48;5;0m.[38;5;7m[48;5;0m |[38;5;11m[48;5;0m3Q[38;5;15m[48;5;0m or [38;5;12m[48;5;0m4Q[38;5;15m[48;5;0m to travel[38;5;7m[48;5;0m|[38;5;15m[48;5;0m [38;5;10m[48;5;0m [38;5;4m[48;5;0mw[38;5;5m[48;5;0mj[38;5;4m[48;5;0mof[38;5;7m[48;5;0mt[38;5;11m[48;5;0m [38;5;5m[48;5;0m | y | [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;5m[48;5;0mGrissess (:D)[38;5;6m[48;5;0m [38;5;7m[48;5;0m [38;5;6m[48;5;0m [38;5;9m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K + [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m [38;5;10m[48;5;0m.[38;5;7m[48;5;0m|[38;5;15m[48;5;0mto far-away lands [38;5;7m[48;5;0m|[38;5;15m[48;5;0m [38;5;7m[48;5;0m [38;5;10m[48;5;0m [38;5;4m[48;5;0ma[38;5;5m[48;5;0mj[38;5;4m[48;5;0moo[38;5;15m[48;5;0m [38;5;6m[48;5;0m [38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0my | [38;5;3m[48;5;0m│[38;5;5m[48;5;0m [38;5;7m[48;5;0m- [38;5;12m[48;5;0meternale[38;5;7m[48;5;0my[38;5;12m[48;5;0me[38;5;7m[48;5;0m [38;5;0m[48;5;7m(ipv6)[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K +[38;5;12m[48;5;0m [38;5;10m[48;5;0m [38;5;2m[48;5;0m.. . . . . .[38;5;10m[48;5;0m .[38;5;7m[48;5;0m '------------------' [38;5;5m[48;5;0mj [38;5;7m[48;5;0mtest[38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - meena [38;5;3m[48;5;0m [38;5;7m[48;5;0m[2P + sad[38;5;2m[48;5;0m [38;5;7m[48;5;0m hi friends [38;5;3m[48;5;0mhello[38;5;7m[48;5;0m [38;5;8m[48;5;0m [38;5;7m[48;5;0mcybre[38;5;7m[48;5;6m![38;5;7m[48;5;0m [38;5;7m[48;5;6m^Yes?[38;5;7m[48;5;0m [38;5;5m[48;5;0m j [38;5;7m[48;5;0mni [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m- b0rk[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;7m[48;5;0m boy [38;5;15m[48;5;0m__ [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K + nethack [38;5;3m[48;5;0myo how do i select black???[38;5;7m[48;5;0m [38;5;1m[48;5;0ma[38;5;5m[48;5;0mj[38;5;14m[48;5;0m [38;5;7m[48;5;0msxD [38;5;5m[48;5;0m |[38;5;7m[48;5;0m [38;5;5m[48;5;0my | [38;5;3m[48;5;0m│[38;5;5m[48;5;0m [38;5;7m[48;5;0m- fbernier[38;5;5m[48;5;0m [38;5;15m[48;5;0m / '[38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K +[38;5;12m[48;5;0m [38;5;7m[48;5;0mboi[38;5;12m[48;5;0m [38;5;7m[48;5;0m [38;5;9m[48;5;0mc[38;5;10m[48;5;0ml[38;5;11m[48;5;0mo[38;5;12m[48;5;0mw[38;5;13m[48;5;0mn[38;5;3m[48;5;0m [38;5;14m[48;5;0mt[38;5;9m[48;5;0mo[38;5;10m[48;5;0mw[38;5;11m[48;5;0mn[38;5;7m[48;5;0mjj [38;5;1m[48;5;0mthis is as wired [38;5;8m[48;5;0m0[38;5;5m[48;5;0mj[38;5;1m[48;5;0m [38;5;7m[48;5;0mdasdksajklj[38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;5m[48;5;0m mguaypaq[38;5;2m[48;5;0m [38;5;3m[48;5;0m [38;5;15m[48;5;0m [38;5;3m[48;5;0m [38;5;15m[48;5;0m| [38;5;2m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K +[38;5;1m[48;5;0m [38;5;9m[48;5;0m [38;5;12m[48;5;0m* [38;5;5m[48;5;0m [38;5;8m[48;5;1mhot tip:[38;5;7m[48;5;1m [38;5;0m[48;5;1mdon't[38;5;7m[48;5;1m [38;5;8m[48;5;1mruin sh[38;5;7m[48;5;0mit [38;5;12m[48;5;0m [38;5;7m[48;5;0m [38;5;12m[48;5;0m* [38;5;5m[48;5;0m [38;5;3m[48;5;0m [38;5;5m[48;5;0m [38;5;12m[48;5;0m*[38;5;7m[48;5;0m [38;5;5m[48;5;0mj [38;5;12m[48;5;0m* [38;5;5m[48;5;0m /[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0mq[38;5;5m[48;5;0m/ [38;5;12m[48;5;0m*[38;5;5m[48;5;0m [38;5;3m[48;5;0m│[38;5;5m[48;5;0m [38;5;7m[48;5;0m- [38;5;2m[48;5;0mrkallos[38;5;7m[48;5;0m [38;5;15m[48;5;0m [38;5;3m[48;5;0m [38;5;15m[48;5;0mV [38;5;3m[48;5;0m │[38;5;7m[48;5;0m[K[H[m[39;49m[38;5;0m[48;5;0m[13;41H + + + + + + + + + + + +[1;41H [38;5;6m[48;5;0m(The client tries to check if you'll[38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;15m[48;5;0m-[38;5;7m[48;5;0m [38;5;15m[48;5;0mfsj[38;5;7m[48;5;0m [38;5;14m[48;5;0m [38;5;3m[48;5;0m│[7C[38;5;7m[48;5;0m1 +[38;5;6m[48;5;0mbe able to see all the colours now.)[38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m-[38;5;7m[48;5;0m [38;5;6m[48;5;0mSylvhem[38;5;7m[48;5;0m [38;5;3m[48;5;0m└──────┐[38;5;2m[48;5;0m//[3;1H[38;5;6m[48;5;0m [38;5;7m[48;5;0m [38;5;9m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;1m[48;5;0m- iliana[38;5;3m[48;5;0m [38;5;1m[48;5;0m<3[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[4;1H[38;5;6m[48;5;0m [38;5;15m[48;5;0m][m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0mgas pedal ┐ this is just [38;5;15m[48;5;0m\[38;5;7m[48;5;0m [38;5;11m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;14m[48;5;0m- tjk[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[5;1H[38;5;7m[48;5;0m [38;5;15m[48;5;0m.__[38;5;7m[48;5;0m [38;5;14m[48;5;0m [38;5;15m[48;5;0m[[m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0mbrakes ┘ to toggle fast now[38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - duckinator [7C[38;5;2m[48;5;0m\\[6;1H[38;5;7m[48;5;0m [38;5;15m[48;5;0m|\[38;5;7m[48;5;0m } curly gas pedal [38;5;1m[48;5;0m:)[38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;1m [m[39;49m[38;5;0m[48;5;0melo[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m (pup@mastodon.social)[38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[7;1H[38;5;7m[48;5;0m [38;5;15m[48;5;0m\[38;5;7m[48;5;0m { curly brakes [38;5;6m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;1m [38;5;6m[48;5;0m [38;5;1m[48;5;1m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;6m[48;5;0m [38;5;3m[48;5;0m- bug[38;5;0m[48;5;3m(@chitter.xyz)[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[8;1H[38;5;7m[48;5;0m Looking for something [38;5;15m[48;5;0minteresting[38;5;11m[48;5;0m?[38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;1m [38;5;7m[48;5;0m [38;5;1m[48;5;1m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - peidran [9C[38;5;2m[48;5;0m//[9;1H[38;5;7m[48;5;0m Aside from scattered pages all over, [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;1m[48;5;1m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;3m[48;5;0m [38;5;7m[48;5;0mKitRedgrave[9C[38;5;2m[48;5;0m\\[10;1H[38;5;7m[48;5;0m there's some development [38;5;12m[48;5;0mleft[38;5;7m[48;5;0m and [38;5;10m[48;5;0mup[38;5;7m[48;5;0m fro[38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;4m[48;5;0mvimtingu[38;5;7m[48;5;0m [10C[38;5;2m[48;5;0m//[11;1H[38;5;7m[48;5;0m here. The bulletin is over to the [38;5;9m[48;5;0mright[38;5;5m[48;5;0mj[38;5;15m[48;5;0m->[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - thomas@touhey.org [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[12;1H[38;5;7m[48;5;0m somewhere. And there's stuff all along [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - frewsxcv \.fr [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[13;1H[38;5;7m[48;5;0m the [38;5;13m[48;5;0mtorus[38;5;7m[48;5;0m if you follow it around. [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;3m[48;5;0m NecroTechno <3[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[14;1H[38;5;7m[48;5;0m [38;5;15m[48;5;0m\[38;5;7m[48;5;0m [38;5;5m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│ [38;5;7m[48;5;0m-[38;5;5m[48;5;0m er1n[38;5;7m[48;5;0m [14;72H [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[15;1H [38;5;11m[48;5;0mNEW: press [38;5;15m[48;5;0mm[38;5;11m[48;5;0m to open the mini-map[38;5;7m[48;5;0m [38;5;15m[48;5;0m_\|[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m- quantified [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[16;1H[38;5;7m[48;5;0m [38;5;11m[48;5;0mand see what's nearby[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m@cybre.space[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[17;1H[38;5;7m[48;5;0m [38;5;15m[48;5;0m [38;5;10m[48;5;0m [38;5;15m[48;5;0m [38;5;7m[48;5;0m [38;5;10m[48;5;0m [38;5;7m[48;5;0myoooooo yw! [38;5;10m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;10m[48;5;0m- nightpool (cybre) [38;5;3m[48;5;0m│[38;5;10m[48;5;0m\[38;5;2m[48;5;0m\[18;1H[38;5;7m[48;5;0m [38;5;10m[48;5;0m [38;5;2m[48;5;0maaa\]\\[38;5;12m[48;5;0my wat[38;5;10m[48;5;0m [38;5;7m[48;5;0mhey vanta [38;5;10m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - ghosty[14C[38;5;2m[48;5;0m//[19;2H[38;5;7m[48;5;0m [38;5;15m[48;5;0m [38;5;7m[48;5;0mUrFU !d[38;5;10m[48;5;0m [38;5;7m[48;5;0mthis is dope[38;5;10m[48;5;0m [38;5;7m[48;5;0m [38;5;10m[48;5;0m [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;10m[48;5;0m- lynn (@chordbug)[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[20;1H[38;5;10m[48;5;0m [38;5;7m[48;5;0mRTF - chempion![38;5;10m[48;5;0m [38;5;7m[48;5;0mthx 4 sharing [38;5;10m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;5m[48;5;0m [38;5;7m[48;5;0m-[38;5;5m[48;5;0m [38;5;7m[48;5;0mvantablack [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[21;1H[38;5;7m[48;5;0m This is actually amazing. [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m//wxyzzyrd [38;5;7m[48;5;0m [9C[38;5;2m[48;5;0m\\[22;2H[38;5;7m[48;5;0mDon't forget to grab the source: [38;5;14m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;7m[48;5;0m //international <3 [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[23;2H[38;5;7m[48;5;0m hi RC! [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;13m[48;5;0mmaren[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m\\[24;1H[38;5;7m[48;5;0m $ git clone \ [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m│[38;5;14m[48;5;0m [38;5;13m[48;5;0m- [38;5;0m[48;5;2mrose[38;5;14m[48;5;0m [38;5;2m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m//[25;1H[38;5;7m[48;5;0m https://code.causal.agency/june/torus.git [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;2m[48;5;0m///[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;13m[48;5;0m(@BLASTPROCESSlNG)[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m/\[4h/[4l[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H [38;5;4m[48;5;0m~~[38;5;7m[48;5;0m~[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;1m[48;5;0m [38;5;5m[48;5;0m- grainloom[38;5;7m[48;5;0m [8C2 +[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;12m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m@cybre.space[8C[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[3;1H~~~~~~~[38;5;7m[48;5;0mhi[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;1m[48;5;2m@slimelia[38;5;7m[48;5;0m [9C[38;5;4m[48;5;0m~~[4;1H[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;5m[48;5;5m~[38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - jfo[17C[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[5;1H[38;5;4m[48;5;0m~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;5m[48;5;5m~~~jh[38;5;4m[48;5;0m~~~~[38;5;5m[48;5;5m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;1m[48;5;0m@Phairupegiont[6C[38;5;4m[48;5;0m~~[6;1H~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~~[38;5;4m[48;5;0m~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m- [38;5;2m[48;5;0mchr@cybre.space[38;5;7m[48;5;0m [38;5;5m[48;5;0m<3[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[7;1H[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;7m[48;5;0m i want to marry lynn [38;5;4m[48;5;0m~~~~~~~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - elomatreb :3 [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[8;1H~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~[38;5;14m[48;5;0msame[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - minerobber[10C[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[9;1H[38;5;4m[48;5;0m~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~[38;5;7m[48;5;0msame tbh [38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;7m[48;5;0m [38;5;12m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m @tilde.town[9C[38;5;4m[48;5;0m~~[10;1H~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~[38;5;7m[48;5;0m I iiiiikhjk been [38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;13m[48;5;3mselfsame[38;5;7m[48;5;0m(~town) [38;5;3m[48;5;0m│[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[11;1H[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~[38;5;7m[48;5;0m moving around [38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;6m[48;5;0mZhorken[38;5;7m[48;5;0m@awoo.space [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[12;1H~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;7m[48;5;0m I am bad at VIM [38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;7m[48;5;0m I didnt know [38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;1m[48;5;0mnoiob[38;5;2m[48;5;0m@[38;5;3m[48;5;0mawoo[38;5;4m[48;5;0m.[38;5;5m[48;5;0mspace[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[13;1H[38;5;4m[48;5;0m~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~[38;5;7m[48;5;0m this is[38;5;4m[48;5;0m~[38;5;7m[48;5;0mvim[38;5;12m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;2m[48;5;0m [38;5;4m[48;5;2m [38;5;2m[48;5;0m [38;5;3m[48;5;2m [38;5;7m[48;5;0m [6C[38;5;4m[48;5;0m~~[14;1H~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;7m[48;5;3mit's vim[38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - aeon[16C[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[15;1H~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~~[38;5;7m[48;5;0mvim is [38;5;2m[48;5;0m bad[38;5;7m[48;5;0m hello lynn[38;5;4m[48;5;0m~~~~~~~~~[38;5;7m[48;5;0m [38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;2m[48;5;0m- unascribed[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[16;1H~~~~~~~~[38;5;7m[48;5;0m(lovely application, this)[38;5;4m[48;5;0m~~~~~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;12m[48;5;0m~ nee (hidamari.blue)[38;5;3m[48;5;0m│[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[17;1H~[38;5;4m[48;5;0m~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m ~ curiouser [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[18;1H~~~~~~[38;5;7m[48;5;0mthis is as much nethack[38;5;5m[48;5;3m [38;5;4m[48;5;0m~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - clouded[38;5;8m[48;5;0m [11C[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[19;1H~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;7m[48;5;0mas it is vim [38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~[38;5;5m[48;5;3m [38;5;0m[48;5;2msry i cnt drw[38;5;5m[48;5;3m [38;5;4m[48;5;0m~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - flacs (@f1ac5) [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[20;1H~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;7m[48;5;0m [38;5;4m[48;5;0m~~~~~~~[38;5;5m[48;5;3m [38;5;4m[48;5;0m~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;4m[48;5;0m- xenonnsmb (~town) [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[21;1H[38;5;4m[48;5;0m~~~~~~~~~~~~~~~~~~[38;5;7m[48;5;0memacs keys pls[38;5;4m[48;5;0m~[38;5;7m[48;5;0m+[38;5;2m[48;5;0m2[38;5;4m[48;5;0m~~~~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - Jakob [38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;2m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[22;1H~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;13m[48;5;0mrose! [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[23;1H[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~[38;5;7m[48;5;0moh no its vim[38;5;4m[48;5;0m~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~[38;5;5m[48;5;3mwhoops[38;5;4m[48;5;0m~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;4m[48;5;0m~~[38;5;12m[48;5;0m~[38;5;3m[48;5;0m│ [38;5;13m[48;5;0m(@mahoushoujorose)[38;5;3m[48;5;0m │[38;5;4m[48;5;0m~~[24;1H~~~~~~[38;5;7m[48;5;0mhelp im trapped in a vim factory[38;5;4m[48;5;0m~~~~~~~~[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;5m[48;5;0mjess (@dogs ~town)[m[39;49m[38;5;0m[48;5;0m [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~[38;5;12m[48;5;0m~[25;1H[38;5;4m[48;5;0m~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~~~~~[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~~~~~~[38;5;7m[48;5;0mI messed[38;5;5m[48;5;0m| y[38;5;7m[48;5;0mq[38;5;5m[48;5;0m|[38;5;12m[48;5;0m~[38;5;4m[48;5;0m~~[38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[38;5;5m[48;5;0m [38;5;13m[48;5;0mrachel (@arjache)[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;4m[48;5;0m~~[4h~[4l[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H [38;5;6m[48;5;6m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^ ^^^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;2m[48;5;0m - Falkreon[38;5;7m[48;5;0m [11C3 + Roses are [38;5;9m[48;5;0mred[38;5;7m[48;5;0m. [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;7m[48;5;6m- mitosis@manhater.io[38;5;3m[48;5;0m│[K +[38;5;7m[48;5;0m Violets are [38;5;12m[48;5;0mblue[38;5;7m[48;5;0m. [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m- yrgfm[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [11C[K +Some people don't think [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m- felix[38;5;7m[48;5;0m [38;5;3m[48;5;0m [12C[38;5;7m[48;5;0m[K + ascii.town be like it is. [38;5;7m[48;5;6m [38;5;7m[48;5;0m [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - ndiesslin [6C[K + But it [38;5;13m[48;5;0mdo[38;5;7m[48;5;0m! [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- matth [38;5;3m[48;5;0m [38;5;7m[48;5;0m [2C[K + [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;1m[48;5;0m- timi[38;5;3m[48;5;0m [38;5;7m[48;5;0m [8C[K + .-. .-. .-. .-. .-..-. .----. .-. .-. [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m │ [38;5;2m[48;5;0m- @andwhatnot2[38;5;3m[48;5;0m [7C[38;5;7m[48;5;0m[K + } \/ { \ \/ / | ' / } |__} \ \ / [38;5;6m[48;5;6m^[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m │ [38;5;7m[48;5;0m- Spocky [9C[K + | { } | `-\ } | . \ } '__} `- } [38;5;7m[48;5;6m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m │ [38;5;2m[48;5;0m-[38;5;3m[48;5;0m [38;5;2m[48;5;0mKid Iccurus[38;5;3m[48;5;0m [38;5;7m[48;5;0m [5C[K + `-' `-' `-' `-'`-` `----' -' [38;5;7m[48;5;6m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;3m[48;5;0m │ [38;5;7m[48;5;0m- tom@slime.global :3[C[K + [38;5;7m[48;5;6m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;4m[48;5;1m-[38;5;7m[48;5;0m [38;5;0m[48;5;1m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m[K +[38;5;7m[48;5;6m [38;5;6m[48;5;6m [38;5;7m[48;5;6m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;0m[48;5;1m lr[38;5;7m[48;5;0m [38;5;3m[48;5;0m [8C[38;5;7m[48;5;0m [38;5;3m[48;5;0m[K +[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - fennecs (helo)[6C[K + [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m this poem sd [38;5;4m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- @amsomniac (mastod[2C[K + [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m is factually [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m on) [C[K + incorrect[38;5;8m[48;5;0m, but[38;5;15m[48;5;0m [38;5;7m[48;5;0m [38;5;2m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- maxj [11C[K + [38;5;8m[48;5;0mat least it rhymes[38;5;15m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m| y |[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;1m [38;5;7m[48;5;0m AdamThePhantump was[C[K + [38;5;2m[48;5;0m [38;5;7m[48;5;0mi love this place [38;5;2m[48;5;0m [38;5;5m[48;5;0m | y[38;5;7m[48;5;0m [38;5;5m[48;5;0m| [38;5;3m[48;5;0m│ [38;5;7m[48;5;0mhere. Boo! :)[38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m└┐[38;5;7m[48;5;0m[K + [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0mTsuki "Hello guys !"[38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K + now I can't sleep [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- @dejawu_ [38;5;3m[48;5;0m┌┘[38;5;7m[48;5;0m[K + [38;5;5m[48;5;0m| y[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- @eal [14C[K + zzzz [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;2m@social.sakamoto.gq[C[38;5;7m[48;5;0m[K +[38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- frenata [C[K +[38;5;11m[48;5;0mwe are addicts. we need an intervention [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0mq[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│ [38;5;7m[48;5;0m- banjo [3C[K[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H [38;5;7m[48;5;0mWhat is this big fucking line of 'y'? [1;56H [38;5;1m[48;5;0m-Ethan[38;5;12m[48;5;0m [38;5;7m[48;5;0m [12C4 + [38;5;13m[48;5;0mWhat is this big fucking line of 'y', you [2;57H[38;5;3m[48;5;0m- [38;5;2m[48;5;0mProfpatsch[38;5;7m[48;5;0m [38;5;3m[48;5;0m└──────┐[38;5;7m[48;5;0m[K + [38;5;13m[48;5;0mmay ask yourself? It's the torus ouroboros,[3;59H[38;5;5m[48;5;0mviv@cybre.space +[38;5;7m[48;5;0m [38;5;13m[48;5;0mayying its own lmao. [38;5;9m[48;5;0m [38;5;7m[48;5;0m [38;5;13m[48;5;0m [38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [6C- dom96 ;)[5;18H [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [5;59Hcloin[38;5;3m[48;5;0m [38;5;7m[48;5;0m [6;15H [6;44H [6;56H [38;5;5m[48;5;0m- dbucklin[38;5;7m[48;5;0m [11C[38;5;2m[48;5;0m[K[7;10Hi went all the way around the[38;5;7m[48;5;0m [7;56H[38;5;4m[48;5;0m - hiljusti[38;5;7m[48;5;0m + [38;5;7m[48;5;3m [38;5;2m[48;5;0mros[38;5;7m[48;5;0m [7C [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;1m[48;5;0m- @ercts_mxms [38;5;7m[48;5;0m + [38;5;2m[48;5;0m leave some notes on the[38;5;7m[48;5;0m [7C [38;5;3m[48;5;0m│[38;5;7m[48;5;0m -f@r4ch0 + [38;5;2m[48;5;0mway for your fellow travellersr[38;5;7m[48;5;0m [7C [38;5;3m[48;5;0m│[38;5;7m[48;5;0m ffffff[38;5;3m[48;5;0m +[C[38;5;7m[48;5;0m [38;5;2m[48;5;0m~chr[38;5;7m[48;5;0m [7C [38;5;3m[48;5;0m│[38;5;7m[48;5;0m -Harper +[73D[38;5;8m[48;5;0m [38;5;9m[48;5;0mthis is pretty sweet [12;44H[38;5;7m[48;5;0m [12;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m -@discordalert[8C[K + [38;5;9m[48;5;0m -meena[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my |[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;2m[48;5;0mvon [7C[38;5;7m[48;5;0m [8C[K[14;52H[38;5;5m[48;5;0m [6C[38;5;7m[48;5;0mShadowRZ [15;11Hworld wide web! [15;44H [15;56H (@ShadowRZ@mastodon[16;13Hinternet [16;56H [11C.xyz + [38;5;2m[48;5;0mYour journey begins now. [38;5;7m[48;5;0m [17;50H [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;8m[48;5;0mQB[38;5;6m[48;5;0mFr[38;5;15m[48;5;0meak +[38;5;2m[48;5;0m [38;5;7m[48;5;0m [18;48H [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;6m[48;5;0m@scanlime[38;5;7m[48;5;0m +Tuco [38;5;1m[48;5;0m<3[19;15H[38;5;7m[48;5;0mwow this is very exciting [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m@diode.zone[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[20;29H-b0rk[20;56H [38;5;10m[48;5;0m- zer00[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[21;14H O [21;50H [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;5m[48;5;0m- kokakoda[11C[38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K + ifdfd[22;21H\|/[22;37H[38;5;9m[48;5;0m([38;5;15m[48;5;0m![38;5;9m[48;5;0m)[22;48H[38;5;7m[48;5;0m [7C[38;5;2m[48;5;0m - m3tax +[70D[38;5;7m[48;5;0mo_O[23;22H|[7C [38;5;9m[48;5;0m([38;5;15m[48;5;0m!!!!![38;5;9m[48;5;0m)[23;56H[38;5;7m[48;5;0m ~~~zgebiit~~~ + [24;21H/ \[24;32H[38;5;12m[48;5;0mhey b0rk!![24;56H[38;5;7m[48;5;0m - gauntlet + a - lastrik[K[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H [38;5;7m[48;5;0m [1;57H- CX [14C5 +[38;5;6m[48;5;0m [38;5;4m[48;5;0m######################################[38;5;7m[48;5;0m [2;57H- tomjschwanke [7C[38;5;3m[48;5;0m[K +[C[38;5;4m[48;5;0m# [38;5;7m[48;5;0m [38;5;4m[48;5;0m#[38;5;7m[48;5;0m [3;57H- @aliasless +[38;5;4m[48;5;0m #[38;5;7m[48;5;0m [38;5;4m[48;5;0mMastodon #[38;5;7m[48;5;0m [4;57H @awoo.wolfgirl. + [38;5;4m[48;5;0m#[5;12H[38;5;6m[48;5;0m [5;39H[38;5;4m[48;5;0m#[5;57H[38;5;7m[48;5;0m engineering + [38;5;4m[48;5;0m# Giving social networks back to you[38;5;6m[48;5;0m [38;5;4m[48;5;0m#[38;5;6m[48;5;0m [6;57H[38;5;7m[48;5;0m- cosine [12C[K + [38;5;4m[48;5;0m# Free, decentralized microblogging #[38;5;6m[48;5;0m [7;56H[38;5;7m[48;5;0m [38;5;0m[48;5;1m- stevenleeg +[C[38;5;4m[48;5;0m#[8;17H[38;5;7m[48;5;0m [8;39H[38;5;4m[48;5;0m#[8;57H[38;5;7m[48;5;0m- steampunc + [38;5;4m[48;5;0m# https://joinmastodon.org #[9;57H[38;5;2m[48;5;0m- @blinry +[C[38;5;4m[48;5;0m######################################[38;5;7m[48;5;0m [10;57H- ben@tilde.team [11;35H [11;56H[38;5;1m[48;5;0m [38;5;7m[48;5;0m- Alpatron#6158 +[67D [38;5;4m[48;5;0m [38;5;5m[48;5;0m####################################[12;58H[38;5;7m[48;5;0m Calamitous +[63D[38;5;5m[48;5;0m# [13;43H#[6C[38;5;7m[48;5;0m [6C [38;5;1m[48;5;0m [38;5;7m[48;5;0m +[55D[38;5;5m[48;5;0m#[14;19HWitches Town[14;43H#[14;52H[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;1m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m +[59D[38;5;5m[48;5;0m# #[15;59H[38;5;1m[48;5;0m [38;5;7m[48;5;0m +[70D[38;5;5m[48;5;0m# Mastodon insta[38;5;7m[48;5;0mn[38;5;5m[48;5;0mce for [38;5;7m[48;5;0m [38;5;5m[48;5;0m# [16;59H[38;5;1m[48;5;0m [14C[38;5;7m[48;5;0m + [38;5;5m[48;5;0m#[38;5;7m[48;5;0m [38;5;5m[48;5;0mqueer[38;5;2m[48;5;0m [38;5;5m[48;5;0m feminist[6Canarchists #[17;57H[38;5;7m[48;5;0m + [38;5;5m[48;5;0m# [38;5;7m[48;5;0m [18;43H[38;5;5m[48;5;0m#[18;57H[38;5;7m[48;5;0m +[70D[38;5;5m[48;5;0m# https://witches.town # [19;59H[38;5;7m[48;5;0m +[62D[38;5;5m[48;5;0m####################################[20;57H[38;5;7m[48;5;0m +<<<more advertising goes over there<<<[21;57H + [38;5;3m[48;5;7m ,-._.~~~^-v^v^v**=>[38;5;7m[48;5;0m [22;37H [22;56H + [38;5;3m[48;5;7m/[38;5;4m[48;5;7mlife is better on[38;5;3m[48;5;7m/ [7C[38;5;9m[48;5;0m<3[38;5;7m[48;5;0m [23;60H + [38;5;3m[48;5;7m*[38;5;4m[48;5;7m/a.weirder.earth/[38;5;3m[48;5;7m* [38;5;7m[48;5;0m [24;32H [24;57H + [38;5;3m[48;5;7m \______________/* [38;5;7m[48;5;0m love you[25;47H[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0mq[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [12C[38;5;3m[48;5;0m│[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[1;57H[38;5;7m[48;5;0m [18C6 + [38;5;9m[48;5;0msomeone.. feel free to reuse this space.[2;57H[38;5;7m[48;5;0m [38;5;3m[48;5;0m└[7C[38;5;7m[48;5;0m[K + [38;5;9m[48;5;0mit's uh... i wouldn't feel bad about [3;57H[38;5;7m[48;5;0m + [38;5;9m[48;5;0merasing[38;5;1m[48;5;0m [38;5;9m[48;5;0mwhatever this is [38;5;7m[48;5;0m [4;60H + [5;12H[38;5;2m[48;5;0m [38;5;7m[48;5;0m [38;5;11m[48;5;0m [5;39H[38;5;7m[48;5;0m [5;61H + [38;5;9m[48;5;0m [38;5;7m[48;5;0m [38;5;15m[48;5;0m [38;5;8m[48;5;0mTidied. The ASCII Janitor.[38;5;15m[48;5;0m [38;5;7m[48;5;0m [6;57H + [38;5;6m[48;5;0m [38;5;7m[48;5;0m [38;5;11m[48;5;0m [38;5;7m[48;5;0m [7;57H + [8;15H[38;5;6m[48;5;0m [38;5;11m[48;5;0m [38;5;6m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;6m[48;5;0m [8;57H[38;5;7m[48;5;0m + WHATS UP MY GLIB GLOBS?[38;5;11m[48;5;0m [38;5;7m[48;5;0m [9;57H + W U B A L U B A D U B D U B[38;5;11m[48;5;0m [10;57H[38;5;7m[48;5;0m [11;12H*~~~~~~~~~~~~~~~~~~~[38;5;15m[48;5;0m~~~~[38;5;11m[48;5;0m* [11;56H[38;5;7m[48;5;0m +[65D < tilde.town <3s u > [12;57H +[61D *~~~~~~~~~~~~~~~~~~~~~~~*[6C [13;58H [38;5;3m[48;5;0m . +[59D[38;5;7m[48;5;0m [14;19H< shell in today >[6C [14;58H +[59D *[38;5;15m[48;5;0m~~~~~~~~~~~~~~~~*[38;5;7m[48;5;0m [15;59H +[52D [38;5;11m[48;5;0m [38;5;15m[48;5;0m < :3 >[38;5;7m[48;5;0m [16;57H[38;5;3m[48;5;0mi want to avoid +[64D[38;5;7m[48;5;0m *[38;5;15m[48;5;0m~~~~*[38;5;7m[48;5;0m [17;57H[38;5;3m[48;5;0mconfusion for new +[66D[38;5;7m[48;5;0m [18;43H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0mpeople though[9C[38;5;12m[48;5;0m[K +[71D[38;5;7m[48;5;0m [38;5;1m[48;5;0mthis thing is cool[38;5;7m[48;5;0m [19;57H[38;5;4m[48;5;0mor make the guestbook +[C[38;5;1m[48;5;0mtoo bad i[38;5;7m[48;5;0m [38;5;2m[48;5;0mssss[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mk[38;5;7m[48;5;0m [38;5;2m[48;5;0mk[38;5;7m[48;5;0m [20;56H[38;5;4m[48;5;0m go AROUNDWAYS[38;5;7m[48;5;0m [38;5;11m[48;5;0m [38;5;3m[48;5;0m│[38;5;11m[48;5;0m +[38;5;7m[48;5;0m [38;5;2m[48;5;0ms[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mkk [38;5;7m[48;5;0m [21;57H[38;5;3m[48;5;0mto be continued... +[72D[38;5;7m[48;5;0m [38;5;2m[48;5;0mssss[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mkk [22;51H[38;5;5m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0mwe need to move the +[73D[38;5;7m[48;5;0m [38;5;2m[48;5;0ms u[38;5;7m[48;5;0m [38;5;2m[48;5;0mu[38;5;7m[48;5;0m [38;5;2m[48;5;0mk k[38;5;7m[48;5;0m [23;51H[38;5;3m[48;5;0m├───┘[38;5;7m[48;5;0m [38;5;3m[48;5;0mtext below elsewhere[38;5;7m[48;5;0m [38;5;3m[48;5;0m└─┐[24;3H[38;5;7m[48;5;0m [38;5;2m[48;5;0mssss[38;5;7m[48;5;0m [38;5;2m[48;5;0muuuu[38;5;7m[48;5;0m [38;5;2m[48;5;0mk[38;5;7m[48;5;0m [38;5;2m[48;5;0m k[38;5;7m[48;5;0m [38;5;1m[48;5;0mat ascii art[24;51H[38;5;5m[48;5;0m│[38;5;7m[48;5;0m (Snek petting dude moved to[38;5;3m[48;5;0m│[25;3H[38;5;7m[48;5;0m [38;5;1m[48;5;0m-xenonnsmb, from ~town[25;54H[38;5;7m[48;5;0m000,009.)[15C [38;5;3m[48;5;0m│[4h[38;5;7m[48;5;0m [4l[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[1;24H [1;37H[38;5;3m[48;5;0m [41C[38;5;7m[48;5;0m7 + [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m + [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [3;57H[38;5;3m[48;5;0mShrine of the church +[75D[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [4;37H[38;5;3m[48;5;0m [4;60H [5;10H[38;5;7m[48;5;0mempty lot [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [6C[38;5;3m[48;5;0m [5;61H[38;5;12m[48;5;4mo o o o +[66D[38;5;7m[48;5;0m COME ON DOWN [38;5;3m[48;5;0m [38;5;7m[48;5;0m [6;60H[38;5;12m[48;5;4mo[38;5;12m[48;5;5m [38;5;12m[48;5;4mo[7;15H[38;5;7m[48;5;0mTO ASCII TOWN~~~[6C[38;5;3m[48;5;0m [7;59H[38;5;12m[48;5;4mo[38;5;12m[48;5;5m [38;5;15m[48;5;5m..[38;5;12m[48;5;5m [38;5;12m[48;5;4mo[8;15H[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [8;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m |----[38;5;12m[48;5;5m [38;5;12m[48;5;4mo +[65D[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [6C[38;5;3m[48;5;0m [9;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m ||[38;5;12m[48;5;5m [38;5;15m[48;5;5m [38;5;12m[48;5;4mo +[64D[38;5;7m[48;5;0m uiwiidr [38;5;3m[48;5;0m [38;5;7m[48;5;0m [10;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m --- [38;5;12m[48;5;4mo[38;5;7m[48;5;0m [38;5;3m[48;5;0mof[11;12H[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [11;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m |. [38;5;12m[48;5;4mo[12;12H[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [6C [38;5;3m[48;5;0m [12;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m .. [38;5;12m[48;5;4mo[13;12H[38;5;7m[48;5;0m [38;5;6m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [13;58H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m \--- [38;5;12m[48;5;4mo[14;13H[38;5;7m[48;5;0mI walked the [38;5;3m[48;5;0m [14;50H[38;5;5m[48;5;0m [7C[38;5;12m[48;5;4mo[38;5;15m[48;5;5m ,/ [38;5;12m[48;5;4mo[15;16H[38;5;5m[48;5;0mourobouros[38;5;7m[48;5;0m [38;5;3m[48;5;0m [15;48H[38;5;5m[48;5;0m [15;59H[38;5;12m[48;5;4mo[38;5;15m[48;5;5m ' [38;5;12m[48;5;4mo[16;18H[38;5;7m[48;5;0mand all I got was this[16;57H [38;5;12m[48;5;4mo o[38;5;15m[48;5;5m [38;5;12m[48;5;4mo o[38;5;7m[48;5;0m [17;23Hlousy t-shirt [38;5;3m[48;5;0m [17;57H[38;5;7m[48;5;0m [38;5;12m[48;5;4m o [38;5;7m[48;5;0m +[68D_---.___,---_ [m[39;49m[38;5;0m[48;5;0m [18;37H[38;5;3m[48;5;0m [18;47H[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;12m[48;5;0m┌[38;5;7m[48;5;0m┘[38;5;3m[48;5;0m GNU Emacs [6C[38;5;7m[48;5;0m└[38;5;12m[48;5;0m─┐[19;5H[38;5;7m[48;5;0m/ \ [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [19;37H[38;5;3m[48;5;0m [19;54H[38;5;12m[48;5;0m│[38;5;12m[48;5;5m=========================[38;5;12m[48;5;0m│[20;2H[38;5;7m[48;5;0m /| [38;5;5m[48;5;0m|y|[38;5;7m[48;5;0m |\ [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [20;37H[38;5;3m[48;5;0m [20;54H[38;5;12m[48;5;0m│[38;5;12m[48;5;4m https://gnu.org/s/emacs [38;5;12m[48;5;0m│[21;8H[38;5;7m[48;5;0m| | [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [21;37H[38;5;3m[48;5;0m [21;54H[38;5;12m[48;5;0m│[38;5;12m[48;5;5m=========================[38;5;12m[48;5;0m│[22;8H[38;5;7m[48;5;0m| | <- amazing shirt[22;51H[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;12m[48;5;0m└[38;5;7m[48;5;0m┐ ┌[38;5;12m[48;5;0m─┘[23;8H[38;5;7m[48;5;0m|_______| would i buy it?[23;51H[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0mEmacs faithfuls [38;5;7m[48;5;0m [38;5;6m[48;5;0m| [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[24;14H [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [24;51H[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;6m[48;5;0m\|/[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[25;16H maybe [38;5;3m[48;5;0m [25;54H[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0msign[m[39;49m[38;5;0m[48;5;0mq[38;5;3m[48;5;0mbelow:[6C[38;5;6m[48;5;0mv[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[1;24H[38;5;7m[48;5;0m [1;38H[38;5;3m[48;5;0m [1;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m- [X] [38;5;6m[48;5;0mnee [8C[38;5;7m[48;5;0m8 + [38;5;1m[48;5;0mi may prefer vim, but emacs[38;5;7m[48;5;0m [38;5;1m[48;5;0mhas tetris[38;5;3m[48;5;0m [2;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m- [X] [38;5;2m[48;5;0mbyxor[11C[38;5;5m[48;5;5m[K +[C[38;5;1m[48;5;0mwhich is a stellar feature[3;38H[38;5;3m[48;5;0m [3;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [38;5;3m[48;5;0m[X[38;5;7m[48;5;0m [38;5;3m[48;5;0m @amsomniac ([38;5;7m[48;5;0m [C[38;5;5m[48;5;5m[K +[38;5;1m[48;5;0mhonestly makes me like emacs[4;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m ][38;5;3m[48;5;0mmastodon[38;5;4m[48;5;0m [38;5;3m[48;5;0m) [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K[5;10H[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [5;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [X[38;5;2m[48;5;0m][38;5;7m[48;5;0m tokenrove[7C[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K +[76D[38;5;1m[48;5;0ml[38;5;7m[48;5;0m [38;5;5m[48;5;0mshame it doesn't have[6;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;2m[48;5;0m- [X[38;5;7m[48;5;0m][38;5;2m[48;5;0m rkallos[9C[38;5;7m[48;5;5m [38;5;7m[48;5;4mG[7;4H[38;5;1m[48;5;0mj[38;5;7m[48;5;0m [38;5;5m[48;5;0ma text editor[38;5;7m[48;5;0m [7;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m - [X[m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m nephariuz[7C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K +[38;5;5m[48;5;0m fucking heretics[38;5;7m[48;5;0m SHAME!!! [38;5;3m[48;5;0m [38;5;7m[48;5;0m [8;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m -[m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m [38;5;7m[48;5;0mevoxel [7C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K +[C[38;5;7m[48;5;0memacs doesn't have :smile though :)[9;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;6m[48;5;0m- :wq!<CR> [38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5mM[38;5;7m[48;5;4m[K[10;18H[38;5;7m[48;5;0m [10;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K[11;24H[38;5;7m[48;5;0m l[11;42Hi[11;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [7C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K[12;24H[38;5;7m[48;5;0m [12;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;1m[48;5;0m - [M-x] zge[38;5;7m[48;5;0m [7C[38;5;7m[48;5;5m [38;5;7m[48;5;4mN[13;15H[38;5;7m[48;5;0m [13;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;1m[48;5;0m [6C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K[14;13H[38;5;7m[48;5;0m [14;38H [14;50H [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [8C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K +[38;5;7m[48;5;0mo---------o o----o [15;48H [38;5;5m[48;5;0my[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [9C[38;5;7m[48;5;5mA[38;5;7m[48;5;4m[K +[38;5;7m[48;5;0m|[16;11H| | [38;5;8m[48;5;4m [38;5;7m[48;5;0m | [38;5;3m[48;5;0m [38;5;7m[48;5;0m [16;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [10C[38;5;7m[48;5;5m [38;5;7m[48;5;4m[K +[38;5;7m[48;5;0m|[17;11H| |[38;5;8m[48;5;0m [38;5;8m[48;5;4m [38;5;7m[48;5;0m | [17;53H[38;5;7m[48;5;5m [17;63H[38;5;7m[48;5;0m [13C[38;5;7m[48;5;5m [38;5;7m[48;5;4mU[18;1H[38;5;7m[48;5;0m| [38;5;7m[48;5;2m [38;5;7m[48;5;0m [38;5;7m[48;5;3m [38;5;7m[48;5;0m | | | [18;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [6C[38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K +[38;5;7m[48;5;0m| [38;5;8m[48;5;3m [38;5;7m[48;5;0m [38;5;7m[48;5;2m [38;5;7m[48;5;0m [38;5;7m[48;5;3m [38;5;7m[48;5;0m | o----o [19;38Hstop here[6C[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K +[38;5;7m[48;5;0m| [38;5;8m[48;5;3m [38;5;7m[48;5;0m [38;5;7m[48;5;2m [38;5;7m[48;5;0m [38;5;7m[48;5;5m [38;5;7m[48;5;3m [38;5;7m[48;5;0m| [6C [20;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5mC[38;5;7m[48;5;3m[K +[38;5;7m[48;5;0m|[38;5;8m[48;5;0m [38;5;8m[48;5;3m [38;5;7m[48;5;4m [38;5;7m[48;5;5m [38;5;7m[48;5;0m [38;5;7m[48;5;5m [38;5;7m[48;5;0m| 000129 go down until you[7C[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K +[38;5;7m[48;5;0m| [38;5;7m[48;5;3m [38;5;7m[48;5;4m [38;5;7m[48;5;5m [38;5;7m[48;5;6m [38;5;7m[48;5;5m [38;5;7m[48;5;0m| reach ok[22;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[22C│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K +[38;5;7m[48;5;0m| [38;5;7m[48;5;1m [38;5;7m[48;5;6m [38;5;7m[48;5;5m [38;5;7m[48;5;0m| [23;26H100 [23;53H[38;5;7m[48;5;5m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5m [38;5;7m[48;5;3m[K +[38;5;7m[48;5;0mo---------o[24;24H [24;50H[38;5;0m[48;5;7me[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;7m[48;5;5m [38;5;3m[48;5;0m│ [m[39;49m[38;5;0m[48;5;0mq[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;5mS[38;5;7m[48;5;3m[K +[38;5;0m[48;5;7m U:%*- *Tetris* Top (1,0) (Tetris Proj[38;5;7m[48;5;0mq[38;5;0m[48;5;7mctile[rms])[K[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[38;5;7m[48;5;0m [1;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [8C9 +[38;5;2m[48;5;0m +/////////////////+[38;5;7m[48;5;0m [2;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [11C[K + [38;5;2m[48;5;0m //you@cybre.space//[38;5;7m[48;5;0m [3;37H [3;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [4C[K + [38;5;2m[48;5;0m +/////////////////+[38;5;7m[48;5;0m [4;37H [4;53H [6C [5C[K +[74D[38;5;3m[48;5;0m/\/\/\/\/[38;5;2m[48;5;0m\\\[38;5;3m[48;5;0m/\/\/\/\/\[38;5;7m[48;5;0m [5;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [7C[K + [38;5;3m[48;5;0m/ / [6;37H[38;5;7m[48;5;0m [6;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [9C[K + [38;5;3m[48;5;0m \ pleroma.soykaf.com \[7;37H[38;5;7m[48;5;0m [7;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [7C[K + [38;5;3m[48;5;0m/[38;5;7m[48;5;0m [38;5;3m[48;5;0msee the[38;5;7m[48;5;0m [38;5;3m[48;5;0m /[38;5;7m[48;5;0m [8;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [9C[K + [38;5;3m[48;5;0m\[38;5;7m[48;5;0m [38;5;2m[48;5;0m- entire -[38;5;7m[48;5;0m [38;5;3m[48;5;0m \[38;5;7m[48;5;0m I miss Karl...[9;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [4C[K + [38;5;3m[48;5;0m/[38;5;7m[48;5;0m [38;5;3m[48;5;0mfediverse[6C /[10;37H[38;5;7m[48;5;0m [10;53H [24C[K + [38;5;3m[48;5;0m\[11;25H \[38;5;7m[48;5;0m [6C [11;53H [24C[K + [38;5;3m[48;5;0m \/\/\/\/\[38;5;2m[48;5;0m///[38;5;3m[48;5;0m\/\/\/\/\/[12;37H[38;5;7m[48;5;0m [12;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [11C[K[13;37H [13;53H [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m.[38;5;7m[48;5;0m [6C[K[14;21H[38;5;12m[48;5;0m/---------------------\[14;53H[38;5;7m[48;5;0m [24C[K + [38;5;12m[48;5;0m|I'm petting the snek.| [15;53H[38;5;7m[48;5;0m [24C[K + [16;11H [38;5;12m[48;5;0m| |[16;53H[38;5;7m[48;5;0m [24C[K + [17;11H [38;5;12m[48;5;0m| ^U^ |[17;53H[38;5;7m[48;5;0m [24C[K + [38;5;12m[48;5;0m\---------------------/[18;53H[38;5;7m[48;5;0m [24C[K + [X] TODO: move this too[38;5;12m[48;5;0m \[38;5;7m[48;5;0m [6C [24C[K + [m[39;49m[38;5;0m[48;5;0m[ ] TODO: write todo list[38;5;7m[48;5;0m [38;5;12m[48;5;0m [38;5;7m[48;5;0m [38;5;4m[48;5;0m@/[6C[38;5;7m[48;5;0m [21C[38;5;6m[48;5;0m [2C[38;5;7m[48;5;0m[K + [X] TODO: hey, me too [38;5;4m[48;5;0m/| [6C[38;5;7m[48;5;0m [24C[K + [22;28H [22;41H [38;5;4m[48;5;0m/ \[6C[38;5;7m[48;5;0m [24C[K + ##########################[23;53H [24C[K + # TODO: advertise things # [24;50H [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [17C[K + ########################## [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[38;5;7m[48;5;0mq[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0mq[38;5;7m[48;5;0m [38;5;3m[48;5;0m│[38;5;7m[48;5;0m[K[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[1;55H[38;5;0m[48;5;3m│[1;71H│[6C[38;5;7m[48;5;0m10 + [2;55H[38;5;0m[48;5;3m│[2;71H└──────┐ +[C[38;5;7m[48;5;0m [3;55H[38;5;0m[48;5;3m│[22C│ +[38;5;1m[48;5;0m [38;5;7m[48;5;0m # [4;55H[38;5;0m[48;5;3m│[22C│ +[74D[38;5;7m[48;5;0m ## # ## [5;55H[38;5;0m[48;5;3m│[22C│ +[75D[38;5;7m[48;5;0m ## # ## [6;55H[38;5;0m[48;5;3m│[22C│ +[76D[38;5;7m[48;5;0m # [7;55H[38;5;0m[48;5;3m│[22C│ +[75D[38;5;7m[48;5;0m #### [6C [8;55H[38;5;0m[48;5;3m│[22C│ +[75D[38;5;7m[48;5;0m ## [9;55H[38;5;0m[48;5;3m│[22C│ +[75D[38;5;7m[48;5;0m # ### ## [10;55H[38;5;0m[48;5;3m│[38;5;7m[48;5;0m [38;5;3m[48;5;0ma[16C[38;5;0m[48;5;3m│ +[75D[38;5;7m[48;5;0m ## ## ## ## [11;55H[38;5;0m[48;5;3m│[38;5;3m[48;5;0m(hells [7C[38;5;0m[48;5;3m│ +[75D[38;5;7m[48;5;0m ### ### Capouet[12;55H[38;5;0m[48;5;3m│[38;5;3m[48;5;0m guettbook [6C[38;5;0m[48;5;3m│ +[76D[38;5;7m[48;5;0mlol this is awesome[13;55H[38;5;0m[48;5;3m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m s retch[11C[38;5;0m[48;5;3m│[14;21H[38;5;7m[48;5;0m [14;55H[38;5;0m[48;5;3m│[38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0mgoals)[10C[38;5;0m[48;5;3m│[15;21H[38;5;7m[48;5;0m [15;55H[38;5;0m[48;5;3m│[22C│[16;21H[38;5;7m[48;5;0m [16;55H[38;5;0m[48;5;3m│[22C│[17;21H[38;5;7m[48;5;0m [17;55H[38;5;0m[48;5;3m│[22C│[18;21H[38;5;7m[48;5;0m [18;55H[38;5;0m[48;5;3m│[22C│ +[71D[38;5;7m[48;5;0m [19;55H[38;5;0m[48;5;3m│[22C│ +[71D[38;5;7m[48;5;0m [20;43H [20;55H[38;5;0m[48;5;3m│[20C[38;5;7m[48;5;0m [38;5;0m[48;5;3m│ +[72D[38;5;7m[48;5;0mtodo: write todo list [21;44H [21;55H[38;5;0m[48;5;3m│[22C│[22;44H[38;5;7m[48;5;0m [22;55H[38;5;3m[48;5;0m▓[22C▓ +[71D[38;5;7m[48;5;0m [23;55H[38;5;3m[48;5;0m▒[22C▒ +[71D[38;5;7m[48;5;0m [24;55H[38;5;3m[48;5;0m░[22C░ +[71D[38;5;7m[48;5;0m [25;55H [6C[K[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H [1;55H[38;5;3m[48;5;0m [1;71H[38;5;7m[48;5;0m [m[39;49m[38;5;0m[48;5;0m(000,011)[2;37H [2;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[3;37H[m[39;49m[38;5;0m[48;5;0m [3;46H[38;5;7m[48;5;0mW[3;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K + [4;13H [4;37H[m[39;49m[38;5;0m[48;5;0m [4;46H[38;5;7m[48;5;0mE[4;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K +[48D [7C [5;37H[m[39;49m[38;5;0m[48;5;0m [5;46H[38;5;7m[48;5;0mE[5;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K +[48D [38;5;6m[48;5;0m3[38;5;5m[48;5;0m333333[38;5;3m[48;5;0m3[38;5;6m[48;5;0m33333333[6;37H[m[39;49m[38;5;0m[48;5;0m [6;46H[38;5;7m[48;5;0mE[6;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[7;9H[38;5;6m[48;5;0m3[38;5;9m[48;5;0m33333333333[38;5;7m[48;5;0m [38;5;6m[48;5;0m3[7;37H[m[39;49m[38;5;0m[48;5;0m [7;46H[38;5;7m[48;5;0mE[7;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[8;9H[38;5;6m[48;5;0m3[38;5;9m[48;5;0m33[38;5;7m[48;5;0m [38;5;13m[48;5;0m3[38;5;15m[48;5;0m3[38;5;7m[48;5;0m33 [38;5;6m[48;5;0m3[38;5;7m[48;5;0m [38;5;6m[48;5;0m3[8;37H[m[39;49m[38;5;0m[48;5;0m [8;46H[38;5;7m[48;5;0mE[8;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[9;9H[38;5;6m[48;5;0m333333333333[38;5;3m[48;5;0m3333[9;37H[m[39;49m[38;5;0m[48;5;0m [9;46H[38;5;7m[48;5;0mE[9;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[10;10H [10;37H[m[39;49m[38;5;0m[48;5;0m [10;46H[38;5;7m[48;5;0mE[10;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[11;10H [11;37H[m[39;49m[38;5;0m[48;5;0m [11;46H[38;5;7m[48;5;0mH[11;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[12;11H [12;37H[m[39;49m[38;5;0m[48;5;0m [12;46H[38;5;7m[48;5;0mE[12;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K + [13;37H[m[39;49m[38;5;0m[48;5;0m [13;46H[38;5;7m[48;5;0mE[13;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m [38;5;3m[48;5;0m [38;5;4m[48;5;0m.[38;5;7m[48;5;0m[K[14;37H[m[39;49m[38;5;0m[48;5;0m [14;46H[38;5;7m[48;5;0mH[14;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[15;37H[m[39;49m[38;5;0m[48;5;0m [15;46H[38;5;7m[48;5;0mE[15;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K + [38;5;6m[48;5;0mvi[38;5;7m[48;5;0m for the [38;5;6m[48;5;0mvi[38;5;7m[48;5;0mn![16;37H[m[39;49m[38;5;0m[48;5;0m [16;46H[38;5;7m[48;5;0mE[16;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[17;15H[38;5;6m[48;5;0m [17;37H[m[39;49m[38;5;0m[48;5;0m [17;46H[38;5;7m[48;5;0mE[17;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[18;37H[m[39;49m[38;5;0m[48;5;0m [7C[38;5;7m[48;5;0mE[18;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[19;37H[m[39;49m[38;5;0m[48;5;0m [19;46H[38;5;7m[48;5;0mE[19;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[20;37H[m[39;49m[38;5;0m[48;5;0m [20;46H[38;5;7m[48;5;0mE[20;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K +[49D [38;5;0m[48;5;1m [38;5;7m[48;5;0m [21;37H[m[39;49m[38;5;0m[48;5;0m [21;46H[38;5;7m[48;5;0mE[21;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[22;13H[38;5;0m[48;5;1m [38;5;0m[48;5;2m [38;5;0m[48;5;1m [38;5;0m[48;5;2m [38;5;0m[48;5;1m [22;37H[m[39;49m[38;5;0m[48;5;0m [22;46H[38;5;7m[48;5;0mE[22;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[23;13H[38;5;0m[48;5;1m [23;37H[m[39;49m[38;5;0m[48;5;0m [23;46H[38;5;7m[48;5;0mE[23;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[24;13H[38;5;0m[48;5;1m [38;5;0m[48;5;2m [38;5;0m[48;5;1m [24;37H[m[39;49m[38;5;0m[48;5;0m [24;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[25;13H[38;5;0m[48;5;1m [25;37H[m[39;49m[38;5;0m[48;5;0m [25;55H[38;5;3m[48;5;0m [38;5;7m[48;5;0m[K[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[1;14H[38;5;0m[48;5;1m [1;55H[38;5;7m[48;5;0m [23C[m[39;49m[38;5;0m[48;5;0m2[2;55H[38;5;7m[48;5;0m [3;46H [5C[K[4;17Hiiit[4;38H[m[39;49m[38;5;0m[48;5;0m [7C[38;5;7m[48;5;0m [5C[K[5;19Hllgwfth[5;46H [5C[K[6;9H [6;38H[m[39;49m[38;5;0m[48;5;0m [7C[38;5;7m[48;5;0m [5C[K[7;9H [7;46H [5C[K[8;9H [8;46H [5C[K[9;9H [38;5;5m[48;5;0mAcme is best editor :P[9;46H[38;5;7m[48;5;0m [5C[K +[6D [5C[K[11;18His that a plan9 reference [5C[K +[6D [5C[K[13;22His that a Jojo's referenc[13;55H [13;65H [38;5;3m[48;5;0m.[14;37H[38;5;7m[48;5;0m [14;46H [5C[K[15;25His that a let's encryp[5C [38;5;3m[48;5;0m +[58D[38;5;7m[48;5;0m [16;46H [5C[K[17;15H [17;46H [5C[K[18;38H [7C [18;55H[38;5;2m[48;5;0md[19;46H[38;5;7m[48;5;0m [19;55H[38;5;2m[48;5;0ms[20;46H[38;5;7m[48;5;0m [20;55H[38;5;2m[48;5;0mf[21;13H[38;5;7m[48;5;0m [21;46H [21;55H[38;5;2m[48;5;0ms[22;13H[38;5;7m[48;5;0m [22;46H [22;55H[38;5;2m[48;5;0mffd[38;5;7m[48;5;0m [38;5;2m[48;5;0mhello[38;5;7m[48;5;0m [38;5;2m[48;5;0mthere[23;13H[38;5;7m[48;5;0m [23;46H [23;55H[38;5;2m[48;5;0mo[38;5;7m[48;5;0m [38;5;2m[48;5;0mf[38;5;7m[48;5;0m [38;5;2m[48;5;0ml [24;13H[38;5;7m[48;5;0m eGenre l?[24;38H [24;55H[38;5;2m[48;5;0md[25;13H[38;5;7m[48;5;0m [25;55H[38;5;2m[48;5;0mj[38;5;3m[48;5;0m[1P[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[1;14H[38;5;7m[48;5;0m [1;37H [1;55H[38;5;2m[48;5;0mp[23C[m[39;49m[38;5;0m[48;5;0m3[2;37H[38;5;7m[48;5;0m [2;52H[38;5;3m[48;5;0m[1P[3;37H[38;5;7m[48;5;0m [3;59H[38;5;2m[48;5;0mx[38;5;3m[48;5;0m[1P[4;17H[38;5;7m[48;5;0m [4;37H [4;59H[38;5;2m[48;5;0mm[38;5;3m[48;5;0m[1P[5;19H[38;5;7m[48;5;0m [5;37H [5;59H[38;5;2m[48;5;0mp[6;37H[38;5;7m[48;5;0m [6;59H[38;5;2m[48;5;0mp[7;37H[38;5;7m[48;5;0m [7;59H[38;5;2m[48;5;0m +[53D[38;5;7m[48;5;0mi want to pet a soft girl [8;59H[38;5;2m[48;5;0mp +[52D[38;5;7m[48;5;0mand call her by her first name[9;59H[38;5;2m[48;5;0mu +[52D[38;5;7m[48;5;0mgod, i'm so lonely.[10;37H [10;59H[38;5;2m[48;5;0mb[11;18H[38;5;7m[48;5;0m [11;59H[38;5;2m[48;5;0ml +[54D[38;5;10m[48;5;0mYou can do it[12;37H[38;5;7m[48;5;0m [12;59H[38;5;2m[48;5;0mi[13;22H[38;5;7m[48;5;0m [13;59H[38;5;2m[48;5;0mc +[54D[38;5;10m[48;5;0mGo out there and talk to people[14;59H[38;5;2m[48;5;0mg[15;25H[38;5;7m[48;5;0m [15;59H[38;5;2m[48;5;0m@[38;5;7m[48;5;0m[K +[54D[38;5;10m[48;5;0mEven if it doesnt go anywhere, don't[16;59H[38;5;2m[48;5;0mc +[54D[38;5;10m[48;5;0msee it as a loss, see it as practice[17;59H[38;5;2m[48;5;0mo[18;37H[38;5;7m[48;5;0m [18;55H [38;5;2m[48;5;0mn +[54D[38;5;10m[48;5;0mI believe in you[19;37H[38;5;7m[48;5;0m [19;55H [38;5;2m[48;5;0mf[20;37H[38;5;7m[48;5;0m [20;55H [38;5;2m[48;5;0me +[54D[38;5;10m[48;5;0mYou will be succesful[21;37H[38;5;7m[48;5;0m [21;55H [38;5;2m[48;5;0mr[22;37H[38;5;7m[48;5;0m [22;55H [38;5;2m[48;5;0me[38;5;7m[48;5;0m[K +[54D[38;5;10m[48;5;0mYou just have to try...[23;37H[38;5;7m[48;5;0m [23;55H [38;5;2m[48;5;0mn[38;5;7m[48;5;0m[K[24;15H [24;37H [24;55H [38;5;2m[48;5;0mc +[54D[38;5;7m[48;5;0mUwU[25;37H [25;55H [38;5;2m[48;5;0me[38;5;7m[48;5;0m[K[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[1;55H[38;5;7m[48;5;0m [38;5;2m[48;5;0m.[19C[m[39;49m[38;5;0m[48;5;0m4[2;59H[38;5;2m[48;5;0my[38;5;7m[48;5;0m[K +[38;5;2m[48;5;0mo[38;5;7m[48;5;0m[K +[38;5;2m[48;5;0mu[38;5;7m[48;5;0m[K +[38;5;2m[48;5;0mr +d +a +[53D[38;5;7m[48;5;0m [8;59H[38;5;2m[48;5;0mt +[52D[38;5;7m[48;5;0m [9;59H[38;5;2m[48;5;0ma +[52D[38;5;7m[48;5;0m [10;59H[38;5;2m[48;5;0m. +f +[54D[38;5;7m[48;5;0m [12;59H[38;5;2m[48;5;0mo +r +[54D[38;5;7m[48;5;0m [38;5;10m[48;5;0mwhere[14;59H[38;5;2m[48;5;0ms[6C[38;5;3m[48;5;0m [15;36H[38;5;10m[48;5;0mare[15;59H[38;5;2m[48;5;0ma +[54D[38;5;7m[48;5;0m [38;5;10m[48;5;0myou[38;5;7m[48;5;0m [16;59H[38;5;2m[48;5;0ml +[54D[38;5;7m[48;5;0m [38;5;10m[48;5;0mgoing[38;5;7m[48;5;0m [17;59H[38;5;2m[48;5;0me[18;36H[38;5;10m[48;5;0mthere[18;52H[38;5;7m[48;5;0m[K +[46D [19;36H[38;5;10m[48;5;0mis[19;52H[38;5;7m[48;5;0m[K[20;36H[38;5;10m[48;5;0mnothing[20;52H[38;5;7m[48;5;0m[K +[46D [21;36H[38;5;10m[48;5;0mdown[21;52H[38;5;7m[48;5;0m[K[22;36H[38;5;10m[48;5;0mhere[22;52H[38;5;7m[48;5;0m[K +[46D [7C[38;5;10m[48;5;0mi [23;52H[38;5;7m[48;5;0m[K[24;36H[38;5;10m[48;5;0mpromise[24;52H[38;5;7m[48;5;0m[K +[46D [25;36H(there is)[6C[K[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[1;59H[38;5;7m[48;5;0m [1;72H 015[K[2;59H + +[6D[38;5;1m[48;5;0mor is there?[5;59H[38;5;7m[48;5;0m +[5Dwow[K + +[5Dyou all just[9;59H +[5Dbb[K[11;19Hhello[11;52H[K[12;59H + [14;36H [38;5;3m[48;5;0m| |[5C[38;5;7m[48;5;0m[K[15;36H [15;52H[K[16;36H [16;52H[K[17;36H [17;52H[K +[46DRewrite this in Nim for better +[35Dperformance and easier maintenance. +[35Dhttps://nim-lang.org[20;36H +[37DSorry, couldn't resist :P [22;10HRewrite it in Idris to prove its[23;10Hcorrectness :P[23;36H +[32DRemove it :P[24;36H +[35Ddasdasdasdsa[25;36H [1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[38C[38;5;7m[48;5;0m6[4;54H[K[5;36Hwrite.[6;55H[K + +[K[9;39Hjjjjjjjjjjj +[5C[K[11;19H [13;35H[38;5;10m[48;5;0msee[38;5;7m[48;5;0m,[13;54HWhat's that creeping[14;35Hi told you [7Cwaaaaayyy over there?[15;54H-------------------->[18;6H +[30D +[35D +[20D [22;10H [23;10H +[18D +[10D[m[39;49m[38;5;0m[48;5;0mq[38;5;7m[48;5;0m [1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[38C[38;5;7m[48;5;0m7[4;27HWhat is this ?:wq[5;27Hq[5;36H [7;57H[38;5;12m[48;5;0mthere is[8;57Htrust me[9;39H[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0my[7C[38;5;12m[48;5;0mi wrapped[13;35H[38;5;7m[48;5;0m [13;54H [38;5;3m[48;5;0m.[38;5;7m[48;5;0m[K[14;35H [7C[K + [K[25;8H [1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[38C[38;5;7m[48;5;0m8[4;27H +[38;5;11m[48;5;0mAncient legend tells of the treasure +of the legendary pirate, +Cap'n Jasmine Sharkbait![7;52H[38;5;7m[48;5;0m[K +[38;5;11m[48;5;0mNo one knows where its shiny and well shaded[7C[38;5;7m[48;5;0m[K +[38;5;11m[48;5;0mglory is hidden, and many have perished[9;52H[38;5;7m[48;5;0m[K +[38;5;11m[48;5;0mtrying to find it. + + [15;28H[38;5;1m[48;5;0mstuff is here[17;26H[38;5;6m[48;5;0m [38;5;5m[48;5;0m |[38;5;6m[48;5;0m [1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[1;72H[38;5;7m[48;5;0m(000,019)[3;29H[38;5;7m[48;5;1mMDG - boi + +[38;5;7m[48;5;0m [38;5;15m[48;5;0m [38;5;7m[48;5;0m + + + [8;62Hwhy though +======================================D + + + [15;28H [15;63H[38;5;3m[48;5;0m(i legit[16;63Hput tape[17;26H[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [17;63H[38;5;3m[48;5;0mon my [18;63Hscreen +[6Dto do[38;5;7m[48;5;0m [38;5;3m[48;5;0mthis)[20;63H[38;5;1m[48;5;0myou are crazy[22;55H[38;5;4m[48;5;0myou will be seen as[23;55Ha visionary[24;24H[38;5;7m[48;5;0mhello tilde.town here[25;37H[m[39;49m[38;5;0m[48;5;0mq[25;58H[38;5;7m[48;5;0mweird flex but ok[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H[1;72H[38;5;7m[48;5;0m 020[K[3;29H +[38;5;10m[48;5;0mplease [5;15H[38;5;7m[48;5;0m [38;5;10m[48;5;0mstop +this +is +silly[8;52H[38;5;7m[48;5;0m[K + [9;59H[38;5;12m[48;5;0mit[6C[38;5;3m[48;5;0mllllllllllllll[10;27H[38;5;1m[48;5;0m [6C[38;5;7m[48;5;0mno[10;59H[38;5;12m[48;5;0mis[11;12H[38;5;1m[48;5;0m [11;59H[38;5;12m[48;5;0mlovely +[59D[38;5;7m[48;5;0m"Root? Where we're going we[12;54Ht +[48Ddon't need root!"[15;63H[K[16;34Hpeople have[7C[K[17;34Hdied trying[7C[K[18;34Hdon't try :([6C[K + [38;5;9m[48;5;0mdon't stop![38;5;7m[48;5;0m[K[20;55H[38;5;9m[48;5;0mthere's nice art[38;5;7m[48;5;0m[K[21;37Huwu[21;55H[38;5;9m[48;5;0mjust ahead[22;55H [38;5;7m[48;5;0m[K +[38;5;9m[48;5;0m|||[38;5;7m[48;5;0m[K[24;24H [24;55H[38;5;9m[48;5;0mvvv[25;37H[38;5;7m[48;5;0m [25;52H[K[1;41H[m[39;49m[38;5;0m[48;5;0m + + + + + + + + + + + + + + + + + + + + + + + +[1;41H [38;5;12m[48;5;6m [38;5;4m[48;5;6m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;10m[48;5;0m comment space!!! [38;5;9m[48;5;0m<3[38;5;7m[48;5;0m(000,021)[2;1H[38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;4m[48;5;6m [38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@ +[38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;9m[48;5;0m__________________ +[38;5;0m[48;5;4m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;9m[48;5;0m|[38;5;2m[48;5;0m [38;5;9m[48;5;0m | +[38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;12m[48;5;6m [38;5;0m[48;5;4m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;9m[48;5;0m|[38;5;2m[48;5;0m [38;5;9m[48;5;0m>[38;5;10m[48;5;0m>[38;5;14m[48;5;0m> [38;5;11m[48;5;0mM[38;5;3m[48;5;0mORE[38;5;14m[48;5;0m [38;5;11m[48;5;0mA[38;5;3m[48;5;0mRT[38;5;14m[48;5;0m >[38;5;10m[48;5;0m>[38;5;9m[48;5;0m>[38;5;2m[48;5;0m [38;5;9m[48;5;0m| +[38;5;0m[48;5;4m [38;5;2m[48;5;7m [38;5;0m[48;5;4m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;9m[48;5;0m| [38;5;3m[48;5;0m(on (001, 021)) [38;5;2m[48;5;0m [38;5;9m[48;5;0m|[38;5;2m[48;5;0m +[38;5;0m[48;5;4m [38;5;2m[48;5;7m [38;5;8m[48;5;7m#[38;5;2m[48;5;7m [38;5;0m[48;5;4m [38;5;2m[48;5;7m [38;5;0m[48;5;4m [38;5;2m[48;5;7m [38;5;0m[48;5;4m [38;5;5m[48;5;0m> @[38;5;7m[48;5;0m [38;5;5m[48;5;0m>[38;5;7m[48;5;0m [38;5;9m[48;5;0m|___________[38;5;7m[48;5;0m [38;5;9m[48;5;0m_____|[38;5;2m[48;5;0m +[38;5;0m[48;5;4m [38;5;8m[48;5;7m#############[38;5;0m[48;5;4m [38;5;8m[48;5;7m#[38;5;0m[48;5;4m [38;5;8m[48;5;7m##############[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[23C[38;5;2m[48;5;0m +[38;5;0m[48;5;4m [38;5;8m[48;5;4m [38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;9m[48;5;0m [38;5;2m[48;5;0m [38;5;1m[48;5;2mooh what you drawing[38;5;7m[48;5;0m[K +[38;5;0m[48;5;4m [38;5;8m[48;5;4m [38;5;6m[48;5;4m/[38;5;8m[48;5;4m [38;5;6m[48;5;4m [38;5;4m[48;5;4m [38;5;6m[48;5;4m /[38;5;8m[48;5;4m [38;5;6m[48;5;4m [38;5;8m[48;5;4m [38;5;14m[48;5;4m/[38;5;8m[48;5;4m [38;5;6m[48;5;4m/[38;5;8m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;8m[48;5;4m [38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;0m[48;5;1mjust a little landscape +[38;5;0m[48;5;4m [38;5;6m[48;5;4m [38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;1m[48;5;2mnice!! keep it up ^o^ +[38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;14m[48;5;4m/[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;0m[48;5;1mthank you =v= +[38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[13;67H[38;5;3m[48;5;0m +[38;5;0m[48;5;4m [38;5;14m[48;5;4m/[38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[14;60H[38;5;1m[48;5;2moh wait hi rose +[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m this is wonderful +[38;5;0m[48;5;4m [38;5;14m[48;5;4m/[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[7C[38;5;8m[48;5;7mhi alice!! +[38;5;0m[48;5;4m [38;5;10m[48;5;4m####[38;5;0m[48;5;4m [38;5;10m[48;5;4m####[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m +[38;5;0m[48;5;4m [38;5;10m[48;5;4m#[38;5;2m[48;5;4m#####[38;5;10m[48;5;4m#[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;12m[48;5;0mart restored to its[38;5;5m[48;5;0m[K +[38;5;0m[48;5;4m [38;5;6m[48;5;4m/[38;5;0m[48;5;4m [38;5;10m[48;5;4m#[38;5;2m[48;5;4m#[38;5;8m[48;5;4m|[38;5;2m[48;5;4m#[38;5;10m[48;5;4m#[38;5;0m[48;5;4m [38;5;14m[48;5;4m/[38;5;0m[48;5;4m [38;5;4m[48;5;4m [38;5;0m[48;5;4m [38;5;4m[48;5;4m [38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;12m[48;5;0mformer glory[38;5;5m[48;5;0m [38;5;4m[48;5;0m +[38;5;0m[48;5;4m [38;5;10m[48;5;4m##[38;5;2m[48;5;4m##[38;5;8m[48;5;4m|[38;5;2m[48;5;4m##[38;5;10m[48;5;4m##[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m [38;5;12m[48;5;0mcmon, play nice yall +[38;5;0m[48;5;4m [38;5;10m[48;5;4m##[38;5;0m[48;5;4m |[38;5;10m[48;5;4m [38;5;0m[48;5;4m [38;5;10m[48;5;4m##[38;5;0m[48;5;4m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [7C[38;5;2m[48;5;0myeah! +[38;5;2m[48;5;4m||||||||||||||||||||[38;5;0m[48;5;4m\[38;5;2m[48;5;4m|||||||||||||||||||||||||[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[2C[38;5;7m[48;5;0m[K +[38;5;8m[48;5;2m#####################[38;5;0m[48;5;2m\[38;5;8m[48;5;2m########################[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m| [38;5;2m[48;5;0mthanks for watching +[38;5;8m[48;5;2m######################[38;5;0m[48;5;2m\[38;5;8m[48;5;2m#######################[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0m [38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;2m[48;5;0m i guess it's done now +[38;5;8m[48;5;2m^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;5m[48;5;0m@[38;5;7m[48;5;0mq[38;5;5m[48;5;0m|[38;5;7m[48;5;0m [38;5;9m[48;5;0mwonderful :) [38;5;2m[48;5;0mmight do more[4hr[4l[1;41H[m[39;49m[38;5;0m[48;5;0m \ No newline at end of file diff --git a/www/git.causal.agency/.gitignore b/www/git.causal.agency/.gitignore new file mode 100644 index 00000000..8d20f25d --- /dev/null +++ b/www/git.causal.agency/.gitignore @@ -0,0 +1,3 @@ +about-filter +hi +source-filter diff --git a/www/git.causal.agency/Makefile b/www/git.causal.agency/Makefile new file mode 100644 index 00000000..28e08ba5 --- /dev/null +++ b/www/git.causal.agency/Makefile @@ -0,0 +1,18 @@ +ETC = /usr/local/etc +WWW = /usr/local/www/cgit +LIBEXEC = /usr/local/libexec + +BIN = ../../bin +BINS = about-filter source-filter hi + +install: cgitrc custom.css ${BINS} + install -m 644 cgitrc ${ETC} + install -m 644 custom.css ${WWW} + install ${BINS} ${LIBEXEC} + +hi: ${BIN}/hi.c + ${MAKE} -C ${BIN} $@ + cp ${BIN}/$@ $@ + +clean: + rm -f ${BINS} diff --git a/www/git.causal.agency/about-filter.sh b/www/git.causal.agency/about-filter.sh new file mode 100644 index 00000000..d27d2d48 --- /dev/null +++ b/www/git.causal.agency/about-filter.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +options=fragment,man=%N.%S,includes=../tree/%I + +case "$1" in + (README.[1-9]) + exec /usr/bin/mandoc -T html -O $options + ;; + (*.[1-9]) + exec /usr/bin/mandoc -T html -O $options,toc + ;; + (*) + exec /usr/local/libexec/hi -l text -f html + ;; +esac diff --git a/www/git.causal.agency/cgitrc b/www/git.causal.agency/cgitrc new file mode 100644 index 00000000..c187e1ee --- /dev/null +++ b/www/git.causal.agency/cgitrc @@ -0,0 +1,27 @@ +root-title=causal agency +root-desc=“then I'm sorry, no offence, but you write toy programs.” + +clone-url=https://$HTTP_HOST/$CGIT_REPO_URL +snapshots=tar.gz zip + +enable-blame=1 +enable-commit-graph=1 +enable-subject-links=1 +enable-follow-links=1 +enable-index-owner=0 +repository-sort=age +branch-sort=age + +css=/custom.css +email-filter=/usr/local/libexec/cgit-email +about-filter=/usr/local/libexec/about-filter +source-filter=/usr/local/libexec/source-filter + +readme=:README.7 +readme=:README + +remove-suffix=1 +enable-git-config=1 +scan-path=/home/june/pub + +cache-size=1024 diff --git a/www/git.causal.agency/custom.css b/www/git.causal.agency/custom.css new file mode 100644 index 00000000..802882d2 --- /dev/null +++ b/www/git.causal.agency/custom.css @@ -0,0 +1,87 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +@import url("cgit.css"); + +* { line-height: 1.25em; } + +div#cgit { + max-width: 117ch; + margin: auto; + font-family: monospace; + -moz-tab-size: 4; + tab-size: 4; +} + +div#cgit table#header td.logo { + display: none; +} +div#cgit table#header td.sub { + border-top: none; +} +div#cgit table.tabs { + border-bottom: none; +} +div#cgit div.content { + border-bottom: none; +} +div#cgit table.list th a { + color: inherit; +} +div#cgit table.list tr:nth-child(even) { + background: inherit; +} +div#cgit table.list tr:hover { + background: inherit; +} +div#cgit table.list tr.nohover-highlight:hover:nth-child(even) { + background: inherit; +} + +div#cgit table.blob td.linenumbers a:target { + color: goldenrod; + text-decoration: underline; + outline: none; +} + +div#cgit div#summary { + max-width: 80ch; +} + +/* from hi(1) */ +div#cgit .hi.Keyword { color: dimgray; } +div#cgit .hi.Macro { color: green; } +div#cgit .hi.Tag { color: inherit; text-decoration: underline; } +div#cgit .hi.String { color: teal; } +div#cgit .hi.Format { color: teal; font-weight: bold; } +div#cgit .hi.Interp { color: olive; } +div#cgit .hi.Comment { color: navy; } +div#cgit .hi.Todo { color: navy; font-weight: bold; } +div#cgit .hi.DiffOld { color: red; } +div#cgit .hi.DiffNew { color: green; } +div#cgit .hi.Tag:target { color: goldenrod; outline: none; } + +/* from mandoc(1) */ +table.head, table.foot { width: 100%; } +td.head-rtitle, td.foot-os { text-align: right; } +td.head-vol { text-align: center; } +div.Pp { margin: 1ex 0ex; } +div.Nd, div.Bf, div.Op { display: inline; } +span.Pa, span.Ad { font-style: italic; } +span.Ms { font-weight: bold; } +dl.Bl-diag > dt { font-weight: bold; } +code.Nm, code.Fl, code.Cm, code.Ic, code.In, code.Fd, code.Fn, +code.Cd { font-weight: bold; font-family: inherit; } + +h1.Sh { font-size: 1.5em; } +table.Nm td:first-child { padding-right: 1ch; } +code.Fl { white-space: nowrap; } +span.RsT { font-style: italic; } +dl.Bl-tag:not(.Bl-compact) dt { margin-top: 1em; } +ul.Bl-bullet:not(.Bl-compact) li { margin-top: 1em; } +div.Bd-indent { margin-left: 4ch; } +table.Bl-column { width: 100%; } +table.foot { margin-top: 1em; } + +div#cgit a.permalink { color: inherit; } diff --git a/www/git.causal.agency/source-filter.sh b/www/git.causal.agency/source-filter.sh new file mode 100644 index 00000000..4febc2e0 --- /dev/null +++ b/www/git.causal.agency/source-filter.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +exec /usr/local/libexec/hi -t -n "$1" -f html -o anchor diff --git a/www/temp.causal.agency/.gitignore b/www/temp.causal.agency/.gitignore new file mode 100644 index 00000000..e31ee94e --- /dev/null +++ b/www/temp.causal.agency/.gitignore @@ -0,0 +1 @@ +up diff --git a/www/temp.causal.agency/Makefile b/www/temp.causal.agency/Makefile new file mode 100644 index 00000000..3e908305 --- /dev/null +++ b/www/temp.causal.agency/Makefile @@ -0,0 +1,16 @@ +WEBROOT = /usr/local/www/temp.causal.agency + +CFLAGS += -std=c11 -Wall -Wextra -Wpedantic -I/usr/local/include +LDFLAGS += -static -L/usr/local/lib +LDLIBS = -lkcgihtml -lkcgi -lz -lmd + +up: + +clean: + rm -f up + +install: up + install -m 700 up ${WEBROOT}/up + +uninstall: + rm -f ${WEBROOT}/up diff --git a/www/temp.causal.agency/up.c b/www/temp.causal.agency/up.c new file mode 100644 index 00000000..9e7b4ff7 --- /dev/null +++ b/www/temp.causal.agency/up.c @@ -0,0 +1,156 @@ +/* Copyright (C) 2020 June McEnroe <june@causal.agency> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <err.h> +#include <fcntl.h> +#include <stdarg.h> +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/capsicum.h> +#include <sys/types.h> +#include <sysexits.h> +#include <time.h> +#include <unistd.h> + +#include <kcgi.h> +#include <kcgihtml.h> + +static int cwd = -1; + +static const struct kvalid Key = { NULL, "file" }; + +static enum kcgi_err head(struct kreq *req, enum khttp http, enum kmime mime) { + return khttp_head(req, kresps[KRESP_STATUS], "%s", khttps[http]) + || khttp_head(req, kresps[KRESP_CONTENT_TYPE], "%s", kmimetypes[mime]); +} + +static enum kcgi_err fail(struct kreq *req, enum khttp http) { + return head(req, http, KMIME_TEXT_PLAIN) + || khttp_body(req) + || khttp_printf(req, "%s\n", khttps[http]); +} + +static enum kcgi_err handle(struct kreq *req) { + if (req->page) return fail(req, KHTTP_404); + + if (req->method == KMETHOD_GET) { + struct khtmlreq html; + struct khtmlreq *h = &html; + return head(req, KHTTP_200, KMIME_TEXT_HTML) + || khttp_body(req) + || khtml_open(h, req, 0) + || khtml_elem(h, KELEM_DOCTYPE) + || khtml_elem(h, KELEM_TITLE) + || khtml_puts(h, "Upload") + || khtml_closeelem(h, 1) + || khtml_attr( + h, KELEM_FORM, + KATTR_METHOD, "post", + KATTR_ACTION, "", + KATTR_ENCTYPE, "multipart/form-data", + KATTR__MAX + ) + || khtml_attr( + h, KELEM_INPUT, + KATTR_TYPE, "file", + KATTR_NAME, Key.name, + KATTR__MAX + ) + || khtml_attr( + h, KELEM_INPUT, + KATTR_TYPE, "submit", + KATTR_VALUE, "Upload", + KATTR__MAX + ) + || khtml_close(h); + + } else if (req->method == KMETHOD_POST) { + struct kpair *field = req->fieldmap[0]; + if (!field || !field->valsz) return fail(req, KHTTP_400); + + char name[256]; + const char *ext = strrchr(field->file, '.'); + if (!ext) ext = ""; + snprintf( + name, sizeof(name), "%jx%08x%s", + (intmax_t)time(NULL), arc4random(), ext + ); + + int fd = openat(cwd, name, O_CREAT | O_EXCL | O_WRONLY, 0644); + if (fd < 0) { + warn("openat"); + return fail(req, KHTTP_507); + } + ssize_t len = write(fd, field->val, field->valsz); + int error = close(fd); + if (len < 0 || error) { + warn("write"); + return fail(req, KHTTP_507); + } + + return head(req, KHTTP_303, KMIME_TEXT_PLAIN) + || khttp_head(req, kresps[KRESP_LOCATION], "/%s", name) + || khttp_body(req) + || khttp_puts(req, name); + + } else { + return fail(req, KHTTP_405); + } +} + +static void sandbox(void) { + cwd = open(".", O_DIRECTORY); + if (cwd < 0) err(EX_CONFIG, "."); + + int error = cap_enter(); + if (error) err(EX_OSERR, "cap_enter"); + + cap_rights_t rights; + cap_rights_init(&rights, CAP_LOOKUP, CAP_CREATE, CAP_PWRITE); + error = cap_rights_limit(cwd, &rights); + if (error) err(EX_OSERR, "cap_rights_limit"); +} + +int main(void) { + const char *page = "up"; + if (khttp_fcgi_test()) { + struct kfcgi *fcgi; + enum kcgi_err error = khttp_fcgi_init(&fcgi, &Key, 1, &page, 1, 0); + if (error) errx(EX_CONFIG, "khttp_fcgi_init: %s", kcgi_strerror(error)); + sandbox(); + for ( + struct kreq req; + KCGI_OK == (error = khttp_fcgi_parse(fcgi, &req)); + khttp_free(&req) + ) { + error = handle(&req); + if (error && error != KCGI_HUP) break; + } + if (error != KCGI_EXIT) { + errx(EX_PROTOCOL, "khttp_fcgi_parse: %s", kcgi_strerror(error)); + } + khttp_fcgi_free(fcgi); + } else { + struct kreq req; + enum kcgi_err error = khttp_parse(&req, &Key, 1, &page, 1, 0); + if (error) errx(EX_PROTOCOL, "khttp_parse: %s", kcgi_strerror(error)); + error = handle(&req); + if (error) errx(EX_PROTOCOL, "%s", kcgi_strerror(error)); + khttp_free(&req); + } +} diff --git a/www/text.causal.agency/.gitignore b/www/text.causal.agency/.gitignore new file mode 100644 index 00000000..37dd51ef --- /dev/null +++ b/www/text.causal.agency/.gitignore @@ -0,0 +1,2 @@ +*.txt +feed.atom diff --git a/www/text.causal.agency/001-make.7 b/www/text.causal.agency/001-make.7 new file mode 100644 index 00000000..b4805729 --- /dev/null +++ b/www/text.causal.agency/001-make.7 @@ -0,0 +1,159 @@ +.Dd September 17, 2018 +.Dt MAKE 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Using Make +.Nd writing less Makefile +. +.Sh DESCRIPTION +Let's talk about +.Xr make 1 . +I think an important thing to know about +.Xr make 1 +is that you don't need to write a +.Pa Makefile +to use it. +There are default rules +for C, C++ and probably Fortran. +To build +.Pa foo +from +.Pa foo.c , +just run: +. +.Pp +.Dl make foo +. +.Pp +The default rule for C files uses the +.Ev CFLAGS +variable, +so you can set that in the environment +to pass flags to the C compiler: +. +.Pp +.Dl CFLAGS=-Wall make foo +. +.Pp +It also uses +.Ev LDLIBS +for linking, +so you can add libraries with: +. +.Pp +.Dl LDLIBS=-lcurses make foo +. +.Pp +Obviously writing this every time +would become tedious, +so it might be time to write a +.Pa Makefile . +But it really doesn't need much: +. +.Bd -literal -offset indent +CFLAGS += -Wall -Wextra +LDLIBS = -lcurses + +foo: +.Ed +. +.Pp +Assigning +.Ev CFLAGS +with +.Ql += +preserves the system default +or anything passed in the environment. +Declaring +.Pa foo +as the first rule +makes it the default when +.Ql make +is run without a target. +Note that the rule doesn't need a definition; +the default will still be used. +. +.Pp +If +.Pa foo +is built from serveral source files, +unfortunately a rule definition is required: +. +.Bd -literal -offset indent +OBJS = foo.o bar.o baz.o + +foo: $(OBJS) + $(CC) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@ +.Ed +. +.Pp +This rule uses +.Ev LDFLAGS +for passing linker flags, +which is what the default rule does. +The +.Ql $@ +variable here expands to +.Ql foo , +so this rule can be copied easily +for other binary targets. +. +.Pp +If some sources depend on a header file, +they can be automatically rebuilt +when the header changes +by declaring a dependency rule: +. +.Pp +.Dl foo.o bar.o: foo.h +. +.Pp +Note that several files can appear +either side of the +.Ql ":" . +. +.Pp +Lastly, +it's always nice to add a +.Cm clean +target: +. +.Bd -literal -offset indent +clean: + rm -f $(OBJS) foo +.Ed +. +.Pp +I hope this helps getting started with +.Xr make 1 +without writing too much +.Pa Makefile ! +. +.Sh EXAMPLES +The example +.Pa Makefile +in its entirety: +. +.Bd -literal -offset indent +CFLAGS += -Wall -Wextra +LDLIBS = -lcurses +OBJS = foo.o bar.o baz.o + +foo: $(OBJS) + $(CC) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@ + +foo.o bar.o: foo.h + +clean: + rm -f $(OBJS) foo +.Ed +. +.Sh AUTHORS +.An Mt june@causal.agency +. +.Pp +This document is produced from +.Xr mdoc 7 +source available from +.Lk https://git.causal.agency/src/tree/www/text.causal.agency diff --git a/www/text.causal.agency/002-writing-mdoc.7 b/www/text.causal.agency/002-writing-mdoc.7 new file mode 100644 index 00000000..b377d364 --- /dev/null +++ b/www/text.causal.agency/002-writing-mdoc.7 @@ -0,0 +1,138 @@ +.Dd September 27, 2018 +.Dt WRITING-MDOC 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Writing mdoc +.Nd semantic markup +. +.Sh DESCRIPTION +I recently learned how to write man pages +so that I could document +a bunch of little programs I've written. +Modern man pages are written in +.Xr mdoc 7 , +whose documentation is also available from +.Lk http://mandoc.bsd.lv . +. +.Pp +.Xr mdoc 7 +differs from many other markup languages +by providing +.Dq semantic markup +rather than just +.Dq physical markup. +What this means is that +the markup indicates what something is, +not how to format it. +For example, +the +.Ql \&Ar +macro is used to indicate +command-line arguments +rather than one of the macros +for bold, italic or underline. +This frees each author of having to choose +and enables consistent presentation +across different man pages. +. +.Pp +Another advantage of semantic markup +is that information can be extracted from it. +For example, +.Xr makewhatis 8 +can easily extract the name and short description +from each man page +thanks to the +.Ql \&Nm +and +.Ql \&Nd +macros. +I use the same information +to generate an Atom feed for these documents, +though in admittedly a much less robust way than +.Xr mandoc 1 . +. +.Pp +When it comes to actually writing +.Xr mdoc 7 , +it can take some getting used to. +The language is of +.Xr roff 7 +lineage +so its syntax is very particular. +Macros cannot appear inline, +but must start on new lines +beginning with +.Ql \&. . +Sentences should likewise +always start on a new line. +Since I'm in the habit of writing with +semantic line breaks, +I actually find these requirements +fit in well. +. +.Pp +The more frustrating syntax limitation to me +is the rule against empty lines. +Without them, +it can be quite difficult to edit a lengthy document. +Thankfully, +lines with only a +.Ql \&. +on them are allowed, +but this still causes visual noise. +To alleviate that, +I have a +.Xr vim 1 +syntax file for +.Xr mdoc 7 +which conceals the lone dots: +. +.Bd -literal -offset indent +if exists("b:current_syntax") + finish +endif + +runtime! syntax/nroff.vim +unlet! b:current_syntax + +setlocal sections+=ShSs +syntax match mdocBlank /^\\.$/ conceal +setlocal conceallevel=2 + +let b:current_syntax = "mdoc" +.Ed +. +.Pp +It also adds the +.Xr mdoc 7 +section header and subsection header macros to the +.Cm sections +option to make +.Xr vim 1 Ap s +.Ic { +and +.Ic } +motions +aware of them. +. +.Pp +With that, +I've found writing man pages pleasant and rewarding. +I've started writing other documents with +.Xr mdoc 7 +as well, +as you can see here. +. +.Sh SEE ALSO +.Lk http://rhodesmill.org/brandon/2012/one-sentence-per-line/ "Semantic Linefeeds" +. +.Sh AUTHORS +.An Mt june@causal.agency +. +.Pp +This document is produced from +.Xr mdoc 7 +source available from +.Lk https://git.causal.agency/src/tree/www/text.causal.agency diff --git a/www/text.causal.agency/003-pleasant-c.7 b/www/text.causal.agency/003-pleasant-c.7 new file mode 100644 index 00000000..16030b7e --- /dev/null +++ b/www/text.causal.agency/003-pleasant-c.7 @@ -0,0 +1,120 @@ +.Dd September 30, 2018 +.Dt PLEASANT-C 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Pleasant C +.Nd it's good, actually +. +.Sh DESCRIPTION +I've been writing a lot of C lately +and actually find it very pleasant. +I want to talk about some of its ergonomic features. +These are C99 features unless otherwise noted. +. +.Ss Initializer syntax +Struct and union initializer syntax +is well generalized. +Designators can be chained, +making initializing nested structs easy, +and all uninitialized fields are zeroed. +. +.Bd -literal -offset indent +struct { + struct pollfd fds[2]; +} loop = { + .fds[0].fd = STDIN_FILENO, + .fds[1].fd = STDOUT_FILENO, + .fds[0].events = POLLIN, + .fds[1].events = POLLOUT, +}; +.Ed +. +.Ss Variable-length arrays +VLAs can be multi-dimensional, +which can avoid manual stride multiplications +needed to index a flat +.Xr malloc 3 Ap d +array. +. +.Bd -literal -offset indent +uint8_t glyphs[len][height][width]; +fread(glyphs, height * width, len, stdin); +.Ed +. +.Ss Incomplete array types +The last field of a struct can be an +.Dq incomplete +array type, +which means it doesn't have a length. +A variable amount of space for the struct can be +.Xr malloc 3 Ap d , +or the struct can be used as +a sort of pointer with fields. +. +.Bd -literal -offset indent +struct Line { + enum Filter type; + uint8_t data[]; +} *line = &png.data[1 + lineSize()]; +.Ed +. +.Ss Anonymous struct and union fields (C11) +Members of structs or unions +which are themselves structs or unions +can be unnamed. +In that case, +each of the inner fields +is treated as a member of the outer struct or union. +This makes working with tagged unions nicer. +. +.Bd -literal -offset indent +struct Message { + enum { Foo, Bar } type; + union { + uint8_t foo; + uint32_t bar; + }; +} msg = { .type = Foo, .foo = 0xFF }; +.Ed +. +.Ss Static assert (C11) +Assertions can be made at compile time. +Most useful for checking sizes of structs. +. +.Bd -literal -offset indent +static_assert(13 == sizeof(struct PNGHeader), "PNG IHDR size"); +.Ed +. +.Ss Leading-break switch +This one is just an odd style choice +I came across that C happens to allow. +To prevent accidental fall-through +in switch statements, +you can put breaks before the case labels. +. +.Bd -literal -offset indent +while (0 < (opt = getopt(argc, argv, "h:w:"))) { + switch (opt) { + break; case 'h': height = optarg; + break; case 'w': width = optarg; + break; default: return EX_USAGE; + } +} +.Ed +. +.Sh AUTHORS +.An Mt june@causal.agency +. +.Pp +This document is produced from +.Xr mdoc 7 +source available from +.Lk https://git.causal.agency/src/tree/www/text.causal.agency +. +.Sh CAVEATS +This isn't meant to be advice. +It's just how I like to write C, +and I don't +.Dq ship +software in C. diff --git a/www/text.causal.agency/004-uloc.7 b/www/text.causal.agency/004-uloc.7 new file mode 100644 index 00000000..edd78d80 --- /dev/null +++ b/www/text.causal.agency/004-uloc.7 @@ -0,0 +1,64 @@ +.Dd December 14, 2018 +.Dt ULOC 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm ULOC +.Nd unique lines of code +. +.Sh DESCRIPTION +There are many tools available +which measure SLOC: source lines of code. +These tools are strangely complex +for what they intend to do, +which is to estimate the relative sizes of projects. +They perform some amount of parsing +in order to discount comments in various languages, +and for reasons unknown each format their ouput +in some oddly encumbered way. +. +.Pp +I propose a much simpler method +of estimating relative sizes of projects: +unique lines of code. +ULOC can be calculated with standard tools as follows: +. +.Bd -literal -offset indent +sort -u *.h *.c | wc -l +.Ed +. +.Pp +In my opinion, +the number this produces +should be a better estimate of +the complexity of a project. +Compared to SLOC, +not only are blank lines discounted, +but so are close-brace lines +and other repetitive code +such as common includes. +On the other hand, +ULOC counts comments, +which require just as much maintenance +as the code around them does, +while avoiding inflating the result +with license headers which appear in every file, +for example. +. +.Pp +It can also be amusing +to read all of your code sorted alphabetically. +. +.Sh AUTHORS +.An Mt june@causal.agency +. +.Pp +This document is produced from +.Xr mdoc 7 +source available from +.Lk https://git.causal.agency/src/tree/www/text.causal.agency +. +.Sh CAVEATS +Estimates such as these +should not be used for decision making +as if they were data. diff --git a/www/text.causal.agency/005-testing-c.7 b/www/text.causal.agency/005-testing-c.7 new file mode 100644 index 00000000..d0c636ff --- /dev/null +++ b/www/text.causal.agency/005-testing-c.7 @@ -0,0 +1,73 @@ +.Dd December 21, 2018 +.Dt TESTING-C 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Testing C +.Nd a simple unit testing setup +. +.Sh DESCRIPTION +This is a simple approach +to unit testing in C +that I've used in a couple projects. +At the bottom of a C file +with some code I want to test, +I add: +. +.Bd -literal -offset indent +#ifdef TEST +#include <assert.h> + +int main(void) { + assert(...); + assert(...); +} + +#endif +.Ed +. +.Pp +This file normally produces a +.Pa .o +to be linked into the main binary. +For testing, +I produce separate binaries +and run them with +.Xr make 1 : +. +.Bd -literal -offset indent +TESTS = foo.t bar.t + +\&.SUFFIXES: .t + +\&.c.t: + $(CC) $(CFLAGS) -DTEST $(LDFLAGS) $< $(LDLIBS) -o $@ + +test: $(TESTS) + set -e; $(TESTS:%=./%;) +.Ed +. +.Pp +Note that the test binaries +aren't linked with the rest of the code, +so there is potential for simple stubbing or mocking. +. +.Pp +To get the best output +from C's simple +.Xr assert 3 , +it's best to assert the result +of a helper function +which takes the expected output +and the test input, +rather than calling +.Xr assert 3 +inside the helper function. +This way, +the message printed by the assert failure +contains a useful line number +and the expected output +rather than just variable names. +. +.Sh AUTHORS +.An Mt june@causal.agency diff --git a/www/text.causal.agency/006-some-libs.7 b/www/text.causal.agency/006-some-libs.7 new file mode 100644 index 00000000..5af65404 --- /dev/null +++ b/www/text.causal.agency/006-some-libs.7 @@ -0,0 +1,96 @@ +.Dd December 11, 2019 +.Dt SOME-LIBS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Some Libraries +.Nd good ones +. +.Sh DESCRIPTION +This is a little list of C libraries +I've had good experiences using. +. +.Bl -tag -width Ds +.It Fl lcurl +The library behind the +.Xr curl 1 +command. +It downloads or uploads things on the internet +through a number of protocols, +not just HTTP. +It has an easy-to-use library API, +appropriately named +.Xr libcurl-easy 3 . +I've used it to implement a +.Lk https://causal.agency/bin/title.html "page title fetcher" . +. +.It Fl lcurses +Okay so this one really isn't great. +Its interfaces can seem archaic +and its documentation is often poor. +However, it gets the job done +and is commonly available pretty much everywhere. +Interesting to note that +.Nx +uses its own implementation of curses +that is not GNU ncurses, +unlike +.Fx . +. +.It Fl ledit +This is a BSD line editing library, +similar to GNU readline. +It supports right-aligned prompts, +which I prefer for variable-length +information in shells. +. +.It Fl lkcgi +A CGI and FastCGI library +for web applications in C. +Don't worry, +it isolates HTTP parsing and input validation +from application logic +in sandboxed processes. +I think it's an excellent example +of how to design an API for C. +I used it to implement the +.Lk https://ascii.town/explore.html "torus web viewer" . +. +.It Fl lsqlite3 +An embedded relational database engine. +It's amazing what you can do with this, +and it's super easy to use! +My one gripe with it is that the library and SQL documentation +are not available as +.Xr man 1 +pages. +I'm currently working on a project using SQLite, +but it hasn't gotten very far yet. +. +.It Fl ltls +This is a new library in LibreSSL +which provides a much simpler interface for TLS sockets +compared to +.Fl lssl . +It's much more like what you'd expect +from other TLS socket wrappers, +with calls like +.Xr tls_connect 3 , +.Xr tls_read 3 +and +.Xr tls_write 3 . +I've used this for IRC clients, bouncers and bots. +. +.It Fl lz +An implementation of the DEFLATE compression algorithm +and gzip format. +It's all documented in comments in +.In zlib.h , +which isn't bad, +but for my own use I copied the docs into +.Lk https://code.causal.agency/june/zlib-man-pages "manual pages" . +I've used this for decoding and encoding PNG images. +.El +. +.Sh AUTHORS +.An June Bug Aq Mt june@causal.agency diff --git a/www/text.causal.agency/007-cgit-setup.7 b/www/text.causal.agency/007-cgit-setup.7 new file mode 100644 index 00000000..44fb436a --- /dev/null +++ b/www/text.causal.agency/007-cgit-setup.7 @@ -0,0 +1,271 @@ +.Dd December 15, 2019 +.Dt CGIT-SETUP 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm cgit setup +.Nd configuration notes +. +.Sh DESCRIPTION +I just set up cgit on +.Lk https://git.causal.agency +to replace an instance of gitea. +After 30 days of uptime, +gitea had accumulated over 11 hours of CPU time +and was using hundreds of megabytes of memory. +cgit is much more lightweight +and much more in line with my aesthetic. +I'm documenting how I set it up here +mostly to remind myself in the future. +. +.Ss slowcgi +cgit is CGI software, +but +.Xr nginx 8 +only supports FastCGI. +I used +.Xr slowcgi 8 +as a compatibility layer +by adding the following to +.Pa /etc/rc.conf : +.Bd -literal -offset indent +slowcgi_enable="YES" +slowcgi_flags="-p / -s /var/run/slowcgi.sock" +.Ed +. +.Ss nginx +I added the following in a new +.Cm server +block to +.Pa /usr/local/etc/nginx/nginx.conf : +.Bd -literal -offset indent +root /usr/local/www/cgit; +location / { + try_files $uri @cgit; +} +location @cgit { + fastcgi_pass unix:/var/run/slowcgi.sock; + fastcgi_param SCRIPT_FILENAME $document_root/cgit.cgi; + fastcgi_param SCRIPT_NAME /; + fastcgi_param PATH_INFO $uri; + fastcgi_param QUERY_STRING $query_string; + fastcgi_param REQUEST_METHOD $request_method; + fastcgi_param CONTENT_TYPE $content_type; + fastcgi_param CONTENT_LENGTH $content_length; + fastcgi_param HTTPS $https if_not_empty; + fastcgi_param SERVER_PORT $server_port; + fastcgi_param SERVER_NAME $server_name; +} +.Ed +. +.Pp +The +.Cm try_files +directive causes +.Xr nginx 8 +to first try to serve static files from +.Pa /usr/local/www/cgit +before passing anything else on to FastCGI. +. +.Pp +The +.Va SCRIPT_FILENAME +parameter tells +.Xr slowcgi 8 +the path of the CGI binary to run. +Setting +.Va SCRIPT_NAME +to +.Pa / +tells cgit its root URL +and avoids it using query strings for everything. +. +.Ss cgit +cgit doesn't provide any configuration to start from, +so you have to just read +.Xr cgitrc 5 . +I added the following to +.Pa /usr/local/etc/cgitrc : +.Bd -literal -offset indent +cache-size=1024 +clone-url=https://$HTTP_HOST/$CGIT_REPO_URL +snapshots=tar.gz zip +remove-suffix=1 +enable-git-config=1 +scan-path=/home/june/pub +.Ed +. +.Pp +The +.Cm cache-size +option enables caching, +which by default is stored in +.Pa /var/cache/cgit , +so I made sure that directory exists +and is writable by the +.Sy www +user. +The +.Cm clone-url +option sets the clone URL to advertise. +cgit will automatically serve git over HTTP. +The +.Cm snapshots +option makes tarballs available for tags and commits. +. +.Pp +The +.Cm scan-path +option causes cgit to scan the given path +for git repositories. +I'm putting mine in +.Pa ~/pub . +The +.Cm remove-suffix +option causes cgit to remove the +.Pa .git +suffix from the URLs it uses +for the repositories it finds, +so that +.Pa ~/pub/pounce.git +is served at +.Pa /pounce . +The +.Cm enable-git-config +option allows controlling some cgit options +from the +.Xr git-config 1 +of each repository. +See +.Sx git +below. +. +.Pp +I also set up a filter to render +.Xr mdoc 7 +files +and do syntax highlighting +by adding the following to +.Pa cgitrc : +.Bd -literal -offset indent +readme=:README.7 +readme=:README +about-filter=/usr/local/libexec/cgit-filter +source-filter=/usr/local/libexec/cgit-filter +.Ed +. +.Pp +The +.Cm readme +options tell cgit which files to look for +to render the +.Dq about +page. +The colon prefix causes it to look for them +in the git tree. +The +.Pa /usr/local/libexec/cgit-filter +script contains the following: +.Bd -literal -offset indent +#!/bin/sh +case "$1" in + (*.[1-9]) + /usr/bin/mandoc -T utf8 | /usr/local/libexec/ttpre + ;; + (*) + exec /usr/local/libexec/hi -t -n "$1" -f html -o anchor + ;; +esac +.Ed +. +.Pp +Filter scripts are run with the filename as their first argument +and the contents of the file on standard input. +The +.Xr ttpre 1 +command is my own utility to convert +.Xr man 1 +output to HTML. +The +.Xr hi 1 +command is my own +.Lk https://causal.agency/bin/hi.html "syntax highlighter" . +. +.Ss git +I create my repositories in +.Pa ~/pub +with +.Ql git init --bare +and use +.Pa git.causal.agency:pub/example.git +locally as the remote. +Descriptions are set by editing the +.Pa description +file in each repository. +The section and homepage can be set with +.Xr git-config 1 +through the keys +.Cm cgit.section +and +.Cm cgit.homepage , +respectively, +thanks to the +.Cm enable-git-config +option above. +. +.Ss Redirects +I added the following to the +.Cm server +block that used to serve gitea in +.Pa nginx.conf : +.Bd -literal -offset indent +location ~* /june/([^.]+)[.]git(.*) { + return 301 https://git.causal.agency/$1$2?$query_string; +} +location ~* /june/([^/]+) { + return 301 https://git.causal.agency/$1; +} +location / { + return 301 https://git.causal.agency; +} +.Ed +. +.Pp +This redirects any links to my gitea repos +to the corresponding repo in cgit. +The first +.Sy location +block also redirects gitea HTTP clone URLs to cgit +so that +.Xr git-pull 1 +continues to work on existing clones. +. +.Ss Update: fast HTTPS clones +Someone pointed out that cloning my repos +over HTTPS was incredibly slow, +and this is because cgit only implements the +.Dq dumb +HTTP git transport. +To speed up cloning, +I send the URLs used by the +.Dq smart +HTTP transport to +.Xr git-http-backend 1 +instead: +.Bd -literal -offset indent +location ~ /.+/(info/refs|git-upload-pack) { + fastcgi_pass unix:/var/run/slowcgi.sock; + fastcgi_param SCRIPT_NAME /usr/local/libexec/git-core/git-http-backend; + fastcgi_param GIT_HTTP_EXPORT_ALL 1; + fastcgi_param GIT_PROJECT_ROOT /home/june/pub; + include fastcgi_params; +} +.Ed +. +.Pp +I factored out the FastCGI parameters +I'm using with cgit +to be included here as well. +. +.Sh AUTHORS +.An June Bug Aq Mt june@causal.agency diff --git a/www/text.causal.agency/008-how-irc.7 b/www/text.causal.agency/008-how-irc.7 new file mode 100644 index 00000000..aba1bbf9 --- /dev/null +++ b/www/text.causal.agency/008-how-irc.7 @@ -0,0 +1,193 @@ +.Dd March 8, 2020 +.Dt HOW-IRC 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm How I Relay Chat +.Nd in code +. +.Sh DESCRIPTION +I've been writing a lot of IRC software lately +.Pq Sx SEE ALSO , +and developed some nice code patterns +that I've been reusing. +Here they are. +. +.Ss Parsing +I use fixed size buffers almost everywhere, +so it's necessary to know IRC's size limits. +A traditional IRC message is a maximum of 512 bytes, +but the IRCv3 message-tags spec adds +(unreasonably, in my opinion) +8191 bytes for tags. +IRC messages also have a maximum of 15 command parameters. +.Bd -literal -offset indent +enum { MessageCap = 8191 + 512 }; +enum { ParamCap = 15 }; +.Ed +. +.Pp +If I'm using tags, +I'll use X macros +to declare the set I care about. +X macros are a way of maintaining parallel arrays, +or in this case an enum and an array. +.Bd -literal -offset indent +#define ENUM_TAG \e + X("msgid", TagMsgid) \e + X("time", TagTime) + +enum Tag { +#define X(name, id) id, + ENUM_TAG +#undef X + TagCap, +}; + +static const char *TagNames[TagCap] = { +#define X(name, id) [id] = name, + ENUM_TAG +#undef X +}; +.Ed +. +.Pp +The TagNames array is used by the parsing function +to assign tag values into the message structure, +which looks like this: +.Bd -literal -offset indent +struct Message { + char *tags[TagCap]; + char *nick; + char *user; + char *host; + char *cmd; + char *params[ParamCap]; +}; +.Ed +. +.Pp +I'm a fan of using +.Xr strsep 3 +for simple parsing. +Although it modifies its input +(replacing delimiters with NUL terminators), +since the raw message is in a static buffer, +it is ideal for so-called zero-copy parsing. +I'm not going to include the whole parsing function here, +but I will at least include the part that many get wrong, +which is dealing with the colon-prefixed trailing parameter: +.Bd -literal -offset indent +msg.cmd = strsep(&line, " "); +for (int i = 0; line && i < ParamCap; ++i) { + if (line[0] == ':') { + msg.params[i] = &line[1]; + break; + } + msg.params[i] = strsep(&line, " "); +} +.Ed +. +.Ss Handling +To handle IRC commands and replies +I add handler functions to a big array. +I usually have some form of helper as well +to check the number of expected parameters. +.Bd -literal -offset indent +typedef void HandlerFn(struct Message *msg); + +static const struct Handler { + const char *cmd; + HandlerFn *fn; +} Handlers[] = { + { "001", handleReplyWelcome }, + { "PING", handlePing }, + { "PRIVMSG", handlePrivmsg }, +}; +.Ed +. +.Pp +Since I keep these arrays sorted anyway, +I started using the standard +.Xr bsearch 3 +function, +but a basic for loop probably works just as well. +I do wish I could compile-time assert +that the array really is sorted, though. +.Bd -literal -offset indent +static int compar(const void *cmd, const void *_handler) { + const struct Handler *handler = _handler; + return strcmp(cmd, handler->cmd); +} + +void handle(struct Message msg) { + if (!msg.cmd) return; + const struct Handler *handler = bsearch( + msg.cmd, + Handlers, ARRAY_LEN(Handlers), + sizeof(*handler), compar + ); + if (handler) handler->fn(&msg); +} +.Ed +. +.Ss Capabilities +For IRCv3 capabilties +I use X macros again, +this time with another handy macro +for declaring bit flag enums. +.Bd -literal -offset indent +#define BIT(x) x##Bit, x = 1 << x##Bit, x##Bit_ = x##Bit + +#define ENUM_CAP \e + X("message-tags", CapMessageTags) \e + X("sasl", CapSASL) \e + X("server-time", CapServerTime) + +enum Cap { +#define X(name, id) BIT(id), + ENUM_CAP +#undef X +}; + +static const char *CapNames[] = { +#define X(name, id) [id##Bit] = name, + ENUM_CAP +#undef X +}; +.Ed +. +.Pp +The +.Fn BIT +macro declares, for example, +.Dv CapSASL +as the bit flag and +.Dv CapSASLBit +as the corresponding index. +The +.Vt "enum Cap" +is used as a set, +for example checking if SASL is enabled with +.Ql caps & CapSASL . +. +.Pp +These patterns are serving my IRC software well, +and my IRC projects are serving me well. +It is immensely satisfying +to be (near) constantly using software +that I wrote myself and am happy with, +regardless of how niche it may be. +. +.Sh SEE ALSO +.Bl -item -compact +.It +.Lk https://git.causal.agency/pounce/about "IRC bouncer" +.It +.Lk https://git.causal.agency/litterbox/about "IRC logger" +.It +.Lk https://git.causal.agency/catgirl/about "IRC client" +.El +. +.Sh AUTHORS +.An June Bug Aq Mt june@causal.agency diff --git a/www/text.causal.agency/009-casual-update.7 b/www/text.causal.agency/009-casual-update.7 new file mode 100644 index 00000000..0548436a --- /dev/null +++ b/www/text.causal.agency/009-casual-update.7 @@ -0,0 +1,127 @@ +.Dd May 6, 2020 +.Dt CASUAL-UPDATE 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm casual update +.Nd software developments +. +.Sh DESCRIPTION +I've been figuring out more of IMAP +and Internet Messages in general +while working on a new project +so I've revisited some older ones. +I've copied my somewhat more proper +IMAP parsing code into them, +so they should be more robust. +. +.Pp +.Xr imbox 1 +is my tool to export messages +in mboxrd format directly from IMAP. +It's mostly for applying patches sent by email +without having any kind of local mail setup. +For that, +it includes the +.Xr git-fetch-email 1 +wrapper which works very similarly to +.Xr git-send-email 1 . +I learned by reading the source of +.Xr git-subtree 1 +that +.Xr git-rev-parse 1 +can be used by shell scripts +to parse long options, +so I added those. +I also added the +.Fl Fl apply +flag to automatically pipe to +.Xr git-am 1 +with the right flags for mboxrd. +. +.Pp +.Xr notemap 1 +is a tool for mirroring text files +to an IMAP Notes mailbox, +which is used by FastMail's web UI +and the macOS/iOS Notes app. +Its original parsing code +was particularly ad-hoc. +Since I've now learned +how UTF-8 headers are encoded, +I updated it to properly encode +the file name in the Subject line. +. +.Pp +I also got distracted by +a conversation about UNIX-domain sockets +where I was comparing the macOS and FreeBSD +.Xr unix 4 +pages and the Linux +.Xr unix 7 +page. +This lead me to make +.Xr exman 1 , +a tool to locally install and read +manual pages for Linux, POSIX, +.Fx , +.Nx +and +.Ox . +I've already gotten quite a bit of use out of it. +. +.Pp +In yet another IRC distraction, +I was talking about some further plans for my IRC software, +and realized it might be time to write +my future projects list down. +I opened a +.Pa .plan +file, +immediately wondered how anyone can write plain text, +then switched to a +.Pa plan.7 +file. +There's nothing I won't use +.Xr mdoc 7 +for. +After a little setup, +I can now be fingered, +and make jokes about this silly little protocol +from the days of old. +.Xr finger 1 Ap s +default output fills me with joy: +.Bd -unfilled -offset indent +No Mail. +No Plan. +.Ed +. +.Pp +And speaking of IRC and plans, +I've been meaning to tag +.Xr catgirl 1 +version 1.0 for a while now. +I've been using it as my main client +and my commits to it have really slowed down. +When I do tag it, +I'm planning on writing another post +about my whole +.Dq suite +of IRC software +and how the parts work together. +Watch this space. +. +.Sh SEE ALSO +.Bl -item -compact +.It +.Lk https://git.causal.agency/imbox "imbox" +.It +.Lk https://git.causal.agency/notemap "notemap" +.It +.Lk https://git.causal.agency/exman "exman" +.It +.Lk https://git.causal.agency/catgirl "catgirl" +.El +. +.Sh AUTHORS +.An June Bug Aq Mt june@causal.agency diff --git a/www/text.causal.agency/010-irc-suite.7 b/www/text.causal.agency/010-irc-suite.7 new file mode 100644 index 00000000..b54adf3d --- /dev/null +++ b/www/text.causal.agency/010-irc-suite.7 @@ -0,0 +1,409 @@ +.Dd June 19, 2020 +.Dt IRC-SUITE 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm IRC suite +.Nd my own IRC software +. +.Sh DESCRIPTION +Over the past months +.Po +eight of them, according to +.Xr git-log 1 +.Pc +I developed a new +.Dq suite +of IRC software +that I now use full-time, +consisting of a bouncer, +a new logging and search solution, +and a terminal client. +These new programs share some characteristics: +they are all TLS-only +and use the libtls API from LibreSSL, +they can all be entirely configured from the command line +or with equivalent configuration files, +they are all designed as +a one process to one IRC connection mapping, +and they all take advantage of IRCv3 features. +. +.Pp +For context, +I was previously running +the znc IRC bouncer +and using the Textual IRC client +with its plain text logs. +I also continue to use +the Palaver IRC client for iOS. +. +.Ss Background +A bouncer is a piece of server software +that stays connected to IRC at all times +and acts as a relay +between your client and the IRC server. +When the client is disconnected, +the bouncer buffers incoming messages +to send to the client when it reconnects. +. +.Pp +Aside from this, +bouncers have another advantage: +client multiplexing. +Several clients, +for instance on different computers +or a phone, +should be able to connect to the same bouncer, +and send and receive messages under the same nick. +Unfortunately, +znc does not handle this use-case well at all. +Out of the box it offers two options: +either any client connection totally clears the buffer, +causing other clients to miss chat history; +or the buffer is never cleared, +causing every client connection +to be repeatedly spammed with redundant history. +There is also a znc wiki page +that suggests one way to solve this issue +is to connect znc to itself multiple times over. +Yikes. +. +.Ss pounce +My dissatisfaction with +connecting multiple clients to znc +directly motivated me to start working +on a new multi-client-focused IRC bouncer. +The result is +.Xr pounce 1 , +based on a rather straightforward +single-producer (the IRC server) +multiple-consumer (each IRC client) +ring buffer. +Each client has its own +independent position in the buffer +so can properly be brought up to date +whenever it connects. +. +.Pp +Additionally, +by assuming support for the IRCv3 +.Sy server-time +extension, +all IRC events can be accurately +relayed to clients at any time, +and the internals of +.Xr pounce 1 +can be kept very simple. +In fact, +it completely avoids parsing most IRC messages, +simply pushing them into the buffer +with an associated timestamp. +. +.Pp +The usernames sent by clients during registration +are used as opaque identifiers for buffer consumers. +This was chosen since most clients +can be configured to send an arbitrary username, +and those that don't often default +to the name of the client itself, +making it an appropriate identifier. +. +.Pp +Later, +I added a way for clients +to be informed of their own buffer positions +using a vendor-specific IRCv3 capability. +This means a client +can save the position +of the last message it actually received, +and request to set its position +when it reconnects, +ensuring no messages are lost +to network issues +or software crashes. +. +.Ss calico +Due to the simple design of mapping +one process to one IRC (server) connection, +it is necessary to run several instances of +.Xr pounce 1 . +Initially I simply used different ports for each, +but as I connected to more networks +and even ran some instances for friends, +it became less feasible. +. +.Pp +The solution I came up with +was to dispatch incoming connections +using Server Name Indication, or SNI. +This way, +multiple domains pointing to the same host +could be used with only one port +to connect to different instances of +.Xr pounce 1 . +For example, +I use a +.Li *.irc.causal.agency +wildcard DNS entry +and a subdomain for each IRC network, +all on port 6697. +. +.Pp +The +.Xr calico 1 +daemon included with pounce +accomplishes this dispatch +using the +.Dv MSG_PEEK +flag of +.Xr recvmsg(2) +on incoming connections. +Since SNI is immediately sent by TLS clients +as part of the ClientHello message in clear-text, +it can be processed +without doing any actual TLS. +The connection itself is then +sent to the corresponding +.Xr pounce 1 +instance +over UNIX-domain socket, +which handles TLS as normal. +This means that +.Xr calico 1 +and +.Xr pounce 1 +operate entirely independently of each other. +. +.Ss litterbox +Based on the multiple-consumer ring buffer design, +I realized it would be easy +to implement additional functionality +as independent purpose-built clients +which connect to +.Xr pounce 1 +alongside regular clients. +This could allow dedicated OTR or DCC software +to operate in parallel with a basic client, +or for more passive software +to provide notifications +or dedicated logging. +. +.Pp +For the latter, +I wanted to do better than +plain text log files. +.Xr grep 1 +over files works fine, +but search could be faster and smarter, +and the text format is +more lossy and less structured +than I'd like it to be. +Conveniently, +SQLite provides an extension +(actually two) +for full-text search. +. +.Pp +The litterbox project +is my dedicated logging solution +using SQLite FTS5. +It consists of three tools: +the +.Xr litterbox 1 +daemon itself which connects to pounce +and logs messages to SQLite, +the +.Xr scoop 1 +command line query tool, +and the +.Xr unscoop 1 +plain text import tool. +The +.Xr scoop 1 +tool constructs SQL queries +and formats the results for viewing, +with coloured nicks +and piped to a pager +by default. +. +.Pp +The +.Xr litterbox 1 +daemon +can also provide a simple +.Dq online +.Pq over IRC +search query interface +to other connected clients. +The simplest way to allow different +.Xr pounce 1 +clients to talk to each other +was to route private messages to self +internally without sending them to the IRC server. +So from any client +I can simply message myself +a full-text search query +and +.Xr litterbox 1 +responds with the results. +. +.Pp +Along with routing self-messages, +.Xr pounce 1 +also provides a vendor-specific IRCv3 capability +for passive clients such as +.Xr litterbox 1 +to indicate that they should not influence +the automatic away status, +which is normally only set +when no clients are connected. +. +.Pp +An advantage of this architecture +of dedicated clients +rather than bouncer modules +is that they need not run +on the same host. +I run my bouncers on a VPS, +but I'd rather not store my private logs there, +so +.Xr litterbox 1 +runs instead on a Raspberry Pi +in my apartment. +Also, +since it is essentially +just a regular IRC bot, +it could be used independently +for keeping public logs for a channel. +. +.Ss catgirl +There's not really that much to say +about the client, +.Xr catgirl 1 . +Of the three projects +it contains the most code +but is also the least interesting, +in my opinion. +It just does what I want a client to do, +and gets the details right. +. +.Pp +Tab complete is ordered by most recently seen or used, +and completing several nicks +inserts commas between them +as well as the colon following the final nick. +In the input line, +the prompt is updated +to reflect whether the input +will be interpreted as a command or as a message. +Messages are automatically scanned for URLs, +which can be opened or copied with commands +specifying the nick or a substring of the URL. +. +.Pp +Scrolling in a window creates a split view, +keeping the latest messages visible. +Nick colours are based instead on usernames, +keeping them more stable across renames, +and mentions in messages are coloured +to make the conversation easier to follow. +The visibility of ignored messages +can be toggled at any time. +Channels can be muted +so their activity is hidden +from the status line +unless you are pinged. +. +.Pp +.Xr catgirl 1 +is configured entirely on the command line +or in equivalent simple configuration files. +There's no dynamic manipulation of state +using complex +.Ql / +commands like in some other clients. +. +.Pp +The major caveat is that +.Xr catgirl 1 +connects to only one network at a time. +This keeps the configuration, the interface +and the code much simpler. +.Xr tmux 1 , +.Xr screen 1 +or a tabbed terminal emulator +are good options to run several instances. +. +.Pp +If you're interested in giving +.Xr catgirl 1 +a quick (and necessarily limited) try, +you can +.Li ssh chat@ascii.town . +. +.Ss Future +I think I'm done with IRC software for now. +As mentioned above, +there are a few more pieces +that could fit in to this setup, +but I don't really want or need them right now. +One thing I definitely want to try +at some point +is adding a litterbox component +to index the contents of URLs +to make finding previously shared links easier. +. +.Pp +If you try any of this software +and have feedback, +let me know in +.Li #ascii.town +on freenode +or by email. +And of course, +patches are always welcome. +. +.Ss Update: scooper +Somehow I had the motivation +to create a web interface for litterbox: +.Xr scooper 1 . +It can be used either as CGI +or as a FastCGI worker, +and I used the excellent +.Xr kcgi 3 +library for it. +. +.Pp +The main advantage of this interface +is that you can click on a search result +to be brought to its context in the log viewer. +I also added an option to +.Xr litterbox 1 +to provide a corresponding scooper link +in response to its query interface. +. +.Pp +A small demo of scooper is hosted at +.Aq Lk "https://causal.agency/scooper/" . +It publicly logs the +.Li #litterbox +channel on freenode. +. +.Sh SEE ALSO +.Bl -item -compact +.It +.Lk "https://git.causal.agency/pounce" pounce +.It +.Lk "https://git.causal.agency/litterbox" litterbox +.It +.Lk "https://git.causal.agency/catgirl" catgirl +.It +.Lk "https://www.sqlite.org/fts5.html" "SQLite FTS5 Extension" +.It +.Lk "https://git.causal.agency/scooper" scooper +.It +.Lk "https://kristaps.bsd.lv/kcgi/" kcgi +.El +. +.Sh AUTHORS +.An June Bug Aq Mt june@causal.agency diff --git a/www/text.causal.agency/011-libretls.7 b/www/text.causal.agency/011-libretls.7 new file mode 100644 index 00000000..c29c325e --- /dev/null +++ b/www/text.causal.agency/011-libretls.7 @@ -0,0 +1,220 @@ +.Dd August 9, 2020 +.Dt LIBRETLS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm LibreTLS +.Nd libtls for OpenSSL +. +.Sh DESCRIPTION +This is a sort of announcement post about LibreTLS, +my port of libtls from LibreSSL to OpenSSL. +If you've wanted to try any of my software +but have been unable to because of LibreSSL, +LibreTLS is an option that will likely work for you. +I'm including instructions +for building it and my IRC software +on Debian as an example, +since manually installing libraries +is less straightforward than it could be. +. +.Pp +libtls is +.Do +a new TLS library, +designed to make it easier to write foolproof applications +.Dc . +It was developed as part of LibreSSL, +.Ox Ap s +fork of OpenSSL, +and is implemented against their version of libssl. +It provides a nice high-level API +for TLS sockets, +with functions like +.Xr tls_connect 3 , +.Xr tls_read 3 +and +.Xr tls_write 3 . +This is a vast improvement over libssl's +confusing mess of an API! +Its relative obscurity is a real shame +for C programmers. +. +.Pp +An obvious cause of its obscurity +is that it is tied to LibreSSL. +Although LibreSSL is available +for platforms other than +.Ox , +it conflicts with OpenSSL +so is difficult to install alongside it +and is often not packaged at all. +Additionally, +even if a user manually installs LibreSSL, +libtls is likely not to work on some distros +due to its hardcoded CA bundle file path. +. +.Pp +Since libtls is implemented against libssl, +which originates in OpenSSL, +it should be possible to use libtls with it. +This is what I set out to do in LibreTLS. +I started by importing the sources +from a LibreSSL-portable release, +then worked on porting the portions +that were incompatible with OpenSSL. +. +.Pp +The simpler changes just involved +replacing internal struct field accesses +with public APIs. +libtls accesses libssl internals +using a hack to get the header files +to declare private struct fields, +and for basically no reason. +The bigger changes involved +reimplementing some functions +which only exist in LibreSSL, +but these were still quite small. +I also imported the necessary compatibility functions +from LibreSSL's libcrypto +and adapated the autotools build files +to produce only a libtls +which depends on OpenSSL. +. +.Pp +Along the way +I decided to make one small behavioural change +in order for LibreTLS to be more likely +to work for everyone. +I removed the hardcoded CA file path +and changed the default configuration +to use OpenSSL's default CA paths, +which include a CA directory. +This seems to be the preferred CA source +on systems such as Debian, +where the default CA file path doesn't exist. +. +.Pp +I think the reason LibreSSL +wants to avoid using a CA directory +is so that it can fully load the CA file +once before being sandboxed. +However, +using OpenSSL's default configuration, +the CA file will still be loaded immediately +if it exists. +If it doesn't exist, +sandboxed applications +will fail when trying to +load certificates from the directory, +but unsandboxed applications +will work just fine. +Since LibreSSL's libtls +would fail either way, +I think the new behaviour +is an improvement. +. +.Pp +Another advantage of separating libtls from LibreSSL +is that it is unencumbered by OpenSSL's +awkward double-license, +both of which are incompatible with the GPL. +libtls is all new ISC-licensed code, +and future versions of OpenSSL (3.0) +will be released under the Apache 2.0 license, +which is compatible with GPLv3. +In the future, +GPL software will be able to link with +libtls and OpenSSL without additional permissions. +. +.Pp +It's also worth noting that LibreSSL +likely will not be able to import any code +from future versions of OpenSSL, +since Apache 2.0 is on +.Ox Ap s +license shitlist. +LLVM is also slowly changing their license +to Apache 2.0, +so it'll be interesting to see what +.Ox +does. +. +.Ss Installing Manually +To install LibreTLS on Debian, +for example, +fetch a release tarball from +.Lk https://causal.agency/libretls/ +and install the build dependencies: +.Bd -literal -offset indent +sudo apt-get install build-essential libssl-dev pkgconf +.Ed +. +.Pp +.Xr pkgconf 1 +isn't a dependency of LibreTLS itself, +but it's how my software +configures its build +for a dependency on libtls. +The usual build steps +will install the library: +.Bd -literal -offset indent +\&./configure +make all +sudo make install +.Ed +. +.Pp +The library will be installed in +.Pa /usr/local/lib +by default, +and you need to make sure +the dynamic linker +will be able to find it there. +On Debian, +.Pa /usr/local/lib +already appears in +.Pa /etc/ld.so.conf.d/libc.conf , +but on other systems +you'll probably need to add it to either +.Pa /etc/ld.so.conf +or a new file such as +.Pa /etc/ld.so.conf.d/local.conf . +Once the library is installed +and the path is configured, +the linker cache needs to be refreshed: +.Bd -literal -offset indent +sudo ldconfig +.Ed +. +.Pp +You'll probably also need to set +.Ev PKG_CONFIG_PATH +for the configure scripts +of my software: +.Bd -literal -offset indent +PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure +.Ed +. +.Pp +On +.Fx , +LibreTLS and some of my IRC software +can be installed from my own +.Lk https://git.causal.agency/ports/ "ports tree" +. +.Sh SEE ALSO +.Bl -item -compact +.It +.Lk https://git.causal.agency/libretls/about LibreTLS +.It +.Lk https://man.openbsd.org/tls_init.3 "libtls API documentation" +.El +. +.Pp +Another alternative libtls implementation, +.Lk https://sr.ht/~mcf/libtls-bearssl/ "libtls-bearssl" +. +.Sh AUTHORS +.An June Bug Aq Mt june@causal.agency diff --git a/www/text.causal.agency/012-inability.7 b/www/text.causal.agency/012-inability.7 new file mode 100644 index 00000000..d352143b --- /dev/null +++ b/www/text.causal.agency/012-inability.7 @@ -0,0 +1,39 @@ +.Dd November 26, 2020 +.Dt INABILITY 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm Inability +.Nd losing the ability to create +. +.Sh DESCRIPTION +For often weeks, sometimes months at a time, +I lose the ability to write new code. +I can still make fixes +and little cleanups +in my existing projects, +but if I try to work on something new, +nothing happens. +I can't get anything done. +. +.Pp +I think it's now been +over 3 months +since I've created anything. +I don't know what to do about it. +In the past I've eventually +regained the ability to code, +but it's unclear to me how or why. +I also don't know what +I should be doing instead. +Writing code is the only hobby +I've ever really developed, +so without it I basically +don't do anything. +. +.Pp +Does this happen to anyone else? +How do you cope? +. +.Sh AUTHORS +.Mt june@causal.agency diff --git a/www/text.causal.agency/013-hot-tips.7 b/www/text.causal.agency/013-hot-tips.7 new file mode 100644 index 00000000..63b6e353 --- /dev/null +++ b/www/text.causal.agency/013-hot-tips.7 @@ -0,0 +1,156 @@ +.Dd December 2, 2020 +.Dt HOT-TIPS 7 +.Os "Causal Agency" +. +.Sh NAME +.Nm hot tips +.Nd from my files +. +.Sh DESCRIPTION +This is a short list of tips +from my configuration files and code +that might be useful. +. +.Ss Shell +.Bl -tag -width Ds +.It CDPATH=:~ +This is useful if you sometimes type, +for example, +.Ql cd src/bin +wanting to go to +.Pa ~/src/bin +but you aren't in +.Pa ~ . +If the path doesn't exist +in the current directory, +.Ic cd +will try it in +.Pa ~ +as well. +. +.It alias ls='LC_COLLATE=C ls' +This makes it so that +.Xr ls 1 +lists files in ASCIIbetical order, +which puts capitalized names like +.Pa README +and +.Pa Makefile +first. +. +.It git config --global commit.verbose true +Not shell but close enough. +This makes it so the entire diff is shown +below the usual summary +in the editor for a +.Xr git-commit(1) +message. +Useful for doing a quick review +of what you're committing. +.El +. +.Ss (neo)vim +.Bl -tag -width Ds +.It set inccommand=nosplit +This is the only +.Xr nvim 1 +feature I really care about +aside from the improved defaults. +This provides a live preview of what a +.Ic :s +substitution command will do. +It makes it much easier to +write complex substitutions. +. +.It nmap <leader>s vip:sort<CR> +This mapping sorts the lines of a paragraph, +or block of text separated by blank lines. +I use this a lot to sort +#include directives. +. +.It nmap <leader>S $vi{:sort<CR> +Similar to the last mapping, +this one sorts lines inside braces. +I use this to sort +switch statement cases +or array initializers. +. +.It nmap <leader>a m':0/^#include <<CR>:nohlsearch<CR>O#include < +I use this mapping to add new +#include directives, +usually followed by +.Ic <leader>s +and +.Ic '' +to sort them +and return to where I was. +. +.It nmap <leader>d :0delete<CR>:0read !date +'.Dd \e%B \e%e, \e%Y'<CR> +I use this to replace the first line of +.Xr mdoc 7 +files with the current date. +.El +. +.Ss C +.Bl -tag -width Ds +.It #define Q(...) #__VA_ARGS__ +This is what I've started using +to quote things like SQL statements +or HTML fragments in C. +Anything that happens to be valid C tokens, +which is most code, +can be quoted this way. +Macros are not expanded +inside the quoted part. +You can embed (matched) quotes +without having to escape them. +Whitespace gets collapsed, +so you can write nicely formatted multi-line SQL +that doesn't mess up your debug logging, +for example. +.Bd -literal -offset indent +const char *sql = Q( + INSERT OR IGNORE INTO names (nick, user, host) + VALUES (:nick, :user, :host); +); +.Ed +. +.It #define BIT(x) x##Bit, x = 1 << x##Bit, x##Bit_ = x##Bit +I use this macro to declare bitflag enums. +It takes advantage of +auto-incrementing enum items +so you don't need to set the values manually. +You also get constants +for both the bit index +and the flag value +for each item. +.Bd -literal -offset indent +enum Attr { + BIT(Bold), + BIT(Reverse), + BIT(Italic), + BIT(Underline), +}; +.Ed +.Pp +For example, +defines +.Sy ItalicBit = 2 +and +.Sy Italic = 1 << 2 . +Ignore the extraneous constants. +. +.It typedef int FnType(const char *str, size_t len); +You can just typedef function types! +It annoys me more than it probably should +that everyone writes ugly +function pointer typedefs. +Just stick +.Sy typedef +on the front of a function declaration +and use +.Vt FnType * . +.El +. +.Sh AUTHORS +.Mt june@causal.agency diff --git a/www/text.causal.agency/Makefile b/www/text.causal.agency/Makefile new file mode 100644 index 00000000..6a8fcc87 --- /dev/null +++ b/www/text.causal.agency/Makefile @@ -0,0 +1,31 @@ +WEBROOT = /usr/local/www/text.causal.agency + +TXTS += 001-make.txt +TXTS += 002-writing-mdoc.txt +TXTS += 003-pleasant-c.txt +TXTS += 004-uloc.txt +TXTS += 005-testing-c.txt +TXTS += 006-some-libs.txt +TXTS += 007-cgit-setup.txt +TXTS += 008-how-irc.txt +TXTS += 009-casual-update.txt +TXTS += 010-irc-suite.txt +TXTS += 011-libretls.txt +TXTS += 012-inability.txt +TXTS += 013-hot-tips.txt + +all: ${TXTS} + +.SUFFIXES: .7 .txt + +.7.txt: + mandoc -T utf8 $< | col -bx > $@ + +feed.atom: feed.sh ${TXTS} + sh feed.sh > feed.atom + +clean: + rm -f ${TXTS} feed.atom + +install: ${TXTS} feed.atom + install -p -m 644 ${TXTS} feed.atom ${WEBROOT} diff --git a/www/text.causal.agency/feed.sh b/www/text.causal.agency/feed.sh new file mode 100644 index 00000000..fe028621 --- /dev/null +++ b/www/text.causal.agency/feed.sh @@ -0,0 +1,55 @@ +#!/bin/sh +set -eu + +readonly Root='https://text.causal.agency' + +updated=$(date -u '+%FT%TZ') +cat <<-EOF + <?xml version="1.0" encoding="utf-8"?> + <feed xmlns="http://www.w3.org/2005/Atom"> + <title>Causal Agency</title> + <author><name>June</name><email>june@causal.agency</email></author> + <link href="${Root}"/> + <link rel="self" href="${Root}/feed.atom"/> + <id>${Root}/</id> + <updated>${updated}</updated> +EOF + +encode() { + sed ' + s/&/\&/g + s/</\</g + s/"/\"/g + ' "$@" +} + +for entry in *.7; do + txt="${entry%.7}.txt" + date=$(grep '^[.]Dd' "$entry" | cut -c 5-) + title=$(grep '^[.]Nm' "$entry" | cut -c 5- | encode) + summary=$(grep '^[.]Nd' "$entry" | cut -c 5- | encode) + published=$(date -ju -f '%B %d, %Y %T' "${date} 00:00:00" '+%FT%TZ') + mtime=$(stat -f '%m' "$entry") + updated=$(date -ju -f '%s' "$mtime" '+%FT%TZ') + cat <<-EOF + <entry> + <title>${title}</title> + <summary>${summary}</summary> + <link href="${Root}/${txt}"/> + <id>${Root}/${txt}</id> + <published>${published}</published> + <updated>${updated}</updated> + <content type="xhtml"> + <div xmlns="http://www.w3.org/1999/xhtml"> + EOF + printf '<pre>' + encode "$txt" + cat <<-EOF + </pre> + </div> + </content> + </entry> + EOF +done + +echo '</feed>' |