A pixel-art music player pane that streams a playlist through mpv

<a id="readme-top"></a>
[![Stars][stars-shield]][stars-url] [![Version][version-shield]][version-url] [![License][license-shield]][license-url] [![Made for Claude Code][made-for-shield]][made-for-url] [![Views][views-shield]][views-url]
<a href="https://github.com/chrisluo5311/Pixel-Play"> <img src="assets/demo/logo.png" alt="Pixel Play logo" width="96" height="96"> </a>
<h1 align="center">Pixel Play</h1>
A pixel-art music player that docks beside your Claude Code conversation. <a href="#usage"><strong>Explore the commands »</strong></a> <a href="assets/demo/demo.mp4">View Demo</a> · <a href="https://github.com/chrisluo5311/Pixel-Play/issues/new?labels=bug">Report Bug</a> · <a href="https://github.com/chrisluo5311/Pixel-Play/issues/new?labels=enhancement">Request Feature</a>
<ol> <li> <a href="#about-the-project">About The Project</a> <ul> <li><a href="#built-with">Built With</a></li> </ul> </li> <li> <a href="#getting-started">Getting Started</a> <ul> <li><a href="#prerequisites">Prerequisites</a></li> <li><a href="#installation">Installation</a></li> </ul> </li> <li> <a href="#usage">Usage</a> <ul> <li><a href="#commands">Commands</a></li> <li><a href="#pane-controls">Pane controls</a></li> <li><a href="#playlist-format">Playlist format</a></li> <li><a href="#skins">Skins</a></li> </ul> </li> <li><a href="#development">Development</a></li> <li><a href="#roadmap">Roadmap</a></li> <li><a href="#license">License</a></li> <li><a href="#contact">Contact</a></li> <li><a href="#acknowledgments">Acknowledgments</a></li> </ol>
<a href="assets/demo/demo.mp4"> <img src="assets/demo/demo.gif" alt="Pixel Play demo: playing a playlist, switching tracks and skins" width="100%"> </a> <sub>▶ <a href="assets/demo/demo.mp4">Watch the full demo video (MP4)</a></sub>
Pixel Play keeps music one keystroke away while you work. It docks as a pane beside the conversation: you keep talking to Claude on the left while a pixel-art character dances to your playlist on the right.
/music command and a docked pane, no extra window or app.▀), two pixels per terminal cell.~/.claude/pixel-play/, outside the plugin folder.It is a Claude Code mod: a plugin of function hooks. Playback goes through mpv, controlled over its IPC socket.
[![TypeScript][typescript-shield]][typescript-url] [![Lua][lua-shield]][lua-url] [![mpv][mpv-shield]][mpv-url] [![yt-dlp][ytdlp-shield]][ytdlp-url]
sh brew install mpv yt-dlp ``[!NOTE] Claude Code decides where the pane goes, not the mod. Below 110 columns the pane opens above the prompt, and the player switches to a compact layout with a small sprite beside the controls. Docked, it asks for about 30% of the terminal's width (30 to 44 columns) and shrinks the sprite on short windows. Drag the dock's edge to override the width.
The repository is its own plugin marketplace.
sh claude plugin marketplace add chrisluo5311/Pixel-Play claude plugin install pixel-player@pixel-play ``/reload-plugins. /music is now available in every session. /music add https://www.youtube.com/watch?v=... /music play ``To update later:
claude plugin marketplace update pixel-play && claude plugin update pixel-player@pixel-play
To try it without installing:
git clone https://github.com/chrisluo5311/Pixel-Play.git
claude --plugin-dir ./Pixel-Play
| Command | What it does |
|---|---|
/music | Open the player pane |
/music help | List the commands |
/music play [n] | Play the playlist, optionally from track n |
/music pause | Pause, or resume when paused |
/music resume | Resume a paused track (/music play with no number also resumes) |
/music stop | Stop |
/music next / /music prev | Skip forward or back |
/music add <url> | Append a YouTube link, direct audio URL or local file |
/music reload | Re-read the playlist after editing it by hand |
/music skins | List the skins |
/music skin [name or number] | Switch skin (no argument: next skin) |
/music vol <0-100> | Set the volume |
| Key | Action |
|---|---|
p | Play / pause / resume |
s | Stop |
n / b | Next / previous track |
u / d | Volume up / down |
Click a track in the playlist to play it. Pick a skin from the skin: menu with the arrow keys and Enter.
Your playlist lives in ~/.claude/pixel-play/playlist.txt, so plugin updates never touch it. playlist.example.txt shows the format:
# Lines starting with # are comments.
https://www.youtube.com/watch?v=abc123
https://www.youtube.com/watch?v=def456 # Optional title shown until the real one loads
/Users/me/Music/song.mp3
Anything mpv can open works: YouTube and other sites yt-dlp supports, direct audio URLs, and local files.
Twelve animated skins (doge and pop-cat are the animal-meme ones), generated with PixelLab. Switch with /music skin <name or number> or the skin: menu in the pane.
<img src="assets/demo/skins.gif" alt="The twelve Pixel Play skins: vinyl, headphone-kid, cat, cassette, anime-girl, handheld, shiba-dj, boombox, rainy-window, penguin, doge, pop-cat" width="100%">
The source PNGs live in assets/. To add or change a skin:
assets/png/NN-name.png.assets/frames/NN-name/0.png, 1.png, ...sh node scripts/png2sprite.mjs ``claude plugin validate . # validate the manifest and hooks
claude plugin test . # run the tests
claude --plugin-dir . # run Claude Code with this checkout; /reload-plugins hot-reloads
| Path | Contents |
|---|---|
hooks/register.tsx | The /music command, playback, and the pane |
hooks/player.ts | Playlist parsing, progress parsing, formatting |
hooks/pixel.tsx | Half-block sprite renderer |
hooks/skins.gen.ts | Generated sprite data (do not edit by hand) |
mpv/progress.lua | mpv script that reports the playback position |
scripts/png2sprite.mjs | PNG to sprite converter (Node, no dependencies) |
types/index.d.ts | The mod's state contract |
player.test.ts | Tests |
See the open issues for proposed features and known issues.
[!WARNING] Streaming YouTube audio with yt-dlp may conflict with YouTube's Terms of Service. Use it for your own listening, at your own discretion.
Distributed under the MIT License. See LICENSE for more information.
chrisluo5311 · @chrisluo5311
Project link: https://github.com/chrisluo5311/Pixel-Play
<!-- MARKDOWN LINKS & IMAGES --> [stars-shield]: https://img.shields.io/github/stars/chrisluo5311/Pixel-Play?style=for-the-badge&logo=github&color=f5c542 [stars-url]: https://github.com/chrisluo5311/Pixel-Play/stargazers [version-shield]: https://img.shields.io/badge/dynamic/json?style=for-the-badge&label=version&color=8a63d2&url=https%3A%2F%2Fraw.githubusercontent.com%2Fchrisluo5311%2FPixel-Play%2Fmain%2F.claude-plugin%2Fplugin.json&query=%24.version [version-url]: .claude-plugin/plugin.json [license-shield]: https://img.shields.io/badge/license-MIT-3da639?style=for-the-badge [license-url]: LICENSE [made-for-shield]: https://img.shields.io/badge/made%20for-Claude%20Code-d97757?style=for-the-badge&logo=claude&logoColor=white [made-for-url]: https://claude.com/claude-code [views-shield]: https://hits.sh/github.com/chrisluo5311/Pixel-Play.svg?style=for-the-badge&label=views&color=e8478b [views-url]: https://hits.sh/github.com/chrisluo5311/Pixel-Play/ [typescript-shield]: https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge&logo=typescript&logoColor=white [typescript-url]: https://www.typescriptlang.org [lua-shield]: https://img.shields.io/badge/Lua-2C2D72?style=for-the-badge&logo=lua&logoColor=white [lua-url]: https://www.lua.org [mpv-shield]: https://img.shields.io/badge/mpv-691F69?style=for-the-badge&logo=mpv&logoColor=white [mpv-url]: https://mpv.io [ytdlp-shield]: https://img.shields.io/badge/yt--dlp-FF0000?style=for-the-badge&logo=youtube&logoColor=white [ytdlp-url]: https://github.com/yt-dlp/yt-dlp
hooks/register.tsx 493 lines1import { atom, read, update } from 'claude-code'
2import type { EngineInterface, Register } from 'claude-code'
3
4import type { Player, Track } from '../types'
5import { PixelArt } from './pixel'
6import {
7 dockColumns,
8 equalizer,
9 formatTime,
10 ipcCommand,
11 ipcSucceeded,
12 parsePlaylist,
13 parseProgress,
14 progressBar,
15 trackLabel,
16 truncateToWidth,
17} from './player'
18import { SKINS } from './skins.gen'
19
20const PANE = 'pixel-player'
21const FRAME_MS = 250
22// Inline above the prompt: a half-size sprite beside the controls fits in this many rows.
23const INLINE_ROWS = 12
24// Docked, the rows under the sprite that must stay in view: a gap, title, bar, equalizer, two button rows.
25const CONTROL_ROWS = 7
26// Docked, the tracks kept in view under the controls; a longer playlist scrolls.
27const PLAYLIST_TRACKS = 5
28
29/** Rows the playlist needs in view: a gap, its heading, and up to PLAYLIST_TRACKS tracks (or the empty note). */
30function playlistRows(tracks: number): number {
31 return 2 + Math.max(1, Math.min(tracks, PLAYLIST_TRACKS))
32}
33
34const STOPPED: Player = { status: 'stopped', index: 0, title: '', position: -1, duration: -1 }
35const failed = (index: number, message: string): Player => ({ ...STOPPED, index, status: 'error', message })
36
37const player = atom({ plugin: 'pixel-player', key: 'player' } as const, STOPPED)
38const playlist = atom({ plugin: 'pixel-player', key: 'playlist' } as const, [] as Track[])
39const skin = atom({ plugin: 'pixel-player', key: 'skin' } as const, SKINS[0]?.id ?? '')
40const frame = atom({ plugin: 'pixel-player', key: 'frame' } as const, 0)
41const volume = atom({ plugin: 'pixel-player', key: 'volume' } as const, 60)
42
43const HELP = [
44 '/music open the player pane',
45 '/music play [n] play the playlist (from track n)',
46 '/music pause pause, or resume when paused',
47 '/music resume resume a paused track',
48 '/music stop | next | prev',
49 '/music add <url> append a YouTube link, audio URL or file to playlist.txt',
50 '/music reload re-read playlist.txt',
51 '/music skins list the skins',
52 '/music skin [name] next skin, or one by name or number',
53 '/music vol <0-100> volume, from the next track on',
54].join('\n')
55
56// Playback lives in this module: a reload kills the child and starts over.
57let stream: AsyncGenerator<unknown, unknown> | undefined
58let generation = 0
59let ticker: { cancel: () => void } | undefined
60let titles: Record<string, string> = {}
61// mpv's JSON IPC socket for the running child; one name per module load.
62let socket: string | undefined
63const SOCKET_ID = Math.random().toString(36).slice(2, 8)
64
65type $ = EngineInterface
66
67export const register: Register = on => {
68 on('session.start', async ($, e, next) => {
69 await $.command.register({ name: 'music', description: 'Pixel-art music player: play, stop, next, skin, vol' })
70 await restoreState($)
71 // Whatever was playing before a reload is gone with the old module.
72 await update($, player, () => STOPPED)
73
74 return next(e)
75 })
76
77 on('command.run', { command: 'music' }, async ($, e) => {
78 const [verb = '', ...rest] = e.args.trim().split(/\s+/).filter(Boolean)
79 const arg = rest.join(' ')
80
81 switch (verb.toLowerCase()) {
82 case '':
83 await openPane($, e.presentation.columns)
84 return { text: 'Pixel Player opened. /music help lists the commands.' }
85 case 'help':
86 return { text: HELP }
87 case 'play': {
88 if (!arg && (await read($, player)).status === 'paused') return { text: await resume($) }
89 const list = await loadPlaylist($)
90 if (list.length === 0) return { text: emptyPlaylist() }
91 const n = arg ? Number(arg) - 1 : (await read($, player)).index
92 void play($, Number.isInteger(n) && n >= 0 && n < list.length ? n : 0)
93 await openPane($, e.presentation.columns)
94 return { text: `Playing track ${(Number.isInteger(n) && n >= 0 && n < list.length ? n : 0) + 1}.` }
95 }
96 case 'pause':
97 return { text: (await read($, player)).status === 'paused' ? await resume($) : await pause($) }
98 case 'resume':
99 return { text: await resume($) }
100 case 'stop':
101 await stop($)
102 return { text: 'Stopped.' }
103 case 'next':
104 case 'prev':
105 return { text: await step($, verb === 'next' ? 1 : -1) }
106 case 'reload': {
107 const list = await loadPlaylist($)
108 return { text: `playlist.txt: ${list.length} track(s).` }
109 }
110 case 'add': {
111 if (!arg) return { text: 'Usage: /music add <url or file>' }
112 const path = await playlistPath($)
113 const old = (await $.fs.exists(path)) ? await $.fs.read(path) : ''
114 await $.fs.write(path, `${old}${old.endsWith('\n') || old === '' ? '' : '\n'}${arg}\n`)
115 const list = await loadPlaylist($)
116 return { text: `Added as track ${list.length}.` }
117 }
118 case 'skins': {
119 const current = await read($, skin)
120 const rows = SKINS.map((s, i) => `${s.id === current ? '▸' : ' '} ${String(i + 1).padStart(2)}. ${s.id}`)
121 return { text: `${rows.join('\n')}\n\n/music skin <name or number> to switch.` }
122 }
123 case 'skin': {
124 const id = await cycleSkin($, arg)
125 return { text: id ? `Skin: ${id}` : `No skin "${arg}". /music skins lists them.` }
126 }
127 case 'vol':
128 case 'volume': {
129 const v = Number(arg)
130 if (!Number.isFinite(v)) return { text: `Volume is ${await read($, volume)}. Usage: /music vol <0-100>` }
131 await setVolume($, v)
132 return { text: `Volume ${Math.round(Math.max(0, Math.min(100, v)))} (from the next track).` }
133 }
134 default:
135 return { text: HELP }
136 }
137 })
138
139 on('ui.render', { component: 'Pane', requestId: PANE }, async ($, e) => {
140 const elements = $.ui.resolve(e)
141 const { Box, Text, Button } = elements
142 // A picker where the surface draws one (all but mobile); else a button that cycles.
143 const Select = 'Select' in elements ? elements.Select : undefined
144 const width = Math.max(20, e.props.bodyColumns)
145 const inline = e.props.placement === 'inline'
146 const p = await read($, player)
147 const list = await read($, playlist)
148 const skinId = await read($, skin)
149 const sprite = SKINS.find(s => s.id === skinId) ?? SKINS[0]
150 const tick = await read($, frame)
151 const vol = await read($, volume)
152 const isPlaying = p.status === 'playing'
153 const title = p.title || trackLabel(list[p.index], titles) || 'Nothing queued'
154 const icon = { stopped: '■', loading: '…', playing: '▶', paused: '⏸', error: '!' }[p.status]
155
156 // Inline, the sprite goes at half size to the left; docked, it sits on top and
157 // shrinks on a short terminal so the controls and the playlist stay in view.
158 const art = sprite && (
159 <PixelArt
160 Box={Box}
161 Text={Text}
162 sprite={sprite}
163 frame={isPlaying ? tick : 0}
164 maxColumns={inline ? 20 : width}
165 maxRows={inline ? 10 : e.props.scroll.bodyRows - CONTROL_ROWS - playlistRows(list.length)}
166 />
167 )
168 const controlsWidth = inline ? Math.max(20, width - 22) : width
169 const align = inline ? 'flex-start' : 'center'
170 const controls = (
171 <Box flexDirection="column" alignItems={align} flexGrow={1}>
172 <Text bold wrap="truncate">
173 {icon} {title}
174 </Text>
175 <Text wrap="truncate">
176 <Text color="cyan">{progressBar(p.position, p.duration, Math.max(4, controlsWidth - 16))}</Text>{' '}
177 <Text dimColor>
178 {formatTime(p.position)}/{formatTime(p.duration)}
179 </Text>
180 </Text>
181 <Text color="magenta">{equalizer(tick, Math.min(controlsWidth, 24), isPlaying)}</Text>
182 {p.status === 'error' && p.message && (
183 <Text color="red" wrap="truncate">
184 {p.message}
185 </Text>
186 )}
187 <Box flexDirection="row" flexWrap="wrap" justifyContent={align} gap={1}>
188 <Button key="prev" hotkey="b" label="⏮" onPress={() => step($, -1)} />
189 <Button
190 key="play"
191 hotkey="p"
192 label={isPlaying ? '⏸' : '▶'}
193 onPress={() => (isPlaying ? pause($) : p.status === 'paused' ? resume($) : play($, p.index))}
194 />
195 <Button key="stop" hotkey="s" label="■" onPress={() => stop($)} />
196 <Button key="next" hotkey="n" label="⏭" onPress={() => step($, 1)} />
197 </Box>
198 <Box flexDirection="row" flexWrap="wrap" justifyContent={align} gap={1}>
199 <Button key="voldown" hotkey="d" label="vol-" dimColor onPress={() => setVolume($, vol - 10)} />
200 <Text dimColor>{vol}</Text>
201 <Button key="volup" hotkey="u" label="vol+" dimColor onPress={() => setVolume($, vol + 10)} />
202 {Select ? (
203 <Select
204 key="skin"
205 label="skin"
206 options={SKINS.map(s => ({ value: s.id }))}
207 value={sprite?.id}
208 onSelect={id => void cycleSkin($, id)}
209 />
210 ) : (
211 <Button key="skin" label={`skin: ${sprite?.id ?? '-'}`} dimColor onPress={() => cycleSkin($, '')} />
212 )}
213 </Box>
214 </Box>
215 )
216 const tracks = (
217 <Box flexDirection="column">
218 <Text dimColor>─ Playlist ({list.length}) ─</Text>
219 {list.length === 0 && <Text dimColor>Empty. /music add <youtube link></Text>}
220 {/* One cell short of the edge: a wide character in the last column wraps on some terminals. */}
221 {list.map((track, i) => (
222 <Button
223 key={`t${i}`}
224 plain
225 dimColor={i !== p.index}
226 label={truncateToWidth(`${i === p.index ? '▸' : ' '} ${i + 1}. ${trackLabel(track, titles)}`, width - 1)}
227 onPress={() => play($, i)}
228 />
229 ))}
230 </Box>
231 )
232
233 if (inline) {
234 return (
235 <Box flexDirection="column">
236 <Box flexDirection="row" gap={2}>
237 {art}
238 {controls}
239 </Box>
240 <Text> </Text>
241 {tracks}
242 </Box>
243 )
244 }
245 return (
246 <Box flexDirection="column">
247 {art}
248 <Text> </Text>
249 {controls}
250 <Text> </Text>
251 {tracks}
252 </Box>
253 )
254 })
255
256 on('session.end', async ($, e, next) => {
257 if (e.reason === 'clear') {
258 // /clear goes on under a new session whose state starts empty, and no
259 // session.start fires for it: keep the music and carry the state over
260 // once the new session is in place (a write before then is wiped).
261 const carried = await read($, player)
262 const ended = await next(e)
263 carryOver($, e.sessionId, carried, 0)
264 return ended
265 }
266 await stop($)
267 if (socket) await $.process.run(['/bin/rm', '-f', socket]).catch(() => undefined)
268 return next(e)
269 })
270}
271
272/** Refills the state once the session after a /clear has taken over; retries for about 5 s. */
273function carryOver($: $, endedId: string, carried: Player, tries: number): void {
274 $.clock.after(tries === 0 ? 50 : 200, () => {
275 void (async () => {
276 const id = await $.session.id().catch(() => endedId)
277 if (id === endedId && tries < 25) return carryOver($, endedId, carried, tries + 1)
278 await restoreState($)
279 // A running track reports its own progress; a stopped one is put back as it was.
280 const now = await read($, player)
281 if (now.status === 'stopped' && now.title === '' && now.index === 0) await update($, player, () => carried)
282 })()
283 })
284}
285
286/** Fills the session's state from what is kept across sessions: titles, skin, volume, playlist. */
287async function restoreState($: $): Promise<void> {
288 titles = ((await $.store.get('titles')) as Record<string, string> | undefined) ?? {}
289 const savedSkin = await $.store.get('skin')
290 if (typeof savedSkin === 'string' && SKINS.some(s => s.id === savedSkin)) await update($, skin, () => savedSkin)
291 const savedVolume = await $.store.get('volume')
292 if (typeof savedVolume === 'number') await update($, volume, () => savedVolume)
293 await loadPlaylist($).catch(() => undefined)
294}
295
296// Asks for a dock sized to the terminal, and a short block when it sits inline above the prompt.
297async function openPane($: $, terminalColumns: number): Promise<void> {
298 await $.ui.open({ id: PANE, title: '♪ Pixel Player', columns: dockColumns(terminalColumns), rows: INLINE_ROWS })
299}
300
301// Kept outside the plugin folder: an installed plugin's folder is a copy that an update replaces.
302async function playlistPath($: $): Promise<string> {
303 const home = (await $.env.get('HOME')) ?? ''
304 const path = `${home}/.claude/pixel-play/playlist.txt`
305 if (!(await $.fs.exists(path))) {
306 const legacy = `${$.plugin.root}/playlist.txt`
307 const start = (await $.fs.exists(legacy))
308 ? await $.fs.read(legacy)
309 : '# One track per line: a YouTube link, a direct audio URL, or a local file path.\n' +
310 '# Anything after " # " on a line is a title shown until the real one loads.\n'
311 await $.fs.write(path, start)
312 }
313 return path
314}
315
316async function loadPlaylist($: $): Promise<Track[]> {
317 const path = await playlistPath($)
318 const list = (await $.fs.exists(path)) ? parsePlaylist(await $.fs.read(path)) : []
319 await update($, playlist, () => list)
320 return list
321}
322
323function emptyPlaylist(): string {
324 return 'The playlist is empty. Add a line with /music add <youtube link>, or edit ~/.claude/pixel-play/playlist.txt'
325}
326
327async function which($: $, name: string): Promise<string | undefined> {
328 for (const dir of ['/opt/homebrew/bin', '/usr/local/bin', '/usr/bin']) {
329 if (await $.fs.exists(`${dir}/${name}`)) return `${dir}/${name}`
330 }
331 return undefined
332}
333
334async function play($: $, index: number): Promise<void> {
335 const list = await read($, playlist)
336 const track = list[index]
337 if (!track) return
338 await halt()
339 const mine = ++generation
340
341 const mpv = await which($, 'mpv')
342 if (!mpv) {
343 await update($, player, () => failed(index, 'mpv not found: brew install mpv yt-dlp'))
344 return
345 }
346 const ytdlp = await which($, 'yt-dlp')
347 socket = await socketPath($)
348 const vol = await read($, volume)
349 await update($, player, () => ({ status: 'loading', index, title: trackLabel(track, titles), position: -1, duration: -1 }))
350 startTicker($)
351
352 const argv = [
353 mpv,
354 '--no-video',
355 '--really-quiet',
356 `--volume=${vol}`,
357 `--script=${$.plugin.root}/mpv/progress.lua`,
358 `--input-ipc-server=${socket}`,
359 '--ytdl-format=bestaudio/best',
360 ...(ytdlp ? [`--script-opts=ytdl_hook-ytdl_path=${ytdlp}`] : []),
361 track.url,
362 ]
363 const child = $.process.spawn({ argv })
364 stream = child
365 let errors = ''
366 let code: number | null = null
367 try {
368 for await (const chunk of child) {
369 if (mine !== generation) break
370 if (chunk.stream === 'stderr') {
371 errors = (errors + chunk.text).slice(-400)
372 continue
373 }
374 const progress = parseProgress(chunk.text)
375 if (!progress) continue
376 if (progress.title && !progress.title.startsWith('watch?') && titles[track.url] !== progress.title) {
377 titles = { ...titles, [track.url]: progress.title }
378 await $.store.set('titles', titles)
379 }
380 await update($, player, () => ({
381 status: progress.paused ? 'paused' : 'playing',
382 index,
383 title: titles[track.url] ?? progress.title,
384 position: progress.position,
385 duration: progress.duration,
386 }))
387 }
388 if (mine === generation) code = (await child.result).code
389 } catch (err) {
390 if (mine === generation) {
391 await update($, player, () => failed(index, String(err).slice(0, 200)))
392 endTicker()
393 }
394 return
395 }
396 if (mine !== generation) return
397 stream = undefined
398
399 if (code === 0) {
400 // Finished on its own: on to the next track, wrapping around.
401 void play($, (index + 1) % list.length)
402 return
403 }
404 const message = errors.trim().split('\n').pop() || `mpv exited with ${code}`
405 await update($, player, () => failed(index, message))
406 endTicker()
407}
408
409/** Ends the child, if any, without touching the state. */
410async function halt(): Promise<void> {
411 generation++
412 const s = stream
413 stream = undefined
414 await s?.return(undefined).catch(() => undefined)
415}
416
417async function stop($: $): Promise<void> {
418 await halt()
419 const p = await read($, player)
420 await update($, player, () => ({ ...STOPPED, index: p.index, title: p.title }))
421 endTicker()
422}
423
424// Short enough for a Unix socket path (104 bytes on macOS).
425async function socketPath($: $): Promise<string> {
426 const tmp = ((await $.env.get('TMPDIR')) || '/tmp').replace(/\/+$/, '')
427 return `${tmp}/pixel-play-${SOCKET_ID}.sock`
428}
429
430/** Sends commands to the running mpv over its IPC socket; true when it took them. */
431async function mpvCommand($: $, ...commands: unknown[][]): Promise<boolean> {
432 if (!socket || !stream) return false
433 const result = await $.process
434 .run(['/usr/bin/nc', '-U', socket], { stdin: commands.map(c => ipcCommand(...c)).join(''), timeoutMs: 3000 })
435 .catch(() => undefined)
436 return result?.exitCode === 0 && ipcSucceeded(result.stdout)
437}
438
439async function pause($: $): Promise<string> {
440 const p = await read($, player)
441 if (p.status !== 'playing') return p.status === 'paused' ? 'Already paused.' : 'Nothing is playing.'
442 if (!(await mpvCommand($, ['set_property', 'pause', true]))) return 'Could not reach mpv to pause.'
443 await update($, player, q => ({ ...q, status: 'paused' }))
444 endTicker()
445 return `Paused at ${formatTime(p.position)}.`
446}
447
448async function resume($: $): Promise<string> {
449 const p = await read($, player)
450 if (p.status !== 'paused') return 'Nothing is paused.'
451 if (!(await mpvCommand($, ['set_property', 'pause', false]))) return 'Could not reach mpv to resume.'
452 await update($, player, q => ({ ...q, status: 'playing' }))
453 startTicker($)
454 return 'Resumed.'
455}
456
457async function step($: $, delta: number): Promise<string> {
458 const list = await read($, playlist)
459 if (list.length === 0) return emptyPlaylist()
460 const p = await read($, player)
461 const n = (p.index + delta + list.length) % list.length
462 void play($, n)
463 return `Track ${n + 1}: ${trackLabel(list[n], titles)}`
464}
465
466async function cycleSkin($: $, name: string): Promise<string | undefined> {
467 const current = await read($, skin)
468 const byNumber = /^\d+$/.test(name) ? SKINS[Number(name) - 1] : undefined
469 const target = name
470 ? (byNumber ?? SKINS.find(s => s.id === name || s.id.includes(name)))
471 : SKINS[(SKINS.findIndex(s => s.id === current) + 1) % SKINS.length]
472 if (!target) return undefined
473 await update($, skin, () => target.id)
474 await $.store.set('skin', target.id)
475 return target.id
476}
477
478async function setVolume($: $, v: number): Promise<void> {
479 const clamped = Math.round(Math.max(0, Math.min(100, v)))
480 await update($, volume, () => clamped)
481 await $.store.set('volume', clamped)
482}
483
484function startTicker($: $): void {
485 if (ticker) return
486 ticker = $.clock.every(FRAME_MS, () => update($, frame, n => (n + 1) % 1_000_000))
487}
488
489function endTicker(): void {
490 ticker?.cancel()
491 ticker = undefined
492}
493hooks/pixel.tsx 142 lines1// Draws a sprite with half blocks: one cell holds two pixels, the top one as
2// the glyph's color and the bottom one as its background.
3
4import type { Elements } from 'claude-code'
5
6import { ALPHABET, SKINS } from './skins.gen'
7
8export type Sprite = {
9 id: string
10 width: number
11 height: number
12 palette: string[]
13 // One char per pixel, row by row; '.' is transparent.
14 frames: string[]
15}
16
17type Cell = { glyph: string; color?: string; backgroundColor?: string }
18
19const decode = new Map([...ALPHABET].map((ch, i) => [ch, i]))
20
21function pixel(sprite: Sprite, frame: string, x: number, y: number): string | undefined {
22 if (x < 0 || y < 0 || x >= sprite.width || y >= sprite.height) return undefined
23 const k = decode.get(frame[y * sprite.width + x] ?? '.')
24 return k === undefined ? undefined : sprite.palette[k]
25}
26
27function cell(top?: string, bottom?: string): Cell {
28 if (!top && !bottom) return { glyph: ' ' }
29 if (!top) return { glyph: '▄', color: bottom }
30 if (!bottom) return { glyph: '▀', color: top }
31 if (top === bottom) return { glyph: '█', color: top }
32 return { glyph: '▀', color: top, backgroundColor: bottom }
33}
34
35// The opaque bounding box across every frame, so empty margins are dropped.
36type Bounds = { x0: number; y0: number; x1: number; y1: number }
37const boxes = new Map<string, Bounds>()
38function boxOf(sprite: Sprite): Bounds {
39 const known = boxes.get(sprite.id)
40 if (known) return known
41 let [x0, y0, x1, y1] = [sprite.width, sprite.height, -1, -1]
42 for (const frame of sprite.frames) {
43 for (let y = 0; y < sprite.height; y++) {
44 for (let x = 0; x < sprite.width; x++) {
45 if (frame[y * sprite.width + x] === '.') continue
46 x0 = Math.min(x0, x)
47 y0 = Math.min(y0, y)
48 x1 = Math.max(x1, x)
49 y1 = Math.max(y1, y)
50 }
51 }
52 }
53 const box = x1 < 0 ? { x0: 0, y0: 0, x1: sprite.width - 1, y1: sprite.height - 1 } : { x0, y0, x1, y1 }
54 boxes.set(sprite.id, box)
55 return box
56}
57
58/**
59 * Pixels per side of the square every skin is fitted into at most, so switching
60 * never resizes the pane; kept small so the playlist has room under it.
61 */
62export const ART_SIZE = 24
63/** The smallest square, however little room there is. */
64const MIN_ART_SIZE = 8
65
66// The widest and tallest box among the skins: every skin is scaled by what fits
67// these into the square, so pixels come out the same size and skins keep the
68// size they were drawn at relative to each other.
69let largest: { w: number; h: number } | undefined
70function largestOf(sprite: Sprite) {
71 largest ??= SKINS.map(boxOf).reduce((m, b) => ({ w: Math.max(m.w, b.x1 - b.x0 + 1), h: Math.max(m.h, b.y1 - b.y0 + 1) }), { w: 1, h: 1 })
72 const box = boxOf(sprite)
73 return { w: Math.max(largest.w, box.x1 - box.x0 + 1), h: Math.max(largest.h, box.y1 - box.y0 + 1) }
74}
75
76/** Cell rows for one frame, each row as runs of identical cells. */
77export function rasterize(sprite: Sprite, frameIndex: number, maxColumns: number, maxRows = Infinity) {
78 const frame = sprite.frames[frameIndex % sprite.frames.length] ?? ''
79 const box = boxOf(sprite)
80 const w = box.x1 - box.x0 + 1
81 const h = box.y1 - box.y0 + 1
82 // The largest even square that fits the room given (two pixels per row).
83 const room = Math.min(ART_SIZE, maxColumns, maxRows * 2)
84 const size = Math.max(MIN_ART_SIZE, room - (room % 2))
85 // One scale for every skin (never enlarging), nearest neighbour, centred in the square.
86 const big = largestOf(sprite)
87 const scale = Math.min(1, size / big.w, size / big.h)
88 const outW = Math.max(1, Math.round(w * scale))
89 const outH = Math.max(1, Math.round(h * scale))
90 const left = Math.floor((size - outW) / 2)
91 const top = Math.floor((size - outH) / 2)
92 const at = (cx: number, cy: number) => {
93 const ox = cx - left
94 const oy = cy - top
95 if (ox < 0 || oy < 0 || ox >= outW || oy >= outH) return undefined
96 return pixel(sprite, frame, box.x0 + Math.floor((ox * w) / outW), box.y0 + Math.floor((oy * h) / outH))
97 }
98 const rows: Array<Array<Cell & { text: string }>> = []
99 for (let cy = 0; cy < size; cy += 2) {
100 const runs: Array<Cell & { text: string }> = []
101 for (let cx = 0; cx < size; cx++) {
102 const c = cell(at(cx, cy), at(cx, cy + 1))
103 const last = runs[runs.length - 1]
104 if (last && last.color === c.color && last.backgroundColor === c.backgroundColor && last.glyph === c.glyph) {
105 last.text += c.glyph
106 } else {
107 runs.push({ ...c, text: c.glyph })
108 }
109 }
110 rows.push(runs)
111 }
112 return rows
113}
114
115export function PixelArt(props: {
116 Text: Elements['terminal']['Text']
117 Box: Elements['terminal']['Box']
118 sprite: Sprite
119 frame: number
120 maxColumns: number
121 maxRows?: number
122}) {
123 const { Text, Box, sprite, frame, maxColumns, maxRows } = props
124 return (
125 <Box flexDirection="column" alignItems="center" flexShrink={0}>
126 {rasterize(sprite, frame, maxColumns, maxRows).map(runs => (
127 <Text wrap="truncate">
128 {runs.map(run =>
129 run.color ? (
130 <Text color={run.color} backgroundColor={run.backgroundColor}>
131 {run.text}
132 </Text>
133 ) : (
134 run.text
135 ),
136 )}
137 </Text>
138 ))}
139 </Box>
140 )
141}
142hooks/player.ts 131 lines1import type { Track } from '../types'
2
3/** Reads playlist.txt: one track per line, `#` lines skipped, ` # title` optional. */
4export function parsePlaylist(text: string): Track[] {
5 const tracks: Track[] = []
6 for (const raw of text.split(/\r?\n/)) {
7 const line = raw.trim()
8 if (!line || line.startsWith('#')) continue
9 const cut = line.indexOf(' # ')
10 const url = (cut < 0 ? line : line.slice(0, cut)).trim()
11 const title = cut < 0 ? undefined : line.slice(cut + 3).trim() || undefined
12 tracks.push(title ? { url, title } : { url })
13 }
14 return tracks
15}
16
17export type Progress = { position: number; duration: number; paused: boolean; title: string }
18
19/** Pulls the last `@@pos|<pos>|<dur>|<paused 0/1>|<title>` line that mpv/progress.lua wrote. */
20export function parseProgress(chunk: string): Progress | undefined {
21 let found: Progress | undefined
22 for (const line of chunk.split('\n')) {
23 const m = /^@@pos\|(-?[\d.]+)\|(-?[\d.]+)\|([01])\|(.*)$/.exec(line.trim())
24 if (m) found = { position: Number(m[1]), duration: Number(m[2]), paused: m[3] === '1', title: m[4] ?? '' }
25 }
26 return found
27}
28
29/** One line of mpv's JSON IPC protocol. */
30export function ipcCommand(...command: unknown[]): string {
31 return `${JSON.stringify({ command })}\n`
32}
33
34/** Whether mpv answered every command it was sent with success. */
35export function ipcSucceeded(reply: string): boolean {
36 const lines = reply.split('\n').filter(l => l.includes('"error"'))
37 return lines.length > 0 && lines.every(l => l.includes('"error":"success"'))
38}
39
40/** The dock width to ask for: a share of the terminal, room for a full-size sprite on wide ones. */
41export function dockColumns(terminalColumns: number): number {
42 return Math.max(30, Math.min(44, Math.round(terminalColumns * 0.3)))
43}
44
45export function formatTime(seconds: number): string {
46 if (!(seconds >= 0)) return '--:--'
47 const s = Math.floor(seconds)
48 const h = Math.floor(s / 3600)
49 const mm = String(Math.floor((s % 3600) / 60)).padStart(2, '0')
50 const ss = String(s % 60).padStart(2, '0')
51 return h > 0 ? `${h}:${mm}:${ss}` : `${mm}:${ss}`
52}
53
54export function progressBar(position: number, duration: number, width: number): string {
55 const cells = Math.max(4, width)
56 if (!(duration > 0)) return '░'.repeat(cells)
57 const filled = Math.min(cells, Math.round((position / duration) * cells))
58 return '█'.repeat(filled) + '░'.repeat(cells - filled)
59}
60
61const BARS = '▁▂▃▄▅▆▇█'
62
63/** A made-up equalizer: there are no samples to analyse, only a beat to fake. */
64export function equalizer(tick: number, width: number, isPlaying: boolean): string {
65 let s = ''
66 for (let i = 0; i < width; i++) {
67 if (!isPlaying) {
68 s += BARS[0]
69 continue
70 }
71 const v = Math.sin(tick * 0.9 + i * 1.7) + Math.sin(tick * 0.37 + i * 0.6) + Math.sin(i * 3.1 + tick * 1.3)
72 s += BARS[Math.max(0, Math.min(7, Math.round(((v + 3) / 6) * 7)))]
73 }
74 return s
75}
76
77// East Asian wide and fullwidth ranges, plus emoji: each takes two terminal cells.
78const WIDE: Array<[number, number]> = [
79 [0x1100, 0x115f],
80 [0x2e80, 0x303e],
81 [0x3041, 0x33ff],
82 [0x3400, 0x4dbf],
83 [0x4e00, 0x9fff],
84 [0xa000, 0xa4cf],
85 [0xac00, 0xd7a3],
86 [0xf900, 0xfaff],
87 [0xfe30, 0xfe4f],
88 [0xff00, 0xff60],
89 [0xffe0, 0xffe6],
90 [0x1f300, 0x1f64f],
91 [0x1f900, 0x1f9ff],
92 [0x20000, 0x3fffd],
93]
94
95function charWidth(ch: string): number {
96 const code = ch.codePointAt(0) ?? 0
97 return WIDE.some(([lo, hi]) => code >= lo && code <= hi) ? 2 : 1
98}
99
100/** How many terminal cells the text takes. */
101export function displayWidth(text: string): number {
102 let w = 0
103 for (const ch of text) w += charWidth(ch)
104 return w
105}
106
107/** Cuts the text to at most `width` cells, ending in … when cut. */
108export function truncateToWidth(text: string, width: number): string {
109 if (displayWidth(text) <= width) return text
110 let out = ''
111 let w = 0
112 for (const ch of text) {
113 const cw = charWidth(ch)
114 if (w + cw > width - 1) break
115 out += ch
116 w += cw
117 }
118 return `${out}…`
119}
120
121export function trackLabel(track: Track | undefined, titles: Record<string, string>): string {
122 if (!track) return ''
123 return titles[track.url] ?? track.title ?? shortUrl(track.url)
124}
125
126function shortUrl(url: string): string {
127 const id = /[?&]v=([\w-]+)/.exec(url)?.[1] ?? /youtu\.be\/([\w-]+)/.exec(url)?.[1]
128 if (id) return `youtube ${id}`
129 return url.split('/').filter(Boolean).pop() ?? url
130}
131hooks/skins.gen.ts 561 lines1// Generated by scripts/png2sprite.mjs from assets/. Do not edit by hand.
2import type { Sprite } from './pixel'
3
4export const ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&()*+,-/:;<=>?@[]^_{|}~"
5
6export const SKINS: readonly Sprite[] = [
7 {
8 "id": "vinyl",
9 "width": 40,
10 "height": 40,
11 "palette": [
12 "#805443",
13 "#e0a588",
14 "#353142",
15 "#573235",
16 "#a1674f",
17 "#272435",
18 "#322329",
19 "#1c1a29",
20 "#6c463a",
21 "#bbb6c2",
22 "#7c80c5",
23 "#7d7885",
24 "#908b9a",
25 "#5f5e72",
26 "#bc856b",
27 "#484357",
28 "#e3e8ee",
29 "#cf625f",
30 "#ea5454",
31 "#a23436",
32 "#6c2030",
33 "#cfccdc",
34 "#a09aa5",
35 "#ecc2c1",
36 "#ddb3b7",
37 "#d2acae",
38 "#8e3a3a",
39 "#6a6a7c",
40 "#c7c4cd",
41 "#eef5f8",
42 "#6d6d6d",
43 "#9299ae",
44 "#eaced7"
45 ],
46 "frames": [
47 ".....................................................................................................................................................................................................................................................011111111111111111111111121113..........144054444444000444444444625748..........1449a6444422bcc222444445d75523..........e02cff36d2777777776344f5gd7733..........1445f6ff5757777777773075cd7643..........144433f22257777777777652df7733..........e4443gcc2257777777777775777733..........e4449cccd2277777777777d6225783..........144dfccccf27777777777776222883..........1422fdcccf7777777777775d688043..........14252fdcd77hiihj777777b7644443..........1425222ff7hiiiiij7777757784443..........e025222277iiijiii7777d77784043..........1425222277iiig8ii77ffff7784443..........1425222277iiijiii77ff7f7784443..........1427722577jiiiiij75cd5f7784443..........14377777777kiiij77c25ff2744443..........144977777777777772c97bf2644443..........1447777777777777227f5bf5044443..........e000b777777777777gd7cb98888883..........14440c7777777777bf755928444403..........144646777777777d25559684444443..........1461h03777777772f57d7223333343..........14hij7406dd777772f7881i111e303..........1430064488722222578844jk4df303..........144738444448888884444088888003..........e00000000000000000000000000003..........333333333333333333333333333333...........75555..................5557...............................................................................................................................................................................................................",
48 ".....................................................................................................................................................................................................................................................011111111111111111111111121113..........144054444444000444444444625748..........1449l6444422mcc222444445d75523..........e02cff36d2777777776344f5gd7733..........1445f6ff5757777777773075cd7643..........144433f22257777777777652df7733..........e4443gcc2257777777777775777733..........e4449cccd2277777777777d6225783..........144dfccccf27777777777776222883..........1422fdcccf7777777777775b688043..........14252fdcd77nnnno777777b7644443..........1425222ff7nnnnnnp7777757784443..........e025222277nnnjnnn7777d77784043..........1425222277nnqgjnn77ffff7784443..........1425222577nnnjnnn77ff7f7784443..........1427722777pnnnnnp75cd5f7784443..........14377777777nnnnn77c25ff2744443..........144c77777777777772c97bf2644443..........1447777777777777227f5bf5044443..........e0009777777777777gd7cb98888883..........14440r7777777777bf755928444403..........144646777777777d25559684444443..........1461h03777777772f5797223333343..........14hij7406s9777772f7881i111e303..........1430064488722222578844jk4df303..........144738444448888884444088888003..........e00000000000000000000000000003..........333333333333333333333333333333...........75555..................5557...............................................................................................................................................................................................................",
49 ".....................................................................................................................................................................................................................................................011111111111111111111111121113..........144054444444000444444444625748..........1449t6444422222220444445d75523..........e02cff36d2777777776344f5gd7733..........1445f6ff5757777777773075cd7643..........14443sf22257777777777652df7733..........e4443ccc2257777777777775777733..........e4449cccd227777777777776225783..........144dfccccf27777777777776222883..........1422fdcccf77777777777757688043..........14252fdcd77ttttt777777b7644443..........1425222ff7ttttttt7777757784443..........e025222277ttttttt7777d77784043..........1425222277ttutttt77ffff7784443..........1425222577ttttttt77ff7f7784443..........1427722777ttttttt75cd5f7784443..........14377777777ttttt77cb5ff2744443..........144777777777777772c97bf2044443..........1447777777777777227f5bf5044443..........e0007777777777777gd7cbd8888883..........1444077777777777bf755928444403..........144648777777777d25557684444443..........1461h03777777772f5757223333343..........14hij740677777772f7881i111e303..........1430064488722222578844jk4df303..........144738444448888884444088888003..........e00000000000000000000000000003..........333333333333333333333333333333...........75555..................5557...............................................................................................................................................................................................................",
50 ".....................................................................................................................................................................................................................................................011111111111111111111111121113..........144054444444000444444444625748..........1449t6444422222220444445d75523..........e02cff36d2777777776344f5gd7733..........1445f6ff5757777777773075cd7643..........14443sf22257777777777652df7733..........e4443ccc2257777777777775777733..........e4449cccd227777777777776225783..........144dfccccf27777777777776222883..........1422fdcccf77777777777757688043..........14252fdcd77vwwwc777777b7644443..........1425222ff7cwwwwwc7777757784443..........e025222277wwwjwww7777d77784043..........1425222277wwqtjww77ffff7784443..........1425222777wwwjwww77ff7f7784443..........1427777777vwwwwwv75cd5f7784443..........14377777777vwwwc77cb5ff2744443..........144777777777777772c97bf2044443..........1447777777777777227f5bt5044443..........e0007777777777777gd7cbg8888883..........1444077777777777bf755928444403..........144648777777777d25557684444443..........1461h03777777772f5757223333343..........14hij740677777772f7881i111e303..........1430064488722222578844jk4df303..........144738444448888884444088888003..........e00000000000000000000000000003..........333333333333333333333333333333...........75555..................5557...............................................................................................................................................................................................................",
51 ".....................................................................................................................................................................................................................................................011111111111111111111111121113..........144054444444000444444444625748..........1449t6444422222220444445d75523..........e02cff36d2777777776344f5gd7733..........1445f6ff5757777777773075cd7643..........144433f22257777777777652df7733..........e4443gcc2257777777777775777733..........e4449cccd227777777777776225783..........144dfccccf27777777777776222883..........1422fdcccf77777777777757688043..........14252fdcd777hhh7777777b7644443..........1425222ff77hiiih77777757784443..........e025222277hiiiiih7777d77784043..........1425222277hiitiih77ffff7784443..........1425222277hiiiiih77ff7f7784443..........14272227777iiiii775cd5f7784443..........143777777777iii777cb5ff2744443..........144777777777777772c97bf2044443..........1447777777777777227f5bt5044443..........e0007777777777777gd7cbg8888883..........1444077777777777bf755928444403..........144648777777777d25557684444443..........1461h03777777772f5757223333343..........14hij740677777772f7881i111e303..........1430064488722222578844jk4df303..........144738444448888884444088888003..........e00000000000000000000000000003..........333333333333333333333333333333...........75555..................5557..............................................................................................................................................................................................................."
52 ]
53 },
54 {
55 "id": "headphone-kid",
56 "width": 40,
57 "height": 40,
58 "palette": [
59 "#2c2234",
60 "#3d3444",
61 "#271f31",
62 "#603d47",
63 "#77574f",
64 "#fadcb6",
65 "#332733",
66 "#dea090",
67 "#cf8d7f",
68 "#9b4740",
69 "#eead1d",
70 "#b65e45",
71 "#8c8486",
72 "#cf7639",
73 "#d8d8d7",
74 "#a9a5a5",
75 "#b18e88",
76 "#cec6be",
77 "#c2bcb6",
78 "#faf2e2",
79 "#f0cbad",
80 "#a16766"
81 ],
82 "frames": [
83 "................................................................................................00000000..............................000111111220...........................01110000021110.........................0122233333322210.......................012233333333332210.....................01223334444433332210....................21234444444444333212...................0123344444444443333212..................2123334444444323333210..................2123333323423322333210..................2223323323303252323222.................223232223232005550032322................123230652565055555032321...............01232255555555555555223212..............21232355665555556055303210..............21232076556555505567023210...............003228755555555557722322.................0322077555555557702232...................02.17775599557770.22........................022855558200...........................60992222229900.........................6a922b0cc0b22ba6......................66abb0da0ee0ad0bba00...................6550b20da0ff0ad00b0556..................0780009ad6ee6da9000870...................000.09da6aa6ad92.000........................0baa0000aab2............................000a0ff6a030.............................2100221210..............................2112222110..............................0111221110..............................0212222100..............................0862222080.............................6fcfg22gfcf0............................0feg0000gef0.............................000....000...............................................................................................",
84 "........................................................................................................................................00000000..............................000111111220...........................01110000021110.........................0122233333322110.......................012233333333332210.....................01223334444433332210....................21234444444444333212...................0123344444444443333212..................2123334444444323333210..................2123323323423322333210..................2223323323303252323222.................223232223232005550032322................123230622565055555032321...............01232255555555555555223212..............21232355005555550055303210..............21232070000555500007023210...............003228755555555557722322.................0322277555555557722232...................02.00775599557722.22........................022855558220...........................02992222229902.........................2a922b0cc0b22ba0......................00abb0da0ee0ad0bba22...................6550b20da0ff0ad00b0556..................0780209ad6ee6da9220870...................022.09da6aa6ad92.220........................0baa0000aab0............................000002262000.............................2112222110..............................0111221110..............................0212222100..............................0862222080.............................6fcfg22gfcf0............................0feg0000gef0.............................000....000...............................................................................................",
85 "........................................................................................................................................00000000..............................000111111220...........................01110000021110.........................0122233333322110.......................012233333333332210.....................01223334444433332210....................21234444444444333212...................0123344444444443333212..................2123334444444323333210..................2123323323423322333210..................2223323323303252323222.................223232223232000550032322................123232522565055555232321...............01232250065555510005223212..............2123235h0065555000i5303210..............2123207jj06555566jj7623210...............003228755555555577722322.................0322277555995557722232...................22.02775555557722.22.........................2285555822.............................099222222990...........................0a22b0cc0b22a0.........................0ab0da0cc0ad0ba0.......................00ab0da0ee6ad0ba00.....................655229ad6aa6da922556....................078229da0000ad922870.....................0020baa0ff6aab0200.........................000002212000.............................2112222110..............................0111221110..............................0212222100..............................0862222080.............................6fcfg22gfcf0............................0feg0000gef0.............................000....000...............................................................................................",
86 "................................................................................................00000000..............................000111111220...........................01110000021110.........................0122333333322210.......................012233333333332210.....................01223444444443332210....................21234444444444333212...................0123334444444323333212..................2123323323433322333210..................2123323323233252223210..................2222352250223255203222.................223232555552505555232322................123220000555555000032321...............0123232h0005555022i2223212..............212323kjj06555566jj2323210..............21232077555555555577023210...............00322l775559955577722322.................0322277755555577722232...................22.22278555588220.22.........................2222222222.............................09922cc22990...........................2a22b0cc0b22a0..........................2b0da0ee0ad0b2.........................0ab0da0ff0ad0ba0.......................00a29ad6ee6da92a00......................05029da6aa6aa90052......................0572baa0000adb2770.......................0822aa0ff6aab070.........................20200022120000............................2112222110..............................0111221110..............................0212222100..............................0862222080.............................6fcfg22gfcf0............................0feg0000gef0.............................000....000...............................................................................................",
87 "..............................................................................................000000000000...........................01111111111110.........................0122233333322210.......................012233333333332210.....................01223334444433332210....................21234444444444333212...................0123344444444323333212..................2123333323443322333210..................2123323323233252223210..................2222222323223255203222.................223232522505505555232322................123232066555556600522321...............0123225h0j655556j0h5203210..............2123235j1065555666j5303210...............003207755555555557732322.................2320777555995557770232..................2322777555555557772232...................22227775555557772222........................227855558822.............................2222222222.............................69922cc22996...........................0a22b0cc0b22a0..........................bb0da0ee0ad0bb.........................0ab0da0ff0ad0ba0........................0a29ad6ee6da90a0........................0029da6aa6ad90000.......................052baa0000aab2750........................0200a0ff6a02200...........................2100221212..............................2112222110..............................0111221110..............................0212222100..............................0862222080.............................6fcfg22gfcf0............................0feg0000gef0.............................000....000..............................................................................................."
88 ]
89 },
90 {
91 "id": "cat",
92 "width": 40,
93 "height": 40,
94 "palette": [
95 "#5a2a27",
96 "#fad697",
97 "#f09f49",
98 "#562623",
99 "#612f2a",
100 "#fccc77",
101 "#c36f29",
102 "#25221f",
103 "#292825",
104 "#e4883b",
105 "#dc8239",
106 "#585860",
107 "#b4631e",
108 "#fdbd5f",
109 "#4e4e56",
110 "#3d3d45",
111 "#3a373a",
112 "#46464e",
113 "#eb8b40",
114 "#d07832",
115 "#2a2218",
116 "#fdfefd",
117 "#6a696e",
118 "#a1561c",
119 "#84411f",
120 "#a7a5a5",
121 "#974725"
122 ],
123 "frames": [
124 "...................................................................................................................................................................................................................00.....................................0123...........403......................31563.77888..009a3......................01167bb8b8887c2d13......................3267efg6666e771113.......................c7bh66iiiij687dj3.......................7hh6iiiiiiij67h3.......................8bhj9iiiiiiii6ch8.......................8b6j77iiiiikiic78......................7e7c7l7iiiillkic7h8....................8hh7c777iiii88797hme8...................8mb7cc7a911ia7ii7hmm8...................7hf7cii111k11iii7hhh8....................8h8c211111111197hhh8.....................8831111kk111117hf8........................02111111111j778..........................03jj111jj33.............................066jdddj663............................066a511156660...........................0iii11111iij63..........................0iii11111iii60.......0..................0iii11111iiii0.....0060.................3iii9111iii900.....0ccc0...............3c3ii9910iii0ii0.....3cc3...............3c39i9060iii0ii3....066c0...............3cc3i90a0ii0ii634000aaj0................3cc3i90a0ii0ccc3999a330..................0c3990a0990ccc00000......................0099033993030.............................40...33..........................................................................................................................................................................................................................",
125 ".........................................................................................................................................................................................................................................................00.............4.......................0123..........00a4......................311a33.77888.3c9553.....................3d11637bbb8887c5123.....................3a19n8ehgg888h715j3......................3agehh66aai6687j3........................7bh66iiiiiij67h8.......................8eeb6iiiiiiii6ne8.......................8h66aiiiiiii9i678......................7h7n6779iiiii77a7h8....................8hhf7j7l7iiiikl797he8...................8mmf7i9ka911ia79i7hm8...................8hhf7iii111k11iii7hh8...................7hhf7i111111111197hh8....................8ff721111kk111117f8......................88.31111111111j77...........................03jj111jj33.............................0o6jdddj663............................066a511156660.......330.................0iii11111iia63......3663................0iii11111iii60.....36663................0iii1111iii900....36c63.................3iii9111iii0ii0...3j63.................3c3ii9910iii0ii3..3jj3..................3c39i9060ii0ii63009j6...................3cc3i90a0ii0icc3aa43.....................0c3990a0990ccc000........................0099033990030.............................40...33..........................................................................................................................................................................................................................",
126 ".......................................................................................................................................................................................................................................................................00........................03...........3i1.......................09933..77888.3c513......................3911a37bbb8887c513......................391117begg888h8153.......................3917bh66aai6688j3........................67bh66iiiiij6788........................7bh66iiiiiiij688.......................8hf669iiiiiiii688.......................77cc6777iiiii776h8.....................7hh77j777iiiik7767h8...................8hhmf7i977911ia79i7m8...................8mmmf7iii111k11iij7h8...................7hhhf7i1111111111j7h8....................7fhf711111kk1111k78......................88732111111111j78...........................03jj111jj33.............................066jdddj663......333...................066a511156660....3ccc3..................0iii11111iia63..3cccc3..................0iii11111iii60..0cc33...................0iii1111iii900..0cc.....................3iii9111iii0ii0.3c3....................3c3ii9910iii0ii33cc3....................3c39i9060ii0iii3cc3.....................3cc3i90a0ii0icc330.....................pp0c3990a0990ccc0pppp.................ppppp0099033990000pppppp.................pppppp40ppp33ppppppppp.................................................................................................................................................................................................................",
127 ".........................................................................................................................................................................................................................................................................300......................03333788888..009223....................0q2267ebbb8887725123....................31157bhggg667h7c11i3....................3117bh66aaii66877a3......................78bh66iiiiiij67h8.......................7fh666iiiiiiij6h8.......................77c6677iiiii7a678......................7hh7667l7iiiil767h8....................8hhmf7j777iiii7767he8...................8mmmf7i977911ia767hm8...................8hhmf7iii111k11ij7hh8...................7hhhf7i11111111167hh8....................8fhf711111kk11137f8......................8887211111111j778..........................03jj111jj33.............................066jdddj663............................066a511156660....3000...................0iii11111iij63...3ccc3..................0iii11111iii60..0ccc30..................0iii11111iiii0..3cc3....................3iii9111iii000...3c3...................3c3ii9910iii0ii0..3c3...................3c39i9060iii0ii303cc3...................3cc3i90a0ii0ii63ccc3.....................3c3i90a0ii0ccc3cc3......................3c3990a0990ccc003........................0099033990030.............................40...33..........................................................................................................................................................................................................................",
128 ".................................................................................................................................................................................................................................00.......................030...77888..00i9......................0ii9337bbb8887c2153.....................311167bhgg668h75113.....................311d7bh66aii6687dj3......................3j7bh66iiiiij6773.......................7gbh66iiiiiii66h8.......................7fh66777iiii776h8.......................77c66l77iiii7l77h8.....................7hh76jl77i11i7777he8...................8hhmf7i97711kia777hm8...................8mmmf7iii111111i67hh8...................7hhhf7i1111kk11167hh8....................7hhf711111kk11167f8......................8ff7911111111j778........................8883jj111jj33.............................066jdddj663.............................06a511156660...........................066i11111iij63..........................0iii11111iij63....333...................0iii11111iii60....3c3...................0iii9111iiiii0....3cc3..................3iii9910iii000....3cc3.................3c3ii9060iii0ii0...3cc3.................3c39i90a0ii0iii3..06cc3.................3cc3i90a0ii0ii630366c3...................3c3i90a0ii0ccc3666c3....................3c3990a0990ccc00333......................0099033993030.............................40...33.........................................................................................................................................................................................................................."
129 ]
130 },
131 {
132 "id": "cassette",
133 "width": 40,
134 "height": 40,
135 "palette": [
136 "#d4d1cd",
137 "#2f2f31",
138 "#313236",
139 "#37363a",
140 "#3a3a1a",
141 "#444658",
142 "#3c3b4a",
143 "#28282a",
144 "#403c3e",
145 "#201d0b",
146 "#f5e4c1",
147 "#21201f",
148 "#1e1c1c",
149 "#89878c",
150 "#e3dac1",
151 "#454446",
152 "#262125",
153 "#382129",
154 "#3c2929",
155 "#342021",
156 "#2a1b1e",
157 "#3d211f",
158 "#da6164",
159 "#282622",
160 "#875856",
161 "#e6605f",
162 "#70707b",
163 "#5b5c65",
164 "#fbfbfb",
165 "#171416",
166 "#5c3b3e",
167 "#b2b7b6",
168 "#555563",
169 "#434100",
170 "#faf81e",
171 "#644b4c",
172 "#736163",
173 "#7c7c84",
174 "#81454b"
175 ],
176 "frames": [
177 "...................................................................................................................................................................................................................................................................................................................................012122222211132122312221121111111.......3425666666666666666666666666635742......8913aaaaaaaaaaaaaaaaaaaaaaaaaa6298......85baaaaaaaaaaaaaaaaaaaaaaaaaaaa753......85caacdeeeeeeeeeeeeeeeeeeeeeeea753......f5gaaaaaaaaaaaaaaaaaaaaaaaaaaaa758......85gaaaaaaaaaaaaaaaaaaaaaaaaaaaa752......85hiiiiiijjjhghjhjhjhkjjhjiiiiii52......f5lmmmmm7b7c3fffff8132b77nommmmj53......f5lppppdd3fcccqqqqqqccbf3rdppppl53......85impmidnss1bbqqqqqqbb7sscdppmml53......f5lpppidbss7bbqqqqqqbbnsstdppppj53......85lppppudnqbbnqqqqqq7ccqbduppppj53......f5lppppmkkcckckkkkkkgckkkkpppppk53.....v3577777777777777777777777n7777775f0....t255555555555555555555555555555555rg....t355555533223222222322233323555555rb....tg555553rrrrrrrrwqqrrrrrrrww355555rb....t7555551wwwwwwwwwx6wwwwwwwwwf55555rb....t755557dwwwwwwwww99wwwwwwwwwd15555fg.....1b555cwwwww7rbwwwwww7f1wwwwq75539w......byb55bw1ncw7fcwwwwwwn87wcn1qg559yf......0b777b111c21177777777771b371n777b0...........................................................................................................................................................................................................................................................................................................................................................................",
178 "...................................................................................................................................................................................................................................................................................................................................012122222211132122312221121111111.......3425666666666666666666666666635742......8913aaaaaaaaaaaaaaaaaaaaaaaaaa6298......85baaaaaaaaaaaaaaaaaaaaaaaaaaaa753......85caaewtdeeeeeeeeeeeeeeeeeeeeea753......f5gaaaaaaaaaaaaaaaaaaaaaaaaaaaa758......85gaaaaaaaaaaaaaaaaaaaaaaaaaaaa752......85hiiiiiijjjhghjhjhjhkjjhjiiiiii52......f5lmmmmm7b7c3fffff8132b77nmmmmmj53......f5lppppzr3fcccqqqqqqccbf3rzppppl53......85impmpdnss1bbqqqqqqbb7sscdppmml53......f5lppppdbss7bbqqqqqqbbnsstdppppj53......85lppppArnqbbnqqqqqq7ccqbruppppj53......f5lppppmkkcckckkkkkkgckkkkpppppk53.....v3577777777777777777777777n7777775f0....t255555555555555555555555555555555rg....t355555533223222222322233323555555rb....tg555553rrrrrrrrwqqrrrrrrrww355555rb....t7555551wwwwwwwwwx6wwwwwwwwwf55555rb....t755557dwwwwwwwww99wwwwwwwwwd15555fw.....1b555cwwwww7rbwwwwww7f1wwwwq75539w......byb55bw1ncw7fcwwwwwwn87wcn1qg559yf......0b777b111c21177777777771b371n777b0...........................................................................................................................................................................................................................................................................................................................................................................",
179 "...................................................................................................................................................................................................................................................................................................................................012122222211132122312221121111111.......3425666666666666666666666666635742......8913aaaaaaaaaaaaaaaaaaaaaaaaaa6298......85baaaaaaaaaaaaaaaaaaaaaaaaaaaa753......85caaeeeeeeeeeeeeeeeeeeeeeeeeea753......f5gaaaaaaaaaaaaaaaaaaaaaaaaaaaa758......85gaaaaaaaaaaaaaaaaaaaaaaaaaaaa752......85hiiiiiijjjhgghjhjjhkjjjjjiiiii52......f5lmmmmg777c3ffff81332b77nnpmmmj53......f5lpppmg7BBbcccqqqqcccbffbbmpppl53......85impmpg3ssbbbbqqqqbbb7ss37mpmml53......f5lpppm72BBbbbbqqqqbbbbBs2gppppj53......85lpppmbbBqbbnqqqqqq7cbqBbbmpppj53......f5lpppmkkkcckckkkkkkgckkkkkppppk53.....v3577777777777777777777777nn777775f0....t255555555555555555555555555555555rg....t355555533223222222322233323555555rb....tg555553rrrrrrrrwqqrrrrrrrww355555rb....t7555551wwwwwwwwwx6wwwwwwwwwf55555rb....t755557dwwwwwwwww99wwwwwwwwwd15555f0.....1b555cwwwww7rbwwwwww7f1wwwwq75539w......byb55bw1ncw7fcwwwwwwn87wcn1qg559yf......0b777b111c21177777777771b371n777b0...........................................................................................................................................................................................................................................................................................................................................................................",
180 "...................................................................................................................................................................................................................................................................................................................................012122222211132122312221121111111.......3425666666666666666666666666635742......8913aaaaaaaaaaaaaaaaaaaaaaaaaa6298......85baaaaaaaaaaaaaaaaaaaaaaaaaaaa753......85caaeeeeeeeeeeeeeeeeeeeeeeeeea753......f5gaaaaaaaaaaaaaaaaaaaaaaaaaaaa758......85gaaaaaaaaaaaaaaaaaaaaaaaaaaaa752......85hiiiiiijjjhgghjhjjhkjjjjjiiiii52......f5lmmmmg777c3ffff81332b77nnpmmmj53......f5lpppmg7BBbcccqqqqcccbffbbmpppl53......85impmug3ssbbbbqqqqbbb7ss37Cpmml53......f5lpppp72BBbbbbqqqqbbbbBs2gppppj53......85lpppmbbBqbbnqqqqqq7cbqBbbmpppj53......f5lpppmpkkcckckkkkkkgckkkkpppppk53.....v3577777777777777777777777nn777775f0....t255555555555555555555555555555555rg....t355555533223222222322233323555555rb....tg555553rrrrrrrrwqqrrrrrrrww355555rb....t7555551wwwwwwwwwx6wwwwwwwwwf55555rb....t755557dwwwwwwwww99wwwwwwwwwd15555f0.....1b555cwwwww7rbwwwwww7f1wwwwq75539w......byb55bw1ncw7fcwwwwwwn87wcn1qg559yf......0b777b111c21177777777771b371n777b0...........................................................................................................................................................................................................................................................................................................................................................................",
181 "...................................................................................................................................................................................................................................................................................................................................012122222211132122312221121111111.......3425666666666666666666666666635742......8913aaaaaaaaaaaaaaaaaaaaaaaaaa6298......85baaaaaaaaaaaaaaaaaaaaaaaaaaaa753......85caaeeeeeeeeeeeeeeeeeeeeeeeeea753......f5gaaaaaaaaaaaaaaaaaaaaaaaaaaaa758......85gaaaaaaaaaaaaaaaaaaaaaaaaaaaa752......85hiiiiiijjjhghhhjhjjkjjjjjiiiii52......f5lmmmmg777c3fffff8132b77nnpmmmj53......f5lpppmg7BBbcrsssqqqccbffbbmpppl53......85impmmg3ssbbbsssqqqbb7ss37ppmml53......f5lppmp72sBbbbsssqqqbbbBs2gppppj53......85lpppmbbBqbbqsssqqqqcbqBbbmpppj53......f5lpppmkkkckckkkkkkkkckkkkkppppk53.....v3577777777777777777777777nn777775f0....t255555555555555555555555555555555rg....t355555533223222222322233323555555rb....tg555553rrrrrrrrwqqrrrrrrrww355555rb....t7555551wwwwwwwwwx6wwwwwwwwwf55555rb....t755557dwwwwwwwww99wwwwwwwwwd15555f0.....1b555cwwwww7rbwwwwww7f1wwwwq75539w......byb55bw1ncw7fcwwwwwwn87wcn1qg559yf......0b777b111c21177777777771b371n777b0..........................................................................................................................................................................................................................................................................................................................................................................."
182 ]
183 },
184 {
185 "id": "anime-girl",
186 "width": 40,
187 "height": 40,
188 "palette": [
189 "#211f34",
190 "#403952",
191 "#3b354e",
192 "#40616f",
193 "#1e1c2f",
194 "#d2ccdd",
195 "#0c0a0a",
196 "#090706",
197 "#262438",
198 "#5a828b",
199 "#335663",
200 "#a56b74",
201 "#dcbcd9",
202 "#19131c",
203 "#cf7755",
204 "#6f6576",
205 "#dd8869",
206 "#f7d8c5",
207 "#312d40",
208 "#efad88",
209 "#b2664e",
210 "#e79572",
211 "#938a9d",
212 "#c68472",
213 "#581637",
214 "#97282a",
215 "#614861",
216 "#877e90",
217 "#905f7d",
218 "#a49dad",
219 "#711a2c",
220 "#bc908a",
221 "#b24945",
222 "#a33634",
223 "#571b43",
224 "#a29388",
225 "#f1c2a6",
226 "#c17863",
227 "#b1acbb"
228 ],
229 "frames": [
230 "...........................................................................................................................................000000.................................001120000..............................03042221240............................0435042222206..........................42471542424104.........................4121478424422040........................4211107377442044........................4114127999702204........................41444473aaa720207.......................414b4473ca9700447.........7.............446ded07aaa7004476........74.............4fg7h00a9a6044476........74.............0igh60476644744.6........74..............7ghhh421147400..........74..............ghhhh4111077............74...............jhhhe1208k600..........68................lhh7207kmmmm8.........7..................ll700enmm5m4.........76...................78.e655mmm6..666667776.....................6fm5555m0.opppp84764...................qq655555m40ppppo70474..................0f7855555544opppo70677..................007rm55555m7oopp640477...................06r555555mmoopp7404778.................00555555mmmm7opo7404778....6............805mmmm55mmm7opo07407778....6..........2s8r555tm5mim7ou746408678...vn6nnnw.....1188rr55mmmmm7oo7460........e7663nnnm...77nnxxx5mmimm7oo77.0........6nlhhhhggnnnnnnnnnnxmi55m7o746.8....6666hhhhhhhhhhhhhhhhhnnx8t5557o706.8...yyyyyo6ehhhhhhhhhhhhhhhnxr55557o606.76667677766677776ggghhhhhhhn85555mo746..8888888888888888888888888eexmmmm5mo747..sssssssssssssssssssssssss61mmmmmmmo747..66666666666666666666666608555555mm746...11111111111111111112222277rmmmmmmm707...",
231 "..................................................................................................................................................................................0000000................................001122000..............................03042221240...........................20435042222206.........................412471542424104.........................4211478424422047........................4211107377442447........................41141279997022207.......................41444473aaa720147..........7............444n4473ca97004476.........74...........446666d7aaa7044476.........74............4fgh780a9a64744.6.........74.............7gh6h476647400...........77.............7ghhh4211177.............77.............ghhhhh2110k600...........778.............jhhhh8127mmmm8..........468..............lhhh614mmm5m4..........47................llz70em55mmm7...666667776..................787mm5555m7..opppp84764..................4q755555m770ppppo70474..................4f7555555m70opppo70677..................4075555555m4oopp640477...................765555555m7oopp7404778.....6...........0m555555mmmm7opo7404778.....7...........45mmmm555mmm7opo07407778.....7.........1sr555tm55mim7ou746408678...vn7nnnw.....118rr55mmmmmm7oo7460........e7663nn.....77nxxx5mmmmmm7oo77.0........6nlhhhhggnknnnnnnnnxmi55m7o746.8....6666hhhhhhhhhhhhhhhhhnnx8t5557o706.8...yyyyyo6ehhhhhhhhhhhhhhhnxr55557o606.76667677766677776ggghhhhhhhn85555mo746..8888888888888888888888888eexmmmm5mo747..sssssssssssssssssssssssss61mmmmmmmo747..66666666666666666666666608555555mm746...11111111111111111112222277rmmmmmmm707...",
232 ".................................................................................................................................................................................000000.................................01112000...............................03042212240............................0435042212206..........................42471542424104.........................4121478424422047........................4211107377741044........................41141107999712277.......................414441473aaa72147...........7............14444473ca9700447..........74...........446e4447aaa7044477.........74............4f7h440a9a64744.6.........74............01g644476647400...........77.............7ghhh4211477.............77.............ghhhh41110d000...........778.............jhhh01108mmmm8..........468..............lhh7147mmm5m4..........47................lA7007m55mmm7...666667776..................0.7m55555m7..opppp84764.................001055555m770ppppo70474..................077555555m70opppo70677...................7r5555555m4oopp640477..................44r5555555m7oopp7404778......6..........0555555mmmmmoopo7404778......7..........4mmmm555mmmm7opo07407778......7........24r555t55mmim7ou746408678....ze7Bnnw....118rr5mmmmmmm7oo7460.........7663nnnnnkkk7nxxx5mmmmmm7oo77.0........6nlhhhhggnnnnnnnnnnxmi55m7o746.8....6666hhhhhhhhhhhhhhhhhnnx855557o706.8...yyyyyo6ehhhhhhhhhhhhhhhnx555557o606.76667677766677776ggghhhhhhhn85555mo746..8888888888888888888888888eexmmmm5mo747..sssssssssssssssssssssssss61mmmmmmmo747..66666666666666666666666608555555mm746...11111111111111111112222277rmmmmmmm707...",
233 ".................................................................................................................................................................................00000000...............................04111220000.............................034422212206..........................40435042222104..........................424715424242040........................4i21478424422044.......................41211107377742404.......................441141277999720277.......................414444733aa700447.......................444b44473ca704447.......................0066ed44aaa7044476......................40ff6h44d9a647447d........................7qg74476647400...........................7ghh4211477.............................ghhh411107000............................jhh7104kmmmm8............................lh7447emm5m4.............................l70.e7C5mmmr...666667....................7..72m5555m7..opppp8.......................26555555m70ppppo7......................0f7555555m70opppo7......................407m555555m7oopp64.......................045555555m7oopp74......................00555555mmmm7opo74............7.........05mmmm555mmm7opo07............7........2srr555t55mim7ou746..........ze7Bnnw....118rrr5mmmmmm7oo746..........7663nnnnnkkk7nxxxxmmmimm7oo77..........6nlhhhhggnnnnnnnnnnxmi55m7o746......6666hhhhhhhhhhhhhhhhhnnx855557o706.....yyyyyo6ehhhhhhhhhhhhhhhnx555557o606.76667677766677776ggghhhhhhhn85555mo746..8888888888888888888888888eexmmmm5mo747..sssssssssssssssssssssssss61mmmmmmmo747..66666666666666666666666608555555mm746...11111111111111111112222277rmmmmmmm707...",
234 "...........................................................................................................................................0000000................................001122000..............................03042221240............................0435042222206..........................42471542424104.........................4121478424422040........................4211107377442444........................4114127999702104........................41444473aaa720207.......................414b4473ca9700447........................46ded07aaa7044476.......................0fg7h00a9a6044476........................7gh60476644744.6........................7ghhh421147400..........................ghhhh4111077.............................jhhhe1208k600............................lhh7107kmmmm8............................ll700eBmm5m4..............................78.e655mmm6..666667........................6fm5555m0.opppp8.......................qq655555m40ppppo7......................0f7855555504opppo7......................007rm55555m7oopp64.......................07r555555mmoopp74......................00555555mmmm7opo74...........7..........805mmmm55mmm7opo07...........7.........2s0r555tm5mim7ou746..........e7nnnw.....1188rr55mmmmm7oo746.........e766nnnnnnkkk7nnxxx5mmimm7oo77..........6nlhhhhgnnnnnnnnnnnxmi55m7o746......6666hhhhhhhhhhhhhhhhhnnx8t5557o706.....yyyyyo6ehhhhhhhhhhhhhhhnxr55557o606.76667677766677776ggghhhhhhhn85555mo746..8888888888888888888888888eexmmmm5mo747..sssssssssssssssssssssssss61mmmmmmmo747..66666666666666666666666608555555mm746...11111111111111111112222277rmmmmmmm707..."
235 ]
236 },
237 {
238 "id": "handheld",
239 "width": 40,
240 "height": 40,
241 "palette": [
242 "#3a3648",
243 "#2c2836",
244 "#574d67",
245 "#b8b2c9",
246 "#1f1b27",
247 "#18131e",
248 "#9890a8",
249 "#89c271",
250 "#548743",
251 "#68a156",
252 "#437136",
253 "#f7fdf2",
254 "#d5a7a1",
255 "#ce9391",
256 "#af474f",
257 "#dab0a7",
258 "#60934e",
259 "#97cd81"
260 ],
261 "frames": [
262 ".........................................................................................0000000000000000000001.................023333333333333333333314................156666666666666666666654................036444444444444444444624................136400000000000000004625................136404444444444444404625................1364047778777779a9404625................136404977777989999404625................1364049777779b9998404625................136404897798b889b8404625................136404877b98898a99404625................136404a9b998b88baa404625................13640499999b98b99a404625................136404999aaa99999a404625................136404aaaaaaaaaaa8404625................136404444444444444044625................136400000000000000446625................136444444444444444466625................136666666666666666666625................136666666666666666666625................136666666666666666666625................136661466666666666666625................136640046666666666446625................136400004666666664cc4625................136100001666664464cc4625................13644004466664de46446625................13664444666664ee46666625................136664466666664466666625................136666666666666666666625................136666661166116666622625................536666661166116666566425................536666626662666665646625................536666666666666626566225................52666666666666666621225.................5222222222222222222225...................55555555555555555555...........................................................................................",
263 ".........................................................................................0000000000000000000001.................023333333333333333333314................156666666666666666666654................036444444444444444444624................136400000000000000004625................136404444444444444404625................1364047787777779a9404625................136404777777989999404625................1364049777b99b9998404625................13640489779aa989b8404625................136404877b9aaaaa99404625................136404a9b99bba8baa404625................13640499999ba9b99a404625................136404999a9a99999a404625................136404aaaaaaaaaaa8404625................136404444444444444044625................136400000000000000446625................136444444444444444466625................136666666666666666666625................136666666666666666666625................136666666666666666666625................136661466666666666666625................136644446666666666446625................136440044666666664cc4625................136100001666664464cc4625................13640000466664ff46446625................13664004666664ff46666625................136664466666664466666625................136666666666666666666625................136666661166116666622625................536666661166116666566425................536666626662666665646625................536666666666666626566225................52666666666666666621225.................5222222222222222222225...................55555555555555555555...........................................................................................",
264 ".........................................................................................0000000000000000000001.................023333333333333333333314................156666666666666666666654................036444444444444444444624................136400000000000000004625................136404444444444444404625................136404777777799999404625................136404777777999999404625................136404977799a9b999404625................1364049777baaa9b9a404625................13640487799aabaaaa404625................136404777b9abgb8aa404625................13640499b99aab999a404625................13640499999aa9999a404625................136404aaaaaaaaaaa8404625................136404444444444444044625................136400000000000000446625................136444444444444444466625................136666666666666666666625................136666666666666666666625................136666666666666666666625................136661466666666666446625................136644446666666664cc4625................136440044666664464cc4625................13610000166664hh46446625................13640000466664hh46666625................136640046666664466666625................136664466666666666666625................136666666666116666666625................136666661166116666622625................536666661166116666566425................536666626662666665646625................536666666666666626566225................52666666666666666621225.................5222222222222222222225...................55555555555555555555...........................................................................................",
265 ".........................................................................................0000000000000000000001.................023333333333333333333314................156666666666666666666654................036444444444444444444624................136400000000000000004625................136404444444444444404625................136404777777999999404625................13640497777799a999404625................1364049777b999bg8a404625................13640487799a9baaaa404625................136404777b9aaabaaa404625................13640479b9aabbg99a404625................1364049999aaag999a404625................136404a999aaa9999a404625................136404aaaaaaaaaaa8404625................136404444444444444044625................136400000000000000446625................136444444444444444466625................136666666666666666666625................136666666666666666666625................136666666666666666666625................136661466666666666666625................136640046666666666446625................136400004666666664cc4625................136100001666664464cc4625................13644004466664hh46446625................13664444666664hh46666625................136664466666664466666625................136666666666666666666625................136666661166116666622625................536666661166116666566425................536666626662666665646625................536666666666666626566225................52666666666666666621225.................5222222222222222222225...................55555555555555555555...........................................................................................",
266 ".........................................................................................0000000000000000000001.................023333333333333333333314................156666666666666666666654................036444444444444444444624................136400000000000000004625................136404444444444444404625................136404777777799999404625................13640497777799a999404625................13640497779b99aab8404625................1364049777b99baa99404625................13640489799aaaabaa404625................136404777baaaab99a404625................13640499b9aaba999a404625................136404a999aaaaa99a404625................136404aaaaaaaaaaa8404625................136404444444444444044625................136400000000000000446625................136444444444444444466625................136666666666666666666625................136666666666666666666625................136666666666666666666625................136661466666666666666625................136640046666666666446625................136400004666666664cc4625................136100001666664464cc4625................13644004466664hh46446625................13664444666664hh46666625................136664466666664466666625................136666666666666666666625................136666661166116666622625................536666661166116666566425................536666626662666665646625................536666666666666626566225................52666666666666666621225.................5222222222222222222225...................55555555555555555555..........................................................................................."
267 ]
268 },
269 {
270 "id": "shiba-dj",
271 "width": 40,
272 "height": 40,
273 "palette": [
274 "#db963e",
275 "#120c19",
276 "#0d070d",
277 "#a97844",
278 "#0b0614",
279 "#fbeed1",
280 "#cfa16c",
281 "#855520",
282 "#2f2439",
283 "#030101",
284 "#fcfaf9",
285 "#6b636e",
286 "#aca8b0",
287 "#6c4216",
288 "#cc4178",
289 "#443c4d",
290 "#f371e1",
291 "#221623",
292 "#c8c4d2",
293 "#c2b2fd",
294 "#93632f",
295 "#ba8a56",
296 "#393144",
297 "#f41fce",
298 "#fc10dd",
299 "#f1debe",
300 "#c9965b",
301 "#983d89",
302 "#a56c28",
303 "#b39e92",
304 "#e29ee6"
305 ],
306 "frames": [
307 "..........................................................................................011..............110....................20011..........11002...................1000031........2300004..................1055600444444440065504..................4055007000000007005504..................4050200000000000720504..................4007000000000000007004..................4780000000000000000834..................1488888880000888888841..................4912a444488888a4444894..................108a444448208a44444804.................4b28844444400444444484b4................4b20844448555584444804b4................484048888451452888840484................4c40011155544555144004c4................4d40555525555552555504d4.................4405555544444455555044...................446555554ee455555624.....................176555551155555671.......................41665555555566d2........................20773666666777002.11...................4000077777777000002002..................47700655555550000040004................200070555555555770002d04...............4555670555555551000004774...............4657572655555515550004744.............444772f2444555554535507444............44b4444g..4484444446d63544b411.........4b4ffbbf.bbb8fbbhb8cffffffc8bbb1.......4bbhiffcccccf1i8bhbbfbccccc8f44bb4......4bbbfiifffffii8bbhb4b4b444bbjjjjb4.....4bbbbbfbaaaaab8bbbhbbbbbbbbbbbbbbbb1....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....444444444444444444444444444444444444......44444......................44444........44444......................44444....",
308 "..........................................................................................011..............110....................20011..........11002...................1000031........2300004..................1055600444444440065504..................4055007000000007005504..................4050200000000000720504..................4007000000000000007004..................4780000000000000000834..................1488888880000888888841..................4912a444488888a4444894..................108a444448208a44444804.................4b28844444400444444484b4................4b20844448555584444804b4................484048888451452888840484................4c40011155544555144004c4................4d40555525555552555504d4.................4405555544444455555044...................446555554ee4h5555624.....................176555551155555671.......................41665555555566d22.......................20773666666777000.11...................4000077777777000004004..................4k70065555555000004004.................200070555555555770002d04................255670555555551000004774...............455l574655555515550004744.............44466m34444555554535507444............44b4444m444484444446d63544b411.........4b4ffbbfnbob8fbbhb8cffffffc8bbb1.......4bbhiffccooof1i8bhbbfbccccc8f44bb4......4bbbfiifffffii8bbhb4b4b444bbjjjjb4.....4bbbbbfbaaaaab8bbbhbbbbbbbbbbbbbbbb1....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....444444444444444444444444444444444444......44444......................44444........44444......................44444....",
309 "..................................................................................................................................011..............110....................20011..........11002...................1000031........2300004..................1055600444444440065504..................4055007000000007005504..................4050200000000000720504..................4007000000000000007004..................4780000000000000000834..................1488888880000888888841..................4912a444488888a4444894..................108a444448208a44444804.................4b28844444400444444484b4................4b20844448555584444804b4................484048888451452888840484................4c40011155544555144004c4................4d40555525555552555504d4.................4405555544114455555044...................44655555pppp55555624.....................1765555555555556k1.......................44665555555566dd211....................477773666666377000402..................25557077777777q00004004................455557055555555577000204................4q5q54055555555100000474................445l54455555551555000444..............4444mf2444455555453550744.............44b44nm4444484444446d63544b411.........4b4ffbnrfbbb8fbbhb8cffffffc8bbb1.......4bbhi..cncccf1i8bhbbfbccccc8f44bb4......4bbbfiifffffii8bbhb4b4b444bbjjjjb4.....4bbbbbfbaaaaab8bbbhbbbbbbbbbbbbbbbb1....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....444444444444444444444444444444444444......44444......................44444........44444......................44444....",
310 "....................................................................................................................................1..............11.....................04001..........11000....................200031........230002...................1055600444444440065504..................1055007000000007005504..................4050200000000000720504..................4007000000000000007004..................4000000000000000000834..................4788880000000088888844..................148888888000088a444844..................4912a444488888a4444894.................4b08a444448208a4444480b4................4b08844444400444444480b4................480084444855558444480084................4c404888h5544555h88404c4................4d40055555544555555004d4.................4405555255445525555044...................44655554455445555624.....................1765555555555556k1.......................44665555555566dd2111...................4007736666663770004004.................20s70077777777q00004004................455557055555555577000274................455557055555555100000474................465l54455555551555000444..............4444mm7444455555453550744.............44b44fm4444484444446d63544b411.........4b4ffnmffbbb8fbbhb8cffffffc8bbb1.......4bbhigncccccf1i8bhbbfbccccc8f44bb4......4bbbfiifffffii8bbhb4b4b444bbjjjjb4.....4bbbbbfbaaaaab8bbbhbbbbbbbbbbbbbbbb1....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....444444444444444444444444444444444444......44444......................44444........44444......................44444....",
311 "..................................................................................................................................011..............110....................20011..........11002...................1000031........2300004..................1055600444444440065504..................4055007000000007005504..................4050200000000000720504..................4007000000000000007004..................4780000000000000000834..................1488888880000888888841..................4912a444488888a4444894..................108a444448208a44444804.................4b28844444400444444484b4................4b20844448555584444804b4................484048888451452888840484................4c40011155544555144004c4................4d40555555545555555504d4.................44055555445t4455555044...................44655555555555555624.....................1765555555555556k1.......................44665555555566dd2111...................4007736666663770004004..................4770077777777q00004004.................25557055555555577000274................455557055555555100000474................465l54455555551555000444..............4444mm7444455555453550744.............44b44fm4444484444446d63544b411.........4b4ffnfffbbb8fbbhb8cffffffc8bbb1.......4bbhinunocccf1i8bhbbfbccccc8f44bb4......4bbbfiifffffii8bbhb4b4b444bbjjjjb4.....4bbbbbfbaaaaab8bbbhbbbbbbbbbbbbbbbb1....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....4hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh4....444444444444444444444444444444444444......44444......................44444........44444......................44444...."
312 ]
313 },
314 {
315 "id": "boombox",
316 "width": 40,
317 "height": 40,
318 "palette": [
319 "#160f38",
320 "#0a072d",
321 "#0a0528",
322 "#0b0934",
323 "#14042f",
324 "#1e1a44",
325 "#36396a",
326 "#60739b",
327 "#7f93b8",
328 "#010012",
329 "#070018",
330 "#070918",
331 "#0f022a",
332 "#090223",
333 "#140424",
334 "#2b0a39",
335 "#200833",
336 "#29062f",
337 "#1c042b",
338 "#92318d",
339 "#893086",
340 "#210c41",
341 "#1a0635",
342 "#5f78f1",
343 "#0d041d",
344 "#6f7dc8",
345 "#4f4cb7",
346 "#666fc1",
347 "#8a3eb0",
348 "#150b23",
349 "#8a674e",
350 "#120e41",
351 "#150c0b",
352 "#6393f3",
353 "#3e3bc5",
354 "#d128be",
355 "#201354",
356 "#6b2479",
357 "#e68b25",
358 "#bf5295",
359 "#d37358",
360 "#b331a6",
361 "#da46ab",
362 "#c379a5",
363 "#9e66b0",
364 "#db708c",
365 "#050306",
366 "#2e2064",
367 "#595eb4",
368 "#461a59",
369 "#698862",
370 "#c18729",
371 "#db5279",
372 "#948535",
373 "#806cbd",
374 "#a9297d",
375 "#c13224",
376 "#5c36a9",
377 "#dc9315",
378 "#e32ec0",
379 "#715bb8",
380 "#6a5ec1",
381 "#bd29b8",
382 "#9c30b0",
383 "#d036b1",
384 "#9f27a2",
385 "#51579e",
386 "#654fb6",
387 "#f8684f",
388 "#854db5",
389 "#592168",
390 "#342977",
391 "#46469c",
392 "#31a846",
393 "#28a249",
394 "#7c90d1",
395 "#3b367d",
396 "#3e3687",
397 "#f0960a",
398 "#f97f29",
399 "#a5211d",
400 "#ec2abe",
401 "#ad1e2c",
402 "#995369",
403 "#4240a2",
404 "#753ab7",
405 "#ef745e",
406 "#d36518",
407 "#4c2e9c"
408 ],
409 "frames": [
410 "......................................................................................................................................................................................................................................................01221111111222212221111111213..........4152666666667897a8b66666666225..........c022222222d122221222222212ddd5..........c0..........................a5..........e0..........................d5........ffe2gfhhhhfhhihigihhhhhhfhhgfgc2ff.....djjkjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjj0....dllmmmmmjjjjjjjjjjjjjjjjjjjjj4mmmlmm....dmf9daa4d1111111111111111111jcadadlm....d4fnocngcppqqqpr1111pppsppq1jtuvwol4....2ilqxnyg21313333111131333111kltn0bf4....2ilxt0p0cjjjjjjjkkkkjjjjjjj3k0ztp2f4....djllAAAlB4c23m422dddcc4cc214kAAAAojm....2jckkkkjkkjjjj4e4wwcebjjjjkkkkkkkikm....ekcfk33333jjjjmCDEFC.ojjjj3333vgkAl4....ejk338161pckjjiGHxIGJKjjk363133pLkkg....ojk3M11111vpNjiOPxQRS9jj3M111111qAjg....oj3M11111110vjmICsTns9j3q11111112dkg....djv211111111vj4Uznxnqaj3111111111pmi....cjv3112v1111pN4UCCFsEKjL3111M1111Mmi....cjv111vM3111pf33111112jA1111Mq111Mmi....cj3611131111dj4ottoobaj3q11111111p4m....cj3q1111111qNj3zwtUUK9jj3v111111qajg....djk3p11111q3jj34112122jj3qv1111MpNjm....djBk33Mrqq3jjjjjjjjjjjjjj33q3MV03Bk4....dBMgjj22djjjjjjjjjjjjjjjjjjcdcdkk3am....djmkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjm.....gigeeeeoeoeoeoeoeoeeeeeeeoeeeeeege...................................................................................................................................................................................................................................................",
411 "......................................................................................................................................................................................................................................................01221111111222212221111111213..........4152666666667897a8b66666666225..........c022222222d122221222222212ddd5..........c0..........................a5..........e0..........................d5........ffe2gfhhhhfhhihigihhhhhhfhhgfgc2ff.....djjkjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjj0....dllmmmmmjjjjjjjjjjjjjjjjjjjjj4mmmlmm....dmf9daa4d1111111111111111111jcadadlm....d4fnocngcppqqqpr1111pppsppq1jtCvCol4....2ilqxnyg21313333111131333111kltn0bf4....2ilxt0W0cjjjjjjjkkkkjjjjjjj3k0ztp2f4....djllAAAlB4c23m422dddcc4cc214kAAAAojm....2jckkkkjkkjjjj4e4eweeojjjjkkkkkkkikm....ekcfk33333jjjjmCCXYZ!ojjjj33333kkAl4....ejk33rpppM3kjjiCXxnZ#ajjk3MpppZ33kkg....ojk3r11111r3jji.xx$x%9jj3M21111r33jg....oj3M&11111MM3jmCx(Cxs9j3qp111111Z3kg....dj3p1111111p3j4C$C)Zqaj3p1111111p3mi....cj3p1111111p3N4CCC*Z.9j3p1111111p3mi....cj3p1111111p3f33111112j3p1111111p3mi....cj3r1111111Z3j4ottoobaj3M1111111p34m....cj3LZ11111qv+j3zwtUUK9jj3r11111Z,3jg....djk3-r111qA3jj34112122jj3vp111M-3kjm....djBk33rrq33jjjjjjjjjjjjjj33rrrv33Bk4....dBMgjj22djjjjjjjjjjjjjjjjjjcdd1kk3am....djmkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjm.....gigeeeeoeoeoeoeoeoeeeeeeeoeeeeeege...................................................................................................................................................................................................................................................",
412 "......................................................................................................................................................................................................................................................01221111111222212221111111213..........4152666666667897a8b66666666225..........c022222222d122221222222212ddd5..........c0..........................a5..........e0..........................d5........ffe2gfhhhhfhhihigihhhhhhfhhgfgc2ff.....djjkjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjj0....dllmmmmmjjjjjjjjjjjjjjjjjjjjj4mmmlmm....dmf9daa4d1111111111111111111jcadadlm....d4fnocngcqqqqqpr1111sppsppq1jt/v:ol4....2iltxntg21313333111131333111kltn0bf4....2ilCt0:0cjjjjjjjkkkkjjjjjjj3k0zts2f4....djllAAAlB4c23m422dddcc4cc214kAAAAojm....2jckkkkjkkjjjj4e4eweeojjjjkkkkkkkikm....ekcfk33333jjjjmCC$YZ!ojjjj33333kkAl4....ejk33-ppp-3kjjiCXxxZ#ajjk3Mppp-33kkg....ojk3-1111p-3jji.nXCxC9jj3Mp1111-33jg....oj3Mp11111p-3jm$nCCxCKj3qp11111p-3kg....dj3p1111111p3j4C*xxZs9j3p1111111p3mi....cj3p111M111p3N4C.Y*Z.9j3p111M111p3mi....cj3p1111111p3f33111112j3p1111111p3mi....cj3-p11111p-3j4ottoobaj3-p11111p-34m....cj33q11111qv+j3zwtUUK9jj3-11111Mv3jg....djk33q;;;-33jj34112122jj33-pppqv3kjm....djBk33<<=33jjjjjjjjjjjjjj33===v33Bk4....dBMgjj22djjjjjjjjjjjjjjjjjjcd11kk3am....djmkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjm.....gigeeeeoeoeoeoeoeoeeeeeeeoeeeeeege...................................................................................................................................................................................................................................................",
413 "......................................................................................................................................................................................................................................................01221111111222212221111111213..........4152666666667897a8b66666666225..........c022222222d122221222222212ddd5..........c0..........................a5..........e0..........................d5........ffe2gfhhhhfhhihigihhhhhhfhhgfgc2ff.....djjkjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjj0....dllmmmmmjjjjjjjjjjjjjjjjjjjjj4mmmlmm....dmf9daa4d1111111111111111111jcadadlm....d4fCocCgcqqqqqpr1111sppsppq1jt/v:ol4....2ilt>>tg21313333111131333111kltn0bf4....2ilWt0:0cjjjjjjjkkkkjjjjjjj3k0zts2f4....djllAAAlB4c23m422dddcc4cc214kAAAAojm....2jckkkkjkkjjjj4e4ewdebjjjjkkkkkkkikm....ekcfk33333jjjjmzZ.?C@ojjjj3q3v3kkAl4....ejk3qqr31qqkjjisZxx[]9jjkMq35&qq3kkg....ojk3q11111v3jjisxXx8^9jj3311111_33jg....ojdM2111111q3jm{x|CCCaj1q1111111Zdkg....djp&1111111&pj4{Zxx[CKj3r1111111Mdmi....cjp0111M1111pN4.#Z?CCKjp0111p1111pmi....cjpL11,M311Lpf33111112jp611Aq1116pmi....cj1M1111111q1j4ottoobaj3q1111111M34m....cj3311111113+j3zw}UzK9jj3311111133jg....djk3qq111qq3jj34112122jj3qq111Mq3kjm....djBk333r333jjjjjjjjjjjjjj33=Mv~33Bk4....dBMgjj22djjjjjjjjjjjjjjjjjjcdd1kk3am....djmkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjm.....gigeeeeoeoeoeoeoeoeeeeeeeoeeeeeege...................................................................................................................................................................................................................................................",
414 "......................................................................................................................................................................................................................................................01221111111222212221111111213..........4152666666667897a8b66666666225..........c022222222d122221222222212ddd5..........c0..........................a5..........e0..........................d5........ffe2gfhhhhfhhihigihhhhhhfhhgfgc2ff.....djjkjjjjjjjjjjjjjjjjjjjjjjjjjkjjjjj0....dllmmmmmjjjjjjjjjjjjjjjjjjjjj4mmmlmm....dmf9daa4d1111111111111111111jcadadlm....d4fCocCgcqqqqqpr1111sppsppq1jtxvXol4....2ilt//tg21313333111131333111klt.0bf4....2ilxt0:0cjjjjjjjkkkkjjjjjjj3k0ztC2f4....djllAAAlB4c23m422dddcc4cc214kAAAAojm....2jckkkkjkkjjjj4e4eddebjjjjkkkkkkkikm....ekcfd32M(13jjjm!rZ$CCKjjjj3q3qv0kAl4....ejk,q11111q0jji*rxx.C9jjk;L1131q,kkg....ojk-1111111M3jiCxCxx.9jj3M111111q3jg....ojd1111111113jmCx##xzaj1q11111112dkg....djp111111111pj4sCS*.CKj3111111111dmi....cjp1111M1111pN4zCCXCCKjp1111p1111Mmi....cjp111AM3111pf33111112jp111Arq111Mmi....cj2111111111rj4ottoobaj3111111111q4m....cjrv1111111qdj3zwCUzK9jjq1111111_ajg....dj1q<11111qdjj34112122jj3q11111MMmjm....djB33q331q3jjjjjjjjjjjjjj333Mv1q3Bk4....dBMgj22jdjjjjjjjjjjjjjjjjjjcdd1kk3am....djmkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkjm.....gigeeeeoeoeoeoeoeoeeeeeeeoeeeeeege..................................................................................................................................................................................................................................................."
415 ]
416 },
417 {
418 "id": "rainy-window",
419 "width": 40,
420 "height": 40,
421 "palette": [
422 "#250e2f",
423 "#3d0f52",
424 "#340945",
425 "#39559f",
426 "#353348",
427 "#3a58a6",
428 "#31375e",
429 "#36114e",
430 "#481658",
431 "#8c9ecb",
432 "#77a4e1",
433 "#702433",
434 "#324888",
435 "#5f2234",
436 "#3f1f28",
437 "#3d5373",
438 "#131c21",
439 "#360f26",
440 "#332657",
441 "#87b9ee",
442 "#5177ca",
443 "#973e5f",
444 "#c95960",
445 "#a8d8f9",
446 "#313f7c",
447 "#5a234c",
448 "#c76d62",
449 "#792552",
450 "#683023",
451 "#85442a",
452 "#f2c585",
453 "#fffcf8",
454 "#de9f68",
455 "#6078a6",
456 "#8f579f",
457 "#5b823d",
458 "#22372c",
459 "#33623d",
460 "#dac002",
461 "#aaa122",
462 "#271c1e",
463 "#c48e63"
464 ],
465 "frames": [
466 "0000120000000000000000000000000000210000000012003334443333300333333533360027000000001200335333333330035555555556002800000000120033333333333003353955555600280000000010003333355a3330039535955556002800000000120033335333336003533555555600b100000000120033339333336005555555555600b2000000007200333335c5cc3003555555555600b700000000720033335555553b05555595355600b700000000820000000000000000000000000000b700000000820000bbbbbbbbbbb2000000000000b200000000820deffffffffffd04444444444g00b700000000820hi3333333333d03333333333600b700000000820bi3333333333d03333339393600b700000000820bi333a533333d03333355333600b200000000820bi3333333333d03333353333600b700000000820bi3a33333333d03jjjj5333k600b70000000082hli3333333333b03aaakccccc600b7000000008lhmi335a333333b03aankcoccc600b7000000008lhm4nnknnnn333b03aankciocc600b700000000plhq6kkkkkkk553b03aaakc6ooo6b0b700000000plhq6kkkkkkkaaab0aakkkccooc6b0b700000000rlsqttknnnkk333b05555kcc5666b0b700000000rluvuwknnnkk33ob0ooookc55c36b0b700000000bluuvuxknnkk3oob0yyyckzg3A3600b100000000bquvuuukkkkkoood0yccckBzggcg0A0100000000lmuuuutkkkkkooob0ccccCAABAgAA00100000000rttttttkkkkkooob0yyyc4DggAAgAA0100000000rmwEEkkkkkkkooob0yyyfCBBgAAAgA0100000000rmme0ooooookooob0ccyocggeeAEE00100000000rmlEoooooookooob0ccyok3sseEEE02100000000rmle6ooooookooob0ccyoc3FsEEE0021000000008mleFqqmrlbbbbbb0000000tsEEE002100000000pmqpeq00000002000000000EsEEE00210000000drmAEEEmqpqqqqqqqqqqlllllspE78111700000077777777777777777777777777777777770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
467 "00001200000000000000000000000000002100000000120033344433333003333333333600270000000012003353333333300355555555560028000000001200333333335330033535555556002800000000100033553335333003353955555600280000000012003333355a333003953595555600b10000000012003933533333x003533555555600b2000000007200335c9555533003555555555600b700000000720033555555553b05555555355600b700000000820000000000000000000000000000b700000000820000bbbbbbbbbbb2000000000000b200000000820deffffffffffd04444444444g00b700000000820hi3333333333d03333333333600b700000000820bi3333333333d03333333333600b700000000820bi3333333333d03333359393600b200000000820bi333a533333d03333355333600b700000000820bi3333333333d03jjjj53333600b70000000082hli3a33333333b03aaakccccc600b7000000008lhmi3355333333b03aankcoccc600b7000000008lhm4nnknnnn333b03aankciocc600b700000000plhq6kkkkkkk553b03aaakc6ooo6b0b700000000plhq6kkkkkkkaaab0aakkkccooc6b0b700000000rlsqttknnnkk333b05555kcc5666b0b700000000rlvvvvknnnkk33ob0ooookc55c36b0b700000000blvvuvxknnkk3oob0yyyckzg3A3600b100000000bmvvvvkkkkkkoood0yccckBzggcg0A0100000000lmvvvvkkkkkkooob0ccccCAABAgAA00100000000rttttttkkkkkooob0yyyc4DggAAgAA0100000000rmwEEkkkkkkkooob0yyyfCBBgAAAgA0100000000rmwe0ooooookooob0ccyocggeeAEE00100000000rmlEoooooookooob0ccyok3sseEEE02100000000rmle6ooooookooob0ccyoc3FsEEE0021000000008mleFqqmrlbbbbbb0000000tsEEE002100000000pmqpeq00000002000000000EsEEE00210000000drmAEEEmqpqqqqqqqqqqlllllspE78111700000077777777777777777777777777777777770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
468 "000012000000000000000000000000000021000000001200333444443330033333333336002800000000120033533a33333003555555555600280000000012003333333333300333555555560028000000001000335533335330033535555556002800000000120033333335333003353995555600b10000000012003933355a333003953555555600b2000000007200335c55cccc6003555555555600b700000000720033339555553b05555555355600b700000000820000000000000000000000000000b70000000082000bbbbbbbbbbbb2000000000000b200000000820deffffffffffd04444444444g00b700000000820hi3333333333d03333333333600b700000000820bi3333333333d03333333333600b700000000820bi3333333333d03333355333600b200000000820bi3333333333d03333359393600b700000000820bi333a533333d03jjjj53333600b7000000008lhli3333333333b03aaakcc333600b7000000008lhmi3a55333333b03aankcoccc600b700000000plhm4nnknnnn333b03aankciocc600b700000000plhq6kkkkkkk553b03aaakc6ooo6b0b700000000rlhq6kkkkkkkaaab0aakkkccooc6b0b700000000rlvvvvknnnkk333b05555kcc5666b0b700000000rvvvvvvnnnkk33ob0ooookc55c36b0b700000000bvvvvvvknnkk3oob0yyyckzg3A3600b100000000bvvvvvvkkkkkoood0ycyckBzggcg0A0100000000lvvvvvvkkkkkooob0ccccCAABAgAA00100000000rmtttttkkkkkooob0yyyc4DggAAgAA0100000000rmwEEkkkkkkkooob0yyyDCBBgAAAgA0100000000rmwe0ooooookooob0ccyocggeeAEE00100000000rmlEoooooookooob0ccyok3sseEEE02100000000rmle6ooooookooob0ccyoc3FsEEE002100000000rmleFqqmrlbbbbbb0000000tsEEE002100000000pmqpeq00000002000000000EsEEE00210000000drmAEEEmqqqqqqqqqqqqlllllspE78111700000077777777777777777777777777777777770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
469 "000012000000000000000000000000000021000000001200333334443330033333n5n3360028000000001200335555333330035555555556002800000000120033333333333003333555555600280000000010003333333353300333555555560028000000001200335933335330033535555556002800000000120033333335333003353995555600b1000000007200393355cac33003955555555600b200000000720033335555556005555555355600b700000000820000000000000000000000000000b700000000820000bbbbbbbbbbb2000000000000b2000000008200effffffffffd04444444444g00b700000000820di3333n3j333d0333a333333600b700000000820hi3333333333d03333333333600b700000000820bi3333333333d03333355333600b200000000820bi3333333333d03333355333600b700000000820bi3333333333d03jjja59393600b700000000820li333a333333d03aaakcc333600b700000000820li3355333333b03aajkcoc33600b7000000008lhm4jjkjjjj333b03aajkciocc600b7000000008lhq6kkkkkkk553b03aaakc6ooo600b700000000plhq6kkkkkkkaaab0aakkkccooc6b0b700000000plsqttkjjjkk333b05555kcc5666b0b700000000rluuvukajjkk33ob0ooookc55c36b0b700000000rlvvuvtkjjkk3oob0yyyckBg3A3600b100000000bluvvvxkkkkkoood0ycyckBBggcg0A0100000000bmuvvukkkkkkooob0ccccDAABAgAA00100000000lttttttkkkkkooob0yyyc4DggAAgAA0100000000rmwEEkkkkkkkooob0yyyDDBBgAAAgA0100000000rmwe0ooooookooob0ccyocggeeAEE00100000000rmlEoooooookooob0ccyok3eeeEEE02100000000rmle6ooooookooob0ccyoc3FsEEE0021000000008mleFqqmrlbbbbbb0000000tsEEE002100000000pmqpeq00000002000000000EsEEE002100000000rmAEEEmqpqqqqqqqqqlllllpspE78111700000077777777777777777777777777777777770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
470 "000012000000000000000000000000000021000000001200333334444430033333353336002800000000120033555533333003555595955600280000000012003333333333300333333555560028000000001000333335555330033335555556002800000000120033333355533003335555555600280000000012003339333353300335359555560028000000007200393355ccc33003555955555600b10000000072003333555a556005955555355600b200000000820000000000000000000000000000b700000000820000bbbbbbbbbb02000000000000b2000000008200effffffffffd04444444444g00b700000000820di3333333333d03333333333600b700000000820hi3333j3j333d03n3n333333600b700000000820hi3333333333d03333355333600b200000000820bi3333333333d03333353333600b700000000820bi3333333333d03jjja53333600b700000000820li3333333333d03aaakcxcx3600b700000000820li335a333333d03aajkcoccc600b7000000008lhm4jjkjjaj333b03aajkciocc600b7000000008lhq6kkkkkkk553b03aaakc6ooo600b700000000plhq6kkkkkkkkkab0aakkkccooc6b0b700000000plsqttkkkkkk333b05555kcc5666b0b700000000rluuvukkkkkk33ob0ooookc55c3600b700000000rluvuuxkkkkk3oob0cccckBg3A3600b100000000bluuvuukkkkkooob0cccckBBggcg0A0100000000bmuuuutkkkkkooob0ccccDAABAgAA00100000000lttttttkkkkkooob0cccc4DggAAgAA0100000000rmwEEkkkkkkkooob0cccDDBBgAAAgA0100000000rmwe0ooooookooob0cccocggeeAEE00100000000rmlEoooooookooob0cccok3eeeEEE021000000008mle6ooooookooob0cccoc3FsEEE0021000000008mleFqqmrlbbbbbb0000000tsEEE002100000000pmqpeq00000002000000000EsEEE002100000000rmAEEEmqpqqqqqqqqqlllllpspE78111700000077777777777777777777777777777777770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
471 ]
472 },
473 {
474 "id": "penguin",
475 "width": 40,
476 "height": 40,
477 "palette": [
478 "#141021",
479 "#1d172f",
480 "#6b687d",
481 "#36314a",
482 "#fcf0e7",
483 "#bab7c6",
484 "#eca90d",
485 "#933606",
486 "#da4f9d",
487 "#d74194",
488 "#413d55",
489 "#4b475c",
490 "#a29fae",
491 "#f9b019",
492 "#b14f07",
493 "#dc980b",
494 "#545065",
495 "#f4e6d4",
496 "#c23b53",
497 "#93909f",
498 "#e68c04",
499 "#d77d0e"
500 ],
501 "frames": [
502 "...........................................................................................................................................................................................................................0000..........11..............1.......12233300.......1140.............1......1223333300......1.1............1.1.....122333333300...111..............11......333333330000...11...............41.....03423333440000...................1......04443334444110.................111......14043334044110.................11......154006740044100.........................148446674488400.........................188866677488400...0000..................1584767774885000000330.................00055477744440013333300...............003300555555550011333000...............033330055555555111111100..............3333300024444455551111110..............1223310034444444455511000...............01111100444444444455110..................00000024444444444555100......................044444444445555110......................044444444445555110......................044444444445555110......................044444444445555100......................024444444455551100.......................1544444455555110........................0554444555551100.......................0005555555550000.......................1667725555551077770......................06677000000077670....................22220070222222070072222...............222222220222222220222222222...................222222222222222....................................................................................................................................",
503 "...................................................................................................................................................................................0000..................................12233300...............................1223333300.............................122333333300....111.....................333333330000....141............1.......03423333440000...11.............11......04443334444110..01..............41......14043334044110..................11.....154006740044100..................1......148446674488400.........................198866677488400.........................158476777488500........................0005547774444000000..................0033300555555550011333000..............032333005555555511113333310............0321010024444445551111133300...........02331000a44444444555111111100...........0211000044444444445511100000.............0100..b4444444444555110.................00...044444444445555110......................044444444445555110......................044444444445555110......................044444444445555100......................0c4444444455551100.......................0544444455555110........................0554444555551100.........................15555555550000.........................0d025555530000..........................066700000076670........................066670....076666........................00000.....076600...................................000..............................................................................................................................................................................",
504 "..........................................................................................................................................000...................................1223300................................122333300..............................12233333300.............................333333330000...........................0342333344000.....1.............11......04443334444100....11...........111......14043334044110....14............41.....154006740044100.....1............1......148466674488400.........................188866677488400....................110..058476777488500...................02230000554777444400....................0233333005555555500000..................000333300555555550113300.................0000000355445555111333300.................000004444444555111333330.................000544444444555111133300..................04444444444551111100000.................b4444444444555110000010................044444444445555110..000.................044444444445555110......................044444444445555110......................044444444445555100......................054444444455551100.......................0544444455555110........................0555445555550000.........................02555555550000...........................002555526670............................0770000e6660...........................20770222606f022.....................22222000222200000222222...............222222222222222222222222222...................222222222222222....................................................................................................................................",
505 "..................................................................................................000...................................1223300........................11......122333300.....111.............1111.....12233333300....1111............0411.....333333330300......01............1......0333333330000.......1...................0g423334440000.....01...................b4443344444110.....h...................144046744044110.....0...................199066670094400.....11.............110..19944667i498400......1............0223..059446674488500...................02330000544774444400....................0233333005444455500100..................00033330055555555011330..................00001003554455551113330...................0000a44444445511113330...................0004444444455511113300...................0j44444444455511113300..................04444444444455511100000.................04444444444455511000010.................044444444445555110.000..................044444444445555110..0...................0c4444444445555100.......................05444444455551100.......................0554444455555110........................0255545555550100.........................0g555555536000...........................00225552d6k..............................070000k0060.............................0771..f0000...........................222002220222222.....................22222220222222222222222...............222222222222222222222222222...................222222222222222....................................................................................................................................",
506 "..................................................................................................................................................................................0000........1.........................12233300......11.......................1223333300.....11.............111......122333333300.....11.............41......333333330000......11............11.....03423333440000.....141..................04443334444110......01..................14043334044110.........................154006740044100.........................148466674488400....................110..198876677488400...................022300059447774488500...................02333300554444444400000.................000333300555555550031330.................000033005555555501133330..................00000554445555111133300..................0000444444455511111330....................054444444455511111300...................044444444445511111330...................044444444445551101300...................044444444455551000000...................044444444455551110......................044444444455551100......................054444444455551100......................05544444455551110........................0554444555551100.........................05555555500000...........................055555500000.............................0000006670...........................22207022l666722.....................22222222022260007222222...............222222222222220222222222222...................222222222222222...................................................................................................................................."
507 ]
508 },
509 {
510 "id": "doge",
511 "width": 40,
512 "height": 40,
513 "palette": [
514 "#201b16",
515 "#e0a44a",
516 "#dfa6a0",
517 "#99622b",
518 "#51504e",
519 "#f7eccc",
520 "#c0af86",
521 "#865024",
522 "#c58637",
523 "#bd7e28",
524 "#d1933e"
525 ],
526 "frames": [
527 "..........................................................................................................................................................................000..............000...................01110............01110..................010110..........011010..................0220110000000000110220.................012223104444444401322210................012220330000000033022210................032220003111111300022230................032300111111111111003230................032001111111111111100230................030011111111111111110030................030111111111111111111030................000111115111111511111000...............04031111555111155511113040..............00011130015111151003111040.............0400111044051111504401110440............0400510500031111300050150040............0401551055015555105501551040............0001555100550440550015551000............0001555555550000555555551000.............00355555555500555555555300...............036555550550055055555630.................0655555500550055555560..................0365555555555555555630...................03655555555555555630...................0133665555555555663310..................0111336666666666331110.................001111156666666651111100................011111155555555551111110...............03111115555555555551111130..............01111155555555555555111110..............01111155555555555555111110.............0311115555555555555555111130............0111115555555555555555111110..............................................................................................................................",
528 ".........................................................................................................................................................................0000..............0000..................01110............01110..................0101100000000000011010.................012201104444444401102210................012220330000000033022210................032220003111111300022230................032300111111111111003230................032001111111111111100230................030011111111111111110030................030111111111111111111030................000111111111111111111000...............04031111111111111111113040..............00011111115111151111111040.............0400111111151111511111110440............0400510000031111300000150040............0401551055015555105501551040............0001555100550440550015551000............0001555555550000555555551000.............00355555555500555555555300...............036555550550055055555630.................0655555500550055555560..................0365555555555555555630...................03655555555555555630....................03366555555555566330...................0111336666666666331110..................0111115666666665111110.................001111155555555551111100................011111555555555555111110...............03111115555555555551111130..............01111155555555555555111110..............01111155555555555555111110.............0311115555555555555555111130............0111115555555555555555111110..............................................................................................................................",
529 "..................................................................................................................................000..............000...................01110............01110.................011011000000000000110110................012201104444444401102210................032220330000000033022230................032220003111111300022230................032300111111111111003230................032001111111111111100230................030011111111111111110030................030111111111111111111030................000111115111111511111000...............04031111555111155511113040..............00011130015111151003111040.............0400111055051111505501110440............0400510500031111300050150040............0401551055015555105501551040............0001555100550440550015551000............0001555555550000555555551000.............00355555555500555555555300...............036555550550055055555630.................0655555500550055555560..................0365555555555555555630...................03655555555555555630.....................3366555555555566330....................011336666666666331100..................0311115666666665111110.................011111155555555551111110................011111555555555555111110................011111555555555555111110...............03111115555555555551111130..............01111155555555555555111110..............01111155555555555555111110.............0311115555555555555555111130............0111115555555555555555111110..............................................................................................................................",
530 ".................................................................................................................................0000..............0000..................01110............01110..................010110..........011010..................0220110000000000110220.................012223104444444401722210................012220330000000033022210................032220003111111300022230................032300111111111111003230................032001111111111111100230................030011111111111111110030................030111115111111511111030................000111155511115551111000...............04031130015111151003113040..............00011105505111150550111040.............0400510500031111300050150440............0400551055015555105501550040............0401555100550440550015551040............0001555555550000555555551000............0001555555555005555555551000.............00355555505500550555555300...............036555555005500555555630.................0655555555555555555560..................0365555555555555555630...................03655555555555555630....................83366555555555566339...................0111336666666666331110..................0111115666666665111110.................0a1111155555555551111110................011111555555555555111110...............03111115555555555551111130..............01111155555555555555111110..............01111155555555555555111110.............0311115555555555555555111130............0111115555555555555555111110..............................................................................................................................",
531 ".........................................................................................................................................................................0000..............0000..................01110............01110.................0110110..........0110110................012201100000000001102210................032223330000000033322230................032220003111111300022230................032300111111111111003230................032001111111111111100230................030011111111111111110030................030111111111111111111030................000111115111111511111000...............04031111555111155511113040..............00011130015111151003111040.............0400111055051111505501110440............0400510500031111300050150040............0401551055015555105501551040............0001555100550440550015551000............0001555555550000555555551000.............00355555555500555555555300...............036555550550055055555630.................0655555500550055555560..................0365555555555555555630...................03655555555555555630....................03366555555555566330...................0111336666666666331110..................0111115666666665111110.................001111155555555551111100................011111555555555555111110...............03111155555555555555111130..............01111155555555555555111110..............01111555555555555555511110.............0311115555555555555555111130............0111115555555555555555111110.............................................................................................................................."
532 ]
533 },
534 {
535 "id": "pop-cat",
536 "width": 40,
537 "height": 40,
538 "palette": [
539 "#14110e",
540 "#100d0a",
541 "#f39e39",
542 "#f69328",
543 "#fdaaa5",
544 "#fefdfb",
545 "#1a1513",
546 "#96322f",
547 "#dc4c4c",
548 "#959594",
549 "#464342",
550 "#dcdbdb"
551 ],
552 "frames": [
553 "...............................................................................................................................010....................000.............022200................002230............0402221..............0222040............04402220..00000000..12220440............0444122211222222221122204440............0444412222222222222222144440............0444122222222222222222204440............0440222222222552222222220440.............04222222222555522222222240..............02222222222555522222222220..............12222000225555552200022221.............0222200500555555550050022220.........0..0222200500555555551050022220..0.......00222222066555577555506022222200.........022222225555555555555522222221........0000022255550555105550555522200000.......02222555555500111100555555522220......002000555555550188881055555555000200......10795555555550444415555555559700.......0..0995555555550000555555555990..0..........09955555555555555555555990...............009955555555555555559910.600........011110177555555555555559700.0550.......0557770777795555555555977770025550......0557717722255555555555522277022250.......050177222225555555555222227022220........1.07722222555555555522222702220...........17722222255555555222222771220...........0772222225555555522222277021............077222222955555592222227706..............177222229955559922222770................177722229999999922227770.................1177772111111112777711...................0000000......0000000..................................................................................................................................",
554 ".......................................................................................010...................0000.............022200................022230............0402221..............0222040............04402220..00000000..12220440............0444122211222222221122204440............0444412222222222222222144440............0444122222222222222222204440............0440222222222552222222220440............044222222222555522222222240..............02222222222555522222222220..............12222000225555552200022220.............0222200500555555550050022220............0222200500555555551050022220.........0002222220665555775555060222222000........022222225555555555555522222220.........11002225555055510555055552220016.......0022225555515111111115055555222200.......20005555555111111111155555550002......001079555555511118811115555555970066........0995555555114444115555555990.........1...09955555551444415555555990...0...........119955555500005555559910............101...177555555555555559700.100.........05511077779555555555597777015550........15537072225555555555552227005555a........03217222255555555555522227022250.........0217222225555555555222227022220..........17722222555555555522222771220...........17722222255555555222222771220...........0772222225555555522222277021............077222222955555592222227706..............177222229955559922222770.................1772222999999992222771...................17777211111111277771....................0000000......0000000..................................................................................................................................",
555 "........................................................................................010..................020...............022200..............002230..............0402220............0222040..............0440220..00000000..0220440.............0444402211222222221122044440............0444402222222222222222044440............0444122222222552222222204440.............04022222222555522222222040..............04222222222555522222222240..............02222000225555552200022220..............12220050055555555005002220.............0222200500555555551050022220............0222220665555775555060222220..........00222222255555555555555222222200......00.022222555505551055505555222220.00......11002255550511111111505555220016........02222555551511111111505555522220.......0200055555551111111111555555500020.......10795555555111111111155555559700.......10.0995555551118888111555555990.00.......0..09955555511444411555555990..0............019955555144441555559910..................17755555000055555970...............000.077779b555555555977770..010.........05510722255555555555522270.65550........05217222255555555555522221025550........02217222225555555555222227022255........02177222225555555555222227022220........02177222222555555552222227712220.........107722222255555555222222771220............172222229555555922222271120.............17722222995555992222277000...............0722222999999992222770...................07777211111111277771....................0000000......0000000..................................................................................................................................",
556 "...............................................................................................................................010....................000.............022200................002230............0402221..............0222040............04402220..00000000..12220440............0444122211222222221122204440............0444412222222222222222144440............0444122222222222222222204440............0440222222222552222222220440.............04222222222555522222222240..............02222222222555522222222220..............12222000225555552200022221.............0222200500555555550050022220.........0..0222200500555555551050022220..0.......00222222066555577555506022222200.........122222225555555555555522222221........0010022255550555115550555522200100.......12222555555511188111555555522221......002100555555555188881555555555000200......11795555555555111155555555559700.......0..1995555555555115555555555990..0.........119955555555555555555555991............111119955555555555555559911.000.........55511177555555555555559700.1550.........55370777795555555555977770025551........02217722255555555555522277023350.........1177222225555555555222227022220..........17722222555555555522222702220...........17722222255555555222222771220...........0772222225555555522222277121............077222222955555592222227706..............177222229955559922222770................177222229999999922227770.................1177777111111117777711...................0000000......000000...................................................................................................................................",
557 ".......................................................................................................................................................................10......................00.............122000................000320...........030022200..00000000..102220020..........044402222112222222211222204440..........044440222222222222222222044440...........0444102222222222222222104440............0441222222222222222222220440............0402222222222552222222222040............0422222222225555222222222240.............12222222222555522222222221.............0222220002255555522000222220..........1.0222200500555555550050022220.0........00222220050055555555105002222200.......0.122222206655557755550602222221.0......0002222222555555555555552222222100.......02002225555505511550555552220020......002222255555555118811555555552222200.....0000055555555551881555555555510000.........0.555555555504405555555555.0.............19555555555044655555555591...............119955555556655555559911100........055011117755555555555555970005550.......055577077779555555555597777005550........157717722255555555555522277022220.......117177222225555555555222227022220.........117722222555555555522222702220...........17722222255555555222222771220...........0772222225555555522222277121............077222222955555592222227706..............177222229955559922222770................177722229999999922227770.................1171011111111111111711...................0000............000..................................................................................................................................."
558 ]
559 }
560]
561types/index.d.ts 26 lines1export type Track = { url: string; title?: string }
2
3export type PlayerStatus = 'stopped' | 'loading' | 'playing' | 'paused' | 'error'
4
5export type Player = {
6 status: PlayerStatus
7 index: number
8 title: string
9 // Seconds; -1 while unknown (a live stream has no duration).
10 position: number
11 duration: number
12 message?: string
13}
14
15declare module 'claude-code' {
16 interface PluginState {
17 'pixel-player': {
18 player: Player
19 playlist: Track[]
20 skin: string
21 frame: number
22 volume: number
23 }
24 }
25}
26