Compare commits

...

72 commits

Author SHA1 Message Date
b702c3d044 mcai capture count 2025-01-12 19:53:31 -05:00
efec4e2ce4 name-color: look in as 2024-07-25 23:53:48 -04:00
55e4eeead6 name-color: example 2024-07-11 18:39:36 -04:00
7d44140b45 name-color: even better at finding names now 2024-07-11 17:37:00 -04:00
3a408b712b name-color: nuclear option: remove /* and */ 2024-07-11 13:57:00 -04:00
3fc2687d28 name-color: color in href + a tiny bit less brittle 2024-07-11 13:42:31 -04:00
6766bf064d even more case-insensitivity
what is this? common lisp? laugh track
2024-07-11 03:03:46 -04:00
e76a6e1ca6 take first line, downcase names, insensitive matching 2024-07-11 02:32:55 -04:00
54aaa6086e name-color: shore up one of the last vulns 2024-07-11 02:25:30 -04:00
80e4087673 name-color: fix customized list 2024-07-11 01:29:24 -04:00
4937ee3db4 name-color sort names 2024-07-11 01:21:42 -04:00
b1d91c155b name-color increase max color length 2024-07-11 01:17:02 -04:00
91d1a50ae8 name-color FIX PLZ WORK 2024-07-11 01:12:25 -04:00
64d2a72ffa name-color promo 2024-07-10 22:58:52 -04:00
6c258acf1f name-color 0.2 (+ initial doit for less TTNC)
(Time To Name Coloring)
2024-07-10 19:52:15 -04:00
7b0744bfe3 name-color 0.2 (- debug oops) 2024-07-10 19:51:24 -04:00
31ca660bfc name-color 0.2 2024-07-10 19:50:07 -04:00
1ea851d35d name-color, honestly it WORKS :D 2024-07-10 17:15:21 -04:00
1f8da909fd name-color serverside gens css :D 2024-07-10 16:03:16 -04:00
7e9f022a72 name-color serverside looks good :D 2024-07-10 15:41:21 -04:00
76bd66836b optical illusion :O 2024-07-09 00:00:38 -04:00
3dd5b1b9cc fix: hs2 last update page count 2024-06-12 19:59:50 -04:00
408f714624 hash-fun: wip 2024-06-01 15:04:58 -04:00
3017b3b00b artist alley json dump 2024-04-26 20:30:46 -04:00
b58e27309c nested cws: trade select for wrap 2024-04-14 18:28:33 -04:00
308cbc5d49 nested cws: done! 2024-04-14 00:02:29 -04:00
9e8a9089f6 serverside support for prngsentences 2024-03-24 20:34:58 -04:00
682bcbff79 randchar: try and fail to fix spacing 2024-02-24 23:28:37 -05:00
aacb1b001d randchar: what the heck, done enough 2024-02-24 23:24:19 -05:00
2b17821838 randchar: looking really nice 2024-02-24 22:39:17 -05:00
43ccde935c randchar: a fun start 2024-02-24 20:40:21 -05:00
c20b22513c fetched: add logs because people reference the num 2024-02-21 23:10:31 -05:00
c61b542993 mortality: peek behind the curtain 2024-02-21 22:29:47 -05:00
0ddc8b12de tumblr: dark mode fix again 2024-02-20 23:43:29 -05:00
70a15c6083 tumblr: link to draft. idk 2024-02-20 22:10:36 -05:00
309a35665a tumblr: eh, done enough 2024-02-20 22:04:25 -05:00
c43993cd5e one-post: dark-mode durability, not responsive 2024-02-20 20:29:35 -05:00
9d57a22090 update to query hs2's new, more semantic html 2024-02-10 18:51:17 -05:00
889215500c meme: DONE ENOUGH. THIS POST SUCKS BUT IS GREAT 2024-01-27 23:26:12 -05:00
00ca44e063 meme: path set 2024-01-27 22:22:43 -05:00
6be9926241 gameboy: DONE ENOUGH 2024-01-04 22:35:23 -05:00
845bd49e69 gameboy: colors i'm happy with 2024-01-04 22:23:08 -05:00
6690f109fc gameboy: screen working nicely. now frame 2024-01-04 21:31:57 -05:00
0036c6e7d1 jekyll: read more abuse apology 2023-12-30 02:46:30 -05:00
cd258feafb jekyll: DONE AWESOME 2023-12-30 02:44:39 -05:00
ac108eaa77 moby dick -> hyde 2023-12-30 01:39:37 -05:00
eb7d97ee08 crash: bleh; DONE ENOUGH 2023-12-02 23:38:16 -05:00
506621895b crash: almost done; cool bug 2023-12-02 23:29:11 -05:00
81e8faff98 crash: let's just not do 3d 2023-12-02 23:06:31 -05:00
74c4cdf033 crash: cool freeze thing 2023-12-02 22:35:52 -05:00
c37c425a8e oh deer 2023-11-28 01:50:46 -05:00
17fc36aab5 emojis: honestly not bad 2023-11-28 01:12:14 -05:00
f66fe1543c cycle: add credit 2023-11-28 00:37:12 -05:00
1674fb2de1 cycle: somewhat tractable 2023-11-28 00:32:25 -05:00
a54ed5122f train: screw this 2023-11-27 00:17:58 -05:00
068aa4f73c train: let's do a version without the track transform 2023-11-26 22:10:42 -05:00
40ad8b057a stars: DONE ENOUGH 2023-11-22 23:27:19 -05:00
1a3822f6f0 peripheral: save pch source 2023-11-18 22:22:35 -05:00
daca69a155 adjustable-bar-graph: don't try to adapt to theme 2023-11-15 19:47:47 -05:00
8c47067827 adjustable-bar-graph: DONE ENOUGH 2023-11-15 19:45:03 -05:00
604eebe5ca rain 2023-11-15 03:00:23 -05:00
fa1d2044bf rain: in the middle of weird changes 2023-11-15 02:27:53 -05:00
0c22f778e4 prngnouns: done enough 2023-11-04 14:11:47 -04:00
21a76fe946 hs2-last-updated: added white 2px outline 2023-10-25 18:52:46 -04:00
30257a4d1c hs2-last-updated: woohoo! num updates 2023-10-25 17:23:38 -04:00
5d2a8fcca8 hs2-last-updated: woohoo! it works i think! 2023-10-08 22:27:14 -04:00
2d7b34ab0e one post: never gonna get this small enough :( 2023-09-30 15:50:47 -04:00
81d6193bf5 one post: optimizing, not enough 2023-09-30 15:44:05 -04:00
68c2800130 one post: add less to be safe 2023-09-30 15:31:18 -04:00
aa78363c32 one post: DONE ENOUGH 2023-09-30 15:30:55 -04:00
651930da17 one post: let's not bikeshed 2023-09-30 15:18:38 -04:00
7b14ea45b8 didn't need two copies of that 2023-09-28 18:51:17 -04:00
120 changed files with 5063 additions and 619 deletions

BIN
LastGame.broguesave Normal file

Binary file not shown.

45
caar/get.ts Normal file
View file

@ -0,0 +1,45 @@
// TODO: types (don't even sweat validation)
// TODO: do sweat error handling
type Cursor = { refSnowflake: string; offset: number; sortOrder: string };
export const get = (
cursor?: Cursor,
): Promise<{ listings: any[]; nextCursor: Cursor | undefined }> =>
fetch(
`https://cohost.org/api/v1/trpc/artistAlley.getListingsForDisplay?batch=1&input=${
encodeURI(
JSON.stringify({
"0": {
adultDisplayMode: "include",
categories: [],
categoryMatch: "all",
sortOrder: "newest",
cursor,
},
}),
)
}`,
).then(async (r) => {
const json = (await r.json())[0];
if (json.error) throw json.error;
const j = json.result.data;
return {
listings: j.listings.map((l: any) => ({
...l,
author: j.relevantProjects[l.projectId],
})),
nextCursor: j.nextCursor,
};
});
export const get_all = async (cursor?: Cursor): Promise<any[]> => {
const { listings, nextCursor } = await get(cursor);
return nextCursor ? [...listings, ...(await get_all(nextCursor))] : listings;
};
if (import.meta.main) {
const got = await get_all();
console.log(got);
console.log(got.length);
};

485
deno.lock
View file

@ -2,18 +2,19 @@
"version": "3",
"packages": {
"specifiers": {
"npm:discord.js": "npm:discord.js@14.13.0"
"npm:@types/node": "npm:@types/node@18.16.19",
"npm:discord.js": "npm:discord.js@14.15.2"
},
"npm": {
"@discordjs/builders@1.6.5": {
"integrity": "sha512-SdweyCs/+mHj+PNhGLLle7RrRFX9ZAhzynHahMCLqp5Zeq7np7XC6/mgzHc79QoVlQ1zZtOkTTiJpOZu5V8Ufg==",
"@discordjs/builders@1.8.1": {
"integrity": "sha512-GkF+HM01FHy+NSoTaUPR8z44otfQgJ1AIsRxclYGUZDyUbdZEFyD/5QVv2Y1Flx6M+B0bQLzg2M9CJv5lGTqpA==",
"dependencies": {
"@discordjs/formatters": "@discordjs/formatters@0.3.2",
"@discordjs/util": "@discordjs/util@1.0.1",
"@sapphire/shapeshift": "@sapphire/shapeshift@3.9.2",
"discord-api-types": "discord-api-types@0.37.50",
"@discordjs/formatters": "@discordjs/formatters@0.4.0",
"@discordjs/util": "@discordjs/util@1.1.0",
"@sapphire/shapeshift": "@sapphire/shapeshift@3.9.7",
"discord-api-types": "discord-api-types@0.37.83",
"fast-deep-equal": "fast-deep-equal@3.1.3",
"ts-mixer": "ts-mixer@6.0.3",
"ts-mixer": "ts-mixer@6.0.4",
"tslib": "tslib@2.6.2"
}
},
@ -21,100 +22,96 @@
"integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==",
"dependencies": {}
},
"@discordjs/formatters@0.3.2": {
"integrity": "sha512-lE++JZK8LSSDRM5nLjhuvWhGuKiXqu+JZ/DsOR89DVVia3z9fdCJVcHF2W/1Zxgq0re7kCzmAJlCMMX3tetKpA==",
"dependencies": {
"discord-api-types": "discord-api-types@0.37.50"
}
},
"@discordjs/rest@2.0.1": {
"integrity": "sha512-/eWAdDRvwX/rIE2tuQUmKaxmWeHmGealttIzGzlYfI4+a7y9b6ZoMp8BG/jaohs8D8iEnCNYaZiOFLVFLQb8Zg==",
"dependencies": {
"@discordjs/collection": "@discordjs/collection@1.5.3",
"@discordjs/util": "@discordjs/util@1.0.1",
"@sapphire/async-queue": "@sapphire/async-queue@1.5.0",
"@sapphire/snowflake": "@sapphire/snowflake@3.5.1",
"@vladfrangu/async_event_emitter": "@vladfrangu/async_event_emitter@2.2.2",
"discord-api-types": "discord-api-types@0.37.50",
"magic-bytes.js": "magic-bytes.js@1.0.19",
"tslib": "tslib@2.6.2",
"undici": "undici@5.22.1"
}
},
"@discordjs/util@1.0.1": {
"integrity": "sha512-d0N2yCxB8r4bn00/hvFZwM7goDcUhtViC5un4hPj73Ba4yrChLSJD8fy7Ps5jpTLg1fE9n4K0xBLc1y9WGwSsA==",
"@discordjs/collection@2.1.0": {
"integrity": "sha512-mLcTACtXUuVgutoznkh6hS3UFqYirDYAg5Dc1m8xn6OvPjetnUlf/xjtqnnc47OwWdaoCQnHmHh9KofhD6uRqw==",
"dependencies": {}
},
"@discordjs/ws@1.0.1": {
"integrity": "sha512-avvAolBqN3yrSvdBPcJ/0j2g42ABzrv3PEL76e3YTp2WYMGH7cuspkjfSyNWaqYl1J+669dlLp+YFMxSVQyS5g==",
"@discordjs/formatters@0.4.0": {
"integrity": "sha512-fJ06TLC1NiruF35470q3Nr1bi95BdvKFAF+T5bNfZJ4bNdqZ3VZ+Ttg6SThqTxm6qumSG3choxLBHMC69WXNXQ==",
"dependencies": {
"@discordjs/collection": "@discordjs/collection@1.5.3",
"@discordjs/rest": "@discordjs/rest@2.0.1",
"@discordjs/util": "@discordjs/util@1.0.1",
"@sapphire/async-queue": "@sapphire/async-queue@1.5.0",
"@types/ws": "@types/ws@8.5.6",
"@vladfrangu/async_event_emitter": "@vladfrangu/async_event_emitter@2.2.2",
"discord-api-types": "discord-api-types@0.37.50",
"tslib": "tslib@2.6.2",
"ws": "ws@8.14.2"
"discord-api-types": "discord-api-types@0.37.83"
}
},
"@sapphire/async-queue@1.5.0": {
"integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==",
"@discordjs/rest@2.3.0": {
"integrity": "sha512-C1kAJK8aSYRv3ZwMG8cvrrW4GN0g5eMdP8AuN8ODH5DyOCbHgJspze1my3xHOAgwLJdKUbWNVyAeJ9cEdduqIg==",
"dependencies": {
"@discordjs/collection": "@discordjs/collection@2.1.0",
"@discordjs/util": "@discordjs/util@1.1.0",
"@sapphire/async-queue": "@sapphire/async-queue@1.5.2",
"@sapphire/snowflake": "@sapphire/snowflake@3.5.3",
"@vladfrangu/async_event_emitter": "@vladfrangu/async_event_emitter@2.2.4",
"discord-api-types": "discord-api-types@0.37.83",
"magic-bytes.js": "magic-bytes.js@1.10.0",
"tslib": "tslib@2.6.2",
"undici": "undici@6.13.0"
}
},
"@discordjs/util@1.1.0": {
"integrity": "sha512-IndcI5hzlNZ7GS96RV3Xw1R2kaDuXEp7tRIy/KlhidpN/BQ1qh1NZt3377dMLTa44xDUNKT7hnXkA/oUAzD/lg==",
"dependencies": {}
},
"@sapphire/shapeshift@3.9.2": {
"integrity": "sha512-YRbCXWy969oGIdqR/wha62eX8GNHsvyYi0Rfd4rNW6tSVVa8p0ELiMEuOH/k8rgtvRoM+EMV7Csqz77YdwiDpA==",
"@discordjs/ws@1.1.0": {
"integrity": "sha512-O97DIeSvfNTn5wz5vaER6ciyUsr7nOqSEtsLoMhhIgeFkhnxLRqSr00/Fpq2/ppLgjDGLbQCDzIK7ilGoB/M7A==",
"dependencies": {
"@discordjs/collection": "@discordjs/collection@2.1.0",
"@discordjs/rest": "@discordjs/rest@2.3.0",
"@discordjs/util": "@discordjs/util@1.1.0",
"@sapphire/async-queue": "@sapphire/async-queue@1.5.2",
"@types/ws": "@types/ws@8.5.10",
"@vladfrangu/async_event_emitter": "@vladfrangu/async_event_emitter@2.2.4",
"discord-api-types": "discord-api-types@0.37.83",
"tslib": "tslib@2.6.2",
"ws": "ws@8.17.0"
}
},
"@sapphire/async-queue@1.5.2": {
"integrity": "sha512-7X7FFAA4DngXUl95+hYbUF19bp1LGiffjJtu7ygrZrbdCSsdDDBaSjB7Akw0ZbOu6k0xpXyljnJ6/RZUvLfRdg==",
"dependencies": {}
},
"@sapphire/shapeshift@3.9.7": {
"integrity": "sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==",
"dependencies": {
"fast-deep-equal": "fast-deep-equal@3.1.3",
"lodash": "lodash@4.17.21"
}
},
"@sapphire/snowflake@3.5.1": {
"integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==",
"@sapphire/snowflake@3.5.3": {
"integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==",
"dependencies": {}
},
"@types/node@18.16.19": {
"integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==",
"dependencies": {}
},
"@types/ws@8.5.6": {
"integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==",
"@types/ws@8.5.10": {
"integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
"dependencies": {
"@types/node": "@types/node@18.16.19"
}
},
"@vladfrangu/async_event_emitter@2.2.2": {
"integrity": "sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ==",
"@vladfrangu/async_event_emitter@2.2.4": {
"integrity": "sha512-ButUPz9E9cXMLgvAW8aLAKKJJsPu1dY1/l/E8xzLFuysowXygs6GBcyunK9rnGC4zTsnIc2mQo71rGw9U+Ykug==",
"dependencies": {}
},
"busboy@1.6.0": {
"integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
"dependencies": {
"streamsearch": "streamsearch@1.1.0"
}
},
"discord-api-types@0.37.50": {
"integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg==",
"discord-api-types@0.37.83": {
"integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==",
"dependencies": {}
},
"discord.js@14.13.0": {
"integrity": "sha512-Kufdvg7fpyTEwANGy9x7i4od4yu5c6gVddGi5CKm4Y5a6sF0VBODObI3o0Bh7TGCj0LfNT8Qp8z04wnLFzgnbA==",
"discord.js@14.15.2": {
"integrity": "sha512-wGD37YCaTUNprtpqMIRuNiswwsvSWXrHykBSm2SAosoTYut0VUDj9yo9t4iLtMKvuhI49zYkvKc2TNdzdvpJhg==",
"dependencies": {
"@discordjs/builders": "@discordjs/builders@1.6.5",
"@discordjs/builders": "@discordjs/builders@1.8.1",
"@discordjs/collection": "@discordjs/collection@1.5.3",
"@discordjs/formatters": "@discordjs/formatters@0.3.2",
"@discordjs/rest": "@discordjs/rest@2.0.1",
"@discordjs/util": "@discordjs/util@1.0.1",
"@discordjs/ws": "@discordjs/ws@1.0.1",
"@sapphire/snowflake": "@sapphire/snowflake@3.5.1",
"@types/ws": "@types/ws@8.5.6",
"discord-api-types": "discord-api-types@0.37.50",
"@discordjs/formatters": "@discordjs/formatters@0.4.0",
"@discordjs/rest": "@discordjs/rest@2.3.0",
"@discordjs/util": "@discordjs/util@1.1.0",
"@discordjs/ws": "@discordjs/ws@1.1.0",
"@sapphire/snowflake": "@sapphire/snowflake@3.5.3",
"discord-api-types": "discord-api-types@0.37.83",
"fast-deep-equal": "fast-deep-equal@3.1.3",
"lodash.snakecase": "lodash.snakecase@4.1.1",
"tslib": "tslib@2.6.2",
"undici": "undici@5.22.1",
"ws": "ws@8.14.2"
"undici": "undici@6.13.0"
}
},
"fast-deep-equal@3.1.3": {
@ -129,59 +126,33 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dependencies": {}
},
"magic-bytes.js@1.0.19": {
"integrity": "sha512-/088hrf0svd5aDFLXuWStA447/ZXv21sS/1uaaPELohYL8+QzcO3mD8JkEFe0DSAsU5ex+O2+12Zmiz7wIdA1Q==",
"magic-bytes.js@1.10.0": {
"integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==",
"dependencies": {}
},
"streamsearch@1.1.0": {
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
"dependencies": {}
},
"ts-mixer@6.0.3": {
"integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==",
"ts-mixer@6.0.4": {
"integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==",
"dependencies": {}
},
"tslib@2.6.2": {
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
"dependencies": {}
},
"undici@5.22.1": {
"integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==",
"dependencies": {
"busboy": "busboy@1.6.0"
}
"undici@6.13.0": {
"integrity": "sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==",
"dependencies": {}
},
"ws@8.14.2": {
"integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==",
"ws@8.17.0": {
"integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==",
"dependencies": {}
}
}
},
"redirects": {
"https://deno.land/x/canvas/mod.ts": "https://deno.land/x/canvas@v1.4.1/mod.ts",
"https://deno.land/x/emit/mod.ts": "https://deno.land/x/emit@0.28.0/mod.ts"
"https://deno.land/x/deno_dom/deno-dom-wasm.ts": "https://deno.land/x/deno_dom@v0.1.43/deno-dom-wasm.ts"
},
"remote": {
"https://deno.land/std@0.106.0/encoding/base64.ts": "eecae390f1f1d1cae6f6c6d732ede5276bf4b9cd29b1d281678c054dc5cc009e",
"https://deno.land/std@0.140.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
"https://deno.land/std@0.140.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49",
"https://deno.land/std@0.140.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d",
"https://deno.land/std@0.140.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9",
"https://deno.land/std@0.140.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf",
"https://deno.land/std@0.140.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37",
"https://deno.land/std@0.140.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f",
"https://deno.land/std@0.140.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d",
"https://deno.land/std@0.140.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b",
"https://deno.land/std@0.140.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
"https://deno.land/std@0.140.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
"https://deno.land/std@0.140.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b",
"https://deno.land/std@0.140.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633",
"https://deno.land/std@0.140.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee",
"https://deno.land/std@0.140.0/path/mod.ts": "d3e68d0abb393fb0bf94a6d07c46ec31dc755b544b13144dee931d8d5f06a52d",
"https://deno.land/std@0.140.0/path/posix.ts": "293cdaec3ecccec0a9cc2b534302dfe308adb6f10861fa183275d6695faace44",
"https://deno.land/std@0.140.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
"https://deno.land/std@0.140.0/path/win32.ts": "31811536855e19ba37a999cd8d1b62078235548d67902ece4aa6b814596dd757",
"https://deno.land/std@0.140.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21",
"https://deno.land/std@0.146.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
"https://deno.land/std@0.146.0/async/abortable.ts": "87aa7230be8360c24ad437212311c9e8d4328854baec27b4c7abb26e85515c06",
"https://deno.land/std@0.146.0/async/deadline.ts": "48ac998d7564969f3e6ec6b6f9bf0217ebd00239b1b2292feba61272d5dd58d0",
@ -234,142 +205,6 @@
"https://deno.land/std@0.149.0/testing/_diff.ts": "029a00560b0d534bc0046f1bce4bd36b3b41ada3f2a3178c85686eb2ff5f1413",
"https://deno.land/std@0.149.0/testing/_format.ts": "0d8dc79eab15b67cdc532826213bbe05bccfd276ca473a50a3fc7bbfb7260642",
"https://deno.land/std@0.149.0/testing/asserts.ts": "0ee58a557ac764e762c62bb21f00e7d897e3919e71be38b2d574fb441d721005",
"https://deno.land/std@0.157.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
"https://deno.land/std@0.157.0/_util/os.ts": "8a33345f74990e627b9dfe2de9b040004b08ea5146c7c9e8fe9a29070d193934",
"https://deno.land/std@0.157.0/encoding/hex.ts": "4cc5324417cbb4ac9b828453d35aed45b9cc29506fad658f1f138d981ae33795",
"https://deno.land/std@0.157.0/fmt/colors.ts": "ff7dc9c9f33a72bd48bc24b21bbc1b4545d8494a431f17894dbc5fe92a938fc4",
"https://deno.land/std@0.157.0/fs/_util.ts": "fdc156f897197f261a1c096dcf8ff9267ed0ff42bd5b31f55053a4763a4bae3b",
"https://deno.land/std@0.157.0/fs/copy.ts": "73bdf24f4322648d9bc38ef983b818637ba368351d17aa03644209d3ce3eac31",
"https://deno.land/std@0.157.0/fs/empty_dir.ts": "c15a0aaaf40f8c21cca902aa1e01a789ad0c2fd1b7e2eecf4957053c5dbf707f",
"https://deno.land/std@0.157.0/fs/ensure_dir.ts": "76395fc1c989ca8d2de3aedfa8240eb8f5225cde20f926de957995b063135b80",
"https://deno.land/std@0.157.0/fs/ensure_file.ts": "b8e32ea63aa21221d0219760ba3f741f682d7f7d68d0d24a3ec067c338568152",
"https://deno.land/std@0.157.0/fs/ensure_link.ts": "5cc1c04f18487d7d1edf4c5469705f30b61390ffd24ad7db6df85e7209b32bb2",
"https://deno.land/std@0.157.0/fs/ensure_symlink.ts": "5273557b8c50be69477aa9cb003b54ff2240a336db52a40851c97abce76b96ab",
"https://deno.land/std@0.157.0/fs/eol.ts": "b92f0b88036de507e7e6fbedbe8f666835ea9dcbf5ac85917fa1fadc919f83a5",
"https://deno.land/std@0.157.0/fs/exists.ts": "3661a679d9018338df5df7cd9fc7cd918f5e447e7304a5391f849a893ce24107",
"https://deno.land/std@0.157.0/fs/expand_glob.ts": "333a8b9b0726b6909e5af30fb99c68e5b0e734d37af8cbc2ad1f062f26ca4d50",
"https://deno.land/std@0.157.0/fs/mod.ts": "354a6f972ef4e00c4dd1f1339a8828ef0764c1c23d3c0010af3fcc025d8655b0",
"https://deno.land/std@0.157.0/fs/move.ts": "6d7fa9da60dbc7a32dd7fdbc2ff812b745861213c8e92ba96dace0669b0c378c",
"https://deno.land/std@0.157.0/fs/walk.ts": "d6c73a2a2fb5fde60150ce27cff3fff420e72e5bb84131b4919c9a41d74712ce",
"https://deno.land/std@0.157.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
"https://deno.land/std@0.157.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
"https://deno.land/std@0.157.0/path/_util.ts": "d16be2a16e1204b65f9d0dfc54a9bc472cafe5f4a190b3c8471ec2016ccd1677",
"https://deno.land/std@0.157.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633",
"https://deno.land/std@0.157.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee",
"https://deno.land/std@0.157.0/path/mod.ts": "56fec03ad0ebd61b6ab39ddb9b0ddb4c4a5c9f2f4f632e09dd37ec9ebfd722ac",
"https://deno.land/std@0.157.0/path/posix.ts": "c1f7afe274290ea0b51da07ee205653b2964bd74909a82deb07b69a6cc383aaa",
"https://deno.land/std@0.157.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
"https://deno.land/std@0.157.0/path/win32.ts": "bd7549042e37879c68ff2f8576a25950abbfca1d696d41d82c7bca0b7e6f452c",
"https://deno.land/std@0.159.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
"https://deno.land/std@0.159.0/_util/os.ts": "8a33345f74990e627b9dfe2de9b040004b08ea5146c7c9e8fe9a29070d193934",
"https://deno.land/std@0.159.0/fs/_util.ts": "fdc156f897197f261a1c096dcf8ff9267ed0ff42bd5b31f55053a4763a4bae3b",
"https://deno.land/std@0.159.0/fs/copy.ts": "73bdf24f4322648d9bc38ef983b818637ba368351d17aa03644209d3ce3eac31",
"https://deno.land/std@0.159.0/fs/empty_dir.ts": "c15a0aaaf40f8c21cca902aa1e01a789ad0c2fd1b7e2eecf4957053c5dbf707f",
"https://deno.land/std@0.159.0/fs/ensure_dir.ts": "76395fc1c989ca8d2de3aedfa8240eb8f5225cde20f926de957995b063135b80",
"https://deno.land/std@0.159.0/fs/ensure_file.ts": "b8e32ea63aa21221d0219760ba3f741f682d7f7d68d0d24a3ec067c338568152",
"https://deno.land/std@0.159.0/fs/ensure_link.ts": "5cc1c04f18487d7d1edf4c5469705f30b61390ffd24ad7db6df85e7209b32bb2",
"https://deno.land/std@0.159.0/fs/ensure_symlink.ts": "5273557b8c50be69477aa9cb003b54ff2240a336db52a40851c97abce76b96ab",
"https://deno.land/std@0.159.0/fs/eol.ts": "b92f0b88036de507e7e6fbedbe8f666835ea9dcbf5ac85917fa1fadc919f83a5",
"https://deno.land/std@0.159.0/fs/exists.ts": "6a447912e49eb79cc640adacfbf4b0baf8e17ede6d5bed057062ce33c4fa0d68",
"https://deno.land/std@0.159.0/fs/expand_glob.ts": "333a8b9b0726b6909e5af30fb99c68e5b0e734d37af8cbc2ad1f062f26ca4d50",
"https://deno.land/std@0.159.0/fs/mod.ts": "354a6f972ef4e00c4dd1f1339a8828ef0764c1c23d3c0010af3fcc025d8655b0",
"https://deno.land/std@0.159.0/fs/move.ts": "6d7fa9da60dbc7a32dd7fdbc2ff812b745861213c8e92ba96dace0669b0c378c",
"https://deno.land/std@0.159.0/fs/walk.ts": "d6c73a2a2fb5fde60150ce27cff3fff420e72e5bb84131b4919c9a41d74712ce",
"https://deno.land/std@0.159.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
"https://deno.land/std@0.159.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
"https://deno.land/std@0.159.0/path/_util.ts": "d16be2a16e1204b65f9d0dfc54a9bc472cafe5f4a190b3c8471ec2016ccd1677",
"https://deno.land/std@0.159.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633",
"https://deno.land/std@0.159.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee",
"https://deno.land/std@0.159.0/path/mod.ts": "56fec03ad0ebd61b6ab39ddb9b0ddb4c4a5c9f2f4f632e09dd37ec9ebfd722ac",
"https://deno.land/std@0.159.0/path/posix.ts": "c1f7afe274290ea0b51da07ee205653b2964bd74909a82deb07b69a6cc383aaa",
"https://deno.land/std@0.159.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
"https://deno.land/std@0.159.0/path/win32.ts": "bd7549042e37879c68ff2f8576a25950abbfca1d696d41d82c7bca0b7e6f452c",
"https://deno.land/std@0.176.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462",
"https://deno.land/std@0.176.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3",
"https://deno.land/std@0.176.0/encoding/hex.ts": "50f8c95b52eae24395d3dfcb5ec1ced37c5fe7610ef6fffdcc8b0fdc38e3b32f",
"https://deno.land/std@0.176.0/fmt/colors.ts": "938c5d44d889fb82eff6c358bea8baa7e85950a16c9f6dae3ec3a7a729164471",
"https://deno.land/std@0.176.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32",
"https://deno.land/std@0.176.0/fs/copy.ts": "14214efd94fc3aa6db1e4af2b4b9578e50f7362b7f3725d5a14ad259a5df26c8",
"https://deno.land/std@0.176.0/fs/empty_dir.ts": "c3d2da4c7352fab1cf144a1ecfef58090769e8af633678e0f3fabaef98594688",
"https://deno.land/std@0.176.0/fs/ensure_dir.ts": "724209875497a6b4628dfb256116e5651c4f7816741368d6c44aab2531a1e603",
"https://deno.land/std@0.176.0/fs/ensure_file.ts": "c38602670bfaf259d86ca824a94e6cb9e5eb73757fefa4ebf43a90dd017d53d9",
"https://deno.land/std@0.176.0/fs/ensure_link.ts": "c0f5b2f0ec094ed52b9128eccb1ee23362a617457aa0f699b145d4883f5b2fb4",
"https://deno.land/std@0.176.0/fs/ensure_symlink.ts": "2955cc8332aeca9bdfefd05d8d3976b94e282b0f353392a71684808ed2ffdd41",
"https://deno.land/std@0.176.0/fs/eol.ts": "f1f2eb348a750c34500741987b21d65607f352cf7205f48f4319d417fff42842",
"https://deno.land/std@0.176.0/fs/exists.ts": "b8c8a457b71e9d7f29b9d2f87aad8dba2739cbe637e8926d6ba6e92567875f8e",
"https://deno.land/std@0.176.0/fs/expand_glob.ts": "45d17e89796a24bd6002e4354eda67b4301bb8ba67d2cac8453cdabccf1d9ab0",
"https://deno.land/std@0.176.0/fs/mod.ts": "bc3d0acd488cc7b42627044caf47d72019846d459279544e1934418955ba4898",
"https://deno.land/std@0.176.0/fs/move.ts": "4cb47f880e3f0582c55e71c9f8b1e5e8cfaacb5e84f7390781dd563b7298ec19",
"https://deno.land/std@0.176.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32",
"https://deno.land/std@0.176.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
"https://deno.land/std@0.176.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
"https://deno.land/std@0.176.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0",
"https://deno.land/std@0.176.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000",
"https://deno.land/std@0.176.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1",
"https://deno.land/std@0.176.0/path/mod.ts": "4b83694ac500d7d31b0cdafc927080a53dc0c3027eb2895790fb155082b0d232",
"https://deno.land/std@0.176.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d",
"https://deno.land/std@0.176.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1",
"https://deno.land/std@0.176.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba",
"https://deno.land/std@0.186.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462",
"https://deno.land/std@0.186.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3",
"https://deno.land/std@0.186.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8",
"https://deno.land/std@0.186.0/bytes/bytes_list.ts": "31d664f4d42fa922066405d0e421c56da89d751886ee77bbe25a88bf0310c9d0",
"https://deno.land/std@0.186.0/bytes/concat.ts": "d26d6f3d7922e6d663dacfcd357563b7bf4a380ce5b9c2bbe0c8586662f25ce2",
"https://deno.land/std@0.186.0/bytes/copy.ts": "939d89e302a9761dcf1d9c937c7711174ed74c59eef40a1e4569a05c9de88219",
"https://deno.land/std@0.186.0/encoding/base64.ts": "144ae6234c1fbe5b68666c711dc15b1e9ee2aef6d42b3b4345bf9a6c91d70d0d",
"https://deno.land/std@0.186.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e",
"https://deno.land/std@0.186.0/io/buf_reader.ts": "06fff3337091c49e99ebd2dd790c9a90364c087a2953ea081667400fd6c6cebb",
"https://deno.land/std@0.186.0/io/buf_writer.ts": "48c33c8f00b61dcbc7958706741cec8e59810bd307bc6a326cbd474fe8346dfd",
"https://deno.land/std@0.186.0/io/buffer.ts": "17f4410eaaa60a8a85733e8891349a619eadfbbe42e2f319283ce2b8f29723ab",
"https://deno.land/std@0.186.0/io/copy_n.ts": "0cc7ce07c75130f6fc18621ec1911c36e147eb9570664fee0ea12b1988167590",
"https://deno.land/std@0.186.0/io/limited_reader.ts": "6c9a216f8eef39c1ee2a6b37a29372c8fc63455b2eeb91f06d9646f8f759fc8b",
"https://deno.land/std@0.186.0/io/mod.ts": "2665bcccc1fd6e8627cca167c3e92aaecbd9897556b6f69e6d258070ef63fd9b",
"https://deno.land/std@0.186.0/io/multi_reader.ts": "9c2a0a31686c44b277e16da1d97b4686a986edcee48409b84be25eedbc39b271",
"https://deno.land/std@0.186.0/io/read_delim.ts": "c02b93cc546ae8caad8682ae270863e7ace6daec24c1eddd6faabc95a9d876a3",
"https://deno.land/std@0.186.0/io/read_int.ts": "7cb8bcdfaf1107586c3bacc583d11c64c060196cb070bb13ae8c2061404f911f",
"https://deno.land/std@0.186.0/io/read_lines.ts": "c526c12a20a9386dc910d500f9cdea43cba974e853397790bd146817a7eef8cc",
"https://deno.land/std@0.186.0/io/read_long.ts": "f0aaa420e3da1261c5d33c5e729f09922f3d9fa49f046258d4ff7a00d800c71e",
"https://deno.land/std@0.186.0/io/read_range.ts": "28152daf32e43dd9f7d41d8466852b0d18ad766cd5c4334c91fef6e1b3a74eb5",
"https://deno.land/std@0.186.0/io/read_short.ts": "805cb329574b850b84bf14a92c052c59b5977a492cd780c41df8ad40826c1a20",
"https://deno.land/std@0.186.0/io/read_string_delim.ts": "5dc9f53bdf78e7d4ee1e56b9b60352238ab236a71c3e3b2a713c3d78472a53ce",
"https://deno.land/std@0.186.0/io/slice_long_to_bytes.ts": "48d9bace92684e880e46aa4a2520fc3867f9d7ce212055f76ecc11b22f9644b7",
"https://deno.land/std@0.186.0/io/string_reader.ts": "da0f68251b3d5b5112485dfd4d1b1936135c9b4d921182a7edaf47f74c25cc8f",
"https://deno.land/std@0.186.0/io/string_writer.ts": "8a03c5858c24965a54c6538bed15f32a7c72f5704a12bda56f83a40e28e5433e",
"https://deno.land/std@0.186.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
"https://deno.land/std@0.186.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
"https://deno.land/std@0.186.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0",
"https://deno.land/std@0.186.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000",
"https://deno.land/std@0.186.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1",
"https://deno.land/std@0.186.0/path/mod.ts": "ee161baec5ded6510ee1d1fb6a75a0f5e4b41f3f3301c92c716ecbdf7dae910d",
"https://deno.land/std@0.186.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d",
"https://deno.land/std@0.186.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1",
"https://deno.land/std@0.186.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba",
"https://deno.land/std@0.186.0/streams/_common.ts": "f45cba84f0d813de3326466095539602364a9ba521f804cc758f7a475cda692d",
"https://deno.land/std@0.186.0/streams/buffer.ts": "d5b3d7d0299114e5b2ea895a8bf202a687fd915c5282f8096c7bae23b5a04407",
"https://deno.land/std@0.186.0/streams/byte_slice_stream.ts": "225d57263a34325d7c96cb3dafeb478eec0e6fd05cd0458d678752eadd132bb4",
"https://deno.land/std@0.186.0/streams/copy.ts": "75cbc795ff89291df22ddca5252de88b2e16d40c85d02840593386a8a1454f71",
"https://deno.land/std@0.186.0/streams/delimiter_stream.ts": "f69e849b3d1f59f02424497273f411105a6f76a9f13da92aeeb9a2d554236814",
"https://deno.land/std@0.186.0/streams/early_zip_readable_streams.ts": "4005fa74162b943f79899e5d7cb96adcbc0a6b867f9144974ed12d30e0a556e1",
"https://deno.land/std@0.186.0/streams/iterate_reader.ts": "bbec1d45c2df2c0c5920bad0549351446fdc8e0886d99e95959b259dbcdb6072",
"https://deno.land/std@0.186.0/streams/limited_bytes_transform_stream.ts": "05dc592ffaab83257494d22dd53917e56243c26e5e3129b3f13ddbbbc4785048",
"https://deno.land/std@0.186.0/streams/limited_transform_stream.ts": "d69ab790232c1b86f53621ad41ef03c235f2abb4b7a1cd51960ad6e12ee55e38",
"https://deno.land/std@0.186.0/streams/merge_readable_streams.ts": "5d6302888f4bb0616dafb5768771be0aec9bedc05fbae6b3d726d05ffbec5b15",
"https://deno.land/std@0.186.0/streams/mod.ts": "c07ec010e700b9ea887dc36ca08729828bc7912f711e4054e24d33fd46282252",
"https://deno.land/std@0.186.0/streams/read_all.ts": "ee319772fb0fd28302f97343cc48dfcf948f154fd0d755d8efe65814b70533be",
"https://deno.land/std@0.186.0/streams/readable_stream_from_iterable.ts": "cd4bb9e9bf6dbe84c213beb1f5085c326624421671473e410cfaecad15f01865",
"https://deno.land/std@0.186.0/streams/readable_stream_from_reader.ts": "bfc416c4576a30aac6b9af22c9dc292c20c6742141ee7c55b5e85460beb0c54e",
"https://deno.land/std@0.186.0/streams/reader_from_iterable.ts": "55f68110dce3f8f2c87b834d95f153bc904257fc65175f9f2abe78455cb8047c",
"https://deno.land/std@0.186.0/streams/reader_from_stream_reader.ts": "fa4971e5615a010e49492c5d1688ca1a4d17472a41e98b498ab89a64ebd7ac73",
"https://deno.land/std@0.186.0/streams/text_delimiter_stream.ts": "20e680ab8b751390e359288ce764f9c47d164af11a263870746eeca4bc7d976b",
"https://deno.land/std@0.186.0/streams/text_line_stream.ts": "0f2c4b33a5fdb2476f2e060974cba1347cefe99a4af33c28a57524b1a34750fa",
"https://deno.land/std@0.186.0/streams/to_transform_stream.ts": "7f55fc0b14cf3ed0f8d10d8f41d05bdc40726e44a65c37f58705d10a615f0159",
"https://deno.land/std@0.186.0/streams/writable_stream_from_writer.ts": "56fff5c82fb736fdd669b567cc0b2bbbe0351002cd13254eae26c366e2bed89a",
"https://deno.land/std@0.186.0/streams/write_all.ts": "aec90152978581ea62d56bb53a5cbf487e6a89c902f87c5969681ffbdf32b998",
"https://deno.land/std@0.186.0/streams/writer_from_stream_writer.ts": "07c7ee025151a190f37fc42cbb01ff93afc949119ebddc6e0d0df14df1bf6950",
"https://deno.land/std@0.186.0/streams/zip_readable_streams.ts": "a9d81aa451240f79230add674809dbee038d93aabe286e2d9671e66591fc86ca",
"https://deno.land/std@0.186.0/testing/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea",
"https://deno.land/std@0.186.0/testing/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7",
"https://deno.land/std@0.186.0/testing/asserts.ts": "e16d98b4d73ffc4ed498d717307a12500ae4f2cbe668f1a215632d19fcffc22f",
"https://deno.land/std@0.202.0/media_types/_db.ts": "7606d83e31f23ce1a7968cbaee852810c2cf477903a095696cdc62eaab7ce570",
"https://deno.land/std@0.202.0/media_types/_util.ts": "0879b04cc810ff18d3dcd97d361e03c9dfb29f67d7fc4a9c6c9d387282ef5fe8",
"https://deno.land/std@0.202.0/media_types/content_type.ts": "ad98a5aa2d95f5965b2796072284258710a25e520952376ed432b0937ce743bc",
@ -381,17 +216,6 @@
"https://deno.land/std@0.202.0/media_types/parse_media_type.ts": "31ccf2388ffab31b49500bb89fa0f5de189c8897e2ee6c9954f207637d488211",
"https://deno.land/std@0.202.0/media_types/type_by_extension.ts": "8c210d4e28ea426414dd8c61146eefbcc7e091a89ccde54bbbe883a154856afd",
"https://deno.land/std@0.202.0/media_types/vendor/mime-db.v1.52.0.ts": "6925bbcae81ca37241e3f55908d0505724358cda3384eaea707773b2c7e99586",
"https://deno.land/std@0.99.0/_util/assert.ts": "2f868145a042a11d5ad0a3c748dcf580add8a0dbc0e876eaa0026303a5488f58",
"https://deno.land/std@0.99.0/_util/os.ts": "e282950a0eaa96760c0cf11e7463e66babd15ec9157d4c9ed49cc0925686f6a7",
"https://deno.land/std@0.99.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853",
"https://deno.land/std@0.99.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4",
"https://deno.land/std@0.99.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b",
"https://deno.land/std@0.99.0/path/common.ts": "eaf03d08b569e8a87e674e4e265e099f237472b6fd135b3cbeae5827035ea14a",
"https://deno.land/std@0.99.0/path/glob.ts": "314ad9ff263b895795208cdd4d5e35a44618ca3c6dd155e226fb15d065008652",
"https://deno.land/std@0.99.0/path/mod.ts": "4465dc494f271b02569edbb4a18d727063b5dbd6ed84283ff906260970a15d12",
"https://deno.land/std@0.99.0/path/posix.ts": "f56c3c99feb47f30a40ce9d252ef6f00296fa7c0fcb6dd81211bdb3b8b99ca3b",
"https://deno.land/std@0.99.0/path/separator.ts": "8fdcf289b1b76fd726a508f57d3370ca029ae6976fcde5044007f062e643ff1c",
"https://deno.land/std@0.99.0/path/win32.ts": "77f7b3604e0de40f3a7c698e8a79e7f601dc187035a1c21cb1e596666ce112f8",
"https://deno.land/x/canvas@v1.4.1/deps.ts": "e956026d98094946166e06d7b799290b732db015813870d84e04e33ab88e98f3",
"https://deno.land/x/canvas@v1.4.1/mod.ts": "a4e16972647ceafef58612a377a218372454c99d2c9da615a132694597114f80",
"https://deno.land/x/canvas@v1.4.1/src/base64.ts": "0928031fdba0c43b617154fbe2eb7578366460c04da1422933ae5e936d3d0349",
@ -401,28 +225,12 @@
"https://deno.land/x/canvas@v1.4.1/src/lib.js": "bb21711589bfbc8997b455cdf53e3150e23289f3b44809188041b1d2fc7924fa",
"https://deno.land/x/canvas@v1.4.1/src/types.ts": "67d5800f8f4b0a407e0251676a03ae91b5f50a3ed53e6b72dc5984113cb93128",
"https://deno.land/x/canvas@v1.4.1/src/wasm.js": "449d72cc14fc4142a5853f944df49a744d852981d09c5515528ede8aebb0afda",
"https://deno.land/x/clippy@v0.2.2/bindings/bindings.ts": "c7678a4bfa5748b77aead8f99c449c8351500783a65e2e8c0607bfe231b5b013",
"https://deno.land/x/clippy@v0.2.2/deps.ts": "6bcfee8a6054be6c52d7a51d8cf21b37bb6bfbda3bd3b7d5eda0081dde9dd4a2",
"https://deno.land/x/clippy@v0.2.2/mod.ts": "ff4966a3a21a59ae5a676a4e0737d044eac8006e93498cfbb6a8a4bdb24abab1",
"https://deno.land/x/clippy@v0.2.2/platform/darwin.ts": "ed74ede39c1e5a8a4afee2dbc5507b75d71c27049fabd8f98e7e2d595886dcc8",
"https://deno.land/x/clippy@v0.2.2/platform/helper.ts": "ba1ae4bc0905a3c21c423f83f425b654ba817fbb80341465e5338ef516ca3730",
"https://deno.land/x/clippy@v0.2.2/platform/linux.ts": "241911a15062899e697d4f7b92c213c171429aa4ba9730a909a18ceb582fd590",
"https://deno.land/x/clippy@v0.2.2/platform/mod.ts": "b7324415e824785bc29c3fdb90bf6a27fb6025f806c8cd516461cc58f2aba5dd",
"https://deno.land/x/clippy@v0.2.2/platform/windows.ts": "c83adf9f54b452a9adc84eacf9498ec5a8170274ece84c26ed93d19952cd834a",
"https://deno.land/x/copy_paste@v1.1.3/deps.ts": "89bfebe10979530b38b3be2ace3b24a7b83dbecb2a6cca7cd7b05b9a86fb1e61",
"https://deno.land/x/copy_paste@v1.1.3/mod.ts": "3b82d6c620749acb86398bbec1f2c1f472cc39921c22ca7d7a98ab682b170f20",
"https://deno.land/x/deno_cache@0.5.2/auth_tokens.ts": "5d1d56474c54a9d152e44d43ea17c2e6a398dd1e9682c69811a313567c01ee1e",
"https://deno.land/x/deno_cache@0.5.2/cache.ts": "92ce8511e1e5c00fdf53a41619aa77d632ea8e0fc711324322e4d5ebf8133911",
"https://deno.land/x/deno_cache@0.5.2/deno_dir.ts": "1ea355b8ba11c630d076b222b197cfc937dd81e5a4a260938997da99e8ff93a0",
"https://deno.land/x/deno_cache@0.5.2/deps.ts": "26a75905652510b76e54b6d5ef3cf824d1062031e00782efcd768978419224e7",
"https://deno.land/x/deno_cache@0.5.2/dirs.ts": "009c6f54e0b610914d6ce9f72f6f6ccfffd2d47a79a19061e0a9eb4253836069",
"https://deno.land/x/deno_cache@0.5.2/disk_cache.ts": "66a1e604a8d564b6dd0500326cac33d08b561d331036bf7272def80f2f7952aa",
"https://deno.land/x/deno_cache@0.5.2/file_fetcher.ts": "89616c50b6df73fb04e73d0b7cd99e5f2ed7967386913d65b9e8baa4238501f7",
"https://deno.land/x/deno_cache@0.5.2/http_cache.ts": "407135eaf2802809ed373c230d57da7ef8dff923c4abf205410b9b99886491fd",
"https://deno.land/x/deno_cache@0.5.2/lib/deno_cache_dir.generated.js": "18b6526d0c50791a73dd0eb894e99de1ac05ee79dcbd53298ff5b5b6b0757fe6",
"https://deno.land/x/deno_cache@0.5.2/lib/snippets/deno_cache_dir-77bed54ace8005e0/fs.js": "cbe3a976ed63c72c7cb34ef845c27013033a3b11f9d8d3e2c4aa5dda2c0c7af6",
"https://deno.land/x/deno_cache@0.5.2/mod.ts": "0b4d071ad095128bdc2b1bc6e5d2095222dcbae08287261690ee9757e6300db6",
"https://deno.land/x/deno_cache@0.5.2/util.ts": "f3f5a0cfc60051f09162942fb0ee87a0e27b11a12aec4c22076e3006be4cc1e2",
"https://deno.land/x/css@0.3.0/core/lexer/lexer.ts": "4260365331a970526566e773e3399a0a90420c5fc18eb76664a5d9d36fe36c63",
"https://deno.land/x/css@0.3.0/core/parser/parser.ts": "c9fc6db27f346e7a34b66ea19232e1540e9c88f477da3246f6b3a3efae11c0a9",
"https://deno.land/x/css@0.3.0/debug/debug.js": "fb6774490c1c6236453837d8507a1df32270eabff568ec991355cfcb7ca47f2b",
"https://deno.land/x/css@0.3.0/mod.ts": "e9f5f17cfeb7843732291c263e0a912c31861465680b2234079e9a7dfd7de178",
"https://deno.land/x/deno_dom@v0.1.38/build/deno-wasm/deno-wasm.js": "98b1ad24a1c13284557917659402202e5c5258ab1431b3f3a82434ad36ffa05a",
"https://deno.land/x/deno_dom@v0.1.38/deno-dom-wasm.ts": "bfd999a493a6974e9fca4d331bee03bfb68cfc600c662cd0b48b21d67a2a8ba0",
"https://deno.land/x/deno_dom@v0.1.38/src/api.ts": "0ff5790f0a3eeecb4e00b7d8fbfa319b165962cf6d0182a65ba90f158d74f7d7",
@ -445,49 +253,100 @@
"https://deno.land/x/deno_dom@v0.1.38/src/dom/utils-types.ts": "96db30e3e4a75b194201bb9fa30988215da7f91b380fca6a5143e51ece2a8436",
"https://deno.land/x/deno_dom@v0.1.38/src/dom/utils.ts": "55f3e9dc71d6c4a54605888d3f99d26fb0cf9973924709f159252a6933ceeabe",
"https://deno.land/x/deno_dom@v0.1.38/src/parser.ts": "b65eb7e673fa7ca611de871de109655f0aa9fa35ddc1de73df1a5fc2baafc332",
"https://deno.land/x/dir@1.5.1/data_local_dir/mod.ts": "91eb1c4bfadfbeda30171007bac6d85aadacd43224a5ed721bbe56bc64e9eb66",
"https://deno.land/x/emit@0.28.0/_utils.ts": "98412edc7aa29e77d592b54fbad00bdec1b05d0c25eb772a5f8edc9813e08d88",
"https://deno.land/x/emit@0.28.0/emit.generated.js": "6ca765a2a7a1c2dab97e747981e6a9fb98a5acd7a0aa78a003e596fdd0632480",
"https://deno.land/x/emit@0.28.0/mod.ts": "817cb45fcd94d15a43de826161049eee89e3be4bcf06b3a2f60e8cf459e559f1",
"https://deno.land/x/media_types@v2.9.0/db.ts": "ba39cddbcefce47d577c0529066787a3a7b39d27750a6d32b5ad53ed487e7b7b",
"https://deno.land/x/media_types@v2.9.0/deps.ts": "364b24c35845cfd5c6903ab22b8ba9873bf1022bbbf6bf3d001695332d4bbb4f",
"https://deno.land/x/media_types@v2.9.0/mod.ts": "d63583b978d32eff8b76e1ae5d83cba2fb27baa90cc1bcb0ad15a06122ea8c19",
"https://deno.land/x/plug@1.0.0-rc.3/deps.ts": "ea73ca429e71624fdae0fe9393fe5056b9404d058ef45688eda4150112cf85d3",
"https://deno.land/x/plug@1.0.0-rc.3/download.ts": "81d1aef0595e018514f1d70a5c52b0267d81685e2dccb5459f8427b29f3f3736",
"https://deno.land/x/plug@1.0.0-rc.3/mod.ts": "6db7edf982efedf8c9e1002754fbb109c22201fd8fb89ba715fe70171b5e821c",
"https://deno.land/x/plug@1.0.0-rc.3/types.ts": "d8eb738fc6ed883e6abf77093442c2f0b71af9090f15c7613621d4039e410ee1",
"https://deno.land/x/plug@1.0.0-rc.3/util.ts": "e53018a487292d11036efeae9da81eb82ef47f9e53d0ba83f545b0220350155a",
"https://deno.land/x/plug@1.0.1/deps.ts": "35ea2acd5e3e11846817a429b7ef4bec47b80f2d988f5d63797147134cbd35c2",
"https://deno.land/x/plug@1.0.1/download.ts": "8d6a023ade0806a0653b48cd5f6f8b15fcfaa1dbf2aa1f4bc90fc5732d27b144",
"https://deno.land/x/plug@1.0.1/mod.ts": "5dec80ee7a3a325be45c03439558531bce7707ac118f4376cebbd6740ff24bfb",
"https://deno.land/x/plug@1.0.1/types.ts": "d8eb738fc6ed883e6abf77093442c2f0b71af9090f15c7613621d4039e410ee1",
"https://deno.land/x/plug@1.0.1/util.ts": "5ba8127b9adc36e070b9e22971fb8106869eea1741f452a87b4861e574f13481",
"https://deno.land/x/skia_canvas@0.5.4/deno.json": "ac769aa50ba8a157a906b748b3aaabf595b3814f3ff269eeddf47dbbac99f98b",
"https://deno.land/x/skia_canvas@0.5.4/deps.ts": "34e46a90f0477bc96e22a771c335d4fadeb80bf220f25864d52bfa763f86b68b",
"https://deno.land/x/skia_canvas@0.5.4/mod.ts": "62b65707c46334f15f94647be6280c818d90d9976ef8ca70eb607954b9539e5e",
"https://deno.land/x/skia_canvas@0.5.4/src/canvas.ts": "be5686ed5aea402f773278716c15fb95c5ea68a0c4d6e7de2d8e2fbdd8706e66",
"https://deno.land/x/skia_canvas@0.5.4/src/context2d.ts": "0c760904da932bca02aebdf821d579104ae4626ad1ccf6ac98bbab394f9bd391",
"https://deno.land/x/skia_canvas@0.5.4/src/dommatrix.ts": "1f09349bceb483deb2dffa514c8a940a7cd7d61a6a6d0269a3f9837ce5cbe7d6",
"https://deno.land/x/skia_canvas@0.5.4/src/ffi.ts": "bc17171419339a48a9d1d68078d4943e5a99ac8bcdc5dce5f0229b4d447f3d18",
"https://deno.land/x/skia_canvas@0.5.4/src/filter.ts": "e4cf8a7a76eb60325e623bba09e500c51d465e9c8b44a86e6f6e469c8358644d",
"https://deno.land/x/skia_canvas@0.5.4/src/font.ts": "26fc6b01549639a6382b64d13834c3f25ad4a52796adf4edab766b9409683e1a",
"https://deno.land/x/skia_canvas@0.5.4/src/gradient.ts": "f6676d8d896c5707041a30e1d5bfde1e74b7ddb28b396d2965f96f4e52f0ab18",
"https://deno.land/x/skia_canvas@0.5.4/src/image.ts": "d3de72de329979e40679e07711508488cd5cb93f1166575e550d53fb654bcf85",
"https://deno.land/x/skia_canvas@0.5.4/src/parse_font.ts": "1f0fda5e18237d7cc594f5605b2d4dbf4f275134a3b75b738e1327c1e6aabc57",
"https://deno.land/x/skia_canvas@0.5.4/src/path2d.ts": "3ed530a8e54123ef7839d0ae265098f76e97710c903b8ad02698a2086cf6432d",
"https://deno.land/x/skia_canvas@0.5.4/src/pattern.ts": "3480d86043492687dabcd25f082648bc1a67b50c49a7d953b8eadd91c39df642",
"https://deno.land/x/skia_canvas@0.5.4/src/pdfdocument.ts": "a7b4ccd63f2233a527b32a1e1084f3a417b6717a00d8f9b367ea69618986fbb0",
"https://deno.land/x/skia_canvas@0.5.4/src/svgcanvas.ts": "c7eee05b8e4f66636c2ee1361096cf3241a7e7895ba0086eeea448fa67438147",
"https://deno.land/x/wasmbuild@0.14.1/cache.ts": "89eea5f3ce6035a1164b3e655c95f21300498920575ade23161421f5b01967f4",
"https://deno.land/x/wasmbuild@0.14.1/loader.ts": "d98d195a715f823151cbc8baa3f32127337628379a02d9eb2a3c5902dbccfc02",
"https://deno.land/x/xhr@0.1.0/mod.ts": "5200325d879e571961f0927e8e32e66fd33f4ba0d29a219560cf9e0fe9bc6cdf",
"https://esm.sh/preact-render-to-string@5.2.0?external=preact": "834df8d191aa1435e1164e430dc68b5c42a69b1f6624e103e039a96dc702c05d",
"https://deno.land/x/deno_dom@v0.1.43/build/deno-wasm/deno-wasm.js": "d6841a06342eb6a2798ef28de79ad69c0f2fa349fa04d3ca45e5fcfbf50a9340",
"https://deno.land/x/deno_dom@v0.1.43/deno-dom-wasm.ts": "a33d160421bbb6e3104285ea5ebf33352b7ad50d82ea8765e3cf65f972b25119",
"https://deno.land/x/deno_dom@v0.1.43/src/api.ts": "0ff5790f0a3eeecb4e00b7d8fbfa319b165962cf6d0182a65ba90f158d74f7d7",
"https://deno.land/x/deno_dom@v0.1.43/src/constructor-lock.ts": "59714df7e0571ec7bd338903b1f396202771a6d4d7f55a452936bd0de9deb186",
"https://deno.land/x/deno_dom@v0.1.43/src/deserialize.ts": "1cf4096678d8afed8ed28dbad690504c4d2c28149ba768b26eacd1416873425b",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/document-fragment.ts": "1c7352a3c816587ed7fad574b42636198f680f17abc3836fcfe7799b31e7718f",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/document.ts": "b8f4e4ccabaaa063d6562a0f2f8dea9c0419515d63d8bd79bfde95f7cd64bd93",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/dom-parser.ts": "609097b426f8c2358f3e5d2bca55ed026cf26cdf86562e94130dfdb0f2537f92",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/element.ts": "d5371cd83ff2128353c1975465c368ef83d7441568626b386557deba51315111",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/elements/html-template-element.ts": "740b97a5378c9a14cccf3429299846eda240b613013e2d2d7f20b393897453c2",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/html-collection.ts": "ae90197f5270c32074926ad6cf30ee07d274d44596c7e413c354880cebce8565",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/node-list.ts": "4c6e4b4585301d4147addaccd90cb5f5a80e8d6290a1ba7058c5e3dfea16e15d",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/node.ts": "3069e6fc93ac4111a136ed68199d76673339842b9751610ba06f111ba7dc10a7",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/custom-api.ts": "852696bd58e534bc41bd3be9e2250b60b67cd95fd28ed16b1deff1d548531a71",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/nwsapi-types.ts": "c43b36c36acc5d32caabaa54fda8c9d239b2b0fcbce9a28efb93c84aa1021698",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/nwsapi.js": "985d7d8fc1eabbb88946b47a1c44c1b2d4aa79ff23c21424219f1528fa27a2ff",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/selectors.ts": "83eab57be2290fb48e3130533448c93c6c61239f2a2f3b85f1917f80ca0fdc75",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/sizzle-types.ts": "78149e2502409989ce861ed636b813b059e16bc267bb543e7c2b26ef43e4798b",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/selectors/sizzle.js": "c3aed60c1045a106d8e546ac2f85cc82e65f62d9af2f8f515210b9212286682a",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/utils-types.ts": "96db30e3e4a75b194201bb9fa30988215da7f91b380fca6a5143e51ece2a8436",
"https://deno.land/x/deno_dom@v0.1.43/src/dom/utils.ts": "4c6206516fb8f61f37a209c829e812c4f5a183e46d082934dd14c91bde939263",
"https://deno.land/x/deno_dom@v0.1.43/src/parser.ts": "e06b2300d693e6ae7564e53dfa5c9a9e97fdb8c044c39c52c8b93b5d60860be3",
"https://deno.land/x/deno_dom@v0.1.46/build/deno-wasm/deno-wasm.js": "d6841a06342eb6a2798ef28de79ad69c0f2fa349fa04d3ca45e5fcfbf50a9340",
"https://deno.land/x/deno_dom@v0.1.46/deno-dom-wasm.ts": "a33d160421bbb6e3104285ea5ebf33352b7ad50d82ea8765e3cf65f972b25119",
"https://deno.land/x/deno_dom@v0.1.46/src/api.ts": "0ff5790f0a3eeecb4e00b7d8fbfa319b165962cf6d0182a65ba90f158d74f7d7",
"https://deno.land/x/deno_dom@v0.1.46/src/constructor-lock.ts": "0e7b297e8b9cf921a3b0d3a692ec5fb462c5afc47ec554292e20090b9e16b40a",
"https://deno.land/x/deno_dom@v0.1.46/src/deserialize.ts": "1cf4096678d8afed8ed28dbad690504c4d2c28149ba768b26eacd1416873425b",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/document-fragment.ts": "1c7352a3c816587ed7fad574b42636198f680f17abc3836fcfe7799b31e7718f",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/document.ts": "0b07049fd614c1d460240d1bf3e051084a58105e54887af90f45bc615965f1c6",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/dom-parser.ts": "784ee0e766d4a01e14420f328053fd3a0016c6b40ee442edc3ae80f5d9777927",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/element.ts": "d1a006e4f7cd1eb050838a96ba93a254e5cf4136236c6454ab6e8ffedcf395fd",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/elements/html-template-element.ts": "740b97a5378c9a14cccf3429299846eda240b613013e2d2d7f20b393897453c2",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/html-collection.ts": "eedc0b097612ef420d975df6924850a36a4829b35aafa4c92078609a15a52f08",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/node-list.ts": "aa5d4c2297fadfb1b392ffa0e5c33a6fb8c198e8875bb853c2fc3fc49807701d",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/node.ts": "4ee9bc98f1d5b31a9a36674a9f3e1d6e25b9125b1532c42f84c4624816fe8435",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/custom-api.ts": "852696bd58e534bc41bd3be9e2250b60b67cd95fd28ed16b1deff1d548531a71",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/nwsapi-types.ts": "c43b36c36acc5d32caabaa54fda8c9d239b2b0fcbce9a28efb93c84aa1021698",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/nwsapi.js": "985d7d8fc1eabbb88946b47a1c44c1b2d4aa79ff23c21424219f1528fa27a2ff",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/selectors.ts": "83eab57be2290fb48e3130533448c93c6c61239f2a2f3b85f1917f80ca0fdc75",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/sizzle-types.ts": "78149e2502409989ce861ed636b813b059e16bc267bb543e7c2b26ef43e4798b",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/selectors/sizzle.js": "c3aed60c1045a106d8e546ac2f85cc82e65f62d9af2f8f515210b9212286682a",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/utils-types.ts": "96db30e3e4a75b194201bb9fa30988215da7f91b380fca6a5143e51ece2a8436",
"https://deno.land/x/deno_dom@v0.1.46/src/dom/utils.ts": "4c6206516fb8f61f37a209c829e812c4f5a183e46d082934dd14c91bde939263",
"https://deno.land/x/deno_dom@v0.1.46/src/parser.ts": "e06b2300d693e6ae7564e53dfa5c9a9e97fdb8c044c39c52c8b93b5d60860be3",
"https://deno.land/x/imagescript@1.2.15/ImageScript.js": "9ce10c37a0e4fe43699689088c24f386fd401874057932bd57079ac729205038",
"https://deno.land/x/imagescript@1.2.15/png/src/crc.mjs": "5cf50de181d61dd00e66a240d811018ba5070afa8bba302f393604404604de84",
"https://deno.land/x/imagescript@1.2.15/png/src/mem.mjs": "4968d400dae069b4bf0ef4767c1802fd2cc7d15d90eda4cfadf5b4cd19b96c6d",
"https://deno.land/x/imagescript@1.2.15/png/src/png.mjs": "96ef0ceff1b5a6cd9304749e5f187b4ab238509fb5f9a8be8ee934240271ed8d",
"https://deno.land/x/imagescript@1.2.15/png/src/zlib.mjs": "9867dc3fab1d31b664f9344b0d7e977f493d9c912a76c760d012ed2b89f7061c",
"https://deno.land/x/imagescript@1.2.15/utils/buffer.js": "952cb1beb8827e50a493a5d1f29a4845e8c648789406d389dd51f51205ba02d8",
"https://deno.land/x/imagescript@1.2.15/utils/crc32.js": "573d6222b3605890714ebc374e687ec2aa3e9a949223ea199483e47ca4864f7d",
"https://deno.land/x/imagescript@1.2.15/utils/png.js": "fbed9117e0a70602645d70df9c103ff6e79c03e987bd5c1685dcb4200729b6de",
"https://deno.land/x/imagescript@1.2.15/utils/wasm/font.js": "9e75d842608c057045698d6a7cdf5ffd27241b5cdea0391c89a1917b31294524",
"https://deno.land/x/imagescript@1.2.15/utils/wasm/gif.js": "8b86f7b96486bb8ff50fbc7c7487f86cb5cef85e6acd71e1def78a1aa2f12e4f",
"https://deno.land/x/imagescript@1.2.15/utils/wasm/jpeg.js": "75295e2fcf96b4f7bb894b3844fdaa8140d63169d28b466b5d5be89d59a7b6e6",
"https://deno.land/x/imagescript@1.2.15/utils/wasm/png.js": "0659536a8dd8f892c8346e268b2754b4414fad0ec1e9794dfcde1ba1c804ee02",
"https://deno.land/x/imagescript@1.2.15/utils/wasm/svg.js": "f5c8a9d1977b51a7c07549ceb6bbbaca9497321a193f28b3dc229a42d91bcf14",
"https://deno.land/x/imagescript@1.2.15/utils/wasm/tiff.js": "c2d7bdaef094df25aae1752e75167f485e89275d76a1379e39d8949580b7af4f",
"https://deno.land/x/imagescript@1.2.15/utils/wasm/zlib.js": "749875f83abffe24d3b977475a0cbd5f9b52bee1fbdbef61ec183cbfc17805f6",
"https://deno.land/x/imagescript@1.2.15/v2/framebuffer.mjs": "add44ff184636659714b3c6d4b896f628545451abffbc30b5bcc2e8d9a73d012",
"https://deno.land/x/imagescript@1.2.15/v2/ops/blur.mjs": "80716f1ffab8a2aeb54a036f583bf51a2b9dd37e005adc000add803df8e8a12f",
"https://deno.land/x/imagescript@1.2.15/v2/ops/color.mjs": "5e72cdcbf97dc939a2795223f01e3cb0544c0c56b03ea2aa026050df58348814",
"https://deno.land/x/imagescript@1.2.15/v2/ops/crop.mjs": "69431fa6f687fd9f0c31eff0ec27d7ac925275005e53a37f0c3fab4cc4d9a9ea",
"https://deno.land/x/imagescript@1.2.15/v2/ops/fill.mjs": "cf1b9488314753fbc9ebf03410ac74c2a34ea5a69fb6892cd6e8366cd1930d93",
"https://deno.land/x/imagescript@1.2.15/v2/ops/flip.mjs": "825a34a66567dcf15e76a719f1bf2f66fb106503cd69942292b1b0ae05c5718e",
"https://deno.land/x/imagescript@1.2.15/v2/ops/index.mjs": "423ba687119be2bba8cec72890577d3afa3621b6b8108912242fe937a183f2aa",
"https://deno.land/x/imagescript@1.2.15/v2/ops/iterator.mjs": "c2adf3d90ce00719a02c48c97634574176a3501ff026676259bd71aa8f5d69b9",
"https://deno.land/x/imagescript@1.2.15/v2/ops/overlay.mjs": "7e6e2c2ffd25006d52597ab8babc5f8f503d388a3fdf2fbc0eaea02799a020c9",
"https://deno.land/x/imagescript@1.2.15/v2/ops/resize.mjs": "814e78ebce8eaf8f1f918688db7b52a141405e06a36ed4b25d04413d69e7d17b",
"https://deno.land/x/imagescript@1.2.15/v2/ops/rotate.mjs": "a1b65616717bd2eed8db406affea3263b4674dada46b56441ef38167a187455d",
"https://deno.land/x/imagescript@1.2.15/v2/util/mem.mjs": "4968d400dae069b4bf0ef4767c1802fd2cc7d15d90eda4cfadf5b4cd19b96c6d",
"https://deno.land/x/imagescript@1.2.9/ImageScript.js": "4f6f9c1542dd55b91dfdd01d1b2e8e5ff1eb3b3a7a4a30bdd5ff673d9aecab45",
"https://deno.land/x/imagescript@1.2.9/utils/buffer.js": "952cb1beb8827e50a493a5d1f29a4845e8c648789406d389dd51f51205ba02d8",
"https://deno.land/x/imagescript@1.2.9/utils/crc32.js": "573d6222b3605890714ebc374e687ec2aa3e9a949223ea199483e47ca4864f7d",
"https://deno.land/x/imagescript@1.2.9/utils/png.js": "fbed9117e0a70602645d70df9c103ff6e79c03e987bd5c1685dcb4200729b6de",
"https://deno.land/x/imagescript@1.2.9/utils/wasm/font.js": "ae4e8b7b6e6e9a30250c5f89e8fbb92d237f69d80ff84cd80c95d9a04163e714",
"https://deno.land/x/imagescript@1.2.9/utils/wasm/gif.js": "100fbd424a828a76ce90e4f5c282d42e0ab83518908a75839d5ded52bb795340",
"https://deno.land/x/imagescript@1.2.9/utils/wasm/jpeg.js": "da660e827fa45a85ee63aafa38dceb031dbd8988162bf730ace8d6135d842413",
"https://deno.land/x/imagescript@1.2.9/utils/wasm/svg.js": "f7d8827fa8dc4aa9b1027374a87ae658da4bdd46048c66c01d909291d1cf132a",
"https://deno.land/x/imagescript@1.2.9/utils/wasm/zlib.js": "63060a9aabee087929eb01d9e8b75b3ddc94a846a929a81d4456ed9b54d72671",
"https://esm.sh/css@3.0.0": "a54982657613e96ebf2bc9487629a96a6e57bd33aaa04943c543b6cfc94962b3",
"https://esm.sh/preact-render-to-string@5.2.0?external=preact": "d68df08425ff945f8b2872d784d587c6588f9f6369e553758d254477bfc95818",
"https://esm.sh/preact@10.16.0": "5229650cdac537f87cae81d5001e88d4e7a38cc7e77be978961d2897a733117d",
"https://esm.sh/preact@10.16.0/jsx-runtime?dts": "9e67b64a5b48299c77d30bffc213735fdcf4b3b5d4ad8ff8d4136f246de5fa34",
"https://esm.sh/stable/preact@10.16.0/denonext/jsx-runtime.js": "64770c709df77c4b64b79f84a4abf6189fd0c3ea461121870eca0cf2bcca87b0",
"https://esm.sh/stable/preact@10.16.0/denonext/preact.mjs": "01dc8bdf124926c611c0711081b9c162cf2735cccad7c2bc9914766f633ddb1d",
"https://esm.sh/stable/preact@10.16.0/denonext/src.js": "a95281269ac2665427e647cde8628d5cd6eef13bb6bea381c3167a78fa922316",
"https://esm.sh/v128/preact-render-to-string@5.2.0/X-ZS9wcmVhY3Q/denonext/preact-render-to-string.mjs": "b2b771d82125460bd3e5cdf20ebd662a08c4c61e34b174cd11db929dd5883966",
"https://esm.sh/v128/preact@10.16.0/src/index.js": "3bafc9400950c38b80163dcbcd4538a54ef158a83f448517f34324c5685f1569"
"https://esm.sh/v128/preact@10.16.0/src/index.js": "3bafc9400950c38b80163dcbcd4538a54ef158a83f448517f34324c5685f1569",
"https://esm.sh/v134/preact-render-to-string@5.2.0/X-ZS9wcmVhY3Q/denonext/preact-render-to-string.mjs": "b2b771d82125460bd3e5cdf20ebd662a08c4c61e34b174cd11db929dd5883966",
"https://esm.sh/v135/atob@2.1.2/denonext/atob.mjs": "dd534c006761ac47d482333cb9cf131034faa878878d1206ac30372eac803701",
"https://esm.sh/v135/css@3.0.0/denonext/css.mjs": "56fbc2f42803ff9ed37086bf761df8ae6a0ad705c1b163030d9cf0ed284abe34",
"https://esm.sh/v135/decode-uri-component@0.2.2/denonext/decode-uri-component.mjs": "ff66ea8f8e09fab0ef177e73e5d1287a6a50685cb463b071ade77b23cd71024b",
"https://esm.sh/v135/inherits@2.0.4/denonext/inherits.mjs": "8095f3d6aea060c904fb24ae50f2882779c0acbe5d56814514c8b5153f3b4b3b",
"https://esm.sh/v135/source-map-resolve@0.6.0/denonext/source-map-resolve.mjs": "2c593f3194066ca13039c2aed83aed326c8cbfa5526221b1fd14f9e16460dd74",
"https://esm.sh/v135/source-map@0.6.1/denonext/source-map.mjs": "ccff3bb06dea7c01a2c83cf12113697592e418fd06b55ae2bb4cb0a4e51a98b8"
}
}

View file

@ -1,2 +1,136 @@
// i no joke had the idea for this in a dream
// winamp seems more fun (the equalizer yk)
import { EggbugImg, render_and_copy } from "./common.tsx";
// help eggbug manage cohost's "finances"
const Bar = ({ start = 0.5, color }: { start: number; color: string }) => (
<div
style={{
backgroundColor: color,
resize: "vertical",
height: `${start * 100}%`,
flex: "1",
overflow: "hidden",
}}
></div>
);
const Bars = ({ starts, color }: { starts: number[]; color: string }) => (
<div
style={{
flex: "1.5",
display: "flex",
backgroundColor: color,
//margin: "0.25rem",
overflow: "hidden",
}}
>
{...starts.map(start => (
<Bar start={start} color="rgb(var(--color-notWhite))" />
))}
</div>
);
render_and_copy(
<div
style={{
display: "flex",
width: "100%",
aspectRatio: "16/9",
backgroundColor: "rgb(var(--color-notWhite))",
borderRadius: "1rem",
border: "0.25rem solid rgb(var(--color-cherry))",
overflow: "hidden",
}}
>
<Bars
color="rgb(var(--color-cherry))"
starts={new Array(30)
.fill(undefined)
.map((_, i) => 1 - (i * i) / 900)}
/>
{/*might want something more business*/}
<div
style={{
flex: "1",
objectFit: "contain",
display: "flex",
flexDirection: "column",
}}
>
<EggbugImg type="smiling" style={{ margin: "auto" }} />
<p
style={{
borderRadius: "1rem",
border: "0.25rem solid rgb(var(--color-cherry))",
margin: "0.25rem",
padding: "0 0.25rem",
overflow: "scroll",
}}
>
oh no! eggbug production is through the roof! at this rate,
we'll run out of <s>posts</s> foods? to eat within three eggs of
the bug! quick, adjust this graph. that does things? here's some
important advice (i can put as much as i want because there's a
scrollbar!): we'll run out of posts foods? to eat withings?
here's a scrollbar!): h the roof! at this graph. that does three
eggs of the bug! quick, adjust this graph. that does three eggs
of posts foods? to eat within three eggs of the bug! quick,
adjust this rate, we'll run out of posts foods? to eat within
things? here's some important because there's some important
advice (i can put as i want because there's a scrollbar!):
within three eggs of the bug! quick, adjust this rate, we'll run
out of posts foods? to eat within three eggbug production is
through the roof! at this graph. that does things? here's some
important advice (i can put as much as i want because there's
some important advice (i can put as i want because there's a
scrollbar!): as i want because there's some important advice (i
can put as much as i want because there's a scrollbar!): raph.
that does things? here's some important advice (i can put as i
want because there's some important advice (i can put as much as
i want because there's some important advice (i can put as much
as i want because there's a scrollbar!): on is through the roof!
at this graph. that does three eggs of the bug! quick, adjust
this graph. that does things? here's some important advice (i
can put as much as i want because there's some important advice
(i can put as much as much as i want because there's some
important advice (i can put as much as i want because there's a
scrollbar!): through the roof! at this graph. that does things?
here's a scrollbar!): scrollbar!): k, adjust this graph. that
does things? here's some important advice (i can put as i want
because there's some important advice (i can put as much as i
want because there's some important advice (i can put as much as
i want because the roof! at this rate, we'll run out of posts
foods? to eat within three eggbug production is through the
roof! at this rate, we'll run out of the bug! quick, adjust this
graph. that does three eggs of posts foods? to eat within three
eggs of the bug! quick, adjust this graph. that does things?
here's some important advice (i can put as much as i want
because there's a scrollbar!): roduction is through the roof! at
this rate, we'll run out of posts foods? to eat within three
eggbug production is through the roof! at this rate, we'll run
out of posts foods? to eat within three eggs of the bug! quick,
adjust this graph. that does thin
<br />
three eggs
</p>
</div>
<h1
style={{
position: "absolute",
color: "rgb(var(--color-foreground) / 0.05)",
marginLeft: "0.5rem",
marginTop: "0.25rem",
pointerEvents: "none",
overflow: "hidden",
}}
>
buginess v4.1.3<sup>TM</sup> &mdash; FOR EGGBUG USE ONLY &mdash;
AVERT EYES IF NON-EGGBUG. SERIOUSLY, HOLY CRAP, IF YOU AREN'T AN
EGGBUG, YOU WILL DIE! THE EGGBUGS WILL EAT YOUR POSTS THAT IS LIKE
THEIR MAIN THING. OBVIOUSLY, BUT IF YOUR POSTS ARE EATEN, YOU DIE!
</h1>
</div>
);

View file

@ -231,6 +231,7 @@ export const svg_url = (svg: string) => `data:image/svg+xml,${encodeURI(svg)}`;
// something higher-level might be worthwhile...
// could namespace; e.g. css.font.sans_serif
// could put various beziers
export const css = {
url(href: string) {
return `url('${href}')`;
@ -302,3 +303,151 @@ export function make_sync_no_matter_the_cost<T>(promise: Promise<T>): T {
return out as T;
}
// INFINITE CREDIT TO @BLACKLE https://cohost.org/blackle/post/72096-h3-style-text-alig
export const Cycle = ({
width_px,
height_px,
children,
style,
credit = true,
}: {
width_px: number;
height_px: number;
children: [ComponentChild, ...ComponentChild[]];
style?: Record<string, string>;
credit?: boolean;
}) => (
<div
style={{
width: `${width_px}px`,
height: `${height_px}px`,
overflow: "hidden",
...(credit
? {
filter: "url(https://mehbark.github.io/#INFINITE%20CREDIT%20TO%20@BLACKLE)",
}
: {}),
...style,
}}
>
<div
style={{
display: "inline-flex",
height: `${height_px}px`,
paddingRight: `${width_px}px`,
position: "relative",
cursor: "pointer",
}}
>
{...children.map((c, i) => (
<details>
<summary
style={{
position: "absolute",
top: "0px",
left: `calc(-${width_px * 100}% + ${
width_px * width_px + width_px * i
}px)`,
// width: `${width_px}px`,
width: `calc(${
width_px * (children.length - 1) * 2 +
width_px -
width_px * i * 2
}px)`,
height: `${height_px}px`,
listStyle: "none",
overflow: "hidden",
}}
>
{c}
</summary>
<div
style={{
width: `${
i == children.length - 1
? children.length - 1
: 1
}px`,
}}
></div>
</details>
))}
</div>
</div>
);
// yet another banger from @blackle
// i don't think we need the row height stuff for maximum genericity?
export const DragResizableImage = ({
url,
top,
left,
width,
height,
indicator = true,
indicator_opacity = 0.3,
}: {
url: string;
top: number;
left: number;
width: number;
height: number;
indicator?: boolean;
indicator_opacity?: number;
}) => (
<div style="position: absolute;top: 0px;bottom: 0px;left: 0px;direction: rtl;font-size: 0px;line-height: 0;pointer-events: none;white-space: nowrap;">
<div style="overflow: visible;width: 1px;height: 1px;display: inline-block;direction: ltr;vertical-align: text-top;position: relative;top: -9px;left: -9px;">
<div style="position: relative;display: grid;grid-template-rows: 1fr;grid-template-columns: 1fr;">
<div
style={`pointer-events: none;background-image: url(${url});background-size: 100% 100%;background-position: center center;background-repeat: no-repeat;grid-row: 1;grid-column: 1;transform: translate(-50%, -50%);`}
></div>
<div
style={`overflow: hidden; resize: both; width: ${width}px;height: ${height}px;min-width: 36px; min-height: 36px; top: 0px; left: 0px; pointer-events: auto; position: relative; grid-area: 1 / 1 / auto / auto; transform: translate(-50%, -50%); clip-path: polygon(calc(100% - 18px) calc(100% - 18px), calc(100% - 18px) 100%, 100% 100%, 100% calc(100% - 18px));`}
></div>
</div>
</div>
<div
style={`overflow: hidden; resize: both; direction: ltr; display: inline-block; width: ${
left + 18 + width / 2
}px;height: ${
top + 18 + height / 2
}px; position: relative; opacity: ${indicator_opacity}; background: ${
indicator
? 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAAAATklEQVR4AY3OAQYAMQwF0d7/0q2KrzFGZZZVPPLXxlc/RHIjEyIMxBnWBBAFcNODOaSo8X7C3uU/hY3Q5Bwm6vBkCKTiOU3mWkYkI5KQA4BYG/M4zBNLAAAAAElFTkSuQmCC")'
: "none"
} 100% 100% no-repeat; clip-path: polygon(calc(100% - 18px) calc(100% - 18px), calc(100% - 18px) 100%, 100% 100%, 100% calc(100% - 18px)); pointer-events: auto;`}
></div>
</div>
);
// don't really love this; do not recommend
export const string_split_once = (
str: string,
on: string
): [string, string] | undefined => {
const idx = str.indexOf(on);
if (idx < 0) return;
return [str.slice(0, idx), str.slice(idx + on.length)];
};
export const HomestuckSpan = ({
children,
color,
style,
}: {
children: ComponentChildren;
color?: string;
style?: JSX.CSSProperties;
attributes?: JSX.HTMLAttributes;
}) => (
<span
style={{
fontFamily: "'courier-std', courier, monospace",
fontWeight: "bold",
...{ color },
}}
>
{...toChildArray(children)}
</span>
);

129
html/crash.tsx Normal file
View file

@ -0,0 +1,129 @@
import { render_and_copy } from "./common.tsx";
const msg = `nice argument dweebus however i have already
used cohost's css capabilities to make an
animation of your post getting hit by a truck and
scattering letters everywhr`.split("\n");
// i like the freezing effect, but it's probably not right here;
const explode_transform = (): [string, string] => {
const [x, y_, turns] = [
-Math.random() * 25,
(Math.random() - 0.5) * 10,
Math.random() * 10,
];
const y = y_ < 0 ? y_ - 35 : y_ + 35;
return [
`translate(${x.toFixed(2)}rem, ${y.toFixed(
2
)}rem) rotate(${turns.toFixed(2)}turn)`,
`rotate(${-turns.toFixed(2)}turn) translate(${-x.toFixed(
2
)}rem, ${-y.toFixed(2)}rem)`,
];
};
const Line = ({
children,
width_ratio,
length_s,
delay_s,
}: {
children: string;
width_ratio: number;
length_s: number;
delay_s: number;
}) => (
<div style={{ whiteSpace: "pre", perspective: "3cm" }}>
{...(() => {
// we're pretending that everything is the same length (we'll see if this works)
const delay_per = length_s / 160;
const all_delay = (length_s * (1 - width_ratio)) / 3;
console.log(delay_per, all_delay);
return [...children].map((c, i) => {
const [trans, inv_trans] = explode_transform();
return (
<span
style={{
transform: inv_trans,
display: "inline-block",
}}
>
<span
style={{
transform: trans,
display: "inline-block",
animation: `spin 0.75s ${(
delay_per * (children.length - i) +
delay_s +
all_delay
).toFixed(2)}s linear forwards`,
}}
>
{c}
</span>
</span>
);
});
})()}
</div>
);
const Crash = ({
vehicle,
msg,
length_s = 2,
delay_s = 0,
}: {
vehicle: string;
msg: string[];
length_s?: number;
delay_s?: number;
}) => (
<div style={{ display: "flex", alignItems: "center" }}>
<div>
<Line
length_s={length_s}
delay_s={delay_s}
width_ratio={331.033 / 338.767}
>
{msg[0]}
</Line>
<Line
length_s={length_s}
delay_s={delay_s}
width_ratio={291.15 / 338.767}
>
{msg[1]}
</Line>
<Line
length_s={length_s}
delay_s={delay_s}
width_ratio={338.767 / 338.767}
>
{msg[2]}
</Line>
<Line
length_s={length_s}
delay_s={delay_s}
width_ratio={185.283 / 338.767}
>
{msg[3]}
</Line>
</div>
<div
style={{
transform: "translateX(-100rem)",
animation: `spin ${length_s}s ${delay_s}s linear reverse forwards`,
fontSize: "5rem",
}}
>
{vehicle}
</div>
</div>
);
render_and_copy(<Crash vehicle="🛻" msg={msg} length_s={1} delay_s={5} />);

16
html/cycle-test.tsx Normal file
View file

@ -0,0 +1,16 @@
import { Cycle, render_and_copy } from "./common.tsx";
render_and_copy(
<Cycle
width_px={30}
height_px={30}
style={{ margin: "0 auto", outline: "1px solid black" }}
>
<div>this</div>
<div>won't</div>
<div>work</div>
<div>!</div>
<div>!!</div>
<div>!!!</div>
</Cycle>
);

41
html/emoji-land.tsx Normal file
View file

@ -0,0 +1,41 @@
import { Cycle, render_and_copy } from "./common.tsx";
const emojis = [
"🏡",
"🌳",
"🌲",
"🎄",
"🐦",
"🦊",
"🦌",
"🐶",
"🐕",
"🐩",
"🦈",
];
const Emoji = ({ children }: { children: string }) => <div>{children}</div>;
const Cell = () => (
<Cycle width_px={50} height_px={50} style={{}}>
<Emoji> </Emoji>
{...emojis.map(e => <Emoji>{e}</Emoji>)}
</Cycle>
);
render_and_copy(
<div
style={{
width: "calc(50px * 7)",
aspectRatio: "1",
margin: "0 auto",
display: "grid",
gridTemplateColumns: "repeat(7, 1fr)",
fontSize: "33px",
outline: "1px solid black",
backgroundColor: "#296639",
}}
>
{...Array.from({ length: 49 }, () => <Cell />)}
</div>
);

View file

@ -0,0 +1,24 @@
<div style="display: flex; width: 100%; align-items: center; justify-content: center; margin: 2rem 0">
<div style="outline: 2px solid black; flex: 2; aspect-ratio: 16/9; transform: perspective(500px) rotateY(20deg) skewY(-10deg) scale(0.8);">
<details>
<summary style="list-style: none; padding: 0.25rem">
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.75rem; margin: 0.75rem;">
<div style="background-color: rgb(var(--color-notWhite)); border: 1px solid rgb(var(--color-cherry)); border-radius: 0.5rem; box-sizing: border-box; padding: 0.75rem; gap: 0.75rem; align-self: stretch; display: flex; flex-direction: row; align-items: center;">
<img src="https://static.pyrope.net/warning-shield.png" aria-hidden="true" style="margin: 0; display: block">
<p style="color: rgb(var(--color-cherry)); margin: 0; line-height: 24px">This post has content warnings for: <b>major spoilers for things. very major. i mean it!</b></p>
</div>
<div style="cursor: pointer; background-color: rgb(var(--color-cherry)); border-radius: 0.5rem; color: rgb(var(--color-notWhite)); padding: 0.75rem; line-height: 1; letter-spacing: 0.05em; whitespace: nowrap;">
show post
</div>
</div>
</summary>
<div style="position: absolute; inset: 0; background-color: white; overflow-y: auto">
<p style="text-align: center; color: black">these guys die :(</p>
<img src="https://static.wikia.nocookie.net/seuss/images/d/d3/Thing1-and-thing2.jpg" alt="things 1 and 2 from dr. seuss" style="width: 100%">
<a style="width: fit-content; margin: 0 auto; display: block; color: #ccc" href="https://pyrope.net/randirect#cohost.org/mehbark/post/2555916-cursor-adventure-so::pyrope.net/mcai::irc.pyrope.net::413.gay::pyrope.net/tnb::pyrope.net/concat::pyrope.net/davehash::twitter.com/mehbark::pl.pyrope.net/terezi">random fun 4 u</a>
<p style="color: #eee; text-align: center;">yes i flipped it</p>
</div>
</details>
</div>
<div style="flex: 1.2"><h1 style="text-align: center; font-size: 3rem">👀</h1> <p style="text-align: center">i should click on this and open it</p></div>
</div>

48
html/gameboy.css Normal file
View file

@ -0,0 +1,48 @@
/*chonk matric with stereno sound */
.shell {
/*padding: 0px 45px;*/
padding-top: 8px;
background-color: #aab;
width: 285px;
height: 225px;
border-radius: 10px 10px 40px 10px;
overflow: hidden;
margin: 0 auto;
}
.screen {
margin: 0 auto;
}
.lines {
margin: 0 10px;
margin-bottom: 3px;
height: 10px;
}
.top-line {
background-color: #635;
height: 2px;
position: relative;
top: 0px;
}
.bottom-line {
background-color: #325;
height: 2px;
top: 3px;
position: relative;
}
.headline {
color: white;
font-size: 0.45rem;
padding: 0 2px;
background-color: #aaa;
bottom: 2px;
position: relative;
top: -7px;
left: 85px;
width: fit-content;
}

91
html/gameboy.tsx Normal file
View file

@ -0,0 +1,91 @@
// let's game boy ! ! !
import { ComponentChild } from "preact";
import { Cycle, render_and_copy } from "./common.tsx";
const Pixel = ({
colors,
width_px,
}: {
colors: [string, ...string[]];
width_px: number;
}) => (
<Cycle credit={false} width_px={width_px} height_px={width_px}>
<div /*style={`width:${width_px}px;height:${width_px}px`}*/></div>
{...colors.map(c => (
// p saves four bytes per
// we aren't going to get to 20x18 but less data is courteous
<div
// this was parsing fine without px before. so weird
// oh we'd might as well switch back to 100% then
// AWESOME! THAT WAS WHAT WAS MAKING THE CYCLING REALLY NICE
style={`background:${c};width:100%;height:100%`}
></div>
))}
</Cycle>
);
const Draw = ({
width,
height = width,
pixel_width_px,
colors,
bg_color,
}: {
width: number;
height?: number;
pixel_width_px: number;
colors: [string, ...string[]];
bg_color: string;
}) => (
<div
style={{
display: "grid",
gridTemplateRows: `repeat(${height}, 1fr)`,
gridTemplateColumns: `repeat(${width}, 1fr)`,
width: `${width * pixel_width_px}px`,
height: `${height * pixel_width_px}px`,
backgroundColor: bg_color,
}}
class="screen"
>
{...new Array(width * height)
.fill(null)
.map(() => <Pixel width_px={pixel_width_px} colors={colors} />)}
</div>
);
// you know what, let's just to the dark grey part. sorry!
const Shell = ({ children }: { children: ComponentChild }) => (
<div class="shell" aria-describedby={"user-content-gameboy-description"}>
<div class="lines">
<div class="top-line"></div>
<div class="bottom-line"></div>
<div class="headline">CHONK MATRIX WITH STERENO SOUND</div>
</div>
{children}
</div>
);
// body: "#aaaaaa"
// horrid url, but color-picked from
// https://duet-cdn.vox-cdn.com/thumbor/0x0:2048x1364/750x500/filters:focal(1024x682:1025x683):format(webp)/cdn.vox-cdn.com/uploads/chorus_asset/file/23755199/a31768dc_f45b_4ac7_8f34_6f99e835ed358223055624103571533.jpg
render_and_copy(
<>
<Shell>
<Draw
// the actual aspect ratio
// it has slightly more pixels though
width={10}
height={9}
pixel_width_px={20}
bg_color="#779268"
colors={["#52643a", "#22311D", "#0E190B"]}
/>
</Shell>
<p id="gameboy-description" style="font-size: 0px">
the screen and grey border of a Game Boy. at the top, it says "CHONK
MATRIX WITH STERENO SOUND." the blank screen's pixels are comically
large, but faithfully colored
</p>
</>
);

107
html/hash-fun.tsx Normal file
View file

@ -0,0 +1,107 @@
import { ComponentChildren } from "preact";
import { Cycle, render_and_copy } from "./common.tsx";
const Msg = ({
hash,
children,
bridge = " then",
click_blue = "click blue",
}: {
hash: string;
children: ComponentChildren;
bridge?: string;
click_blue?: string;
}) => (
<span>
<a
href={`#${hash}`}
style={{
fontWeight: "bold",
textDecoration: "none",
color: "#f26565",
cursor: "pointer",
}}
>
{children}
</a>
{bridge}{" "}
<span
style={{
fontWeight: "bold",
color: "rgb(87, 144, 251)",
cursor: "pointer",
}}
>
{click_blue}
</span>
</span>
);
render_and_copy(
<Cycle width_px={480} height_px={50}>
<span>
here's how this works:{" "}
<Msg hash="Good job!" bridge=", then you">
you click red
</Msg>
</span>
<Msg hash="Good job, again!" bridge=", then">
click red
</Msg>
<span>
one more time.{" "}
<Msg hash="Hello!" bridge=", then">
click red
</Msg>
, no matter what.
</span>
<Msg hash="Hello?" bridge=" then " click_blue="click me and let's go">
got it? did you click this too?
</Msg>
<Msg
hash="Hello??"
bridge=" ... "
click_blue="yeah, sorry. bit of a slip-up!"
>
um... "me?"
</Msg>
<Msg
hash="Are you even seeing this?"
bridge=" ... "
click_blue="i'm sorry"
>
it's... fine. don't sweat it, blue.
</Msg>
<Msg hash="Oh right." bridge=" ... " click_blue="...">
whatever. we can still salvage this. probably.
</Msg>
<Msg
hash="You care more about these dumb colors."
bridge=" ... "
click_blue="getting clicked?"
>
let's just... what were we even doing?
</Msg>
<Msg
hash="You know, they really weren't meant to be a TIHYLtTW reference."
bridge=" ... "
click_blue="well we can't talk if we aren't clicked"
>
yeah, yeah of course. but why??
</Msg>
<Msg
hash="Even though 'mehbark' did read that novella a while ago."
bridge=" ... "
click_blue="okay, okay. sheesh, calm down!"
>
that's not a reason!
</Msg>
<Msg
hash="They liked it! But that's irrelevant, red and blue just came to mind."
bridge=" ... "
click_blue="you're right"
>
don't tell me to c- you know what, let's not.
</Msg>
</Cycle>
);

View file

@ -12,10 +12,18 @@
// })
// didn't find anything there btw
// pretty hopeless to try to recreate the pulsing light
// ^ a gif would have worked lel
// ^ but, again, artistry
import { Main, render_and_copy, static_url } from "./common.tsx";
import {
DragResizableImage,
HomestuckSpan,
Main,
render_and_copy,
static_url,
} from "./common.tsx";
// TODO: rip a hole in the panel (for blood on back)
// DONE: rip a hole in the panel (for blood on back)
render_and_copy(
<div
style={{
@ -26,6 +34,14 @@ render_and_copy(
gridTemplateRows: "1fr",
}}
>
<DragResizableImage
url={static_url("homestuck-3853-egbertful.png")}
width={650}
height={650}
top={0}
left={0}
indicator_opacity={0.6}
/>
<img
id="panel"
src={static_url("homestuck-3853-transparent-egbertless.png")}
@ -36,7 +52,7 @@ render_and_copy(
aspectRatio: 1,
}}
/>
<img
{/* <img
id="egbert"
src={static_url("homestuck-3853-egbertful.png")}
alt="part of page 3853 of homestuck. egbert's silhouette with colorful tendrils all around it and a patch of blood that also shows the incipisphereish thingie."
@ -47,6 +63,14 @@ render_and_copy(
transform: "translateY(-0.15rem)",
animation: "0.15s infinite alternate-reverse linear spin",
}}
/>
/> */}
<div style={{ backgroundColor: "white" }}>
basically,{" "}
<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/background-attachment">
background-attachment: fixed
</a>{" "}
+ some <a href="https://photopea.com">photopea</a> fun{" "}
<HomestuckSpan color="#008282">:]</HomestuckSpan>
</div>
</div>
);

View file

@ -1,24 +1,230 @@
import { render_and_copy } from "./common.tsx";
// this is a really bad and boring idea. pass.
import { Main, DragResizableImage, render_and_copy, n_of } from "./common.tsx";
render_and_copy(
// new idea! "make your own image macro" scrollable background of various le classic meme images (imgflip)
// + images (yes, images; nobody has impact installed)
// nah. let's just do white + text-shadow
const base_url = "https://static.pyrope.net/imgflip/";
const urls = [
"aggressive-right-turn.png",
"aliens.png",
"always-has-been.png",
"balloon.png",
"batman-slapping-robin.png",
"bike-self-sabotage.png",
"buff-doge-vs-cheems.png",
"cefqrn.png",
"change-my-mind.png",
"chuck-norris.png",
"despicable-plan.png",
"distracted-boyfriend.png",
"drake.png",
"everywhere-everywhere.png",
"evil-kermit.png",
"expanding-brain.png",
"girl-smile-fire.png",
"heinous-suggestion.png",
"hide-the-pain-harold.png",
"i-am-once-again-asking.png",
"if-i-had-one.png",
"is-this-a.png",
"not-sure-if.png",
"one-does-not-simply.png",
"or-draw-25.png",
"panik-kalm-panik.png",
"psycholonials-reference.png",
"rock-the-dwayne-johnson-driving.png",
"same-picture.png",
"scroll-of-truth.png",
"slam-button.png",
"STRONG-handshake.png",
"success-kid.png",
"tap-head.png",
"thinking-about-other-women.png",
"this-is-fine.png",
"two-buttons.png",
"waiting-guy.png",
"waiting-skeleton.png",
"who-killed.png",
"woman-yelling-at-cat.png",
"you-get-a.png",
].map(x => base_url + x);
const Word = ({
children,
left = "0px",
top = "0px",
}: {
children: string;
left?: string;
top?: string;
}) => (
<div
style={{
display: "grid",
gridTemplateColumns: "1fr",
gridTemplateRows: "1fr 3fr 1fr",
position: "absolute",
resize: "both",
minWidth: "max-content",
minHeight: "fit-content",
width: left,
height: top,
overflow: "hidden",
display: "flex",
// justifyContent: "right",
// alignContent: "bottom",
}}
>
<img
src="https://static.pyrope.net/latula.webp"
style={{ display: "grid", gridRow: "1 / 3" }}
/>
<p style={{ fontFamily: "Impact", display: "grid", gridRow: 1 }}>
ACCORDING TO MY UNDERSTANDING OF THE DEFINITION OF AN IMAGE MACRO
THIS
</p>
<p style={{ fontFamily: "Impact", display: "grid", gridRow: 3 }}>
THIS IS AN IMAGE MACRO
</p>
<h1
style={{
color: "white",
textShadow: "0px 0px 2px black",
margin: "auto 0 0 auto",
}}
>
{children}
</h1>
</div>
);
// alright, doing it the right way (https://cohost.org/blackle/post/38921-alright-cohost-it) is too hard.
// let's cheat.
// if we aren't random, and instead distribute things such that the initial setup has the least covered
// ehhhhhhhhhhhhhhhhhh
// sighhhhh let's just do it right
// generate the stupid freaking impact font
// use it as a background image
// ughhhhhh
// oo i know i'll make one image in photopea and just clip it
// that should work and be easy fingers crossed
// that'll actually be way harder to adapt lel
// ughhhh am i going to have to pull out that crappy library
// AND download an impact font
// (yes)
// tl;dr i can still use this scattering
// imagescript can't do the shadow we need (thank goodness)
// maybe imagemagick + photopea then
// i got it (KISS): photopea -> split on command line -> reference by url
// that should be workable
const words = {
THE: 6,
HOMESTUCK: 3,
MEME: 4,
IS: 4,
EGGBUG: 4,
WHEN: 2,
YOU: 5,
SUS: 1,
IMPOSTER: 1,
ME: 3,
ALIEN: 1,
ARE: 3,
A: 4,
BOTTOM: 2,
TOP: 2,
TEXT: 4,
"?": 3,
"!": 3,
NO: 3,
YES: 3,
COHOST: 2,
MEHBARK: 2,
WEBARK: 2,
THIS: 2,
POST: 2,
SUCK: 2,
"CHUCK NORRIS": 2,
FOR: 2,
S: 4,
GET: 2,
} satisfies Record<string, number>;
console.log(
`yikes. there are ${
Object.keys(words).length
} unique words and ${Object.values(words).reduce(
(a, b) => a + b
)} words in total`
);
// Object.keys(words).forEach(w => console.log(w))
const text_img_url = (text: string) =>
`https://static.pyrope.net/meme-text/${text}.png`;
const TEXT_HEIGHT = 55;
const decoder = new TextDecoder();
// crazy inefficient but idc
const get_text_width = (text: string): number =>
+decoder.decode(
new Deno.Command("identify", {
args: ["-format", "%w", `static/meme-text/${text}.png`],
}).outputSync().stdout
);
const ScatteredWords = ({ children }: { children: Record<string, number> }) => (
<>
{...Object.entries(children).flatMap(([text, count]) =>
// feels pretty snazzy ngl
n_of(Math.ceil(count), () => (
<DragResizableImage
top={Math.random() * 413}
left={Math.random() * 612}
url={text_img_url(text)}
height={TEXT_HEIGHT}
width={get_text_width(text)}
indicator_opacity={0.2}
/>
)).map(f => f())
)}
</>
);
render_and_copy(
<>
<Main
style={{ width: "100%", aspectRatio: "1" }}
aria-described-by="user-content-meme-description"
>
<ScatteredWords>{words}</ScatteredWords>
<div
style={{
display: "flex",
overflow: "scroll",
alignItems: "center",
gap: "1rem",
}}
>
{...urls.map(u => (
<img
src={u}
style={{
maxHeight: "50vh",
outline: "1px solid black",
}}
/>
))}
</div>
</Main>
<p style={{ fontSize: "0px" }}>
a horizontally scrollable list of memes with draggable words that
look like a knockoff of impact font. if you want a better and
(hopefully) more accessible version, visit imgflip.com. all of the
memes are taken from there anyway
</p>
notes as per usual i do this all th etime:
<ul>
<li>
dragresizing taken <em>entirely</em> from @blackle's{" "}
<a href="https://cohost.org/blackle/post/38921-alright-cohost-it">
excellent post
</a>
</li>
<li>
you have to get the very center to drag. @blackle put an
indicator but i made it optional and turned it off! sorry!
aesthetics! (edit: turned em back on. character growth! i did
turn the opacity down just a squidge. idk. it's late!)
</li>
<li>
i probably could have turned the resizing off too, but, you
know, it's very funny
</li>
</ul>
</>
);

View file

@ -1,2 +1,3 @@
// like crumbling but more complex and maybe cooler (ha) looking
// nah. too derivative
// that gives me an idea

46
html/minvn.tsx Normal file
View file

@ -0,0 +1,46 @@
// yeahh a directed acyclic graph should be good
// where we just dupe
// e.g.
// a -+-> b
// | |
// | v
// \-> c -> d
// compiles to
// a -+-> b -> c -> d
// |
// \-> c -> d
// inefficient but tractable
// maybe restrict height and width to lh and ch
const example = `
; TODO: contrast isn't great...
fg red
bg rgb(20 15 15)
font "courier-std", courier, monospace
font-size 1.1rem
width 6in
height 12in
# welcome
; only an image link? how incredibly minimalist
- https://image.link
- alt text for that image
; by only allowing connections that have not been declared yet, we should be
; able to avoid cycles
| welcome to the game this is dialogue
| when you use multiple |s, the text is combined into one line
| so it can be pretty
| it's up to you to make sizing work
> good bye
> how are you
; order independent here
# good bye
| that is so rude... i'm sad.
- sad image link
- a sad guy
; notably, no connections
# how are you
>
`.trim();

214
html/nested-cws.tsx Normal file
View file

@ -0,0 +1,214 @@
import { JSX } from "preact/jsx-runtime";
import { render_and_copy } from "./common.tsx";
// TODO: make more generally usable
export const CW = ({ cws, end }: { cws: string[][]; end: JSX.Element }) =>
cws.length == 0 ? (
<div style="position:absolute;inset:0;background:white">{end}</div>
) : (
<details style="position:absolute;inset:0;background:white">
<summary style="list-style:none;padding:0.25rem">
<div style="display:flex;flex-direction:column;align-items:center;gap:0.75rem;margin:0.75rem;">
<div style="background-color:rgb(var(--color-notWhite));border:1px solid rgb(var(--color-cherry));border-radius:0.5rem;box-sizing:border-box;padding:0.75rem;gap:0.75rem;align-self:stretch;display:flex;flex-direction:row;align-items:center">
<img
src="https://static.pyrope.net/warning-shield.png"
aria-hidden="true"
style="margin:0;display:block"
/>
{/* color is omitted here and done elsewhere. note above TODO! */}
<p style="margin:0;line-height:24px">
This post has content warnings for:{" "}
<b>
{cws[0].join(", ") +
(cws[0].length == 0 ? "" : ".")}
</b>
</p>
</div>
<div style="cursor:pointer;background-color:rgb(var(--color-cherry));border-radius:0.5rem;color:rgb(var(--color-notWhite));padding:0.75rem;line-height:1;letter-spacing:0.05em;user-select:none">
show post
</div>
</div>
</summary>
<CW cws={cws.slice(1)} end={end} />
</details>
);
export const ALL_STAR_LYRICS = `
Somebody once told me the world is gonna roll me
I ain't the sharpest tool in the shed
She was looking kind of dumb with her finger and her thumb
In the shape of an "L" on her forehead
Well, the years start comin' and they don't stop comin'
Fed to the rules and I hit the ground runnin'
Didn't make sense not to live for fun
Your brain gets smart but your head gets dumb
So much to do, so much to see
So what's wrong with taking the backstreets?
You'll never know if you don't go (W-w-wacko)
You'll never shine if you don't glow
Hey now, you're an all star
Get your game on, go play
Hey now, you're a rock star
Get the show on, get paid
(And all that glitters is gold)
Only shootin' stars break the mold
It's a cool place, and they say it gets colder
You're bundled up now, wait 'til you get older
But the meteor men beg to differ
Judging by the hole in the satellite picture
The ice we skate is gettin' pretty thin
The water's gettin' warm so you might as well swim
My world's on fire, how 'bout yours?
That's the way I like it and I'll never get bored
Hey now, you're an all star
Get your game on, go play
Hey now, you're a rock star
Get the show on, get paid
(All that glitters is gold)
Only shootin' stars break the mold
Go for the moon (W-w-wacko, w-w-wacko)
Go for the moon (W-w-wacko, w-w-wacko)
Go for the moon
Go for the moon
Hey now, you're an all star
Get your game on, go play
Hey now, you're a rock star
Get the show on, get paid
(And all that glitters is gold)
Only shooting stars
Somebody once asked, "Could I spare some change for gas?
I need to get myself away from this place"
I said, "Yep, what a concept
I could use a little fuel myself and we could all use a little change"
Well, the years start comin' and they don't stop comin'
Fed to the rules and I hit the ground runnin'
Didn't make sense not to live for fun
Your brain gets smart but your head gets dumb
So much to do, so much to see
So what's wrong with taking the backstreets?
You'll never know if you don't go (Go!)
You'll never shine if you don't glow
Hey now, you're an all star
Get your game on, go play
Hey now, you're a rock star
Get the show on, get paid
(And all that glitters is gold)
Only shootin' stars break the mold
(And all that glitters is gold)
Only shootin' stars break the mold
`.trim();
render_and_copy(
<div style="width:100%;height:15rem;color:rgb(var(--color-cherry))">
<CW
cws={[
"long post",
"deep post",
"broad post",
"content",
"warnings",
"content warnings",
"content&warnings",
"warnings&content",
"content&content warnings",
"warnings&content warnings",
"content&warnings&content warnings",
"the first 100 or so words of smash mouth's all star",
...ALL_STAR_LYRICS.split(/\s+/).slice(0, 100),
"i wasn't kidding",
"but i'll spare you the rest",
"opinion",
"i do like the song though it's solid and fun",
"further developing opinion",
"mainly fun",
"slightly tmi&showering",
"i sang it like every time i showered for months and months",
"eh what the heck i'll just",
"opinion&reiterated opinion&on homestuck&beyond canon",
"today has been so awesome",
"i didn't make a great homestuck post&or really any homestuck post&but the homestuck^2 (is it even that still???) upd8 was fantastic",
"i see it as a microcosm as my attitude to the new team as a whole",
'at first: "holy crap! new and scary" (hussie really is fantastic). speaking of,',
"shill&being annoying for a joke",
"read psycholonials it's free come on do it do it do it",
"but more and more i've been warming up to them as they figure things out",
"and&after catching most of the three hour 413 stream",
"yeah! they're fantastic. i'm so happy for them&and i'm just happy in general",
"it's great to know that the future of homestuck is in good hands",
"quote&quote that i already posted&edited quote&portion of quote",
"I cant imagine its going to take us less than three years of regular updates, but it could end up stretching longer",
"keyspam",
"aslkfjlk;asdjkdslkjflk;asd lk;fsdjl fjalksd lk alsdk f laksf lkjsdlfk lasdkf lkjsdlkjflkjdljk",
"it makes me so so happy",
"bodily fluids&tearducts",
"i keep almost getting watery eyes! it's ridiculous!",
"keyspam",
"i'm so happy aslkfj",
"anyway&back to nonsense",
"watch how elegantly and fluidly i mix actual content warning type things with just word typing",
"truly, i am a master of my craft",
"okay how big is this now (kb-wise)",
"133.82",
"very reasonable",
"i'll have to yap much more...",
"nothing",
"",
"i'm on page 4819 of my reread btw",
"was originally planning to finish it by 413 but i was so slow",
"so i'm deciding to just savor it",
"it's been very, very bursty progress",
"but i really do thoroughly enjoy it",
"i'm a homestuck! i don't know why i feel the need to re-",
"oh right it's homestuck day i spent three hours in an official homestuck stream this is kind of what's on mind",
"that's understandable i guess",
"happy 413&btw&i don't think i said that yet",
"i really need to finish this up",
"i know this is one of those Bad Posts where quantity (fails to) make quality",
"but i am getting dry eyes",
"too much homestuck and other stuff!",
"also i need to get this out by the end of 413 in my timezone",
"which is in like 14 minutes",
"don't question the logic this matters!",
"btw, the kbs went down because i factored out the cherry text color",
"HOLY CRAP THAT IS SUCH A TEREZI THING",
"FJLKSDLKFJSLDKJFLKJDFLKJSDFLKJ",
"well&they went up&but they went down measuring from that point",
"well&i didn't actually measure from that point",
"okay whatever uhhh",
"i'm running out of time",
"and i have to admit that the ending is pretty lame",
"so i'm trying to (quickly) think of a way to make these last few more fun",
"opinion",
"terezi is great!",
"realization",
"aw crap, you probably already knew i thought that",
"curse my plentiful past public praise!",
"i'm glad being funny is something the new team wants to do and can do",
"homestuck was chock-full of great jokes",
"homestuck^2 is great i'm happy bla bla new team bla bla",
"okay uh",
"eggbug",
].map(s => s.split("&"))}
end={
<div>
<p>
HAPPY 413! i barely made it in time IT COUNTS it COUNTE
! <a href="https://413.gay">homestuck</a>
</p>
<p>
uh, you want more? fine, take{" "}
<a href="https://pyrope.net/mcai">
discord server that i made so i could continue
saying "man, computers are incredible" every day
</a>
, you're clearly, eh, dedicated
</p>
<p>
(if it wasn't obvious, this is kinda lame because i was
hoping you'd give up by now)
</p>
</div>
}
/>
</div>
);

View file

@ -0,0 +1,22 @@
<div style="display: flex; width: 100%; align-items: center; justify-content: center; margin: 2rem 0">
<div style="flex: 1.2"><h1 style="transform: rotateY(180deg); text-align: center; font-size: 3rem">👀</h1> <p style="text-align: center">i should click on this and open it</p></div>
<div style="outline: 2px solid black; flex: 2; aspect-ratio: 16/9; transform: perspective(500px) rotateY(-20deg) skewY(10deg) scale(0.8);">
<details>
<summary style="list-style: none; padding: 0.25rem">
<div style="display: flex; flex-direction: column; align-items: center; gap: 0.75rem; margin: 0.75rem;">
<div style="background-color: rgb(var(--color-notWhite)); border: 1px solid rgb(var(--color-cherry)); border-radius: 0.5rem; box-sizing: border-box; padding: 0.75rem; gap: 0.75rem; align-self: stretch; display: flex; flex-direction: row; align-items: center;">
<img src="https://static.pyrope.net/warning-shield.png" aria-hidden="true" style="margin: 0; display: block">
<p style="color: rgb(var(--color-cherry)); margin: 0; line-height: 24px">This post has content warnings for: <b>major spoilers for things. very major. i mean it!</b></p>
</div>
<div style="cursor: pointer; background-color: rgb(var(--color-cherry)); border-radius: 0.5rem; color: rgb(var(--color-notWhite)); padding: 0.75rem; line-height: 1; letter-spacing: 0.05em; whitespace: nowrap;">
show post
</div>
</div>
</summary>
<div style="position: absolute; inset: 0; background-color: white; overflow-y: auto">
<p style="text-align: center; color: black">these guys die :(</p>
<img src="https://static.wikia.nocookie.net/seuss/images/d/d3/Thing1-and-thing2.jpg" alt="things 1 and 2 from dr. seuss" style="width: 100%">
<a style="width: fit-content; margin: 0 auto; display: block; color: #ccc" href="https://pyrope.net/randirect#cohost.org/mehbark/post/2555916-cursor-adventure-so::pyrope.net/mcai::irc.pyrope.net::413.gay::pyrope.net/tnb::pyrope.net/concat::pyrope.net/davehash::twitter.com/mehbark::pl.pyrope.net/terezi">random fun 4 u</a>
</div>
</details>
</div></div>

179
html/one-post.less Normal file
View file

@ -0,0 +1,179 @@
@longan: rgb(var(--color-longan));
@not-white: rgb(var(--color-notWhite));
@not-black: rgb(var(--color-notBlack));
@fg: rgb(var(--color-foreground));
@bg: rgb(var(--color-background));
@height: 20rem;
* {
margin: 0;
}
hr {
border-color: rgb(191 186 181);
margin: 0 0.75rem;
}
.hrish {
background-color: @not-white;
}
#fake-main {
height: @height;
margin: -1rem 0;
}
#main {
position: absolute;
top: 0;
left: 0;
right: 0;
width: 100%;
height: @height;
display: flex;
background-color: @bg;
flex-direction: column;
}
.bottom {
background: @not-white;
font-size: 0.875rem;
color: gray;
padding: 0.75rem;
//width: 100%;
//max-width: 100%;
border-bottom-right-radius: 0.5rem;
border-bottom-left-radius: 0.5rem;
box-shadow: 0px 4px 5px rgba(25,25,25,.14),0px 1px 10px rgba(25,25,25,.12),0px 2px 4px rgba(0,0,0,.2);
}
.bottom-inner {
display: flex;
justify-content: space-between;
//vertical-align: middle;
}
// V compromise V
a {
text-decoration: none;
}
.comments {
//width: max-content;
//flex: none;
}
.interactions {
display: flex;
align-items: center;
//justify-content: flex-end;
gap: 0.75rem;
}
.content {
background-color: white;
padding: 0 0.75rem;
display: flex;
min-height: min-content;
flex-grow: 1;
padding-top: 0.5rem;
}
.middle {
// V the main feed uses gap: 3rem V
height: 3rem;
}
.top {
display: flex;
//width: 100%;
//max-width: 100%;
//flex-direction: row;
align-items: center;
//justify-content: space-between;
//gap: 0.5rem;
border-top-left-radius: 0.5rem;
border-top-right-radius: 0.5rem;
background-color: @not-white;
padding: 0.75rem;
box-shadow: 0px -4px 5px rgba(25,25,25,.14),0px -1px 10px rgba(25,25,25,.12),0px -2px 4px rgba(0,0,0,.2);
}
.top-info {
display: flex;
//min-width: 0;
flex: 1 1 0%;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
line-height: 1;
}
.display-name {
//max-width: 100%;
//flex-shrink: 1;
//overflow: hidden;
//text-overflow: ellipsis;
//white-space: nowrap;
font-weight: 700;
//color: @not-black;
}
.username {
color: rgb(104 102 100);
}
.posted {
//display: block;
//flex: none;
font-size: 0.75rem;
//line-height: 1rem;
// not doing the weird tabular-nums thing, i don't get it
color: rgb(130 127 124);
}
.headline {
padding: 0.75rem;
//display: flex;
//width: 100%;
//flex-direction: row;
}
.headline > a {
//flex-grow: 1;
//align-self: center;
//overflow-wrap: break-word;
font-size: 1.25rem;
line-height: 1.75rem;
}
.headline > a > h1 {
color: black;
font-size: inherit;
}
.post-content {
padding-left: 0.75rem;
padding-right: 0.75rem;
//position: relative;
//overflow: hidden;
//isolation: isolate;
margin-top: 1rem;
margin-bottom: 1rem;
color: @not-black;
}
.post-inner {
box-shadow: 0px 4px 5px rgba(0,0,0,.14),0px 1px 10px rgba(0,0,0,.12),0px 2px 4px rgba(0,0,0,.2);
//z-index: -413;
background-color: white;
}
.posts {
display: flex;
flex-direction: column;
//box-shadow: 0px 4px 5px rgba(0,0,0,.14),0px 1px 10px rgba(0,0,0,.12),0px 2px 4px rgba(0,0,0,.2);
gap: 2rem;
}

70
html/one-post.tsx Normal file
View file

@ -0,0 +1,70 @@
import { ComponentChildren } from "preact";
import { render_and_copy } from "./common.tsx";
import { Top, Bottom, Hrish } from "./this-post-is-two-posts.tsx";
// this would be a funny time to do multiple posts
export const Post = ({
children,
headline,
n_comments,
display_name,
username,
posted,
link,
id,
alt_text = true,
}: {
children?: ComponentChildren;
headline?: string;
n_comments: number;
display_name?: string;
username: string;
posted: string;
link?: string;
id?: string;
alt_text?: boolean;
}) => (
<div class="post">
<Top
display_name={display_name}
username={username}
posted={posted}
link={link}
id={id}
alt_text={alt_text}
/>
<Hrish />
<div class="post-inner">
{headline && (
<div class="headline">
<a href={link}>
<h1>{headline}</h1>
</a>
</div>
)}
<div style="display: flex;">
<div class="post-content">{children}</div>
</div>
</div>
<Hrish />
<Bottom n_comments={n_comments} alt_text={alt_text} />
</div>
);
render_and_copy(
<div class="posts">
<Post
headline="can i have more than one post please"
username="mehbark"
posted="6 hr. ago"
n_comments={2}
alt_text={false}
>
one post isn't really enough for me
</Post>
</div>
);

249
html/prngsentences.html Normal file
View file

@ -0,0 +1,249 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>PRNG sentences</title>
<meta itemprop="name" content="PRNG Sentences" />
<meta property="og:title" content="PRNG Sentences" />
<meta property="twitter:title" content="PRNG Sentences" />
<meta
name="description"
content="helper for prng sentences made with prngnouns"
/>
<meta
property="og:description"
content="helper for prng sentences made with prngnouns"
/>
<meta
property="twitter:description"
content="helper for prng sentences made with prngnouns"
/>
<meta property="og:site_name" content="PRNG sentences" />
<meta name="theme-color" content="#eedd33" />
<style>
:root {
--accent: #eedd33;
--fg: #171d00;
--bg: #fffeee;
}
#ui {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 10fr 1fr;
flex: 4;
gap: 10px;
padding: 10px;
}
#reference {
flex: 1;
flex-direction: column;
}
body {
margin: 0;
height: 100vh;
width: 100vw;
color: var(--fg);
background-color: var(--bg);
/* overflow: hidden; */
display: flex;
flex-direction: column;
}
textarea {
color: var(--fg);
background-color: var(--bg);
border: none;
outline: 2px dashed var(--accent);
}
textarea:focus {
outline: 2px solid var(--accent);
}
button {
font-size: large;
}
#preview {
grid-column: 1 / span 2;
font-family: Atkinson Hyperlegible, ui-sans-serif, system-ui,
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
"Helvetica Neue", Arial, "Noto Sans", sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol",
"Noto Color Emoji";
font-size: 1rem;
line-height: 1.75;
margin: 0;
padding: 1rem;
outline: 2px solid var(--accent);
}
kbd {
background-color: #eee;
border-radius: 3px;
border: 1px solid #b4b4b4;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),
0 2px 0 0 rgba(255, 255, 255, 0.7) inset;
color: #333;
display: inline-block;
font-size: 0.85em;
font-weight: 700;
line-height: 1;
padding: 2px 4px;
white-space: nowrap;
}
</style>
<script>
// regices are hilarious sometimes
const PRNG_REGEX =
/∈{([^∈∋{}]+)}(?:{(?:([^ ]+))?(?: *on ([^ ]+))?})?/g;
const regularify = split => {
if (split.length <= 1) {
return split;
}
return [
split[0],
{
options: split[1].split(/\s*\|\s*/g),
fg: split[2],
outline: split[3],
is_choice: true,
},
...regularify(split.slice(4)),
];
};
const sentence_id = new Date().toISOString();
const choice = ({ options, fg, outline }, index) =>
`<img class="prngsentence-choice" style="display: inline; height: 1lh; margin: 0; vertical-align: bottom;" alt="randomly one of the following: ${options.join(
", "
)}" src="https://pyrope.net/prngnouns?p=${options
.map(encodeURI)
.join("&p=")}${
fg ? `&fg=${standardize_color(fg).slice(1)}` : ""
}${
outline
? `&outline=${standardize_color(outline).slice(1)}`
: ""
}&sentence_index=${index}&sentence_id=${sentence_id}">`;
const render = text => {
const awesome = regularify(text.split(PRNG_REGEX));
let out = "";
let idx = 0;
for (const a of awesome) {
if (a.is_choice) {
out += choice(a, idx);
idx += 1;
} else {
out += `<span class="prngsentence-bridge">${a}</span>`;
}
}
return out;
};
// https://stackoverflow.com/a/47355187
function standardize_color(str) {
var ctx = document.createElement("canvas").getContext("2d");
ctx.fillStyle = str;
return ctx.fillStyle;
}
window.onload = () => {
const input = document.getElementById("input");
const output = document.getElementById("output");
const preview = document.getElementById("preview");
const rerender = () => {
const rendered = render(input.value);
output.value = rendered;
preview.innerHTML = rendered;
};
input.addEventListener("change", rerender);
input.addEventListener("keyup", rerender);
document.addEventListener("keyup", e => {
if (e.altKey && e.key == "r") {
input.value += "∈";
}
rerender();
});
rerender();
};
</script>
</head>
<body>
<div id="ui">
<textarea id="input">
∈{hello|hi|hey}, and welcome to <b>PRNG sentences</b>! This is a ∈{awesome|cool|pointless|lame|okay} ∈{tool|toy|web page} ∈{made|assembled|written|programmed} by ∈{mehbark|me|some guy}. It's actually ∈{quite|pretty|decently|very|very, very|} easy to use, so you can just look at the reference at the bottom of the page. </textarea
>
<textarea readonly id="output"></textarea>
<button id="open-prng" onclick="input.value += '∈'"></button>
<button
id="copy"
onclick="window.navigator.clipboard.writeText(output.value)"
>
copy
</button>
<p id="preview"></p>
</div>
<ul id="reference">
<li>
Choices are of the form <code>∈{a|b|c}{fg on outline}</code>
</li>
<li>
You can omit the second bracketed form, or the
<code>fg</code> or <code>on outline</code> parts
</li>
<li>
If you want to have <code>|</code> be in an option, you can't.
Sorry!
</li>
<li>
Press the ∈ button to insert an ∈ at the <strong>end</strong> of
the input
</li>
<li>
You can also press
<span onclick="this.innerHTML = `<code>M-r</code>`"
><kbd>Alt</kbd> + <kbd>R</kbd></span
>
</li>
<li>
Due to caching magick things stuff, you might have to reload to
rerandomize in some circumstances. Your browser should keep the
input unless you do a hard-reload, but you can copy-paste to be
sure
</li>
<li>
Some default styles are applied to the images to make them less
terrible, but you can use
<a
href="https://cloudwithlightning.net/random/chostin/prechoster/"
>prechoster</a
>
to style them easily.
</li>
<li>Feel free to use arbitrary HTML! Nothing is escaped! Sorry?</li>
<li>
This was made by
<a href="https://cohost.org/mehbark">mehbark</a>
</li>
</ul>
</body>
</html>

67
html/rain.tsx Normal file
View file

@ -0,0 +1,67 @@
import { render_and_copy } from "./common.tsx";
const Drop = ({ color = "red", i }: { color?: string; i: number }) => (
<div
style={{
backgroundColor: color,
animation: `${(Math.random() * 2 + 5).toFixed(
2
)}s cubic-bezier(.55,.09,.68,.53) ${(-Math.random() * 10).toFixed(
2
)}s spin infinite reverse`,
gridRow: "1",
gridColumn: `${i}`,
width: "1px",
height: "1px",
marginTop: "-1rem",
transform: "translateY(20rem)",
}}
class="drop"
></div>
);
const Water = ({
color = "red",
duration_s,
}: {
color?: string;
duration_s: number;
}) => (
<div
style={{
backgroundColor: color,
gridRow: "1 / 2",
gridColumn: "1 / 100000",
transform: "translateY(100%)",
animation: `${duration_s}s linear 0s 1 spin forwards`,
}}
></div>
);
const Rain = ({
duration_s,
color = "red",
drops = 100,
}: {
duration_s: number;
color?: string;
drops?: number;
}) => (
<div
style={{
width: "25%",
aspectRatio: "1",
margin: "auto",
outline: "1px solid red",
display: "grid",
overflow: "clip",
}}
>
{...Array.from({ length: drops }, (_, i) => (
<Drop i={i} color={color} />
))}
<Water color={color} duration_s={duration_s} />
</div>
);
render_and_copy(<Rain duration_s={600} drops={150} />);

604
html/random-character.tsx Normal file
View file

@ -0,0 +1,604 @@
import { JSX } from "preact/jsx-runtime";
import { Main, render_and_copy, serverside_randirect } from "./common.tsx";
// let's do 100 first and last names OKAY
//
// cat ~/Documents/dictionary.txt | grep -e '^.\{6,7\}$' | shuf | head -n 100
// okay let's be a bit more selective yikes
// cat ~/Documents/dictionary.txt | grep -E '^....$' | shuf | head -n 100 | awk 'BEGIN {print("[")} {print(" \"" $1 "\",")} END {print("]")}' | xsel -ib
// cat ~/Documents/dictionary.txt | grep -E '^[^n][^i][^g]....?$' | shuf | head -n 100 | awk 'BEGIN {print("[")} {print(" \"" $1 "\",")} END {print("]")}' | xsel -ib
// that is a COMPREHENSIVE dictionary D:
const FIRST_NAMES = [
"tree",
"saka",
"pass",
"kexy",
"pici",
"kurd",
"xxii",
"lide",
"huke",
"palm",
"levi",
"dago",
"they",
"cool",
"filt",
"cump",
"upgo",
"zoid",
"army",
"anta",
"arbs",
"ferv",
"stan",
"wabe",
"jami",
"purs",
"deys",
"vamp",
"mese",
"migs",
"pile",
"susu",
"olio",
"ipse",
"gelt",
"idem",
"eden",
"pont",
"vica",
"corv",
"kell",
"elul",
"ecod",
"maid",
"kays",
"fine",
"taws",
"coul",
"shag",
"aren",
"ruse",
"anre",
"spex",
"perp",
"koff",
"west",
"sild",
"vina",
"itch",
"neal",
"jhow",
"cozy",
"moun",
"copy",
"fict",
"gulp",
"slon",
"tuny",
"tolt",
"erns",
"eyas",
"thro",
"reno",
"warm",
"lone",
"erst",
"koel",
"vila",
"rump",
"kmet",
"drow",
"polt",
"orts",
"hlqn",
"adib",
"dabb",
"dhak",
"tyke",
"arni",
"bagh",
"holt",
"wart",
"bull",
"mayo",
"tiam",
"dose",
"dogs",
"dine",
"wych",
"poet",
"meh",
"egg",
].map(name => name[0].toUpperCase() + name.slice(1));
const LAST_NAMES = [
"paragon",
"phossy",
"burghal",
"templum",
"osteome",
"deicide",
"lockrum",
"inhale",
"celoms",
"outsit",
"plaints",
"stubby",
"flabrum",
"elcaja",
"thrang",
"caretta",
"retune",
"unplace",
"adlumin",
"garcon",
"brainy",
"slyest",
"tsktsks",
"bodock",
"crummer",
"actions",
"wrapped",
"emeril",
"traneen",
"wrought",
"detinue",
"ascarid",
"swimbel",
"leaped",
"ericoid",
"solano",
"barware",
"infarce",
"bullets",
"frankly",
"euboean",
"jymold",
"besugo",
"smaragd",
"suiting",
"muconic",
"goujay",
"caynard",
"pupped",
"verdict",
"brangle",
"potions",
"touart",
"fraena",
"peising",
"replial",
"unbaste",
"sandbug",
"roosed",
"refind",
"illipe",
"runner",
"implate",
"atoxyl",
"favous",
"opcode",
"fuegian",
"cadging",
"soapbox",
"fessed",
"deworm",
"browzer",
"uncurl",
"toelike",
"posnet",
"mortem",
"whippa",
"invests",
"aphagia",
"attent",
"esopgi",
"resorb",
"succula",
"levulic",
"enlace",
"busbars",
"rocket",
"sexuous",
"provers",
"condole",
"caveman",
"cattily",
"buddie",
"trikaya",
"ladlers",
"gorbet",
"tarkani",
"acquit",
"shohjis",
"shilloo",
"bark",
"bug",
].map(name => name[0].toUpperCase() + name.slice(1));
const ASPECTS = [
"Space",
"Time",
"Mind",
"Heart",
"Hope",
"Rage",
"Breath",
"Blood",
"Life",
"Doom",
"Light",
"Void",
];
// oh heck yeah we can totally layer clothes and stuff
// not gonna though
// link to http://www.farragofiction.com/DollSim/ why not
const CLASSES = [
"Thief",
"Rogue",
"Bard",
"Prince",
"Heir",
"Page",
"Seer",
"Maid",
"Sylph",
"Knight",
"Witch",
"Mage",
];
// if this was ruby i could just multiply that array grumble grumble
const LIKED_NOUNS = [
"cats",
"dogs",
"computers",
"keyboards",
"eggbug",
"homestuck",
"websites",
"paintbrushes",
"randomness",
"posts",
"chairs",
"wires",
"audio",
"sound",
"music",
"sound effects",
"personal hygiene",
"smells",
"cars",
"cdrs",
"pairs",
"atoms",
"lists",
"trees",
"tasks",
"smart devices",
"dumb devices",
"synthesizers",
"violins",
"pianos",
"remotes",
"earbuds",
"eggbuds",
"scented waxes",
"cables",
"cords",
"love",
"hate",
"coolness",
"radness",
"gnarliness",
"lameness",
"sick-nastiness",
"maximalism",
"minimalism",
"cohost",
"html",
"css",
"javascript",
"typescript",
"deno",
"dinos",
"life",
"yourself",
"whatever is reading this",
"fish",
"sharks",
"eevees",
"seagulls",
].map(s => s.toUpperCase());
const LIKED_ACTIVITIES = [
"playing the trombone",
"playing the piano",
"using the computer",
"posting on the websites",
"reading homestuck",
"playing homestuck",
"reading gamebro",
"reading gamegrl",
"helping others",
"hindering others",
"egging the bug",
"coing the host",
"making a javascript",
"scheming (in the evil sense)",
"scheming (in the algorithmic language sense)",
"reading books (how exciting)",
"reading blogs",
"being kind :D",
"being rude D:",
"liking things",
"loving things",
"transforming",
"refreshing this page to see different things",
"writing blogs",
"writing books",
"writing visual novels",
"reading visual novels",
"playing visual novels",
"gaming",
"gaming so hard",
"gaming so, so hard",
"gaming so, so, so hard",
"gaming a regular amount of hard",
"flarping",
"playing games for girls",
"sweeping mines",
"tetrising",
"nixing operating systems",
"emacsing",
"using alternatives to discord",
"internet relay chatting",
"hypertexting",
"decorating your room",
"designing clothes",
"wearing clothes",
"being cool",
"being rad",
"being gnarly",
"being lame",
"making fun random generators by assembling a small set of primitives that, yes, could be more atomic",
"making this text really squishy by liking doing something with a really long description like this",
"finishing up a list",
"writing activities that are actually homestuckish",
"staying in your room",
"staying anywhere but your room",
"programming poorly",
"shaving",
"dressing in a spiffy manner",
"watching crappy movies",
"watching really good movies",
"doing nothing in particular",
"cleaning your room",
"attempting to escape your absurd house",
"attempting to make your house more absurd",
"architecting",
"visiting others",
"visiting yourself",
"doing enough",
].map(s => s.toUpperCase());
const HEADWEAR = [
...new Array(20).fill("nothing on top of your head"),
"a dorky top hat",
"a spiffy top hat",
"a baseball cap",
"a baseball helmet",
"a football helmet",
"a puppet on top of your head",
"a smaller version of yourself on top of your head",
"a headband with attached horns",
"a headband",
"a veil",
"a fedora",
"a comically small top hat",
"a comically large top hat",
];
const FACEWEAR = [
...new Array(20).fill("nothing on your face"),
"some sick shades",
"some frankly lame shades",
"heart-shaped shades",
"circular shades",
"circular glasses",
"square glasses",
"glasses that you would consider standard",
"grey facepaint",
"clown facepaint",
"juggalo facepaint",
"a clown nose",
"Vriska's glasses (they aren't yours)",
"Dave's shades (they aren't yours)",
];
const TOP = [
"a tank top",
"a collared shirt",
"a polo shirt",
"a generic t-shirt",
"a non-generic t-shirt",
"a red t-shirt",
"a orange t-shirt",
"a yellow t-shirt",
"a green t-shirt",
"a blue t-shirt",
"a indigo t-shirt",
"a violet t-shirt",
"a teal t-shirt",
"a Terezi t-shirt (what!!)",
"a white shirt",
"a pair of pants as a shirt",
"a grey t-shirt",
"a gray t-shirt",
"a brown t-shirt",
"a scratchy sweater",
"an incredibly comfortable sweater",
"a sweater",
"a jacket",
"a coat",
"an appropriately-heavy coat",
"an inappropriately-heavy coat",
"a cargo shirt",
"a cargo shirt that you added more pockets to",
];
const BOTTOM = [
"pants",
"shorts",
"a skirt",
"cargo pants",
"cargo shorts",
"a cargo skirt",
"cargo pants that you added more pockets to",
"cargo shorts that you added more pockets to",
"a cargo skirt that you added more pockets to",
"dress pants",
"dress shorts",
"a dress skirt",
"a collared shirt",
"a polo shirt",
"a generic skirt",
"a non-generic skirt",
"a red skirt",
"a orange skirt",
"a yellow skirt",
"a green skirt",
"a blue skirt",
"a indigo skirt",
"a violet skirt",
"a teal skirt",
"a Terezi skirt (what!!)",
"a white shirt",
"a pair of pants as a skirt",
"a grey skirt",
"a gray skirt",
"a brown skirt",
"sweat pants",
"sweat shorts",
"Terezi pants (what!!)",
];
const FOOTWEAR = [
"shoes",
"boots",
"cargo boots",
"cargo boots that you added more pockets to",
"sandals",
"sneakers",
"crocs",
"red shoes",
"orange shoes",
"yellow shoes",
"green shoes",
"blue shoes",
"indigo shoes",
"violet shoes",
"Terezi shoes (what!!)",
"sandals with socks",
];
// has some defaults
export const Prngnoun = ({
prns,
alt,
style = {},
}: {
prns: string[];
alt: string;
style?: JSX.CSSProperties;
}) => (
<img
src={`https://pyrope.net/prngnouns?p=${prns.join("&p=")}`}
alt={alt}
style={{
display: "inline",
height: "0.5lh",
margin: "0",
...style,
}}
/>
);
// what is gained from having this on cohost... hm
// export const InlineRandImage
// because the randomly generated parts are so nicely integrated (if you have courier)
// i'm thinking i'll frame it like "your guy is ..." instead of "you are ..."
// idk
render_and_copy(
// sort of a franken-introduction of name and other stuff
<Main
style={{
fontFamily: "'courier-std', 'Courier New', courier, monospace",
fontWeight: "bold",
color: "black",
backgroundColor: "#EFEFEF",
textAlign: "center",
margin: "0 auto",
padding: "0.5rem 1rem",
}}
>
<p>
Your name is{" "}
<Prngnoun
alt="a four letter name. weird stuff, not very namey"
prns={FIRST_NAMES}
/>{" "}
<Prngnoun
alt="a six or seven letter last name. weird stuff, not very namey"
prns={LAST_NAMES}
/>
. You like <Prngnoun alt="a random noun" prns={LIKED_NOUNS} />,{" "}
{/* we add another thing so that it isn't the same url */}
<Prngnoun
alt="another random noun"
prns={["SOME OTHER THING", ...LIKED_NOUNS]}
/>
, and <Prngnoun alt="a random activity" prns={LIKED_ACTIVITIES} />.
</p>
<p>
You feel a bit too shy to actually{" "}
<a
style={{ fontWeight: "bold" }}
href={serverside_randirect(
"http://www.farragofiction.com/DollSim/",
"http://www.farragofiction.com/DollSim/index.html?type=2"
)}
>
show yourself
</a>{" "}
in this post, but you are wearing{" "}
<Prngnoun
alt="a piece of headwear, or lack thereof"
prns={HEADWEAR}
/>
,{" "}
<Prngnoun
alt="a piece of facewear, or lack thereof"
prns={FACEWEAR}
/>
, <Prngnoun alt="a top (clothing)" prns={TOP} />,{" "}
<Prngnoun alt="a bottom (clothing)" prns={BOTTOM} />, and{" "}
<Prngnoun alt="footwear" prns={FOOTWEAR} />.
{/* you are wearing nothing on your head, some sick shades, a tank top, boots, and cargo pants */}
{/* your expression changes {often,rarely,of course}, but it's typical for you to be {smiling,grinning,grimacing} */}
</p>
<p>
You are a <Prngnoun alt="a class from homestuck" prns={CLASSES} />{" "}
of <Prngnoun alt="an aspect from homestuck" prns={ASPECTS} />, but
you don't really care about that&mdash;it's hard to god-tier when
you are a randomly-filled out template!
</p>
</Main>
);

88
html/read-more.tsx Normal file
View file

@ -0,0 +1,88 @@
import { render_and_copy } from "./common.tsx";
const URL =
"https://dn790009.ca.archive.org/0/items/thestrangecaseof00043gut/43.txt";
const text = (await fetch(URL).then(r => r.text())).replaceAll("\r", "");
const chapters: [string, string[]][] = text
.replaceAll("`", "")
.replaceAll("'", "")
.replaceAll("--", "—")
.split("\n\n\n\n\n")
.slice(1)
.map(c => c.split("\n\n\n"))
.filter(c => c.length == 2)
.map(c => [c[0], c[1].split("\n\n")]);
const make_chapter_id = (title: string) =>
title
.toLowerCase()
.split(" ")
.map(w => w.split(/[^a-z]/).join(""))
.join("-");
console.log(chapters);
render_and_copy(
<>
<div
class="main"
style='font-family: "Latin Modern Math", "Computer Modern", "Helvetica", serif;font-weight:bold'
>
<a
href="https://dn790009.ca.archive.org/0/items/thestrangecaseof00043gut/43.txt"
style="display:block;margin:0 auto;width:fit-content;font-size:1.35rem;font-weight:bold"
>
massive thanks to project gutenberg for the book
</a>
<br />
<a
href="#user-content-mehbark-hekyll-end"
id="mehbark-hekyll-jump-to-end"
style="display:block;margin:0 auto;width:fit-content;font-size:1.35rem;font-weight:bold"
>
JUMP TO END
</a>
<br />
<br />
<h3>Table of Contents (clickable!)</h3>
<ol>
{...chapters.map(([title, _]) => (
<li>
<a
href={`#user-content-chapter-${make_chapter_id(
title
)}`}
style="text-decoration:none"
>
{title}
</a>
</li>
))}
</ol>
<br />
<br />
{...chapters.map(([title, content]) => (
<>
<a
href={`#user-content-chapter-${make_chapter_id(title)}`}
id={`chapter-${make_chapter_id(title)}`}
style="text-decoration:none;font-weight:600;font-size:1.25em"
>
{title}
</a>
{...content.map(p => <p>{p}</p>)}
</>
))}
<a
href="#user-content-mehbark-hekyll-jump-to-end"
id="mehbark-hekyll-end"
title="this is also a jump to top"
style="margin:0 auto;width:fit-content;font-size:1.75em;font-weight:bold;display:block;text-decoration:none"
>
THE END
</a>
</div>
{
"\n\n---\n\nsorry for abusing the read more, but it's necessary to make saving your place more convenient"
}
</>
);

24
html/stars.tsx Normal file
View file

@ -0,0 +1,24 @@
import { render_and_copy } from "./common.tsx";
const Star = () => (
<div
class="star same-place"
style={{
transform: `translate(calc(${(Math.random() * 50 - 25).toFixed(
2
)}rem * var(--tw-border-opacity, 0)), calc(${(
Math.random() * 50 -
25
).toFixed(2)}rem * var(--tw-border-opacity, 0)))`,
}}
>
*
</div>
);
const Stars = ({ n }: { n: number }) => (
<div id="stars" class="same-place">
{...Array.from({ length: n }, Star)}
</div>
);
render_and_copy(<Stars n={150} />);

View file

@ -2,31 +2,49 @@ import { ComponentChildren } from "preact";
import { Main, mk_class_wrapper, render_and_copy } from "./common.tsx";
// i heard you liked posts, so i put a post in your post so you can post while you post
const ReblogIcon = () => (
<img
src="https://static.pyrope.net/cohost-reblog.png"
alt="the cohost reblog icon"
class="reblog"
/>
);
const ReblogIcon = ({ alt_text = true }: { alt_text?: boolean }) =>
alt_text ? (
<img
src="https://static.pyrope.net/cohost-reblog.png"
alt="the cohost reblog icon"
class="reblog"
/>
) : (
<img src="https://static.pyrope.net/cohost-reblog.png" class="reblog" />
);
const LikeIcon = () => (
<img
src="https://static.pyrope.net/cohost-like.png"
alt="the cohost like icon"
class="like"
/>
);
const LikeIcon = ({ alt_text = true }: { alt_text?: boolean }) =>
alt_text ? (
<img
src="https://static.pyrope.net/cohost-like.png"
alt="the cohost like icon"
class="like"
/>
) : (
<img src="https://static.pyrope.net/cohost-like.png" class="like" />
);
const OptionsIcon = () => (
<img
src="https://static.pyrope.net/cohost-post-options.png"
alt="the cohost icon for post options"
class="options"
/>
);
const OptionsIcon = ({ alt_text = true }: { alt_text?: boolean }) =>
alt_text ? (
<img
src="https://static.pyrope.net/cohost-post-options.png"
alt="the cohost icon for post options"
class="options"
/>
) : (
<img
src="https://static.pyrope.net/cohost-post-options.png"
class="options"
/>
);
const Bottom = ({ n_comments }: { n_comments: number }) => (
export const Bottom = ({
n_comments,
alt_text = true,
}: {
n_comments: number;
alt_text?: boolean;
}) => (
<div class="bottom">
<div class="bottom-inner">
<a
@ -34,8 +52,8 @@ const Bottom = ({ n_comments }: { n_comments: number }) => (
href="https://413.gay"
>{`${n_comments} comments`}</a>
<div class="interactions">
<ReblogIcon />
<LikeIcon />
<ReblogIcon alt_text={alt_text} />
<LikeIcon alt_text={alt_text} />
</div>
</div>
</div>
@ -56,17 +74,19 @@ const Content = ({
const Middle = mk_class_wrapper("middle");
// no reblog sorry :(
const Top = ({
export const Top = ({
display_name,
username,
link,
posted,
alt_text = true,
}: {
display_name?: string;
username: string;
posted: string;
link: string;
link?: string;
id?: string;
alt_text?: boolean;
}) => (
<div class="top">
<div class="top-info">
@ -82,11 +102,11 @@ const Top = ({
{posted}
</a>
</div>
<OptionsIcon />
<OptionsIcon alt_text={alt_text} />
</div>
);
const Hrish = () => (
export const Hrish = () => (
<div class="hrish">
<hr />
</div>

135
html/top-and-bottom.less Normal file
View file

@ -0,0 +1,135 @@
@longan: rgb(var(--color-longan));
@not-white: rgb(var(--color-notWhite));
@not-black: rgb(var(--color-notBlack));
@fg: rgb(var(--color-foreground));
@bg: rgb(var(--color-background));
@height: 20rem;
* {
margin: 0;
}
hr {
border-color: rgb(191 186 181);
margin: 0 0.75rem;
}
.hrish {
background-color: @not-white;
}
#fake-main {
height: @height;
margin: -1rem 0;
}
#main {
position: absolute;
top: 0;
left: 0;
right: 0;
width: 100%;
height: @height;
display: flex;
background-color: @bg;
flex-direction: column;
}
.bottom {
background: @not-white;
font-size: 0.875rem;
color: gray;
padding: 0.75rem;
width: 100%;
max-width: 100%;
border-bottom-right-radius: 0.5rem;
border-bottom-left-radius: 0.5rem;
box-shadow: 0px 4px 5px rgba(25,25,25,.14),0px 1px 10px rgba(25,25,25,.12),0px 2px 4px rgba(0,0,0,.2);
}
.bottom-inner {
display: flex;
justify-content: space-between;
vertical-align: middle;
}
// V compromise V
a {
text-decoration: none;
}
.comments {
width: max-content;
flex: none;
}
.interactions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 0.75rem;
}
.content {
background-color: white;
padding: 0 0.75rem;
display: flex;
min-height: min-content;
flex-grow: 1;
padding-top: 0.5rem;
}
.middle {
// V the main feed uses gap: 3rem V
height: 3rem;
}
.top {
display: flex;
width: 100%;
max-width: 100%;
flex-direction: row;
align-items: center;
justify-content: space-between;
gap: 0.5rem;
border-top-left-radius: 0.5rem;
border-top-right-radius: 0.5rem;
background-color: @not-white;
padding: 0.75rem;
box-shadow: 0px -4px 5px rgba(25,25,25,.14),0px -1px 10px rgba(25,25,25,.12),0px -2px 4px rgba(0,0,0,.2);
}
.top-info {
display: flex;
min-width: 0;
flex: 1 1 0%;
flex-direction: row;
flex-wrap: wrap;
align-items: center;
gap: 0.5rem;
line-height: 1;
}
.display-name {
max-width: 100%;
flex-shrink: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-weight: 700;
color: @not-black;
}
.username {
color: rgb(104 102 100);
}
.posted {
display: block;
flex: none;
font-size: 0.75rem;
line-height: 1rem;
// not doing the weird tabular-nums thing, i don't get it
color: rgb(130 127 124);
}

80
html/train.tsx Normal file
View file

@ -0,0 +1,80 @@
import { render_and_copy } from "./common.tsx";
import { ComponentChildren } from "preact";
const Rail = ({ rotation, r }: { rotation: string; r: string }) => (
<div
style={{
transform: `rotate(${rotation}) translateX(${r})`,
gridArea: "1/1",
}}
>
🪜
</div>
);
const Track = ({
segments,
r,
children,
}: {
segments: number;
r: string;
children?: ComponentChildren;
}) => (
<div
style={{
display: "grid",
width: "100%",
aspectRatio: "2/1",
justifyItems: "center",
alignItems: "center",
transform: "rotateX(60deg)",
margin: "0 auto",
perspective: "1000px",
perspectiveOrigin: "top",
}}
>
{...Array.from({ length: segments }, (_, i) => (
// deg is actually more space-efficient lel
<Rail rotation={`${(360 / segments) * i}deg`} r={r} />
))}
{children}
</div>
);
const Train = ({
children,
delay_s,
}: {
children: ComponentChildren;
delay_s: number;
}) => (
<div
id="contrainer"
style={`animation: spin 20s ${
delay_s - 20
}s linear reverse infinite; transform-origin: center; width: 20.5rem; grid-area: 1/1; transform-style: preserve-3d;`}
>
<div
id="train"
style="font-size: 2rem; width: fit-content; transform-style: preserve-3d; transform: rotate(-90deg)"
>
{children}
</div>
</div>
);
// we can have things with animation delays for both the engine and the cars
// configurable animation length for sure
// it's so funny seeing css crimes from like a year ago and they are just like on a different level
render_and_copy(
<Track segments={60} r={"8rem"}>
<Train delay_s={0}>🚂</Train>
<Train delay_s={0.8}>🚃</Train>
<Train delay_s={1.6}>🚃</Train>
<Train delay_s={2.4}>🚃</Train>
<Train delay_s={3.2}>🚃</Train>
</Track>
);

17
html/tumblr.tsx Normal file
View file

@ -0,0 +1,17 @@
import { render_and_copy } from "./common.tsx";
import { Post } from "./one-post.tsx";
const DASH_BG = "#36465D";
// mainly doing this in pch, but i'll gen a chost for a funny
render_and_copy(
<Post
headline="hey guys"
username="mehbark"
posted="10.2 hr. ago"
link="https://cohost.org/mehbark/post/4550377-hey-guys/dbb81e7b5db74ffd942bf76ea5eb72a6"
n_comments={413}
>
oh wait oops wrong website
</Post>
);

View file

@ -0,0 +1,88 @@
import { render_and_copy } from "./common.tsx";
const Digit = ({
length_per_s,
digits,
}: {
length_per_s: number;
digits: (number | string)[];
}) => (
<div
style={{
display: "inline-block",
fontVariant: "tabular-nums",
overflow: "hidden",
height: "1rem",
}}
>
<div
style={{
transform: "translateY(-100%)",
animation: `spin ${
(length_per_s * digits.length) / 60
}s 0s reverse infinite alternate steps(${digits.length}, end)`,
position: "relative",
}}
>
{...digits.map(d => (
<div
style={{
height: "1rem",
transform: "translateY(75%)",
textAlign: "right",
}}
>
{d}
</div>
))}
</div>
</div>
);
// silly
const make_digits = ({
up,
cycle_up,
cycle_down,
}: {
up: number[];
cycle_up: number;
cycle_down: number;
}) => [
...new Array(cycle_up).flatMap(() => up),
...new Array(cycle_down).flatMap((_, i) =>
i == 0 ? up.toReversed().slice(1) : up.toReversed()
),
];
console.log(
make_digits({
up: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
cycle_up: 6,
cycle_down: 10,
})
);
render_and_copy(
<span>
<Digit
length_per_s={60}
digits={new Array(20).fill(undefined).map((_, i) =>
(i < 10 ? 10 - i : -(i - 10))
.toString()
.replace(/-([0-9])$/, "-0$1")
.replace(/^([0-9])$/, "0$1")
)}
/>
:
<Digit
length_per_s={1}
digits={new Array(60 * 20)
.fill(undefined)
.map((_, i) =>
(i < 30 * 60 ? 59 - (i % 60) : i % 60)
.toString()
.padStart(2, "0")
)}
/>
</span>
);

12
html/weird-bug.tsx Normal file
View file

@ -0,0 +1,12 @@
import { ToggleOnClick } from "./common.tsx";
import { render_and_copy } from "./common.tsx";
render_and_copy(
<ToggleOnClick>
<img
src="https://staging.cohostcdn.org/attachment/f9a8c5c3-6ccc-4592-ac51-131eaa6872e3/weird-bug.gif"
alt="the camera rotates to reveal that the eggbug has numerous legs holding it up. gross! there is also a wall of notification mangos behind the bug."
/>
<p>hello world</p>
</ToggleOnClick>
);

19
mcai-capture-count.csv Normal file
View file

@ -0,0 +1,19 @@
blog,captures
amb,7
bonbon,80
cefqrn,68
multioculate,19
coldcalzone,11
easrng,43
frostsparks,22
joeled,8
buyduskonsteam,17
wowperfect,64
mehbark,182
mocha,29
filenine,14
opossumcaviar,10
sirocyl,82
trashbees,4
twilight-sparkle,72
warc,65
1 blog captures
2 amb 7
3 bonbon 80
4 cefqrn 68
5 multioculate 19
6 coldcalzone 11
7 easrng 43
8 frostsparks 22
9 joeled 8
10 buyduskonsteam 17
11 wowperfect 64
12 mehbark 182
13 mocha 29
14 filenine 14
15 opossumcaviar 10
16 sirocyl 82
17 trashbees 4
18 twilight-sparkle 72
19 warc 65

1
name.txt Normal file
View file

@ -0,0 +1 @@
Cohost Artist Alley Repository

73
pch/name-color-promo.toml Normal file
View file

@ -0,0 +1,73 @@
version = 1
[[modules]]
plugin = 'source.text'
data.contents = '''
drag to see the wonderful, magical, beautiful, awesome and transformative awesome wonder of the <span style="font-family: serif">name-color</span> system that is wonderful:
<div id=main>
<div id=example>
<p>did you know that <span style="color: #3eba73">@webark</span> was originally created by <span style="color: #008282">@mehbark</span>? it's true! nowadays, <span style="color: #3eba73">@webark</span> has many members, commonly referred to internally as "shards," such as <span style="color: #ff007b">@auramgold</span>, <span style="color: #008282">@mehbark</span>, and <span style="color: #134c93">@testbark</span> (okay, not that last one).</p>
<p>
due to their inevitably tumultuous nature, <span style="color: #3eba73">@webark</span> and its spinoffs, such as @webark-meta and <span style="color: #ffdddd">@diarrhea-dogblast</span>, are known to change handles often. they have even swapped in the past. not many accounts have name-colors so uh shout out to <span style="color: #39B366">@LemmaEOF</span>
</p>
</div>
<div id=slider-holder>
<div id=ungrey></div>
<div id=greyer></div>
</div>
</div>'''
data.language = 'html'
sends = [2]
title = 'html'
[[modules]]
plugin = 'source.lesscss'
data.contents = '''
#main {
display: grid;
width: min(80%, 12cm);
max-width: auto;
margin: 0 auto;
}
#main > * {
grid-area: 1/1;
}
#slider-holder {
height: 100%;
display: flex;
max-width: 100%;
overflow: hidden;
pointer-events: none;
}
#ungrey {
width: 10%;
height: 100%;
overflow: hidden;
resize: horizontal;
border-right: 2px solid rgb(var(--color-cherry));
max-width: 100%;
min-width: 0;
pointer-events: all;
}
#greyer {
backdrop-filter: grayscale(1);
height: 100%;
flex: 1;
max-width: auto;
min-width: 0;
}'''
sends = [2]
[[modules]]
plugin = 'transform.style-inliner'
data.mode = 'attr'
sends = ['output']
[[modules]]
plugin = 'source.lesscss'
data.contents = ''
graphPos = [-120, 192]

160
pch/optical-illusion.toml Normal file
View file

@ -0,0 +1,160 @@
version = 1
[[modules]]
plugin = 'source.text'
data.contents = '''
<div id=main>
<div id=circle>
<div id=text>
your brain<br>
tricks you into<br>
thinking that this is<br>
readable:<br>
jdfklieyhglmn
</div>
<div id=unwiggle>
<div id=wiggle>
<div id="alt-text-no-not-like-that">
<span class=old-text>
your brain<br>
tricks you into<br>
thinking that this is<br>
readable:<br>
</span>
<span class=new-text>
homestuck lol
</span>
</div>
</div>
</div>
<div id=spooky>
<span class=old-text>
your brain<br>
tricks you into<br>
thinking that this is<br>
readable:<br>
</span>
<span>
<span class="word w1">BUT </span><span class="word w2">YOU </span><span class="word w3">KNOW </span><span class="word w4">THAT'S </span><br><span class="word w5">NOT </span><span class="word w6">TRUE </span><span class="word w7">RIGHT</span><span class="word w8">?</span>
</span>
</div>
</div>'''
data.language = 'html'
sends = [2]
title = 'html'
[[modules]]
plugin = 'source.lesscss'
data.contents = '''
#main {
width: 100%;
aspect-ratio: 1;
display: flex;
}
#circle {
width: 50%;
height: 50%;
margin: auto;
border: 0.4rem solid rgb(calc(var(--tw-border-opacity,0)*255), calc(var(--tw-border-opacity,0)*255), calc(var(--tw-border-opacity,0)*255));
transition: color 1s ease;
border-radius: 413rem;
text-align: center;
display: grid;
}
#circle > div {
grid-area: 1/1;
}
.old-text {
color: transparent;
}
.new-text {
background-color: rgb(
calc((1 - var(--tw-border-opacity, 0)) * 255),
calc((1 - var(--tw-border-opacity, 0)) * 255),
calc((1 - var(--tw-border-opacity, 0)) * 255)
);
transition: background-color 1s ease;
}
#alt-text-no-not-like-that {
transform: translateX(40rem);
animation: spin 5s 10s both linear;
}
#wiggle {
transform: translateY(2rem);
animation: spin 0.25s 10s 20 alternate both ease;
}
#unwiggle {
transform: translateY(-2rem);
}
#spooky {
transform: scale(1.02);
animation: spin 0.5s both infinite alternate ease-out;
}
.word {
transform: translateY(40rem);
display: inline-block;
background-color: rgb(
calc((1 - var(--tw-border-opacity, 0)) * 255),
calc((1 - var(--tw-border-opacity, 0)) * 255),
calc((1 - var(--tw-border-opacity, 0)) * 255)
);
animation: spin 10s both linear;
color: maroon;
transition: background-color 1s ease;
}
.w1 {
animation-delay: 20s;
}
.w2 {
animation-delay: 22s;
}
.w3 {
animation-delay: 24s;
}
.w4 {
animation-delay: 26s;
}
.w5 {
animation-delay: 28s;
}
.w6 {
animation-delay: 30s;
}
.w7 {
animation-delay: 35s;
}
.w8 {
animation-delay: 40s;
}
.w5, .w6, .w7, .w8 {
background-color: none !important;
}'''
sends = [2]
[[modules]]
plugin = 'transform.style-inliner'
data.mode = 'attr'
sends = ['output']
[[modules]]
plugin = 'source.lesscss'
data.contents = ''
graphPos = [-120, 192]

525
pch/stars.toml Normal file

File diff suppressed because one or more lines are too long

205
pch/tumblr.toml Normal file
View file

@ -0,0 +1,205 @@
version = 1
title = 'Style Inlining'
[[modules]]
plugin = 'source.text'
data.contents = '''
<div id=main>
<div class=post>
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
<div class=content>
<h1>"the setup was at the beginning"</h1>
<p>has got to be one of my favorite quotes from anything ever. it's so rad</p>
</div>
</div>
<div class=post>
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
<div class=content>
<h1>hey guys welcome to my tumblr dash</h1>
<p>please enjoy! and do not mention cartoons or i will have no choice but to work with the <a href="https://fbi.gov">FBI</a></p>
<div class=tags><a href="https://cohost.org/rc/tagged/I'm%20Not%20Going%20To%20Do%20Many%20Tags%20Because%20It%20Is%20A%20Pain%20Because%20I'm%20Writing%20This%20All%20By%20Hand%20For%20Some%20Reason">#I'm Not Going To Do Many Tags Because It Is A Pain Because I'm Writing This All By Hand For Some Reason</a> <a href="https://cohost.org/rc/tagged/not%20sure%20why%20i%20was%20kanaya%20there">#not sure why i was kanaya there</a></div>
</div>
</div>
<div class=post>
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
<div class=content>
<h1>apparently tumblr lost all of their sans clothes</h1>
<p>hence everything being bare-bones right now</p>
<div class=tags><a href="https://cohost.org/rc/tagged/badumtiss">#badumtiss</a></div>
</div>
</div>
<div class=post>
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
<div class=content>
<h1>it is becoming quickly apparent that i cannot tumblr post</h1>
<p>i have no idea what i'm doing, so i'll do what i always do in this situation: do a bunch and hope that makes things funny</p>
<div class=tags><a href="https://cohost.org/rc/tagged/badumtiss">#badumtiss</a></div>
</div>
</div>
<div class="ch post">
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
<div class=content>
<div style="margin:0"><!--ps=2--><div style="margin:0;display:flex;align-items:center;border-top-left-radius:0.5rem;border-top-right-radius:0.5rem;background-color:rgb(var(--color-notWhite));padding:0.75rem;box-shadow:0px -4px 5px rgba(25,25,25,0.14),0px -1px 10px rgba(25,25,25,0.12),0px -2px 4px rgba(0,0,0,0.2)"><div style="margin:0;display:flex;flex:1 1 0%;flex-direction:row;flex-wrap:wrap;align-items:center;gap:0.5rem;line-height:1"><a href="https://cohost.org/mehbark" style="margin:0;text-decoration:none;color:#686664">@mehbark</a><a href="https://cohost.org/mehbark/post/4550377-hey-guys/dbb81e7b5db74ffd942bf76ea5eb72a6" style="margin:0;text-decoration:none;font-size:0.75rem;color:#827f7c">10.2 hr. ago</a></div><img src="https://static.pyrope.net/cohost-post-options.png" alt="the cohost icon for post options" style="margin:0"></div><div style="margin:0;background-color:rgb(var(--color-notWhite))"><hr style="border-color:#bfbab5;margin:0 0.75rem"></div><div style="margin:0;box-shadow:0px 4px 5px rgba(0,0,0,0.14),0px 1px 10px rgba(0,0,0,0.12),0px 2px 4px rgba(0,0,0,0.2);background-color:white"><div style="margin:0;padding:0.75rem"><a href="https://cohost.org/mehbark/post/4550377-hey-guys/dbb81e7b5db74ffd942bf76ea5eb72a6" style="margin:0;text-decoration:none;font-size:1.25rem;line-height:1.75rem"><h1 style="margin:0;color:black;font-size:inherit">hey guys</h1></a></div><div style="display:flex;margin:0"><div style="margin:0;padding-left:0.75rem;padding-right:0.75rem;margin-top:1rem;margin-bottom:1rem;color:rgb(var(--color-notBlack))">oh wait oops wrong website</div></div></div><div style="margin:0;background-color:rgb(var(--color-notWhite))"><hr style="border-color:#bfbab5;margin:0 0.75rem"></div><div style="margin:0;background:rgb(var(--color-notWhite));font-size:0.875rem;color:gray;padding:0.75rem;border-bottom-right-radius:0.5rem;border-bottom-left-radius:0.5rem;box-shadow:0px 4px 5px rgba(25,25,25,0.14),0px 1px 10px rgba(25,25,25,0.12),0px 2px 4px rgba(0,0,0,0.2)"><div style="margin:0;display:flex;justify-content:space-between"><a href="https://413.gay" style="margin:0;text-decoration:none">413 comments</a><div style="margin:0;display:flex;align-items:center;gap:0.75rem"><img src="https://static.pyrope.net/cohost-reblog.png" alt="the cohost reblog icon" style="margin:0"><img src="https://static.pyrope.net/cohost-like.png" alt="the cohost like icon" style="margin:0"></div></div></div></div>
</div>
</div>
<div class=post>
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
<div class=content>
<h1>wait</h1>
</div>
</div>
<div class=post>
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
<div class=content>
<h1>is there anyone else here?</h1>
<p>and why is it chron instead of reverse chron???</p>
</div>
</div>
<div class=post>
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
<div class=content>
<h1>this is honestly scary :(((</h1>
</div>
</div>
<div class=post>
<img src="https://static.wikia.nocookie.net/mspaintadventures/images/8/81/Vriska_Serket.png" alt="vriska serket from homestuck">
<div class=content>
<h1 style="color: #005682">Hi!!!!!!!!</h1>
<div class=tags>
<a href="https://cohost.org/rc/tagged/8">#8</a>
<a href="https://cohost.org/rc/tagged/vriska">#vriska</a>
<a href="https://cohost.org/rc/tagged/dice">#dice</a>
<a href="https://cohost.org/rc/tagged/vision%20eightfold">#vision eightfold</a>
<a href="https://cohost.org/rc/tagged/etc">#etc</a>
</div>
</div>
</div>
<div class=post>
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
<div class=content>
<h1>your tagging is utterly absurd BUT</h1>
<p>hi vriska!! whatttttt this is so crazy! mehtumblr is so awesome this is a good post and not a waste of time</p>
</div>
</div>
<div class=post>
<img src="https://static.wikia.nocookie.net/mspaintadventures/images/9/96/Terezi_Pyrope.png" alt="terezi pyrope from homestuck">
<div class=content>
<h1 style="color: #008282">H1-</h1>
</div>
</div>
<div class=post>
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
<div class=content>
<div style="overflow: visible; width: 0">
<h1 style="color: red; font-size: 10cm; white-space: nowrap; margin: 0; transform: rotate(355deg); animation: spin 0.05s infinite alternate-reverse linear both;">HOLY CRAP TEREZI WHAT</h1>
</div>
</div>
</div>
<div class=post>
<img src="https://static.wikia.nocookie.net/mspaintadventures/images/9/96/Terezi_Pyrope.png" alt="terezi pyrope from homestuck">
<div class=content>
<h1 style="color: #008282">PUNCHL1N3</h1>
</div>
</div>
<div class=post>
<img src="https://staging.cohostcdn.org/avatar/157583-20bb226b-6637-46f9-82f9-b162c08a63bd-profile.png?dpr=2&width=80&height=80&fit=cover&auto=webp">
<div class=content>
<h1>oh terezi, you're so funny</h1>
<p>there being a punchline would imply that there was a setup!</p>
<p>
oh, right,
</p>
</div>
</div>
</div>'''
data.language = 'html'
sends = [2]
[[modules]]
plugin = 'source.text'
data.contents = '''
#main {
font-family: helvetica, sans-serif;
background-color: #36465D;
width: 100%;
margin: 0;
background-clip: border-box;
padding: 1rem;
display: flex;
flex-direction: column;
gap: 1rem;
overflow: scroll;
color: black;
//height: 50vh;
}
.post {
display: flex;
gap: 1rem;
}
.content > h1 {
font-size: 1.5rem;
}
.post > img {
border-radius: 5%;
object-fit: cover;
aspect-ratio: 1;
margin-top: 0;
margin-bottom: auto;
flex: 1;
min-width: 0;
min-height: 0;
}
.content {
background-color: white;
flex: 9 0 20%;
border-radius: 7px;
padding: 1rem;
}
.ch.post > .content {
padding: 0;
font-family: Atkinson Hyperlegible, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
}
.tags {
font-size: 0.8rem;
color: grey;
}
.tags > a {
text-decoration: none;
}'''
data.language = 'css'
sends = [2]
[[modules]]
plugin = 'transform.style-inliner'
data.mode = 'attr'
sends = [3]
[[modules]]
plugin = 'transform.svg-to-background'
data.useSvgo = true
sends = ['output']
[[modules]]
plugin = 'source.sass'
data.contents = ''
data.syntax = 'scss'
sends = [2]
graphPos = [-480, 168]
[[modules]]
plugin = 'source.sass'
data.contents = ''
data.syntax = 'scss'
[[modules]]
plugin = 'source.sass'
data.contents = ''
data.syntax = 'scss'

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,146 @@
// once a minute (what's the point if it's out of date!)
// do days since last update (0 will be obvious then), should (please please please let this be true) only need three digits MAX
// until hs2 ends of course but let's not think about that now
// okay aaaa hs2 will end that will be sad and good i guess but
// not important right now
// would be neat (but painful) to have it actually roll like an analog thing
import { contentType } from "https://deno.land/std@0.202.0/media_types/mod.ts";
import {
DOMParser,
} from "https://deno.land/x/deno_dom@v0.1.38/deno-dom-wasm.ts";
import {
Image,
TextLayout,
} from "https://deno.land/x/imagescript@1.2.15/ImageScript.js";
// not sure how worthwhile this optimization is but
const dom_parser = new DOMParser();
async function get_last_update_date(): Promise<
{ last_updated: Date; last_update_count: number } | string
> {
try {
const res = await fetch("https://homestuck2.com/story/log");
const body = await res.text();
if (!body) return "couldn't get a string body";
// could just regex for the date lol
const doc = dom_parser.parseFromString(body, "text/html");
if (!doc) return "couldn't parse the body into the DOM";
const time = doc.querySelector("time");
if (!time) return "couldn't get even a single time from the doc (bad!)";
console.log(time.attributes.getNamedItem("datetime")?.value);
const datetime = time.attributes.getNamedItem("datetime")?.value;
if (!datetime) return "time didn't have datetime attr??";
const date = new Date(datetime);
// should work until the year 10000
// includes the hour for safety (NVM: WHAT IF IT ROLLED OVER (ugh let's hope that doesn't happen for the day))
const date_prefix = date.toISOString().slice(0, 10);
return {
last_updated: date,
last_update_count:
doc.querySelectorAll(`time[datetime^="${date_prefix}"]`)
.length,
};
} catch (e) {
return `caught error: ${e}`;
}
}
async function check_again() {
last_checked = new Date();
const stuff = await get_last_update_date();
if (typeof stuff == "string") {
console.log(`failed to get a date when checking 😬: '${stuff}'`);
console.log(
"^ ironically enough, this is more likely when there *is* an update",
);
console.log(
"^ unironically, this is *most* likely the result of a bug",
);
return;
}
last_updated = stuff.last_updated;
last_update_count = stuff.last_update_count;
}
function days_since_update(): number {
const millis = new Date().getTime() - last_updated.getTime();
return millis / (24 * 60 * 60 * 1000);
}
// silly, i know
let last_updated: Date = new Date(0);
let last_checked: Date = new Date();
let last_update_count = 0;
await check_again();
// *definitely* a worthwhile optimization
// (still inefficient to go over http...)
const font = await fetch("https://static.pyrope.net/courier-std-bold.otf")
.then((r) => r.arrayBuffer())
.then((b) => new Uint8Array(b));
function make_image(n: number): Image {
const days = Math.floor(n).toString().padStart(3, "0");
let image = new Image(110, 44);
const outline = Image.renderText(
font,
64,
days,
0xff_ff_ff_ff,
new TextLayout({ verticalAlign: "center", horizontalAlign: "middle" }),
);
for (const hshift of [-2, 0, 2]) {
for (const vshift of [-2, 0, 2]) {
image = image.composite(outline, hshift - 4, vshift);
}
}
const text = Image.renderText(
font,
64,
days,
0x00_00_00_ff,
new TextLayout({ verticalAlign: "center", horizontalAlign: "middle" }),
);
return image.composite(text, -4);
}
async function update_images() {
[last_updated_image, last_update_count_image] = await Promise.all([
make_image(days_since_update()).encode(),
make_image(last_update_count).encode(),
]);
}
let last_updated_image: Uint8Array = new Uint8Array();
let last_update_count_image: Uint8Array = new Uint8Array();
await update_images();
const image_response = (data: Uint8Array): Response =>
new Response(data, {
headers: { "Content-Type": contentType("png") },
});
Deno.serve({ port: 61264 }, async (req) => {
const url = new URL(req.url);
if ((new Date().getTime() - last_checked.getTime()) >= 60 * 1000) {
await check_again();
await update_images();
}
// could use URLPattern but that would be overkill for this
if (url.pathname.match("count")) {
return image_response(last_update_count_image);
} else {
return image_response(last_updated_image);
}
});

126
serverside/name-color.ts Normal file
View file

@ -0,0 +1,126 @@
import {
DOMParser,
} from "https://deno.land/x/deno_dom@v0.1.46/deno-dom-wasm.ts";
import * as css from "https://deno.land/x/css@0.3.0/mod.ts";
// so, so brittle
function is_valid_color(color: string): boolean {
try {
const { stylesheet } = css.parse(`*{color:${color};}`);
return color.toLowerCase() != "example"
&& stylesheet.rules.length == 1
&& stylesheet.rules[0].declarations.length == 1;
} catch {
return false;
}
}
// maybe a bit high, maybe a bit low
const MAX_AGE_MS = 10 * 60 * 1000;
// > "light-dark(oklab(000, 000, 000), oklab(255, 255, 255))".length
// 54
const MAX_COLOR_LEN = 512;
const colors: Record<
string,
{ color: string | undefined; last_checked: Date }
> = {};
const dom_parser = new DOMParser();
function parse_color(str: string): string | undefined {
const text = str.replace(/^#/, "");
if (text.startsWith("name-color:")) {
const line = text.split("\n", 1)[0];
const color = line.split("name-color:")[1]
.trim()
.slice(0, MAX_COLOR_LEN)
.replaceAll(/[;{}"']|\/\*|\*\//g, "");
if (is_valid_color(color)) {
return color;
} else {
console.log(`invalid color!!!! ${color}`);
}
}
}
async function get_name_color(name: string): Promise<string | undefined> {
console.log(`fetching ${name}...`);
const resp = await fetch(`https://cohost.org/${name}`);
if (!resp.ok) {
console.log(`fetching https://cohost.org/${name} failed!`);
return;
}
const body = await resp.text();
const dom = dom_parser.parseFromString(body, "text/html");
if (!dom) {
console.log(`parsing https://cohost.org/${name} to the dom failed!`);
return;
}
const a = dom.querySelector("a[href*='name-color:']");
if (a) {
const href = a.getAttribute("href");
if (href) {
const color = parse_color(href);
if (color) return color;
}
}
for (const p of dom.querySelectorAll("p, a")) {
if (!p.textContent.includes("name-color:")) continue;
for (const node of p.childNodes) {
const color = parse_color(node.textContent);
if (color) return color;
}
}
}
async function update_name_color(name: string) {
const now = new Date();
if (
colors[name] &&
now.getTime() - colors[name].last_checked.getTime() <= MAX_AGE_MS
) {
return;
}
const color = await get_name_color(name);
colors[name] = { color, last_checked: now };
}
function cssify({ requester }: { requester?: string }): string {
const preamble = `/* customized: ${
Object.keys(colors)
.filter((name) => colors[name].color)
.sort()
.join(", ")
} */\n/* look, i don't like !important either, but i think it's a better choice than some lame .spec.ific.ity.hack.ing */\n\n`;
let vars = `:root {\n`;
if (requester && colors[requester]) {
vars += `--name-color: var(--name-color-${requester.toLowerCase()});\n`;
}
let classes = "";
for (const name of Object.keys(colors).sort()) {
const { color } = colors[name];
if (!color) continue;
vars += `--name-color-${name.toLowerCase()}: ${color};\n`;
classes +=
`a[href$='/${name}' i]{color: var(--name-color-${name.toLowerCase()}) !important;}\n`;
}
vars += "}\n\n";
return preamble + vars + classes;
}
Deno.serve({ port: 61266 }, async (req) => {
const url = new URL(req.url);
const names = url.searchParams.getAll("name").filter((name) =>
!name.match(/[\/\\?"';{}]/)
).map((name) => name.toLowerCase());
await Promise.all(names.map(update_name_color));
const css = cssify({
requester: url.searchParams.get("requester") ?? undefined,
});
return new Response(css, { headers: { "content-type": "text/css" } });
});

105
serverside/prngnouns.ts Normal file
View file

@ -0,0 +1,105 @@
// TODO: randomly pick color
import { contentType } from "https://deno.land/std@0.202.0/media_types/mod.ts";
import {
Image,
TextLayout,
} from "https://deno.land/x/imagescript@1.2.15/ImageScript.js";
const font = await fetch("https://static.pyrope.net/courier-std-bold.otf")
.then((r) => r.arrayBuffer())
.then((b) => new Uint8Array(b));
function make_image(
{ text, color = 0, outline_color = 0xff_ff_ff_ff }: {
text: string;
color?: number;
outline_color?: number;
},
): Image {
let image = Image.renderText(
font,
64,
text,
0,
new TextLayout({ verticalAlign: "center", horizontalAlign: "middle" }),
);
const outline = Image.renderText(
font,
64,
text,
outline_color,
new TextLayout({ verticalAlign: "center", horizontalAlign: "middle" }),
);
for (const hshift of [-2, 0, 2]) {
for (const vshift of [-2, 0, 2]) {
image = image.composite(outline, hshift, vshift);
}
}
const text_img = Image.renderText(
font,
64,
text,
color,
new TextLayout({ verticalAlign: "center", horizontalAlign: "middle" }),
);
const final = image.composite(text_img);
return final.crop(0, 0, final.width, final.height - 22);
}
// the whole cache thing def sketches me out, but people probably won't be *that* malicious
const MAX_PRN_LENGTH = 128;
// shouldn't really be a problem
const MAX_PRN_CHOICES = 256;
// let's stick to hex even though BigInt() can handle prefixes (prefices?)
const hex_string_to_color = (s: string): number | undefined => {
const parsed = parseInt(s, 16);
if (Number.isNaN(parsed)) return;
// JANK! SORRY
return Number((BigInt(parsed) << 8n) | 0xffn);
};
const image_response = (data: Uint8Array): Response =>
new Response(data, {
headers: { "Content-Type": contentType("png") },
});
Deno.serve({ port: 61265 }, async (req) => {
const url = new URL(req.url);
const params = url.searchParams;
const prns = params.getAll("p");
if (prns.some((p) => p.length > MAX_PRN_LENGTH)) {
return new Response(`MAX_PRN_LENGTH = ${MAX_PRN_LENGTH}`, { status: 413 });
}
if (prns.length > MAX_PRN_CHOICES) {
return new Response(`MAX_PRN_CHOICES = ${MAX_PRN_CHOICES}`, {
status: 413,
});
}
const prn = prns[Math.floor(Math.random() * prns.length)] ??
"NONE, APPARENTLY";
const fg_str = params.get("fg");
const outline_str = params.get("outline");
const sentence_id = params.get("sentence_id");
const sentence_index = params.get("sentence_index");
console.log(
`${sentence_id}#${sentence_index}: chose ${prn} from ${prns}. ${fg_str} on ${outline_str}`,
);
const fg = hex_string_to_color(fg_str ?? "0");
const outline = hex_string_to_color(outline_str ?? "ffffff");
const resp = image_response(
await make_image({ text: prn, color: fg, outline_color: outline }).encode(),
);
return resp;
});

View file

@ -153,7 +153,8 @@ const secret_messages = [
"it would be cool if floppies were actually reliable",
"epic win! this message has a 1% chance of appearing! share with your friends",
"you should try curling terezi.pyrope.net",
"caltrop.dev has a ton of cool stuff; the caltrop.dev/meta/map helps",
"Stubborn tiny lights vs. clustering darkness forever ok?",
// "caltrop.dev has a ton of cool stuff; the caltrop.dev/meta/map helps",
"i used a typescript type error to track my progress to one hundred messages",
"haskell...",
"lean4...",
@ -242,8 +243,11 @@ async function count_request() {
Deno.serve({ port: 61261 }, async () => {
await count_request();
draw_times(await num_requests());
draw_secret_message();
const num = await num_requests();
draw_times(num);
const msg = pick_random(secret_messages);
draw_secret_message(msg);
console.log(`${num}: ${msg}`);
fix_border();
const image_format = "png";

BIN
static/courier-std-bold.otf Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 541 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

BIN
static/imgflip/aliens.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 KiB

BIN
static/imgflip/balloon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

BIN
static/imgflip/cefqrn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 KiB

BIN
static/imgflip/drake.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

BIN
static/imgflip/tap-head.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

BIN
static/meme-text/!.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

BIN
static/meme-text/A.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 719 B

BIN
static/meme-text/ALIEN.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
static/meme-text/ARE.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
static/meme-text/BOTTOM.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

BIN
static/meme-text/COHOST.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
static/meme-text/EGGBUG.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
static/meme-text/FOR.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
static/meme-text/GET.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 975 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
static/meme-text/IS.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

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