commit b5c43a96638be1c62840a9536385670e2533972f Author: oddbyte Date: Sun Jan 18 13:22:41 2026 -0500 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3761dbd --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +private/ +*/private/ +package-lock.json diff --git a/blog/articles/ageverification.html b/blog/articles/ageverification.html new file mode 100644 index 0000000..a80511a --- /dev/null +++ b/blog/articles/ageverification.html @@ -0,0 +1,20 @@ +

These Laws Will Make Your Government ID Public

+

+ Imagine if every website had a bouncer that demanded your ID, took a photo of it, and stored it in an online database that could be hacked at any moment. Unfortunately, this is now the reality for half of the United States. Half of the states in the US now require you to hand over your government ID or scan your face to access sites containing anything deemed "sexual content" (this sometimes includes things that are not explicitly sexual, such as health information for LGBTQ+ people and similar topics, usually labeled as content that is "harmful to minors"). A handful of states also require you to hand over such identification when signing up for social media websites. While these laws are aimed at protecting children, they end up endangering them by stripping them of their digital anonymity and creating treasure troves of their personal information for hackers to access.
+

+ Your government ID is a "keys to the kingdom" asset for hackers to have access to. With access to your government ID they can contact companies and request they change your password, sign up for online accounts as you, and even ruin your credit score. By requiring everyone online to upload their valid government identification to a multitude of for-profit companies, these laws are putting this critical information at high risk of being hacked, breached, or otherwise exposed.
+

+ Age verification may sound simple and easy to enforce: if the person is viewing a pornography website, ask for proof that they are indeed overage before allowing them to continue. However, these laws have dangerous consequences unforeseen by legislators, such as deanonymizing the internet, allowing hackers to access sensitive government identification for millions of people, and even worse, putting the very children the laws are supposed to protect at risk via data breaches.
+

+

+ On top of the security risks, these laws have seen some reputable VPN companies receiving a 1400% spike in signups, showing that the laws are likely not even effective on any child that has the technical know-how to install a VPN app off of the app store (which is something that many children are already doing anyway in order to avoid school internet blocks).
+

+

+ Some proponents of age verification laws say that it could solve the dead internet theory, however even they admit these laws are problematic, stating "I want to make something very clear: Online age and ID verification has a number of problems. Very, very real problems that every single person is right to be concerned about. What verification data will be collected and stored (and how)? What additional security concerns are created because of ID verification? Will the burden of that verification be too much for some sites to handle? How will those verification systems be abused by corporations and governments? And those are just off the top of my head." (A quote from Brian Lunduke of the Lunduke Journal). An issue with this argument is that adding ID verification will not stop bots. The bots will just pretend to sign up from a jurisdiction without age verification, or just leverage the troves of stolen IDs publicly available online for anyone to access.
+

+

+ Another issue with age verification is how some states include content that they deem "harmful to minors" as something that needs verification. This includes health information for LGBTQ+ people. This is really dangerous because it risks the outing of LGBTQ+ individuals to a community or family where such people may not be welcomed. This could end up in the queer person being kicked out of the community, and in extreme cases even physically harmed.
+

+

+ In conclusion, you should keep yourself safe. If you find yourself in a jurisdiction where age verification is mandated, you should use a VPN or other privacy solution (such as the Tor network) to avoid sending off your personal information. You should also contact your local representatives, and ask them to not allow these laws to ever go through and advocate for laws that actually protect the individuals they target. If you want to have a bigger impact, volunteer for the Electronic Frontier Foundation.
+

\ No newline at end of file diff --git a/blog/testingtopic/verykewlblog.html b/blog/testingtopic/verykewlblog.html new file mode 100644 index 0000000..c4c0089 --- /dev/null +++ b/blog/testingtopic/verykewlblog.html @@ -0,0 +1 @@ +

hallo!!!

\ No newline at end of file diff --git a/blog/testingtopic2/otherkewlblog.html b/blog/testingtopic2/otherkewlblog.html new file mode 100644 index 0000000..157cc52 --- /dev/null +++ b/blog/testingtopic2/otherkewlblog.html @@ -0,0 +1 @@ +

hihi!!!

\ No newline at end of file diff --git a/index.js b/index.js new file mode 100755 index 0000000..e23636b --- /dev/null +++ b/index.js @@ -0,0 +1,651 @@ +// Import all the things +const axios = require('axios'); +const express = require('express'); +const fs = require('node:fs'); +const path = require('node:path'); +const readline = require('node:readline/promises'); +const http = require('node:http'); + +// yes, it is `new new require('ytmusic-api')`, i didnt fuck up +// this is literally black magic i have no idea how or why it works +const ytmusic = new new require('ytmusic-api'); // i love me a new new + +// Create interface for console +const rl = readline.createInterface({input:process.stdin, output:process.stdout}); + +// Global constants + +/** + * Should always be `/prod/portfolio`, dynamically caching it in case i decide to move it to a different path sometime in the future + */ +const baseDir = process.cwd(); + +/** + * The ID for my favorite moosic playlist :D + */ +const playlistId = 'PLnlTMS4cxfx3-et_L8APzpEgy_eCf18-U'; + +/** + * Port that nginx proxies to public + */ +const port = 48915; + +// Helper functions I've made to do things and stuff :P + +/** + * Loops a thing every hour + * @param {Function} something + * @param {Boolean} skipFirst + * @returns jack shit +*/ +// I know, I know, I am just the most bestest and awesomest coder everrrrr +const loopHourly = (something, skipFirst = false) => { + // If skipFirst is false, we do the thing immediately + if (!skipFirst) setTimeout(() => { + let cancel = false; + something(); + if (!cancel) loopHourly(something); + return; + }, 3600000 - new Date().getTime() % 3600000); // 3600000 ms = 1000 ms (one second) * 60 seconds (one minute) * 60 minutes (one hour) + + // If skipFirst is true, wait a hour then execute + else setTimeout(() => { + loopHourly(something) + }, 3600000 - new Date().getTime() % 3600000); +} + +function sendSource(req, res, filePath) { + try { + // This will throw an error, which I catch, if the file isnt found + // Use lstatSync to have a sync read while also not going through symlinks (to prevent arbritrary reads via symlinks) + // Further restricted by my use of the --permission commandline flag + // I also added a manual check to block any file reads outside the base dir (/prod/portfolio as of the time of writing this) + const stat = fs.lstatSync(filePath); + + if (!stat.isFile()) { + // If it's not a file, error + res.status(403).send('
Not a file
'); + } else { + // If it's a file, send the content + const fileContent = fs.readFileSync(filePath, 'utf8'); + res.render('sourceviewer', { faviconb64, filePath, fileContent }); + } + } catch (err) { + // Legit why are you doing this + // If it's whitelisted, it's listed under the index page + // If it's not whitelisted, you cant access it anyway :P + res.status(404).send('File not found'); + } +} + +// -------------------------------------------------------------------------------------- +// - Below is black magic. I have no idea how it works. - +// - I have either stolen it from somewhere or completely forgotten how it works. - +// - If you know how it works please explain it to me PLEASE I BEG OF YOU HALP :AAAAAA: - +// -------------------------------------------------------------------------------------- + +/** + * Pulls all the pictures for the songs and stores them in a base64 key:value array where the key is the song id and the value is the thumbnail + * @param {*} song + */ +const populateThumbnails = (async song => { + let id = song.videoId; + let thumbnail; + + const response = await axios.get(song.thumbnails[song.thumbnails.length - 1].url, { responseType: 'arraybuffer' }); + + // We now check if Youtube moosic has yelled back a thing we want to hear + if (response.status == 200) { + thumbnail = Buffer.from(response.data, "utf-8").toString('base64'); + thumbnails.push({ id, thumbnail }); + } else { + console.error("Failed to pull thumbnail: " + response); + } +}); + +// Updates the list of songs by yelling at youtube moosic to gimme the playlist +async function updateSongs() { + + // Yell at youtube moosic to get a list of songs + playlistSongs = await ytmusic.getPlaylistVideos(playlistId); + + if (typeof playlistSongs == 'object') { + // For each song that youtube moosic has yelled back at us, give them individually to populateThumbnails() + await Promise.all(playlistSongs.map(async song => await populateThumbnails(song))); + } + else { + // like legit this shouldnt even be possible + console.log("somehow i have managed to get this code into an area i thought impossible"); + console.log("*various anxiousness noises*"); + console.log("help"); + throw TypeError('playlistSongs is not a object!'); // this should never ever happen, if it does that is very very bad + } +} + +/** + * @param {Array} pathPattern This thingy is the indexPaths below this function + * @returns {Array} an array called `results` + */ +function getDirectoryContents(pathPattern) { + const results = []; + + // Handle wildcards (including multiple wildcards like blog/*/*) + if (pathPattern.includes('*')) { + const segments = pathPattern.split('/').filter(s => s); + + /** + * Recursively resolves the pattern segments against the file system. + * @param {Array} remainingSegments - The parts of the path left to match (e.g., ['*']). + * @param {String} currentAbsPath - The absolute path on disk we are currently checking. + * @returns {Array} - Array of matched file/directory objects. + */ + function traverse(remainingSegments, currentAbsPath) { + // Base case: We have matched all segments. Return the node at this location. + if (remainingSegments.length === 0) { + return [createNode(currentAbsPath)]; + } + + const segment = remainingSegments[0]; + const rest = remainingSegments.slice(1); + + if (segment === '*') { + // Wildcard: Read current directory and recurse for all children + try { + const files = fs.readdirSync(currentAbsPath, { withFileTypes: true }); + const matches = []; + + files.forEach(file => { + const fullPath = path.join(currentAbsPath, file.name); + // Recurse with the remaining segments + const childMatches = traverse(rest, fullPath); + matches.push(...childMatches); + }); + + return matches; + } catch (err) { + console.error(`Error reading directory ${currentAbsPath}:`, err); + return []; + } + } else { + // Exact segment: Join path and recurse + const fullPath = path.join(currentAbsPath, segment); + return traverse(rest, fullPath); + } + } + + /** + * Creates the result object for a specific path. + * If it's a directory, it recursively fetches children. + */ + function createNode(fullPath) { + try { + const stat = fs.statSync(fullPath); + const relativePath = path.relative(baseDir, fullPath); + + if (stat.isDirectory()) { + // Recursively get children using the main function + // We append '/*' to get the immediate contents of this directory + const children = getDirectoryContents(`${relativePath}/*`); + return { + name: path.basename(fullPath), + path: relativePath, + type: 'directory', + children: children + }; + } else { + return { + name: path.basename(fullPath), + path: relativePath, + type: 'file' + }; + } + } catch (err) { + console.error(`Error reading path ${fullPath}:`, err); + return null; + } + } + + // Start traversal from the base directory + const nodes = traverse(segments, baseDir); + // Filter out any null results from errors + nodes.forEach(node => { + if (node) results.push(node); + }); + + } else { + // Handle exact paths + + // Thanks past me, for the extremely helpful comment above + // I now understand exactly what this does /s + + const fullPath = path.join(baseDir, pathPattern); + try { + const stat = fs.statSync(fullPath); + const relativePath = path.relative(baseDir, fullPath); + + if (stat.isDirectory()) { + const files = fs.readdirSync(fullPath, { withFileTypes: true }); + files.forEach(file => { + const childPath = path.join(fullPath, file.name); + const childRelativePath = path.relative(baseDir, childPath); + + if (file.isDirectory()) { + const children = getDirectoryContents(`${childRelativePath}/*`); + results.push({ + name: file.name, + path: childRelativePath, + type: 'directory', + children: children + }); + } else { + results.push({ + name: file.name, + path: childRelativePath, + type: 'file' + }); + } + }); + } else { + results.push({ + name: path.basename(fullPath), + path: relativePath, + type: 'file' + }); + } + } catch (err) { + console.error(`Error reading path ${fullPath}:`, err); + } + } + + return results; +} + +/** + * An array of the whitelisted directories and their contents + */ +let whitelistedFiles = []; + +/** + * Whitelisted paths for the source code (to prevent arbritrary reads and stuffs), + * Also referred to as `pathPattern` in whatever the hell `getDirectoryContents()` is + */ +const indexPaths = [ + 'blog/*', + 'blog/*/*', + 'public/*', + 'public/piskelfile/*', + 'views/*', + 'views/partials/*', + 'index.js' +]; + +/** + * directory tree object (built in the func buildDirectoryTree below) + */ +let directoryTree; + +/** + * sorted result + */ +let sortedResult; + +// Build directory tree +const buildDirectoryTree = (items) => { + const tree = {}; + items.forEach(item => { + const parts = item.path.split(path.sep).filter(part => part !== ''); + let currentLevel = tree; + for (let i = 0; i < parts.length; i++) { + const part = parts[i]; + if (!currentLevel[part]) { + currentLevel[part] = { + name: part, + path: parts.slice(0, i + 1).join(path.sep), + type: i === parts.length - 1 ? item.type : 'directory', + children: {} + }; + } + currentLevel = currentLevel[part].children; + } + if (item.type === 'file') { + currentLevel[parts[parts.length - 1]] = { + ...currentLevel[parts[parts.length - 1]], + type: 'file' + }; + } + }); + return tree; +}; + +// Convert the tree to an array for easier rendering +const treeToArray = (node) => { + const result = []; + Object.values(node).forEach(item => { + if (item.type === 'directory') { + const directoryItem = { + name: item.name, + path: item.path, + type: 'directory', + children: treeToArray(item.children) + }; + result.push(directoryItem); + } else { + result.push({ + name: item.name, + path: item.path, + type: 'file' + }); + } + }); + return result.sort((a, b) => { + if (a.type === 'directory' && b.type === 'file') return -1; + if (a.type === 'file' && b.type === 'directory') return 1; + return a.name.localeCompare(b.name); + }); +}; + +async function updateFileIndex() { + // Clear whitelisted files to prevent memory leak + whitelistedFiles = []; + + indexPaths.forEach(path => { + let contents = getDirectoryContents(path); + whitelistedFiles.push(...contents); + }); + + directoryTree = buildDirectoryTree(whitelistedFiles); + sortedResult = treeToArray(directoryTree); +} + +// ---------------------------------------------------------- +// - End black magic - +// - I am pretty sure I know what is going on below here :p - +// ---------------------------------------------------------- + +var blog; // Setup the blog variable + +// Blog stuffs + +async function generateBlogIndex() { + var blogfolder = fs.readdirSync(path.join(baseDir, 'blog/')); + var tmpobj = {}; + blogfolder.forEach(thing => { + if (fs.statSync(path.join(baseDir, `blog/${thing}`)).isDirectory()) { + var files = fs.readdirSync(path.join(baseDir, `blog/${thing}`)); + tmpobj[thing] = {}; + files.forEach(file => { + tmpobj[thing][file] = true; + }); + } + }); + blog = tmpobj; +} + +async function send404(req, res) { + // TODO: actual 404 page + res.status(404).send("

404 Not found

"); +} + +// Begin the server-ing things +const app = express(); +var server; // Set at app.listen (bottom), used to kill server on ctrl-c + +// YT Music stuff +/** + * An object that stores a Map of songs (also objects) + */ +let playlistSongs = new Map; +/** + * Key:Value array of songs. The song ID is the key, and a base64 encoded image is the value + */ +let thumbnails = []; + +// Other middlewares +app.set('view engine', 'ejs'); +app.use(express.static('public')); +app.use(express.static('private')); +app.use(express.urlencoded({ extended: true })); +app.use((req, res, next) => { + res.setHeader("Content-Security-Policy","default-src 'self' 'unsafe-inline'; script-src-elem 'self' 'unsafe-inline'; img-src 'self' data:; frame-src 'self';"); + next(); +}); + +// Cache the favicon cause I'm probably not gonna change that for a while +const favicon = fs.readFileSync('public/favicon.ico'); +// Also cache a base64 version of it to pass to my pages +const faviconb64 = favicon.toString('base64'); + +// --------------------- +// - Routes begin here - +// --------------------- + +// Sends the cached favicon.ico to prevent an unneeded read on a static file :P +app.get('/favicon.ico', (req, res) => { + res.status(200).send(favicon); +}); + +// Home page +app.get('/', (req, res) => { + res.render('home', { faviconb64 }); +}); + +// Fun Fact page +app.get('/funfact', (req, res) => { + res.render('funfact', { }); +}); + +// The page with all my art :> +app.get('/art', (req, res) => { + res.render('art', { faviconb64 }); +}); + +// Source code page +app.get('/source', (req, res) => { + res.render('source', { faviconb64, paths: sortedResult }); +}); + +// Route to serve indexed files +app.get(/^\/source\/.*/, (req, res) => { + const requestedPath = req.path.split('/source/')[1]; + + // Check if the requested file is whitelisted + const isIndexed = indexPaths.some(pattern => { + if (pattern.toString().includes("*")) { + return whitelistedFiles.some(pattern => { return requestedPath.startsWith(pattern.path) && !(requestedPath.split(pattern.path).some(pattern => {return pattern.includes("/");}));}); + } + return requestedPath === pattern; + }); + + if (!isIndexed) { + return res.status(403).send('
File not whitelisted
'); + } + + const filePath = path.join(baseDir, requestedPath); + + // Completely prevent ../ attacks (hopefully) + // Well I mean it wont prevent bind mounts but if you can bind mount I'm fucked anyways cause you're root + // Symlinks might (?) bypass this?? + // Hardlinks defo bypass this afaik. + // because i pass the --permission flag and only pass --allow-fs-read=/prod/portfolio/* + // you can't write via NJS at all + // nor read outside /prod/portfolio + // you'd need to break outta nodejs and start a native process + // and my filesystem permissions wont letchu write stuff anyway + if (!filePath.startsWith(baseDir)) { + return res.status(403).send('
File not whitelisted
'); + } + + sendSource(req, res, filePath); +}); + +// Moosic page +app.get('/music', (req, res) => { + res.render('moosic', { faviconb64, playlistId, playlistSongs, thumbnails }); +}); + +// Blog +app.get('/blog', (req, res) => { + if (req.query && req.query.sample == "1") { + res.render('blog', { faviconb64, type: "sample", page: null, blog }); + } + else res.render('blog', { faviconb64, type: "main", page: null, blog }); +}); + +// Individual blog pages / topic pages +app.get(/^\/blog\/.*/, (req, res) => { + let requestedTopic = req.path.split('/blog/')[1].split('/')[0]; + let requestedPage = req.path.split('/blog/')[1].split('/')[1]; + let topic = blog[requestedTopic]; + let page; + if (typeof topic != "object") { + send404(req, res); + return; + } + if (topic[requestedPage] == true) { + page = fs.readFileSync(path.join(baseDir, 'blog', requestedTopic, requestedPage)); + res.render('blog', { faviconb64, type: "individual", page, blog }) + } else send404(req, res); +}); + +app.get('/editor', (req, res) => { + res.render('editor', { faviconb64 }) +}); + +// Error handling (must be 2nd to last last app.use to make sure it catches all the errorings) +app.use(function(err, req, res, next) { + if(!err) { + next(); + return; + } + console.error('-------------------------------ERROR---------------------------------------\n'); + console.error(err); // Log da errors + console.error('-----------------------------USER-INFO-------------------------------------\n'); + console.error("Body:\n"); + console.error(req.body); + console.error("\n"); + console.error("Cookies:\n"); + console.error(req.cookies); + console.error("\n"); + console.error("Host:\n"); + console.error(req.host); + console.error("\n"); + console.error("Path:\n"); + console.error(req.path); + console.error("\n"); + console.error('----------------------------------------------------------------------------\n'); + res.status(400).send("
An internal server error has occurred. Please bother me if you see this.
Contact me at @oddbyte.11 on Signal, or contact@oddbyte.dev if you are a caveman and are stuck in the last decade.
"); // Give the user something that they can read +}); + +// 404 +app.use(function(req, res) { + send404(req, res); +}); + +function printHelp() { + rl.write("\n\n-------------------------------HELP-----------------------------------------\n"); + rl.write("> help [?] - prints this message\n"); + rl.write("> updateMusic [um] - runs updateSongs()\n"); + rl.write("> updateFileIndex [ufi] - runs updateFileIndex()\n"); + rl.write("> eval [exec] - runs raw JS code, returns output (if any)\n"); + rl.write("> quit [exit] - stops the server, and quits\n"); + rl.write("-------------------------------HELP-----------------------------------------\n\n") +} + +function quit() { + server.close(); + rl.write('\n\nI do declare - end broadcast\n\n'); // Yoinked Lunduke Journal's signoff :> + rl.close(); + process.exit(0); +} + +async function customConsole() { + while (1) { + // Pull commands + const cmd_raw = await rl.question("> "); + const cmd_raw_args = cmd_raw.split(" "); + const cmd_args = cmd_raw_args.slice(1); + const cmd = cmd_raw_args[0]; + + switch(cmd) { + case "?": + case "help": + printHelp(); + break; + case "um": + case "updateMusic": + updateSongs(); + break; + case "ufi": + case "updateFileIndex": + updateFileIndex(); + break; + case "exec": + case "eval": + // TODO: Fix this not actually using the correct context for whatever reason it just evals in an empty context + // ...... i dont know what or how or why but magically it is working now so i am just not gonna touch it and hope + // whatever black magic made it work keeps working .-. + try { + rl.write(eval(cmd_args.toString()) + "\n"); + } catch (err) { + console.error(err); + } + break; + case "quit": + case "exit": + quit(); + return; + case "": + break; + default: + rl.write(`Command not found: ${cmd}`) + printHelp(); + break; + } + } +} + +// Wrap in a async function to wait for youtube music response before starting http server +// (to prevent a race condition where people can view the moosic page be4 it is ready) +async function main() { + + // Init the moosics stuff (black magic) + await ytmusic.initialize(); + + // Populate playlistSongs and thumbnails + await updateSongs(); + + // Populate the blog index + await generateBlogIndex(); + + // Populate file index + await updateFileIndex(); + + server = http.createServer(app); + + await (async () => { + server.listen(port, () => { + console.log(`Listening to ${port}`); + + // Start hourly loop to update playlist + loopHourly(async () => await updateSongs()); + + // Start hourly loop to update file index + loopHourly(async () => await updateFileIndex()); + }); + })(); + + // Start console + customConsole(); +} + +// Handle a few signals + +rl.on('SIGINT', () => { + quit(); +}); + +rl.on('SIGTERM', () => { + quit(); +}); + +main(); diff --git a/package.json b/package.json new file mode 100755 index 0000000..8b6adce --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "portfolio", + "version": "1.2.6", + "main": "index.js", + "author": "oddbyte", + "type": "commonjs", + "license": "fuck you it's mine", + "dependencies": { + "axios": "^1.10.0", + "ejs": "^3.1.10", + "express": "^5.1.0", + "sqlite3": "^5.1.7", + "ytmusic-api": "^5.3.0" + } +} diff --git a/public/-.-.png b/public/-.-.png new file mode 100644 index 0000000..e2c0075 Binary files /dev/null and b/public/-.-.png differ diff --git a/public/00.png b/public/00.png new file mode 100644 index 0000000..1f4d0b0 Binary files /dev/null and b/public/00.png differ diff --git a/public/><.png b/public/><.png new file mode 100644 index 0000000..7cbe347 Binary files /dev/null and b/public/><.png differ diff --git a/public/DIE.png b/public/DIE.png new file mode 100644 index 0000000..9480e56 Binary files /dev/null and b/public/DIE.png differ diff --git a/public/Dotdotdot.png b/public/Dotdotdot.png new file mode 100644 index 0000000..27d12bb Binary files /dev/null and b/public/Dotdotdot.png differ diff --git a/public/^^.png b/public/^^.png new file mode 100644 index 0000000..0d5469c Binary files /dev/null and b/public/^^.png differ diff --git a/public/activated.png b/public/activated.png new file mode 100644 index 0000000..86da50f Binary files /dev/null and b/public/activated.png differ diff --git a/public/angy.png b/public/angy.png new file mode 100644 index 0000000..71ff562 Binary files /dev/null and b/public/angy.png differ diff --git a/public/base_full.png b/public/base_full.png new file mode 100644 index 0000000..beda8df Binary files /dev/null and b/public/base_full.png differ diff --git a/public/blank.png b/public/blank.png new file mode 100644 index 0000000..f8fc06d Binary files /dev/null and b/public/blank.png differ diff --git a/public/blank_full.png b/public/blank_full.png new file mode 100644 index 0000000..f448ad2 Binary files /dev/null and b/public/blank_full.png differ diff --git a/public/dotDotdot.png b/public/dotDotdot.png new file mode 100644 index 0000000..9a0db43 Binary files /dev/null and b/public/dotDotdot.png differ diff --git a/public/dotdotDot.png b/public/dotdotDot.png new file mode 100644 index 0000000..9fa2a9e Binary files /dev/null and b/public/dotdotDot.png differ diff --git a/public/dotdotdot.png b/public/dotdotdot.png new file mode 100644 index 0000000..52913f7 Binary files /dev/null and b/public/dotdotdot.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..fef5237 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/hihi.png b/public/hihi.png new file mode 100644 index 0000000..ed93e62 Binary files /dev/null and b/public/hihi.png differ diff --git a/public/loading.gif b/public/loading.gif new file mode 100644 index 0000000..32b12d4 Binary files /dev/null and b/public/loading.gif differ diff --git a/public/piskelfile/-.-.piskel b/public/piskelfile/-.-.piskel new file mode 100644 index 0000000..9e1a5b7 --- /dev/null +++ b/public/piskelfile/-.-.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"-.-","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAE8ElEQVRYR+1XTW9bRRS9M+NmgYRKxA4JcKFKbLqBrkEtqu0skFhCNkhsEEK05Yd0Byl71AW0y3xVcexWwJ6q/wSSFRjPcM6Zec92khcXgVQh8er0fXjeveeee+69Y2fP+XDP2b/9D+C/woBPZtHM44OTC2bTROz8i+bwDAvy4bEo4kE+lga4dEGxkuggAEHEvyS7eOLLOQFRmuqpw6po038HAGJJjGV/d9eSc5bg0EecyQbpYOhkBE8IquKk0+1o/eU3LhuW00pjoEsY8CA62u7uPsKHE/KAD2ybSwBA+nE/ZWoIkGDwXbf7loVJsNfX21hPcMrXmUfDF46k2s7+Xg6Sxl2mONExvUbEzEVTxi8+tI6AqQMuWVtft1YI1m63lS2+chJFAwAPN9F29vZg2CGjVBnDpGM4UW4QPawmWK31Ri+iIQPqrnfNt4JdAgC+D/0sBSCu9h4+zMpGGBGOMtkKF9e8U+r1PwHSbGYgqUp0AGUE/R6g1jodcxNnb3Yu0Sh5rIEsIPLeIzBEvr1t7gLDrIPOkUsASmv2QVME5pEeriVE2C7qKDXj7cqVbtbE2mtVuZ4NIMs5v57reRYlXcUifMQ1hwCpEJBclTkjLFiWIkpS2gkgBPf4lNXnAcBrEJN8E0Qh28PylMblbfZcSoQToStrK0DSgmTDxCEAscMibkgBGWDh9TcGiuhweKCw/hhftICz8xOga5mBzkzC7whqBU4IABKj+lvejl65Yy04v9j+XNXz8UeboujB/QcSaZbpjMTqmiGr5fb7PTgLNjwAAAb80yoMwbmEWKmspKG+z5Lk0+P2HVsBmBde/UxVsrm5qTb1w/3vBbw0TdleLAuIkJH0+30A8AUAaBm/ZGllDkCVijno9SVDIFvwtPLur6qQ3qAHr8FGIwSU50YDA551l6zXGyj9h6NDRZDGLyP4ibnrRwsu488v6t6/d3z6OXX8/rGFGOxG74Y8HjweZv3EWT842RigAGcDpCDhavjoULJOj1dtGtADgC8UZ1M6LyOBpxU857kCldCfw/Xf5LgPBhyAHIyG6gso9SYN5DJVClAJQ74Aq9NHqxYvsIDqMUtlnMpgTQOHQ4AiCtgBRM3yHA+HS/oANOCggd5GXwyMRqMswvEqsjbB0EEHoF9KvG7BxW1ABaAYVBBATbn6a8dqWv3BAAxEpHS0BID6WbINaIBzYwjRUNV//ogqgFH2EpGn+taUy1MZEdOpahxUU8sci/7akdYMehuwPEUKEFDuouenwAXOfbZV9jxv332ILQbnbOYDzjlYsIYhZxlaxKXDAOE+QE0b9f7pTtWSApob9c1GS/YaNMA2z1eqwSOoMHjvA0xE5hTRRdJQnHIlKXegX9uwMqmrED/ZrlWhslS71tJmEc7eEE8kel54HMmEB0DSQGm/8713tjsQz3mc/+0NScHhQLZaJ0gFhZk+qAP2lEr0eGYmkf+FAZU1UHWd+ZwvRHjeFycXFtrl9+Y7Xys1eQJy7iM98Hf3yW0wQ8aaI/6HAGAZM+JLAJhNRDBCMBDm1pMvTm04zg5kXhvLVsx/77gzjXbr6paeamOi4lAt2tYvt/OW7Bl+D1RmT7bic+FoKwgZ33z7m7oN17sAaGPrKQAIWfM2/FlTMPe7J8ej2mdzwOerq3fLT4/Fdvzt01vqB1pUtw12kjw0ztqU/gUQeSM/QpQaOgAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/00.piskel b/public/piskelfile/00.piskel new file mode 100644 index 0000000..dff7dbf --- /dev/null +++ b/public/piskelfile/00.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"blank","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAErUlEQVRYR+1WwW4cRRCt7t4TWMoX4GwgOOvkgnJEAaSwuz4gcY2FhDhFUeSE/AlCYOCMkAjhGDuOPF5ixco95E84WFxQd+e9qp7dnVnPLlEOERJt2Z7ume569epVVTt5w8O9YfvyP4D/CAPOZ8lJ5RL4x3tMkySPZ/uj7+hNxjvBuzJWOrjyg3JwzmrcjEX887CRPLanLD4ESTEqAIefJFmBRsO0dCz9AHbU7/39fXEuCImgQYIxlzl3gJVhlKaxAb+XB5fBRJaL717ka57SaWcFQp8dXN17eGDGcTypcNjls5nlPIOJeu4AanNwRUIMsr5xARjJR341APAFhun5I3GkGtszHtQZBeB4qL6wuJeQkAV+p+a8bFy6JD2Ep9/vS8BazIsh6UBGf+D5o8fmNUWmVopRjQ0M1TGqJUgrFCAZwtrmxhXxPScXAIArkO2CvfaCYnx8cGBhc1HP42F8QSheZyY0CrKIzeTJUGBfQtgC0KUIRgB6YzAQ94+T9wYICc/Js5A0AJTsQsz3xAG5EmlOF7pNfoRB4yY6QPDIADDkEe+ouQJ4iAPjnzDb3BxISD3pv78+le/CQ2FxJnHmM4fmNJVOD8GDMkwTZcxpw9NrzRuD5vkfoiRIaoOeGHMdDBSWdaN+AhC+FJyM9KO47Hzzlo8e6ZkQKitIFmnLFxt1mQp4iGApwIkYuwCo1JwMt8bqQ1VVekI6eXt2Yu35kv9/nf9WekBwrn8L8Y5y44ttrUq/Pfi9eDDLhqYIS3aNRkM46Q0A8/zZWsOcel68XJA1Xpy+8430sH9t/Sa9le3tbQZBfn1wX6MD8qbbmvs9Agaqx6OR0l8dHqrheQDu2ukUjK7DoPuwtVbLg99Co1ufDrES5HByaOroBGDZLtfBAGN7VE1AQJwCYFz9x6eST9aEQGpg7hM8P22uEYPDt0zT4fWxauLouJLMRjJXD1oMovTi0yFDgKfq+EjLV5uBCM/DPIDyTFB8V/JHQdLlMRhwPmhIHYpVirOC1ALA7pJlhBA4FJXqqNKux0PrQa/qHFwVgt61v8FfkjFEjcjKMQBAi0rO9LymmOk3GNgaQb1OnkwmaiudvLW6r56RFb2PwAhMjUZbKKpR/pg80SSdb06LpRgHjYdjJrhlgYoQaVjjnvbiMyy2ljxDg3iMhwCAdKzgkGZVNwNWPxgn7T9ggfH8+XOUWFQhlQ/aIfsBhRzUFxQkWilNCJu1nrFtfrWn8PHLSoh9WGPrTqlTA3UBo3aJ064Zv3zmJAaWUqv7jcEpypxdSXSLpSa2f/mwfKm5Z2faja0bQONsXjO0FXPUdz0cQB8Tb0Z1P7bSr54qwHJPrOM7T3k7cAuFrInALqN6vrpXiMGENGsz1rjEac1nCJDsBoY9wjTTaWc5gBZca0Eidz74TkWqxNhFQ0388PxrhICz7ivYqzGwAAB8oKAogOlgy2WxCPLTi9usW0s9fi0AuBlrSHau7to5vC1RVKX27T7fKZR334JfCwADz9viztXv7V6gNbd0fMx3X9w1kcxdudoG/y2AZrkBy7ya2UXDyT0woMmolZvpZRr48U8A0CRgytbQmJPgiFe7M8T4EtobDz9I153gAAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/><.piskel b/public/piskelfile/><.piskel new file mode 100644 index 0000000..7203512 --- /dev/null +++ b/public/piskelfile/><.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"blank","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEtUlEQVRYR+1XTW8cRRCt7tkTRPAHUGxMcNaxhFC4Gi7ej0MkzuaCuICEHOCfIKRY5IwQEoFbdm20402shHAO+SdIWLlAd/NeVffu7HrHMfIhQqJX2p3umel69epVda2TlzzcS7Yv/wP4jzDgfJIUVS7ei8YtcIprifql97ie+ECMdsuWzh0vfCBvnBIuqrxtwO4eu0eP12MSX1USQ4A1fmg4GZjLAoAdNXw4Hkty2Dwb5Jq5jKtIoyAI9xxA8d6N7g3Mk1zbuMbbWNTvleN8BrxPDnSOxkdwmV7BEN3CWz55zOAr5jRe5g6gtrrbUoVK1jbfpHG+9a8BYHsn46ND9Yr4gcRoVQCAAurJcKY6BwdzPqfmvGxevy4dhGd9fV0yeWeArEYG0XkgH40P1V16CjeNBaJhbMCM019jloBjRU2Y9CjCrc1t8R0nGwAQDOILAah6fjk6srCBzpgVrQHAnFTTAoml3Cp8hwIAGeBj0JzwFUIUqJskm92uuL9E3upuKGcpzUOygAjv0zEZ3R+JA3IaggqAm2LjzOQHGGrc6AcEjwwAMLIWNFcCwIITzJmQ21tdqWJHrr59tQhxZneRElVZfkbzmdf8AhBeaQhslpk3INQI3stxxprxomEhkfzwXVBFtqioM0h0oYJ5POE17uSRlMILjTU2oCHFY96qDB1qQGbIoMF7ZcZGKVOUByFVABJCGwDYJeX94UB3qI9rrXx/P3rVdiuSL/Bn288W9OKPtW+kg/dfX/8MzET5aG+P9Up+vPdTUe35Iej3euIgonpSq9Lj49eUaku8VUCKqwxNlOdrX0sHyK+88akExGYPAEjvvZ9/UMeAqQWAp+yT9Pt9NVxPpkpmenJl5qLbOdXr9Ftey1xX75+qlwvPYo1j2O9pvhxPJ0ZiKwDNdie7vV0AwAv1VEXR3FQltfOngcjACqiAOWNehvvgVOW420NIoZ3jkxqpuVgPlgoDFZCkB8QOV/XJMZTTZMDyvyosLAFYBAqofA4WBrvYDw5NamoKe8R5QVquTEqohgCSr6dTy+1fV4SgERaVRRNUln5n5zn4izKAqBmeEwCwNGzTgPoNBoZ9qNfJQwBg1qXHrzSInV+WlmCeHfPeQMsxQLE+9AcD1I8oD6YPlcHm4bSSgSFixhOuricKNj3JabgShmUAGxRu1tSAAsDaYDAEgCD1A2jKRNuSBbl+OD1UWN2sAn73IXCzH8BaYNHBKsWq/QATj+cDzwwoLiXKjsd2lE9GpXBUCCnPEesbWjVQzoJSStUGPt/fchIqnstW9xcGpzx48tlAkIoa2D6+X5wlUANmHVu7CJdIRt0sVR9vMo50Fv5gE0Yyn8ezCpkB5j6x8MwWoi16rTcsUtaM6v52OBrrmFiXQK84mqyUAxq/PH2WYr4M5HwAZ2ADEJy+/c4da4/1sLXyS3B3n36p5zkV0+bxpQAo4RDR7XcPGvuoUKhOufvsc9atEvgLYbgwUt3VVRqS/ZsAoEaNCPsXIHLwdD9T3t4FX4oBBp4t2f7NO9aUgg3rf5ghAPDsC1W65u8FR9uDpZ+YtZLMB2s0nHz13kGmuqSXaeDb3wEArET91zJvRrQqWj6dsfcPKPEYP3qOHpcAAAAASUVORK5CYII=\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/DIE.piskel b/public/piskelfile/DIE.piskel new file mode 100644 index 0000000..1512e81 --- /dev/null +++ b/public/piskelfile/DIE.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"DIE","description":"","fps":0,"height":64,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAABACAYAAAB7jnWuAAAAP0lEQVRoQ+3QQREAAAABQfqXFsNnFTizzXk99+MAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMDicAEE/byk7AAAAAElFTkSuQmCC\"}]}","{\"name\":\"Layer 1 (imported)\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,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\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/Dotdotdot.piskel b/public/piskelfile/Dotdotdot.piskel new file mode 100644 index 0000000..f838598 --- /dev/null +++ b/public/piskelfile/Dotdotdot.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"Dotdotdot","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFCUlEQVRYR+1XTW9bRRS9M89lAUJt1BULwClV4ogNdE1FK2xngcQSKiQkNgghhfJDuoMA64pFKcvEaRV/JED3SPknkMICrPeGc86d59hO7JAFqpCYOH5v5s2be+65594ZB3vGLTxj+/Y/gP8KAzFZqMySWYRoQmFWJmLHAPtVxB2es3FCvuWj8zR27gQuAHup5DVEq1IFY9l4zFchKjUa8McZGci56y+dAGcSfdzr9SyFYAkGY4kr2IgJYCJcxQcj+C/EAhdsbbQ0//q161YJo77PbEsBwBzsV7bbewTaE9Cgiw/WFgAa1BCQRgwqSni2sbFhxbhhr6435QL+LgwAawbrPdrTohW9D05xorVAXPAazBsZqUNPEKQk4m0Mrq2vW6MorHmt6a547GbaAmTu3+5eD6EMVmJRp5yrwIhEAboRkoRVvYkW1yVuia219rrFRrDVJpjASpUHZCkAcbX3+HGmEyRXMI6xWthRvbqPZ/CazzQHbmdZWCxgsEQfINdaLQvjYK+1Vj1GUyGZQRRjTDS4u7Nj4RIl6E4RN0NROypluqOYAl8jwpOFz/R0wLzCZ3xLE2Vhq2uv5MQ9CcUsJZIzXgcIX8WXYhhoil0vB7zJgJCWfAUXpCnrA8cLzFDiAjy1gz5AMpc9T05EeRoAFigyrYliIsHCAwA5xDPVBoIIMJIy2BNmnCLPoyxcsaPcmdg9BSDiWWezq/QaDPaZX/bX6LIVuAZ4gRuzMWmnqT/h53MwItecoUa045fuadqV5qfKng/ev6MQPXj4A+YyLItCkGtrp9OGscL6+31Rn35ewUJjUTqReY6Aq94FQk+J64/mPWuAvedf/kRZcudDAICQvn/4QMCBdwEDmbBOpwMAEQDAAOvc4RXEsrLi1m/oQ1pPXqjNz1wJoACDJVKBZDfe+lW+drtthK+w4ZDrSS9nA0DKIAuStdtd1hIbDEeYjPgeXsVCYwu3jt3TJy+64UkJyMk/geNCjrefgnqE9B04hGf7h2CUhaw6qQdzhYEKSNZFCBLu+gcDla80WrHyUgk5SFE5/rjcfDoDqO4nAKxKsAHGaKADBpgJgz4AQEtI9UUhcJ8UAmRCf9hXYSkPV7TxSIRT1XQeQHHzdyrGqh8vQy5gIAPsQtTMoBEATJUQgZ8vjcqP9mZHDBwMhyolaXTVUjHWNos9yRLKq1asG2+hfgjecx1gCzyPtwEIzzpdhBQh6Q8P8laODSS3OQDkONkmNMDttD9ACAjhJ2YBPNLGlGFj5YDpqntKQUqQpZtFSMXE4tvH2om7XTAKZPuDYS5p56Qh6VfpwUtMrPvvVdj0MlbVYZ2LEE6GxBu0qm06f+Hdyj7e9QrK9C0AtuLWzEPMMhF6/dY+6zFCpfvu3QQAVJ/XfW9eplkBWYolVpQ9Vj69h/+Pdib4tEUrM3BdJsKpN7gKlmORnxikXcJDrksDeZ+sHZVZ7lx03JPdt/OLH0iyGzgFqHSiDINCprDqqJJVAMV4AP++aWfXGSbRQlVORmedy735LDhz0smgE7z15pc51kxrHlRpKNi3R3fBDBlb7PG8gQsCgO+IIQHoaKaqRG+xDPrbR5/piPbvAdDJtLKtG9tuk/blguJg27/czYOn6stCZi/EgI6AoHzrja8mJXlyXIMotxECtSXH8H8UAu6YLDGUmnIAMKd/B3xx4+ucpLOb0DdHn0t39e8FzwZWEqdq+iBSA/kbOaQ8P53PUu4AAAAASUVORK5CYII=\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/^^.piskel b/public/piskelfile/^^.piskel new file mode 100644 index 0000000..7a7c54c --- /dev/null +++ b/public/piskelfile/^^.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"blank","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEiklEQVRYR+1Xy2oUQRS9VT0rH+AHiJnEGCdmIy5FXcR5LAS3BkFwIyLx8SciGnQtgq+lSUamMyYo2at/4iK4ka7ynHu7Jz0z9jjqQgQrkHRVV9977rnPOPnLy/1l/fIfwD/CgPNRYtBwSfjLi2Tc4q/+CvaO1kS/v8+PJobZVAzgUoyqnBqDZPjjoTN4vAlRfJJIyDIA4A9vRANjmH4fAPSo3d2NDYnOiYfCCIUEYybjKVApz0w5351qnAITUebn5vmaUiqB/AShjw72rG90hV6geFIBLOKjxw62Yh8BzDvs4QoHUIuNJUmyRGYWZtUEfPXLACDeyUZ3Uxyppg/woMYoAGOCDBdWm3Ow5z1V52Xh5EmpwT31uToAq7fGgFQgo32wfHNTldBSmEmzTQoCTa0tfFSEYMKYwF0yhLPFhSXxNSez9boCCuaQoTV6oBjfdrvmNtAZIJDC+IKe9rqjY8hA0KzIVDzONDgVrgZmxAu6bqHREPfNyfHGrHIW475LhgDkhsn6m3V8aGao0RraFmxcRRAa/YDgkQFgyMPfmeZKBpcBEvaEv7QIAKEm9RPHCusHeocZMCPzpUmuVtJiTW/yoAyTzmKZz/mZxoF+b7woK2DRYe+YtxnZUdiTAXgGGeUwukkpfV3kNvkuOd871ACHQ15SEFYFCkvyUiEMD0JKQGmWVQHQUHPS6rTVwn6aWqF7fzhnYmD2xIcvMw+kBkxH5m6CkUyuXL2qpfPlq9cmp5QNP3RBq9UErV5SAgCCuHtgWKHlXOXam7kvNfjs0NEbYD3KysoKnSDPX73QDEFoVLjAM+yjtFotTbW011MlcffQQJk7t2dEA1QZvZ3/4C4udWAQ46LX71kEVAKwbJflZhNBl8hW2gdbiOgcQKHEfA1WeY4Hd9aUF2tw/8KehuPF5ba+2tpJNTWxKhhAIjF8mnQBntKdLY3cMoAApfyaYMrnVc+83L4IeTCoB5eyn6C2VAGw4FcXIBPSPj5g9pRcUO358Te1c1/BX5A2gxqSdwDACKhkgHaDgU4L1crJdr/P8inxw34M/AoAfx4sQXGr3Ub9CPKuv61JWm5O46UYGjrNtna4NGUQAtLuwcl6rSQOL1ZRxAaP280OGM3AKGLK7k12gdOmws7Hmify9DJKLOcBPAeVYP0gQdKwtgWGbt6EBIVJyxBC/fq69ROJOMNfj29pWHUMWIvHylsMv8fPs0tOsoR92er+0OI2sQ81OPNRjXqvvSnfpEx0Dh3nqoNwlEe2IjsrZj0IoI2Bk1FRkgcuyAFqWd5P9kmj2Vh/HkKQD6Mqn9A5oGkzss6ozVh7NWgYxEDRoPGXPWLE56PBNBnAWOjpXCa3Tz/URqXEFJ0R2ycfb+uggkifWu7UF00Z5KOgKIDc19ZyWSwSefL5FusW19Ryp76oUl2i/x+snlkzbqDX5gRrxWsfV3PKq6fgP3MBHM9pcfXMI5vXmes26ymYtc93DVVp5Brz4shBFQPqxEFcYUPv22Du5B4YGPQUGOtRr2nz4093dEAM+l9LPiERZy7MxtXh9R2V6vwwkCVDZwAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/activated.piskel b/public/piskelfile/activated.piskel new file mode 100644 index 0000000..ed8c9a2 --- /dev/null +++ b/public/piskelfile/activated.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"activated","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFB0lEQVRYR+1WTW9TVxCde+9LF1WlJNuqAgdBiJsN7boVVbCfF1102TRCajetVJXmj7SrKtA1QlWAZT7lZwcEf4BK/R2IQmADeff1nJn7HMfBNl0gVKnPxPh+vDtnzpyZuU7e8ePesX35H8B/hQFfiUSVi8efw1fJIQc2ffx4TMbB5FQHp27gydhUAYEEfGBaymTYeScVPt4FiWWpO22Ju/WZev7EDTisoi97OztSOQfPsT3SZOLCwWik0QpGsY5prn3cXNL958+d5zJPGWtnMkLvKwc6t3f2YJxHwzj+w9nwGmaxxnEFpNipxp2rpNlclnAU5OzigrqAt/4lAJzFA3f2dsWBggiLFbxVZ8yKek6y6TenjHqM8AI1QlSLFy9KFjJpNM4CsJJ3CsgYZB6vw/PdXQ0jCU5uqmGEXCqoUDWAUwfhphUGjQxhsrm4LD5zstBoKMRoqE88oxN62v7+viqZcaSg+SrBq+D06EQAjNWJ4LEeESbNF/z5gBCV0AcmLiwtSXgFIEsMifI4sHsCADIIYXWyvbUlbobe4ABwHsmp8me0K0qKEmsVM8MjPJHQInLEMsF2w2eMlptNrAdpXDhTe/96AMlJ26T5rL5qGFTpmKImyMPxY+s6a3HGw3TlLkBQ7QSECxnDpDHOJgMIpH4YhIfXPNkIILr6B+ZgDEY80NHf2jyrArcN5hWjsWQqseeUBuh4u93RxaLoMt/k5cGc+hSzUgJiK0gx8I+Zl/DzPfzkkQR9BOczefbhL5JhPHvmB82er1dXtUDcvXMXDCnIyQy02y1Q5qXoFgqkejiPg16BQlCJGFQ0rhpgmLQoYE5jo9S/WPhVMrz//kffI20rWQUAKuL2nU0rq8zXcQxwvtNugy0A6IEBnnt/3oKvPSBKuHpowDY/AIgZkbWnRuztOVCOPfgKVMBnf2vJyPMWNgfp9rumlmkAWq0WNOilVxzAn9IABKv1qqS154b/j1lMZRg/1qV4a9aKkPoHuV1+DiCVXFnJLaT3waiKYwIDIFlWGAKkYHGvZ7X/YF7KGXpFggF/zRg42pyVgDC4tSfHY62HeA0dK6w8VQZzOMSi1S36Gi4Ul9eHgOFhGNsdMIBPt1cYpWAg4gffLVlqvzm0XCcDBHA1AcA4g+gq5LwEAP78hcqig/NK/LhXFHX3Hq8BrrQ60AD86PeAmIbAALoL2AMINp+MBQGGS6iekD2LEaagU9a4CJBM+/DFoQJo5zkkFKXX76dCOE2ErRyOIQRMQ9L5YE67XKpJWpD421OYtMyGRYZojt6rDlCILj/T1pDnHQxLiBAOWesYw4A1dhizdXUOe29+ZSV2MJkqYVAASEG4bfmNPfqPc1G+2zZ8epXRvu2QIQQ5rhLW+NLNR2nFS7e+dKg9iL16ZzKuqyGHkcUpRVfrUxLTt1tp62B/qvATAAy/wTgjBdL9rr7rwRYzpdTSDKli3W49wwW6vh0MwIxW3IGdsQsWKQKwm5BGIBkiK5yzTkjn64bE+NUXOesRozE/6eHpXjC6PjK22/G1SxuWz+l2ULeX3x+tgxkN0WTHhk59443pnYoF5adPAKC+CCk7DLqXG49+TO34bQFwAbyXcu3T67Bgl1JTOb9K2QAD1jzeGgAG3gPAb6kLDgkPotz4ax2ZQtmMvwW/mQbg3KC7Wi7a1Sy9vX7puhUjjUOtTCc3/vwZPYCpBlXUm9PlJSXqqZD/AysfMD+DOEqaAAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/angy.piskel b/public/piskelfile/angy.piskel new file mode 100644 index 0000000..4eb3aa3 --- /dev/null +++ b/public/piskelfile/angy.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"angy","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEwElEQVRYR+1WTW8bVRS9772EBZsoW5DAhZLGZFOxJpQPe7JAYks2SGwQQhT4IeygLWvEAtpl8yU7DlHhB1T9J6RVF5DODOec+8Z2nIwdxKJCYqzEfh9z77nnnnvfC/acn/Cc/dv/AP4rDMTarJJcIv4C/pUccuDTkydishpPLgxw4QZaxqYaCCxlj2XjLmKlqi2mZFVZYh8/xMTdehban7sBsdSMZX931+oA49mhm8dqAJSKTmt83DnX3uyua//V165ymVZa/SxAGOuAeHZ29+GcpuEIX7BtsY4YIVaM8RNjwuBabd3uhqVnyV5d64g7fP4xANgMtru/ZwEUVPBYI1oF415EvXPsjiUHsgRQ1AhRrV27ZktIT6fTsUzeOSAtyBgfIt/bkwtGmsN0ypUbOsJaBqJ00wuTxp94s7u2YXEp2BUA4EzlCTnzzE4orIODA6m7Bp0VHCmgnOmoUSN+X6NZJQtpimSM7hJSVBJsbWvr6xZOg72+foVGaW3s9wyAGCMCQ+T3dywsMxoadgeN2Oi80biLLmET0gPOGGMJ21QHoCgdhLjR7SKVSMUbrzTRXwwgB+mbVM9NrG60ovDJTGbBN04aQc4z5liwLFaUp7STwATGLBpX0nwACWKS2aapKOdIQk7xmQ4UwIDKcdKVmnKUiQaiJsmSaqcFgLYE628Vim04HEhYfx2tWMJ3hSgScmsoMW8xf8LcC3hr3JqsXor2+KVvDdqzlc7nqJrSPt7eVt7u3b2H4lFo8xno93ugLNpwMBSQ+rdVYD4VpZd5nnYAAO+/+PJnUsM2ALBAf7n7s7dVz4OeC6ug3+9nAGCAAI5Xlfw6+083Tqx8sHIGSzNHRyX2UgXh7T+UtqLowUiywWjgClgEoNfrIf3RDodHwF86gOQ0s8Uubz5WyTUg6JyPxmpUHEH/N56Isw/ezyk9BqNupp0BRtBjCqCT4a+H6nj10aqVy4jKK9PiOyeKbBoAq+PZ72TFw6vKaOldB1YgoBDBwHCIwKClatKQ2lMAD8MRXoDhEgxU+KFGh7+lzRNVSSWHAISxYsY4QHQ1at4SAG8+leYLiJoN8xgAslzbGPDDp7fVh3qDjUYjpx0MWDplMtSYoDAAQY55KWAFIDodjtApAbL9wL/F957o7OgXBSRU2SHs5SY2X4RbvQL1CAZYhozswSoozw2n6YzskprzhiWGaJ7R69aCL2iDVVcUW2JmwICaM0yWW6ogMMGMHPDZOn78CC02z/lx6B4SGpDs8ejiLYiv6UTEIQXPn+5kL5Bi4rnCo1ntcoEGvN6zXGHwpw9RWuRU0TVNJ/c4ddypLjjF8Sf3GwBSigbeXNsBTL/B7eO74HRbRmfHnZA3k3xnmu697oaJEyH8BYyzYh/7aV3wBAGAt85ML+nGT91+/JbovkhDZqEBxTWeETM5n4mwHdnsRh+rBuzm9e/88iG3umgI4A8PvwYzBNx+BfuXAFh9yb4kgPGTL4kQ4p2HX0xuahdHcG52fgrOwU1gvrSbb91uenrWlmf6FhjIKbu03UtvzDpgHQHA9/neNXXeQ5S3HgGA7nKXT20bAL+5NQywqUzqwb65ftvQ6vOOiYk7j77KeswXw6wSHUwO7Zy/vwFU8QY/SZsuggAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/base.piskel b/public/piskelfile/base.piskel new file mode 100644 index 0000000..950c970 --- /dev/null +++ b/public/piskelfile/base.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"base","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAE6UlEQVRYR+1WTW8URxCt7l5z4BDHV5CSdSDGiy8o54ATsjs+RMo1vkTKBSEUAj8EToSPM+JA4Ii/5PE6FuYHIH4JIZYPZJkZ3qvq3l2vPbtGHFCkzMre7Y+pevXqVXU7+cSP+8T+5X8A/xUGfCVSqlw8/hz+FRxyYNODx2Oy7E9ODHDiBlrGpgoIJESPRXLnsVJW4kOQsiiwjx9i4m59JtofuwGxVIxlfXVVKgfj0aGZx6oDlJJOK3zMOdfOt+Z1/9mvznKZVmr9TEDoK4d4VlbX4Zym4QhfsC2+8hghVozxE2PC4FolrdaChHdBvpxrKnf4fDAA2HSyur4mDhSU8FghWg3GvCj1xrE5VjmQJYCiRohq7tw5aSA9zWZTInmHgNQgY3yIfG1NXTDSGKZRrrmhI6xFIJpuemHS+BNvtuYWxDeczAIAZ0pLyIFndELD2tjYUHVXoLOEIw0oZtrrKInf1mhWk4U0eTJGdwEpKgi2krn5eXE9J2fmZ2mU1vp+DwDw3iMwRP5sRdwUo6Fhc5DERudJ4ya6gE1IDzhjjAVsUx2AoukgxIVWC6lEKr7+IkV/NIAYpG3Sek6xmtGSwiczkQXbOGgEMc+YY8GyWFGeqp0AJjBm0ZiSxgMIEJOaTU1Fc44kxBQf6EAODGg5DrpSKkc1kSDqJFnS2qkBoFucdJYyjS3PN1VY/25PS8B3iSgCcisoMWsxb2HuBOin8Aj6HYJuyD+nbgm0J9PNq6iaQn5eXta8PX3yFMWjoY1noNNpgzIv+WauQKrdGWDugUJQiRxQnHTIvJstlqnmhrtlf/a2NPD+ydNXVA3LAMAC/fPJY2urlgd9jqyCTqcTAYABmtyZseTzDECcjUt7eBFZfn4SOKYkXHoD6hD/7ucq2gJ7qQL37d+atixrw0iQze6mKWASgHa7jfR72cq3gb8wACGdAASwDycE9hlANcRffg0ZlNLbmbYmpGFB/4t7rBH54XJM6Q4YNTP1DJCqNlMAneR/bWnHq7ZnpJhCVHQK+DTMSN++gDYorMXXNt7FGNFr1RZewndv1FuGgJwHA3mOwKCVctCQ6lMA7vIuXgDzBRgo8YNlRnpPXNzTKimfT+O/AeDTw7iBiqhQ8xIA+OK+aj6DqNkwdwAg8ljHgB0+7aUOInXS7XZNA2BAQo/J0EihMIgOOealACpH27PDETplgbH9wL/47/f07OhkGSRUyhbsxSY2XoRL7QyiAgMsQ410RtVvaGJnZJfUOWtYypAuGhg9DxYhTqxl2RJSWkCECCidYWbt6CpwlC59AT5bx8Of0GLjnB2H5iGQbt2IJsxbkFakXUuolV9XohdIMfBc4dGs7XKCBthC+3KFwUc/OrQAhml9357Y47TjDnXBIY5/eZYApP2pudYDGH6DTshp9BfvevhCO8KdkM0o3pmGe+8QOE4TGjCOir3vp3bBEgQA1jpTw9McskTZ4ZQpDZ40RBYSKK7xjBjJ+UiE9chGN0Ya1Nz1C3fs8qFu9aKhAB+8vAFmCLj+CvaRAFh9QX4jgP5j5wKFeP/ltcFN7egIDs2OT8EhuAHMF3L9m3uppxvzMdN3wUBM2bHtHntj1AHrCAD+iPeuofMeorz7CgD0Lnf81NYBsJtbYoBNZVAPcvPCPUGrjzsGJu6/+j3qMV4Mo0r0YDJoh/y9B3asGD+F/MGdAAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/base_full.piskel b/public/piskelfile/base_full.piskel new file mode 100644 index 0000000..3ab6225 --- /dev/null +++ b/public/piskelfile/base_full.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"base_full","description":"","fps":0,"height":64,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAABACAYAAAB7jnWuAAAAP0lEQVRoQ+3QQREAAAABQfqXFsNnFTizzXk99+MAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMDicAEE/byk7AAAAAElFTkSuQmCC\"}]}","{\"name\":\"Layer 1 (imported)\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,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\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/blank.piskel b/public/piskelfile/blank.piskel new file mode 100644 index 0000000..e0af562 --- /dev/null +++ b/public/piskelfile/blank.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"blank","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEnElEQVRYR+1XTW8URxCtnlkuSVB+QKR4HYK9wRfEmeQAO+tDpFyxcoFLhBAk+SdRgpxwjiKFjyM2izxejEi4E/4JQpY4RDOd91717K53PesNFxQpY9kz09Nd9erV66p2sHd8hXfs3/4H8B9hIGTRYi255Ek0Fe8Zfmv90SijiRnea39PQwtlthQDmBSjnLuzCrcMPuoMX+poWZ5bXVUAwB/OiA7GMb09APhR3MPdXYsBxpNDgvH4SEwALNyTc3471zsHJqKd/eRTq4QEk1quExBmMSCend0hzMM0M8GwsCqLzkaNGXzke8R7AKheb8M6VW4ra6sKAav+NQAEFGz46JEFUs0c4EHBCACc8kEcC5q0oSRwntxltra+bh2kp9vtWiJvDkgLMsaDyAHA04goPEyhCcoNHDU5avSWUxNATIYw9tn6BvQRbBUAOAK+TgDgybTHw6FVnAs6aZDGmGN+zPTGxDAlteVkSCMYA0CJk+5yGIMAuIHWej0Lfwc701vFrBzBSBkN7Ik6sIMYmO083LFwiryPg/bIRbaGFSXxRZKfgXwwlCHfVZMM0BPwXuO+QQB1x7pnP57ze5SStN99e3M/c77H52PgAa9kwdXt35lzSiLlGWOuCEAAAHKXgwksrCRTLjyegcQyDLmy5QqUsNZE7Hc5cjyNHDADNSCgLKkgJUANNlnwECgPQsoRRFW1AWAhg/VicyBTZVnKQv3s/UmemqdJAZx8S6y8WvnROmDkw+515tuufL0lFPce3COKlEBfNpMCF2FR9EFZZuUeADDqPz/QZDJ+QuHQvNcrP9gprD/90TfwF21ra4tJsN/v33V7nodjAGQsbdGKfjEBQEzPAWCcc647Lvx5ksLFQ63bREAUaznaczOtAJQCs0v9vmVZbvvlCAsRAwGMqedeHxfjea9TI+GLQ8nx8iWkFIb3n5TYmotSAGlxq/WZAjyVT/el3KMAYGDc7Gb9H6HJGgYGl/ssDNJUjq1S1ZOCNJtShVYUSAEkX45KFZZqmoHFMU8pJVrn4hvwV9kAoiZpTwHACWjTgOIGA4NCDezgYKRg4x/vjd3OCXGBHLLPD1UfisEA9aO2J6MDVdDp5jTPAAxuImcRVJXlnsDG5zPb8CjTrZx0IEJG3B9sWo7klyNoSiVgQR0QP2oq3BBe+X/9CiUWKVGwOpp4P8i5adSS0ymIlYrnhtS8ru1wrvdKb+GIH4HVJ2nASym7mh8zfvsSwlHXwTiqnkpuEzdDZONJRZal2rtXsKsPVVbSRZtoVsLaLsIZOtV/faw568EAi0pNhpp+PE4JG1OzZLLZdWxouRYXNjQn0dZkLXUdSpViRTNONSlpW068EenOHuEUvCWAOdQMz+zW+ds6H7oadNCQizsvvlM/B+RlKvZiZMcxpqaIgnLr/E8pqCRIJh5nwDsvb7BuLYx41u7SSGU15Pr/4OaFbffCwHVs8Fa8/eJmc0ZY2u7SE90jNWEAcNtP2jwmNikAmO2X37oIp/p9m/ia8TYA0TdNOg9pD/s5kGPfX/g5lVTqGzN5SsGcX/4CAJ5N0s7xIom/oCptjjl//wDVQPUwX6zy2QAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/blank_full.piskel b/public/piskelfile/blank_full.piskel new file mode 100644 index 0000000..cadcfb2 --- /dev/null +++ b/public/piskelfile/blank_full.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"blank_full","description":"","fps":0,"height":64,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAABACAYAAAB7jnWuAAAAP0lEQVRoQ+3QQREAAAABQfqXFsNnFTizzXk99+MAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMDicAEE/byk7AAAAAElFTkSuQmCC\"}]}","{\"name\":\"Layer 1 (imported)\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,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\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/dotDotdot.piskel b/public/piskelfile/dotDotdot.piskel new file mode 100644 index 0000000..51e2c51 --- /dev/null +++ b/public/piskelfile/dotDotdot.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"dotDotdot","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAE5klEQVRYR+1WPY8bVRS9742TAgmtVnRIRN4kctakgdRAQLG9BRIlbENBgRBiCT8kHSxQoxSQlPsV+St89UT5JyERBaxmhnPOfeOxJ7HNiiJCYnatmXnvzb3nnPvxXrDnfIXn7N/+B/BfUSCWZoXSJeIXMrO8JHYM8x1T/sQFWFH4Wk6ty7G1C2gA/sqc9xCtKAs4S85jugtRrtGAv7kVa+2vXAAucGd2cnRkZQhWwmEscJcamCV1/HOEoByA2XZ3W+svX7xsWE4rS/2sQRghdGGHRyegD5FL/uAEX8Uy4pVcMQQsEYMKBea63VetdZrZhSttfYO/MwOAzWBHJ8dOkuyDS1zSW2BKgDOUt5z8PTe4joCZB1zS6VyxViuzdrsNgP5JMyeWICM/MD8+huFgOY2KJh3DiWJT4A7nsDrLN87zlQrh1u1ctdgKtgUAHCk8IAvX4kCE5DB8fO9ekhPRxrvYpcSLMlRdnANnOcQ4VIqeFhYzvOclxAjW2d62AKUudbY8RnMhWQAQAYAODw8OLJwjTSQdYijcZK4E8FTg5TWAOESEB2MEyvKsAIsz3q52uwCQ2VbnQvJfh2JRAaWzf+71TDfOkq6KlPjgNYeg0oaJqDjjyrBChStVAu4BIDmUVs/8PgMA612p5CCqBgTLNO7k63FlIpwIXVrrcF0ib2GYYxUhDKgd9onlAFh4/Z2BDIxHQ9H6a7phGe5igdgaSsxF+BOkzsOJqLlCrWiPXr5l5+Fio/2JqueD93eF6O6du+osah3pamalgPf7PTjLbDQcelx/2YShU0lapfmMpbLe05JMuf6P9i1rQb0XXvlYVbK7u6s29cOd7wUceJcBcMH6/T4ARAHgVf64iVgielmd/wrEm0/c8a8vzgBkUDBHKVDs1huPxHUw6CF8mU0myZ4ngq5GGSKXgbjXGyj848kUDHIAeAnkT6HCbMvRx00AlVHRZPm+88QyVM+NHghhcjgdwaPmloeAUg0QghJMRvfHSutyumn5udxabz1eYFw79KcKUAlFijxa9vbvctyHAqyE8QgAkEso9XU5AMSoBH7Avp/fRwgga3adkiOJkuQe97omWlVIftpQXkStRwiQ1KygKezNtZBnhAD5zAK8sQMAeBpPJnJRTj0ECIbvSWivqeBrEVAdrEYVBMGylSAEbFr9wQB4CtlbA4BBLm0HOcB9YzRBCMj4Z1YBGGljSpkDywHL1fdUgqwBtm42IZjJMHP9sapgMNgBodyGJOQIVoRAm53Pl3DCwvruvQI9pPqGGFlscEDKutDxeCBhm9aOiJaKev/o0E8KnM+U32y0VG9FDng/0z7rUGHw9rsoLWoKduz7lVOuoeSBzYnHsLRTVxQ/PKgj5FtodWJbDmDuCz7WZ8HU+nAjPABiVvm+XO1KVWz4nWhQM9/Oz34gEZAYAECtE6JCwmqfYoi818M8ZUevmAFUi0zgqGIj5g2GjUbUnH3qnYqY7b3+pZ/LuNnwHJBU+PbBTSjDwlzO+F8CgGXsEZ8RwOxYTraUIdr+g0+fOnCs49TcjFavD+gCYLt3bd9PCNqIFCxtyfu/3fScaLb4FVbPBEBHQMR977WvZi1QvUE5V9r+QwDgteIY/k9DIIH5q/jomJoOfF9c+zoV6UwC2f3m4efoBxQkHQwlU32KnD8HVED+Bk+HKD87D3w8AAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/dotdotDot.piskel b/public/piskelfile/dotdotDot.piskel new file mode 100644 index 0000000..44003ac --- /dev/null +++ b/public/piskelfile/dotdotDot.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"dotdotDot","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAE70lEQVRYR+1XTW9bRRS9M89hgVSiiB2LyK1KatNNYU1bKtnOAoklZIPEBiHUqPwQxAaCWCMWtOxIk1TxRwOULSD+CU0RCJL3hnPOnRcndm2DilQh8az4Pb+5M/fcc8+9Mwn2lK/wlP3b/wD+KwzEZFZJLhF/oTArU8Bz0tuAL0YiiwiLhCfM4NAijS004ALwl0reQ5STlLg6/iKn4y5EpbwFfKrs/YkB5Fhsb2fHUgiW4DBWuBNGwmiEKzzGkACKrj3kVvsl2Ce7eOGiwZyMzAx0AQMRy1Z2d2cPQdIJomXAmBUBgEAqkkEsBMhUYKwNAMVRYauXmhYwB59/CiAwPtvZ21V+Ky4enOLEEURHz2TeSjLi2qCdPNEEOVtrX7JGUViz2VS2OGVSEzOQxVQguu3dXawVrMQzI66kRThRbiorsGopCjz3TJHT4IDarcvQZGHnm6uyyVo9g2ECgFO+e++eIkhwWMGRosvgo35l9estZmSHFZiBLPwqALjEXFTFWqtldhTsxdZ5aQXzT/yeAQBjpBmRf71tcQk5ptA9aI+c1LP4GKWiLlzvEelxIuTA1UGo0AhsLrdbCAhMrK3W9fF4AGRR6iZZQM78+1JebhVzKx69HP21cyNoLFOBK2ChwgVuaqdQImlUuRjmAWC9MxFcMYNRkE67Bzp+LyUyX0An/PjUgFgS4FQhiCKyo7TOAUAVdNd7WmjQ76vZ/DlaluACqGZu7ZhOydMfsHoG4Bit40qNaIcvfGgNjC8331P1vPXmhpDfvvMVADEt42o4K8LcWzvdjtQ72N9XRtI3K1joSJQ6B6em6ScBkDVn5vfmR9YAe8+uvosWmmxjY0NivX3nSwfpFa1rqgq4QLfbRbTR+gCgCYMVq4pjr/s5V7z6SKPH3z8nnTRe/UUeer0O0l7YcIj1GEJdUlMA2FNR151OT+kfDEcwLi0dPI+FjiyhG1IHjPOMDhR3ssbVXzVSPVjGF/i4/htliPW6er9/gJSSsZkAJJNgPaSA5dS/P1D7SqMVK5dKa1w7zA7OOYQccfXAf9eXqraMVrz2UBSTAaav1hR6y6wUuMiVAii4P+yrsZQHSAEeiusPpwFQjN8h4twBPUJwVIABAlQKetozhhB1rp/ZGqCUOutdMTAcjaSYNEAKlo5zS4YDSjy34DolQZ1PPclKgmUrufFIzawLBtg/BsPhgkbkxWrr0AAD6WMCE1Z9yypARNqY8EqFjnqHOcVGYZAhdgKyy2JSD7hxCGKSGAhgaH9435maWYbeeEU/L26/bKifv1Fh06tZQ1+DFSsp1jskOyP6vkxUKty6K3vnbt2SCjQ36puNluzN0YDnSPusQBDMF6+jkZLTCu/JsS635FGJ9FP19TasO0bf3j5tSnu8VYyzAeQZ9W18FqyLj3lwqklzPjONNwPXBmtY7c5toaKJfjN2M3NAMQYAUOv0nTBveMinH0IIQO8Zfe4OtT4ELm9Ap3M+EeFkJ5wcnvxNRsw2X/5YIssgfQfEz89+uKVKOb3fL1pxLgOPmZwC9oibBKCjGfdrpoLnZrOtn97PvmdT/mQM8GQKp5tXtk6Ydg79ELj1462pMvtXGaAmqN/NK59IZFS0BEkvEN/WzwDAa84x/O8yoD0h/weQq6c+lCb74JVPvUjzISNzAAA3tQecdCyN+9FMGKd2X7O/AEkZPT9EGuExAAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/dotdotdot.piskel b/public/piskelfile/dotdotdot.piskel new file mode 100644 index 0000000..70b9b52 --- /dev/null +++ b/public/piskelfile/dotdotdot.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"dotdotdot","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAE5klEQVRYR+1WTW9bVRCdd2+6QUIlYocEOFC5Nt3QroGCar8skFhCNkhsEEJE5YewgwBr1AW0yzRJZccmiO6R+ktQU7HBvPs458x9tmNiu1mgComXj/c1b+bMOTNzb2HP+CiecXz7H8B/hYFQmyWVS8BfAdgV/xke8x6v/IoGsEhuy1framytAR1E+K94LoKlOiFYDh7yuYBFqqwAigI/aYZ3rf+VBsgF4cyODg6sRsY1AoaEs9gIFpA6k+UTgqIz/nW6Hdlfee2KwZxelsZZgzDUyMfuHxxZERGkRorMEl+FOghIfmQhAgbB4F23+4bFSbRX2y3JhJ8LA4D7wg6ODqVvYvYFKKY7vFEUUg7mUQzSn7VBOwJmHVCO9tWrthGjtVotsIX3rt2ZYwky5ofMDw/huLCKThlY2iKItEk4I3hDAX0zimhwQN32NQsbhW0BAJ9AsLUAxNXhgwfyE5BGhUDKLhdeUPSmJ/gOOeeACfaBjDFcRMAK9wDV7nSsmBT2emcL34rHKZAziEIISAyZ7+9bcckD5aQ9cxVAbjm/xBPoELwDCLSC7wawcsbdtW7XiiraVvuVHH8mxVlKVM7+ufcz5fIsGSpRfvU8bXLJgyp/6wpAZxwRFmpc4GbtRMiFe/xm6/MZyP2EflcpOYhmAMEznfvAmT1XJSKI0GXbBpBqQXIROT8mO+qd5QDYeP3tUoHGw4H8/jl+wSLSUxbQ1tBi8mx/IakNXCo1Z2gj2OlLXxlqzy5vfQY/lX304Y6Q37t7T0XqZTojsbnmWQn2+z0EizYcDPSu/nUTmCei1E3mlJveut7k4Y8WAIC9517+FPFq29nZ0Zj66e6PYrWuZt2w0BZOWL/fB4AwA3Cy6eIjPpVlcc0fDeUEEMFghVag7vGt3zUyyrKHL6KNjnNCXgg6zgJg3wFxr1dK/uPRGBlUVp+8CMuJ1ZiG6w/acG0AnPeeWESyt3pICE8HJ0OfJ2kFA2yEEhLUyGT487HKuh5vWnUJar9zqvjp4fM6h7efnHtf432qwMa7jxX4Vq+H0ol2PAQA1BJafVkNzEkA7oajoQZLBQkSLuLNx08FIP1yGSSAgQywRFGzg8YAkDlcDoAN2Nvui4HRaMR8wQAkiBNMRUwAfsoS94bP6yJZx7RAgaghCJajBBJwUvfLEiWUICn9+Xp2bg1wCeFqv40a4LoxHEECTrOH6AK80Zjlp6o6WKBkNPc4I0CeejxxCCEEVsdw81RdUJbb8FzZgAAc9+o21GaHUwlB2Fg/fJC0A/Jq50DRvghssCdUDdAcpc0xLTt+m+yT+01/oCNU3/gawEDlcgA+z7TOOlQ4vPM+WoucIjvO/Sao5MFtweHEnUkeeE2KH+83RDtI/ZfpcgDzX9B8uu41DqgDJrvqIa/LzarUaJODebP7cn7xDYkDKbAv4OjkGCZ9edwX8CcpsTSLdsyKKUB/4ODI4oLmCxkuDKLFt/+41wJgu9e/9l2ROOJ+wFep7x/d1v5hfr1f53JhFK8zB5cQ8Yvr3+RCZF14xZOevUefa4v27wHQzjTZ7o29phNzQ7H6Ktv77bbTvzjiV+R1IQa4BUzQdvdNMOA789nOAEzsQQIdK7bhT1cDmCRc/IiOcSh3wW1q3vB9eePb3KRnl+bvAID7wOnGUGpwkvjqOb8PaID8Dc6hMT+ydnpkAAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/hihi.piskel b/public/piskelfile/hihi.piskel new file mode 100644 index 0000000..f3c09f9 --- /dev/null +++ b/public/piskelfile/hihi.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"hihi","description":"","fps":0,"height":64,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAABACAYAAAB7jnWuAAAAP0lEQVRoQ+3QQREAAAABQfqXFsNnFTizzXk99+MAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMDicAEE/byk7AAAAAElFTkSuQmCC\"}]}","{\"name\":\"Layer 1 (imported)\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,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\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/question.piskel b/public/piskelfile/question.piskel new file mode 100644 index 0000000..76ca960 --- /dev/null +++ b/public/piskelfile/question.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"?","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFDklEQVRYR+1WPW9cRRS9M/OSAiGBRYUEjo0Sk00aoE4EcvajoKDEHTQgIYL/CFSQQB1RgClj42jf2rFA1KTgjxBImnhnhnPunVl7N951AkgREs/Z7L43H/fcc86985w848s94/jyP4D/DAOZSDM+Hj8cPjHxBh981zH6yXsvKXFQr1MTPHVC2SUzeHBBUo6Sa2CgyfjzfB6jxrMhzv43ANj+sruzIxlpO6af9JGl7xAUyVpQjBeWOp2LStP5185L0of6/4nXQgac9xl8yvbuLjZnWATHFyXwzmNf5Ip7MuJzwChguCydzmUJ4yDn1lYZnKueEgCieazZKYETfjtky22wnyHQpCxv9Ua9cwiogLysvd6Rs8HL8so58QGz4+OemIMMyz0y3/5RdWVmZVcNDMklw4WUJEMSE8RJggExAHZMjM7aZfFNI6srr+qMZKinrtkHmRjv7N5BINrbqdu5NJdgXnMtBIAODUwjKgB8Aw8Z8wHgIk2Z5cKlNQmHQVYvUhIFN4k7BcB7R1ll+/ZtcWewGPOSio6gyNRsZh53zBJjihhRXSK0JGSZEHU25YAUlzodjAdZubBcsz8ZgLJdK0hFLfVW/U3j49mkyIwLlUmfWpHggkaVFXjH4d55VIwWDcdATbmmJSgAAujTXkJNKQH8ECN2rnhsEw2s7CBTD3kT5nF+HeVyJgHttYHVBlJ6l0KY8YCZr9cb6GDbDrX1PTp4UQL3bqIEuFpQYoJyE3lkeeRG/ZJkjOiN3H/5czmDdS8sfwy1o7y/saHTt7Z+AEPaJRcz0Ot1kZiXdjhSKvPPS9joEEmDSmQrIWv+zNRdeSD5l+ehNUtD0cjD1S+kwfrnXvkIz7NsEAD+vt/6ToGicuYAKFsMej2wBQAjMMDMD17CurFawlPLql8JXkGoRgAZA5hiXVz5XVtGv9/FzkGGe0NzE9vHiR4oALrdrh4qo3Yf+aABHSwh3VjKDV2BQCYwjIUEFmxzk4e10rz9AECyXFvvm6QHrVlnrgSK08k6JQBL7V1IwN6/vyTxLPzLtsvux2KfYYG3Y6wOcK9WbfQS1u8rg30kxKY1bPfsOE1HDWnKhFbZTnqDa8jQy3DUwt0ADQmSH+vaCA8EImFzPJYKf0eYs4FEmRRhTrj6UOcMBl1hEd1tWy3ahQwQUXcAD4CBvT0gZmZgIIQx2DMWUsPyg8rp8MiEAdyhKGivxLIE1eGdPw1Av68H1wj7lReLU0zYHVALVAFMSAA/oQzpfjJHFqz00W7ZWXjKsNzZlokO9zQIfOCv/qEA+v0BbiNMuK8cz2eAO+gRYAA5lz3+1ntssfQ1WopuYBZUUBiPPP4QwBoT/7HUkny4Y1PhBgCggWDpRR6w7sIAtKK9+dCM377r0HtgLmZHG2t8a4talWhO7HaaGpdzFwD5AADscDqqGTY6+lQnH6eiPpj6pt1L0bIvaH9GBgqDTZ92Z2dj1nxnMAIVHPtijaDOnnPNHbDFBFBKrpKjwYwJ+LwQYVKoGSoojvGVzZb/TQCPoVZC5fobNycy6NHLYxff39zbBCw98hYndmzfJ55Y1mQ2lE/fvFEyY3gE1HcDLzfufXJqxrM5PR0Ahy4At19/62Zxejmi1ZARADZNhgWa/0MAPBo9JPjK9ilngr46wJRf/raJSqFt5r8FPxkA9AOWuHUtrUWUU3W4yCY8oC+gE/pZEU6+/vUzfSMqpVZilXItFp0F8BfvP0w/9ZIt/wAAAABJRU5ErkJggg==\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/sad.piskel b/public/piskelfile/sad.piskel new file mode 100644 index 0000000..dab1398 --- /dev/null +++ b/public/piskelfile/sad.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"scared","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEzklEQVRYR+1Xy24UVxCte6/NIlJkWdklEhkIGE+8CaxxANHTXiBlCd4gsYmiKE7yIezACWuURQJL/EDTnolF+ADEnwRbLHh0X86put0zDG4PiAVCoi1m5j666tSpJ04+8OM+sH75BOBjYcBHkUrDxeOfw0fJJRdc4zcu2OOxWdWH1VQDp15QBZBPBYGaYyVlowwnFU5CAKIS9/hHqA2cqfIPvWDqRLY3NyU6CPem0MTj1AEKjHTYiUk5z77tLur9E8dP8JhSWvVMQeijgz0bm9viAkSDB1IB2eKjh1LYym1g4U0qdy5Kt7sk4WWQrxc69g7gtKV72wFkOtnc3lL/VtAYYa0aY1qMenWPKWY48B4BMwwiJCycOiUzcE+n05FE3hv6WgDQPli+tQXBDj5nlKmZRrn6plKXxAREIwVrD6eRcALqLiyJn3FyDAC4YyevP5Mbatb2/fsW2aCzgiIKo49Jpk+hbzlhZ6qQzgJAT8aoLkBhiTVALSwuinvh5JvFYxRKaY3e1wB4D/xQuHFvQ9wsY78xugm2JiWUfl5BBni4BwzRxhKyFRRO1WZ8LnW7MAiuOHm0Nv9gAGakvW75bFZSlYYcA19zPhWAxEItNfkZy4AbTNYAdhg7Ae7CmkljsA8DwBhL5wSRChB9DY+MMryxBQxoOo7uGjP2NLuUqexo7rQDoC97K7m+XBR9DaznwzkJ+K5gRYBvBSlmbewZxB2BYDVNtcUZL3tfXhfEnsx1ftLsuXJ5VRHdvXNXKwuuHs5Ar5eBsiBFHwBozX/zEPRCKW19GHxMFFx42gEAsPfZVz9q4K6urmq6/nPnbwNpGa3PgVnQ6/UAwI8A7M6r82OjH6G1vC/VwzmjefkJfn+eKCBTlUaBO/u/low8z6A1SH/QVxPQR9oAmJezLEMMetkphliVEne/gPFkgG50Mru8pylXPjAA4dwT/da1FiquAPLcvgTk6MUMBmGnv1vYeRsASzwnGV2AWCj+3bHaP5yXchZW2QXx3+9pyR0HQAUvFZBJr0ov4bwBy2EQXdovCq0LSPW3cAEsLQZ4Ab4t4QLSyjRj/JJytXHMBfXawcEROQ/TJSw/1ZjPEdQsmEMASNnRBsCaT7bSQy13MhgM1KI4NBdAtFZjRBjyG4WHQwEzANZpc4SXCJBxDv3iL+xr7+jlOUKokh3ImwLAzleyHPUIDDANCeHBPChPxbf2MSR7hgw1awaw5rFXGBhtDYgN9vOcAPCjT4PqHqaSW7KgLkSRSvB3+we2Eet6KkGrJeobclz32LrYnNRFNpZEKLy2kbQg9gP7CluzlsspMWD5bnMPwfx1CR2RnKp19TyUapxW3LEqOMbx1Xs1AH5b+baJrR3A+Bu8Tk7TXqr/muMAxKhKI1rqSmPv1u2IatnO330gSQ7CXGCl05yVijxT1AYzNhlWV9KQWKhBkUX2iAmfT1j4RiWcPD+AEZG1725ojzBirelS0q1Hv4EZwm23+D0BQDJS7pfTAFC3O61djD4vfz76eTSpTTGlPp7sBYe/xskUeb925o/R/wU0NPhRyjoYsDn67Zl9RwA2sKydudm03yb+EZTrjwFA58f3B2CT2xhPNqZaRvwOBtTTo86jHKw//hU9gISkwTBFSTM7HsDMK4tGGT+BFPEIAAAAAElFTkSuQmCC\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/piskelfile/scared.piskel b/public/piskelfile/scared.piskel new file mode 100644 index 0000000..bf970ea --- /dev/null +++ b/public/piskelfile/scared.piskel @@ -0,0 +1 @@ +{"modelVersion":2,"piskel":{"name":"scared","description":"","fps":0,"height":32,"width":32,"layers":["{\"name\":\"Layer 1\",\"opacity\":1,\"frameCount\":1,\"chunks\":[{\"layout\":[[0]],\"base64PNG\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAFBklEQVRYR+1XO28USRCu7lk7QALLIgMJrXkYL07uiDEPeXYdQAxOkC5BCGH4I2R34Px0wfHI/EI7XmMZfgDwTzAWAdgzfd9X1TMLa4/tEwFCYlZrZrZ7ur5HVXXj5Adf7gfHl18AfhYFkiCSa7p4fB3+FIVI4AOfeV8mk4+DceigHDuUAggYAoIkjIwbg0I0eL1A6CQBvhwJxQ9+6sM5cP19JzAcKS8tLElwWDwGNLYYcIBSMGjAx4Jz7EJrQuefPX2WwwRdG2d/hM4HB8aLSyvi4IIPQXJEcFgcIwgGrnimFfbMsSCt1qQkO4mMjTchEMFhsOaqG8CaTpZWltXfAgERGosjmEUx6Xmr/OECvjlVAiimQcAK4+fPSwP2NJvN0q1d8WoAeLwO5svLENohdMw4j1CUXFOhUEtCBEIoGoXJwlsAao1Pim84GWuOKdTCDPnmGvxBaa28fKnM6XGOf7kYPaaYXp+YaPaXT1yWFhS0iWlBRRKPvMRyAD0xcUHctpMzEwCibvQt+QaA9x7EwHxhUdwQ2ej7hjsmG9mpDcoJ5aF0YQ80o2o51lZQHPXgXHiZbLVACFacO6Vv1QIwkva6Gqk0VQoNhbVizccGUIlpepRVyRuv1iTAHcuTTFSdAwGw3ukXV4xgCAELasZbqMoElIda5YEOfKMysX7hoypocmm5KJE6C6gAvWzPdDTQardLNPJlfQRcAApS01tBidk29hnzhlEQAAB2xFI0vHw48UiGMT7SvItQudy6OavIXzx7rh3N0rS0sZJRUTLPZKadAkkiGQGQ6+tRjG2rpLUXy5X9ABM+NR9JA+odOXlHl7w5O6vl+vTZvzoBeGsARIXb7TZKzFcAwjoBQLiEYpr8fmpLijcjli5XNnF/VMccFMyRfAnvL33QltHppFg5kW7PCMVEqOzqk/JoY/A6TVPY72U1W9MGFNaPgzwVYP46GZr6CLYY2QAA6gIA7BfbG8eMgvIDyCtbkqB6ptNpTePuelbuafUKUKoUFpBJ9mpVO15YG5V8CKysMsVf/qgtN98w1gTAvrFDRSK9IsfvVzcVYAeEHCztZhmIIZeKfkPa1Ygo8DQtANOshxewcA4FCr9jja5kV1pABaY2Ja8sgGKoeVDH75805ztIalblGgBULSTqPgAgoYOSzrSRrU5e9Xo6LYcC0thGk+GGhB+GUXIsKbRJh204oN2yZJmnBMg8Z7r4a1tauu1OB0QKEOodBMDGZ1KUISJlGSygqBujUCQ2X61nftEDYYMmHugxJ1jj6Mfx1GLJya2hAwDcVbskVO5heytgw5SfVyBjfP6+gRbLBNBwzFN2SYeeAPY6EYpwc1KLOI83hfyxGKOgJhI1wzos+v3+ZRg3V32bYP65jmqmpmDHZmRX7IZ8ZHMqu+BXJt9esJkmmrVvO7HVAyghl0HicmX9cwXWODKFWRWPaDHCV++W25EaxEIeTPZqbu2AQce5wFqnbTRxH6H12jLZGTUWZYgqlKA4xiPbgOcDDPstcXBg72etAZn77U9DpGFte2Gg+fcPoQzh1jP+LgDah9BQ7v8OAAqFrLkLccTL/Nt7lqB7nHzqCO5vwS64OPJgJ5m7+MRsr1LDzkyP385puTE7Dqfo/5hoOUHrvQLQ/5lw94u7IHvBX7BAq0GPSYe7aiZyJ7A0i4GrgwW5PgAAOyfRfSwRV5l/9yDmI1GVL8fd06DtivcflbswP5LsbO0AAAAASUVORK5CYII=\"}]}"],"hiddenFrames":[""]}} \ No newline at end of file diff --git a/public/question.png b/public/question.png new file mode 100644 index 0000000..c9554ac Binary files /dev/null and b/public/question.png differ diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..2929e0d --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,58 @@ +# As a condition of accessing this website, you agree to abide by the following +# content signals: + +# (a) If a content-signal = yes, you may collect content for the corresponding +# use. +# (b) If a content-signal = no, you may not collect content for the +# corresponding use. +# (c) If the website operator does not include a content signal for a +# corresponding use, the website operator neither grants nor restricts +# permission via content signal with respect to the corresponding use. + +# The content signals and their meanings are: + +# search: building a search index and providing search results (e.g., returning +# hyperlinks and short excerpts from your website's contents). Search does not +# include providing AI-generated search summaries. +# ai-input: inputting content into one or more AI models (e.g., retrieval +# augmented generation, grounding, or other real-time taking of content for +# generative AI search answers). +# ai-train: training or fine-tuning AI models. + +# ANY RESTRICTIONS EXPRESSED VIA CONTENT SIGNALS ARE EXPRESS RESERVATIONS OF +# RIGHTS UNDER ARTICLE 4 OF THE EUROPEAN UNION DIRECTIVE 2019/790 ON COPYRIGHT +# AND RELATED RIGHTS IN THE DIGITAL SINGLE MARKET. + +User-Agent: * +Content-signal: search=yes,ai-train=no,ai-input=no +Allow: / + +User-agent: Amazonbot +Disallow: / + +User-agent: Applebot-Extended +Disallow: / + +User-agent: Bytespider +Disallow: / + +User-agent: CCBot +Disallow: / + +User-agent: ClaudeBot +Disallow: / + +User-agent: Employer +Disallow: / + +User-agent: Google-Extended +Disallow: / + +User-agent: GPTBot +Disallow: / + +User-Agent: Kagibot +Allow: / + +User-agent: meta-externalagent +Disallow: / diff --git a/public/sad.png b/public/sad.png new file mode 100644 index 0000000..b71e671 Binary files /dev/null and b/public/sad.png differ diff --git a/public/scared.png b/public/scared.png new file mode 100644 index 0000000..10f06a8 Binary files /dev/null and b/public/scared.png differ diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..96acf7a --- /dev/null +++ b/start.sh @@ -0,0 +1,10 @@ +#!/bin/bash +echo '==== Cleaning up dead screens ====' +screen -wipe portfolio +echo '==== Killing old server ====' +sudo -iu prod fuser $(sudo -iu prod which node) -k +echo '==== Restarting Nginx ====' +rc-service nginx restart +echo '===== Starting server ====' +screen -dmS portfolio bash -c "sudo -iu prod bash -c 'cd /prod/portfolio && node --permission --allow-fs-read=/prod/portfolio/* .'" +echo 'boosh' diff --git a/views/art.ejs b/views/art.ejs new file mode 100644 index 0000000..06fc93f --- /dev/null +++ b/views/art.ejs @@ -0,0 +1,143 @@ + + + + Art + + + + + + + + +<%- include('partials/navbar') %> +
+
+
+
+

Art

+
+

+ Hihi :D
+ Here are all my various versions I have drawn of my profile picture ^^
+ I drew them using Piskel. +

+
+
+

Face

+
+

Blank

+
+ Piskelfile +
+
+

Base

+ +
+ Piskelfile +
+
+

Activated

+
+ Piskelfile +
+
+

><

+
+ Piskelfile +
+
+

^^

+
+ Piskelfile +
+
+

0.0

+
+ Piskelfile +
+
+

?

+
+ Piskelfile +
+
+

Angy

+
+ Piskelfile +
+
+

Sad

+
+ Piskelfile +
+
+

Scared

+
+ Piskelfile +
+
+

...

+
+ Piskelfile +
+
+

...

+
+ Piskelfile +
+
+

...

+
+ Piskelfile +
+
+

...

+
+ Piskelfile +
+
+

Loading

+
+

Made with Ezgif

+
+
+

-.-

+
+ Piskelfile +
+
+
+
+

Full body

+
+

Blank

+
+ Piskelfile +
+
+

Base

+
+ Piskelfile +
+
+

Hihi

+
+ Piskelfile +
+
+

DIE

+
+ Piskelfile +
+
+
+
+
+
+
+
+ + \ No newline at end of file diff --git a/views/blog.ejs b/views/blog.ejs new file mode 100644 index 0000000..7966b5e --- /dev/null +++ b/views/blog.ejs @@ -0,0 +1,69 @@ + + +<% if (type != "sample") { %> + The oddbyte blog + + + + <% } %> + + + + +<% if (type != "sample") { include('partials/navbar') } %> +
+
+
+
+ <% if (type == "main") { %> +
+

My blog

+

TODO: Main blog page here

+ <% } else if (type == "individual") { %> +
<%- page %>
+ <% } else if (type == "sample") { %> +
+ <% } %> +
+
+
<% if (type != "sample") { %> +
+
<% } else { %> + + <% } %> +
+ + diff --git a/views/editor.ejs b/views/editor.ejs new file mode 100644 index 0000000..e5e624d --- /dev/null +++ b/views/editor.ejs @@ -0,0 +1,257 @@ + + + + Oddbyte + + + + + + + + +<%- include('partials/navbar') %> +
+
+
+
+ Switch to preview +
+ +

Markdown Editor

+ +
+ + +
+
+
+
+
+
+ + + + + \ No newline at end of file diff --git a/views/home.ejs b/views/home.ejs new file mode 100755 index 0000000..bf078de --- /dev/null +++ b/views/home.ejs @@ -0,0 +1,106 @@ + + + + Oddbyte + + + + + + + + +<%- include('partials/navbar') %> +
+
+
+
+

Oddbyte

+
+ my profile picture +

+ Hihi :D
+ I am a nerd that happens to like hacking stuff.
+ I mainly nerd about privacy, android, web development, cybersecurity, and sysadmin.
+ My goal is to become a CISO. +

+
+

Stats

+
+
+ Species: + Hooman (I think) +
+
+ Height: + 5'9" +
+
+ Operating System: + Anxiousness OS +
+
+ Processor: + Fried Potato +
+
+ RAM: + Not Enough +
+
+ Bugs: + Anxiety^(3), Nerd^(2), ADHD^() +
+
+ Current thoughts: + Why does CSS suck so much? +
+
+ Gender: + Dood +
+
+ Age: + 2.5×ln(e)+2(e^(-i×π)×7.25)×cos(7π) +
+
+
+

Contact me

+

You can contact me by messaging me on:
+ - Signal (preferred), @oddbyte.01,
+ - Mastodon, @oddbyte@mastodon.social,
+ - Github, @oddbyte, or my
+ - Email, contact@oddbyte.dev
+

+
+

Other hooman

+

+ Check out this random internet person I happen to be aware of: voxel.top
+ He is also a cybersecurity / privacy nerd
+ His website sucks ass needs improvement
+ (yeah, lets go with "needs improvement") +

+<%/*

+ Check out my buddy's site, catocat.uk
+ She may have stolen things taken inspiration from my website. +

+*/%> +
+
+
+
+
+
+ + diff --git a/views/moosic.ejs b/views/moosic.ejs new file mode 100755 index 0000000..73c22d3 --- /dev/null +++ b/views/moosic.ejs @@ -0,0 +1,138 @@ + + + Oddbyte's music + + + + + + + + +<%- include('partials/navbar') %><% function toTitleCase(str) { + return str.replace( + /\w\S*/g, + text => text.charAt(0).toUpperCase() + text.substring(1).toLowerCase() + ); +} %> +
+
+
+
+

My favorite music

+

Open my favorite music playlist in youtube music

+ +
+
+
+
+
Made by Oddbyte.
+
+ diff --git a/views/partials/funfact.ejs b/views/partials/funfact.ejs new file mode 100755 index 0000000..d09cf95 --- /dev/null +++ b/views/partials/funfact.ejs @@ -0,0 +1,14 @@ +

<% const facts = [ + 'The first computer bug was an actual moth', + 'Android was originally an operating system for cameras', + '"password" is still one of the most commonly used passwords', + 'People call me funny sometimes I guess', + 'Haiii <3', + 'e^(i*pi) = -1', + 'According to the leading fan theory, 1 + 1 might actually not be 11', + 'xkcd.com is a thing, and it is funny most of the time', + 'Apparently I am a hooman', + 'This message changes every time you refresh the page', + 'I wish my friends would talk to me more often', + 'I am a functional introvert' + ]; %>Fun Fact: <%= facts[Math.floor(Math.random() * facts.length)] %>

diff --git a/views/partials/navbar.ejs b/views/partials/navbar.ejs new file mode 100755 index 0000000..185b58b --- /dev/null +++ b/views/partials/navbar.ejs @@ -0,0 +1,8 @@ + diff --git a/views/partials/style.ejs b/views/partials/style.ejs new file mode 100755 index 0000000..8a5399b --- /dev/null +++ b/views/partials/style.ejs @@ -0,0 +1,188 @@ + /* Begin default stylesheet */ + body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + background-color: #1E1E1E; + color: #e0e0e0; + padding: 20px; + text-align: center; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + } + + *, *:before, *:after { + box-sizing: border-box; + } + + #container_top { + align-self: center; + background: rgb(33,43,54); + border-radius: 12px; + box-shadow: 1.5px 2px 1.25px #bb00ff33; + display: block; + min-width: 95%; + max-width: 1200px; + margin-top: 15px; + } + + #container_main { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + min-width: 100%; + max-width: 1200px; + } + #container_thing { + flex: 1; + min-width: 100%; + max-width: 1200px; + } + #h-break { + margin-top: 1em; + background-color: #66666666; + border-radius: 5px; + width: 3px; + align-self: stretch; + flex-shrink: 0; + } + #v-break { + margin: 1em 1em 1em 0em; + background-color: #6666661f; + border-radius: 5px; + height: 3px; + max-height: 3px; + position: relative; + width: 100%; + align-self: center; + } + a { + color: #78A9FF; + transition: color 0.5s, text-decoration-color 0.5s; + text-decoration: underline; + text-decoration-thickness: .15rem; + text-decoration-skip-ink: none; + text-decoration-color: #66666666; + text-underline-offset: .05rem; + } + a:hover { + color: #b3a2ff; + text-decoration-color: #78aaff66; + } + p { font-size: 1.35em; } + h1 { text-align: center; color: #4a90e2; font-size: 3em; } + h2 { font-size: 2em; margin: 0; color: #4a90e2; } + h3 { font-size: 1.75em; color: #6ba8e3; } + h4 { font-size: 1.5em; color: #8bc1e4; } + h5 { font-size: 1.25em; color: #a3cce6; } + h6 { font-size: 1.1em; color: #bbd7e7; font-weight: bold; } + code, kbd, pre, samp { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + Liberation Mono, Courier New, monospace; + font-size: 1em; + background-color: rgb(43, 43, 43); + color: rgb(255, 174, 87); + border-radius: 3px; + } + footer { + text-align: center; + font-size: 1.125em; + color: #942ebd; + margin-top: 20px; + margin-bottom: 10px; + position: relative; + left: 0; + bottom: 0; + width: 100%; + clear: both; + } + *:focus { + outline-style: solid; + outline-color: transparent; + box-shadow: 0 0 0 2.5px rgba(147, 112, 219, 0.3); + } + .mobileonly { display: none; } + .selectDisable { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -o-user-select: none; + user-select: none; + } + #button { + margin-top: 0; + font-size: 0.85rem; + color: rgba(255, 255, 255, 0.95); + text-decoration: none; + padding: 0.35rem 0.7rem; + border-radius: 12px; + background-image: linear-gradient(to bottom, rgba(114, 137, 218, 0.2), rgba(103, 58, 183, 0.15)); + font-weight: 500; + letter-spacing: 0.02em; + border: 1px solid rgba(147, 112, 219, 0.3); + display: inline-block; + box-sizing: border-box; + } + #navbar_contain { + min-width: 0; + width: 100%; + box-sizing: border-box; + max-width: 1200px; + margin: 0 auto; + } + #navbar { + font-family: inherit; + margin-top: 5px; + color: rgba(255, 255, 255, 0.95); + text-decoration: none; + padding: 0.4rem 0.8rem; + border-radius: 12px; + background-image: linear-gradient(to bottom, rgb(33 41 50), rgb(34 48 59)); + font-weight: 500; + font-size: 1.35em; + border: 1px solid rgba(147, 112, 219, 0.3); + display: block; + width: 100%; + text-align: center; + box-sizing: border-box; + } + #button:hover { + background-image: linear-gradient(to bottom, rgba(114, 137, 218, 0.3), rgba(103, 58, 183, 0.25)); + color: white; + box-shadow: 0 2px 8px rgba(103, 58, 183, 0.2); + } + @media (max-width: 1201px) { + body { + padding: 10px; align-items: stretch; + } + #container_top, #container_main, #container_thing { + min-width: 100%; + max-width: 100%; + margin: .5em 0; + } + #container_main { + flex-direction: column; align-items: stretch; + } + #h-break { width: 100%; height: 3px; margin: 1em 0; } + p { font-size: 1.1em; } + h1 { font-size: 2.2em; } + h2 { font-size: 1.6em; } + h3 { font-size: 1.4em; } + h4 { font-size: 1.2em; } + h5 { font-size: 1.1em; } + h6 { font-size: 1em; } + #navbar_contain { + padding: 0 0.5rem; + } + #navbar { + font-size: 0.85rem; + padding: 0.35rem 0.7rem; + } + #button { + font-size: 0.75rem; + padding: 0.3rem 0.6rem; + } + .mobileonly { display: block; } + .desktoponly { display: none; } + } diff --git a/views/source.ejs b/views/source.ejs new file mode 100755 index 0000000..35a8d13 --- /dev/null +++ b/views/source.ejs @@ -0,0 +1,79 @@ + + + + + + Directory Tree + + + + +<%- include('partials/navbar') %> +
+
+
+
+

Directory Tree

+

(here is where all the raw files are)

+ +
    + <% function renderTree(items, indentLevel = 0) { %> + <% items.forEach(item => { %> +
  • + <% if (item.type === 'directory') { %> + <%= item.name %> + <% if (item.children && item.children.length > 0) { %> +
      + <%= renderTree(item.children, indentLevel + 1) %> +
    + <% } %> + <% } else { %> + <%= item.name %> + <% } %> +
  • + <% }); %> + <% } %> + + <%= renderTree(paths) %> +
+ +

Rendered Pages

+
+
+

these are the thingies that you see when you use my site like a normal person (in a browser, hopefully)

+

+ / <-- Main Page
+ /music <-- My Youtube Music playlist
+ /source <-- You are here :P
+ /art <-- My art ^.^
+ /blog <-- My crappy blog
+

+
+
+

Files

+
+
+

+ /favicon.ico <-- icon
+ /robots.txt <-- tells some robots to go away +

+
+
+
+
+
+ + diff --git a/views/sourceviewer.ejs b/views/sourceviewer.ejs new file mode 100644 index 0000000..dfc4ce2 --- /dev/null +++ b/views/sourceviewer.ejs @@ -0,0 +1,25 @@ + + + + Oddbyte + + + + + + + + +

Source code for <%-filePath %>

+

Back

+
+
<%= fileContent %>
+
+

Back

+ + diff --git a/views/template.ejs b/views/template.ejs new file mode 100644 index 0000000..ef181e0 --- /dev/null +++ b/views/template.ejs @@ -0,0 +1,29 @@ + + + + Oddbyte + + + + + + + + +<%- include('partials/navbar') %> +
+
+
+
+ +
+
+
+
+ +
+ + \ No newline at end of file