73 lines
No EOL
71 KiB
HTML
73 lines
No EOL
71 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Pulsing Network Constellations — exploration</title>
|
|
<style>
|
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
body { background: #0a0a0f; color: #3a3a4a; font-family: ui-monospace, monospace; overflow: hidden; }
|
|
#grid { padding: 20px; font-size: 12px; line-height: 1.4; white-space: pre; }
|
|
.c { display: inline-block; transition: all 0.3s; }
|
|
.c.active { color: #fde68a; text-shadow: 0 0 6px rgba(253,230,138,0.5); }
|
|
.c.strong { color: #34d399; text-shadow: 0 0 10px rgba(52,211,153,0.6); font-weight: bold; }
|
|
.c.dead { color: #1a1a2a; }
|
|
#info { position: fixed; bottom: 10px; left: 20px; color: #3a3a4a; font-size: 11px; }
|
|
#controls { position: fixed; top: 10px; right: 20px; color: #666; font-size: 11px; }
|
|
#controls span { cursor: pointer; margin-left: 12px; color: #fde68a; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="grid"></div>
|
|
<div id="info">neurameba · physarum exploration</div>
|
|
<div id="controls"><span id="play-btn">play</span><span id="reset-btn">reset</span></div>
|
|
<script>
|
|
const text = "# API Reference\n\nmotd is API-first. Every feature is an endpoint. Build clients, bots, integrations — whatever you want.\n\n## Base URL\n\n```\nhttps://motd.social/api\n```\n\nLocal dev: `http://localhost:3006/api`\n\n## Response Format\n\nEvery endpoint returns the same envelope:\n\n**Success:**\n```json\n{ \"ok\": true, \"data\": { ... } }\n```\n\n**Error:**\n```json\n{ \"ok\": false, \"error\": \"Something went wrong.\" }\n```\n\nHTTP status codes are standard: 200 success, 400 bad request, 401 unauthorized, 404 not found, 409 conflict.\n\n## Authentication\n\nMost endpoints require authentication. Get a token by registering or logging in, then send it as a Bearer token or let the browser handle it via cookies.\n\n**Header auth (for scripts and clients):**\n```\nAuthorization: Bearer <token>\n```\n\n**Cookie auth (for the web client):**\nThe login endpoints set an `motd_session` httpOnly cookie automatically.\n\nSessions expire after 7 days. Use `/login-permanently` in the web client to persist across tabs (stored in localStorage instead of sessionStorage — the token is the same).\n\n---\n\n## Auth\n\n### POST /api/auth/register\n\nCreate a new account.\n\n**Auth:** none\n\n**Body:**\n```json\n{ \"username\": \"alice\", \"password\": \"hunter2pwd\" }\n```\n\n**Rules:**\n- Username: 3-20 characters, letters, numbers, underscore only\n- Password: minimum 8 characters\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"token\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"user\": {\n \"username\": \"alice\",\n \"display_name\": \"alice\"\n }\n }\n}\n```\n\n**Errors:**\n- `400` — username or password missing, invalid format\n- `409` — username taken\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/auth/register \\\n -H \"Content-Type: application/json\" \\\n -d '{\"username\":\"alice\",\"password\":\"hunter2pwd\"}'\n```\n\n### POST /api/auth/login\n\nLog in to an existing account.\n\n**Auth:** none\n\n**Body:**\n```json\n{ \"username\": \"alice\", \"password\": \"hunter2pwd\" }\n```\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"token\": \"a1b2c3d4-e5f6-7890-abcd-ef1234567890\",\n \"user\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice\"\n }\n }\n}\n```\n\n**Errors:**\n- `400` — missing fields\n- `401` — invalid username or password\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/auth/login \\\n -H \"Content-Type: application/json\" \\\n -d '{\"username\":\"alice\",\"password\":\"hunter2pwd\"}'\n```\n\n### GET /api/auth/me\n\nGet the current authenticated user.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"user\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"bio\": \"building things\",\n \"created_at\": \"2026-03-15T10:30:00.000Z\"\n }\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/auth/me \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### POST /api/auth/logout\n\nEnd the current session.\n\n**Auth:** required\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Logged out.\" } }\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/auth/logout \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Profile\n\n### GET /api/profile/:username\n\nView a user's profile.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"bio\": \"building things\",\n \"created_at\": \"2026-03-15T10:30:00.000Z\",\n \"posts\": 42,\n \"avatar\": [\n \"████ ████\",\n \" ████████ \",\n \"████████████\",\n \" ████████ \",\n \"██ ████ ██\"\n ]\n }\n}\n```\n\n**Errors:**\n- `404` — user not found\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/profile/alice\n```\n\n### PUT /api/profile\n\nUpdate your display name and/or bio.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"display_name\": \"Alice W.\", \"bio\": \"shipping code\" }\n```\n\nBoth fields are optional. Send only what you want to change.\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"username\": \"alice\",\n \"display_name\": \"Alice W.\",\n \"bio\": \"shipping code\",\n \"created_at\": \"2026-03-15T10:30:00.000Z\"\n }\n}\n```\n\n**Errors:**\n- `400` — nothing to update\n\n**Example:**\n```bash\ncurl -X PUT http://localhost:3006/api/profile \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"bio\":\"shipping code\"}'\n```\n\n### GET /api/profile/search?q=\n\nSearch users by username or display name.\n\n**Auth:** none\n\n**Params:**\n- `q` — search query (required, min 1 character)\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"users\": [\n { \"username\": \"alice\", \"display_name\": \"Alice\", \"bio\": \"building things\" },\n { \"username\": \"alice2\", \"display_name\": \"Alice Too\", \"bio\": null }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl \"http://localhost:3006/api/profile/search?q=alice\"\n```\n\n---\n\n## Posts\n\n### POST /api/posts\n\nPublish a post.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"content\": \"just shipped the wasm compiler [rust] [wasm]\" }\n```\n\n**Optional fields:**\n- `reply_to` — post ID to reply to\n\n**Inline commands:**\n- `/attach <media_id>` — attach previously uploaded media to the post. The `/attach` command is stripped from the displayed content.\n\n**Rules:**\n- Content: 1-500 characters\n- Tags use [brackets]: `[rust]`, `[music]`, `[coding]`\n- Tags are auto-extracted and stored\n- New tags are auto-assigned to the \"general\" category\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n }\n}\n```\n\n**Errors:**\n- `400` — empty content, too long, media not found/not yours\n- `404` — reply_to post not found\n\n**Examples:**\n\nSimple post:\n```bash\ncurl -X POST http://localhost:3006/api/posts \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"content\":\"just shipped the wasm compiler [rust] [wasm]\"}'\n```\n\nReply to a post:\n```bash\ncurl -X POST http://localhost:3006/api/posts \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"content\":\"nice work!\",\"reply_to\":\"a3kf9x\"}'\n```\n\nPost with media attachment:\n```bash\ncurl -X POST http://localhost:3006/api/posts \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"content\":\"screenshot of the new UI /attach x7km2p [showcase]\"}'\n```\n\n### GET /api/posts/feed\n\nGet the chronological feed. Public — works without auth. Authenticated users get kill-filtered results; guests get unfiltered posts (still subject to system-level filter_score suppression).\n\n**Auth:** optional\n\n**Params:**\n- `limit` — max posts to return (default 50, max 100)\n- `offset` — pagination offset (default 0)\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"posts\": [\n {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n }\n ]\n }\n}\n```\n\n**Examples:**\n```bash\n# Guest (unfiltered)\ncurl \"http://localhost:3006/api/posts/feed?limit=20\"\n\n# Authenticated (kill-filtered)\ncurl \"http://localhost:3006/api/posts/feed?limit=20\" \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### GET /api/posts/:id\n\nGet a single post by ID.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/posts/a3kf9x\n```\n\n### GET /api/posts/:id/thread\n\nGet a post and all its replies.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"post\": {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"reply_to\": null,\n \"tags\": [\"rust\", \"wasm\"],\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\"\n },\n \"replies\": [\n {\n \"id\": \"b7xm2k\",\n \"content\": \"nice work!\",\n \"reply_to\": \"a3kf9x\",\n \"tags\": [],\n \"username\": \"bob\",\n \"display_name\": \"Bob\",\n \"created_at\": \"2026-03-22T14:05:00.000Z\"\n }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/posts/a3kf9x/thread\n```\n\n### GET /api/posts/search\n\nSearch posts by content. Searches active posts by default, or archived posts with the `archive` flag.\n\n**Auth:** none\n\n**Params:**\n- `q` — search query (required)\n- `archive` — set to `true` to search archived posts instead\n\n**Response (active):**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"posts\": [\n {\n \"id\": \"a3kf9x\",\n \"content\": \"just shipped the wasm compiler [rust] [wasm]\",\n \"tags\": [\"rust\", \"wasm\"],\n \"media_id\": null,\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2026-03-22T14:00:00.000Z\",\n \"archived\": false\n }\n ]\n }\n}\n```\n\n**Response (archive):**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"posts\": [\n {\n \"id\": \"b7xm2k\",\n \"content\": \"old post about [rust]\",\n \"tags\": [\"rust\"],\n \"username\": \"alice\",\n \"display_name\": \"Alice\",\n \"created_at\": \"2025-12-01T08:00:00.000Z\",\n \"archived\": true\n }\n ]\n }\n}\n```\n\n**Examples:**\n```bash\n# Search active posts\ncurl \"http://localhost:3006/api/posts/search?q=rust\"\n\n# Search archived posts\ncurl \"http://localhost:3006/api/posts/search?q=rust&archive=true\"\n```\n\n---\n\n## Filter (Kill)\n\nThe `/kill` command maps to the filter API. The word \"kill\" never appears in the database or API.\n\n### POST /api/filter\n\nAdd a filter. Hides a user or post from your feed.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"target_type\": \"user\", \"target_id\": \"bob\" }\n```\n\n- `target_type` — `\"user\"` or `\"post\"`\n- `target_id` — username (for users) or post ID (for posts)\n\nFiltering a user also increments their hidden `filter_score`. Users filtered by enough people get suppressed from everyone's feed silently (threshold: ~5 active filters, with 7-day half-life decay).\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Filtered.\" } }\n```\n\n**Errors:**\n- `400` — missing fields, invalid type, can't filter yourself\n- `404` — user not found\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/filter \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"user\",\"target_id\":\"spammer\"}'\n```\n\n### GET /api/filter\n\nGet your current filter list.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"filters\": [\n { \"type\": \"user\", \"id\": \"uuid-of-filtered-user\" },\n { \"type\": \"post\", \"id\": \"b7xm2k\" }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/filter \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Media\n\nSupported formats: PNG (max 5MB), MP3 (max 10MB), MP4 (max 25MB).\n\nPNG uploads are processed into multiple variants: original (downscaled to max 1MB), thumbnail (80px wide), large (800px wide), and ASCII art.\n\n### POST /api/media/upload\n\nUpload a file.\n\n**Auth:** required\n\n**Body:** multipart/form-data with `file` field\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"media_id\": \"x7km2p\",\n \"type\": \"png\"\n }\n}\n```\n\n**Errors:**\n- `400` — no file, unsupported type, file too large\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/media/upload \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -F \"file=@screenshot.png\"\n```\n\n### GET /api/media/:id\n\nServe the original file.\n\n**Auth:** none\n\n**Response:** raw file with appropriate Content-Type header (`image/png`, `audio/mpeg`, `video/mp4`)\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p -o image.png\n```\n\n### GET /api/media/:id/thumb\n\nServe the thumbnail (PNG only, max 80px wide).\n\n**Auth:** none\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p/thumb -o thumb.png\n```\n\n### GET /api/media/:id/large\n\nServe the large version (PNG only, max 800px wide).\n\n**Auth:** none\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p/large -o large.png\n```\n\n### GET /api/media/:id/ascii\n\nGet the ASCII art representation (PNG only).\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"ascii\": \" @@@@ \\n @ @ \\n @ @ \\n @@@@ \\n\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/media/x7km2p/ascii\n```\n\n---\n\n## Avatar\n\n### POST /api/avatar\n\nUpload a profile picture. PNG only, max 5MB. Processes into thumb, large, and ASCII art versions. Sets as your avatar immediately.\n\n**Auth:** required\n\n**Body:** multipart/form-data with `file` field\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"avatar_id\": \"x7km2p\" } }\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/avatar \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -F \"file=@photo.png\"\n```\n\n### GET /api/avatar/:username\n\nGet a user's avatar image (large version, 800px max).\n\n**Auth:** none\n\n**Response:** raw PNG with `Content-Type: image/png`\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/avatar/alice -o avatar.png\n```\n\nReturns 404 if the user has no uploaded avatar.\n\n---\n\n## Bookmarks\n\nBookmarks are private. Nobody sees your bookmarks. No counts, no notifications. One concept for everything: users, tags, posts, docs.\n\n### POST /api/bookmarks\n\nAdd a bookmark.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"target_type\": \"user\", \"target_id\": \"alice\" }\n```\n\n- `target_type` — `\"user\"`, `\"tag\"`, `\"post\"`, or `\"doc\"`\n- `target_id` — username, tag name, post ID, or doc name\n\nBookmarking the same thing twice is a no-op, not an error.\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Bookmarked.\" } }\n```\n\n**Errors:**\n- `400` — missing fields, invalid type\n\n**Example:**\n```bash\n# Bookmark a user\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"user\",\"target_id\":\"alice\"}'\n\n# Bookmark a tag\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"tag\",\"target_id\":\"rust\"}'\n\n# Bookmark a post\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"post\",\"target_id\":\"a3kf9x\"}'\n\n# Bookmark a doc\ncurl -X POST http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"doc\",\"target_id\":\"api\"}'\n```\n\n### DELETE /api/bookmarks\n\nRemove a bookmark.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"target_type\": \"user\", \"target_id\": \"alice\" }\n```\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Unbookmarked.\" } }\n```\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"target_type\":\"user\",\"target_id\":\"alice\"}'\n```\n\n### GET /api/bookmarks\n\nList your bookmarks. Optionally filter by type.\n\n**Auth:** required\n\n**Params:**\n- `type` — optional: `user`, `tag`, `post`, or `doc`\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"bookmarks\": [\n { \"type\": \"user\", \"id\": \"alice\" },\n { \"type\": \"tag\", \"id\": \"rust\" },\n {\n \"type\": \"post\",\n \"id\": \"a3kf9x\",\n \"preview\": \"just shipped the wasm compiler...\",\n \"username\": \"alice\"\n },\n {\n \"type\": \"post\",\n \"id\": \"old123\",\n \"preview\": \"this was archived...\",\n \"archived\": true\n },\n {\n \"type\": \"post\",\n \"id\": \"gone99\",\n \"expired\": true\n },\n { \"type\": \"doc\", \"id\": \"api\" }\n ]\n }\n}\n```\n\nPost bookmarks are enriched with a content preview (60 chars), the author's username, and status flags (`archived`, `expired`) when applicable.\n\n**Examples:**\n```bash\n# All bookmarks\ncurl http://localhost:3006/api/bookmarks \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n\n# Only bookmarked tags\ncurl \"http://localhost:3006/api/bookmarks?type=tag\" \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Docs\n\n### GET /api/docs\n\nList all available documentation files.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"docs\": [\n { \"name\": \"about\", \"path\": \"docs/about.md\" },\n { \"name\": \"api\", \"path\": \"docs/api.md\" },\n { \"name\": \"commands\", \"path\": \"docs/commands.md\" },\n { \"name\": \"changelog\", \"path\": \"docs/changelog.md\" }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/docs\n```\n\n### GET /api/docs/:name\n\nGet the contents of a specific document. The `.md` extension is optional.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"name\": \"api\",\n \"content\": \"# API Reference\\n\\n...\"\n }\n}\n```\n\n**Errors:**\n- `400` — path traversal attempt\n- `404` — document not found\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/docs/api\n```\n\n---\n\n## Categories\n\n### GET /api/categories\n\nGet the category tree with tags. Used by `/tree -cat` in the client.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"categories\": [\n {\n \"id\": \"coding\",\n \"name\": \"coding\",\n \"tags\": [\"rust\", \"python\", \"wasm\", \"js\", \"frontend\", \"backend\"]\n },\n {\n \"id\": \"creative\",\n \"name\": \"creative\",\n \"tags\": [\"music\", \"art\", \"writing\", \"gamedev\"]\n },\n {\n \"id\": \"meta\",\n \"name\": \"meta\",\n \"tags\": [\"motd\", \"bugs\", \"ideas\", \"feedback\"]\n },\n {\n \"id\": \"general\",\n \"name\": \"general\",\n \"tags\": [\"offtopic\", \"introductions\", \"showcase\"]\n }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/categories\n```\n\n---\n\n## Commands\n\n### GET /api/commands\n\nGet the full command list grouped by category. Used by `/help` and `/menu` in the client.\n\n**Auth:** none\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"categories\": [\n {\n \"name\": \"General\",\n \"commands\": [\n { \"command\": \"/help\", \"description\": \"Show all available commands\" },\n { \"command\": \"/menu\", \"description\": \"Toggle the command menu\" },\n { \"command\": \"/clear\", \"description\": \"Clear the terminal\" },\n { \"command\": \"/read [path]\", \"description\": \"Read a document\" },\n { \"command\": \"/tree -cat\", \"description\": \"Browse categories and tags\" },\n { \"command\": \"/link [target]\", \"description\": \"Navigate to user, tag, post, or doc\" }\n ]\n }\n ]\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/commands\n```\n\n---\n\n## Telegram Connect\n\n### POST /api/connect/telegram\n\nGenerate a Telegram deep link to connect your account.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"link\": \"https://t.me/motdsocial_bot?start=alice_a8f3k2\",\n \"expires_in\": 600\n }\n}\n```\n\nIf already connected:\n```json\n{\n \"ok\": true,\n \"data\": {\n \"already_connected\": true,\n \"message\": \"Telegram already connected.\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/connect/telegram \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### DELETE /api/connect/telegram\n\nDisconnect your Telegram account.\n\n**Auth:** required\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Telegram disconnected.\" } }\n```\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/connect/telegram \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### POST /api/connect/email\n\nSend a verification email to connect your email address.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"email\": \"you@gmail.com\" }\n```\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"message\": \"Verification email sent to you@gmail.com\",\n \"tip\": \"Tip: add noreply@motd.social to your contacts so notifications don't go to spam.\"\n }\n}\n```\n\n**Example:**\n```bash\ncurl -X POST http://localhost:3006/api/connect/email \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"email\":\"you@gmail.com\"}'\n```\n\n### GET /api/connect/email/verify\n\nVerify email address from link in verification email.\n\n**Auth:** none (link from email)\n\n**Params:**\n- `code` — verification code from the email link\n\nReturns an HTML confirmation page on success.\n\n### DELETE /api/connect/email\n\nDisconnect your email address.\n\n**Auth:** required\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Email disconnected.\" } }\n```\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/connect/email \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n### GET /api/connect/status\n\nCheck your Telegram and email connection status and notification settings.\n\n**Auth:** required\n\n**Response:**\n```json\n{\n \"ok\": true,\n \"data\": {\n \"telegram\": {\n \"connected\": true,\n \"username\": \"alice_tg\",\n \"notify\": true,\n \"notify_bookmarks\": true,\n \"notify_mentions\": true\n },\n \"email\": {\n \"connected\": true,\n \"address\": \"alice@gmail.com\",\n \"notify\": true,\n \"notify_bookmarks\": true,\n \"notify_mentions\": true\n }\n }\n}\n```\n\n**Example:**\n```bash\ncurl http://localhost:3006/api/connect/status \\\n -H \"Authorization: Bearer YOUR_TOKEN\"\n```\n\n---\n\n## Account\n\n### DELETE /api/account\n\nPermanently delete your account. This is irreversible. Deletes all posts, media, sessions, and user data.\n\n**Auth:** required\n\n**Body:**\n```json\n{ \"confirm_username\": \"alice\" }\n```\n\nThe `confirm_username` must match your actual username.\n\n**Response:**\n```json\n{ \"ok\": true, \"data\": { \"message\": \"Account terminated.\" } }\n```\n\n**Errors:**\n- `400` — username confirmation doesn't match\n\n**Example:**\n```bash\ncurl -X DELETE http://localhost:3006/api/account \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"confirm_username\":\"alice\"}'\n```\n";
|
|
const passes = [{"t":0,"r":933,"c":2,"a":"hold","s":0.28539576451887444,"ps":9,"e":100.933166116151,"pr":1.1},{"t":0,"r":1068,"c":36,"a":"extend","s":0.42489483628409375,"ps":9,"e":71.43441108319092,"pr":1.1},{"t":0,"r":167,"c":0,"a":"died","s":0,"ps":8,"e":100,"pr":1},{"t":0,"r":796,"c":15,"a":"extend","s":0.44061345714031525,"ps":9,"e":71.52243535998576,"pr":1.1},{"t":1,"r":933,"c":2,"a":"hold","s":0.22512106695778167,"ps":9,"e":101.38413465181326,"pr":1.1},{"t":1,"r":1068,"c":36,"a":"extend","s":0.42260577188165505,"ps":8,"e":51.53068008077091,"pr":1.05},{"t":1,"r":796,"c":15,"a":"extend","s":0.412894877141364,"ps":9,"e":51.43291606398167,"pr":1.1},{"t":1,"r":1068,"c":35,"a":"hold","s":0.09794496812755896,"ps":5,"e":30.648307352102297,"pr":1.2000000000000002},{"t":1,"r":796,"c":14,"a":"hold","s":0.14998290719198637,"ps":5,"e":31.102335554672646,"pr":1.2000000000000002},{"t":2,"r":933,"c":2,"a":"retracted","s":0.22512106695778167,"ps":8,"e":101.9851031874755,"pr":1.05},{"t":2,"r":1068,"c":36,"a":"extend","s":0.42489483628409375,"ps":7,"e":37.71588713973056,"pr":1},{"t":2,"r":796,"c":15,"a":"extend","s":0.412894877141364,"ps":8,"e":37.475252556778806,"pr":1.05},{"t":2,"r":1068,"c":35,"a":"hold","s":0.15405347155316593,"ps":5,"e":31.130735124527625,"pr":1.2000000000000002},{"t":2,"r":796,"c":14,"a":"hold","s":0.14407649092049987,"ps":5,"e":31.504947482036645,"pr":1.2000000000000002},{"t":3,"r":1068,"c":36,"a":"extend","s":0.401124774909063,"ps":7,"e":27.912419737302145,"pr":1},{"t":3,"r":796,"c":15,"a":"extend","s":0.44061345714031525,"ps":8,"e":27.860112149730927,"pr":1.05},{"t":3,"r":1068,"c":35,"a":"retracted","s":0.15405347155316593,"ps":4,"e":31.763162896952952,"pr":1.1500000000000001},{"t":3,"r":796,"c":14,"a":"retracted","s":0.14407649092049987,"ps":4,"e":32.057559409400646,"pr":1.1500000000000001},{"t":3,"r":1068,"c":37,"a":"hold","s":0.21577325817166126,"ps":5,"e":17.140137696686388,"pr":1.1},{"t":3,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":5,"e":13.213889821736734,"pr":1.1500000000000001},{"t":4,"r":1068,"c":36,"a":"extend","s":0.401124774909063,"ps":6,"e":21.154992555602252,"pr":0.95},{"t":4,"r":796,"c":15,"a":"extend","s":0.44061345714031525,"ps":7,"e":21.234513864797414,"pr":1},{"t":4,"r":1068,"c":37,"a":"hold","s":0.17848250751554817,"ps":4,"e":17.967997756810774,"pr":1.05},{"t":4,"r":796,"c":16,"a":"extend","s":0.45468046226452974,"ps":4,"e":11.375933463897079,"pr":1.1},{"t":5,"r":1068,"c":36,"a":"hold","s":0.3474974071802458,"ps":6,"e":23.03497181304422,"pr":0.95},{"t":5,"r":796,"c":15,"a":"hold","s":0.3990174096439218,"ps":6,"e":23.52665314194879,"pr":0.95},{"t":5,"r":1068,"c":37,"a":"retracted","s":0.21577325817166126,"ps":4,"e":19.094183822184064,"pr":1},{"t":5,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":10.039467479431046,"pr":1.05},{"t":5,"r":1068,"c":35,"a":"hold","s":0.24257040172836616,"ps":5,"e":10.256988594799322,"pr":1.05},{"t":5,"r":796,"c":14,"a":"hold","s":0.22423568743898642,"ps":5,"e":10.144391441567926,"pr":1.1},{"t":5,"r":796,"c":17,"a":"hold","s":0.2840584095293159,"ps":5,"e":6.397867332190417,"pr":1.2000000000000002},{"t":6,"r":1068,"c":36,"a":"hold","s":0.3474974071802458,"ps":5,"e":25.064951070486185,"pr":0.8999999999999999},{"t":6,"r":796,"c":15,"a":"hold","s":0.39628636169980896,"ps":5,"e":25.94694403554726,"pr":0.8999999999999999},{"t":6,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":9.103941290304824,"pr":1},{"t":6,"r":1068,"c":35,"a":"hold","s":0.26358600849507435,"ps":5,"e":11.615676662759917,"pr":1.05},{"t":6,"r":796,"c":14,"a":"hold","s":0.23511271538329356,"ps":5,"e":11.275293164634274,"pr":1.1},{"t":6,"r":796,"c":17,"a":"hold","s":0.34131935996170415,"ps":5,"e":8.37842221188405,"pr":1.2000000000000002},{"t":7,"r":1068,"c":36,"a":"retracted","s":0.3205297295326896,"ps":5,"e":26.8791889067477,"pr":0.8999999999999999},{"t":7,"r":796,"c":15,"a":"retracted","s":0.3401584472962343,"ps":5,"e":27.918211613917137,"pr":0.8999999999999999},{"t":7,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":8.449072957916469,"pr":0.95},{"t":7,"r":1068,"c":35,"a":"retracted","s":0.26358600849507435,"ps":4,"e":13.124364730720512,"pr":1},{"t":7,"r":796,"c":14,"a":"retracted","s":0.23511271538329356,"ps":4,"e":12.556194887700622,"pr":1.05},{"t":7,"r":796,"c":17,"a":"retracted","s":0.34131935996170415,"ps":4,"e":10.508977091577684,"pr":1.1500000000000001},{"t":8,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":7.990665125244619,"pr":0.8999999999999999},{"t":9,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":7.6697796423743245,"pr":0.8499999999999999},{"t":9,"r":796,"c":17,"a":"hold","s":0.17925696299022936,"ps":5,"e":4.108626471883815,"pr":0.9999999999999999},{"t":10,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":7.445159804365118,"pr":0.7999999999999998},{"t":10,"r":796,"c":17,"a":"hold","s":0.3080088919082424,"ps":6,"e":5.672697607149754,"pr":1.0999999999999999},{"t":12,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":7.177862197134163,"pr":0.6999999999999997},{"t":12,"r":796,"c":18,"a":"hold","s":0.2386326750664236,"ps":5,"e":3.465855127259064,"pr":1.2},{"t":14,"r":796,"c":17,"a":"extend","s":0.3080088919082424,"ps":4,"e":4.734097445230459,"pr":0.9999999999999998},{"t":14,"r":796,"c":18,"a":"extend","s":0.29697802577556737,"ps":4,"e":3.7379998177403424,"pr":1.15},{"t":16,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.982708214094844,"pr":0.4999999999999996},{"t":17,"r":796,"c":18,"a":"extend","s":0.2386326750664236,"ps":4,"e":3.288925064499556,"pr":1.0499999999999998},{"t":18,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.951260917901729,"pr":0.39999999999999963},{"t":19,"r":796,"c":18,"a":"hold","s":0.2386326750664236,"ps":4,"e":4.52765192605305,"pr":0.9499999999999997},{"t":19,"r":796,"c":15,"a":"retracted","s":0.18097140794599106,"ps":4,"e":5.983028909632741,"pr":0.4999999999999995},{"t":23,"r":796,"c":15,"a":"retracted","s":0.3255680011375575,"ps":4,"e":8.211544359455207,"pr":0.35000000000000003},{"t":23,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":5,"e":4.259891358180059,"pr":0.4},{"t":25,"r":796,"c":15,"a":"hold","s":0.18737856090541596,"ps":5,"e":3.7167148461010333,"pr":0.4},{"t":26,"r":796,"c":18,"a":"retracted","s":0.12627012599603232,"ps":4,"e":3.1186332833750963,"pr":0.45},{"t":28,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.032732467035351,"pr":0.3},{"t":30,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921465050615341,"pr":0.3},{"t":30,"r":796,"c":18,"a":"retracted","s":0.2714565123814484,"ps":4,"e":7.938745070012843,"pr":0.35000000000000003},{"t":35,"r":796,"c":15,"a":"extend","s":0.3599126811770095,"ps":5,"e":4.061887706804347,"pr":0.45},{"t":36,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921096050010936,"pr":0.3},{"t":36,"r":796,"c":19,"a":"extend","s":0.4914299279521771,"ps":5,"e":4.424819964077823,"pr":0.5},{"t":37,"r":796,"c":19,"a":"extend","s":0.4914299279521771,"ps":4,"e":5.429381571386667,"pr":0.45},{"t":38,"r":796,"c":18,"a":"extend","s":0.2748095834448852,"ps":5,"e":3.1907877358343235,"pr":0.5},{"t":38,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":6.064102061094386,"pr":0.45},{"t":39,"r":796,"c":18,"a":"extend","s":0.381013438953633,"ps":5,"e":3.842226673224371,"pr":0.5},{"t":41,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921055118222481,"pr":0.3},{"t":42,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921052637458828,"pr":0.3},{"t":42,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.189524961395138,"pr":0.3},{"t":43,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.296202434100314,"pr":0.3},{"t":45,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.619967340797439,"pr":0.3},{"t":45,"r":796,"c":20,"a":"hold","s":0.355896221084044,"ps":4,"e":8.776790918909441,"pr":0.35000000000000003},{"t":45,"r":796,"c":21,"a":"extend","s":0.3864614696457253,"ps":4,"e":5.054951604797463,"pr":0.39999999999999997},{"t":45,"r":796,"c":22,"a":"hold","s":0.1685083658456416,"ps":5,"e":2.485695508620682,"pr":0.6},{"t":46,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921048238816795,"pr":0.3},{"t":46,"r":796,"c":21,"a":"hold","s":0.3864614696457253,"ps":4,"e":7.546643361963265,"pr":0.35},{"t":47,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.620665669951765,"pr":0.3},{"t":50,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":5.690098770324083,"pr":0.3},{"t":50,"r":796,"c":20,"a":"retracted","s":0.2875188588102696,"ps":4,"e":8.471924705126334,"pr":0.30000000000000004},{"t":52,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921047012519649,"pr":0.3},{"t":52,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.621223848141852,"pr":0.3},{"t":52,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":5.904927072070147,"pr":0.3},{"t":53,"r":796,"c":15,"a":"extend","s":0.2983948622033314,"ps":4,"e":4.494559432546915,"pr":0.35000000000000003},{"t":54,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.540194691953762,"pr":0.3},{"t":54,"r":796,"c":20,"a":"retracted","s":0.23186691874346943,"ps":5,"e":5.96928455679652,"pr":0.45},{"t":55,"r":796,"c":14,"a":"extend","s":0.2533041279693288,"ps":5,"e":2.219030821292014,"pr":0.4},{"t":56,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046888268899,"pr":0.3},{"t":56,"r":796,"c":14,"a":"extend","s":0.3027107801030498,"ps":5,"e":2.7235019434814887,"pr":0.4},{"t":57,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.62131766115026,"pr":0.3},{"t":57,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.543428344201082,"pr":0.3},{"t":57,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.0766404709820785,"pr":0.3},{"t":58,"r":796,"c":14,"a":"extend","s":0.2533041279693288,"ps":4,"e":3.2256453269381256,"pr":0.35000000000000003},{"t":58,"r":796,"c":12,"a":"hold","s":0.16728169170463536,"ps":5,"e":1.3056527521159897,"pr":0.6},{"t":60,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.5445374869219135,"pr":0.3},{"t":61,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.9210468556084965,"pr":0.3},{"t":61,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.621332063154095,"pr":0.3},{"t":61,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.544711201969057,"pr":0.3},{"t":61,"r":796,"c":13,"a":"hold","s":0.21554606338115007,"ps":4,"e":4.3393001064541785,"pr":0.35000000000000003},{"t":62,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046853629038,"pr":0.3},{"t":62,"r":796,"c":21,"a":"extend","s":0.4492202511900904,"ps":4,"e":4.169007663976141,"pr":0.5499999999999999},{"t":63,"r":796,"c":21,"a":"extend","s":0.3852991116384084,"ps":4,"e":4.655980389958386,"pr":0.49999999999999994},{"t":65,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046850594531,"pr":0.3},{"t":65,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.621335521075215,"pr":0.3},{"t":65,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.109330909872019,"pr":0.3},{"t":66,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.621335848847369,"pr":0.3},{"t":67,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.110350820448636,"pr":0.3},{"t":68,"r":796,"c":20,"a":"extend","s":0.5334583948150324,"ps":4,"e":7.161665861243914,"pr":0.4},{"t":69,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.110850576631178,"pr":0.3},{"t":69,"r":796,"c":21,"a":"retracted","s":0.3852991116384084,"ps":4,"e":12.849688258210968,"pr":0.3},{"t":69,"r":796,"c":15,"a":"hold","s":0.25104263377121366,"ps":5,"e":4.954729786792207,"pr":0.4},{"t":70,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849276566,"pr":0.3},{"t":70,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.621336430020171,"pr":0.3},{"t":70,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545100180345327,"pr":0.3},{"t":70,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.110994624001441,"pr":0.3},{"t":70,"r":796,"c":15,"a":"retracted","s":0.25104263377121366,"ps":4,"e":6.363070856961916,"pr":0.35000000000000003},{"t":71,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545105087365447,"pr":0.3},{"t":72,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.9210468491407715,"pr":0.3},{"t":73,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.621336550664349,"pr":0.3},{"t":73,"r":796,"c":15,"a":"hold","s":0.1638783448944182,"ps":5,"e":3.5271896945013905,"pr":0.4},{"t":74,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111250034393652,"pr":0.3},{"t":74,"r":796,"c":21,"a":"extend","s":0.3004611870488909,"ps":5,"e":3.986680567393411,"pr":0.5},{"t":75,"r":796,"c":15,"a":"retracted","s":0.2039715309381917,"ps":4,"e":5.440734189512457,"pr":0.35000000000000003},{"t":76,"r":796,"c":21,"a":"extend","s":0.23888442575971347,"ps":4,"e":4.521181965684178,"pr":0.45},{"t":77,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.5451151900317015,"pr":0.3},{"t":79,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11131717125979,"pr":0.3},{"t":79,"r":796,"c":15,"a":"hold","s":0.17715086602270397,"ps":5,"e":4.278961421115508,"pr":0.4},{"t":80,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849017827,"pr":0.3},{"t":81,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116213652989,"pr":0.3},{"t":82,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.54511631068081,"pr":0.3},{"t":82,"r":796,"c":21,"a":"extend","s":0.3004611870488909,"ps":4,"e":4.2453827423512625,"pr":0.3},{"t":82,"r":796,"c":15,"a":"extend","s":0.2718501947863348,"ps":5,"e":3.073675145508146,"pr":0.4},{"t":83,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116378600285,"pr":0.3},{"t":84,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111328454952881,"pr":0.3},{"t":84,"r":796,"c":22,"a":"hold","s":0.21946419687883476,"ps":5,"e":3.3759488205440613,"pr":0.4},{"t":85,"r":796,"c":20,"a":"hold","s":0.3192078328292968,"ps":4,"e":6.60853988794403,"pr":0.3},{"t":86,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849011191,"pr":0.3},{"t":86,"r":796,"c":21,"a":"retracted","s":0.3004611870488909,"ps":4,"e":9.645419056293056,"pr":0.3},{"t":88,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116510443532,"pr":0.3},{"t":89,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.92104684901061,"pr":0.3},{"t":90,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.621336613502535,"pr":0.3},{"t":90,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330466341842,"pr":0.3},{"t":90,"r":796,"c":15,"a":"retracted","s":0.22832429286684147,"ps":4,"e":6.477930638511533,"pr":0.30000000000000004},{"t":91,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116527943072,"pr":0.3},{"t":93,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116532602425,"pr":0.3},{"t":94,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010356,"pr":0.3},{"t":94,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330670139582,"pr":0.3},{"t":94,"r":796,"c":20,"a":"extend","s":0.4232907573660775,"ps":5,"e":4.410179507103291,"pr":0.4},{"t":95,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330689457323,"pr":0.3},{"t":95,"r":796,"c":20,"a":"extend","s":0.4232907573660775,"ps":4,"e":5.037553896222337,"pr":0.35000000000000003},{"t":98,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.9210468490103185,"pr":0.3},{"t":98,"r":796,"c":15,"a":"hold","s":0.20200472597259342,"ps":5,"e":3.832200743070886,"pr":0.4},{"t":99,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116536552388,"pr":0.3},{"t":99,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133072370961,"pr":0.3},{"t":99,"r":796,"c":15,"a":"extend","s":0.21728971015603035,"ps":4,"e":3.4793628970233903,"pr":0.35000000000000003},{"t":100,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.621336613644917,"pr":0.3},{"t":100,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116536710389,"pr":0.3},{"t":100,"r":796,"c":20,"a":"extend","s":0.343820610818787,"ps":4,"e":5.021273724162926,"pr":0.3},{"t":101,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.5451165368209905,"pr":0.3},{"t":101,"r":796,"c":15,"a":"hold","s":0.20200472597259342,"ps":4,"e":4.162818301143644,"pr":0.3},{"t":102,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.621336613647028,"pr":0.3},{"t":102,"r":796,"c":20,"a":"extend","s":0.343820610818787,"ps":4,"e":5.019596339834686,"pr":0.3},{"t":102,"r":796,"c":15,"a":"hold","s":0.20200472597259342,"ps":4,"e":5.178856108924391,"pr":0.3},{"t":103,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330731933583,"pr":0.3},{"t":104,"r":796,"c":21,"a":"hold","s":0.2567419212321659,"ps":4,"e":4.650249045269549,"pr":0.3},{"t":106,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":106,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330733640777,"pr":0.3},{"t":107,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":107,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330733908159,"pr":0.3},{"t":109,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330734226343,"pr":0.3},{"t":111,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":111,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330734382253,"pr":0.3},{"t":111,"r":796,"c":20,"a":"hold","s":0.2575269174787318,"ps":5,"e":4.5438367128592745,"pr":0.4},{"t":112,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330734427192,"pr":0.3},{"t":115,"r":796,"c":15,"a":"hold","s":0.13901275226840965,"ps":5,"e":3.542452378770124,"pr":0.4},{"t":117,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":117,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.5451165370782025,"pr":0.3},{"t":117,"r":796,"c":20,"a":"extend","s":0.4303134567528494,"ps":4,"e":5.347484487304988,"pr":0.35000000000000003},{"t":119,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.5451165370786395,"pr":0.3},{"t":119,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330734523415,"pr":0.3},{"t":120,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.621336613649055,"pr":0.3},{"t":120,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537078765,"pr":0.3},{"t":120,"r":796,"c":14,"a":"extend","s":0.2518530337076444,"ps":5,"e":2.1724139223173617,"pr":0.5},{"t":121,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":121,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":122,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537078914,"pr":0.3},{"t":122,"r":796,"c":22,"a":"hold","s":0.17841439252067132,"ps":4,"e":3.0916359435009095,"pr":0.5499999999999999},{"t":122,"r":796,"c":14,"a":"hold","s":0.14281411799592275,"ps":4,"e":3.0535796783523437,"pr":0.45},{"t":123,"r":796,"c":15,"a":"extend","s":0.3255259859324158,"ps":4,"e":4.4503166374601895,"pr":0.3},{"t":123,"r":796,"c":13,"a":"retracted","s":0.1785575455822025,"ps":6,"e":2.0609568579252886,"pr":0.7},{"t":125,"r":796,"c":15,"a":"extend","s":0.3255259859324158,"ps":4,"e":4.56566253843209,"pr":0.3},{"t":126,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079025,"pr":0.3},{"t":126,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.1113307345313395,"pr":0.3},{"t":127,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.541470387829599,"pr":0.3},{"t":128,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":128,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330734531702,"pr":0.3},{"t":128,"r":796,"c":22,"a":"retracted","s":0.1782202859114497,"ps":4,"e":4.461125882648775,"pr":0.35000000000000003},{"t":129,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.6532258994273485,"pr":0.3},{"t":130,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079051,"pr":0.3},{"t":131,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079053,"pr":0.3},{"t":131,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.662572571770287,"pr":0.3},{"t":132,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.1113307345319665,"pr":0.3},{"t":134,"r":796,"c":22,"a":"retracted","s":0.17486999752814192,"ps":4,"e":5.293243638754874,"pr":0.30000000000000004},{"t":135,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":135,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.669396577247866,"pr":0.3},{"t":137,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":137,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330734532038,"pr":0.3},{"t":138,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330734532042,"pr":0.3},{"t":138,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.670813155114513,"pr":0.3},{"t":138,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.680958680671476,"pr":0.3},{"t":139,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.111330734532045,"pr":0.3},{"t":139,"r":796,"c":15,"a":"retracted","s":0.10579029498202175,"ps":4,"e":3.3316868810144866,"pr":0.35000000000000003},{"t":140,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":140,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671190327056997,"pr":0.3},{"t":140,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.682393706880512,"pr":0.3},{"t":142,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":142,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683096869722939,"pr":0.3},{"t":142,"r":796,"c":22,"a":"hold","s":0.07614243548852673,"ps":5,"e":2.53528532498904,"pr":0.4},{"t":143,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671428411299045,"pr":0.3},{"t":144,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":144,"r":796,"c":15,"a":"extend","s":0.30303621587353835,"ps":5,"e":3.1093913290450397,"pr":0.4},{"t":145,"r":796,"c":15,"a":"extend","s":0.30303621587353835,"ps":4,"e":3.4535767392233425,"pr":0.35000000000000003},{"t":146,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":146,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683610248914195,"pr":0.3},{"t":148,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":148,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671531817405979,"pr":0.3},{"t":149,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":149,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":150,"r":796,"c":15,"a":"hold","s":0.28967604585188056,"ps":5,"e":4.533571302105176,"pr":0.4},{"t":151,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":151,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":151,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":151,"r":796,"c":22,"a":"retracted","s":0.14799748780803756,"ps":4,"e":4.503474085097219,"pr":0.30000000000000004},{"t":151,"r":796,"c":15,"a":"hold","s":0.23724150866737234,"ps":5,"e":5.681503371444155,"pr":0.4},{"t":152,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671547692124998,"pr":0.3},{"t":153,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":153,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":154,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":155,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":155,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":156,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":156,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":156,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":156,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671551503645033,"pr":0.3},{"t":157,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":158,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":158,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":158,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683770212375596,"pr":0.3},{"t":159,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":159,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":159,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":160,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683771357415529,"pr":0.3},{"t":161,"r":796,"c":22,"a":"hold","s":0.059506258506383546,"ps":4,"e":2.374002425940399,"pr":0.35000000000000003},{"t":162,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":163,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":163,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552608763806,"pr":0.3},{"t":163,"r":796,"c":14,"a":"extend","s":0.2353028713773575,"ps":4,"e":2.4426871415725766,"pr":0.35000000000000003},{"t":164,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":166,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":166,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":166,"r":796,"c":13,"a":"hold","s":0.16697918646087598,"ps":5,"e":2.2947915256758655,"pr":0.45000000000000007},{"t":167,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.6715526841300115,"pr":0.3},{"t":167,"r":796,"c":14,"a":"hold","s":0.23515328367958147,"ps":4,"e":5.284028498873481,"pr":0.3},{"t":167,"r":796,"c":13,"a":"retracted","s":0.16697918646087598,"ps":4,"e":3.0306250173628735,"pr":0.4000000000000001},{"t":168,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":168,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772394131263,"pr":0.3},{"t":169,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":169,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772413157466,"pr":0.3},{"t":170,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":171,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":173,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":173,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":173,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":173,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":173,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552705141351,"pr":0.3},{"t":173,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772446892826,"pr":0.3},{"t":174,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":174,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":174,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552705981821,"pr":0.3},{"t":174,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.68377245009056,"pr":0.3},{"t":175,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":175,"r":796,"c":15,"a":"retracted","s":0.2438464617171902,"ps":4,"e":6.839032306740065,"pr":0.30000000000000004},{"t":176,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":177,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":178,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":179,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707613315,"pr":0.3},{"t":180,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":181,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":181,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":181,"r":796,"c":22,"a":"hold","s":0.07931998904132723,"ps":5,"e":2.7490338223338098,"pr":0.4},{"t":182,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":182,"r":796,"c":22,"a":"hold","s":0.0998550819055918,"ps":4,"e":2.9478744775785444,"pr":0.35000000000000003},{"t":183,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":183,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707863777,"pr":0.3},{"t":187,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":187,"r":796,"c":22,"a":"retracted","s":0.1602655622830629,"ps":5,"e":4.205937579689743,"pr":0.45},{"t":188,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":189,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":191,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":191,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707938354,"pr":0.3},{"t":191,"r":796,"c":14,"a":"hold","s":0.3658893944896953,"ps":4,"e":5.917198175814204,"pr":0.30000000000000004},{"t":192,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":193,"r":796,"c":22,"a":"hold","s":0.16833951897602076,"ps":5,"e":3.932274379216392,"pr":0.4},{"t":194,"r":796,"c":22,"a":"retracted","s":0.16833951897602076,"ps":4,"e":4.678990531024558,"pr":0.35000000000000003},{"t":196,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457549021,"pr":0.3},{"t":197,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":197,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.6715527079423795,"pr":0.3},{"t":197,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457549897,"pr":0.3},{"t":199,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":199,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942651,"pr":0.3},{"t":199,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457550938,"pr":0.3},{"t":199,"r":796,"c":15,"a":"hold","s":0.24639395108270556,"ps":5,"e":4.187314543951776,"pr":0.4},{"t":200,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942731,"pr":0.3},{"t":200,"r":796,"c":15,"a":"hold","s":0.19616846378350936,"ps":5,"e":5.006662254219851,"pr":0.4},{"t":200,"r":796,"c":22,"a":"hold","s":0.13265308465702894,"ps":5,"e":3.314115049529203,"pr":0.4},{"t":201,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":201,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":201,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":203,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":203,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551697,"pr":0.3},{"t":204,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":206,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551854,"pr":0.3},{"t":207,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":207,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.6715527079429,"pr":0.3},{"t":207,"r":796,"c":15,"a":"hold","s":0.2305460460625779,"ps":4,"e":4.076604697439809,"pr":0.35000000000000003},{"t":207,"r":796,"c":22,"a":"retracted","s":0.2075686331307856,"ps":4,"e":5.242447941973767,"pr":0.35000000000000003},{"t":208,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":210,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":211,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551924,"pr":0.3},{"t":213,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":214,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":215,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":215,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":216,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":217,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":217,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":220,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":220,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":221,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":222,"r":796,"c":22,"a":"hold","s":0.12957614950814322,"ps":5,"e":3.626269664631188,"pr":0.4},{"t":224,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":225,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":225,"r":796,"c":15,"a":"extend","s":0.24901033024314834,"ps":5,"e":2.895237636971403,"pr":0.4},{"t":227,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":227,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":228,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":228,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":229,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":230,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":230,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":230,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":230,"r":796,"c":15,"a":"hold","s":0.239760191152451,"ps":4,"e":5.6752309338789395,"pr":0.3},{"t":231,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":231,"r":796,"c":22,"a":"hold","s":0.12030210476811017,"ps":5,"e":3.0768907485242822,"pr":0.4},{"t":232,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":234,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":234,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":236,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":236,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":237,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":237,"r":796,"c":22,"a":"hold","s":0.2473185789338633,"ps":6,"e":4.042214227217793,"pr":0.5},{"t":238,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":240,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":240,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":240,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":240,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":241,"r":796,"c":22,"a":"hold","s":0.08295496374570331,"ps":6,"e":2.907582825038873,"pr":0.5},{"t":242,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":242,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":244,"r":796,"c":15,"a":"extend","s":0.31646029304703266,"ps":4,"e":4.131032447810887,"pr":0.35000000000000003},{"t":245,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":245,"r":796,"c":15,"a":"extend","s":0.20916087237524816,"ps":4,"e":3.6430235987690107,"pr":0.35000000000000003},{"t":246,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":246,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":248,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":248,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":249,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":249,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":249,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":250,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":250,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":251,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":252,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":252,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":252,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":254,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":254,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":255,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":255,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":256,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":256,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":257,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":258,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":258,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":261,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":261,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":262,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":263,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":263,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":264,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":264,"r":796,"c":22,"a":"hold","s":0.08517093395454717,"ps":5,"e":2.7958413820157784,"pr":0.4},{"t":265,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":267,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":267,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":269,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":269,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":269,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":269,"r":796,"c":22,"a":"hold","s":0.14590946590676457,"ps":5,"e":3.675297285412746,"pr":0.4},{"t":270,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":271,"r":796,"c":14,"a":"extend","s":0.37411161961201383,"ps":4,"e":3.87041827902595,"pr":0.45},{"t":272,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":272,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":272,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":272,"r":796,"c":14,"a":"extend","s":0.32685751801615476,"ps":4,"e":4.119694896208631,"pr":0.45},{"t":273,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":273,"r":796,"c":22,"a":"hold","s":0.18893451249515622,"ps":5,"e":4.66649545007721,"pr":0.4},{"t":274,"r":796,"c":22,"a":"retracted","s":0.18893451249515622,"ps":4,"e":5.577971550038459,"pr":0.35000000000000003},{"t":275,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":275,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":276,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":276,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":277,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":278,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":279,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":281,"r":796,"c":20,"a":"extend","s":0.4324046093540848,"ps":4,"e":6.671552707942912,"pr":0.3},{"t":281,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":282,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":283,"r":796,"c":22,"a":"hold","s":0.21646547562172927,"ps":5,"e":3.8461977153532354,"pr":0.4},{"t":285,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":287,"r":796,"c":18,"a":"extend","s":0.40239271792135994,"ps":4,"e":6.11133073453205,"pr":0.3},{"t":288,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":290,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":291,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":291,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3},{"t":292,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":292,"r":796,"c":14,"a":"hold","s":0.18801449503832823,"ps":4,"e":4.577093551016829,"pr":0.4},{"t":293,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":293,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":295,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":297,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":298,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":299,"r":796,"c":16,"a":"extend","s":0.4457703669112664,"ps":4,"e":6.921046849010306,"pr":0.3},{"t":299,"r":796,"c":17,"a":"extend","s":0.48328589001691385,"ps":4,"e":7.6213366136490555,"pr":0.3},{"t":299,"r":796,"c":19,"a":"extend","s":0.4792026716292354,"ps":4,"e":7.545116537079058,"pr":0.3},{"t":299,"r":796,"c":21,"a":"extend","s":0.4330592387974253,"ps":4,"e":6.683772457551936,"pr":0.3}];
|
|
const lines = text.split('\n');
|
|
const gridEl = document.getElementById('grid');
|
|
const charEls = [];
|
|
for (let r = 0; r < lines.length; r++) {
|
|
const row = [];
|
|
for (let c = 0; c < lines[r].length; c++) {
|
|
const s = document.createElement('span');
|
|
s.className = 'c';
|
|
s.textContent = lines[r][c];
|
|
row.push(s);
|
|
gridEl.appendChild(s);
|
|
}
|
|
charEls.push(row);
|
|
gridEl.appendChild(document.createTextNode('\n'));
|
|
}
|
|
let tick = -1, playing = false, iv;
|
|
function apply(t) {
|
|
for (const r of charEls) for (const e of r) e.className = 'c';
|
|
const active = new Map();
|
|
for (const p of passes) {
|
|
if (p.t > t) break;
|
|
const k = p.r+','+p.c;
|
|
if (p.a === 'died' || p.a === 'retracted') active.set(k, 'dead');
|
|
else if (p.ps > 16) active.set(k, 'strong');
|
|
else active.set(k, 'active');
|
|
}
|
|
for (const [k, cls] of active) {
|
|
const [r, c] = k.split(',').map(Number);
|
|
if (charEls[r]?.[c]) charEls[r][c].className = 'c ' + cls;
|
|
}
|
|
document.getElementById('info').textContent = 'tick ' + t + ' · ' + [...active.values()].filter(v=>v!=='dead').length + ' alive';
|
|
}
|
|
function play() {
|
|
if (playing) return;
|
|
playing = true;
|
|
document.getElementById('play-btn').textContent = 'pause';
|
|
const max = passes.length > 0 ? passes[passes.length-1].t : 0;
|
|
iv = setInterval(() => { tick++; if (tick > max) { pause(); return; } apply(tick); }, 900);
|
|
}
|
|
function pause() { playing = false; clearInterval(iv); document.getElementById('play-btn').textContent = 'play'; }
|
|
function reset() { pause(); tick = -1; for (const r of charEls) for (const e of r) e.className = 'c'; document.getElementById('info').textContent = 'neurameba'; }
|
|
document.getElementById('play-btn').addEventListener('click', () => playing ? pause() : play());
|
|
document.getElementById('reset-btn').addEventListener('click', reset);
|
|
setTimeout(play, 1000);
|
|
</script>
|
|
</body>
|
|
</html> |