commit d68d09fa5e71b41d6504c9031339167ffad41803
Author: C. Beau Hilton <cbeauhilton@gmail.com>
Date: Sun, 21 Jun 2020 06:35:02 -0500
test
Diffstat:
79 files changed, 22999 insertions(+), 0 deletions(-)
diff --git a/.exhaust/profile.bak b/.exhaust/profile.bak
@@ -0,0 +1,86 @@
+#!/usr/bin/env sh
+
+# Profile file. Runs on login.
+
+# Adds ruby to path
+PATH="$PATH:$(ruby -e 'puts Gem.user_dir')/bin"
+
+# Adds `~/.local/bin/` and all subdirectories to $PATH
+export PATH="$PATH:$(du "$HOME/.local/bin/" | cut -f2 | tr '\n' ':' | sed 's/:*$//')"
+
+export EDITOR="nvim"
+export TERMINAL="st"
+export BROWSER="chromium"
+export READER="zathura"
+export FILE="nnn"
+
+export XDG_CONFIG_HOME="$HOME/.config"
+export XDG_DATA_HOME="$HOME/.local/share"
+export XDG_CACHE_HOME="$HOME/.cache"
+
+# export XAUTHORITY="$XDG_RUNTIME_DIR/Xauthority" # mess with this sometime
+
+export BIB="$HOME/repos/life/dox/acad.bib"
+export REFER="$HOME/repos/life/dox/thesis/thesis.refer"
+
+export CARGO_HOME="$XDG_DATA_HOME"/cargo
+export GEM_HOME="$XDG_DATA_HOME"/gem
+export GEM_SPEC_CACHE="$XDG_CACHE_HOME"/gem
+export NPM_CONFIG_USERCONFIG=$XDG_CONFIG_HOME/npm/npmrc
+
+export LESSHISTFILE="-"
+export SUDO_ASKPASS="$HOME/.local/bin/tools/dmenupass"
+export NOTMUCH_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/notmuch-config"
+export GTK2_RC_FILES="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-2.0/gtkrc-2.0"
+export ZDOTDIR="${XDG_CONFIG_HOME:-$HOME/.config}/zsh"
+export WGETRC="${XDG_CONFIG_HOME:-$HOME/.config}/wget/wgetrc"
+export INPUTRC="${XDG_CONFIG_HOME:-$HOME/.config}/inputrc"
+export PASSWORD_STORE_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/password-store"
+export XINITRC="$XDG_CONFIG_HOME"/X11/xinitrc
+export WAKATIME_HOME="$XDG_CONFIG_HOME"/wakatime
+export MAILCAPS="$XDG_CONFIG_HOME"/tuir/mailcap
+
+export CONDARC="${XDG_CONFIG_HOME:-$HOME/.config}/conda/.condarc"
+export IPYTHONDIR="${XDG_CONFIG_HOME:-$HOME/.config}/jupyter"
+export JUPYTER_CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/jupyter"
+
+export R_ENVIRON_USER="${XDG_CONFIG_HOME:-$HOME/.config}/R/Renviron"
+
+export GPG_TTY=$(tty)
+export GPG_AGENT_INFO=""
+
+# less/man colors
+export LESS=-R
+export LESS_TERMCAP_mb="$(printf '%b' '[1;31m')"; a="${a%_}"
+export LESS_TERMCAP_md="$(printf '%b' '[1;36m')"; a="${a%_}"
+export LESS_TERMCAP_me="$(printf '%b' '[0m')"; a="${a%_}"
+export LESS_TERMCAP_so="$(printf '%b' '[01;44;33m')"; a="${a%_}"
+export LESS_TERMCAP_se="$(printf '%b' '[0m')"; a="${a%_}"
+export LESS_TERMCAP_us="$(printf '%b' '[1;32m')"; a="${a%_}"
+export LESS_TERMCAP_ue="$(printf '%b' '[0m')"; a="${a%_}"
+
+mpd >/dev/null 2>&1 &
+
+[ ! -f ~/.config/shortcutrc ] && shortcuts >/dev/null 2>&1
+
+
+# Start SSH Agent automatically on login
+if [ -z "$SSH_AUTH_SOCK" ]
+then
+ # Check for a currently running instance of the agent
+ RUNNING_AGENT="`ps -ax | grep 'ssh-agent -s' | grep -v grep | wc -l | tr -d '[:space:]'`"
+ if [ "$RUNNING_AGENT" = "0" ]
+ then
+ # Launch a new instance of the agent
+ ssh-agent -s &> .ssh/ssh-agent
+ fi
+ eval `cat .ssh/ssh-agent`
+fi
+
+# Start graphical server on tty1 if not already running.
+[ "$(tty)" = "/dev/tty1" ] && ! ps -e | grep -qw Xorg && exec startx "$XDG_CONFIG_HOME/X11/xinitrc" --
+
+# Switch escape and caps if tty:
+sudo -n loadkeys ~/.local/bin/ttymaps.kmap 2>/dev/null
+
+gpg-connect-agent updatestartuptty /bye >/dev/null
diff --git a/.exhaust/progs.csv b/.exhaust/progs.csv
@@ -0,0 +1,90 @@
+#TAG,NAME IN REPO (or git url),PURPOSE (should be a verb phrase to sound right while installing)
+,xorg-server,"is the graphical server."
+,xorg-xwininfo,"allows querying information about windows."
+,xorg-xinit,"starts the graphical server."
+,sxhkd,"binds key."
+,ttf-inconsolata,"is the monospace font of LARBS."
+,ttf-linux-libertine,"provides the sans and serif fonts for LARBS."
+,ed,"is the standard editor!"
+,tree,"lists directory contents like trees."
+,arandr,"is a UI for screen adjustment."
+,bc,"is used for a dropdown calculator."
+,calcurse,"is a lightweight terminal-based calendar."
+,xcompmgr,"is for transparency and removing screen-tearing."
+,xorg-xprop,"is a tool for detecting window properties."
+,dosfstools,"allows your computer to access dos-like filesystems."
+,libnotify,"allows desktop notifications."
+,dunst,"is a suckless notification system."
+,exfat-utils,"allows management of FAT drives."
+,sxiv,"is a minimalist image viewer."
+,xwallpaper,"sets the wallpaper."
+,ffmpeg,"can record and splice video and audio on the command line."
+,gnome-keyring,"serves as the system keyring."
+A,gtk-theme-arc-gruvbox-git,"gives the dark GTK theme used in LARBS."
+,neovim,"a tidier vim with some useful features"
+,i3lock,"is the screen lock."
+,mpd,"is a lightweight music daemon."
+,mpc,"is a terminal interface for mpd."
+,mpv,"is the patrician's choice video player."
+,ncmpcpp,"a ncurses interface for music with multiple formats and a powerful tag editor."
+,networkmanager,"does exactly what it sounds like."
+,newsboat,"is a terminal RSS client."
+,chromium,"is the only program on LARBS your girlfriend has ever heard of."
+,ttf-joypixels,"is a package that gives the system unicode symbols and emojis used in the status bar and elsewhere."
+A,ttf-symbola,"provides unicode and emoji symbols."
+,ntfs-3g,"allows accessing NTFS partitions."
+,pulseaudio,"is the audio system (>inb4 bloat)."
+,pulseaudio-alsa,"is an audio interface with ALSA."
+,pulsemixer,"is an intuitive ncurses audio controller."
+,imagemagick,"is a terminal image-manipulator providing some convenient shortcuts and the lockscreen in LARBS."
+A,sc-im,"is an Excel-like terminal spreadsheet manager."
+A,htop-vim-git,"provides system usage information and displays processes."
+,maim,"can take quick screenshots at your request."
+,socat,"is a socket utility."
+,tmux,"is a terminal multiplexer and the dropdown window in LARBS."
+,unclutter,"hides an inactive mouse."
+,unrar,"extracts rar's."
+,unzip,"unzips zips."
+A,urlscan,"parses URLs in the terminal allowing keyboard-based selection."
+,w3m,"is a terminal browser which can also view images."
+,xcape,"gives the special escape/super mappings of LARBS."
+,xclip,"allows for copying and pasting from the command line."
+,xdotool,"provides window action utilities on the command line."
+,xorg-xdpyinfo,"aids with resolution determination and screen recording."
+,youtube-dl,"can download any YouTube video (or playlist or channel) when given the link."
+,zathura,"is a pdf viewer with vim-like bindings."
+,zathura-djvu,"gives zathura the ability to read .djvu files."
+,zathura-pdf-mupdf,"allows mupdf pdf compatibility in zathura."
+A,python-ueberzug,"generates image previews in vifm and other terminal programs."
+,poppler,"manipulates .pdfs and gives .pdf previews and other .pdf functions."
+,mediainfo,"shows audio and video information and is used by vifm as well."
+,atool,"manages and gives information about archives."
+,fzf,"is a fuzzy finder tool."
+,highlight,"can highlight code output."
+,xorg-xbacklight,"enables changing screen brightness levels."
+A,task-spooler,"queues commands or files for download."
+A,simple-mtpfs,"enables the mounting of cell phones."
+G,https://github.com/lukesmithxyz/dmenu.git,"runs commands and provides a UI for selection."
+G,https://github.com/lukesmithxyz/st.git,"is Luke's custom build of suckless's terminal emulator."
+,docx2txt,"enables .docx file previews in vifm."
+,odt2txt,"enables .odt file previews in vifm."
+A,zoom,"keeps you from skipping out on all those hot vid confs."
+,qrencode,"makes QR codes."
+,pandoc-citeproc,"does the cites."
+,r,"is for statistics and other goodies."
+,cronie,"makes your cronjobs easy-peasy."
+,anki,"is for remembering all the things."
+,texlive-most,"is a huge package with all the LaTeX."
+,feh,"is another nice image viewer."
+,python-pillow,"is an image library for Python."
+,python-yaml,"is what it sounds like."
+,python-pybtex,"also does the cites."
+,figlet,"makes text into text pics."
+,ncdu,"n-curses disc utility."
+,system-config-printer,"makes it easy to install printers."
+A,mutt-wizard-git,"installs and configures mutt for email."
+A,visual-studio-code-insiders,"is a bloated IDE that I still like."
+,tlp,"is THE power management tool."
+,tlp-rdw,"is a set of tools for power managing radio devices."
+,tcl,"is required for some R packages and other things."
+,tk,"is required for some R packages and other things."
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1,25 @@
+gnupg/
+VirtualBox/
+nvim/plugged/
+odrive/
+pulse/
+chromium/
+transmission/
+coc/
+Code/
+GIMP/
+menus/
+calcurse/notes/
+calcurse/apts
+calcurse/todo
+calcurse/config
+mpd/database
+mpd/log
+mpd/pid
+mpd/state
+mpd/sticker.sql
+pam/pam_gnupg
+*.sqlite
+*.*history
+*.log
+
diff --git a/QtProject.conf b/QtProject.conf
@@ -0,0 +1,8 @@
+[FileDialog]
+history=file:///home/beau/dl, file:///home/beau/vids/mov, file:///home/beau/game, file:///home/beau/.local/share, file:///home/beau/.local/share/virtualbox
+lastVisited=file:///home/beau/dl
+qtVersion=5.15.0
+shortcuts=file:, file:///home/beau
+sidebarWidth=82
+treeViewHeader=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1\xd9\0\0\0\x4\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x4\0\0\0\xe5\0\0\0\x1\0\0\0\0\0\0\0O\0\0\0\x1\0\0\0\0\0\0\0O\0\0\0\x1\0\0\0\0\0\0\0V\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\xff\xff\xff\xff)
+viewMode=Detail
diff --git a/R/Renviron b/R/Renviron
@@ -0,0 +1,4 @@
+CENSUS_API_KEY='c92c0a70527edc1d91a8c7272af0cb463a4251cf'
+R_PROFILE_USER =${XDG_CONFIG_HOME:-$HOME/.config}/R/Rprofile
+R_LIBS_USER = ${XDG_CONFIG_HOME:-$HOME/.config}/R/library
+R_HISTFILE = ${XDG_CONFIG_HOME:-$HOME/.config}/R/history.Rhistory
diff --git a/R/Rprofile b/R/Rprofile
@@ -0,0 +1,9 @@
+local({
+ repos <- c(CRAN = "https://cran.case.edu")
+ if (.Platform$OS.type == "windows") {
+ repos["CRANextra"] <- "https://www.stats.ox.ac.uk/pub/RWin"
+ }
+ options(repos = c(repos, getOption("repos")))
+ options(browser = "reload_html")
+})
+
diff --git a/RStudio/desktop.ini b/RStudio/desktop.ini
@@ -0,0 +1,6 @@
+[General]
+desktop.renderingEngine=auto
+font.fixedWidth=Inconsolata
+
+[mainwindow]
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x14\0\0\x5U\0\0\x2\xff\0\0\0\x2\0\0\0\x16\0\0\x5S\0\0\x2\xfd\0\0\0\0\0\0\0\0\x5V\0\0\0\x2\0\0\0\x16\0\0\x5S\0\0\x2\xfd)
diff --git a/X11/xinitrc b/X11/xinitrc
@@ -0,0 +1,9 @@
+#!/usr/bin/env sh
+
+[ -f "${XDG_CONFIG_HOME:-$HOME/.config}/xprofile" ] && . "${XDG_CONFIG_HOME:-$HOME/.config}/xprofile"
+
+while true; do
+ #cwm 2> /dev/null
+ dwm 2> /dev/null
+ dwmblocks 2> /dev/null
+done
diff --git a/aliasrc b/aliasrc
@@ -0,0 +1,39 @@
+#!/usr/bin/env sh
+alias ka="killall" \
+ mkd="mkdir -pv" \
+ mpv="mpv --input-ipc-server=/tmp/mpvsoc$(date +%s)" \
+ calcurse="calcurse -D ~/.config/calcurse" \
+ magit="nvim -c MagitOnly" \
+ p="sudo pacman" \
+ SS="sudo systemctl" \
+ f="$FILE" \
+ g="git" \
+ gp="git push" \
+ trem="transmission-remote" \
+ e="$EDITOR" \
+ v="$EDITOR" \
+ x="sxiv -ft *" \
+ sdn="sudo shutdown -h now" \
+ gua="git remote | xargs -L1 git push --all" \
+ ls="ls -hN --color=auto --group-directories-first" \
+ grep="grep --color=auto" \
+ diff="diff --color=auto" \
+ ccat="highlight --out-format=ansi" \
+ yt="youtube-dl --add-metadata -i -o '%(upload_date)s-%(title)s.%(ext)s'" \
+ yta="yt -x -f bestaudio/best" \
+ YT="youtube-viewer" \
+ ref="shortcuts >/dev/null; source ~/.config/shortcutrc" \
+ upc="sudo pacman -Syu" \
+ lsp="pacman -Qett --color=always | less" \
+ ffmpeg="ffmpeg -hide_banner" \
+ abook="abook --config $XDG_CONFIG_HOME/abook/abookrc --datafile $XDG_DATA_HOME/abook/addressbook" \
+ mbsync="mbsync -c ${XDG_CONFIG_HOME:-$HOME/.config}/isync/mbsyncrc" \
+ tmux="tmux -f ${XDG_CONFIG_HOME:-$HOME/.config}/tmux/tmux.conf" \
+ wget="wget --hsts-file=$XDG_CACHE_HOME/wget-hsts"
+
+
+
+
+command -v nvim >/dev/null && alias vim="nvim" vimdiff="nvim -d" # Use neovim for vim if present.
+
+vf() { fzf | xargs -r -I % $EDITOR % ;}
diff --git a/autostart b/autostart
@@ -0,0 +1,157 @@
+[Desktop Entry]
+Type=Application
+Name[af]=SSH-sleutelagent
+Name[ar]=عميل مفاتيح SSH
+Name[as]=SSH কি সহায়ক
+Name[ast]=Axente de claves SSH
+Name[be]=SSH-агент ключоў
+Name[bg]=Агентът на SSH за ключове
+Name[bn]=SSH কী এজেন্ট
+Name[bn_IN]=SSH কি এজেন্ট
+Name[bs]=Agent za SSH ključeve
+Name[ca]=Agent de claus SSH
+Name[ca@valencia]=Agent de claus SSH
+Name[cs]=Agent klíčů SSH
+Name[da]=SSH-nøgleagent
+Name[de]=SSH-Schlüsselagent
+Name[el]=Πράκτορας κλειδιού SSH
+Name[en_GB]=SSH Key Agent
+Name[eo]=SSH-ŝlosila agento
+Name[es]=Agente de claves SSH
+Name[et]=SSH-võtmete agent
+Name[eu]=SSH gako-agentea
+Name[fa]=عامل کلید SSH
+Name[fi]=SSH-avainten agentti
+Name[fr]=Agent de clés SSH
+Name[fur]=Agjent clâfs SSH
+Name[gd]=Àidseant iuchair SSH
+Name[gl]=Axente de chave SSH
+Name[gu]=SSH કી ઍજન્ટ
+Name[he]=סוכן מפתחות SSH
+Name[hi]=AFS कुँजी प्रतिनिधि
+Name[hr]=Agent SSH ključa
+Name[hu]=SSH-kulcs ügynök
+Name[id]=Agen Kunci SSH
+Name[it]=Agente chiavi SSH
+Name[ja]=SSH 鍵エージェント
+Name[kk]=SSH кілттер агенті
+Name[km]=ភ្នាក់ងារសោ SSH
+Name[kn]=SSH ಕೀಲಿ ಮಧ್ಯವರ್ತಿ
+Name[ko]=SSH 키 에이전트
+Name[lt]=SSH raktų tarnyba
+Name[lv]=SSH atslēgu aģents
+Name[mjw]=SSH Key Agent
+Name[mk]=Агент за SSH клучеви
+Name[ml]=എസ്എസ്എച് കീ ഏജന്റ്
+Name[mr]=SSH कि एजंट
+Name[ms]=Agen Kekunci SSH
+Name[nb]=SSH-nøkkelagent
+Name[nl]=SSH-sleutelagent
+Name[nn]=Nøkkelagent for SSH
+Name[oc]=Agent de claus SSH
+Name[or]=SSH କି ସଦସ୍ୟ
+Name[pa]=SSH ਕੁੰਜੀ ਏਜੰਟ
+Name[pl]=Agent kluczy SSH
+Name[pt]=Agente de chaves SSH
+Name[pt_BR]=Agente de chaves SSH
+Name[ro]=Agent pentru chei SSH
+Name[ru]=Агент ключей SSH
+Name[sk]=Agent kľúčov SSH
+Name[sl]=Agent ključev SSH
+Name[sr]=Агент за ССХ кључеве
+Name[sr@latin]=Agent za SSH ključeve
+Name[sv]=SSH-nyckelagent
+Name[ta]=SSH முகவர்
+Name[te]=SSH కీ వాహకము
+Name[th]=เอเจนต์กุญแจ SSH
+Name[tr]=SSH Anahtar Aracı
+Name[ug]=SSH ئاچقۇچ ياردەمچىسى
+Name[uk]=Агент ключів SSH
+Name[vi]=Đại diện khóa SSH
+Name[zh_CN]=SSH 密钥代理
+Name[zh_HK]=SSH 密碼匙代理程式
+Name[zh_TW]=SSH 金鑰代理程式
+Name=SSH Key Agent
+Comment[af]=GNOME-sleutelring: SSH-agent
+Comment[ar]=حلقة مفاتيح جنوم: عميل SSH
+Comment[as]=GNOME Keyring: SSH সহায়ক
+Comment[ast]=Depósitu de claves de GNOME: axente SSH
+Comment[be]=Вязкі ключоў GNOME: SSH-агент
+Comment[bg]=Ключодържател на GNOME: агент на SSH
+Comment[bn]=GNOME কী রিং: SSH এজেন্ট
+Comment[bn_IN]=GNOME Keyring: SSH এজেন্ট
+Comment[bs]=Gnomovi privjesci: SSH agent
+Comment[ca]=Anell de claus del GNOME: agent SSH
+Comment[ca@valencia]=Anell de claus del GNOME: agent SSH
+Comment[cs]=Klíčenka GNOME: Agent SSH
+Comment[da]=GNOME-nøgleringsdæmon: SSH-agent
+Comment[de]=GNOME-Schlüsselbunddienst: SSH-Agent
+Comment[el]=Κλειδοθήκη GNOME: Πράκτορας SSH
+Comment[en_GB]=GNOME Keyring: SSH Agent
+Comment[eo]=GNOME Ŝlosilaro: SSH-agento
+Comment[es]=Depósito de claves de GNOME: agente SSH
+Comment[et]=GNOME võtmerõngas: SSH-agent
+Comment[eu]=GNOMEren gako-sorta: SSH agentea
+Comment[fa]=دستهکلید گنوم: عامل SSH
+Comment[fi]=Gnomen avainnippu: SSH-agentti
+Comment[fr]=Trousseau de clés de GNOME : agent SSH
+Comment[fur]=Puarteclâfs di GNOME: agjent SSH
+Comment[gd]=Dul-iuchrach: Àidseant SSH
+Comment[gl]=GNOME Keyring: Axente SSH
+Comment[gu]=GNOME કીરીંગ: SSH ઍજન્ટ
+Comment[he]=קבוצת מפתחות של GNOME: סוכן SSH
+Comment[hi]=गनोम कीरिंग: SSH प्रतिनिधि
+Comment[hr]=GNOME skup ključeva: SSH agent
+Comment[hu]=GNOME kulcstartó – SSH-ügynök
+Comment[id]=Ring Kunci GNOME: Agen SSH
+Comment[it]=Portachiavi di GNOME: agente SSH
+Comment[ja]=GNOME キーリング: SSH エージェント
+Comment[kk]=GNOME Keyring: SSH агенті
+Comment[km]=GNOME Keyring ៖ ភ្នាក់ងារ SSH
+Comment[kn]=GNOME ಕೀಲಿಗೊಂಚಲು: SSH ಮಧ್ಯವರ್ತಿ
+Comment[ko]=그놈 키 모음: SSH 에이전트
+Comment[lt]=GNOME raktinė: SSH tarnyba
+Comment[lv]=GNOME atslēgu saišķis — SSH aģents
+Comment[mjw]=GNOME Keyring: SSH Agent
+Comment[mk]=Приврзок на GNOME: SSH агент
+Comment[ml]=ഗ്നോം കീറിങ്: എസ്എസ്എച് ഏജന്റ്
+Comment[mr]=GNOME किरिंग: SSH एजंट
+Comment[ms]=GNOME Keyring: Agen SSH
+Comment[nb]=GNOME nøkkelring: SSH-agent
+Comment[ne]=जिनोम किरिङ : SSH एजेन्ट
+Comment[nl]=Sleutelbos-service: SSH-agent
+Comment[nn]=GNOME Nøkkelring: SSH-agent
+Comment[oc]=Trossèl de claus GNOME : agent SSH
+Comment[or]=GNOME କି ରିଙ୍ଗ: SSH ସଦସ୍ୟ
+Comment[pa]=ਗਨੋਮ ਕੀਰਿੰਗ: SSH ਏਜੰਟ
+Comment[pl]=Baza kluczy dla środowiska GNOME: agent SSH
+Comment[pt]=GNOME Keyring: agente SSH
+Comment[pt_BR]=Chaveiro do GNOME: Agente SSH
+Comment[ro]=Inelul de chei GNOME: Agent SSH
+Comment[ru]=Связка ключей GNOME: SSH-агент
+Comment[sk]=SSH agent zväzku kľúčov GNOME
+Comment[sl]=Zbirka ključev GNOME: agent SSH
+Comment[sr]=Гномови привесци: ССХ агент
+Comment[sr@latin]=Gnomovi privesci: SSH agent
+Comment[sv]=GNOME-nyckelring: SSH-agent
+Comment[ta]=GNOME கீரிங்: SSH முகவர்
+Comment[te]=GNOME కీరింగ్: SSH వాహకం
+Comment[th]=พวงกุญแจของ GNOME: เอเจนต์ SSH
+Comment[tr]=GNOME Anahtarlığı: SSH Aracı
+Comment[ug]=گىنوم ئاچقۇچ ھالقىسى:SSH ياردەمچىسى
+Comment[uk]=Служба в'язки ключів GNOME: агент SSH
+Comment[vi]=Chùm chìa khóa GNOME: Đại diện SSH
+Comment[zh_CN]=GNOME 密钥环:SSH 代理
+Comment[zh_HK]=GNOME 密碼匙圈:SSH 代理程式
+Comment[zh_TW]=GNOME 鑰匙圈:SSH 代理程式
+Comment=GNOME Keyring: SSH Agent
+Exec=/usr/bin/gnome-keyring-daemon --start --components=ssh
+OnlyShowIn=GNOME;Unity;MATE;Cinnamon;
+X-GNOME-Autostart-Phase=PreDisplayServer
+X-GNOME-AutoRestart=false
+X-GNOME-Autostart-Notify=true
+X-GNOME-Bugzilla-Bugzilla=GNOME
+X-GNOME-Bugzilla-Product=gnome-keyring
+X-GNOME-Bugzilla-Component=general
+X-GNOME-Bugzilla-Version=3.34.0
+Hidden=true
diff --git a/bash/.bash_logout b/bash/.bash_logout
@@ -0,0 +1,3 @@
+#
+# ~/.bash_logout
+#
diff --git a/bash/.bash_profile b/bash/.bash_profile
@@ -0,0 +1 @@
+.profile+
\ No newline at end of file
diff --git a/bash/.bashrc b/bash/.bashrc
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+stty -ixon # Disable ctrl-s and ctrl-q.
+shopt -s autocd #Allows you to cd into directory merely by typing the directory name.
+
+# Infinite history.
+HISTSIZE=
+HISTFILESIZE=
+
+export PS1="\[$(tput bold)\]\[$(tput setaf 1)\][\[$(tput setaf 3)\]\u\[$(tput setaf 2)\]@\[$(tput setaf 4)\]\h \[$(tput setaf 5)\]\W\[$(tput setaf 1)\]]\[$(tput setaf 7)\]\\$ \[$(tput sgr0)\]"
+
+[ -f "$HOME/.config/shortcutrc" ] && source "$HOME/.config/shortcutrc" # Load shortcut aliases
+[ -f "$HOME/.config/aliasrc" ] && source "$HOME/.config/aliasrc"
+
+if [ ! -S ~/.ssh/ssh_auth_sock ]; then
+ eval `ssh-agent`
+ ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
+fi
+export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
+ssh-add -l > /dev/null || ssh-add
+
+# export PASSWORD_STORE_GPG_OPTS="--pinentry-mode loopback --passphrase YOUR_PASSPHRASE"
+
+# >>> conda initialize >>>
+# !! Contents within this block are managed by 'conda init' !!
+__conda_setup="$('/home/beau/sci/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
+if [ $? -eq 0 ]; then
+ eval "$__conda_setup"
+else
+ if [ -f "/home/beau/sci/miniconda3/etc/profile.d/conda.sh" ]; then
+ . "/home/beau/sci/miniconda3/etc/profile.d/conda.sh"
+ else
+ export PATH="/home/beau/sci/miniconda3/bin:$PATH"
+ fi
+fi
+unset __conda_setup
+# <<< conda initialize <<<
+
diff --git a/bmdirs b/bmdirs
@@ -0,0 +1,10 @@
+# You can add comments to these files with #
+h ~/
+d ~/dox
+D ~/dl
+m ~/tunes
+pp ~/pix
+vv ~/vids
+cf ~/.config
+sc ~/.local/bin
+mn /mnt
diff --git a/bmfiles b/bmfiles
@@ -0,0 +1,13 @@
+bf ~/.config/bmfiles
+bd ~/.config/bmdirs
+cfb ~/.bashrc
+cfa ~/.config/aliasrc
+cfz ~/.zshrc
+cfv ~/.config/nvim/init.vim
+cfm ~/.config/mutt/muttrc
+cfd ~/.Xdefaults
+cfu ~/.config/newsboat/urls
+cfn ~/.config/newsboat/config
+cfmb ~/.config/ncmpcpp/bindings
+cfmc ~/.config/ncmpcpp/config
+cfk ~/.config/sxhkd/sxhkdrc
diff --git a/calcurse/conf b/calcurse/conf
@@ -0,0 +1,33 @@
+appearance.calendarview=monthly
+appearance.compactpanels=no
+appearance.defaultpanel=calendar
+appearance.layout=7
+appearance.notifybar=yes
+appearance.sidebarwidth=1
+appearance.theme=red on default
+appearance.todoview=show-completed
+daemon.enable=no
+daemon.log=no
+format.inputdate=1
+format.notifydate=%a %F
+format.notifytime=%T
+format.outputdate=%D
+general.autogc=no
+general.autosave=yes
+general.confirmdelete=yes
+general.confirmquit=no
+general.firstdayofweek=sunday
+general.periodicsave=0
+general.systemdialogs=no
+notification.command=printf '\a'
+notification.notifyall=flagged-only
+notification.warning=300
+appearance.headerline=yes
+appearance.eventseparator=yes
+appearance.dayseparator=yes
+appearance.emptyline=yes
+appearance.emptyday=--
+appearance.headingpos=right-justified
+format.dayheading=%B %e, %Y
+general.multipledays=yes
+general.systemevents=yes
diff --git a/calcurse/keys b/calcurse/keys
@@ -0,0 +1,55 @@
+#
+# Calcurse keys configuration file
+#
+# In this file the keybindings used by Calcurse are defined.
+# It is generated automatically by Calcurse and is maintained
+# via the key configuration menu of the interactive user
+# interface. It should not be edited directly.
+
+generic-cancel ESC
+generic-select SPC
+generic-credits @
+generic-help ?
+generic-quit q Q
+generic-save s S ^S
+generic-reload R
+generic-copy c
+generic-paste p ^V
+generic-change-view TAB
+generic-import i I
+generic-export x X
+generic-goto g G
+generic-other-cmd o O
+generic-config-menu C
+generic-redraw ^R
+generic-add-appt ^A
+generic-add-todo ^T
+generic-prev-day T ^H
+generic-next-day t ^L
+generic-prev-week W ^K
+generic-next-week w RET
+generic-prev-month M
+generic-next-month m
+generic-prev-year Y
+generic-next-year y
+generic-scroll-down ^N
+generic-scroll-up ^P
+generic-goto-today ^G
+generic-command :
+move-right l L RGT
+move-left h H LFT
+move-down j J DWN
+move-up k K UP
+start-of-week 0
+end-of-week $
+add-item a A
+del-item d D
+edit-item e E
+view-item v V
+pipe-item |
+flag-item !
+repeat r
+edit-note n N
+view-note >
+raise-priority +
+lower-priority -
diff --git a/conda/.condarc b/conda/.condarc
@@ -0,0 +1,7 @@
+pkgs_dirs = $XDG_DATA_HOME/conda/pkgs
+envs_dirs = $XDG_DATA_HOME/conda/envs
+auto_activate_base: false
+channel_priority: strict
+channels:
+ - conda-forge
+ - defaults
diff --git a/configstore/update-notifier-npm.json b/configstore/update-notifier-npm.json
@@ -0,0 +1,4 @@
+{
+ "optOut": false,
+ "lastUpdateCheck": 1588593812780
+}+
\ No newline at end of file
diff --git a/cron/crontab.bak b/cron/crontab.bak
@@ -0,0 +1,33 @@
+### updates ##
+# sync mail
+*/10 * * * * export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus; export DISPLAY=:0; . $HOME/.profile; /usr/bin/mailsync
+# update music library
+0,15,30,45 * * * * /usr/bin/mpc update
+# download packages (but do not install)
+5 */3 * * * eval "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus"; /home/beau/.local/bin/cron/checkup
+# update newsboat
+10 */2 * * * eval "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus"; /home/beau/.local/bin/cron/newsup
+
+### backups ###
+
+# crontab backup
+9 15 * * * crontab -l > .config/cron/crontab.bak
+# newsboat read articles backup
+3 13 * * * newsboat -E "/home/beau/.config/newsboat/read_articles"
+# newsboat sync read articles
+2 14 * * * newsboat -I "/home/beau/.config/newsboat/read_articles"
+# regularly git push dotfiles
+7 16 * * * cd /home/beau/ ; git add -u ; git commit -m "crontab autocommit" ; git push
+
+################===YT-DL===################
+# Luke Smith
+#* */2 * * * cd /home/beau/vids/instructional/luke_smith && /bin/youtube-dl --add-metadata --download-archive '/home/beau/vids/instructional/luke_smith/downloadedxyz.txt' -f best -ciw -o "\%(upload_date)s_\%(uploader)s_\%(title)s.\%(ext)s" -v https://www.youtube.com/channel/UC2eYFnH61tmytImy1mTYvhA/ && rm *.part
+# fastai
+#* * */2 * * mkdir -p /home/beau/vids/instructional/fastai && cd /home/beau/vids/instructional/fastai && /bin/youtube-dl --add-metadata --download-archive '/home/beau/vids/instructional/fastai/downloadedfai.txt' -f best -ciw -o "\%(upload_date)s_\%(uploader)s_\%(title)s.\%(ext)s" -v https://www.youtube.com/playlist?list=PLfYUBJiXbdtSIJb-Qd3pw0cqCbkGeS0xn && rm *.part
+################===========################
+#
+# * * * * * export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus; export DISPLAY=:0; . $HOME/.profile; ~/.scripts/cron/newsup
+# */4 * * * * export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus; export DISPLAY=:0; . $HOME/.profile; ~/.scripts/cron/cronbat
+# */31 * * * * export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus; export DISPLAY=:0; . $HOME/.profile; ~/.scripts/cron/getforecast
+# 7 */3 * * * export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus; export DISPLAY=:0; . $HOME/.profile; ~/.scripts/cron/checkup
+# * * * * * ~/.scripts/cron/getforecast && /bin/echo "getforecast works!" >> /tmp/file && /bin/date >> /tmp/file
diff --git a/dunst/dunstrc b/dunst/dunstrc
@@ -0,0 +1,152 @@
+[global]
+ monitor = 0
+ follow = keyboard
+ geometry = "350x5-0+24"
+ indicate_hidden = yes
+ shrink = yes
+ transparency = 20
+ notification_height = 0
+ separator_height = 2
+ padding = 0
+ horizontal_padding = 8
+ frame_width = 3
+ frame_color = "#252525"
+
+ # Define a color for the separator.
+ # possible values are:
+ # * auto: dunst tries to find a color fitting to the background;
+ # * foreground: use the same color as the foreground;
+ # * frame: use the same color as the frame;
+ # * anything else will be interpreted as a X color.
+ separator_color = frame
+
+ # Sort messages by urgency.
+ sort = yes
+
+ idle_threshold = 120
+ font = Monospace 14
+ line_height = 0
+ markup = full
+
+ # The format of the message. Possible variables are:
+ # %a appname
+ # %s summary
+ # %b body
+ # %i iconname (including its path)
+ # %I iconname (without its path)
+ # %p progress value if set ([ 0%] to [100%]) or nothing
+ # %n progress value if set without any extra characters
+ # %% Literal %
+ # Markup is allowed
+ format = "<b>%s</b>\n%b"
+
+ alignment = left
+ show_age_threshold = 60
+ word_wrap = yes
+ ellipsize = middle
+ ignore_newline = no
+ stack_duplicates = true
+ hide_duplicate_count = true
+ show_indicators = yes
+ icon_position = left
+ max_icon_size = 40
+ #icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/:/usr/share/icons/Adwaita/256x256/status/
+ sticky_history = yes
+ history_length = 20
+ dmenu = /usr/bin/dmenu -p dunst:
+ browser = /usr/bin/chromium -new-tab
+
+ # Always run rule-defined scripts, even if the notification is suppressed
+ always_run_script = true
+
+ title = Dunst
+ class = Dunst
+ startup_notification = false
+ force_xinerama = false
+[experimental]
+ per_monitor_dpi = false
+
+[shortcuts]
+ close = ctrl+space
+ close_all = ctrl+shift+space
+ history = ctrl+grave
+ context = ctrl+shift+period
+
+[urgency_low]
+ # IMPORTANT: colors have to be defined in quotation marks.
+ # Otherwise the "#" and following would be interpreted as a comment.
+ background = "#282828"
+ foreground = "#928374"
+ timeout = 5
+ # Icon for notifications with low urgency, uncomment to enable
+ #icon = /path/to/icon
+
+[urgency_normal]
+ background = "#458588"
+ foreground = "#ebdbb2"
+ timeout = 5
+
+[urgency_critical]
+ background = "#cc2421"
+ foreground = "#ebdbb2"
+ frame_color = "#fabd2f"
+ timeout = 0
+
+# Every section that isn't one of the above is interpreted as a rules to
+# override settings for certain messages.
+# Messages can be matched by "appname", "summary", "body", "icon", "category",
+# "msg_urgency" and you can override the "timeout", "urgency", "foreground",
+# "background", "new_icon" and "format".
+# Shell-like globbing will get expanded.
+#
+# SCRIPTING
+# You can specify a script that gets run when the rule matches by
+# setting the "script" option.
+# The script will be called as follows:
+# script appname summary body icon urgency
+# where urgency can be "LOW", "NORMAL" or "CRITICAL".
+#
+# NOTE: if you don't want a notification to be displayed, set the format
+# to "".
+# NOTE: It might be helpful to run dunst -print in a terminal in order
+# to find fitting options for rules.
+
+#[espeak]
+# summary = "*"
+# script = dunst_espeak.sh
+
+#[script-test]
+# summary = "*script*"
+# script = dunst_test.sh
+
+#[ignore]
+# # This notification will not be displayed
+# summary = "foobar"
+# format = ""
+
+#[history-ignore]
+# # This notification will not be saved in history
+# summary = "foobar"
+# history_ignore = yes
+
+#[signed_on]
+# appname = Pidgin
+# summary = "*signed on*"
+# urgency = low
+#
+#[signed_off]
+# appname = Pidgin
+# summary = *signed off*
+# urgency = low
+#
+#[says]
+# appname = Pidgin
+# summary = *says*
+# urgency = critical
+#
+#[twitter]
+# appname = Pidgin
+# summary = *twitter.com*
+# urgency = normal
+#
+# vim: ft=cfg
diff --git a/emoji b/emoji
@@ -0,0 +1,1644 @@
+😀 grinning face; U+1F600
+😃 grinning face with big eyes; U+1F603
+😄 grinning face with smiling eyes; U+1F604
+😁 beaming face with smiling eyes; U+1F601
+😆 grinning squinting face; U+1F606
+😅 grinning face with sweat; U+1F605
+🤣 rolling on the floor laughing; U+1F923
+😂 face with tears of joy; U+1F602
+🙂 slightly smiling face; U+1F642
+🙃 upside-down face; U+1F643
+😉 winking face; U+1F609
+😊 smiling face with smiling eyes; U+1F60A
+😇 smiling face with halo; U+1F607
+🥰 smiling face with 3 hearts; U+1F970
+😍 smiling face with heart-eyes; U+1F60D
+🤩 star-struck; U+1F929
+😘 face blowing a kiss; U+1F618
+😗 kissing face; U+1F617
+☺ smiling face; U+263A
+😚 kissing face with closed eyes; U+1F61A
+😙 kissing face with smiling eyes; U+1F619
+😋 face savoring food; U+1F60B
+😛 face with tongue; U+1F61B
+😜 winking face with tongue; U+1F61C
+🤪 zany face; U+1F92A
+😝 squinting face with tongue; U+1F61D
+🤑 money-mouth face; U+1F911
+🤗 hugging face; U+1F917
+🤭 face with hand over mouth; U+1F92D
+🤫 shushing face; U+1F92B
+🤔 thinking face; U+1F914
+🤐 zipper-mouth face; U+1F910
+🤨 face with raised eyebrow; U+1F928
+😐 neutral face; U+1F610
+😑 expressionless face; U+1F611
+😶 face without mouth; U+1F636
+😏 smirking face; U+1F60F
+😒 unamused face; U+1F612
+🙄 face with rolling eyes; U+1F644
+😬 grimacing face; U+1F62C
+🤥 lying face; U+1F925
+😌 relieved face; U+1F60C
+😔 pensive face; U+1F614
+😪 sleepy face; U+1F62A
+🤤 drooling face; U+1F924
+😴 sleeping face; U+1F634
+😷 face with medical mask; U+1F637
+🤒 face with thermometer; U+1F912
+🤕 face with head-bandage; U+1F915
+🤢 nauseated face; U+1F922
+🤮 face vomiting; U+1F92E
+🤧 sneezing face; U+1F927
+🥵 hot face; U+1F975
+🥶 cold face; U+1F976
+🥴 woozy face; U+1F974
+😵 dizzy face; U+1F635
+🤯 exploding head; U+1F92F
+🤠 cowboy hat face; U+1F920
+🥳 partying face; U+1F973
+😎 smiling face with sunglasses; U+1F60E
+🤓 nerd face; U+1F913
+🧐 face with monocle; U+1F9D0
+😕 confused face; U+1F615
+😟 worried face; U+1F61F
+🙁 slightly frowning face; U+1F641
+☹ frowning face; U+2639
+😮 face with open mouth; U+1F62E
+😯 hushed face; U+1F62F
+😲 astonished face; U+1F632
+😳 flushed face; U+1F633
+🥺 pleading face; U+1F97A
+😦 frowning face with open mouth; U+1F626
+😧 anguished face; U+1F627
+😨 fearful face; U+1F628
+😰 anxious face with sweat; U+1F630
+😥 sad but relieved face; U+1F625
+😢 crying face; U+1F622
+😭 loudly crying face; U+1F62D
+😱 face screaming in fear; U+1F631
+😖 confounded face; U+1F616
+😣 persevering face; U+1F623
+😞 disappointed face; U+1F61E
+😓 downcast face with sweat; U+1F613
+😩 weary face; U+1F629
+😫 tired face; U+1F62B
+😤 face with steam from nose; U+1F624
+😡 pouting face; U+1F621
+😠 angry face; U+1F620
+🤬 face with symbols on mouth; U+1F92C
+😈 smiling face with horns; U+1F608
+👿 angry face with horns; U+1F47F
+💀 skull; U+1F480
+☠ skull and crossbones; U+2620
+💩 pile of poo; U+1F4A9
+🤡 clown face; U+1F921
+👹 ogre; U+1F479
+👺 goblin; U+1F47A
+👻 ghost; U+1F47B
+👽 alien; U+1F47D
+👾 alien monster; U+1F47E
+🤖 robot face; U+1F916
+😺 grinning cat face; U+1F63A
+😸 grinning cat face with smiling eyes; U+1F638
+😹 cat face with tears of joy; U+1F639
+😻 smiling cat face with heart-eyes; U+1F63B
+😼 cat face with wry smile; U+1F63C
+😽 kissing cat face; U+1F63D
+🙀 weary cat face; U+1F640
+😿 crying cat face; U+1F63F
+😾 pouting cat face; U+1F63E
+🙈 see-no-evil monkey; U+1F648
+🙉 hear-no-evil monkey; U+1F649
+🙊 speak-no-evil monkey; U+1F64A
+💋 kiss mark; U+1F48B
+💌 love letter; U+1F48C
+💘 heart with arrow; U+1F498
+💝 heart with ribbon; U+1F49D
+💖 sparkling heart; U+1F496
+💗 growing heart; U+1F497
+💓 beating heart; U+1F493
+💞 revolving hearts; U+1F49E
+💕 two hearts; U+1F495
+💟 heart decoration; U+1F49F
+❣ heavy heart exclamation; U+2763
+💔 broken heart; U+1F494
+❤ red heart; U+2764
+🧡 orange heart; U+1F9E1
+💛 yellow heart; U+1F49B
+💚 green heart; U+1F49A
+💙 blue heart; U+1F499
+💜 purple heart; U+1F49C
+🖤 black heart; U+1F5A4
+💯 hundred points; U+1F4AF
+💢 anger symbol; U+1F4A2
+💥 collision; U+1F4A5
+💫 dizzy; U+1F4AB
+💦 sweat droplets; U+1F4A6
+💨 dashing away; U+1F4A8
+🕳 hole; U+1F573
+💣 bomb; U+1F4A3
+💬 speech balloon; U+1F4AC
+👁️🗨️ eye in speech bubble; U+1F441 U+FE0F U+200D U+1F5E8 U+FE0F
+🗨 left speech bubble; U+1F5E8
+🗯 right anger bubble; U+1F5EF
+💭 thought balloon; U+1F4AD
+💤 zzz; U+1F4A4
+👋 waving hand; U+1F44B
+🤚 raised back of hand; U+1F91A
+🖐 hand with fingers splayed; U+1F590
+✋ raised hand; U+270B
+🖖 vulcan salute; U+1F596
+👌 OK hand; U+1F44C
+✌ victory hand; U+270C
+🤞 crossed fingers; U+1F91E
+🤟 love-you gesture; U+1F91F
+🤘 sign of the horns; U+1F918
+🤙 call me hand; U+1F919
+👈 backhand index pointing left; U+1F448
+👉 backhand index pointing right; U+1F449
+👆 backhand index pointing up; U+1F446
+🖕 middle finger; U+1F595
+👇 backhand index pointing down; U+1F447
+☝ index pointing up; U+261D
+👍 thumbs up; U+1F44D
+👎 thumbs down; U+1F44E
+✊ raised fist; U+270A
+👊 oncoming fist; U+1F44A
+🤛 left-facing fist; U+1F91B
+🤜 right-facing fist; U+1F91C
+👏 clapping hands; U+1F44F
+🙌 raising hands; U+1F64C
+👐 open hands; U+1F450
+🤲 palms up together; U+1F932
+🤝 handshake; U+1F91D
+🙏 folded hands; U+1F64F
+✍ writing hand; U+270D
+💅 nail polish; U+1F485
+🤳 selfie; U+1F933
+💪 flexed biceps; U+1F4AA
+🦵 leg; U+1F9B5
+🦶 foot; U+1F9B6
+👂 ear; U+1F442
+👃 nose; U+1F443
+🧠 brain; U+1F9E0
+🦷 tooth; U+1F9B7
+🦴 bone; U+1F9B4
+👀 eyes; U+1F440
+👁 eye; U+1F441
+👅 tongue; U+1F445
+👄 mouth; U+1F444
+👶 baby; U+1F476
+🧒 child; U+1F9D2
+👦 boy; U+1F466
+👧 girl; U+1F467
+🧑 person; U+1F9D1
+👱 person: blond hair; U+1F471
+👨 man; U+1F468
+👱♂️ man: blond hair; U+1F471 U+200D U+2642 U+FE0F
+👨🦰 man: red hair; U+1F468 U+200D U+1F9B0
+👨🦱 man: curly hair; U+1F468 U+200D U+1F9B1
+👨🦳 man: white hair; U+1F468 U+200D U+1F9B3
+👨🦲 man: bald; U+1F468 U+200D U+1F9B2
+🧔 man: beard; U+1F9D4
+👩 woman; U+1F469
+👱♀️ woman: blond hair; U+1F471 U+200D U+2640 U+FE0F
+👩🦰 woman: red hair; U+1F469 U+200D U+1F9B0
+👩🦱 woman: curly hair; U+1F469 U+200D U+1F9B1
+👩🦳 woman: white hair; U+1F469 U+200D U+1F9B3
+👩🦲 woman: bald; U+1F469 U+200D U+1F9B2
+🧓 older person; U+1F9D3
+👴 old man; U+1F474
+👵 old woman; U+1F475
+🙍 person frowning; U+1F64D
+🙍♂️ man frowning; U+1F64D U+200D U+2642 U+FE0F
+🙍♀️ woman frowning; U+1F64D U+200D U+2640 U+FE0F
+🙎 person pouting; U+1F64E
+🙎♂️ man pouting; U+1F64E U+200D U+2642 U+FE0F
+🙎♀️ woman pouting; U+1F64E U+200D U+2640 U+FE0F
+🙅 person gesturing NO; U+1F645
+🙅♂️ man gesturing NO; U+1F645 U+200D U+2642 U+FE0F
+🙅♀️ woman gesturing NO; U+1F645 U+200D U+2640 U+FE0F
+🙆 person gesturing OK; U+1F646
+🙆♂️ man gesturing OK; U+1F646 U+200D U+2642 U+FE0F
+🙆♀️ woman gesturing OK; U+1F646 U+200D U+2640 U+FE0F
+💁 person tipping hand; U+1F481
+💁♂️ man tipping hand; U+1F481 U+200D U+2642 U+FE0F
+💁♀️ woman tipping hand; U+1F481 U+200D U+2640 U+FE0F
+🙋 person raising hand; U+1F64B
+🙋♂️ man raising hand; U+1F64B U+200D U+2642 U+FE0F
+🙋♀️ woman raising hand; U+1F64B U+200D U+2640 U+FE0F
+🙇 person bowing; U+1F647
+🙇♂️ man bowing; U+1F647 U+200D U+2642 U+FE0F
+🙇♀️ woman bowing; U+1F647 U+200D U+2640 U+FE0F
+🤦 person facepalming; U+1F926
+🤦♂️ man facepalming; U+1F926 U+200D U+2642 U+FE0F
+🤦♀️ woman facepalming; U+1F926 U+200D U+2640 U+FE0F
+🤷 person shrugging; U+1F937
+🤷♂️ man shrugging; U+1F937 U+200D U+2642 U+FE0F
+🤷♀️ woman shrugging; U+1F937 U+200D U+2640 U+FE0F
+👨⚕️ man health worker; U+1F468 U+200D U+2695 U+FE0F
+👩⚕️ woman health worker; U+1F469 U+200D U+2695 U+FE0F
+👨🎓 man student; U+1F468 U+200D U+1F393
+👩🎓 woman student; U+1F469 U+200D U+1F393
+👨🏫 man teacher; U+1F468 U+200D U+1F3EB
+👩🏫 woman teacher; U+1F469 U+200D U+1F3EB
+👨⚖️ man judge; U+1F468 U+200D U+2696 U+FE0F
+👩⚖️ woman judge; U+1F469 U+200D U+2696 U+FE0F
+👨🌾 man farmer; U+1F468 U+200D U+1F33E
+👩🌾 woman farmer; U+1F469 U+200D U+1F33E
+👨🍳 man cook; U+1F468 U+200D U+1F373
+👩🍳 woman cook; U+1F469 U+200D U+1F373
+👨🔧 man mechanic; U+1F468 U+200D U+1F527
+👩🔧 woman mechanic; U+1F469 U+200D U+1F527
+👨🏭 man factory worker; U+1F468 U+200D U+1F3ED
+👩🏭 woman factory worker; U+1F469 U+200D U+1F3ED
+👨💼 man office worker; U+1F468 U+200D U+1F4BC
+👩💼 woman office worker; U+1F469 U+200D U+1F4BC
+👨🔬 man scientist; U+1F468 U+200D U+1F52C
+👩🔬 woman scientist; U+1F469 U+200D U+1F52C
+👨💻 man technologist; U+1F468 U+200D U+1F4BB
+👩💻 woman technologist; U+1F469 U+200D U+1F4BB
+👨🎤 man singer; U+1F468 U+200D U+1F3A4
+👩🎤 woman singer; U+1F469 U+200D U+1F3A4
+👨🎨 man artist; U+1F468 U+200D U+1F3A8
+👩🎨 woman artist; U+1F469 U+200D U+1F3A8
+👨✈️ man pilot; U+1F468 U+200D U+2708 U+FE0F
+👩✈️ woman pilot; U+1F469 U+200D U+2708 U+FE0F
+👨🚀 man astronaut; U+1F468 U+200D U+1F680
+👩🚀 woman astronaut; U+1F469 U+200D U+1F680
+👨🚒 man firefighter; U+1F468 U+200D U+1F692
+👩🚒 woman firefighter; U+1F469 U+200D U+1F692
+👮 police officer; U+1F46E
+👮♂️ man police officer; U+1F46E U+200D U+2642 U+FE0F
+👮♀️ woman police officer; U+1F46E U+200D U+2640 U+FE0F
+🕵 detective; U+1F575
+🕵️♂️ man detective; U+1F575 U+FE0F U+200D U+2642 U+FE0F
+🕵️♀️ woman detective; U+1F575 U+FE0F U+200D U+2640 U+FE0F
+💂 guard; U+1F482
+💂♂️ man guard; U+1F482 U+200D U+2642 U+FE0F
+💂♀️ woman guard; U+1F482 U+200D U+2640 U+FE0F
+👷 construction worker; U+1F477
+👷♂️ man construction worker; U+1F477 U+200D U+2642 U+FE0F
+👷♀️ woman construction worker; U+1F477 U+200D U+2640 U+FE0F
+🤴 prince; U+1F934
+👸 princess; U+1F478
+👳 person wearing turban; U+1F473
+👳♂️ man wearing turban; U+1F473 U+200D U+2642 U+FE0F
+👳♀️ woman wearing turban; U+1F473 U+200D U+2640 U+FE0F
+👲 man with Chinese cap; U+1F472
+🧕 woman with headscarf; U+1F9D5
+🤵 man in tuxedo; U+1F935
+👰 bride with veil; U+1F470
+🤰 pregnant woman; U+1F930
+🤱 breast-feeding; U+1F931
+👼 baby angel; U+1F47C
+🎅 Santa Claus; U+1F385
+🤶 Mrs. Claus; U+1F936
+🦸 superhero; U+1F9B8
+🦸♂️ man superhero; U+1F9B8 U+200D U+2642 U+FE0F
+🦸♀️ woman superhero; U+1F9B8 U+200D U+2640 U+FE0F
+🦹 supervillain; U+1F9B9
+🦹♂️ man supervillain; U+1F9B9 U+200D U+2642 U+FE0F
+🦹♀️ woman supervillain; U+1F9B9 U+200D U+2640 U+FE0F
+🧙 mage; U+1F9D9
+🧙♂️ man mage; U+1F9D9 U+200D U+2642 U+FE0F
+🧙♀️ woman mage; U+1F9D9 U+200D U+2640 U+FE0F
+🧚 fairy; U+1F9DA
+🧚♂️ man fairy; U+1F9DA U+200D U+2642 U+FE0F
+🧚♀️ woman fairy; U+1F9DA U+200D U+2640 U+FE0F
+🧛 vampire; U+1F9DB
+🧛♂️ man vampire; U+1F9DB U+200D U+2642 U+FE0F
+🧛♀️ woman vampire; U+1F9DB U+200D U+2640 U+FE0F
+🧜 merperson; U+1F9DC
+🧜♂️ merman; U+1F9DC U+200D U+2642 U+FE0F
+🧜♀️ mermaid; U+1F9DC U+200D U+2640 U+FE0F
+🧝 elf; U+1F9DD
+🧝♂️ man elf; U+1F9DD U+200D U+2642 U+FE0F
+🧝♀️ woman elf; U+1F9DD U+200D U+2640 U+FE0F
+🧞 genie; U+1F9DE
+🧞♂️ man genie; U+1F9DE U+200D U+2642 U+FE0F
+🧞♀️ woman genie; U+1F9DE U+200D U+2640 U+FE0F
+🧟 zombie; U+1F9DF
+🧟♂️ man zombie; U+1F9DF U+200D U+2642 U+FE0F
+🧟♀️ woman zombie; U+1F9DF U+200D U+2640 U+FE0F
+💆 person getting massage; U+1F486
+💆♂️ man getting massage; U+1F486 U+200D U+2642 U+FE0F
+💆♀️ woman getting massage; U+1F486 U+200D U+2640 U+FE0F
+💇 person getting haircut; U+1F487
+💇♂️ man getting haircut; U+1F487 U+200D U+2642 U+FE0F
+💇♀️ woman getting haircut; U+1F487 U+200D U+2640 U+FE0F
+🚶 person walking; U+1F6B6
+🚶♂️ man walking; U+1F6B6 U+200D U+2642 U+FE0F
+🚶♀️ woman walking; U+1F6B6 U+200D U+2640 U+FE0F
+🏃 person running; U+1F3C3
+🏃♂️ man running; U+1F3C3 U+200D U+2642 U+FE0F
+🏃♀️ woman running; U+1F3C3 U+200D U+2640 U+FE0F
+💃 woman dancing; U+1F483
+🕺 man dancing; U+1F57A
+🕴 man in suit levitating; U+1F574
+👯 people with bunny ears; U+1F46F
+👯♂️ men with bunny ears; U+1F46F U+200D U+2642 U+FE0F
+👯♀️ women with bunny ears; U+1F46F U+200D U+2640 U+FE0F
+🧖 person in steamy room; U+1F9D6
+🧖♂️ man in steamy room; U+1F9D6 U+200D U+2642 U+FE0F
+🧖♀️ woman in steamy room; U+1F9D6 U+200D U+2640 U+FE0F
+🧗 person climbing; U+1F9D7
+🧗♂️ man climbing; U+1F9D7 U+200D U+2642 U+FE0F
+🧗♀️ woman climbing; U+1F9D7 U+200D U+2640 U+FE0F
+🤺 person fencing; U+1F93A
+🏇 horse racing; U+1F3C7
+⛷ skier; U+26F7
+🏂 snowboarder; U+1F3C2
+🏌 person golfing; U+1F3CC
+🏌️♂️ man golfing; U+1F3CC U+FE0F U+200D U+2642 U+FE0F
+🏌️♀️ woman golfing; U+1F3CC U+FE0F U+200D U+2640 U+FE0F
+🏄 person surfing; U+1F3C4
+🏄♂️ man surfing; U+1F3C4 U+200D U+2642 U+FE0F
+🏄♀️ woman surfing; U+1F3C4 U+200D U+2640 U+FE0F
+🚣 person rowing boat; U+1F6A3
+🚣♂️ man rowing boat; U+1F6A3 U+200D U+2642 U+FE0F
+🚣♀️ woman rowing boat; U+1F6A3 U+200D U+2640 U+FE0F
+🏊 person swimming; U+1F3CA
+🏊♂️ man swimming; U+1F3CA U+200D U+2642 U+FE0F
+🏊♀️ woman swimming; U+1F3CA U+200D U+2640 U+FE0F
+⛹ person bouncing ball; U+26F9
+⛹️♂️ man bouncing ball; U+26F9 U+FE0F U+200D U+2642 U+FE0F
+⛹️♀️ woman bouncing ball; U+26F9 U+FE0F U+200D U+2640 U+FE0F
+🏋 person lifting weights; U+1F3CB
+🏋️♂️ man lifting weights; U+1F3CB U+FE0F U+200D U+2642 U+FE0F
+🏋️♀️ woman lifting weights; U+1F3CB U+FE0F U+200D U+2640 U+FE0F
+🚴 person biking; U+1F6B4
+🚴♂️ man biking; U+1F6B4 U+200D U+2642 U+FE0F
+🚴♀️ woman biking; U+1F6B4 U+200D U+2640 U+FE0F
+🚵 person mountain biking; U+1F6B5
+🚵♂️ man mountain biking; U+1F6B5 U+200D U+2642 U+FE0F
+🚵♀️ woman mountain biking; U+1F6B5 U+200D U+2640 U+FE0F
+🤸 person cartwheeling; U+1F938
+🤸♂️ man cartwheeling; U+1F938 U+200D U+2642 U+FE0F
+🤸♀️ woman cartwheeling; U+1F938 U+200D U+2640 U+FE0F
+🤼 people wrestling; U+1F93C
+🤼♂️ men wrestling; U+1F93C U+200D U+2642 U+FE0F
+🤼♀️ women wrestling; U+1F93C U+200D U+2640 U+FE0F
+🤽 person playing water polo; U+1F93D
+🤽♂️ man playing water polo; U+1F93D U+200D U+2642 U+FE0F
+🤽♀️ woman playing water polo; U+1F93D U+200D U+2640 U+FE0F
+🤾 person playing handball; U+1F93E
+🤾♂️ man playing handball; U+1F93E U+200D U+2642 U+FE0F
+🤾♀️ woman playing handball; U+1F93E U+200D U+2640 U+FE0F
+🤹 person juggling; U+1F939
+🤹♂️ man juggling; U+1F939 U+200D U+2642 U+FE0F
+🤹♀️ woman juggling; U+1F939 U+200D U+2640 U+FE0F
+🧘 person in lotus position; U+1F9D8
+🧘♂️ man in lotus position; U+1F9D8 U+200D U+2642 U+FE0F
+🧘♀️ woman in lotus position; U+1F9D8 U+200D U+2640 U+FE0F
+🛀 person taking bath; U+1F6C0
+🛌 person in bed; U+1F6CC
+👭 women holding hands; U+1F46D
+👫 woman and man holding hands; U+1F46B
+👬 men holding hands; U+1F46C
+💏 kiss; U+1F48F
+👩❤️💋👨 kiss: woman, man; U+1F469 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F468
+👨❤️💋👨 kiss: man, man; U+1F468 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F468
+👩❤️💋👩 kiss: woman, woman; U+1F469 U+200D U+2764 U+FE0F U+200D U+1F48B U+200D U+1F469
+💑 couple with heart; U+1F491
+👩❤️👨 couple with heart: woman, man; U+1F469 U+200D U+2764 U+FE0F U+200D U+1F468
+👨❤️👨 couple with heart: man, man; U+1F468 U+200D U+2764 U+FE0F U+200D U+1F468
+👩❤️👩 couple with heart: woman, woman; U+1F469 U+200D U+2764 U+FE0F U+200D U+1F469
+👪 family; U+1F46A
+👨👩👦 family: man, woman, boy; U+1F468 U+200D U+1F469 U+200D U+1F466
+👨👩👧 family: man, woman, girl; U+1F468 U+200D U+1F469 U+200D U+1F467
+👨👩👧👦 family: man, woman, girl, boy; U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466
+👨👩👦👦 family: man, woman, boy, boy; U+1F468 U+200D U+1F469 U+200D U+1F466 U+200D U+1F466
+👨👩👧👧 family: man, woman, girl, girl; U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F467
+👨👨👦 family: man, man, boy; U+1F468 U+200D U+1F468 U+200D U+1F466
+👨👨👧 family: man, man, girl; U+1F468 U+200D U+1F468 U+200D U+1F467
+👨👨👧👦 family: man, man, girl, boy; U+1F468 U+200D U+1F468 U+200D U+1F467 U+200D U+1F466
+👨👨👦👦 family: man, man, boy, boy; U+1F468 U+200D U+1F468 U+200D U+1F466 U+200D U+1F466
+👨👨👧👧 family: man, man, girl, girl; U+1F468 U+200D U+1F468 U+200D U+1F467 U+200D U+1F467
+👩👩👦 family: woman, woman, boy; U+1F469 U+200D U+1F469 U+200D U+1F466
+👩👩👧 family: woman, woman, girl; U+1F469 U+200D U+1F469 U+200D U+1F467
+👩👩👧👦 family: woman, woman, girl, boy; U+1F469 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466
+👩👩👦👦 family: woman, woman, boy, boy; U+1F469 U+200D U+1F469 U+200D U+1F466 U+200D U+1F466
+👩👩👧👧 family: woman, woman, girl, girl; U+1F469 U+200D U+1F469 U+200D U+1F467 U+200D U+1F467
+👨👦 family: man, boy; U+1F468 U+200D U+1F466
+👨👦👦 family: man, boy, boy; U+1F468 U+200D U+1F466 U+200D U+1F466
+👨👧 family: man, girl; U+1F468 U+200D U+1F467
+👨👧👦 family: man, girl, boy; U+1F468 U+200D U+1F467 U+200D U+1F466
+👨👧👧 family: man, girl, girl; U+1F468 U+200D U+1F467 U+200D U+1F467
+👩👦 family: woman, boy; U+1F469 U+200D U+1F466
+👩👦👦 family: woman, boy, boy; U+1F469 U+200D U+1F466 U+200D U+1F466
+👩👧 family: woman, girl; U+1F469 U+200D U+1F467
+👩👧👦 family: woman, girl, boy; U+1F469 U+200D U+1F467 U+200D U+1F466
+👩👧👧 family: woman, girl, girl; U+1F469 U+200D U+1F467 U+200D U+1F467
+🗣 speaking head; U+1F5E3
+👤 bust in silhouette; U+1F464
+👥 busts in silhouette; U+1F465
+👣 footprints; U+1F463
+🦰 red hair; U+1F9B0
+🦱 curly hair; U+1F9B1
+🦳 white hair; U+1F9B3
+🦲 bald; U+1F9B2
+🐵 monkey face; U+1F435
+🐒 monkey; U+1F412
+🦍 gorilla; U+1F98D
+🐶 dog face; U+1F436
+🐕 dog; U+1F415
+🐩 poodle; U+1F429
+🐺 wolf face; U+1F43A
+🦊 fox face; U+1F98A
+🦝 raccoon; U+1F99D
+🐱 cat face; U+1F431
+🐈 cat; U+1F408
+🦁 lion face; U+1F981
+🐯 tiger face; U+1F42F
+🐅 tiger; U+1F405
+🐆 leopard; U+1F406
+🐴 horse face; U+1F434
+🐎 horse; U+1F40E
+🦄 unicorn face; U+1F984
+🦓 zebra; U+1F993
+🦌 deer; U+1F98C
+🐮 cow face; U+1F42E
+🐂 ox; U+1F402
+🐃 water buffalo; U+1F403
+🐄 cow; U+1F404
+🐷 pig face; U+1F437
+🐖 pig; U+1F416
+🐗 boar; U+1F417
+🐽 pig nose; U+1F43D
+🐏 ram; U+1F40F
+🐑 ewe; U+1F411
+🐐 goat; U+1F410
+🐪 camel; U+1F42A
+🐫 two-hump camel; U+1F42B
+🦙 llama; U+1F999
+🦒 giraffe; U+1F992
+🐘 elephant; U+1F418
+🦏 rhinoceros; U+1F98F
+🦛 hippopotamus; U+1F99B
+🐭 mouse face; U+1F42D
+🐁 mouse; U+1F401
+🐀 rat; U+1F400
+🐹 hamster face; U+1F439
+🐰 rabbit face; U+1F430
+🐇 rabbit; U+1F407
+🐿 chipmunk; U+1F43F
+🦔 hedgehog; U+1F994
+🦇 bat; U+1F987
+🐻 bear face; U+1F43B
+🐨 koala; U+1F428
+🐼 panda face; U+1F43C
+🦘 kangaroo; U+1F998
+🦡 badger; U+1F9A1
+🐾 paw prints; U+1F43E
+🦃 turkey; U+1F983
+🐔 chicken; U+1F414
+🐓 rooster; U+1F413
+🐣 hatching chick; U+1F423
+🐤 baby chick; U+1F424
+🐥 front-facing baby chick; U+1F425
+🐦 bird; U+1F426
+🐧 penguin; U+1F427
+🕊 dove; U+1F54A
+🦅 eagle; U+1F985
+🦆 duck; U+1F986
+🦢 swan; U+1F9A2
+🦉 owl; U+1F989
+🦚 peacock; U+1F99A
+🦜 parrot; U+1F99C
+🐸 frog face; U+1F438
+🐊 crocodile; U+1F40A
+🐢 turtle; U+1F422
+🦎 lizard; U+1F98E
+🐍 snake; U+1F40D
+🐲 dragon face; U+1F432
+🐉 dragon; U+1F409
+🦕 sauropod; U+1F995
+🦖 T-Rex; U+1F996
+🐳 spouting whale; U+1F433
+🐋 whale; U+1F40B
+🐬 dolphin; U+1F42C
+🐟 fish; U+1F41F
+🐠 tropical fish; U+1F420
+🐡 blowfish; U+1F421
+🦈 shark; U+1F988
+🐙 octopus; U+1F419
+🐚 spiral shell; U+1F41A
+🐌 snail; U+1F40C
+🦋 butterfly; U+1F98B
+🐛 bug; U+1F41B
+🐜 ant; U+1F41C
+🐝 honeybee; U+1F41D
+🐞 lady beetle; U+1F41E
+🦗 cricket; U+1F997
+🕷 spider; U+1F577
+🕸 spider web; U+1F578
+🦂 scorpion; U+1F982
+🦟 mosquito; U+1F99F
+🦠 microbe; U+1F9A0
+💐 bouquet; U+1F490
+🌸 cherry blossom; U+1F338
+💮 white flower; U+1F4AE
+🏵 rosette; U+1F3F5
+🌹 rose; U+1F339
+🥀 wilted flower; U+1F940
+🌺 hibiscus; U+1F33A
+🌻 sunflower; U+1F33B
+🌼 blossom; U+1F33C
+🌷 tulip; U+1F337
+🌱 seedling; U+1F331
+🌲 evergreen tree; U+1F332
+🌳 deciduous tree; U+1F333
+🌴 palm tree; U+1F334
+🌵 cactus; U+1F335
+🌾 sheaf of rice; U+1F33E
+🌿 herb; U+1F33F
+☘ shamrock; U+2618
+🍀 four leaf clover; U+1F340
+🍁 maple leaf; U+1F341
+🍂 fallen leaf; U+1F342
+🍃 leaf fluttering in wind; U+1F343
+🍇 grapes; U+1F347
+🍈 melon; U+1F348
+🍉 watermelon; U+1F349
+🍊 tangerine; U+1F34A
+🍋 lemon; U+1F34B
+🍌 banana; U+1F34C
+🍍 pineapple; U+1F34D
+🥭 mango; U+1F96D
+🍎 red apple; U+1F34E
+🍏 green apple; U+1F34F
+🍐 pear; U+1F350
+🍑 peach; U+1F351
+🍒 cherries; U+1F352
+🍓 strawberry; U+1F353
+🥝 kiwi fruit; U+1F95D
+🍅 tomato; U+1F345
+🥥 coconut; U+1F965
+🥑 avocado; U+1F951
+🍆 eggplant; U+1F346
+🥔 potato; U+1F954
+🥕 carrot; U+1F955
+🌽 ear of corn; U+1F33D
+🌶 hot pepper; U+1F336
+🥒 cucumber; U+1F952
+🥬 leafy green; U+1F96C
+🥦 broccoli; U+1F966
+🍄 mushroom; U+1F344
+🥜 peanuts; U+1F95C
+🌰 chestnut; U+1F330
+🍞 bread; U+1F35E
+🥐 croissant; U+1F950
+🥖 baguette bread; U+1F956
+🥨 pretzel; U+1F968
+🥯 bagel; U+1F96F
+🥞 pancakes; U+1F95E
+🧀 cheese wedge; U+1F9C0
+🍖 meat on bone; U+1F356
+🍗 poultry leg; U+1F357
+🥩 cut of meat; U+1F969
+🥓 bacon; U+1F953
+🍔 hamburger; U+1F354
+🍟 french fries; U+1F35F
+🍕 pizza; U+1F355
+🌭 hot dog; U+1F32D
+🥪 sandwich; U+1F96A
+🌮 taco; U+1F32E
+🌯 burrito; U+1F32F
+🥙 stuffed flatbread; U+1F959
+🥚 egg; U+1F95A
+🍳 cooking; U+1F373
+🥘 shallow pan of food; U+1F958
+🍲 pot of food; U+1F372
+🥣 bowl with spoon; U+1F963
+🥗 green salad; U+1F957
+🍿 popcorn; U+1F37F
+🧂 salt; U+1F9C2
+🥫 canned food; U+1F96B
+🍱 bento box; U+1F371
+🍘 rice cracker; U+1F358
+🍙 rice ball; U+1F359
+🍚 cooked rice; U+1F35A
+🍛 curry rice; U+1F35B
+🍜 steaming bowl; U+1F35C
+🍝 spaghetti; U+1F35D
+🍠 roasted sweet potato; U+1F360
+🍢 oden; U+1F362
+🍣 sushi; U+1F363
+🍤 fried shrimp; U+1F364
+🍥 fish cake with swirl; U+1F365
+🥮 moon cake; U+1F96E
+🍡 dango; U+1F361
+🥟 dumpling; U+1F95F
+🥠 fortune cookie; U+1F960
+🥡 takeout box; U+1F961
+🦀 crab; U+1F980
+🦞 lobster; U+1F99E
+🦐 shrimp; U+1F990
+🦑 squid; U+1F991
+🍦 soft ice cream; U+1F366
+🍧 shaved ice; U+1F367
+🍨 ice cream; U+1F368
+🍩 doughnut; U+1F369
+🍪 cookie; U+1F36A
+🎂 birthday cake; U+1F382
+🍰 shortcake; U+1F370
+🧁 cupcake; U+1F9C1
+🥧 pie; U+1F967
+🍫 chocolate bar; U+1F36B
+🍬 candy; U+1F36C
+🍭 lollipop; U+1F36D
+🍮 custard; U+1F36E
+🍯 honey pot; U+1F36F
+🍼 baby bottle; U+1F37C
+🥛 glass of milk; U+1F95B
+☕ hot beverage; U+2615
+🍵 teacup without handle; U+1F375
+🍶 sake; U+1F376
+🍾 bottle with popping cork; U+1F37E
+🍷 wine glass; U+1F377
+🍸 cocktail glass; U+1F378
+🍹 tropical drink; U+1F379
+🍺 beer mug; U+1F37A
+🍻 clinking beer mugs; U+1F37B
+🥂 clinking glasses; U+1F942
+🥃 tumbler glass; U+1F943
+🥤 cup with straw; U+1F964
+🥢 chopsticks; U+1F962
+🍽 fork and knife with plate; U+1F37D
+🍴 fork and knife; U+1F374
+🥄 spoon; U+1F944
+🔪 kitchen knife; U+1F52A
+🏺 amphora; U+1F3FA
+🌍 globe showing Europe-Africa; U+1F30D
+🌎 globe showing Americas; U+1F30E
+🌏 globe showing Asia-Australia; U+1F30F
+🌐 globe with meridians; U+1F310
+🗺 world map; U+1F5FA
+🗾 map of Japan; U+1F5FE
+🧭 compass; U+1F9ED
+🏔 snow-capped mountain; U+1F3D4
+⛰ mountain; U+26F0
+🌋 volcano; U+1F30B
+🗻 mount fuji; U+1F5FB
+🏕 camping; U+1F3D5
+🏖 beach with umbrella; U+1F3D6
+🏜 desert; U+1F3DC
+🏝 desert island; U+1F3DD
+🏞 national park; U+1F3DE
+🏟 stadium; U+1F3DF
+🏛 classical building; U+1F3DB
+🏗 building construction; U+1F3D7
+🧱 brick; U+1F9F1
+🏘 houses; U+1F3D8
+🏚 derelict house; U+1F3DA
+🏠 house; U+1F3E0
+🏡 house with garden; U+1F3E1
+🏢 office building; U+1F3E2
+🏣 Japanese post office; U+1F3E3
+🏤 post office; U+1F3E4
+🏥 hospital; U+1F3E5
+🏦 bank; U+1F3E6
+🏨 hotel; U+1F3E8
+🏩 love hotel; U+1F3E9
+🏪 convenience store; U+1F3EA
+🏫 school; U+1F3EB
+🏬 department store; U+1F3EC
+🏭 factory; U+1F3ED
+🏯 Japanese castle; U+1F3EF
+🏰 castle; U+1F3F0
+💒 wedding; U+1F492
+🗼 Tokyo tower; U+1F5FC
+🗽 Statue of Liberty; U+1F5FD
+⛪ church; U+26EA
+🕌 mosque; U+1F54C
+🕍 synagogue; U+1F54D
+⛩ shinto shrine; U+26E9
+🕋 kaaba; U+1F54B
+⛲ fountain; U+26F2
+⛺ tent; U+26FA
+🌁 foggy; U+1F301
+🌃 night with stars; U+1F303
+🏙 cityscape; U+1F3D9
+🌄 sunrise over mountains; U+1F304
+🌅 sunrise; U+1F305
+🌆 cityscape at dusk; U+1F306
+🌇 sunset; U+1F307
+🌉 bridge at night; U+1F309
+♨ hot springs; U+2668
+🌌 milky way; U+1F30C
+🎠 carousel horse; U+1F3A0
+🎡 ferris wheel; U+1F3A1
+🎢 roller coaster; U+1F3A2
+💈 barber pole; U+1F488
+🎪 circus tent; U+1F3AA
+🚂 locomotive; U+1F682
+🚃 railway car; U+1F683
+🚄 high-speed train; U+1F684
+🚅 bullet train; U+1F685
+🚆 train; U+1F686
+🚇 metro; U+1F687
+🚈 light rail; U+1F688
+🚉 station; U+1F689
+🚊 tram; U+1F68A
+🚝 monorail; U+1F69D
+🚞 mountain railway; U+1F69E
+🚋 tram car; U+1F68B
+🚌 bus; U+1F68C
+🚍 oncoming bus; U+1F68D
+🚎 trolleybus; U+1F68E
+🚐 minibus; U+1F690
+🚑 ambulance; U+1F691
+🚒 fire engine; U+1F692
+🚓 police car; U+1F693
+🚔 oncoming police car; U+1F694
+🚕 taxi; U+1F695
+🚖 oncoming taxi; U+1F696
+🚗 automobile; U+1F697
+🚘 oncoming automobile; U+1F698
+🚙 sport utility vehicle; U+1F699
+🚚 delivery truck; U+1F69A
+🚛 articulated lorry; U+1F69B
+🚜 tractor; U+1F69C
+🏎 racing car; U+1F3CE
+🏍 motorcycle; U+1F3CD
+🛵 motor scooter; U+1F6F5
+🚲 bicycle; U+1F6B2
+🛴 kick scooter; U+1F6F4
+🛹 skateboard; U+1F6F9
+🚏 bus stop; U+1F68F
+🛣 motorway; U+1F6E3
+🛤 railway track; U+1F6E4
+🛢 oil drum; U+1F6E2
+⛽ fuel pump; U+26FD
+🚨 police car light; U+1F6A8
+🚥 horizontal traffic light; U+1F6A5
+🚦 vertical traffic light; U+1F6A6
+🛑 stop sign; U+1F6D1
+🚧 construction; U+1F6A7
+⚓ anchor; U+2693
+⛵ sailboat; U+26F5
+🛶 canoe; U+1F6F6
+🚤 speedboat; U+1F6A4
+🛳 passenger ship; U+1F6F3
+⛴ ferry; U+26F4
+🛥 motor boat; U+1F6E5
+🚢 ship; U+1F6A2
+✈ airplane; U+2708
+🛩 small airplane; U+1F6E9
+🛫 airplane departure; U+1F6EB
+🛬 airplane arrival; U+1F6EC
+💺 seat; U+1F4BA
+🚁 helicopter; U+1F681
+🚟 suspension railway; U+1F69F
+🚠 mountain cableway; U+1F6A0
+🚡 aerial tramway; U+1F6A1
+🛰 satellite; U+1F6F0
+🚀 rocket; U+1F680
+🛸 flying saucer; U+1F6F8
+🛎 bellhop bell; U+1F6CE
+🧳 luggage; U+1F9F3
+⌛ hourglass done; U+231B
+⏳ hourglass not done; U+23F3
+⌚ watch; U+231A
+⏰ alarm clock; U+23F0
+⏱ stopwatch; U+23F1
+⏲ timer clock; U+23F2
+🕰 mantelpiece clock; U+1F570
+🕛 twelve o’clock; U+1F55B
+🕧 twelve-thirty; U+1F567
+🕐 one o’clock; U+1F550
+🕜 one-thirty; U+1F55C
+🕑 two o’clock; U+1F551
+🕝 two-thirty; U+1F55D
+🕒 three o’clock; U+1F552
+🕞 three-thirty; U+1F55E
+🕓 four o’clock; U+1F553
+🕟 four-thirty; U+1F55F
+🕔 five o’clock; U+1F554
+🕠 five-thirty; U+1F560
+🕕 six o’clock; U+1F555
+🕡 six-thirty; U+1F561
+🕖 seven o’clock; U+1F556
+🕢 seven-thirty; U+1F562
+🕗 eight o’clock; U+1F557
+🕣 eight-thirty; U+1F563
+🕘 nine o’clock; U+1F558
+🕤 nine-thirty; U+1F564
+🕙 ten o’clock; U+1F559
+🕥 ten-thirty; U+1F565
+🕚 eleven o’clock; U+1F55A
+🕦 eleven-thirty; U+1F566
+🌑 new moon; U+1F311
+🌒 waxing crescent moon; U+1F312
+🌓 first quarter moon; U+1F313
+🌔 waxing gibbous moon; U+1F314
+🌕 full moon; U+1F315
+🌖 waning gibbous moon; U+1F316
+🌗 last quarter moon; U+1F317
+🌘 waning crescent moon; U+1F318
+🌙 crescent moon; U+1F319
+🌚 new moon face; U+1F31A
+🌛 first quarter moon face; U+1F31B
+🌜 last quarter moon face; U+1F31C
+🌡 thermometer; U+1F321
+☀ sun; U+2600
+🌝 full moon face; U+1F31D
+🌞 sun with face; U+1F31E
+⭐ star; U+2B50
+🌟 glowing star; U+1F31F
+🌠 shooting star; U+1F320
+☁ cloud; U+2601
+⛅ sun behind cloud; U+26C5
+⛈ cloud with lightning and rain; U+26C8
+🌤 sun behind small cloud; U+1F324
+🌥 sun behind large cloud; U+1F325
+🌦 sun behind rain cloud; U+1F326
+🌧 cloud with rain; U+1F327
+🌨 cloud with snow; U+1F328
+🌩 cloud with lightning; U+1F329
+🌪 tornado; U+1F32A
+🌫 fog; U+1F32B
+🌬 wind face; U+1F32C
+🌀 cyclone; U+1F300
+🌈 rainbow; U+1F308
+🌂 closed umbrella; U+1F302
+☂ umbrella; U+2602
+☔ umbrella with rain drops; U+2614
+⛱ umbrella on ground; U+26F1
+⚡ high voltage; U+26A1
+❄ snowflake; U+2744
+☃ snowman; U+2603
+⛄ snowman without snow; U+26C4
+☄ comet; U+2604
+🔥 fire; U+1F525
+💧 droplet; U+1F4A7
+🌊 water wave; U+1F30A
+🎃 jack-o-lantern; U+1F383
+🎄 Christmas tree; U+1F384
+🎆 fireworks; U+1F386
+🎇 sparkler; U+1F387
+🧨 firecracker; U+1F9E8
+✨ sparkles; U+2728
+🎈 balloon; U+1F388
+🎉 party popper; U+1F389
+🎊 confetti ball; U+1F38A
+🎋 tanabata tree; U+1F38B
+🎍 pine decoration; U+1F38D
+🎎 Japanese dolls; U+1F38E
+🎏 carp streamer; U+1F38F
+🎐 wind chime; U+1F390
+🎑 moon viewing ceremony; U+1F391
+🧧 red envelope; U+1F9E7
+🎀 ribbon; U+1F380
+🎁 wrapped gift; U+1F381
+🎗 reminder ribbon; U+1F397
+🎟 admission tickets; U+1F39F
+🎫 ticket; U+1F3AB
+🎖 military medal; U+1F396
+🏆 trophy; U+1F3C6
+🏅 sports medal; U+1F3C5
+1st place medal; U+1F947 🥇
+2nd place medal; U+1F948 🥈
+3rd place medal; U+1F949 🥉
+⚽ soccer ball; U+26BD
+⚾ baseball; U+26BE
+🥎 softball; U+1F94E
+🏀 basketball; U+1F3C0
+🏐 volleyball; U+1F3D0
+🏈 american football; U+1F3C8
+🏉 rugby football; U+1F3C9
+🎾 tennis; U+1F3BE
+🥏 flying disc; U+1F94F
+🎳 bowling; U+1F3B3
+🏏 cricket game; U+1F3CF
+🏑 field hockey; U+1F3D1
+🏒 ice hockey; U+1F3D2
+🥍 lacrosse; U+1F94D
+🏓 ping pong; U+1F3D3
+🏸 badminton; U+1F3F8
+🥊 boxing glove; U+1F94A
+🥋 martial arts uniform; U+1F94B
+🥅 goal net; U+1F945
+⛳ flag in hole; U+26F3
+⛸ ice skate; U+26F8
+🎣 fishing pole; U+1F3A3
+🎽 running shirt; U+1F3BD
+🎿 skis; U+1F3BF
+🛷 sled; U+1F6F7
+🥌 curling stone; U+1F94C
+🎯 direct hit; U+1F3AF
+🎱 pool 8 ball; U+1F3B1
+🔮 crystal ball; U+1F52E
+🧿 nazar amulet; U+1F9FF
+🎮 video game; U+1F3AE
+🕹 joystick; U+1F579
+🎰 slot machine; U+1F3B0
+🎲 game die; U+1F3B2
+🧩 jigsaw; U+1F9E9
+🧸 teddy bear; U+1F9F8
+♠ spade suit; U+2660
+♥ heart suit; U+2665
+♦ diamond suit; U+2666
+♣ club suit; U+2663
+♟ chess pawn; U+265F
+🃏 joker; U+1F0CF
+🀄 mahjong red dragon; U+1F004
+🎴 flower playing cards; U+1F3B4
+🎭 performing arts; U+1F3AD
+🖼 framed picture; U+1F5BC
+🎨 artist palette; U+1F3A8
+🧵 thread; U+1F9F5
+🧶 yarn; U+1F9F6
+👓 glasses; U+1F453
+🕶 sunglasses; U+1F576
+🥽 goggles; U+1F97D
+🥼 lab coat; U+1F97C
+👔 necktie; U+1F454
+👕 t-shirt; U+1F455
+👖 jeans; U+1F456
+🧣 scarf; U+1F9E3
+🧤 gloves; U+1F9E4
+🧥 coat; U+1F9E5
+🧦 socks; U+1F9E6
+👗 dress; U+1F457
+👘 kimono; U+1F458
+👙 bikini; U+1F459
+👚 woman’s clothes; U+1F45A
+👛 purse; U+1F45B
+👜 handbag; U+1F45C
+👝 clutch bag; U+1F45D
+🛍 shopping bags; U+1F6CD
+🎒 backpack; U+1F392
+👞 man’s shoe; U+1F45E
+👟 running shoe; U+1F45F
+🥾 hiking boot; U+1F97E
+🥿 flat shoe; U+1F97F
+👠 high-heeled shoe; U+1F460
+👡 woman’s sandal; U+1F461
+👢 woman’s boot; U+1F462
+👑 crown; U+1F451
+👒 woman’s hat; U+1F452
+🎩 top hat; U+1F3A9
+🎓 graduation cap; U+1F393
+🧢 billed cap; U+1F9E2
+⛑ rescue worker’s helmet; U+26D1
+📿 prayer beads; U+1F4FF
+💄 lipstick; U+1F484
+💍 ring; U+1F48D
+💎 gem stone; U+1F48E
+🔇 muted speaker; U+1F507
+🔈 speaker low volume; U+1F508
+🔉 speaker medium volume; U+1F509
+🔊 speaker high volume; U+1F50A
+📢 loudspeaker; U+1F4E2
+📣 megaphone; U+1F4E3
+📯 postal horn; U+1F4EF
+🔔 bell; U+1F514
+🔕 bell with slash; U+1F515
+🎼 musical score; U+1F3BC
+🎵 musical note; U+1F3B5
+🎶 musical notes; U+1F3B6
+🎙 studio microphone; U+1F399
+🎚 level slider; U+1F39A
+🎛 control knobs; U+1F39B
+🎤 microphone; U+1F3A4
+🎧 headphone; U+1F3A7
+📻 radio; U+1F4FB
+🎷 saxophone; U+1F3B7
+🎸 guitar; U+1F3B8
+🎹 musical keyboard; U+1F3B9
+🎺 trumpet; U+1F3BA
+🎻 violin; U+1F3BB
+🥁 drum; U+1F941
+📱 mobile phone; U+1F4F1
+📲 mobile phone with arrow; U+1F4F2
+☎ telephone; U+260E
+📞 telephone receiver; U+1F4DE
+📟 pager; U+1F4DF
+📠 fax machine; U+1F4E0
+🔋 battery; U+1F50B
+🔌 electric plug; U+1F50C
+💻 laptop computer; U+1F4BB
+🖥 desktop computer; U+1F5A5
+🖨 printer; U+1F5A8
+⌨ keyboard; U+2328
+🖱 computer mouse; U+1F5B1
+🖲 trackball; U+1F5B2
+💽 computer disk; U+1F4BD
+💾 floppy disk; U+1F4BE
+💿 optical disk; U+1F4BF
+📀 dvd; U+1F4C0
+🧮 abacus; U+1F9EE
+🎥 movie camera; U+1F3A5
+🎞 film frames; U+1F39E
+📽 film projector; U+1F4FD
+🎬 clapper board; U+1F3AC
+📺 television; U+1F4FA
+📷 camera; U+1F4F7
+📸 camera with flash; U+1F4F8
+📹 video camera; U+1F4F9
+📼 videocassette; U+1F4FC
+🔍 magnifying glass tilted left; U+1F50D
+🔎 magnifying glass tilted right; U+1F50E
+🕯 candle; U+1F56F
+💡 light bulb; U+1F4A1
+🔦 flashlight; U+1F526
+🏮 red paper lantern; U+1F3EE
+📔 notebook with decorative cover; U+1F4D4
+📕 closed book; U+1F4D5
+📖 open book; U+1F4D6
+📗 green book; U+1F4D7
+📘 blue book; U+1F4D8
+📙 orange book; U+1F4D9
+📚 books; U+1F4DA
+📓 notebook; U+1F4D3
+📒 ledger; U+1F4D2
+📃 page with curl; U+1F4C3
+📜 scroll; U+1F4DC
+📄 page facing up; U+1F4C4
+📰 newspaper; U+1F4F0
+🗞 rolled-up newspaper; U+1F5DE
+📑 bookmark tabs; U+1F4D1
+🔖 bookmark; U+1F516
+🏷 label; U+1F3F7
+💰 money bag; U+1F4B0
+💴 yen banknote; U+1F4B4
+💵 dollar banknote; U+1F4B5
+💶 euro banknote; U+1F4B6
+💷 pound banknote; U+1F4B7
+💸 money with wings; U+1F4B8
+💳 credit card; U+1F4B3
+🧾 receipt; U+1F9FE
+💹 chart increasing with yen; U+1F4B9
+💱 currency exchange; U+1F4B1
+💲 heavy dollar sign; U+1F4B2
+✉ envelope; U+2709
+📧 e-mail; U+1F4E7
+📨 incoming envelope; U+1F4E8
+📩 envelope with arrow; U+1F4E9
+📤 outbox tray; U+1F4E4
+📥 inbox tray; U+1F4E5
+📦 package; U+1F4E6
+📫 closed mailbox with raised flag; U+1F4EB
+📪 closed mailbox with lowered flag; U+1F4EA
+📬 open mailbox with raised flag; U+1F4EC
+📭 open mailbox with lowered flag; U+1F4ED
+📮 postbox; U+1F4EE
+🗳 ballot box with ballot; U+1F5F3
+✏ pencil; U+270F
+✒ black nib; U+2712
+🖋 fountain pen; U+1F58B
+🖊 pen; U+1F58A
+🖌 paintbrush; U+1F58C
+🖍 crayon; U+1F58D
+📝 memo; U+1F4DD
+💼 briefcase; U+1F4BC
+📁 file folder; U+1F4C1
+📂 open file folder; U+1F4C2
+🗂 card index dividers; U+1F5C2
+📅 calendar; U+1F4C5
+📆 tear-off calendar; U+1F4C6
+🗒 spiral notepad; U+1F5D2
+🗓 spiral calendar; U+1F5D3
+📇 card index; U+1F4C7
+📈 chart increasing; U+1F4C8
+📉 chart decreasing; U+1F4C9
+📊 bar chart; U+1F4CA
+📋 clipboard; U+1F4CB
+📌 pushpin; U+1F4CC
+📍 round pushpin; U+1F4CD
+📎 paperclip; U+1F4CE
+🖇 linked paperclips; U+1F587
+📏 straight ruler; U+1F4CF
+📐 triangular ruler; U+1F4D0
+✂ scissors; U+2702
+🗃 card file box; U+1F5C3
+🗄 file cabinet; U+1F5C4
+🗑 wastebasket; U+1F5D1
+🔒 locked; U+1F512
+🔓 unlocked; U+1F513
+🔏 locked with pen; U+1F50F
+🔐 locked with key; U+1F510
+🔑 key; U+1F511
+🗝 old key; U+1F5DD
+🔨 hammer; U+1F528
+⛏ pick; U+26CF
+⚒ hammer and pick; U+2692
+🛠 hammer and wrench; U+1F6E0
+🗡 dagger; U+1F5E1
+⚔ crossed swords; U+2694
+🔫 pistol; U+1F52B
+🏹 bow and arrow; U+1F3F9
+🛡 shield; U+1F6E1
+🔧 wrench; U+1F527
+🔩 nut and bolt; U+1F529
+⚙ gear; U+2699
+🗜 clamp; U+1F5DC
+⚖ balance scale; U+2696
+🔗 link; U+1F517
+⛓ chains; U+26D3
+🧰 toolbox; U+1F9F0
+🧲 magnet; U+1F9F2
+⚗ alembic; U+2697
+🧪 test tube; U+1F9EA
+🧫 petri dish; U+1F9EB
+🧬 dna; U+1F9EC
+🔬 microscope; U+1F52C
+🔭 telescope; U+1F52D
+📡 satellite antenna; U+1F4E1
+💉 syringe; U+1F489
+💊 pill; U+1F48A
+🚪 door; U+1F6AA
+🛏 bed; U+1F6CF
+🛋 couch and lamp; U+1F6CB
+🚽 toilet; U+1F6BD
+🚿 shower; U+1F6BF
+🛁 bathtub; U+1F6C1
+🧴 lotion bottle; U+1F9F4
+🧷 safety pin; U+1F9F7
+🧹 broom; U+1F9F9
+🧺 basket; U+1F9FA
+🧻 roll of paper; U+1F9FB
+🧼 soap; U+1F9FC
+🧽 sponge; U+1F9FD
+🧯 fire extinguisher; U+1F9EF
+🛒 shopping cart; U+1F6D2
+🚬 cigarette; U+1F6AC
+⚰ coffin; U+26B0
+⚱ funeral urn; U+26B1
+🗿 moai; U+1F5FF
+🏧 ATM sign; U+1F3E7
+🚮 litter in bin sign; U+1F6AE
+🚰 potable water; U+1F6B0
+♿ wheelchair symbol; U+267F
+🚹 men’s room; U+1F6B9
+🚺 women’s room; U+1F6BA
+🚻 restroom; U+1F6BB
+🚼 baby symbol; U+1F6BC
+🚾 water closet; U+1F6BE
+🛂 passport control; U+1F6C2
+🛃 customs; U+1F6C3
+🛄 baggage claim; U+1F6C4
+🛅 left luggage; U+1F6C5
+⚠ warning; U+26A0
+🚸 children crossing; U+1F6B8
+⛔ no entry; U+26D4
+🚫 prohibited; U+1F6AB
+🚳 no bicycles; U+1F6B3
+🚭 no smoking; U+1F6AD
+🚯 no littering; U+1F6AF
+🚱 non-potable water; U+1F6B1
+🚷 no pedestrians; U+1F6B7
+📵 no mobile phones; U+1F4F5
+🔞 no one under eighteen; U+1F51E
+☢ radioactive; U+2622
+☣ biohazard; U+2623
+⬆ up arrow; U+2B06
+↗ up-right arrow; U+2197
+➡ right arrow; U+27A1
+↘ down-right arrow; U+2198
+⬇ down arrow; U+2B07
+↙ down-left arrow; U+2199
+⬅ left arrow; U+2B05
+↖ up-left arrow; U+2196
+↕ up-down arrow; U+2195
+↔ left-right arrow; U+2194
+↩ right arrow curving left; U+21A9
+↪ left arrow curving right; U+21AA
+⤴ right arrow curving up; U+2934
+⤵ right arrow curving down; U+2935
+🔃 clockwise vertical arrows; U+1F503
+🔄 counterclockwise arrows button; U+1F504
+🔙 BACK arrow; U+1F519
+🔚 END arrow; U+1F51A
+🔛 ON! arrow; U+1F51B
+🔜 SOON arrow; U+1F51C
+🔝 TOP arrow; U+1F51D
+🛐 place of worship; U+1F6D0
+⚛ atom symbol; U+269B
+🕉 om; U+1F549
+✡ star of David; U+2721
+☸ wheel of dharma; U+2638
+☯ yin yang; U+262F
+✝ latin cross; U+271D
+☦ orthodox cross; U+2626
+☪ star and crescent; U+262A
+☮ peace symbol; U+262E
+🕎 menorah; U+1F54E
+🔯 dotted six-pointed star; U+1F52F
+♈ Aries; U+2648
+♉ Taurus; U+2649
+♊ Gemini; U+264A
+♋ Cancer; U+264B
+♌ Leo; U+264C
+♍ Virgo; U+264D
+♎ Libra; U+264E
+♏ Scorpio; U+264F
+♐ Sagittarius; U+2650
+♑ Capricorn; U+2651
+♒ Aquarius; U+2652
+♓ Pisces; U+2653
+⛎ Ophiuchus; U+26CE
+🔀 shuffle tracks button; U+1F500
+🔁 repeat button; U+1F501
+🔂 repeat single button; U+1F502
+▶ play button; U+25B6
+⏩ fast-forward button; U+23E9
+⏭ next track button; U+23ED
+⏯ play or pause button; U+23EF
+◀ reverse button; U+25C0
+⏪ fast reverse button; U+23EA
+⏮ last track button; U+23EE
+🔼 upwards button; U+1F53C
+⏫ fast up button; U+23EB
+🔽 downwards button; U+1F53D
+⏬ fast down button; U+23EC
+⏸ pause button; U+23F8
+⏹ stop button; U+23F9
+⏺ record button; U+23FA
+⏏ eject button; U+23CF
+🎦 cinema; U+1F3A6
+🔅 dim button; U+1F505
+🔆 bright button; U+1F506
+📶 antenna bars; U+1F4F6
+📳 vibration mode; U+1F4F3
+📴 mobile phone off; U+1F4F4
+♀ female sign; U+2640
+♂ male sign; U+2642
+⚕ medical symbol; U+2695
+♾ infinity; U+267E
+♻ recycling symbol; U+267B
+⚜ fleur-de-lis; U+269C
+🔱 trident emblem; U+1F531
+📛 name badge; U+1F4DB
+🔰 Japanese symbol for beginner; U+1F530
+⭕ heavy large circle; U+2B55
+✅ white heavy check mark; U+2705
+☑ ballot box with check; U+2611
+✔ heavy check mark; U+2714
+✖ heavy multiplication x; U+2716
+❌ cross mark; U+274C
+❎ cross mark button; U+274E
+➕ heavy plus sign; U+2795
+➖ heavy minus sign; U+2796
+➗ heavy division sign; U+2797
+➰ curly loop; U+27B0
+➿ double curly loop; U+27BF
+〽 part alternation mark; U+303D
+✳ eight-spoked asterisk; U+2733
+✴ eight-pointed star; U+2734
+❇ sparkle; U+2747
+‼ double exclamation mark; U+203C
+⁉ exclamation question mark; U+2049
+❓ question mark; U+2753
+❔ white question mark; U+2754
+❕ white exclamation mark; U+2755
+❗ exclamation mark; U+2757
+〰 wavy dash; U+3030
+© copyright; U+00A9
+® registered; U+00AE
+™ trade mark; U+2122
+#️⃣ keycap: #; U+0023 U+FE0F U+20E3
+*️⃣ keycap: *; U+002A U+FE0F U+20E3
+0️⃣ keycap: 0; U+0030 U+FE0F U+20E3
+1️⃣ keycap: 1; U+0031 U+FE0F U+20E3
+2️⃣ keycap: 2; U+0032 U+FE0F U+20E3
+3️⃣ keycap: 3; U+0033 U+FE0F U+20E3
+4️⃣ keycap: 4; U+0034 U+FE0F U+20E3
+5️⃣ keycap: 5; U+0035 U+FE0F U+20E3
+6️⃣ keycap: 6; U+0036 U+FE0F U+20E3
+7️⃣ keycap: 7; U+0037 U+FE0F U+20E3
+8️⃣ keycap: 8; U+0038 U+FE0F U+20E3
+9️⃣ keycap: 9; U+0039 U+FE0F U+20E3
+🔟 keycap: 10; U+1F51F
+🔠 input latin uppercase; U+1F520
+🔡 input latin lowercase; U+1F521
+🔢 input numbers; U+1F522
+🔣 input symbols; U+1F523
+🔤 input latin letters; U+1F524
+🅰 A button (blood type); U+1F170
+🆎 AB button (blood type); U+1F18E
+🅱 B button (blood type); U+1F171
+🆑 CL button; U+1F191
+🆒 COOL button; U+1F192
+🆓 FREE button; U+1F193
+ℹ information; U+2139
+🆔 ID button; U+1F194
+Ⓜ circled M; U+24C2
+🆕 NEW button; U+1F195
+🆖 NG button; U+1F196
+🅾 O button (blood type); U+1F17E
+🆗 OK button; U+1F197
+🅿 P button; U+1F17F
+🆘 SOS button; U+1F198
+🆙 UP! button; U+1F199
+🆚 VS button; U+1F19A
+🈁 Japanese “here” button; U+1F201
+🈂 Japanese “service charge” button; U+1F202
+🈷 Japanese “monthly amount” button; U+1F237
+🈶 Japanese “not free of charge” button; U+1F236
+🈯 Japanese “reserved” button; U+1F22F
+🉐 Japanese “bargain” button; U+1F250
+🈹 Japanese “discount” button; U+1F239
+🈚 Japanese “free of charge” button; U+1F21A
+🈲 Japanese “prohibited” button; U+1F232
+🉑 Japanese “acceptable” button; U+1F251
+🈸 Japanese “application” button; U+1F238
+🈴 Japanese “passing grade” button; U+1F234
+🈳 Japanese “vacancy” button; U+1F233
+㊗ Japanese “congratulations” button; U+3297
+㊙ Japanese “secret” button; U+3299
+🈺 Japanese “open for business” button; U+1F23A
+🈵 Japanese “no vacancy” button; U+1F235
+🔴 red circle; U+1F534
+🔵 blue circle; U+1F535
+⚪ white circle; U+26AA
+⚫ black circle; U+26AB
+⬜ white large square; U+2B1C
+⬛ black large square; U+2B1B
+◼ black medium square; U+25FC
+◻ white medium square; U+25FB
+◽ white medium-small square; U+25FD
+◾ black medium-small square; U+25FE
+▫ white small square; U+25AB
+▪ black small square; U+25AA
+🔶 large orange diamond; U+1F536
+🔷 large blue diamond; U+1F537
+🔸 small orange diamond; U+1F538
+🔹 small blue diamond; U+1F539
+🔺 red triangle pointed up; U+1F53A
+🔻 red triangle pointed down; U+1F53B
+💠 diamond with a dot; U+1F4A0
+🔘 radio button; U+1F518
+🔲 black square button; U+1F532
+🔳 white square button; U+1F533
+🏁 chequered flag; U+1F3C1
+🚩 triangular flag; U+1F6A9
+🎌 crossed flags; U+1F38C
+🏴 black flag; U+1F3F4
+🏳 white flag; U+1F3F3
+🏳️🌈 rainbow flag; U+1F3F3 U+FE0F U+200D U+1F308
+🏴☠️ pirate flag; U+1F3F4 U+200D U+2620 U+FE0F
+🇦🇨 flag: Ascension Island; U+1F1E6 U+1F1E8
+🇦🇩 flag: Andorra; U+1F1E6 U+1F1E9
+🇦🇪 flag: United Arab Emirates; U+1F1E6 U+1F1EA
+🇦🇫 flag: Afghanistan; U+1F1E6 U+1F1EB
+🇦🇬 flag: Antigua & Barbuda; U+1F1E6 U+1F1EC
+🇦🇮 flag: Anguilla; U+1F1E6 U+1F1EE
+🇦🇱 flag: Albania; U+1F1E6 U+1F1F1
+🇦🇲 flag: Armenia; U+1F1E6 U+1F1F2
+🇦🇴 flag: Angola; U+1F1E6 U+1F1F4
+🇦🇶 flag: Antarctica; U+1F1E6 U+1F1F6
+🇦🇷 flag: Argentina; U+1F1E6 U+1F1F7
+🇦🇸 flag: American Samoa; U+1F1E6 U+1F1F8
+🇦🇹 flag: Austria; U+1F1E6 U+1F1F9
+🇦🇺 flag: Australia; U+1F1E6 U+1F1FA
+🇦🇼 flag: Aruba; U+1F1E6 U+1F1FC
+🇦🇽 flag: Åland Islands; U+1F1E6 U+1F1FD
+🇦🇿 flag: Azerbaijan; U+1F1E6 U+1F1FF
+🇧🇦 flag: Bosnia & Herzegovina; U+1F1E7 U+1F1E6
+🇧🇧 flag: Barbados; U+1F1E7 U+1F1E7
+🇧🇩 flag: Bangladesh; U+1F1E7 U+1F1E9
+🇧🇪 flag: Belgium; U+1F1E7 U+1F1EA
+🇧🇫 flag: Burkina Faso; U+1F1E7 U+1F1EB
+🇧🇬 flag: Bulgaria; U+1F1E7 U+1F1EC
+🇧🇭 flag: Bahrain; U+1F1E7 U+1F1ED
+🇧🇮 flag: Burundi; U+1F1E7 U+1F1EE
+🇧🇯 flag: Benin; U+1F1E7 U+1F1EF
+🇧🇱 flag: St. Barthélemy; U+1F1E7 U+1F1F1
+🇧🇲 flag: Bermuda; U+1F1E7 U+1F1F2
+🇧🇳 flag: Brunei; U+1F1E7 U+1F1F3
+🇧🇴 flag: Bolivia; U+1F1E7 U+1F1F4
+🇧🇶 flag: Caribbean Netherlands; U+1F1E7 U+1F1F6
+🇧🇷 flag: Brazil; U+1F1E7 U+1F1F7
+🇧🇸 flag: Bahamas; U+1F1E7 U+1F1F8
+🇧🇹 flag: Bhutan; U+1F1E7 U+1F1F9
+🇧🇻 flag: Bouvet Island; U+1F1E7 U+1F1FB
+🇧🇼 flag: Botswana; U+1F1E7 U+1F1FC
+🇧🇾 flag: Belarus; U+1F1E7 U+1F1FE
+🇧🇿 flag: Belize; U+1F1E7 U+1F1FF
+🇨🇦 flag: Canada; U+1F1E8 U+1F1E6
+🇨🇨 flag: Cocos (Keeling) Islands; U+1F1E8 U+1F1E8
+🇨🇩 flag: Congo - Kinshasa; U+1F1E8 U+1F1E9
+🇨🇫 flag: Central African Republic; U+1F1E8 U+1F1EB
+🇨🇬 flag: Congo - Brazzaville; U+1F1E8 U+1F1EC
+🇨🇭 flag: Switzerland; U+1F1E8 U+1F1ED
+🇨🇮 flag: Côte d’Ivoire; U+1F1E8 U+1F1EE
+🇨🇰 flag: Cook Islands; U+1F1E8 U+1F1F0
+🇨🇱 flag: Chile; U+1F1E8 U+1F1F1
+🇨🇲 flag: Cameroon; U+1F1E8 U+1F1F2
+🇨🇳 flag: China; U+1F1E8 U+1F1F3
+🇨🇴 flag: Colombia; U+1F1E8 U+1F1F4
+🇨🇵 flag: Clipperton Island; U+1F1E8 U+1F1F5
+🇨🇷 flag: Costa Rica; U+1F1E8 U+1F1F7
+🇨🇺 flag: Cuba; U+1F1E8 U+1F1FA
+🇨🇻 flag: Cape Verde; U+1F1E8 U+1F1FB
+🇨🇼 flag: Curaçao; U+1F1E8 U+1F1FC
+🇨🇽 flag: Christmas Island; U+1F1E8 U+1F1FD
+🇨🇾 flag: Cyprus; U+1F1E8 U+1F1FE
+🇨🇿 flag: Czechia; U+1F1E8 U+1F1FF
+🇩🇪 flag: Germany; U+1F1E9 U+1F1EA
+🇩🇬 flag: Diego Garcia; U+1F1E9 U+1F1EC
+🇩🇯 flag: Djibouti; U+1F1E9 U+1F1EF
+🇩🇰 flag: Denmark; U+1F1E9 U+1F1F0
+🇩🇲 flag: Dominica; U+1F1E9 U+1F1F2
+🇩🇴 flag: Dominican Republic; U+1F1E9 U+1F1F4
+🇩🇿 flag: Algeria; U+1F1E9 U+1F1FF
+🇪🇦 flag: Ceuta & Melilla; U+1F1EA U+1F1E6
+🇪🇨 flag: Ecuador; U+1F1EA U+1F1E8
+🇪🇪 flag: Estonia; U+1F1EA U+1F1EA
+🇪🇬 flag: Egypt; U+1F1EA U+1F1EC
+🇪🇭 flag: Western Sahara; U+1F1EA U+1F1ED
+🇪🇷 flag: Eritrea; U+1F1EA U+1F1F7
+🇪🇸 flag: Spain; U+1F1EA U+1F1F8
+🇪🇹 flag: Ethiopia; U+1F1EA U+1F1F9
+🇪🇺 flag: European Union; U+1F1EA U+1F1FA
+🇫🇮 flag: Finland; U+1F1EB U+1F1EE
+🇫🇯 flag: Fiji; U+1F1EB U+1F1EF
+🇫🇰 flag: Falkland Islands; U+1F1EB U+1F1F0
+🇫🇲 flag: Micronesia; U+1F1EB U+1F1F2
+🇫🇴 flag: Faroe Islands; U+1F1EB U+1F1F4
+🇫🇷 flag: France; U+1F1EB U+1F1F7
+🇬🇦 flag: Gabon; U+1F1EC U+1F1E6
+🇬🇧 flag: United Kingdom; U+1F1EC U+1F1E7
+🇬🇩 flag: Grenada; U+1F1EC U+1F1E9
+🇬🇪 flag: Georgia; U+1F1EC U+1F1EA
+🇬🇫 flag: French Guiana; U+1F1EC U+1F1EB
+🇬🇬 flag: Guernsey; U+1F1EC U+1F1EC
+🇬🇭 flag: Ghana; U+1F1EC U+1F1ED
+🇬🇮 flag: Gibraltar; U+1F1EC U+1F1EE
+🇬🇱 flag: Greenland; U+1F1EC U+1F1F1
+🇬🇲 flag: Gambia; U+1F1EC U+1F1F2
+🇬🇳 flag: Guinea; U+1F1EC U+1F1F3
+🇬🇵 flag: Guadeloupe; U+1F1EC U+1F1F5
+🇬🇶 flag: Equatorial Guinea; U+1F1EC U+1F1F6
+🇬🇷 flag: Greece; U+1F1EC U+1F1F7
+🇬🇸 flag: South Georgia & South Sandwich Islands; U+1F1EC U+1F1F8
+🇬🇹 flag: Guatemala; U+1F1EC U+1F1F9
+🇬🇺 flag: Guam; U+1F1EC U+1F1FA
+🇬🇼 flag: Guinea-Bissau; U+1F1EC U+1F1FC
+🇬🇾 flag: Guyana; U+1F1EC U+1F1FE
+🇭🇰 flag: Hong Kong SAR China; U+1F1ED U+1F1F0
+🇭🇲 flag: Heard & McDonald Islands; U+1F1ED U+1F1F2
+🇭🇳 flag: Honduras; U+1F1ED U+1F1F3
+🇭🇷 flag: Croatia; U+1F1ED U+1F1F7
+🇭🇹 flag: Haiti; U+1F1ED U+1F1F9
+🇭🇺 flag: Hungary; U+1F1ED U+1F1FA
+🇮🇨 flag: Canary Islands; U+1F1EE U+1F1E8
+🇮🇩 flag: Indonesia; U+1F1EE U+1F1E9
+🇮🇪 flag: Ireland; U+1F1EE U+1F1EA
+🇮🇱 flag: Israel; U+1F1EE U+1F1F1
+🇮🇲 flag: Isle of Man; U+1F1EE U+1F1F2
+🇮🇳 flag: India; U+1F1EE U+1F1F3
+🇮🇴 flag: British Indian Ocean Territory; U+1F1EE U+1F1F4
+🇮🇶 flag: Iraq; U+1F1EE U+1F1F6
+🇮🇷 flag: Iran; U+1F1EE U+1F1F7
+🇮🇸 flag: Iceland; U+1F1EE U+1F1F8
+🇮🇹 flag: Italy; U+1F1EE U+1F1F9
+🇯🇪 flag: Jersey; U+1F1EF U+1F1EA
+🇯🇲 flag: Jamaica; U+1F1EF U+1F1F2
+🇯🇴 flag: Jordan; U+1F1EF U+1F1F4
+🇯🇵 flag: Japan; U+1F1EF U+1F1F5
+🇰🇪 flag: Kenya; U+1F1F0 U+1F1EA
+🇰🇬 flag: Kyrgyzstan; U+1F1F0 U+1F1EC
+🇰🇭 flag: Cambodia; U+1F1F0 U+1F1ED
+🇰🇮 flag: Kiribati; U+1F1F0 U+1F1EE
+🇰🇲 flag: Comoros; U+1F1F0 U+1F1F2
+🇰🇳 flag: St. Kitts & Nevis; U+1F1F0 U+1F1F3
+🇰🇵 flag: North Korea; U+1F1F0 U+1F1F5
+🇰🇷 flag: South Korea; U+1F1F0 U+1F1F7
+🇰🇼 flag: Kuwait; U+1F1F0 U+1F1FC
+🇰🇾 flag: Cayman Islands; U+1F1F0 U+1F1FE
+🇰🇿 flag: Kazakhstan; U+1F1F0 U+1F1FF
+🇱🇦 flag: Laos; U+1F1F1 U+1F1E6
+🇱🇧 flag: Lebanon; U+1F1F1 U+1F1E7
+🇱🇨 flag: St. Lucia; U+1F1F1 U+1F1E8
+🇱🇮 flag: Liechtenstein; U+1F1F1 U+1F1EE
+🇱🇰 flag: Sri Lanka; U+1F1F1 U+1F1F0
+🇱🇷 flag: Liberia; U+1F1F1 U+1F1F7
+🇱🇸 flag: Lesotho; U+1F1F1 U+1F1F8
+🇱🇹 flag: Lithuania; U+1F1F1 U+1F1F9
+🇱🇺 flag: Luxembourg; U+1F1F1 U+1F1FA
+🇱🇻 flag: Latvia; U+1F1F1 U+1F1FB
+🇱🇾 flag: Libya; U+1F1F1 U+1F1FE
+🇲🇦 flag: Morocco; U+1F1F2 U+1F1E6
+🇲🇨 flag: Monaco; U+1F1F2 U+1F1E8
+🇲🇩 flag: Moldova; U+1F1F2 U+1F1E9
+🇲🇪 flag: Montenegro; U+1F1F2 U+1F1EA
+🇲🇫 flag: St. Martin; U+1F1F2 U+1F1EB
+🇲🇬 flag: Madagascar; U+1F1F2 U+1F1EC
+🇲🇭 flag: Marshall Islands; U+1F1F2 U+1F1ED
+🇲🇰 flag: Macedonia; U+1F1F2 U+1F1F0
+🇲🇱 flag: Mali; U+1F1F2 U+1F1F1
+🇲🇲 flag: Myanmar (Burma); U+1F1F2 U+1F1F2
+🇲🇳 flag: Mongolia; U+1F1F2 U+1F1F3
+🇲🇴 flag: Macau SAR China; U+1F1F2 U+1F1F4
+🇲🇵 flag: Northern Mariana Islands; U+1F1F2 U+1F1F5
+🇲🇶 flag: Martinique; U+1F1F2 U+1F1F6
+🇲🇷 flag: Mauritania; U+1F1F2 U+1F1F7
+🇲🇸 flag: Montserrat; U+1F1F2 U+1F1F8
+🇲🇹 flag: Malta; U+1F1F2 U+1F1F9
+🇲🇺 flag: Mauritius; U+1F1F2 U+1F1FA
+🇲🇻 flag: Maldives; U+1F1F2 U+1F1FB
+🇲🇼 flag: Malawi; U+1F1F2 U+1F1FC
+🇲🇽 flag: Mexico; U+1F1F2 U+1F1FD
+🇲🇾 flag: Malaysia; U+1F1F2 U+1F1FE
+🇲🇿 flag: Mozambique; U+1F1F2 U+1F1FF
+🇳🇦 flag: Namibia; U+1F1F3 U+1F1E6
+🇳🇨 flag: New Caledonia; U+1F1F3 U+1F1E8
+🇳🇪 flag: Niger; U+1F1F3 U+1F1EA
+🇳🇫 flag: Norfolk Island; U+1F1F3 U+1F1EB
+🇳🇬 flag: Nigeria; U+1F1F3 U+1F1EC
+🇳🇮 flag: Nicaragua; U+1F1F3 U+1F1EE
+🇳🇱 flag: Netherlands; U+1F1F3 U+1F1F1
+🇳🇴 flag: Norway; U+1F1F3 U+1F1F4
+🇳🇵 flag: Nepal; U+1F1F3 U+1F1F5
+🇳🇷 flag: Nauru; U+1F1F3 U+1F1F7
+🇳🇺 flag: Niue; U+1F1F3 U+1F1FA
+🇳🇿 flag: New Zealand; U+1F1F3 U+1F1FF
+🇴🇲 flag: Oman; U+1F1F4 U+1F1F2
+🇵🇦 flag: Panama; U+1F1F5 U+1F1E6
+🇵🇪 flag: Peru; U+1F1F5 U+1F1EA
+🇵🇫 flag: French Polynesia; U+1F1F5 U+1F1EB
+🇵🇬 flag: Papua New Guinea; U+1F1F5 U+1F1EC
+🇵🇭 flag: Philippines; U+1F1F5 U+1F1ED
+🇵🇰 flag: Pakistan; U+1F1F5 U+1F1F0
+🇵🇱 flag: Poland; U+1F1F5 U+1F1F1
+🇵🇲 flag: St. Pierre & Miquelon; U+1F1F5 U+1F1F2
+🇵🇳 flag: Pitcairn Islands; U+1F1F5 U+1F1F3
+🇵🇷 flag: Puerto Rico; U+1F1F5 U+1F1F7
+🇵🇸 flag: Palestinian Territories; U+1F1F5 U+1F1F8
+🇵🇹 flag: Portugal; U+1F1F5 U+1F1F9
+🇵🇼 flag: Palau; U+1F1F5 U+1F1FC
+🇵🇾 flag: Paraguay; U+1F1F5 U+1F1FE
+🇶🇦 flag: Qatar; U+1F1F6 U+1F1E6
+🇷🇪 flag: Réunion; U+1F1F7 U+1F1EA
+🇷🇴 flag: Romania; U+1F1F7 U+1F1F4
+🇷🇸 flag: Serbia; U+1F1F7 U+1F1F8
+🇷🇺 flag: Russia; U+1F1F7 U+1F1FA
+🇷🇼 flag: Rwanda; U+1F1F7 U+1F1FC
+🇸🇦 flag: Saudi Arabia; U+1F1F8 U+1F1E6
+🇸🇧 flag: Solomon Islands; U+1F1F8 U+1F1E7
+🇸🇨 flag: Seychelles; U+1F1F8 U+1F1E8
+🇸🇩 flag: Sudan; U+1F1F8 U+1F1E9
+🇸🇪 flag: Sweden; U+1F1F8 U+1F1EA
+🇸🇬 flag: Singapore; U+1F1F8 U+1F1EC
+🇸🇭 flag: St. Helena; U+1F1F8 U+1F1ED
+🇸🇮 flag: Slovenia; U+1F1F8 U+1F1EE
+🇸🇯 flag: Svalbard & Jan Mayen; U+1F1F8 U+1F1EF
+🇸🇰 flag: Slovakia; U+1F1F8 U+1F1F0
+🇸🇱 flag: Sierra Leone; U+1F1F8 U+1F1F1
+🇸🇲 flag: San Marino; U+1F1F8 U+1F1F2
+🇸🇳 flag: Senegal; U+1F1F8 U+1F1F3
+🇸🇴 flag: Somalia; U+1F1F8 U+1F1F4
+🇸🇷 flag: Suriname; U+1F1F8 U+1F1F7
+🇸🇸 flag: South Sudan; U+1F1F8 U+1F1F8
+🇸🇹 flag: São Tomé & Príncipe; U+1F1F8 U+1F1F9
+🇸🇻 flag: El Salvador; U+1F1F8 U+1F1FB
+🇸🇽 flag: Sint Maarten; U+1F1F8 U+1F1FD
+🇸🇾 flag: Syria; U+1F1F8 U+1F1FE
+🇸🇿 flag: Swaziland; U+1F1F8 U+1F1FF
+🇹🇦 flag: Tristan da Cunha; U+1F1F9 U+1F1E6
+🇹🇨 flag: Turks & Caicos Islands; U+1F1F9 U+1F1E8
+🇹🇩 flag: Chad; U+1F1F9 U+1F1E9
+🇹🇫 flag: French Southern Territories; U+1F1F9 U+1F1EB
+🇹🇬 flag: Togo; U+1F1F9 U+1F1EC
+🇹🇭 flag: Thailand; U+1F1F9 U+1F1ED
+🇹🇯 flag: Tajikistan; U+1F1F9 U+1F1EF
+🇹🇰 flag: Tokelau; U+1F1F9 U+1F1F0
+🇹🇱 flag: Timor-Leste; U+1F1F9 U+1F1F1
+🇹🇲 flag: Turkmenistan; U+1F1F9 U+1F1F2
+🇹🇳 flag: Tunisia; U+1F1F9 U+1F1F3
+🇹🇴 flag: Tonga; U+1F1F9 U+1F1F4
+🇹🇷 flag: Turkey; U+1F1F9 U+1F1F7
+🇹🇹 flag: Trinidad & Tobago; U+1F1F9 U+1F1F9
+🇹🇻 flag: Tuvalu; U+1F1F9 U+1F1FB
+🇹🇼 flag: Taiwan; U+1F1F9 U+1F1FC
+🇹🇿 flag: Tanzania; U+1F1F9 U+1F1FF
+🇺🇦 flag: Ukraine; U+1F1FA U+1F1E6
+🇺🇬 flag: Uganda; U+1F1FA U+1F1EC
+🇺🇲 flag: U.S. Outlying Islands; U+1F1FA U+1F1F2
+🇺🇳 flag: United Nations; U+1F1FA U+1F1F3
+🇺🇸 flag: United States; U+1F1FA U+1F1F8
+🇺🇾 flag: Uruguay; U+1F1FA U+1F1FE
+🇺🇿 flag: Uzbekistan; U+1F1FA U+1F1FF
+🇻🇦 flag: Vatican City; U+1F1FB U+1F1E6
+🇻🇨 flag: St. Vincent & Grenadines; U+1F1FB U+1F1E8
+🇻🇪 flag: Venezuela; U+1F1FB U+1F1EA
+🇻🇬 flag: British Virgin Islands; U+1F1FB U+1F1EC
+🇻🇮 flag: U.S. Virgin Islands; U+1F1FB U+1F1EE
+🇻🇳 flag: Vietnam; U+1F1FB U+1F1F3
+🇻🇺 flag: Vanuatu; U+1F1FB U+1F1FA
+🇼🇫 flag: Wallis & Futuna; U+1F1FC U+1F1EB
+🇼🇸 flag: Samoa; U+1F1FC U+1F1F8
+🇽🇰 flag: Kosovo; U+1F1FD U+1F1F0
+🇾🇪 flag: Yemen; U+1F1FE U+1F1EA
+🇾🇹 flag: Mayotte; U+1F1FE U+1F1F9
+🇿🇦 flag: South Africa; U+1F1FF U+1F1E6
+🇿🇲 flag: Zambia; U+1F1FF U+1F1F2
+🇿🇼 flag: Zimbabwe; U+1F1FF U+1F1FC
+🏴 flag: England; U+1F3F4 U+E0067 U+E0062 U+E0065 U+E006E U+E0067 U+E007F
+🏴 flag: Scotland; U+1F3F4 U+E0067 U+E0062 U+E0073 U+E0063 U+E0074 U+E007F
+🏴 flag: Wales; U+1F3F4 U+E0067 U+E0062 U+E0077 U+E006C U+E0073 U+E007F
diff --git a/fontawesome b/fontawesome
@@ -0,0 +1,1483 @@
+ fa-ad; U+F641
+ fa-address-book; U+F2B9
+ fa-address-card; U+F2BB
+ fa-adjust; U+F042
+ fa-air-freshener; U+F5D0
+ fa-align-center; U+F037
+ fa-align-justify; U+F039
+ fa-align-left; U+F036
+ fa-align-right; U+F038
+ fa-allergies; U+F461
+ fa-ambulance; U+F0F9
+ fa-american-sign-language-interpreting; U+F2A3
+ fa-anchor; U+F13D
+ fa-angle-double-down; U+F103
+ fa-angle-double-left; U+F100
+ fa-angle-double-right; U+F101
+ fa-angle-double-up; U+F102
+ fa-angle-down; U+F107
+ fa-angle-left; U+F104
+ fa-angle-right; U+F105
+ fa-angle-up; U+F106
+ fa-angry; U+F556
+ fa-ankh; U+F644
+ fa-apple-alt; U+F5D1
+ fa-archive; U+F187
+ fa-archway; U+F557
+ fa-arrow-alt-circle-down; U+F358
+ fa-arrow-alt-circle-left; U+F359
+ fa-arrow-alt-circle-right; U+F35A
+ fa-arrow-alt-circle-up; U+F35B
+ fa-arrow-circle-down; U+F0AB
+ fa-arrow-circle-left; U+F0A8
+ fa-arrow-circle-right; U+F0A9
+ fa-arrow-circle-up; U+F0AA
+ fa-arrow-down; U+F063
+ fa-arrow-left; U+F060
+ fa-arrow-right; U+F061
+ fa-arrow-up; U+F062
+ fa-arrows-alt; U+F0B2
+ fa-arrows-alt-h; U+F337
+ fa-arrows-alt-v; U+F338
+ fa-assistive-listening-systems; U+F2A2
+ fa-asterisk; U+F069
+ fa-at; U+F1FA
+ fa-atlas; U+F558
+ fa-atom; U+F5D2
+ fa-audio-description; U+F29E
+ fa-award; U+F559
+ fa-baby; U+F77C
+ fa-baby-carriage; U+F77D
+ fa-backspace; U+F55A
+ fa-backward; U+F04A
+ fa-balance-scale; U+F24E
+ fa-ban; U+F05E
+ fa-band-aid; U+F462
+ fa-barcode; U+F02A
+ fa-bars; U+F0C9
+ fa-baseball-ball; U+F433
+ fa-basketball-ball; U+F434
+ fa-bath; U+F2CD
+ fa-battery-empty; U+F244
+ fa-battery-full; U+F240
+ fa-battery-half; U+F242
+ fa-battery-quarter; U+F243
+ fa-battery-three-quarters; U+F241
+ fa-bed; U+F236
+ fa-beer; U+F0FC
+ fa-bell; U+F0F3
+ fa-bell-slash; U+F1F6
+ fa-bezier-curve; U+F55B
+ fa-bible; U+F647
+ fa-bicycle; U+F206
+ fa-binoculars; U+F1E5
+ fa-biohazard; U+F780
+ fa-birthday-cake; U+F1FD
+ fa-blender; U+F517
+ fa-blender-phone; U+F6B6
+ fa-blind; U+F29D
+ fa-blog; U+F781
+ fa-bold; U+F032
+ fa-bolt; U+F0E7
+ fa-bomb; U+F1E2
+ fa-bone; U+F5D7
+ fa-bong; U+F55C
+ fa-book; U+F02D
+ fa-book-dead; U+F6B7
+ fa-book-open; U+F518
+ fa-book-reader; U+F5DA
+ fa-bookmark; U+F02E
+ fa-bowling-ball; U+F436
+ fa-box; U+F466
+ fa-box-open; U+F49E
+ fa-boxes; U+F468
+ fa-braille; U+F2A1
+ fa-brain; U+F5DC
+ fa-briefcase; U+F0B1
+ fa-briefcase-medical; U+F469
+ fa-broadcast-tower; U+F519
+ fa-broom; U+F51A
+ fa-brush; U+F55D
+ fa-bug; U+F188
+ fa-building; U+F1AD
+ fa-bullhorn; U+F0A1
+ fa-bullseye; U+F140
+ fa-burn; U+F46A
+ fa-bus; U+F207
+ fa-bus-alt; U+F55E
+ fa-business-time; U+F64A
+ fa-calculator; U+F1EC
+ fa-calendar; U+F133
+ fa-calendar-alt; U+F073
+ fa-calendar-check; U+F274
+ fa-calendar-day; U+F783
+ fa-calendar-minus; U+F272
+ fa-calendar-plus; U+F271
+ fa-calendar-times; U+F273
+ fa-calendar-week; U+F784
+ fa-camera; U+F030
+ fa-camera-retro; U+F083
+ fa-campground; U+F6BB
+ fa-candy-cane; U+F786
+ fa-cannabis; U+F55F
+ fa-capsules; U+F46B
+ fa-car; U+F1B9
+ fa-car-alt; U+F5DE
+ fa-car-battery; U+F5DF
+ fa-car-crash; U+F5E1
+ fa-car-side; U+F5E4
+ fa-caret-down; U+F0D7
+ fa-caret-left; U+F0D9
+ fa-caret-right; U+F0DA
+ fa-caret-square-down; U+F150
+ fa-caret-square-left; U+F191
+ fa-caret-square-right; U+F152
+ fa-caret-square-up; U+F151
+ fa-caret-up; U+F0D8
+ fa-carrot; U+F787
+ fa-cart-arrow-down; U+F218
+ fa-cart-plus; U+F217
+ fa-cash-register; U+F788
+ fa-cat; U+F6BE
+ fa-certificate; U+F0A3
+ fa-chair; U+F6C0
+ fa-chalkboard; U+F51B
+ fa-chalkboard-teacher; U+F51C
+ fa-charging-station; U+F5E7
+ fa-chart-area; U+F1FE
+ fa-chart-bar; U+F080
+ fa-chart-line; U+F201
+ fa-chart-pie; U+F200
+ fa-check; U+F00C
+ fa-check-circle; U+F058
+ fa-check-double; U+F560
+ fa-check-square; U+F14A
+ fa-chess; U+F439
+ fa-chess-bishop; U+F43A
+ fa-chess-board; U+F43C
+ fa-chess-king; U+F43F
+ fa-chess-knight; U+F441
+ fa-chess-pawn; U+F443
+ fa-chess-queen; U+F445
+ fa-chess-rook; U+F447
+ fa-chevron-circle-down; U+F13A
+ fa-chevron-circle-left; U+F137
+ fa-chevron-circle-right; U+F138
+ fa-chevron-circle-up; U+F139
+ fa-chevron-down; U+F078
+ fa-chevron-left; U+F053
+ fa-chevron-right; U+F054
+ fa-chevron-up; U+F077
+ fa-child; U+F1AE
+ fa-church; U+F51D
+ fa-circle; U+F111
+ fa-circle-notch; U+F1CE
+ fa-city; U+F64F
+ fa-clipboard; U+F328
+ fa-clipboard-check; U+F46C
+ fa-clipboard-list; U+F46D
+ fa-clock; U+F017
+ fa-clone; U+F24D
+ fa-closed-captioning; U+F20A
+ fa-cloud; U+F0C2
+ fa-cloud-download-alt; U+F381
+ fa-cloud-meatball; U+F73B
+ fa-cloud-moon; U+F6C3
+ fa-cloud-moon-rain; U+F73C
+ fa-cloud-rain; U+F73D
+ fa-cloud-showers-heavy; U+F740
+ fa-cloud-sun; U+F6C4
+ fa-cloud-sun-rain; U+F743
+ fa-cloud-upload-alt; U+F382
+ fa-cocktail; U+F561
+ fa-code; U+F121
+ fa-code-branch; U+F126
+ fa-coffee; U+F0F4
+ fa-cog; U+F013
+ fa-cogs; U+F085
+ fa-coins; U+F51E
+ fa-columns; U+F0DB
+ fa-comment; U+F075
+ fa-comment-alt; U+F27A
+ fa-comment-dollar; U+F651
+ fa-comment-dots; U+F4AD
+ fa-comment-slash; U+F4B3
+ fa-comments; U+F086
+ fa-comments-dollar; U+F653
+ fa-compact-disc; U+F51F
+ fa-compass; U+F14E
+ fa-compress; U+F066
+ fa-compress-arrows-alt; U+F78C
+ fa-concierge-bell; U+F562
+ fa-cookie; U+F563
+ fa-cookie-bite; U+F564
+ fa-copy; U+F0C5
+ fa-copyright; U+F1F9
+ fa-couch; U+F4B8
+ fa-credit-card; U+F09D
+ fa-crop; U+F125
+ fa-crop-alt; U+F565
+ fa-cross; U+F654
+ fa-crosshairs; U+F05B
+ fa-crow; U+F520
+ fa-crown; U+F521
+ fa-cube; U+F1B2
+ fa-cubes; U+F1B3
+ fa-cut; U+F0C4
+ fa-database; U+F1C0
+ fa-deaf; U+F2A4
+ fa-democrat; U+F747
+ fa-desktop; U+F108
+ fa-dharmachakra; U+F655
+ fa-diagnoses; U+F470
+ fa-dice; U+F522
+ fa-dice-d20; U+F6CF
+ fa-dice-d6; U+F6D1
+ fa-dice-five; U+F523
+ fa-dice-four; U+F524
+ fa-dice-one; U+F525
+ fa-dice-six; U+F526
+ fa-dice-three; U+F527
+ fa-dice-two; U+F528
+ fa-digital-tachograph; U+F566
+ fa-directions; U+F5EB
+ fa-divide; U+F529
+ fa-dizzy; U+F567
+ fa-dna; U+F471
+ fa-dog; U+F6D3
+ fa-dollar-sign; U+F155
+ fa-dolly; U+F472
+ fa-dolly-flatbed; U+F474
+ fa-donate; U+F4B9
+ fa-door-closed; U+F52A
+ fa-door-open; U+F52B
+ fa-dot-circle; U+F192
+ fa-dove; U+F4BA
+ fa-download; U+F019
+ fa-drafting-compass; U+F568
+ fa-dragon; U+F6D5
+ fa-draw-polygon; U+F5EE
+ fa-drum; U+F569
+ fa-drum-steelpan; U+F56A
+ fa-drumstick-bite; U+F6D7
+ fa-dumbbell; U+F44B
+ fa-dumpster; U+F793
+ fa-dumpster-fire; U+F794
+ fa-dungeon; U+F6D9
+ fa-edit; U+F044
+ fa-eject; U+F052
+ fa-ellipsis-h; U+F141
+ fa-ellipsis-v; U+F142
+ fa-envelope; U+F0E0
+ fa-envelope-open; U+F2B6
+ fa-envelope-open-text; U+F658
+ fa-envelope-square; U+F199
+ fa-equals; U+F52C
+ fa-eraser; U+F12D
+ fa-ethernet; U+F796
+ fa-euro-sign; U+F153
+ fa-exchange-alt; U+F362
+ fa-exclamation; U+F12A
+ fa-exclamation-circle; U+F06A
+ fa-exclamation-triangle; U+F071
+ fa-expand; U+F065
+ fa-expand-arrows-alt; U+F31E
+ fa-external-link-alt; U+F35D
+ fa-external-link-square-alt; U+F360
+ fa-eye; U+F06E
+ fa-eye-dropper; U+F1FB
+ fa-eye-slash; U+F070
+ fa-fast-backward; U+F049
+ fa-fast-forward; U+F050
+ fa-fax; U+F1AC
+ fa-feather; U+F52D
+ fa-feather-alt; U+F56B
+ fa-female; U+F182
+ fa-fighter-jet; U+F0FB
+ fa-file; U+F15B
+ fa-file-alt; U+F15C
+ fa-file-archive; U+F1C6
+ fa-file-audio; U+F1C7
+ fa-file-code; U+F1C9
+ fa-file-contract; U+F56C
+ fa-file-csv; U+F6DD
+ fa-file-download; U+F56D
+ fa-file-excel; U+F1C3
+ fa-file-export; U+F56E
+ fa-file-image; U+F1C5
+ fa-file-import; U+F56F
+ fa-file-invoice; U+F570
+ fa-file-invoice-dollar; U+F571
+ fa-file-medical; U+F477
+ fa-file-medical-alt; U+F478
+ fa-file-pdf; U+F1C1
+ fa-file-powerpoint; U+F1C4
+ fa-file-prescription; U+F572
+ fa-file-signature; U+F573
+ fa-file-upload; U+F574
+ fa-file-video; U+F1C8
+ fa-file-word; U+F1C2
+ fa-fill; U+F575
+ fa-fill-drip; U+F576
+ fa-film; U+F008
+ fa-filter; U+F0B0
+ fa-fingerprint; U+F577
+ fa-fire; U+F06D
+ fa-fire-alt; U+F7E4
+ fa-fire-extinguisher; U+F134
+ fa-first-aid; U+F479
+ fa-fish; U+F578
+ fa-fist-raised; U+F6DE
+ fa-flag; U+F024
+ fa-flag-checkered; U+F11E
+ fa-flag-usa; U+F74D
+ fa-flask; U+F0C3
+ fa-flushed; U+F579
+ fa-folder; U+F07B
+ fa-folder-minus; U+F65D
+ fa-folder-open; U+F07C
+ fa-folder-plus; U+F65E
+ fa-font; U+F031
+ fa-font-awesome-logo-full; U+F4E6
+ fa-football-ball; U+F44E
+ fa-forward; U+F04E
+ fa-frog; U+F52E
+ fa-frown; U+F119
+ fa-frown-open; U+F57A
+ fa-funnel-dollar; U+F662
+ fa-futbol; U+F1E3
+ fa-gamepad; U+F11B
+ fa-gas-pump; U+F52F
+ fa-gavel; U+F0E3
+ fa-gem; U+F3A5
+ fa-genderless; U+F22D
+ fa-ghost; U+F6E2
+ fa-gift; U+F06B
+ fa-gifts; U+F79C
+ fa-glass-cheers; U+F79F
+ fa-glass-martini; U+F000
+ fa-glass-martini-alt; U+F57B
+ fa-glass-whiskey; U+F7A0
+ fa-glasses; U+F530
+ fa-globe; U+F0AC
+ fa-globe-africa; U+F57C
+ fa-globe-americas; U+F57D
+ fa-globe-asia; U+F57E
+ fa-globe-europe; U+F7A2
+ fa-golf-ball; U+F450
+ fa-gopuram; U+F664
+ fa-graduation-cap; U+F19D
+ fa-greater-than; U+F531
+ fa-greater-than-equal; U+F532
+ fa-grimace; U+F57F
+ fa-grin; U+F580
+ fa-grin-alt; U+F581
+ fa-grin-beam; U+F582
+ fa-grin-beam-sweat; U+F583
+ fa-grin-hearts; U+F584
+ fa-grin-squint; U+F585
+ fa-grin-squint-tears; U+F586
+ fa-grin-stars; U+F587
+ fa-grin-tears; U+F588
+ fa-grin-tongue; U+F589
+ fa-grin-tongue-squint; U+F58A
+ fa-grin-tongue-wink; U+F58B
+ fa-grin-wink; U+F58C
+ fa-grip-horizontal; U+F58D
+ fa-grip-lines; U+F7A4
+ fa-grip-lines-vertical; U+F7A5
+ fa-grip-vertical; U+F58E
+ fa-guitar; U+F7A6
+ fa-h-square; U+F0FD
+ fa-hammer; U+F6E3
+ fa-hamsa; U+F665
+ fa-hand-holding; U+F4BD
+ fa-hand-holding-heart; U+F4BE
+ fa-hand-holding-usd; U+F4C0
+ fa-hand-lizard; U+F258
+ fa-hand-paper; U+F256
+ fa-hand-peace; U+F25B
+ fa-hand-point-down; U+F0A7
+ fa-hand-point-left; U+F0A5
+ fa-hand-point-right; U+F0A4
+ fa-hand-point-up; U+F0A6
+ fa-hand-pointer; U+F25A
+ fa-hand-rock; U+F255
+ fa-hand-scissors; U+F257
+ fa-hand-spock; U+F259
+ fa-hands; U+F4C2
+ fa-hands-helping; U+F4C4
+ fa-handshake; U+F2B5
+ fa-hanukiah; U+F6E6
+ fa-hashtag; U+F292
+ fa-hat-wizard; U+F6E8
+ fa-haykal; U+F666
+ fa-hdd; U+F0A0
+ fa-heading; U+F1DC
+ fa-headphones; U+F025
+ fa-headphones-alt; U+F58F
+ fa-headset; U+F590
+ fa-heart; U+F004
+ fa-heart-broken; U+F7A9
+ fa-heartbeat; U+F21E
+ fa-helicopter; U+F533
+ fa-highlighter; U+F591
+ fa-hiking; U+F6EC
+ fa-hippo; U+F6ED
+ fa-history; U+F1DA
+ fa-hockey-puck; U+F453
+ fa-holly-berry; U+F7AA
+ fa-home; U+F015
+ fa-horse; U+F6F0
+ fa-horse-head; U+F7AB
+ fa-hospital; U+F0F8
+ fa-hospital-alt; U+F47D
+ fa-hospital-symbol; U+F47E
+ fa-hot-tub; U+F593
+ fa-hotel; U+F594
+ fa-hourglass; U+F254
+ fa-hourglass-end; U+F253
+ fa-hourglass-half; U+F252
+ fa-hourglass-start; U+F251
+ fa-house-damage; U+F6F1
+ fa-hryvnia; U+F6F2
+ fa-i-cursor; U+F246
+ fa-icicles; U+F7AD
+ fa-id-badge; U+F2C1
+ fa-id-card; U+F2C2
+ fa-id-card-alt; U+F47F
+ fa-igloo; U+F7AE
+ fa-image; U+F03E
+ fa-images; U+F302
+ fa-inbox; U+F01C
+ fa-indent; U+F03C
+ fa-industry; U+F275
+ fa-infinity; U+F534
+ fa-info; U+F129
+ fa-info-circle; U+F05A
+ fa-italic; U+F033
+ fa-jedi; U+F669
+ fa-joint; U+F595
+ fa-journal-whills; U+F66A
+ fa-kaaba; U+F66B
+ fa-key; U+F084
+ fa-keyboard; U+F11C
+ fa-khanda; U+F66D
+ fa-kiss; U+F596
+ fa-kiss-beam; U+F597
+ fa-kiss-wink-heart; U+F598
+ fa-kiwi-bird; U+F535
+ fa-landmark; U+F66F
+ fa-language; U+F1AB
+ fa-laptop; U+F109
+ fa-laptop-code; U+F5FC
+ fa-laugh; U+F599
+ fa-laugh-beam; U+F59A
+ fa-laugh-squint; U+F59B
+ fa-laugh-wink; U+F59C
+ fa-layer-group; U+F5FD
+ fa-leaf; U+F06C
+ fa-lemon; U+F094
+ fa-less-than; U+F536
+ fa-less-than-equal; U+F537
+ fa-level-down-alt; U+F3BE
+ fa-level-up-alt; U+F3BF
+ fa-life-ring; U+F1CD
+ fa-lightbulb; U+F0EB
+ fa-link; U+F0C1
+ fa-lira-sign; U+F195
+ fa-list; U+F03A
+ fa-list-alt; U+F022
+ fa-list-ol; U+F0CB
+ fa-list-ul; U+F0CA
+ fa-location-arrow; U+F124
+ fa-lock; U+F023
+ fa-lock-open; U+F3C1
+ fa-long-arrow-alt-down; U+F309
+ fa-long-arrow-alt-left; U+F30A
+ fa-long-arrow-alt-right; U+F30B
+ fa-long-arrow-alt-up; U+F30C
+ fa-low-vision; U+F2A8
+ fa-luggage-cart; U+F59D
+ fa-magic; U+F0D0
+ fa-magnet; U+F076
+ fa-mail-bulk; U+F674
+ fa-male; U+F183
+ fa-map; U+F279
+ fa-map-marked; U+F59F
+ fa-map-marked-alt; U+F5A0
+ fa-map-marker; U+F041
+ fa-map-marker-alt; U+F3C5
+ fa-map-pin; U+F276
+ fa-map-signs; U+F277
+ fa-marker; U+F5A1
+ fa-mars; U+F222
+ fa-mars-double; U+F227
+ fa-mars-stroke; U+F229
+ fa-mars-stroke-h; U+F22B
+ fa-mars-stroke-v; U+F22A
+ fa-mask; U+F6FA
+ fa-medal; U+F5A2
+ fa-medkit; U+F0FA
+ fa-meh; U+F11A
+ fa-meh-blank; U+F5A4
+ fa-meh-rolling-eyes; U+F5A5
+ fa-memory; U+F538
+ fa-menorah; U+F676
+ fa-mercury; U+F223
+ fa-meteor; U+F753
+ fa-microchip; U+F2DB
+ fa-microphone; U+F130
+ fa-microphone-alt; U+F3C9
+ fa-microphone-alt-slash; U+F539
+ fa-microphone-slash; U+F131
+ fa-microscope; U+F610
+ fa-minus; U+F068
+ fa-minus-circle; U+F056
+ fa-minus-square; U+F146
+ fa-mitten; U+F7B5
+ fa-mobile; U+F10B
+ fa-mobile-alt; U+F3CD
+ fa-money-bill; U+F0D6
+ fa-money-bill-alt; U+F3D1
+ fa-money-bill-wave; U+F53A
+ fa-money-bill-wave-alt; U+F53B
+ fa-money-check; U+F53C
+ fa-money-check-alt; U+F53D
+ fa-monument; U+F5A6
+ fa-moon; U+F186
+ fa-mortar-pestle; U+F5A7
+ fa-mosque; U+F678
+ fa-motorcycle; U+F21C
+ fa-mountain; U+F6FC
+ fa-mouse-pointer; U+F245
+ fa-mug-hot; U+F7B6
+ fa-music; U+F001
+ fa-network-wired; U+F6FF
+ fa-neuter; U+F22C
+ fa-newspaper; U+F1EA
+ fa-not-equal; U+F53E
+ fa-notes-medical; U+F481
+ fa-object-group; U+F247
+ fa-object-ungroup; U+F248
+ fa-oil-can; U+F613
+ fa-om; U+F679
+ fa-otter; U+F700
+ fa-outdent; U+F03B
+ fa-paint-brush; U+F1FC
+ fa-paint-roller; U+F5AA
+ fa-palette; U+F53F
+ fa-pallet; U+F482
+ fa-paper-plane; U+F1D8
+ fa-paperclip; U+F0C6
+ fa-parachute-box; U+F4CD
+ fa-paragraph; U+F1DD
+ fa-parking; U+F540
+ fa-passport; U+F5AB
+ fa-pastafarianism; U+F67B
+ fa-paste; U+F0EA
+ fa-pause; U+F04C
+ fa-pause-circle; U+F28B
+ fa-paw; U+F1B0
+ fa-peace; U+F67C
+ fa-pen; U+F304
+ fa-pen-alt; U+F305
+ fa-pen-fancy; U+F5AC
+ fa-pen-nib; U+F5AD
+ fa-pen-square; U+F14B
+ fa-pencil-alt; U+F303
+ fa-pencil-ruler; U+F5AE
+ fa-people-carry; U+F4CE
+ fa-percent; U+F295
+ fa-percentage; U+F541
+ fa-person-booth; U+F756
+ fa-phone; U+F095
+ fa-phone-slash; U+F3DD
+ fa-phone-square; U+F098
+ fa-phone-volume; U+F2A0
+ fa-piggy-bank; U+F4D3
+ fa-pills; U+F484
+ fa-place-of-worship; U+F67F
+ fa-plane; U+F072
+ fa-plane-arrival; U+F5AF
+ fa-plane-departure; U+F5B0
+ fa-play; U+F04B
+ fa-play-circle; U+F144
+ fa-plug; U+F1E6
+ fa-plus; U+F067
+ fa-plus-circle; U+F055
+ fa-plus-square; U+F0FE
+ fa-podcast; U+F2CE
+ fa-poll; U+F681
+ fa-poll-h; U+F682
+ fa-poo; U+F2FE
+ fa-poo-storm; U+F75A
+ fa-poop; U+F619
+ fa-portrait; U+F3E0
+ fa-pound-sign; U+F154
+ fa-power-off; U+F011
+ fa-pray; U+F683
+ fa-praying-hands; U+F684
+ fa-prescription; U+F5B1
+ fa-prescription-bottle; U+F485
+ fa-prescription-bottle-alt; U+F486
+ fa-print; U+F02F
+ fa-procedures; U+F487
+ fa-project-diagram; U+F542
+ fa-puzzle-piece; U+F12E
+ fa-qrcode; U+F029
+ fa-question; U+F128
+ fa-question-circle; U+F059
+ fa-quidditch; U+F458
+ fa-quote-left; U+F10D
+ fa-quote-right; U+F10E
+ fa-quran; U+F687
+ fa-radiation; U+F7B9
+ fa-radiation-alt; U+F7BA
+ fa-rainbow; U+F75B
+ fa-random; U+F074
+ fa-receipt; U+F543
+ fa-recycle; U+F1B8
+ fa-redo; U+F01E
+ fa-redo-alt; U+F2F9
+ fa-registered; U+F25D
+ fa-reply; U+F3E5
+ fa-reply-all; U+F122
+ fa-republican; U+F75E
+ fa-restroom; U+F7BD
+ fa-retweet; U+F079
+ fa-ribbon; U+F4D6
+ fa-ring; U+F70B
+ fa-road; U+F018
+ fa-robot; U+F544
+ fa-rocket; U+F135
+ fa-route; U+F4D7
+ fa-rss; U+F09E
+ fa-rss-square; U+F143
+ fa-ruble-sign; U+F158
+ fa-ruler; U+F545
+ fa-ruler-combined; U+F546
+ fa-ruler-horizontal; U+F547
+ fa-ruler-vertical; U+F548
+ fa-running; U+F70C
+ fa-rupee-sign; U+F156
+ fa-sad-cry; U+F5B3
+ fa-sad-tear; U+F5B4
+ fa-satellite; U+F7BF
+ fa-satellite-dish; U+F7C0
+ fa-save; U+F0C7
+ fa-school; U+F549
+ fa-screwdriver; U+F54A
+ fa-scroll; U+F70E
+ fa-sd-card; U+F7C2
+ fa-search; U+F002
+ fa-search-dollar; U+F688
+ fa-search-location; U+F689
+ fa-search-minus; U+F010
+ fa-search-plus; U+F00E
+ fa-seedling; U+F4D8
+ fa-server; U+F233
+ fa-shapes; U+F61F
+ fa-share; U+F064
+ fa-share-alt; U+F1E0
+ fa-share-alt-square; U+F1E1
+ fa-share-square; U+F14D
+ fa-shekel-sign; U+F20B
+ fa-shield-alt; U+F3ED
+ fa-ship; U+F21A
+ fa-shipping-fast; U+F48B
+ fa-shoe-prints; U+F54B
+ fa-shopping-bag; U+F290
+ fa-shopping-basket; U+F291
+ fa-shopping-cart; U+F07A
+ fa-shower; U+F2CC
+ fa-shuttle-van; U+F5B6
+ fa-sign; U+F4D9
+ fa-sign-in-alt; U+F2F6
+ fa-sign-language; U+F2A7
+ fa-sign-out-alt; U+F2F5
+ fa-signal; U+F012
+ fa-signature; U+F5B7
+ fa-sim-card; U+F7C4
+ fa-sitemap; U+F0E8
+ fa-skating; U+F7C5
+ fa-skiing; U+F7C9
+ fa-skiing-nordic; U+F7CA
+ fa-skull; U+F54C
+ fa-skull-crossbones; U+F714
+ fa-slash; U+F715
+ fa-sleigh; U+F7CC
+ fa-sliders-h; U+F1DE
+ fa-smile; U+F118
+ fa-smile-beam; U+F5B8
+ fa-smile-wink; U+F4DA
+ fa-smog; U+F75F
+ fa-smoking; U+F48D
+ fa-smoking-ban; U+F54D
+ fa-sms; U+F7CD
+ fa-snowboarding; U+F7CE
+ fa-snowflake; U+F2DC
+ fa-snowman; U+F7D0
+ fa-snowplow; U+F7D2
+ fa-socks; U+F696
+ fa-solar-panel; U+F5BA
+ fa-sort; U+F0DC
+ fa-sort-alpha-down; U+F15D
+ fa-sort-alpha-up; U+F15E
+ fa-sort-amount-down; U+F160
+ fa-sort-amount-up; U+F161
+ fa-sort-down; U+F0DD
+ fa-sort-numeric-down; U+F162
+ fa-sort-numeric-up; U+F163
+ fa-sort-up; U+F0DE
+ fa-spa; U+F5BB
+ fa-space-shuttle; U+F197
+ fa-spider; U+F717
+ fa-spinner; U+F110
+ fa-splotch; U+F5BC
+ fa-spray-can; U+F5BD
+ fa-square; U+F0C8
+ fa-square-full; U+F45C
+ fa-square-root-alt; U+F698
+ fa-stamp; U+F5BF
+ fa-star; U+F005
+ fa-star-and-crescent; U+F699
+ fa-star-half; U+F089
+ fa-star-half-alt; U+F5C0
+ fa-star-of-david; U+F69A
+ fa-star-of-life; U+F621
+ fa-step-backward; U+F048
+ fa-step-forward; U+F051
+ fa-stethoscope; U+F0F1
+ fa-sticky-note; U+F249
+ fa-stop; U+F04D
+ fa-stop-circle; U+F28D
+ fa-stopwatch; U+F2F2
+ fa-store; U+F54E
+ fa-store-alt; U+F54F
+ fa-stream; U+F550
+ fa-street-view; U+F21D
+ fa-strikethrough; U+F0CC
+ fa-stroopwafel; U+F551
+ fa-subscript; U+F12C
+ fa-subway; U+F239
+ fa-suitcase; U+F0F2
+ fa-suitcase-rolling; U+F5C1
+ fa-sun; U+F185
+ fa-superscript; U+F12B
+ fa-surprise; U+F5C2
+ fa-swatchbook; U+F5C3
+ fa-swimmer; U+F5C4
+ fa-swimming-pool; U+F5C5
+ fa-synagogue; U+F69B
+ fa-sync; U+F021
+ fa-sync-alt; U+F2F1
+ fa-syringe; U+F48E
+ fa-table; U+F0CE
+ fa-table-tennis; U+F45D
+ fa-tablet; U+F10A
+ fa-tablet-alt; U+F3FA
+ fa-tablets; U+F490
+ fa-tachometer-alt; U+F3FD
+ fa-tag; U+F02B
+ fa-tags; U+F02C
+ fa-tape; U+F4DB
+ fa-tasks; U+F0AE
+ fa-taxi; U+F1BA
+ fa-teeth; U+F62E
+ fa-teeth-open; U+F62F
+ fa-temperature-high; U+F769
+ fa-temperature-low; U+F76B
+ fa-tenge; U+F7D7
+ fa-terminal; U+F120
+ fa-text-height; U+F034
+ fa-text-width; U+F035
+ fa-th; U+F00A
+ fa-th-large; U+F009
+ fa-th-list; U+F00B
+ fa-theater-masks; U+F630
+ fa-thermometer; U+F491
+ fa-thermometer-empty; U+F2CB
+ fa-thermometer-full; U+F2C7
+ fa-thermometer-half; U+F2C9
+ fa-thermometer-quarter; U+F2CA
+ fa-thermometer-three-quarters; U+F2C8
+ fa-thumbs-down; U+F165
+ fa-thumbs-up; U+F164
+ fa-thumbtack; U+F08D
+ fa-ticket-alt; U+F3FF
+ fa-times; U+F00D
+ fa-times-circle; U+F057
+ fa-tint; U+F043
+ fa-tint-slash; U+F5C7
+ fa-tired; U+F5C8
+ fa-toggle-off; U+F204
+ fa-toggle-on; U+F205
+ fa-toilet; U+F7D8
+ fa-toilet-paper; U+F71E
+ fa-toolbox; U+F552
+ fa-tools; U+F7D9
+ fa-tooth; U+F5C9
+ fa-torah; U+F6A0
+ fa-torii-gate; U+F6A1
+ fa-tractor; U+F722
+ fa-trademark; U+F25C
+ fa-traffic-light; U+F637
+ fa-train; U+F238
+ fa-tram; U+F7DA
+ fa-transgender; U+F224
+ fa-transgender-alt; U+F225
+ fa-trash; U+F1F8
+ fa-trash-alt; U+F2ED
+ fa-tree; U+F1BB
+ fa-trophy; U+F091
+ fa-truck; U+F0D1
+ fa-truck-loading; U+F4DE
+ fa-truck-monster; U+F63B
+ fa-truck-moving; U+F4DF
+ fa-truck-pickup; U+F63C
+ fa-tshirt; U+F553
+ fa-tty; U+F1E4
+ fa-tv; U+F26C
+ fa-umbrella; U+F0E9
+ fa-umbrella-beach; U+F5CA
+ fa-underline; U+F0CD
+ fa-undo; U+F0E2
+ fa-undo-alt; U+F2EA
+ fa-universal-access; U+F29A
+ fa-university; U+F19C
+ fa-unlink; U+F127
+ fa-unlock; U+F09C
+ fa-unlock-alt; U+F13E
+ fa-upload; U+F093
+ fa-user; U+F007
+ fa-user-alt; U+F406
+ fa-user-alt-slash; U+F4FA
+ fa-user-astronaut; U+F4FB
+ fa-user-check; U+F4FC
+ fa-user-circle; U+F2BD
+ fa-user-clock; U+F4FD
+ fa-user-cog; U+F4FE
+ fa-user-edit; U+F4FF
+ fa-user-friends; U+F500
+ fa-user-graduate; U+F501
+ fa-user-injured; U+F728
+ fa-user-lock; U+F502
+ fa-user-md; U+F0F0
+ fa-user-minus; U+F503
+ fa-user-ninja; U+F504
+ fa-user-plus; U+F234
+ fa-user-secret; U+F21B
+ fa-user-shield; U+F505
+ fa-user-slash; U+F506
+ fa-user-tag; U+F507
+ fa-user-tie; U+F508
+ fa-user-times; U+F235
+ fa-users; U+F0C0
+ fa-users-cog; U+F509
+ fa-utensil-spoon; U+F2E5
+ fa-utensils; U+F2E7
+ fa-vector-square; U+F5CB
+ fa-venus; U+F221
+ fa-venus-double; U+F226
+ fa-venus-mars; U+F228
+ fa-vial; U+F492
+ fa-vials; U+F493
+ fa-video; U+F03D
+ fa-video-slash; U+F4E2
+ fa-vihara; U+F6A7
+ fa-volleyball-ball; U+F45F
+ fa-volume-down; U+F027
+ fa-volume-mute; U+F6A9
+ fa-volume-off; U+F026
+ fa-volume-up; U+F028
+ fa-vote-yea; U+F772
+ fa-vr-cardboard; U+F729
+ fa-walking; U+F554
+ fa-wallet; U+F555
+ fa-warehouse; U+F494
+ fa-water; U+F773
+ fa-weight; U+F496
+ fa-weight-hanging; U+F5CD
+ fa-wheelchair; U+F193
+ fa-wifi; U+F1EB
+ fa-wind; U+F72E
+ fa-window-close; U+F410
+ fa-window-maximize; U+F2D0
+ fa-window-minimize; U+F2D1
+ fa-window-restore; U+F2D2
+ fa-wine-bottle; U+F72F
+ fa-wine-glass; U+F4E3
+ fa-wine-glass-alt; U+F5CE
+ fa-won-sign; U+F159
+ fa-wrench; U+F0AD
+ fa-x-ray; U+F497
+ fa-yen-sign; U+F157
+ fa-yin-yang; U+F6AD
+ fa-address-book; U+F2B9
+ fa-address-card; U+F2BB
+ fa-angry; U+F556
+ fa-arrow-alt-circle-down; U+F358
+ fa-arrow-alt-circle-left; U+F359
+ fa-arrow-alt-circle-right; U+F35A
+ fa-arrow-alt-circle-up; U+F35B
+ fa-bell; U+F0F3
+ fa-bell-slash; U+F1F6
+ fa-bookmark; U+F02E
+ fa-building; U+F1AD
+ fa-calendar; U+F133
+ fa-calendar-alt; U+F073
+ fa-calendar-check; U+F274
+ fa-calendar-minus; U+F272
+ fa-calendar-plus; U+F271
+ fa-calendar-times; U+F273
+ fa-caret-square-down; U+F150
+ fa-caret-square-left; U+F191
+ fa-caret-square-right; U+F152
+ fa-caret-square-up; U+F151
+ fa-chart-bar; U+F080
+ fa-check-circle; U+F058
+ fa-check-square; U+F14A
+ fa-circle; U+F111
+ fa-clipboard; U+F328
+ fa-clock; U+F017
+ fa-clone; U+F24D
+ fa-closed-captioning; U+F20A
+ fa-comment; U+F075
+ fa-comment-alt; U+F27A
+ fa-comment-dots; U+F4AD
+ fa-comments; U+F086
+ fa-compass; U+F14E
+ fa-copy; U+F0C5
+ fa-copyright; U+F1F9
+ fa-credit-card; U+F09D
+ fa-dizzy; U+F567
+ fa-dot-circle; U+F192
+ fa-edit; U+F044
+ fa-envelope; U+F0E0
+ fa-envelope-open; U+F2B6
+ fa-eye; U+F06E
+ fa-eye-slash; U+F070
+ fa-file; U+F15B
+ fa-file-alt; U+F15C
+ fa-file-archive; U+F1C6
+ fa-file-audio; U+F1C7
+ fa-file-code; U+F1C9
+ fa-file-excel; U+F1C3
+ fa-file-image; U+F1C5
+ fa-file-pdf; U+F1C1
+ fa-file-powerpoint; U+F1C4
+ fa-file-video; U+F1C8
+ fa-file-word; U+F1C2
+ fa-flag; U+F024
+ fa-flushed; U+F579
+ fa-folder; U+F07B
+ fa-folder-open; U+F07C
+ fa-font-awesome-logo-full; U+F4E6
+ fa-frown; U+F119
+ fa-frown-open; U+F57A
+ fa-futbol; U+F1E3
+ fa-gem; U+F3A5
+ fa-grimace; U+F57F
+ fa-grin; U+F580
+ fa-grin-alt; U+F581
+ fa-grin-beam; U+F582
+ fa-grin-beam-sweat; U+F583
+ fa-grin-hearts; U+F584
+ fa-grin-squint; U+F585
+ fa-grin-squint-tears; U+F586
+ fa-grin-stars; U+F587
+ fa-grin-tears; U+F588
+ fa-grin-tongue; U+F589
+ fa-grin-tongue-squint; U+F58A
+ fa-grin-tongue-wink; U+F58B
+ fa-grin-wink; U+F58C
+ fa-hand-lizard; U+F258
+ fa-hand-paper; U+F256
+ fa-hand-peace; U+F25B
+ fa-hand-point-down; U+F0A7
+ fa-hand-point-left; U+F0A5
+ fa-hand-point-right; U+F0A4
+ fa-hand-point-up; U+F0A6
+ fa-hand-pointer; U+F25A
+ fa-hand-rock; U+F255
+ fa-hand-scissors; U+F257
+ fa-hand-spock; U+F259
+ fa-handshake; U+F2B5
+ fa-hdd; U+F0A0
+ fa-heart; U+F004
+ fa-hospital; U+F0F8
+ fa-hourglass; U+F254
+ fa-id-badge; U+F2C1
+ fa-id-card; U+F2C2
+ fa-image; U+F03E
+ fa-images; U+F302
+ fa-keyboard; U+F11C
+ fa-kiss; U+F596
+ fa-kiss-beam; U+F597
+ fa-kiss-wink-heart; U+F598
+ fa-laugh; U+F599
+ fa-laugh-beam; U+F59A
+ fa-laugh-squint; U+F59B
+ fa-laugh-wink; U+F59C
+ fa-lemon; U+F094
+ fa-life-ring; U+F1CD
+ fa-lightbulb; U+F0EB
+ fa-list-alt; U+F022
+ fa-map; U+F279
+ fa-meh; U+F11A
+ fa-meh-blank; U+F5A4
+ fa-meh-rolling-eyes; U+F5A5
+ fa-minus-square; U+F146
+ fa-money-bill-alt; U+F3D1
+ fa-moon; U+F186
+ fa-newspaper; U+F1EA
+ fa-object-group; U+F247
+ fa-object-ungroup; U+F248
+ fa-paper-plane; U+F1D8
+ fa-pause-circle; U+F28B
+ fa-play-circle; U+F144
+ fa-plus-square; U+F0FE
+ fa-question-circle; U+F059
+ fa-registered; U+F25D
+ fa-sad-cry; U+F5B3
+ fa-sad-tear; U+F5B4
+ fa-save; U+F0C7
+ fa-share-square; U+F14D
+ fa-smile; U+F118
+ fa-smile-beam; U+F5B8
+ fa-smile-wink; U+F4DA
+ fa-snowflake; U+F2DC
+ fa-square; U+F0C8
+ fa-star; U+F005
+ fa-star-half; U+F089
+ fa-sticky-note; U+F249
+ fa-stop-circle; U+F28D
+ fa-sun; U+F185
+ fa-surprise; U+F5C2
+ fa-thumbs-down; U+F165
+ fa-thumbs-up; U+F164
+ fa-times-circle; U+F057
+ fa-tired; U+F5C8
+ fa-trash-alt; U+F2ED
+ fa-user; U+F007
+ fa-user-circle; U+F2BD
+ fa-window-close; U+F410
+ fa-window-maximize; U+F2D0
+ fa-window-minimize; U+F2D1
+ fa-window-restore; U+F2D2
+ fa-500px; U+F26E
+ fa-accessible-icon; U+F368
+ fa-accusoft; U+F369
+ fa-acquisitions-incorporated; U+F6AF
+ fa-adn; U+F170
+ fa-adobe; U+F778
+ fa-adversal; U+F36A
+ fa-affiliatetheme; U+F36B
+ fa-algolia; U+F36C
+ fa-alipay; U+F642
+ fa-amazon; U+F270
+ fa-amazon-pay; U+F42C
+ fa-amilia; U+F36D
+ fa-android; U+F17B
+ fa-angellist; U+F209
+ fa-angrycreative; U+F36E
+ fa-angular; U+F420
+ fa-app-store; U+F36F
+ fa-app-store-ios; U+F370
+ fa-apper; U+F371
+ fa-apple; U+F179
+ fa-apple-pay; U+F415
+ fa-artstation; U+F77A
+ fa-asymmetrik; U+F372
+ fa-atlassian; U+F77B
+ fa-audible; U+F373
+ fa-autoprefixer; U+F41C
+ fa-avianex; U+F374
+ fa-aviato; U+F421
+ fa-aws; U+F375
+ fa-bandcamp; U+F2D5
+ fa-behance; U+F1B4
+ fa-behance-square; U+F1B5
+ fa-bimobject; U+F378
+ fa-bitbucket; U+F171
+ fa-bitcoin; U+F379
+ fa-bity; U+F37A
+ fa-black-tie; U+F27E
+ fa-blackberry; U+F37B
+ fa-blogger; U+F37C
+ fa-blogger-b; U+F37D
+ fa-bluetooth; U+F293
+ fa-bluetooth-b; U+F294
+ fa-btc; U+F15A
+ fa-buromobelexperte; U+F37F
+ fa-buysellads; U+F20D
+ fa-canadian-maple-leaf; U+F785
+ fa-cc-amazon-pay; U+F42D
+ fa-cc-amex; U+F1F3
+ fa-cc-apple-pay; U+F416
+ fa-cc-diners-club; U+F24C
+ fa-cc-discover; U+F1F2
+ fa-cc-jcb; U+F24B
+ fa-cc-mastercard; U+F1F1
+ fa-cc-paypal; U+F1F4
+ fa-cc-stripe; U+F1F5
+ fa-cc-visa; U+F1F0
+ fa-centercode; U+F380
+ fa-centos; U+F789
+ fa-chrome; U+F268
+ fa-cloudscale; U+F383
+ fa-cloudsmith; U+F384
+ fa-cloudversify; U+F385
+ fa-codepen; U+F1CB
+ fa-codiepie; U+F284
+ fa-confluence; U+F78D
+ fa-connectdevelop; U+F20E
+ fa-contao; U+F26D
+ fa-cpanel; U+F388
+ fa-creative-commons; U+F25E
+ fa-creative-commons-by; U+F4E7
+ fa-creative-commons-nc; U+F4E8
+ fa-creative-commons-nc-eu; U+F4E9
+ fa-creative-commons-nc-jp; U+F4EA
+ fa-creative-commons-nd; U+F4EB
+ fa-creative-commons-pd; U+F4EC
+ fa-creative-commons-pd-alt; U+F4ED
+ fa-creative-commons-remix; U+F4EE
+ fa-creative-commons-sa; U+F4EF
+ fa-creative-commons-sampling; U+F4F0
+ fa-creative-commons-sampling-plus; U+F4F1
+ fa-creative-commons-share; U+F4F2
+ fa-creative-commons-zero; U+F4F3
+ fa-critical-role; U+F6C9
+ fa-css3; U+F13C
+ fa-css3-alt; U+F38B
+ fa-cuttlefish; U+F38C
+ fa-d-and-d; U+F38D
+ fa-d-and-d-beyond; U+F6CA
+ fa-dashcube; U+F210
+ fa-delicious; U+F1A5
+ fa-deploydog; U+F38E
+ fa-deskpro; U+F38F
+ fa-dev; U+F6CC
+ fa-deviantart; U+F1BD
+ fa-dhl; U+F790
+ fa-diaspora; U+F791
+ fa-digg; U+F1A6
+ fa-digital-ocean; U+F391
+ fa-discord; U+F392
+ fa-discourse; U+F393
+ fa-dochub; U+F394
+ fa-docker; U+F395
+ fa-draft2digital; U+F396
+ fa-dribbble; U+F17D
+ fa-dribbble-square; U+F397
+ fa-dropbox; U+F16B
+ fa-drupal; U+F1A9
+ fa-dyalog; U+F399
+ fa-earlybirds; U+F39A
+ fa-ebay; U+F4F4
+ fa-edge; U+F282
+ fa-elementor; U+F430
+ fa-ello; U+F5F1
+ fa-ember; U+F423
+ fa-empire; U+F1D1
+ fa-envira; U+F299
+ fa-erlang; U+F39D
+ fa-ethereum; U+F42E
+ fa-etsy; U+F2D7
+ fa-expeditedssl; U+F23E
+ fa-facebook; U+F09A
+ fa-facebook-f; U+F39E
+ fa-facebook-messenger; U+F39F
+ fa-facebook-square; U+F082
+ fa-fantasy-flight-games; U+F6DC
+ fa-fedex; U+F797
+ fa-fedora; U+F798
+ fa-figma; U+F799
+ fa-firefox; U+F269
+ fa-first-order; U+F2B0
+ fa-first-order-alt; U+F50A
+ fa-firstdraft; U+F3A1
+ fa-flickr; U+F16E
+ fa-flipboard; U+F44D
+ fa-fly; U+F417
+ fa-font-awesome; U+F2B4
+ fa-font-awesome-alt; U+F35C
+ fa-font-awesome-flag; U+F425
+ fa-font-awesome-logo-full; U+F4E6
+ fa-fonticons; U+F280
+ fa-fonticons-fi; U+F3A2
+ fa-fort-awesome; U+F286
+ fa-fort-awesome-alt; U+F3A3
+ fa-forumbee; U+F211
+ fa-foursquare; U+F180
+ fa-free-code-camp; U+F2C5
+ fa-freebsd; U+F3A4
+ fa-fulcrum; U+F50B
+ fa-galactic-republic; U+F50C
+ fa-galactic-senate; U+F50D
+ fa-get-pocket; U+F265
+ fa-gg; U+F260
+ fa-gg-circle; U+F261
+ fa-git; U+F1D3
+ fa-git-square; U+F1D2
+ fa-github; U+F09B
+ fa-github-alt; U+F113
+ fa-github-square; U+F092
+ fa-gitkraken; U+F3A6
+ fa-gitlab; U+F296
+ fa-gitter; U+F426
+ fa-glide; U+F2A5
+ fa-glide-g; U+F2A6
+ fa-gofore; U+F3A7
+ fa-goodreads; U+F3A8
+ fa-goodreads-g; U+F3A9
+ fa-google; U+F1A0
+ fa-google-drive; U+F3AA
+ fa-google-play; U+F3AB
+ fa-google-plus; U+F2B3
+ fa-google-plus-g; U+F0D5
+ fa-google-plus-square; U+F0D4
+ fa-google-wallet; U+F1EE
+ fa-gratipay; U+F184
+ fa-grav; U+F2D6
+ fa-gripfire; U+F3AC
+ fa-grunt; U+F3AD
+ fa-gulp; U+F3AE
+ fa-hacker-news; U+F1D4
+ fa-hacker-news-square; U+F3AF
+ fa-hackerrank; U+F5F7
+ fa-hips; U+F452
+ fa-hire-a-helper; U+F3B0
+ fa-hooli; U+F427
+ fa-hornbill; U+F592
+ fa-hotjar; U+F3B1
+ fa-houzz; U+F27C
+ fa-html5; U+F13B
+ fa-hubspot; U+F3B2
+ fa-imdb; U+F2D8
+ fa-instagram; U+F16D
+ fa-intercom; U+F7AF
+ fa-internet-explorer; U+F26B
+ fa-invision; U+F7B0
+ fa-ioxhost; U+F208
+ fa-itunes; U+F3B4
+ fa-itunes-note; U+F3B5
+ fa-java; U+F4E4
+ fa-jedi-order; U+F50E
+ fa-jenkins; U+F3B6
+ fa-jira; U+F7B1
+ fa-joget; U+F3B7
+ fa-joomla; U+F1AA
+ fa-js; U+F3B8
+ fa-js-square; U+F3B9
+ fa-jsfiddle; U+F1CC
+ fa-kaggle; U+F5FA
+ fa-keybase; U+F4F5
+ fa-keycdn; U+F3BA
+ fa-kickstarter; U+F3BB
+ fa-kickstarter-k; U+F3BC
+ fa-korvue; U+F42F
+ fa-laravel; U+F3BD
+ fa-lastfm; U+F202
+ fa-lastfm-square; U+F203
+ fa-leanpub; U+F212
+ fa-less; U+F41D
+ fa-line; U+F3C0
+ fa-linkedin; U+F08C
+ fa-linkedin-in; U+F0E1
+ fa-linode; U+F2B8
+ fa-linux; U+F17C
+ fa-lyft; U+F3C3
+ fa-magento; U+F3C4
+ fa-mailchimp; U+F59E
+ fa-mandalorian; U+F50F
+ fa-markdown; U+F60F
+ fa-mastodon; U+F4F6
+ fa-maxcdn; U+F136
+ fa-medapps; U+F3C6
+ fa-medium; U+F23A
+ fa-medium-m; U+F3C7
+ fa-medrt; U+F3C8
+ fa-meetup; U+F2E0
+ fa-megaport; U+F5A3
+ fa-mendeley; U+F7B3
+ fa-microsoft; U+F3CA
+ fa-mix; U+F3CB
+ fa-mixcloud; U+F289
+ fa-mizuni; U+F3CC
+ fa-modx; U+F285
+ fa-monero; U+F3D0
+ fa-napster; U+F3D2
+ fa-neos; U+F612
+ fa-nimblr; U+F5A8
+ fa-nintendo-switch; U+F418
+ fa-node; U+F419
+ fa-node-js; U+F3D3
+ fa-npm; U+F3D4
+ fa-ns8; U+F3D5
+ fa-nutritionix; U+F3D6
+ fa-odnoklassniki; U+F263
+ fa-odnoklassniki-square; U+F264
+ fa-old-republic; U+F510
+ fa-opencart; U+F23D
+ fa-openid; U+F19B
+ fa-opera; U+F26A
+ fa-optin-monster; U+F23C
+ fa-osi; U+F41A
+ fa-page4; U+F3D7
+ fa-pagelines; U+F18C
+ fa-palfed; U+F3D8
+ fa-patreon; U+F3D9
+ fa-paypal; U+F1ED
+ fa-penny-arcade; U+F704
+ fa-periscope; U+F3DA
+ fa-phabricator; U+F3DB
+ fa-phoenix-framework; U+F3DC
+ fa-phoenix-squadron; U+F511
+ fa-php; U+F457
+ fa-pied-piper; U+F2AE
+ fa-pied-piper-alt; U+F1A8
+ fa-pied-piper-hat; U+F4E5
+ fa-pied-piper-pp; U+F1A7
+ fa-pinterest; U+F0D2
+ fa-pinterest-p; U+F231
+ fa-pinterest-square; U+F0D3
+ fa-playstation; U+F3DF
+ fa-product-hunt; U+F288
+ fa-pushed; U+F3E1
+ fa-python; U+F3E2
+ fa-qq; U+F1D6
+ fa-quinscape; U+F459
+ fa-quora; U+F2C4
+ fa-r-project; U+F4F7
+ fa-raspberry-pi; U+F7BB
+ fa-ravelry; U+F2D9
+ fa-react; U+F41B
+ fa-reacteurope; U+F75D
+ fa-readme; U+F4D5
+ fa-rebel; U+F1D0
+ fa-red-river; U+F3E3
+ fa-reddit; U+F1A1
+ fa-reddit-alien; U+F281
+ fa-reddit-square; U+F1A2
+ fa-redhat; U+F7BC
+ fa-renren; U+F18B
+ fa-replyd; U+F3E6
+ fa-researchgate; U+F4F8
+ fa-resolving; U+F3E7
+ fa-rev; U+F5B2
+ fa-rocketchat; U+F3E8
+ fa-rockrms; U+F3E9
+ fa-safari; U+F267
+ fa-sass; U+F41E
+ fa-schlix; U+F3EA
+ fa-scribd; U+F28A
+ fa-searchengin; U+F3EB
+ fa-sellcast; U+F2DA
+ fa-sellsy; U+F213
+ fa-servicestack; U+F3EC
+ fa-shirtsinbulk; U+F214
+ fa-shopware; U+F5B5
+ fa-simplybuilt; U+F215
+ fa-sistrix; U+F3EE
+ fa-sith; U+F512
+ fa-sketch; U+F7C6
+ fa-skyatlas; U+F216
+ fa-skype; U+F17E
+ fa-slack; U+F198
+ fa-slack-hash; U+F3EF
+ fa-slideshare; U+F1E7
+ fa-snapchat; U+F2AB
+ fa-snapchat-ghost; U+F2AC
+ fa-snapchat-square; U+F2AD
+ fa-soundcloud; U+F1BE
+ fa-sourcetree; U+F7D3
+ fa-speakap; U+F3F3
+ fa-spotify; U+F1BC
+ fa-squarespace; U+F5BE
+ fa-stack-exchange; U+F18D
+ fa-stack-overflow; U+F16C
+ fa-staylinked; U+F3F5
+ fa-steam; U+F1B6
+ fa-steam-square; U+F1B7
+ fa-steam-symbol; U+F3F6
+ fa-sticker-mule; U+F3F7
+ fa-strava; U+F428
+ fa-stripe; U+F429
+ fa-stripe-s; U+F42A
+ fa-studiovinari; U+F3F8
+ fa-stumbleupon; U+F1A4
+ fa-stumbleupon-circle; U+F1A3
+ fa-superpowers; U+F2DD
+ fa-supple; U+F3F9
+ fa-suse; U+F7D6
+ fa-teamspeak; U+F4F9
+ fa-telegram; U+F2C6
+ fa-telegram-plane; U+F3FE
+ fa-tencent-weibo; U+F1D5
+ fa-the-red-yeti; U+F69D
+ fa-themeco; U+F5C6
+ fa-themeisle; U+F2B2
+ fa-think-peaks; U+F731
+ fa-trade-federation; U+F513
+ fa-trello; U+F181
+ fa-tripadvisor; U+F262
+ fa-tumblr; U+F173
+ fa-tumblr-square; U+F174
+ fa-twitch; U+F1E8
+ fa-twitter; U+F099
+ fa-twitter-square; U+F081
+ fa-typo3; U+F42B
+ fa-uber; U+F402
+ fa-ubuntu; U+F7DF
+ fa-uikit; U+F403
+ fa-uniregistry; U+F404
+ fa-untappd; U+F405
+ fa-ups; U+F7E0
+ fa-usb; U+F287
+ fa-usps; U+F7E1
+ fa-ussunnah; U+F407
+ fa-vaadin; U+F408
+ fa-viacoin; U+F237
+ fa-viadeo; U+F2A9
+ fa-viadeo-square; U+F2AA
+ fa-viber; U+F409
+ fa-vimeo; U+F40A
+ fa-vimeo-square; U+F194
+ fa-vimeo-v; U+F27D
+ fa-vine; U+F1CA
+ fa-vk; U+F189
+ fa-vnv; U+F40B
+ fa-vuejs; U+F41F
+ fa-weebly; U+F5CC
+ fa-weibo; U+F18A
+ fa-weixin; U+F1D7
+ fa-whatsapp; U+F232
+ fa-whatsapp-square; U+F40C
+ fa-whmcs; U+F40D
+ fa-wikipedia-w; U+F266
+ fa-windows; U+F17A
+ fa-wix; U+F5CF
+ fa-wizards-of-the-coast; U+F730
+ fa-wolf-pack-battalion; U+F514
+ fa-wordpress; U+F19A
+ fa-wordpress-simple; U+F411
+ fa-wpbeginner; U+F297
+ fa-wpexplorer; U+F2DE
+ fa-wpforms; U+F298
+ fa-wpressr; U+F3E4
+ fa-xbox; U+F412
+ fa-xing; U+F168
+ fa-xing-square; U+F169
+ fa-y-combinator; U+F23B
+ fa-yahoo; U+F19E
+ fa-yandex; U+F413
+ fa-yandex-international; U+F414
+ fa-yarn; U+F7E3
+ fa-yelp; U+F1E9
+ fa-yoast; U+F2B1
+ fa-youtube; U+F167
+ fa-youtube-square; U+F431
+ fa-zhihu; U+F63F
diff --git a/fontconfig/fonts.conf b/fontconfig/fonts.conf
@@ -0,0 +1,30 @@
+<?xml version='1.0'?>
+<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
+<fontconfig>
+
+ <alias>
+ <family>serif</family>
+ <prefer><family>Linux Libertine</family></prefer>
+ </alias>
+ <alias>
+ <family>sans-serif</family>
+ <prefer><family>Linux Biolinum</family></prefer>
+ </alias>
+ <alias>
+ <family>sans</family>
+ <prefer><family>Linux Biolinum</family></prefer>
+ </alias>
+ <alias>
+ <family>monospace</family>
+ <prefer><family>Blex Mono Nerd Font</family></prefer>
+ </alias>
+
+ <!-- This sets Symbola as the final fallback font for the monospace font family. -->
+ <match target="pattern">
+ <test name="family"><string>monospace</string></test>
+ <edit name="family" mode="append"><string>Hack</string></edit>
+ </match>
+
+</fontconfig>
+
+
diff --git a/gdfuse/bh/config b/gdfuse/bh/config
@@ -0,0 +1,66 @@
+acknowledge_abuse=false
+apps_script_format=desktop
+apps_script_icon=
+async_upload_queue=false
+async_upload_threads=10
+autodetect_mime=true
+cache_directory=
+client_id=
+client_secret=
+connect_timeout_ms=5000
+curl_debug_off=false
+data_directory=
+debug_buffers=false
+delete_forever_in_trash_folder=false
+desktop_entry_as_html=false
+desktop_entry_exec=
+disable_trash=false
+docs_file_extension=true
+document_format=desktop
+document_icon=
+download_docs=true
+drawing_format=desktop
+drawing_icon=
+form_format=desktop
+form_icon=
+fusion_table_format=desktop
+fusion_table_icon=
+keep_duplicates=false
+large_file_read_only=false
+large_file_threshold_mb=16
+log_directory=
+log_to=
+lost_and_found=false
+low_speed_limit=0
+low_speed_time=0
+map_format=desktop
+map_icon=
+max_cache_size_mb=512
+max_download_speed=0
+max_memory_cache_size=10485760
+max_retries=8
+max_upload_chunk_size=1099511627776
+max_upload_speed=0
+memory_buffer_size=1048576
+metadata_cache_time=60
+metadata_memory_cache=true
+metadata_memory_cache_saving_interval=30
+mv_keep_target=false
+presentation_format=desktop
+presentation_icon=
+read_ahead_buffers=3
+read_only=false
+redirect_uri=
+root_folder=
+scope=
+service_account_credentials_path=
+service_account_user_to_impersonate=
+shared_with_me=false
+spreadsheet_format=desktop
+spreadsheet_icon=
+sqlite3_busy_timeout=5000
+stream_large_files=false
+team_drive_id=
+umask=0o022
+verification_code=
+write_buffers=false
diff --git a/gdfuse/cwru/config b/gdfuse/cwru/config
@@ -0,0 +1,66 @@
+acknowledge_abuse=false
+apps_script_format=desktop
+apps_script_icon=
+async_upload_queue=false
+async_upload_threads=10
+autodetect_mime=true
+cache_directory=
+client_id=
+client_secret=
+connect_timeout_ms=5000
+curl_debug_off=false
+data_directory=
+debug_buffers=false
+delete_forever_in_trash_folder=false
+desktop_entry_as_html=false
+desktop_entry_exec=
+disable_trash=false
+docs_file_extension=true
+document_format=desktop
+document_icon=
+download_docs=true
+drawing_format=desktop
+drawing_icon=
+form_format=desktop
+form_icon=
+fusion_table_format=desktop
+fusion_table_icon=
+keep_duplicates=false
+large_file_read_only=false
+large_file_threshold_mb=16
+log_directory=
+log_to=
+lost_and_found=false
+low_speed_limit=0
+low_speed_time=0
+map_format=desktop
+map_icon=
+max_cache_size_mb=512
+max_download_speed=0
+max_memory_cache_size=10485760
+max_retries=8
+max_upload_chunk_size=1099511627776
+max_upload_speed=0
+memory_buffer_size=1048576
+metadata_cache_time=60
+metadata_memory_cache=true
+metadata_memory_cache_saving_interval=30
+mv_keep_target=false
+presentation_format=desktop
+presentation_icon=
+read_ahead_buffers=3
+read_only=false
+redirect_uri=
+root_folder=
+scope=
+service_account_credentials_path=
+service_account_user_to_impersonate=
+shared_with_me=false
+spreadsheet_format=desktop
+spreadsheet_icon=
+sqlite3_busy_timeout=5000
+stream_large_files=false
+team_drive_id=
+umask=0o022
+verification_code=
+write_buffers=false
diff --git a/gdfuse/default/config b/gdfuse/default/config
@@ -0,0 +1,66 @@
+acknowledge_abuse=false
+apps_script_format=desktop
+apps_script_icon=
+async_upload_queue=false
+async_upload_threads=10
+autodetect_mime=true
+cache_directory=
+client_id=
+client_secret=
+connect_timeout_ms=5000
+curl_debug_off=false
+data_directory=
+debug_buffers=false
+delete_forever_in_trash_folder=false
+desktop_entry_as_html=false
+desktop_entry_exec=
+disable_trash=false
+docs_file_extension=true
+document_format=desktop
+document_icon=
+download_docs=true
+drawing_format=desktop
+drawing_icon=
+form_format=desktop
+form_icon=
+fusion_table_format=desktop
+fusion_table_icon=
+keep_duplicates=false
+large_file_read_only=false
+large_file_threshold_mb=16
+log_directory=
+log_to=
+lost_and_found=false
+low_speed_limit=0
+low_speed_time=0
+map_format=desktop
+map_icon=
+max_cache_size_mb=512
+max_download_speed=0
+max_memory_cache_size=10485760
+max_retries=8
+max_upload_chunk_size=1099511627776
+max_upload_speed=0
+memory_buffer_size=1048576
+metadata_cache_time=60
+metadata_memory_cache=true
+metadata_memory_cache_saving_interval=30
+mv_keep_target=false
+presentation_format=desktop
+presentation_icon=
+read_ahead_buffers=3
+read_only=false
+redirect_uri=
+root_folder=
+scope=
+service_account_credentials_path=
+service_account_user_to_impersonate=
+shared_with_me=false
+spreadsheet_format=desktop
+spreadsheet_icon=
+sqlite3_busy_timeout=5000
+stream_large_files=false
+team_drive_id=
+umask=0o022
+verification_code=
+write_buffers=false
diff --git a/git/config b/git/config
@@ -0,0 +1,3 @@
+[user]
+ email = cbeauhilton@gmail.com
+ name = C. Beau Hilton
diff --git a/gtk-2.0/gtkfilechooser.ini b/gtk-2.0/gtkfilechooser.ini
@@ -0,0 +1,11 @@
+[Filechooser Settings]
+LocationMode=filename-entry
+ShowHidden=false
+ShowSizeColumn=true
+GeometryX=0
+GeometryY=0
+GeometryWidth=948
+GeometryHeight=642
+SortColumn=name
+SortOrder=ascending
+StartupMode=recent
diff --git a/gtk-2.0/gtkrc-2.0 b/gtk-2.0/gtkrc-2.0
@@ -0,0 +1,19 @@
+# DO NOT EDIT! This file will be overwritten by LXAppearance.
+# Any customization should be done in ~/.gtkrc-2.0.mine instead.
+
+include "/home/luke/.gtkrc-2.0.mine"
+gtk-theme-name="Arc-Gruvbox"
+gtk-icon-theme-name="Adwaita"
+gtk-font-name="Sans 10"
+gtk-cursor-theme-name="Adwaita"
+gtk-cursor-theme-size=0
+gtk-toolbar-style=GTK_TOOLBAR_TEXT
+gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
+gtk-button-images=0
+gtk-menu-images=1
+gtk-enable-event-sounds=1
+gtk-enable-input-feedback-sounds=1
+gtk-xft-antialias=1
+gtk-xft-hinting=1
+gtk-xft-hintstyle="hintfull"
+gtk-xft-rgba="rgb"
diff --git a/gtk-3.0/settings.ini b/gtk-3.0/settings.ini
@@ -0,0 +1,16 @@
+[Settings]
+gtk-theme-name=Arc-Gruvbox
+gtk-icon-theme-name=Adwaita
+gtk-font-name=Sans 10
+gtk-cursor-theme-size=0
+gtk-toolbar-style=GTK_TOOLBAR_TEXT
+gtk-toolbar-icon-size=GTK_ICON_SIZE_LARGE_TOOLBAR
+gtk-button-images=0
+gtk-menu-images=1
+gtk-enable-event-sounds=1
+gtk-enable-input-feedback-sounds=1
+gtk-xft-antialias=1
+gtk-xft-hinting=1
+gtk-xft-hintstyle=hintfull
+gtk-xft-rgba=rgb
+gtk-cursor-theme-name=Adwaita
diff --git a/htop/htoprc b/htop/htoprc
@@ -0,0 +1,26 @@
+# Beware! This file is rewritten by htop when settings are changed in the interface.
+# The parser is also very primitive, and not human-friendly.
+fields=0 48 17 18 38 39 40 2 46 47 49 1
+sort_key=47
+sort_direction=1
+hide_threads=0
+hide_kernel_threads=1
+hide_userland_threads=0
+shadow_other_users=0
+show_thread_names=0
+show_program_path=1
+highlight_base_name=0
+highlight_megabytes=1
+highlight_threads=1
+tree_view=0
+header_margin=1
+detailed_cpu_time=0
+cpu_count_from_zero=0
+update_process_names=0
+account_guest_in_cpu_meter=0
+color_scheme=0
+delay=15
+left_meters=AllCPUs Memory Swap
+left_meter_modes=1 1 1
+right_meters=Tasks LoadAverage Uptime
+right_meter_modes=2 2 2
diff --git a/inputrc b/inputrc
@@ -0,0 +1,19 @@
+$include /etc/inputrc
+set editing-mode vi
+$if mode=vi
+
+set show-mode-in-prompt on
+set vi-ins-mode-string \1\e[6 q\2
+set vi-cmd-mode-string \1\e[2 q\2
+
+set keymap vi-command
+# these are for vi-command mode
+Control-l: clear-screen
+Control-a: beginning-of-line
+
+set keymap vi-insert
+# these are for vi-insert mode
+Control-l: clear-screen
+Control-a: beginning-of-line
+
+$endif
diff --git a/isync/mbsyncrc b/isync/mbsyncrc
@@ -0,0 +1,25 @@
+IMAPStore gmail-remote
+Host imap.gmail.com
+Port 993
+User cbeauhilton@gmail.com
+PassCmd "pass mutt-wizard-gmail"
+SSLType IMAPS
+CertificateFile /etc/ssl/certs/ca-certificates.crt
+
+MaildirStore gmail-local
+Subfolders Verbatim
+Path ~/.local/share/mail/gmail/
+Inbox ~/.local/share/mail/gmail/INBOX
+Flatten .
+
+Channel gmail
+Expunge Both
+Master :gmail-remote:
+Slave :gmail-local:
+Patterns * !"[Gmail]/All\ Mail"
+Create Both
+SyncState *
+MaxMessages 0
+ExpireUnread no
+# End profile
+
diff --git a/jupyter/profile_default/startup/README b/jupyter/profile_default/startup/README
@@ -0,0 +1,11 @@
+This is the IPython startup directory
+
+.py and .ipy files in this directory will be run *prior* to any code or files specified
+via the exec_lines or exec_files configurables whenever you load this profile.
+
+Files will be run in lexicographical order, so you can control the execution order of files
+with a prefix, e.g.::
+
+ 00-first.py
+ 50-middle.py
+ 99-last.ipy
diff --git a/mimeapps.list b/mimeapps.list
@@ -0,0 +1,11 @@
+[Default Applications]
+x-scheme-handler/magnet=torrent.desktop;
+x-scheme-handler/mailto=chromium.desktop
+text/plain=text.desktop;
+text/x-shellscript=text.desktop;
+application/pdf=pdf.desktop;
+image/png=img.desktop;
+image/jpeg=img.desktop;
+image/gif=img.desktop;
+application/rss+xml=rss.desktop
+x-scheme-handler/webcal=chromium.desktop
diff --git a/mpd/mpd.conf b/mpd/mpd.conf
@@ -0,0 +1,28 @@
+db_file "~/.config/mpd/database"
+log_file "~/.config/mpd/log"
+music_directory "~/tunes"
+playlist_directory "~/.config/mpd/playlists"
+pid_file "~/.config/mpd/pid"
+state_file "~/.config/mpd/state"
+sticker_file "~/.config/mpd/sticker.sql"
+
+##user "beau"
+
+auto_update "yes"
+
+bind_to_address "127.0.0.1"
+restore_paused "yes"
+max_output_buffer_size "16384"
+
+audio_output {
+ type "pulse"
+ name "pulse audio"
+ mixer_type "software"
+}
+
+audio_output {
+type "fifo"
+name "my_fifo"
+path "/tmp/mpd.fifo"
+format "44100:16:2"
+}
diff --git a/mpv/input.conf b/mpv/input.conf
@@ -0,0 +1,199 @@
+# mpv keybindings
+#
+# Location of user-defined bindings: ~/.config/mpv/input.conf
+#
+# Lines starting with # are comments. Use SHARP to assign the # key.
+# Copy this file and uncomment and edit the bindings you want to change.
+#
+# List of commands and further details: DOCS/man/input.rst
+# List of special keys: --input-keylist
+# Keybindings testing mode: mpv --input-test --force-window --idle
+#
+# Use 'ignore' to unbind a key fully (e.g. 'ctrl+a ignore').
+#
+# Strings need to be quoted and escaped:
+# KEY show-text "This is a single backslash: \\ and a quote: \" !"
+#
+# You can use modifier-key combinations like Shift+Left or Ctrl+Alt+x with
+# the modifiers Shift, Ctrl, Alt and Meta (may not work on the terminal).
+#
+# The default keybindings are hardcoded into the mpv binary.
+# You can disable them completely with: --no-input-default-bindings
+
+# Developer note:
+# On compilation, this file is baked into the mpv binary, and all lines are
+# uncommented (unless '#' is followed by a space) - thus this file defines the
+# default key bindings.
+
+# If this is enabled, treat all the following bindings as default.
+#default-bindings start
+
+#MOUSE_BTN0 ignore # don't do anything
+#MOUSE_BTN0_DBL cycle fullscreen # toggle fullscreen on/off
+#MOUSE_BTN2 cycle pause # toggle pause on/off
+#MOUSE_BTN3 seek 10
+#MOUSE_BTN4 seek -10
+#MOUSE_BTN5 add volume -2
+#MOUSE_BTN6 add volume 2
+
+# Mouse wheels, touchpad or other input devices that have axes
+# if the input devices supports precise scrolling it will also scale the
+# numeric value accordingly
+#AXIS_UP seek 10
+#AXIS_DOWN seek -10
+#AXIS_LEFT seek 5
+#AXIS_RIGHT seek -5
+
+## Seek units are in seconds, but note that these are limited by keyframes
+#RIGHT seek 5
+#LEFT seek -5
+#UP seek 60
+#DOWN seek -60
+# Do smaller, always exact (non-keyframe-limited), seeks with shift.
+# Don't show them on the OSD (no-osd).
+#Shift+RIGHT no-osd seek 1 exact
+#Shift+LEFT no-osd seek -1 exact
+#Shift+UP no-osd seek 5 exact
+#Shift+DOWN no-osd seek -5 exact
+# Skip to previous/next subtitle (subject to some restrictions; see manpage)
+#Ctrl+LEFT no-osd sub-seek -1
+#Ctrl+RIGHT no-osd sub-seek 1
+#PGUP add chapter 1 # skip to next chapter
+#PGDWN add chapter -1 # skip to previous chapter
+#Shift+PGUP seek 600
+#Shift+PGDWN seek -600
+#[ multiply speed 0.9091 # scale playback speed
+#] multiply speed 1.1
+#{ multiply speed 0.5
+#} multiply speed 2.0
+#BS set speed 1.0 # reset speed to normal
+#q quit
+#Q quit-watch-later
+#q {encode} quit 4
+#ESC set fullscreen no
+#ESC {encode} quit 4
+#p cycle pause # toggle pause/playback mode
+#. frame-step # advance one frame and pause
+#, frame-back-step # go back by one frame and pause
+#SPACE cycle pause
+#> playlist-next # skip to next file
+#ENTER playlist-next # skip to next file
+#< playlist-prev # skip to previous file
+#O no-osd cycle-values osd-level 3 1 # cycle through OSD mode
+#o show-progress
+#P show-progress
+#I show-text "${filename}" # display filename in osd
+#z add sub-delay -0.1 # subtract 100 ms delay from subs
+#x add sub-delay +0.1 # add
+#ctrl++ add audio-delay 0.100 # this changes audio/video sync
+#ctrl+- add audio-delay -0.100
+#9 add volume -2
+#/ add volume -2
+#0 add volume 2
+#* add volume 2
+#m cycle mute
+#1 add contrast -1
+#2 add contrast 1
+#3 add brightness -1
+#4 add brightness 1
+#5 add gamma -1
+#6 add gamma 1
+#7 add saturation -1
+#8 add saturation 1
+#Alt+0 set window-scale 0.5
+#Alt+1 set window-scale 1.0
+#Alt+2 set window-scale 2.0
+# toggle deinterlacer (automatically inserts or removes required filter)
+#d cycle deinterlace
+#r add sub-pos -1 # move subtitles up
+#t add sub-pos +1 # down
+#v cycle sub-visibility
+# stretch SSA/ASS subtitles with anamorphic videos to match historical
+#V cycle sub-ass-vsfilter-aspect-compat
+# switch between applying no style overrides to SSA/ASS subtitles, and
+# overriding them almost completely with the normal subtitle style
+#u cycle-values sub-ass-style-override "force" "no"
+#j cycle sub # cycle through subtitles
+#J cycle sub down # ...backwards
+#SHARP cycle audio # switch audio streams
+#_ cycle video
+#T cycle ontop # toggle video window ontop of other windows
+#f cycle fullscreen # toggle fullscreen
+#s screenshot # take a screenshot
+#S screenshot video # ...without subtitles
+#Ctrl+s screenshot window # ...with subtitles and OSD, and scaled
+#Alt+s screenshot each-frame # automatically screenshot every frame
+#w add panscan -0.1 # zoom out with -panscan 0 -fs
+#e add panscan +0.1 # in
+# cycle video aspect ratios; "-1" is the container aspect
+#A cycle-values video-aspect "16:9" "4:3" "2.35:1" "-1"
+#POWER quit
+#PLAY cycle pause
+#PAUSE cycle pause
+#PLAYPAUSE cycle pause
+#STOP quit
+#FORWARD seek 60
+#REWIND seek -60
+#NEXT playlist-next
+#PREV playlist-prev
+#VOLUME_UP add volume 2
+#VOLUME_DOWN add volume -2
+#MUTE cycle mute
+#CLOSE_WIN quit
+#CLOSE_WIN {encode} quit 4
+#E cycle edition # next edition
+#l ab-loop # Set/clear A-B loop points
+#L cycle-values loop "inf" "no" # toggle infinite looping
+#ctrl+c quit 4
+
+# Apple Remote section
+#AR_PLAY cycle pause
+#AR_PLAY_HOLD quit
+#AR_CENTER cycle pause
+#AR_CENTER_HOLD quit
+#AR_NEXT seek 10
+#AR_NEXT_HOLD seek 120
+#AR_PREV seek -10
+#AR_PREV_HOLD seek -120
+#AR_MENU show-progress
+#AR_MENU_HOLD cycle mute
+#AR_VUP add volume 2
+#AR_VUP_HOLD add chapter 1
+#AR_VDOWN add volume -2
+#AR_VDOWN_HOLD add chapter -1
+
+# For tv://
+#h cycle tv-channel -1 # previous channel
+#k cycle tv-channel +1 # next channel
+
+# For dvb://
+#H cycle dvb-channel-name -1 # previous channel
+#K cycle dvb-channel-name +1 # next channel
+
+#
+# Legacy bindings (may or may not be removed in the future)
+#
+#! add chapter -1 # skip to previous chapter
+#@ add chapter 1 # next
+
+#
+# Not assigned by default
+# (not an exhaustive list of unbound commands)
+#
+
+# ? add sub-scale +0.1 # increase subtitle font size
+# ? add sub-scale -0.1 # decrease subtitle font size
+# ? sub-step -1 # immediately display next subtitle
+# ? sub-step +1 # previous
+# ? cycle angle # switch DVD/Bluray angle
+# ? add balance -0.1 # adjust audio balance in favor of left
+# ? add balance 0.1 # right
+# ? cycle sub-forced-only # toggle DVD forced subs
+# ? cycle program # cycle transport stream programs
+# ? stop # stop playback (quit or enter idle mode)
+
+l seek 5
+h seek -5
+j seek -60
+k seek 60
+S cycle sub
diff --git a/msmtp/config b/msmtp/config
@@ -0,0 +1,14 @@
+defaults
+auth on
+tls on
+tls_trust_file /etc/ssl/certs/ca-certificates.crt
+logfile ~/.config/msmtp/msmtp.log
+
+account gmail
+host smtp.gmail.com
+port 587
+from cbeauhilton@gmail.com
+user cbeauhilton@gmail.com
+passwordeval "pass mutt-wizard-gmail"
+
+
diff --git a/mutt/.mailsynclastrun b/mutt/.mailsynclastrun
diff --git a/mutt/accounts/1-gmail.muttrc b/mutt/accounts/1-gmail.muttrc
@@ -0,0 +1,35 @@
+# vim: filetype=neomuttrc
+# muttrc file for account gmail
+set realname = "Beau Hilton"
+set from = "cbeauhilton@gmail.com"
+set sendmail = "msmtp -a gmail"
+alias me Beau Hilton <cbeauhilton@gmail.com>
+set folder = "/home/beau/.local/share/mail/gmail"
+set header_cache = /home/beau/.cache/mutt-wizard/gmail/headers
+set message_cachedir = /home/beau/.cache/mutt-wizard/gmail/bodies
+set mbox_type = Maildir
+
+bind index,pager gg noop
+bind index,pager g noop
+bind index,pager M noop
+bind index,pager C noop
+bind index gg first-entry
+macro index o "<shell-escape>mailsync -V gmail<enter>" "run mbsync to sync gmail"
+unmailboxes *
+
+set spoolfile = "+INBOX"
+set record = "+[Gmail].Sent\ Mail"
+set postponed = "+[Gmail].Drafts"
+set trash = "+[Gmail].All\ Mail"
+mailboxes "=INBOX" "=[Gmail].Drafts" "=newsletters" "=[Gmail].Sent\ Mail" "=eras" "=NoteToSelf" "=[Gmail].Spam" "=stuff" "=[Gmail].Important" "=[Gmail].Starred" "=[Gmail].Trash" "=newsletters.github" "=newsletters.medicine" "=[Gmail].All\ Mail"
+macro index,pager gi "<change-folder>=INBOX<enter>" "go to inbox" # mw-autogenerated
+macro index,pager Mi ";<save-message>=INBOX<enter>" "move mail to inbox" # mw-autogenerated
+macro index,pager Ci ";<copy-message>=INBOX<enter>" "copy mail to inbox" # mw-autogenerated
+macro index,pager gs "<change-folder>=[Gmail].Sent\ Mail<enter>" "go to sent" # mw-autogenerated
+macro index,pager gd "<change-folder>=[Gmail].Drafts<enter>" "go to drafts" # mw-autogenerated
+macro index,pager gt "<change-folder>=[Gmail].Trash<enter>" "go to trash" # mw-autogenerated
+macro index,pager gS "<change-folder>=[Gmail].Spam<enter>" "go to spam" # mw-autogenerated
+macro index,pager gs "<change-folder>=[Gmail]/Starred<enter>" "Go to starred messages"
+macro index,pager ga "<change-folder>=[Gmail].All\ Mail<enter>" "Go to all mail"
+macro index,pager d "<save-message>=[Gmail].All\ Mail<enter><enter>" "Trash (archive)"
+macro index,pager y "<save-message>=[Gmail].All\ Mail<enter><enter>" "Archive"
diff --git a/mutt/muttrc b/mutt/muttrc
@@ -0,0 +1,17 @@
+# vim: filetype=neomuttrc
+source /usr/share/mutt-wizard/mutt-wizard.muttrc # mw-autogenerated
+source /home/beau/.config/mutt/accounts/1-gmail.muttrc # mw-autogenerated
+macro index,pager i1 '<sync-mailbox><enter-command>source /home/beau/.config/mutt/accounts/1-gmail.muttrc<enter><change-folder>!<enter>;<check-stats>' "switch to cbeauhilton@gmail.com" # mw-autogenerated
+
+set move = no
+set fast_reply = yes
+set include = yes
+set pager_index_lines = 10 # number of index lines to show
+set pager_context = 3 # number of context lines to show
+set pager_stop = yes # don't go to next message automatically
+set menu_scroll = yes # scroll in menus
+set tilde = yes # show tildes like in vim
+set markers = no # no ugly plus signs
+macro index,pager \cw "<pipe-message> urlscan<Enter>" "call urlscan to extract URLs out of a message"
+
+macro attach,compose \cw "<pipe-entry> urlscan<Enter>" "call urlscan to extract URLs out of a message"
diff --git a/ncmpcpp/bindings b/ncmpcpp/bindings
@@ -0,0 +1,624 @@
+##############################################################
+## This is the example bindings file. Copy it to ##
+## ~/.ncmpcpp/bindings or $XDG_CONFIG_HOME/ncmpcpp/bindings ##
+## and set up your preferences ##
+##############################################################
+##
+##### General rules #####
+##
+## 1) Because each action has runtime checks whether it's
+## ok to run it, a few actions can be bound to one key.
+## Actions will be bound in order given in configuration
+## file. When a key is pressed, first action in order
+## will test itself whether it's possible to run it. If
+## test succeeds, action is executed and other actions
+## bound to this key are ignored. If it doesn't, next
+## action in order tests itself etc.
+##
+## 2) It's possible to bind more that one action at once
+## to a key. It can be done using the following syntax:
+##
+## def_key "key"
+## action1
+## action2
+## ...
+##
+## This creates a chain of actions. When such chain is
+## executed, each action in chain is run until the end of
+## chain is reached or one of its actions fails to execute
+## due to its requirements not being met. If multiple actions
+## and/or chains are bound to the same key, they will be
+## consecutively run until one of them gets fully executed.
+##
+## 3) When ncmpcpp starts, bindings configuration file is
+## parsed and then ncmpcpp provides "missing pieces"
+## of default keybindings. If you want to disable some
+## bindings, there is a special action called 'dummy'
+## for that purpose. Eg. if you want to disable ability
+## to crop playlists, you need to put the following
+## into configuration file:
+##
+## def_key "C"
+## dummy
+##
+## After that ncmpcpp will not bind any default action
+## to this key.
+##
+## 4) To let you write simple macros, the following special
+## actions are provided:
+##
+## - push_character "character" - pushes given special
+## character into input queue, so it will be immediately
+## picked by ncmpcpp upon next call to readKey function.
+## Accepted values: mouse, up, down, page_up, page_down,
+## home, end, space, enter, insert, delete, left, right,
+## tab, ctrl-a, ctrl-b, ..., ctrl-z, ctrl-[, ctrl-\\,
+## ctrl-], ctrl-^, ctrl-_, f1, f2, ..., f12, backspace.
+## In addition, most of these names can be prefixed with
+## alt-/ctrl-/shift- to be recognized with the appropriate
+## modifier key(s).
+##
+## - push_characters "string" - pushes given string into
+## input queue.
+##
+## - require_runnable "action" - checks whether given action
+## is runnable and fails if it isn't. This is especially
+## useful when mixed with previous two functions. Consider
+## the following macro definition:
+##
+## def_key "key"
+## push_characters "custom_filter"
+## apply_filter
+##
+## If apply_filter can't be currently run, we end up with
+## sequence of characters in input queue which will be
+## treated just as we typed them. This may lead to unexpected
+## results (in this case 'c' will most likely clear current
+## playlist, 'u' will trigger database update, 's' will stop
+## playback etc.). To prevent such thing from happening, we
+## need to change above definition to this one:
+##
+## def_key "key"
+## require_runnable "apply_filter"
+## push_characters "custom_filter"
+## apply_filter
+##
+## Here, first we test whether apply_filter can be actually run
+## before we stuff characters into input queue, so if condition
+## is not met, whole chain is aborted and we're fine.
+##
+## - require_screen "screen" - checks whether given screen is
+## currently active. accepted values: browser, clock, help,
+## media_library, outputs, playlist, playlist_editor,
+## search_engine, tag_editor, visualizer, last_fm, lyrics,
+## selected_items_adder, server_info, song_info,
+## sort_playlist_dialog, tiny_tag_editor.
+##
+## - run_external_command "command" - runs given command using
+## system() function.
+##
+## 5) In addition to binding to a key, you can also bind actions
+## or chains of actions to a command. If it comes to commands,
+## syntax is very similar to defining keys. Here goes example
+## definition of a command:
+##
+## def_command "quit" [deferred]
+## stop
+## quit
+##
+## If you execute the above command (which can be done by
+## invoking action execute_command, typing 'quit' and pressing
+## enter), ncmpcpp will stop the player and then quit. Note the
+## presence of word 'deferred' enclosed in square brackets. It
+## tells ncmpcpp to wait for confirmation (ie. pressing enter)
+## after you typed quit. Instead of 'deferred', 'immediate'
+## could be used. Then ncmpcpp will not wait for confirmation
+## (enter) and will execute the command the moment it sees it.
+##
+## Note: while command chains are executed, internal environment
+## update (which includes current window refresh and mpd status
+## update) is not performed for performance reasons. However, it
+## may be desirable to do so in some situration. Therefore it's
+## possible to invoke by hand by performing 'update enviroment'
+## action.
+##
+## Note: There is a difference between:
+##
+## def_key "key"
+## action1
+##
+## def_key "key"
+## action2
+##
+## and
+##
+## def_key "key"
+## action1
+## action2
+##
+## First one binds two single actions to the same key whilst
+## second one defines a chain of actions. The behavior of
+## these two is different and is described in (1) and (2).
+##
+## Note: Function def_key accepts non-ascii characters.
+##
+##### List of unbound actions #####
+##
+## The following actions are not bound to any key/command:
+##
+## - set_volume
+##
+#
+#def_key "mouse"
+# mouse_event
+#
+#def_key "up"
+# scroll_up
+#
+#def_key "shift-up"
+# select_item
+# scroll_up
+#
+#def_key "down"
+# scroll_down
+#
+#def_key "shift-down"
+# select_item
+# scroll_down
+#
+#def_key "["
+# scroll_up_album
+#
+#def_key "]"
+# scroll_down_album
+#
+#def_key "{"
+# scroll_up_artist
+#
+#def_key "}"
+# scroll_down_artist
+#
+#def_key "page_up"
+# page_up
+#
+#def_key "page_down"
+# page_down
+#
+#def_key "home"
+# move_home
+#
+#def_key "end"
+# move_end
+#
+#def_key "insert"
+# select_item
+#
+#def_key "enter"
+# enter_directory
+#
+#def_key "enter"
+# toggle_output
+#
+#def_key "enter"
+# run_action
+#
+#def_key "enter"
+# play_item
+#
+#def_key "space"
+# add_item_to_playlist
+#
+#def_key "space"
+# toggle_lyrics_update_on_song_change
+#
+#def_key "space"
+# toggle_visualization_type
+#
+#def_key "delete"
+# delete_playlist_items
+#
+#def_key "delete"
+# delete_browser_items
+#
+#def_key "delete"
+# delete_stored_playlist
+#
+#def_key "right"
+# next_column
+#
+#def_key "right"
+# slave_screen
+#
+#def_key "right"
+# volume_up
+#
+#def_key "+"
+# volume_up
+#
+#def_key "left"
+# previous_column
+#
+#def_key "left"
+# master_screen
+#
+#def_key "left"
+# volume_down
+#
+#def_key "-"
+# volume_down
+#
+#def_key ":"
+# execute_command
+#
+#def_key "tab"
+# next_screen
+#
+#def_key "shift-tab"
+# previous_screen
+#
+#def_key "f1"
+# show_help
+#
+#def_key "1"
+# show_playlist
+#
+#def_key "2"
+# show_browser
+#
+#def_key "2"
+# change_browse_mode
+#
+#def_key "3"
+# show_search_engine
+#
+#def_key "3"
+# reset_search_engine
+#
+#def_key "4"
+# show_media_library
+#
+#def_key "4"
+# toggle_media_library_columns_mode
+#
+#def_key "5"
+# show_playlist_editor
+#
+#def_key "6"
+# show_tag_editor
+#
+#def_key "7"
+# show_outputs
+#
+#def_key "8"
+# show_visualizer
+#
+#def_key "="
+# show_clock
+#
+#def_key "@"
+# show_server_info
+#
+#def_key "s"
+# stop
+#
+#def_key "p"
+# pause
+#
+#def_key ">"
+# next
+#
+#def_key "<"
+# previous
+#
+#def_key "ctrl-h"
+# jump_to_parent_directory
+#
+#def_key "ctrl-h"
+# replay_song
+#
+#def_key "backspace"
+# jump_to_parent_directory
+#
+#def_key "backspace"
+# replay_song
+#
+#def_key "f"
+# seek_forward
+#
+#def_key "b"
+# seek_backward
+#
+#def_key "r"
+# toggle_repeat
+#
+#def_key "z"
+# toggle_random
+#
+#def_key "y"
+# save_tag_changes
+#
+#def_key "y"
+# start_searching
+#
+#def_key "y"
+# toggle_single
+#
+#def_key "R"
+# toggle_consume
+#
+#def_key "Y"
+# toggle_replay_gain_mode
+#
+#def_key "T"
+# toggle_add_mode
+#
+#def_key "|"
+# toggle_mouse
+#
+#def_key "#"
+# toggle_bitrate_visibility
+#
+#def_key "Z"
+# shuffle
+#
+#def_key "x"
+# toggle_crossfade
+#
+#def_key "X"
+# set_crossfade
+#
+#def_key "u"
+# update_database
+#
+#def_key "ctrl-s"
+# sort_playlist
+#
+#def_key "ctrl-s"
+# toggle_browser_sort_mode
+#
+#def_key "ctrl-s"
+# toggle_media_library_sort_mode
+#
+#def_key "ctrl-r"
+# reverse_playlist
+#
+#def_key "ctrl-f"
+# apply_filter
+#
+#def_key "ctrl-_"
+# select_found_items
+#
+#def_key "/"
+# find
+#
+#def_key "/"
+# find_item_forward
+#
+#def_key "?"
+# find
+#
+#def_key "?"
+# find_item_backward
+#
+#def_key "."
+# next_found_item
+#
+#def_key ","
+# previous_found_item
+#
+#def_key "w"
+# toggle_find_mode
+#
+#def_key "e"
+# edit_song
+#
+#def_key "e"
+# edit_library_tag
+#
+#def_key "e"
+# edit_library_album
+#
+#def_key "e"
+# edit_directory_name
+#
+#def_key "e"
+# edit_playlist_name
+#
+#def_key "e"
+# edit_lyrics
+#
+#def_key "i"
+# show_song_info
+#
+#def_key "I"
+# show_artist_info
+#
+#def_key "g"
+# jump_to_position_in_song
+#
+#def_key "l"
+# show_lyrics
+#
+#def_key "ctrl-v"
+# select_range
+#
+#def_key "v"
+# reverse_selection
+#
+#def_key "V"
+# remove_selection
+#
+#def_key "B"
+# select_album
+#
+#def_key "a"
+# add_selected_items
+#
+#def_key "c"
+# clear_playlist
+#
+#def_key "c"
+# clear_main_playlist
+#
+#def_key "C"
+# crop_playlist
+#
+#def_key "C"
+# crop_main_playlist
+#
+#def_key "m"
+# move_sort_order_up
+#
+#def_key "m"
+# move_selected_items_up
+#
+#def_key "n"
+# move_sort_order_down
+#
+#def_key "n"
+# move_selected_items_down
+#
+#def_key "M"
+# move_selected_items_to
+#
+#def_key "A"
+# add
+#
+#def_key "S"
+# save_playlist
+#
+#def_key "o"
+# jump_to_playing_song
+#
+#def_key "G"
+# jump_to_browser
+#
+#def_key "G"
+# jump_to_playlist_editor
+#
+#def_key "~"
+# jump_to_media_library
+#
+#def_key "E"
+# jump_to_tag_editor
+#
+#def_key "U"
+# toggle_playing_song_centering
+#
+#def_key "P"
+# toggle_display_mode
+#
+#def_key "\\"
+# toggle_interface
+#
+#def_key "!"
+# toggle_separators_between_albums
+#
+#def_key "L"
+# toggle_lyrics_fetcher
+#
+#def_key "F"
+# fetch_lyrics_in_background
+#
+#def_key "alt-l"
+# toggle_fetching_lyrics_in_background
+#
+#def_key "ctrl-l"
+# toggle_screen_lock
+#
+#def_key "`"
+# toggle_library_tag_type
+#
+#def_key "`"
+# refetch_lyrics
+#
+#def_key "`"
+# add_random_items
+#
+#def_key "ctrl-p"
+# set_selected_items_priority
+#
+#def_key "q"
+# quit
+#
+#
+#def_key "f"
+# find
+#def_key "f"
+# find_item_forward
+
+def_key "+"
+ show_clock
+def_key "="
+ volume_up
+
+def_key "j"
+ scroll_down
+def_key "k"
+ scroll_up
+
+def_key "ctrl-u"
+ page_up
+#push_characters "kkkkkkkkkkkkkkk"
+def_key "ctrl-d"
+ page_down
+#push_characters "jjjjjjjjjjjjjjj"
+def_key "u"
+ page_up
+#push_characters "kkkkkkkkkkkkkkk"
+def_key "d"
+ page_down
+#push_characters "jjjjjjjjjjjjjjj"
+def_key "h"
+ previous_column
+def_key "l"
+ next_column
+
+def_key "."
+ show_lyrics
+
+def_key "n"
+ next_found_item
+def_key "N"
+ previous_found_item
+
+# not used but bound
+def_key "J"
+ move_sort_order_down
+def_key "K"
+ move_sort_order_up
+def_key "h"
+ jump_to_parent_directory
+def_key "l"
+ enter_directory
+def_key "l"
+ run_action
+def_key "l"
+ play_item
+def_key "m"
+ show_media_library
+def_key "m"
+ toggle_media_library_columns_mode
+def_key "t"
+ show_tag_editor
+def_key "v"
+ show_visualizer
+def_key "G"
+ move_end
+def_key "g"
+ move_home
+#jump_to_position_in_song
+def_key "U"
+ update_database
+def_key "s"
+ reset_search_engine
+def_key "s"
+ show_search_engine
+def_key "f"
+ show_browser
+def_key "f"
+ change_browse_mode
+def_key "x"
+ delete_playlist_items
+def_key "P"
+ show_playlist
diff --git a/ncmpcpp/config b/ncmpcpp/config
@@ -0,0 +1,600 @@
+##############################################################################
+## This is the example configuration file. Copy it to $HOME/.ncmpcpp/config ##
+## or $XDG_CONFIG_HOME/ncmpcpp/config and set up your preferences. ##
+##############################################################################
+#
+##### active settings #####
+
+ncmpcpp_directory = ~/.config/ncmpcpp
+
+visualizer_fifo_path = "/tmp/mpd.fifo"
+visualizer_output_name = "my_fifo"
+visualizer_sync_interval = "30"
+visualizer_in_stereo = "yes"
+visualizer_type = "spectrum"
+visualizer_look = "+|"
+
+lyrics_directory = ~/.config/lyrics
+
+mpd_music_dir = "~/tunes"
+
+message_delay_time = 1
+
+song_list_format = {$4%a - }{%t}|{$8%f$9}$R{$3(%l)$9}
+song_status_format = $b{{$8"%t"}} $3by {$4%a{ $3in $7%b{ (%y)}} $3}|{$8%f}
+song_library_format = {%n - }{%t}|{%f}
+alternative_header_first_line_format = $b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b
+alternative_header_second_line_format = {{$4$b%a$/b$9}{ - $7%b$9}{ ($4%y$9)}}|{%D}
+current_item_prefix = $(cyan)$r$b
+current_item_suffix = $/r$(end)$/b
+current_item_inactive_column_prefix = $(magenta)$r
+current_item_inactive_column_suffix = $/r$(end)
+
+playlist_display_mode = columns
+browser_display_mode = columns
+
+progressbar_look = ->
+
+media_library_primary_tag = album_artist
+media_library_albums_split_by_date = no
+
+startup_screen = visualizer
+
+display_volume_level = no
+
+ignore_leading_the = yes
+external_editor = vim
+use_console_editor = yes
+
+empty_tag_color = magenta
+main_window_color = white
+progressbar_color = black:b
+progressbar_elapsed_color = blue:b
+statusbar_color = red
+statusbar_time_color = cyan:b
+
+##### directories ######
+##
+## Directory for storing ncmpcpp related files. Changing it is useful if you
+## want to store everything somewhere else and provide command line setting for
+## alternative location to config file which defines that while launching
+## ncmpcpp.
+##
+#
+# ncmpcpp_directory = ~/.config/ncmpcpp
+#
+##
+## Directory for storing downloaded lyrics. It defaults to ~/.lyrics since other
+## MPD clients (eg. ncmpc) also use that location.
+##
+#
+# lyrics_directory = ~/.config/lyrics
+#
+##### connection settings #####
+#
+#mpd_host = localhost
+#
+#mpd_port = 6600
+#
+#mpd_connection_timeout = 5
+#
+## Needed for tag editor and file operations to work.
+##
+#mpd_music_dir = "~/tunes"
+#
+#mpd_crossfade_time = 5
+#
+##### music visualizer #####
+##
+## Note: In order to make music visualizer work you'll need to use mpd fifo
+## output, whose format parameter has to be set to 44100:16:1 for mono
+## visualization or 44100:16:2 for stereo visualization. Example configuration
+## (it has to be put into mpd.conf):
+##
+## audio_output {
+## type "fifo"
+## name "Visualizer feed"
+## path "/tmp/mpd.fifo"
+## format "44100:16:2"
+## }
+##
+#
+#visualizer_fifo_path = "/tmp/mpd.fifo"
+#visualizer_output_name = "my_fifo"
+#visualizer_sync_interval = "20"
+#visualizer_in_stereo = "yes"
+#visualizer_type = "spectrum"
+#visualizer_look = "+|"
+#
+##
+## Note: Below parameter is needed for ncmpcpp to determine which output
+## provides data for visualizer and thus allow syncing between visualization and
+## sound as currently there are some problems with it.
+##
+#
+#visualizer_output_name = Visualizer feed
+#
+##
+## If you set format to 44100:16:2, make it 'yes'.
+##
+#visualizer_in_stereo = yes
+#
+##
+## Note: Below parameter defines how often ncmpcpp has to "synchronize"
+## visualizer and audio outputs. 30 seconds is optimal value, but if you
+## experience synchronization problems, set it to lower value. Keep in mind
+## that sane values start with >=10.
+##
+#
+#visualizer_sync_interval = 30
+#
+##
+## Note: To enable spectrum frequency visualization you need to compile ncmpcpp
+## with fftw3 support.
+##
+#
+## Available values: spectrum, wave, wave_filled, ellipse.
+##
+#visualizer_type = spectrum
+#
+#visualizer_look = ●卐
+#visualizer_look = 卐
+#
+#visualizer_color = blue, cyan, green, yellow, magenta, red
+#
+## Alternative subset of 256 colors for terminals that support it.
+##
+#visualizer_color = 41, 83, 119, 155, 185, 215, 209, 203, 197, 161
+#
+##### system encoding #####
+##
+## ncmpcpp should detect your charset encoding but if it failed to do so, you
+## can specify charset encoding you are using here.
+##
+## Note: You can see whether your ncmpcpp build supports charset detection by
+## checking output of `ncmpcpp --version`.
+##
+## Note: Since MPD uses UTF-8 by default, setting this option makes sense only
+## if your encoding is different.
+##
+#
+#system_encoding = ""
+#
+##### delays #####
+#
+## Time of inactivity (in seconds) after playlist highlighting will be disabled
+## (0 = always on).
+##
+#playlist_disable_highlight_delay = 5
+#
+## Defines how long messages are supposed to be visible.
+##
+#message_delay_time = 1
+#
+##### song format #####
+##
+## For a song format you can use:
+##
+## %l - length
+## %f - filename
+## %D - directory
+## %a - artist
+## %A - album artist
+## %t - title
+## %b - album
+## %y - date
+## %n - track number (01/12 -> 01)
+## %N - full track info (01/12 -> 01/12)
+## %g - genre
+## %c - composer
+## %p - performer
+## %d - disc
+## %C - comment
+## %P - priority
+## $R - begin right alignment
+##
+## If you want to make sure that a part of the format is displayed only when
+## certain tags are present, you can archieve it by grouping them with brackets,
+## e.g. '{%a - %t}' will be evaluated to 'ARTIST - TITLE' if both tags are
+## present or '' otherwise. It is also possible to define a list of
+## alternatives by providing several groups and separating them with '|',
+## e.g. '{%t}|{%f}' will be evaluated to 'TITLE' or 'FILENAME' if the former is
+## not present.
+##
+## Note: If you want to set limit on maximal length of a tag, just put the
+## appropriate number between % and character that defines tag type, e.g. to
+## make album take max. 20 terminal cells, use '%20b'.
+##
+## In addition, formats support markers used for text attributes. They are
+## followed by character '$'. After that you can put:
+##
+## - 0 - default window color (discards all other colors)
+## - 1 - black
+## - 2 - red
+## - 3 - green
+## - 4 - yellow
+## - 5 - blue
+## - 6 - magenta
+## - 7 - cyan
+## - 8 - white
+## - 9 - end of current color
+## - b - bold text
+## - u - underline text
+## - r - reverse colors
+## - a - use alternative character set
+##
+## If you don't want to use a non-color attribute anymore, just put it again,
+## but this time insert character '/' between '$' and attribute character,
+## e.g. {$b%t$/b}|{$r%f$/r} will display bolded title tag or filename with
+## reversed colors.
+##
+## If you want to use 256 colors and/or background colors in formats (the naming
+## scheme is described below in section about color definitions), it can be done
+## with the syntax $(COLOR), e.g. to set the artist tag to one of the
+## non-standard colors and make it have yellow background, you need to write
+## $(197_yellow)%a$(end). Note that for standard colors this is interchangable
+## with attributes listed above.
+##
+## Note: colors can be nested.
+##
+#
+#song_list_format = {$4%a - }{%t}|{$8%f$9}$R{$3(%l)$9}
+#
+#song_status_format = $b{{$8"%t"}} $3by {$4%a{ $3in $7%b{ (%y)}} $3}|{$8%f}
+#
+#song_library_format = {%n - }{%t}|{%f}
+#
+#alternative_header_first_line_format = $b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b
+#
+#alternative_header_second_line_format = {{$4$b%a$/b$9}{ - $7%b$9}{ ($4%y$9)}}|{%D}
+#
+#current_item_prefix = $(cyan)$r$b
+#
+#current_item_suffix = $/r$(end)$/b
+#
+#current_item_inactive_column_prefix = $(magenta)$r
+#
+#current_item_inactive_column_suffix = $/r$(end)
+#
+#now_playing_prefix = $b
+#
+#now_playing_suffix = $/b
+#
+#browser_playlist_prefix = "$2playlist$9 "
+#
+#selected_item_prefix = $6
+#
+#selected_item_suffix = $9
+#
+#modified_item_prefix = $3> $9
+#
+##
+## Note: attributes are not supported for the following variables.
+##
+#song_window_title_format = {%a - }{%t}|{%f}
+##
+## Note: Below variables are used for sorting songs in browser. The sort mode
+## determines how songs are sorted, and can be used in combination with a sort
+## format to specify a custom sorting format. Available values for
+## browser_sort_mode are "name", "mtime", "format" and "noop".
+##
+#
+#browser_sort_mode = name
+#
+#browser_sort_format = {%a - }{%t}|{%f} {(%l)}
+#
+##### columns settings #####
+##
+## syntax of song columns list format is "column column etc."
+##
+## - syntax for each column is:
+##
+## (width of the column)[color of the column]{displayed tag}
+##
+## Note: Width is by default in %, if you want a column to have fixed size, add
+## 'f' after the value, e.g. (10)[white]{a} will be the column that take 10% of
+## screen (so the real width will depend on actual screen size), whereas
+## (10f)[white]{a} will take 10 terminal cells, no matter how wide the screen
+## is.
+##
+## - color is optional (if you want the default one, leave the field empty).
+##
+## Note: You can give a column additional attributes by putting appropriate
+## character after displayed tag character. Available attributes are:
+##
+## - r - column will be right aligned
+## - E - if tag is empty, empty tag marker won't be displayed
+##
+## You can also:
+##
+## - give a column custom name by putting it after attributes, separated with
+## character ':', e.g. {lr:Length} gives you right aligned column of lengths
+## named "Length".
+##
+## - define sequence of tags, that have to be displayed in case predecessor is
+## empty in a way similar to the one in classic song format, i.e. using '|'
+## character, e.g. {a|c|p:Owner} creates column named "Owner" that tries to
+## display artist tag and then composer and performer if previous ones are not
+## available.
+##
+#
+#song_columns_list_format = (20)[]{a} (6f)[green]{NE} (50)[white]{t|f:Title} (20)[cyan]{b} (7f)[magenta]{l}
+#
+##### various settings #####
+#
+##
+## Note: Custom command that will be executed each time song changes. Useful for
+## notifications etc.
+##
+#execute_on_song_change = ""
+#
+##
+## Note: Custom command that will be executed each time player state
+## changes. The environment variable MPD_PLAYER_STATE is set to the current
+## state (either unknown, play, pause, or stop) for its duration.
+##
+#
+#execute_on_player_state_change = ""
+#
+#playlist_show_mpd_host = no
+#
+#playlist_show_remaining_time = no
+#
+#playlist_shorten_total_times = no
+#
+#playlist_separate_albums = no
+#
+##
+## Note: Possible display modes: classic, columns.
+##
+#playlist_display_mode = columns
+#
+#browser_display_mode = columns
+#
+#search_engine_display_mode = classic
+#
+#playlist_editor_display_mode = classic
+#
+#discard_colors_if_item_is_selected = yes
+#
+#show_duplicate_tags = true
+#
+#incremental_seeking = yes
+#
+#seek_time = 1
+#
+#volume_change_step = 2
+#
+#autocenter_mode = no
+#
+#centered_cursor = no
+#
+##
+## Note: You can specify third character which will be used to build 'empty'
+## part of progressbar.
+##
+#progressbar_look = ->
+#
+## Available values: database, playlist.
+##
+#default_place_to_search_in = database
+#
+## Available values: classic, alternative.
+##
+#user_interface = classic
+#
+#data_fetching_delay = yes
+#
+## Available values: artist, album_artist, date, genre, composer, performer.
+##
+#media_library_primary_tag = album_artist
+#
+#media_library_albums_split_by_date = no
+#
+## Available values: wrapped, normal.
+##
+#default_find_mode = wrapped
+#
+#default_tag_editor_pattern = %n - %t
+#
+#header_visibility = yes
+#
+#statusbar_visibility = yes
+#
+#titles_visibility = yes
+#
+#header_text_scrolling = yes
+#
+#cyclic_scrolling = no
+#
+#lines_scrolled = 2
+#
+#lyrics_fetchers = lyricwiki, azlyrics, genius, sing365, lyricsmania, metrolyrics, justsomelyrics, jahlyrics, plyrics, tekstowo, internet
+#
+#follow_now_playing_lyrics = no
+#
+#fetch_lyrics_for_current_song_in_background = no
+#
+#store_lyrics_in_song_dir = no
+#
+#generate_win32_compatible_filenames = yes
+#
+#allow_for_physical_item_deletion = no
+#
+##
+## Note: If you set this variable, ncmpcpp will try to get info from last.fm in
+## language you set and if it fails, it will fall back to english. Otherwise it
+## will use english the first time.
+##
+## Note: Language has to be expressed as an ISO 639 alpha-2 code.
+##
+#lastfm_preferred_language = en
+#
+#space_add_mode = add_remove
+#
+#show_hidden_files_in_local_browser = no
+#
+##
+## How shall screen switcher work?
+##
+## - "previous" - switch between the current and previous screen.
+## - "screen1,...,screenN" - switch between given sequence of screens.
+##
+## Screens available for use: help, playlist, browser, search_engine,
+## media_library, playlist_editor, tag_editor, outputs, visualizer, clock,
+## lyrics, last_fm.
+##
+#screen_switcher_mode = playlist, browser
+#
+##
+## Note: You can define startup screen by choosing screen from the list above.
+##
+#startup_screen = visualizer
+#
+##
+## Note: You can define startup slave screen by choosing screen from the list
+## above or an empty value for no slave screen.
+##
+#startup_slave_screen = ""
+#
+#startup_slave_screen_focus = no
+#
+##
+## Default width of locked screen (in %). Acceptable values are from 20 to 80.
+##
+#
+#locked_screen_width_part = 50
+#
+#ask_for_locked_screen_width_part = yes
+#
+#jump_to_now_playing_song_at_start = yes
+#
+#ask_before_clearing_playlists = yes
+#
+#clock_display_seconds = no
+#
+#display_volume_level = no
+#
+#display_bitrate = no
+#
+#display_remaining_time = no
+#
+## Available values: none, basic, extended, perl.
+##
+#regular_expressions = perl
+#
+##
+## Note: if below is enabled, ncmpcpp will ignore leading "The" word while
+## sorting items in browser, tags in media library, etc.
+##
+#ignore_leading_the = yes
+#
+##
+## Note: if below is enabled, ncmpcpp will ignore diacritics while searching and
+## filtering lists. This takes an effect only if boost was compiled with ICU
+## support.
+##
+#ignore_diacritics = no
+#
+#block_search_constraints_change_if_items_found = yes
+#
+#mouse_support = yes
+#
+#mouse_list_scroll_whole_page = yes
+#
+#empty_tag_marker = <empty>
+#
+#tags_separator = " | "
+#
+#tag_editor_extended_numeration = no
+#
+#media_library_sort_by_mtime = no
+#
+#enable_window_title = yes
+#
+##
+## Note: You can choose default search mode for search engine. Available modes
+## are:
+##
+## - 1 - use mpd built-in searching (no regexes, pattern matching)
+##
+## - 2 - use ncmpcpp searching (pattern matching with support for regexes, but
+## if your mpd is on a remote machine, downloading big database to process
+## it can take a while
+##
+## - 3 - match only exact values (this mode uses mpd function for searching in
+## database and local one for searching in current playlist)
+##
+#
+#search_engine_default_search_mode = 1
+#
+#external_editor = vim
+#
+## Note: set to yes if external editor is a console application.
+##
+#use_console_editor = yes
+#
+##### colors definitions #####
+##
+## It is possible to set a background color by setting a color value
+## "<foreground>_<background>", e.g. red_black will set foregound color to red
+## and background color to black.
+##
+## In addition, for terminals that support 256 colors it is possible to set one
+## of them by using a number in range [1, 256] instead of color name,
+## e.g. numerical value corresponding to red_black is 2_1. To find out if the
+## terminal supports 256 colors, run ncmpcpp and check out the bottom of the
+## help screen for list of available colors and their numerical values.
+##
+## What is more, there are two special values for the background color:
+## "transparent" and "current". The first one explicitly sets the background to
+## be transparent, while the second one allows you to preserve current
+## background color and change only the foreground one. It's used implicitly
+## when background color is not specified.
+##
+## Moreover, it is possible to attach format information to selected color
+## variables by appending to their end a colon followed by one or more format
+## flags, e.g. black:b or red:ur. The following variables support this syntax:
+## visualizer_color, color1, color2, empty_tag_color, volume_color,
+## state_line_color, state_flags_color, progressbar_color,
+## progressbar_elapsed_color, player_state_color, statusbar_time_color,
+## alternative_ui_separator_color.
+##
+## Note: due to technical limitations of older ncurses version, if 256 colors
+## are used there is a possibility that you'll be able to use only colors with
+## transparent background.
+#
+#colors_enabled = yes
+#
+#empty_tag_color = magenta
+#
+#header_window_color = magenta
+#
+#volume_color = default
+#
+#state_line_color = default
+#
+#state_flags_color = default:b
+#
+#main_window_color = white
+#
+#color1 = white
+#
+#color2 = green
+#
+#progressbar_color = black:b
+#
+#progressbar_elapsed_color = blue:b
+#
+#statusbar_color = red
+#
+#statusbar_time_color = cyan:b
+#
+#player_state_color = default:b
+#
+#alternative_ui_separator_color = black:b
+#
+#window_border_color = green
+#
+#active_window_border = red
+#
diff --git a/neofetch/config.conf b/neofetch/config.conf
@@ -0,0 +1,849 @@
+# See this wiki page for more info:
+# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info
+print_info() {
+ info title
+ info underline
+
+ info "OS" distro
+ info "Host" model
+ info "Kernel" kernel
+ info "Uptime" uptime
+ info "Packages" packages
+ info "Shell" shell
+ info "Resolution" resolution
+ info "DE" de
+ info "WM" wm
+ info "WM Theme" wm_theme
+ info "Theme" theme
+ info "Icons" icons
+ info "Terminal" term
+ info "Terminal Font" term_font
+ info "CPU" cpu
+ info "GPU" gpu
+ info "Memory" memory
+
+ # info "GPU Driver" gpu_driver # Linux/macOS only
+ # info "CPU Usage" cpu_usage
+ # info "Disk" disk
+ # info "Battery" battery
+ # info "Font" font
+ # info "Song" song
+ # [[ "$player" ]] && prin "Music Player" "$player"
+ # info "Local IP" local_ip
+ # info "Public IP" public_ip
+ # info "Users" users
+ # info "Locale" locale # This only works on glibc systems.
+
+ info cols
+}
+
+# Title
+
+
+# Hide/Show Fully qualified domain name.
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --title_fqdn
+title_fqdn="off"
+
+
+# Kernel
+
+
+# Shorten the output of the kernel function.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --kernel_shorthand
+# Supports: Everything except *BSDs (except PacBSD and PC-BSD)
+#
+# Example:
+# on: '4.8.9-1-ARCH'
+# off: 'Linux 4.8.9-1-ARCH'
+kernel_shorthand="on"
+
+
+# Distro
+
+
+# Shorten the output of the distro function
+#
+# Default: 'off'
+# Values: 'on', 'tiny', 'off'
+# Flag: --distro_shorthand
+# Supports: Everything except Windows and Haiku
+distro_shorthand="off"
+
+# Show/Hide OS Architecture.
+# Show 'x86_64', 'x86' and etc in 'Distro:' output.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --os_arch
+#
+# Example:
+# on: 'Arch Linux x86_64'
+# off: 'Arch Linux'
+os_arch="on"
+
+
+# Uptime
+
+
+# Shorten the output of the uptime function
+#
+# Default: 'on'
+# Values: 'on', 'tiny', 'off'
+# Flag: --uptime_shorthand
+#
+# Example:
+# on: '2 days, 10 hours, 3 mins'
+# tiny: '2d 10h 3m'
+# off: '2 days, 10 hours, 3 minutes'
+uptime_shorthand="on"
+
+
+# Memory
+
+
+# Show memory pecentage in output.
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --memory_percent
+#
+# Example:
+# on: '1801MiB / 7881MiB (22%)'
+# off: '1801MiB / 7881MiB'
+memory_percent="off"
+
+
+# Packages
+
+
+# Show/Hide Package Manager names.
+#
+# Default: 'tiny'
+# Values: 'on', 'tiny' 'off'
+# Flag: --package_managers
+#
+# Example:
+# on: '998 (pacman), 8 (flatpak), 4 (snap)'
+# tiny: '908 (pacman, flatpak, snap)'
+# off: '908'
+package_managers="on"
+
+
+# Shell
+
+
+# Show the path to $SHELL
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --shell_path
+#
+# Example:
+# on: '/bin/bash'
+# off: 'bash'
+shell_path="off"
+
+# Show $SHELL version
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --shell_version
+#
+# Example:
+# on: 'bash 4.4.5'
+# off: 'bash'
+shell_version="on"
+
+
+# CPU
+
+
+# CPU speed type
+#
+# Default: 'bios_limit'
+# Values: 'scaling_cur_freq', 'scaling_min_freq', 'scaling_max_freq', 'bios_limit'.
+# Flag: --speed_type
+# Supports: Linux with 'cpufreq'
+# NOTE: Any file in '/sys/devices/system/cpu/cpu0/cpufreq' can be used as a value.
+speed_type="bios_limit"
+
+# CPU speed shorthand
+#
+# Default: 'off'
+# Values: 'on', 'off'.
+# Flag: --speed_shorthand
+# NOTE: This flag is not supported in systems with CPU speed less than 1 GHz
+#
+# Example:
+# on: 'i7-6500U (4) @ 3.1GHz'
+# off: 'i7-6500U (4) @ 3.100GHz'
+speed_shorthand="off"
+
+# Enable/Disable CPU brand in output.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --cpu_brand
+#
+# Example:
+# on: 'Intel i7-6500U'
+# off: 'i7-6500U (4)'
+cpu_brand="on"
+
+# CPU Speed
+# Hide/Show CPU speed.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --cpu_speed
+#
+# Example:
+# on: 'Intel i7-6500U (4) @ 3.1GHz'
+# off: 'Intel i7-6500U (4)'
+cpu_speed="on"
+
+# CPU Cores
+# Display CPU cores in output
+#
+# Default: 'logical'
+# Values: 'logical', 'physical', 'off'
+# Flag: --cpu_cores
+# Support: 'physical' doesn't work on BSD.
+#
+# Example:
+# logical: 'Intel i7-6500U (4) @ 3.1GHz' (All virtual cores)
+# physical: 'Intel i7-6500U (2) @ 3.1GHz' (All physical cores)
+# off: 'Intel i7-6500U @ 3.1GHz'
+cpu_cores="logical"
+
+# CPU Temperature
+# Hide/Show CPU temperature.
+# Note the temperature is added to the regular CPU function.
+#
+# Default: 'off'
+# Values: 'C', 'F', 'off'
+# Flag: --cpu_temp
+# Supports: Linux, BSD
+# NOTE: For FreeBSD and NetBSD-based systems, you'll need to enable
+# coretemp kernel module. This only supports newer Intel processors.
+#
+# Example:
+# C: 'Intel i7-6500U (4) @ 3.1GHz [27.2°C]'
+# F: 'Intel i7-6500U (4) @ 3.1GHz [82.0°F]'
+# off: 'Intel i7-6500U (4) @ 3.1GHz'
+cpu_temp="off"
+
+
+# GPU
+
+
+# Enable/Disable GPU Brand
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --gpu_brand
+#
+# Example:
+# on: 'AMD HD 7950'
+# off: 'HD 7950'
+gpu_brand="on"
+
+# Which GPU to display
+#
+# Default: 'all'
+# Values: 'all', 'dedicated', 'integrated'
+# Flag: --gpu_type
+# Supports: Linux
+#
+# Example:
+# all:
+# GPU1: AMD HD 7950
+# GPU2: Intel Integrated Graphics
+#
+# dedicated:
+# GPU1: AMD HD 7950
+#
+# integrated:
+# GPU1: Intel Integrated Graphics
+gpu_type="all"
+
+
+# Resolution
+
+
+# Display refresh rate next to each monitor
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --refresh_rate
+# Supports: Doesn't work on Windows.
+#
+# Example:
+# on: '1920x1080 @ 60Hz'
+# off: '1920x1080'
+refresh_rate="off"
+
+
+# Gtk Theme / Icons / Font
+
+
+# Shorten output of GTK Theme / Icons / Font
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --gtk_shorthand
+#
+# Example:
+# on: 'Numix, Adwaita'
+# off: 'Numix [GTK2], Adwaita [GTK3]'
+gtk_shorthand="off"
+
+
+# Enable/Disable gtk2 Theme / Icons / Font
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --gtk2
+#
+# Example:
+# on: 'Numix [GTK2], Adwaita [GTK3]'
+# off: 'Adwaita [GTK3]'
+gtk2="on"
+
+# Enable/Disable gtk3 Theme / Icons / Font
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --gtk3
+#
+# Example:
+# on: 'Numix [GTK2], Adwaita [GTK3]'
+# off: 'Numix [GTK2]'
+gtk3="on"
+
+
+# IP Address
+
+
+# Website to ping for the public IP
+#
+# Default: 'http://ident.me'
+# Values: 'url'
+# Flag: --ip_host
+public_ip_host="http://ident.me"
+
+# Public IP timeout.
+#
+# Default: '2'
+# Values: 'int'
+# Flag: --ip_timeout
+public_ip_timeout=2
+
+
+# Desktop Environment
+
+
+# Show Desktop Environment version
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --de_version
+de_version="off"
+
+
+# Disk
+
+
+# Which disks to display.
+# The values can be any /dev/sdXX, mount point or directory.
+# NOTE: By default we only show the disk info for '/'.
+#
+# Default: '/'
+# Values: '/', '/dev/sdXX', '/path/to/drive'.
+# Flag: --disk_show
+#
+# Example:
+# disk_show=('/' '/dev/sdb1'):
+# 'Disk (/): 74G / 118G (66%)'
+# 'Disk (/mnt/Videos): 823G / 893G (93%)'
+#
+# disk_show=('/'):
+# 'Disk (/): 74G / 118G (66%)'
+#
+disk_show=('/')
+
+# Disk subtitle.
+# What to append to the Disk subtitle.
+#
+# Default: 'mount'
+# Values: 'mount', 'name', 'dir', 'none'
+# Flag: --disk_subtitle
+#
+# Example:
+# name: 'Disk (/dev/sda1): 74G / 118G (66%)'
+# 'Disk (/dev/sdb2): 74G / 118G (66%)'
+#
+# mount: 'Disk (/): 74G / 118G (66%)'
+# 'Disk (/mnt/Local Disk): 74G / 118G (66%)'
+# 'Disk (/mnt/Videos): 74G / 118G (66%)'
+#
+# dir: 'Disk (/): 74G / 118G (66%)'
+# 'Disk (Local Disk): 74G / 118G (66%)'
+# 'Disk (Videos): 74G / 118G (66%)'
+#
+# none: 'Disk: 74G / 118G (66%)'
+# 'Disk: 74G / 118G (66%)'
+# 'Disk: 74G / 118G (66%)'
+disk_subtitle="mount"
+
+# Disk percent.
+# Show/Hide disk percent.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --disk_percent
+#
+# Example:
+# on: 'Disk (/): 74G / 118G (66%)'
+# off: 'Disk (/): 74G / 118G'
+disk_percent="on"
+
+
+# Song
+
+
+# Manually specify a music player.
+#
+# Default: 'auto'
+# Values: 'auto', 'player-name'
+# Flag: --music_player
+#
+# Available values for 'player-name':
+#
+# amarok
+# audacious
+# banshee
+# bluemindo
+# clementine
+# cmus
+# deadbeef
+# deepin-music
+# dragon
+# elisa
+# exaile
+# gnome-music
+# gmusicbrowser
+# gogglesmm
+# guayadeque
+# io.elementary.music
+# iTunes
+# juk
+# lollypop
+# mocp
+# mopidy
+# mpd
+# muine
+# netease-cloud-music
+# pogo
+# pragha
+# qmmp
+# quodlibet
+# rhythmbox
+# sayonara
+# smplayer
+# spotify
+# strawberry
+# tomahawk
+# vlc
+# xmms2d
+# xnoise
+# yarock
+music_player="auto"
+
+# Format to display song information.
+#
+# Default: '%artist% - %album% - %title%'
+# Values: '%artist%', '%album%', '%title%'
+# Flag: --song_format
+#
+# Example:
+# default: 'Song: Jet - Get Born - Sgt Major'
+song_format="%artist% - %album% - %title%"
+
+# Print the Artist, Album and Title on separate lines
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --song_shorthand
+#
+# Example:
+# on: 'Artist: The Fratellis'
+# 'Album: Costello Music'
+# 'Song: Chelsea Dagger'
+#
+# off: 'Song: The Fratellis - Costello Music - Chelsea Dagger'
+song_shorthand="off"
+
+# 'mpc' arguments (specify a host, password etc).
+#
+# Default: ''
+# Example: mpc_args=(-h HOST -P PASSWORD)
+mpc_args=()
+
+
+# Text Colors
+
+
+# Text Colors
+#
+# Default: 'distro'
+# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
+# Flag: --colors
+#
+# Each number represents a different part of the text in
+# this order: 'title', '@', 'underline', 'subtitle', 'colon', 'info'
+#
+# Example:
+# colors=(distro) - Text is colored based on Distro colors.
+# colors=(4 6 1 8 8 6) - Text is colored in the order above.
+colors=(distro)
+
+
+# Text Options
+
+
+# Toggle bold text
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --bold
+bold="on"
+
+# Enable/Disable Underline
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --underline
+underline_enabled="on"
+
+# Underline character
+#
+# Default: '-'
+# Values: 'string'
+# Flag: --underline_char
+underline_char="-"
+
+
+# Info Separator
+# Replace the default separator with the specified string.
+#
+# Default: ':'
+# Flag: --separator
+#
+# Example:
+# separator="->": 'Shell-> bash'
+# separator=" =": 'WM = dwm'
+separator=":"
+
+
+# Color Blocks
+
+
+# Color block range
+# The range of colors to print.
+#
+# Default: '0', '15'
+# Values: 'num'
+# Flag: --block_range
+#
+# Example:
+#
+# Display colors 0-7 in the blocks. (8 colors)
+# neofetch --block_range 0 7
+#
+# Display colors 0-15 in the blocks. (16 colors)
+# neofetch --block_range 0 15
+block_range=(0 15)
+
+# Toggle color blocks
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --color_blocks
+color_blocks="on"
+
+# Color block width in spaces
+#
+# Default: '3'
+# Values: 'num'
+# Flag: --block_width
+block_width=3
+
+# Color block height in lines
+#
+# Default: '1'
+# Values: 'num'
+# Flag: --block_height
+block_height=1
+
+# Color Alignment
+#
+# Default: 'auto'
+# Values: 'auto', 'num'
+# Flag: --col_offset
+#
+# Number specifies how far from the left side of the terminal (in spaces) to
+# begin printing the columns, in case you want to e.g. center them under your
+# text.
+# Example:
+# col_offset="auto" - Default behavior of neofetch
+# col_offset=7 - Leave 7 spaces then print the colors
+col_offset="auto"
+
+# Progress Bars
+
+
+# Bar characters
+#
+# Default: '-', '='
+# Values: 'string', 'string'
+# Flag: --bar_char
+#
+# Example:
+# neofetch --bar_char 'elapsed' 'total'
+# neofetch --bar_char '-' '='
+bar_char_elapsed="-"
+bar_char_total="="
+
+# Toggle Bar border
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --bar_border
+bar_border="on"
+
+# Progress bar length in spaces
+# Number of chars long to make the progress bars.
+#
+# Default: '15'
+# Values: 'num'
+# Flag: --bar_length
+bar_length=15
+
+# Progress bar colors
+# When set to distro, uses your distro's logo colors.
+#
+# Default: 'distro', 'distro'
+# Values: 'distro', 'num'
+# Flag: --bar_colors
+#
+# Example:
+# neofetch --bar_colors 3 4
+# neofetch --bar_colors distro 5
+bar_color_elapsed="distro"
+bar_color_total="distro"
+
+
+# Info display
+# Display a bar with the info.
+#
+# Default: 'off'
+# Values: 'bar', 'infobar', 'barinfo', 'off'
+# Flags: --cpu_display
+# --memory_display
+# --battery_display
+# --disk_display
+#
+# Example:
+# bar: '[---=======]'
+# infobar: 'info [---=======]'
+# barinfo: '[---=======] info'
+# off: 'info'
+cpu_display="off"
+memory_display="off"
+battery_display="off"
+disk_display="off"
+
+
+# Backend Settings
+
+
+# Image backend.
+#
+# Default: 'ascii'
+# Values: 'ascii', 'caca', 'chafa', 'jp2a', 'iterm2', 'off',
+# 'termpix', 'pixterm', 'tycat', 'w3m', 'kitty'
+# Flag: --backend
+image_backend="ascii"
+
+# Image Source
+#
+# Which image or ascii file to display.
+#
+# Default: 'auto'
+# Values: 'auto', 'ascii', 'wallpaper', '/path/to/img', '/path/to/ascii', '/path/to/dir/'
+# 'command output (neofetch --ascii "$(fortune | cowsay -W 30)")'
+# Flag: --source
+#
+# NOTE: 'auto' will pick the best image source for whatever image backend is used.
+# In ascii mode, distro ascii art will be used and in an image mode, your
+# wallpaper will be used.
+image_source="auto"
+
+
+# Ascii Options
+
+
+# Ascii distro
+# Which distro's ascii art to display.
+#
+# Default: 'auto'
+# Values: 'auto', 'distro_name'
+# Flag: --ascii_distro
+# NOTE: AIX, Alpine, Anarchy, Android, Antergos, antiX, AOSC,
+# Apricity, ArcoLinux, ArchBox, ARCHlabs, ArchStrike,
+# XFerience, ArchMerge, Arch, Artix, Arya, Bedrock, Bitrig,
+# BlackArch, BLAG, BlankOn, BlueLight, bonsai, BSD,
+# BunsenLabs, Calculate, Carbs, CentOS, Chakra, ChaletOS,
+# Chapeau, Chrom*, Cleanjaro, ClearOS, Clear_Linux, Clover,
+# Condres, Container_Linux, CRUX, Cucumber, Debian, Deepin,
+# DesaOS, Devuan, DracOS, DragonFly, Drauger, Elementary,
+# EndeavourOS, Endless, EuroLinux, Exherbo, Fedora, Feren, FreeBSD,
+# FreeMiNT, Frugalware, Funtoo, GalliumOS, Gentoo, Pentoo,
+# gNewSense, GNU, GoboLinux, Grombyang, Guix, Haiku, Huayra,
+# Hyperbola, janus, Kali, KaOS, KDE_neon, Kibojoe, Kogaion,
+# Korora, KSLinux, Kubuntu, LEDE, LFS, Linux_Lite,
+# LMDE, Lubuntu, Lunar, macos, Mageia, MagpieOS, Mandriva,
+# Manjaro, Maui, Mer, Minix, LinuxMint, MX_Linux, Namib,
+# Neptune, NetBSD, Netrunner, Nitrux, NixOS, Nurunner,
+# NuTyX, OBRevenge, OpenBSD, OpenIndiana, OpenMandriva,
+# OpenWrt, osmc, Oracle, PacBSD, Parabola, Pardus, Parrot,
+# Parsix, TrueOS, PCLinuxOS, Peppermint, popos, Porteus,
+# PostMarketOS, Proxmox, Puppy, PureOS, Qubes, Radix, Raspbian,
+# Reborn_OS, Redstar, Redcore, Redhat, Refracted_Devuan, Regata,
+# Rosa, sabotage, Sabayon, Sailfish, SalentOS, Scientific, Septor,
+# SharkLinux, Siduction, Slackware, SliTaz, SmartOS, Solus,
+# Source_Mage, Sparky, Star, SteamOS, SunOS, openSUSE_Leap,
+# openSUSE_Tumbleweed, openSUSE, SwagArch, Tails, Trisquel,
+# Ubuntu-Budgie, Ubuntu-GNOME, Ubuntu-MATE, Ubuntu-Studio, Ubuntu,
+# Void, Obarun, windows10, Windows7, Xubuntu, Zorin, and IRIX
+# have ascii logos
+# NOTE: Arch, Ubuntu, Redhat, and Dragonfly have 'old' logo variants.
+# Use '{distro name}_old' to use the old logos.
+# NOTE: Ubuntu has flavor variants.
+# Change this to Lubuntu, Kubuntu, Xubuntu, Ubuntu-GNOME,
+# Ubuntu-Studio, Ubuntu-Mate or Ubuntu-Budgie to use the flavors.
+# NOTE: Arcolinux, Dragonfly, Fedora, Alpine, Arch, Ubuntu,
+# CRUX, Debian, Gentoo, FreeBSD, Mac, NixOS, OpenBSD, android,
+# Antrix, CentOS, Cleanjaro, ElementaryOS, GUIX, Hyperbola,
+# Manjaro, MXLinux, NetBSD, Parabola, POP_OS, PureOS,
+# Slackware, SunOS, LinuxLite, OpenSUSE, Raspbian,
+# postmarketOS, and Void have a smaller logo variant.
+# Use '{distro name}_small' to use the small variants.
+ascii_distro="auto"
+
+# Ascii Colors
+#
+# Default: 'distro'
+# Values: 'distro', 'num' 'num' 'num' 'num' 'num' 'num'
+# Flag: --ascii_colors
+#
+# Example:
+# ascii_colors=(distro) - Ascii is colored based on Distro colors.
+# ascii_colors=(4 6 1 8 8 6) - Ascii is colored using these colors.
+ascii_colors=(distro)
+
+# Bold ascii logo
+# Whether or not to bold the ascii logo.
+#
+# Default: 'on'
+# Values: 'on', 'off'
+# Flag: --ascii_bold
+ascii_bold="on"
+
+
+# Image Options
+
+
+# Image loop
+# Setting this to on will make neofetch redraw the image constantly until
+# Ctrl+C is pressed. This fixes display issues in some terminal emulators.
+#
+# Default: 'off'
+# Values: 'on', 'off'
+# Flag: --loop
+image_loop="off"
+
+# Thumbnail directory
+#
+# Default: '~/.cache/thumbnails/neofetch'
+# Values: 'dir'
+thumbnail_dir="${XDG_CACHE_HOME:-${HOME}/.cache}/thumbnails/neofetch"
+
+# Crop mode
+#
+# Default: 'normal'
+# Values: 'normal', 'fit', 'fill'
+# Flag: --crop_mode
+#
+# See this wiki page to learn about the fit and fill options.
+# https://github.com/dylanaraps/neofetch/wiki/What-is-Waifu-Crop%3F
+crop_mode="normal"
+
+# Crop offset
+# Note: Only affects 'normal' crop mode.
+#
+# Default: 'center'
+# Values: 'northwest', 'north', 'northeast', 'west', 'center'
+# 'east', 'southwest', 'south', 'southeast'
+# Flag: --crop_offset
+crop_offset="center"
+
+# Image size
+# The image is half the terminal width by default.
+#
+# Default: 'auto'
+# Values: 'auto', '00px', '00%', 'none'
+# Flags: --image_size
+# --size
+image_size="auto"
+
+# Gap between image and text
+#
+# Default: '3'
+# Values: 'num', '-num'
+# Flag: --gap
+gap=3
+
+# Image offsets
+# Only works with the w3m backend.
+#
+# Default: '0'
+# Values: 'px'
+# Flags: --xoffset
+# --yoffset
+yoffset=0
+xoffset=0
+
+# Image background color
+# Only works with the w3m backend.
+#
+# Default: ''
+# Values: 'color', 'blue'
+# Flag: --bg_color
+background_color=
+
+
+# Misc Options
+
+# Stdout mode
+# Turn off all colors and disables image backend (ASCII/Image).
+# Useful for piping into another command.
+# Default: 'off'
+# Values: 'on', 'off'
+stdout="off"
diff --git a/newsboat/config b/newsboat/config
@@ -0,0 +1,41 @@
+#show-read-feeds no
+auto-reload yes
+datetime-format "%d %b %Y"
+external-url-viewer "urlscan -dc -r 'linkhandler {}'"
+
+bind-key j down
+bind-key k up
+bind-key j next articlelist
+bind-key k prev articlelist
+bind-key J next-feed articlelist
+bind-key K prev-feed articlelist
+bind-key G end
+bind-key g home
+bind-key d pagedown
+bind-key u pageup
+bind-key l open
+bind-key h quit
+bind-key a toggle-article-read
+bind-key n next-unread
+bind-key N prev-unread
+bind-key D pb-download
+bind-key U show-urls
+bind-key ^W show-urls
+bind-key ^B show-urls
+bind-key x pb-delete
+
+color listnormal cyan default
+color listfocus black yellow standout bold
+color listnormal_unread blue default
+color listfocus_unread yellow default bold
+color info red black bold
+color article cyan default
+
+browser linkhandler
+macro , open-in-browser
+macro t set browser "tsp youtube-dl --add-metadata -ic"; open-in-browser ; set browser linkhandler
+macro a set browser "tsp youtube-dl --add-metadata -xic -f bestaudio/best"; open-in-browser ; set browser linkhandler
+macro v set browser "setsid nohup mpv"; open-in-browser ; set browser linkhandler
+macro w set browser "w3m"; open-in-browser ; set browser linkhandler
+macro p set browser "dmenuhandler"; open-in-browser ; set browser linkhandler
+macro c set browser "xsel -b <<<" ; open-in-browser ; set browser linkhandler
diff --git a/newsboat/read_articles b/newsboat/read_articles
@@ -0,0 +1,2483 @@
+http://xpenguin.club/The-one-where-uncle-Hamish-hates-on-Windows/
+http://xpenguin.club/The-one-where-Hamish-got-confused/
+http://xpenguin.club/Weekly-Linux-gaming-talk/
+http://xpenguin.club/The-one-with-the-tinfail-hat/
+http://xpenguin.club/The-one-with-fake-Hamish/
+http://xpenguin.club/The-one-with-the-hmmmm/
+http://xpenguin.club/The-one-with-real-Hamish/
+http://xpenguin.club/The-one-from-Craggy-Island/
+http://xpenguin.club/The-one-where-ArchToasty-was-cooler-than-me-(again)/
+http://xpenguin.club/The-one-with-the-pack-of-wine/
+http://xpenguin.club/The-one-where-it-went-all-wobbly-at-the-end/
+http://xpenguin.club/The-one-with-Cyberpunks/
+http://xpenguin.club/The-One-With-All-The-Plugins/
+http://xpenguin.club/The-one-with-the-Astromech/
+http://xpenguin.club/The-one-where-the-USB-misbehaved/
+http://xpenguin.club/The-magical-one/
+http://xpenguin.club/The-one-without-Sim-City-2000/
+http://xpenguin.club/The-one-where-Hex-changed-everything/
+http://xpenguin.club/The-best-toast-is-Archtoast/
+http://xpenguin.club/Steam-Play-Special-Romans-go-home/
+http://xpenguin.club/Samsimilated/
+http://xpenguin.club/Eggroll-and-Wine/
+http://xpenguin.club/Best-Friends-Foreverspace/
+http://xpenguin.club/EGX-and-Toast/
+http://xpenguin.club/Nusueys-voice/
+http://xpenguin.club/Neir-a-Yooka-laylee/
+http://xpenguin.club/The-one-with-Chris-Were/
+http://xpenguin.club/Lost-Cheese/
+http://xpenguin.club/how-long-is-my-x/
+http://xpenguin.club/Games-are-good-like/
+http://xpenguin.club/XLate/
+http://xpenguin.club/Cyberpunk-Vim-surrealism/
+http://xpenguin.club/DreamToast/
+http://xpenguin.club/The-ARTIFACT/
+http://xpenguin.club/I-Emby-that-Unreal-Hat/
+http://xpenguin.club/All-the-Stores,-none-of-the-games/
+http://xpenguin.club/Come-at-me-2019/
+http://xpenguin.club/No-News-is-No-News/
+http://xpenguin.club/I-played-none-of-the-games/
+http://xpenguin.club/2-Guys-1-Proton-(With-NuSuey)/
+http://xpenguin.club/DirectXYZ/
+http://xpenguin.club/CandlePenguin-(With-NuSuey)/
+http://xpenguin.club/Tool-Tips-and-Toasty/
+http://xpenguin.club/XPenguin-Don't-be-Drew/
+http://xpenguin.club/Stress-free,-Content-free,-skill-free-&-Ad-free/
+http://xpenguin.club/I-am-not-a-CARROT!-(With-NuSuey)/
+http://xpenguin.club/Security-by-Hipsterity/
+http://xpenguin.club/A-bundles-of-x's-(Linux-Gaming-talk-with-ArchToasty)/
+http://xpenguin.club/We-don't-talk-about-epic/
+http://xpenguin.club/DOT-EX-GOPHER-(Linux-talk)/
+http://xpenguin.club/No-Risk-of-Borderlands-3-(Linux-Talk)/
+http://xpenguin.club/No-Lag-all-Toast!/
+http://xpenguin.club/Post-Powercut-Penguin!/
+http://xpenguin.club/Red-shirt-of-destiny!/
+http://xpenguin.club/The-Great-Q-and-A-(Volume-1)/
+http://xpenguin.club/Blue-Pigs-and-Toasty-Guests/
+http://xpenguin.club/Episode-241543903-(Contains-strong-language)/
+http://xpenguin.club/XPenguin-with-Cheese-and-Bees!-(Linux-Talk)/
+http://xpenguin.club/Stop-the-Ming-my-(With-ArchToasty)/
+http://xpenguin.club/Stadia-Cantos-(Linux)/
+http://xpenguin.club/XPengiun-16-ish-in-1984/
+http://xpenguin.club/Curses-and-Toast/
+http://xpenguin.club/Games,-shilling,-linux/
+http://xpenguin.club/Hamish-is-here/
+http://xpenguin.club/Xwere-and-some-rambling/
+http://xpenguin.club/Naked-Dog-Baths-(Linux)/
+http://xpenguin.club/Kylinux-Visits/
+http://xpenguin.club/Scratchin-Bandit-(Linux-talk)/
+http://xpenguin.club/Colin-Baker-stopped-me-doing-Show-Notes/
+http://xpenguin.club/Hamish-The-Object-Oriented-Polar-Bear/
+http://xpenguin.club/No-Toast,-No-Time!/
+http://xpenguin.club/HamHamHam-Haaaaaamish/
+http://xpenguin.club/Sticky-(open)-Sauce/
+http://xpenguin.club/NintenDrew-strikes!/
+http://xpenguin.club/HexWolves-(With-Chris-Were)/
+http://xpenguin.club/Xpengiuin-Where-in-the-world-is-Toasty-Sandiego/
+http://xpenguin.club/KyLinux-installs-Ach-Linux-Talk/
+http://xpenguin.club/A-Solo-Ramble,-with-added-ramble/
+http://xpenguin.club/Vulkanised-Rubber/
+http://xpenguin.club/DRM-Disney-Ruins-Media/
+http://xpenguin.club/Hex-and-Chris-27S-Linux-Banter/
+http://xpenguin.club/Kylinux-is-wrong-(Linux)/
+http://distill.pub/2016/augmented-rnns
+http://distill.pub/2016/misread-tsne
+http://distill.pub/2016/deconv-checkerboard
+http://distill.pub/2016/handwriting
+https://distill.pub/2017/research-debt
+http://distill.pub/2017/momentum
+https://distill.pub/2017/feature-visualization
+https://distill.pub/2017/ctc
+https://distill.pub/2017/aia
+https://distill.pub/2018/building-blocks
+https://distill.pub/2018/feature-wise-transformations
+https://distill.pub/2018/differentiable-parameterizations
+https://distill.pub/2018/editorial-update
+https://distill.pub/2019/safety-needs-social-scientists
+https://distill.pub/2019/activation-atlas
+https://distill.pub/2019/memorization-in-rnns
+https://distill.pub/2019/visual-exploration-gaussian-processes
+https://distill.pub/2019/gan-open-problems
+https://distill.pub/2019/advex-bugs-discussion
+https://distill.pub/2019/advex-bugs-discussion/response-1
+https://distill.pub/2019/advex-bugs-discussion/response-2
+https://distill.pub/2019/advex-bugs-discussion/response-3
+https://distill.pub/2019/advex-bugs-discussion/response-4
+https://distill.pub/2019/advex-bugs-discussion/response-5
+https://distill.pub/2019/advex-bugs-discussion/response-6
+https://distill.pub/2019/advex-bugs-discussion/original-authors
+https://distill.pub/2019/paths-perspective-on-value-learning
+https://distill.pub/2019/computing-receptive-fields
+http://texblog.org/?p=10145
+http://texblog.org/?p=10183
+http://texblog.org/?p=10214
+http://texblog.org/?p=10295
+http://texblog.org/?p=10407
+http://texblog.org/?p=10474
+http://texblog.org/?p=10652
+http://texblog.org/?p=10673
+http://texblog.org/?p=10705
+http://texblog.org/?p=10756
+http://www.fast.ai/2016/10/07/fastai-launch
+http://www.fast.ai/2016/10/08/course-background
+http://www.fast.ai/2016/10/08/curriculum
+http://www.fast.ai/2016/10/08/teaching-philosophy
+http://www.fast.ai/2016/10/08/overview
+http://www.fast.ai/2016/10/09/diversity-in-ai
+http://www.fast.ai/2016/10/11/fortune
+http://www.fast.ai/2016/10/12/international
+http://www.fast.ai/2016/11/17/not-all-the-same
+http://www.fast.ai/2016/12/08/org-structure
+http://www.fast.ai/2016/12/19/favorite-posts
+http://www.fast.ai/2016/12/19/gpu-lies
+http://www.fast.ai/2016/12/24/mooc
+http://www.fast.ai/2016/12/29/uses-of-ai
+http://www.fast.ai/2017/01/03/keras
+http://www.fast.ai/2017/01/17/curriculum2
+http://www.fast.ai/2017/01/28/diversity-international-part-ii
+http://www.fast.ai/2017/02/24/captions-and-notes
+http://www.fast.ai/2017/02/27/not-just-silicon-valley
+http://www.fast.ai/2017/03/01/changing-careers
+http://www.fast.ai/2017/03/17/not-commoditized-no-phd
+http://www.fast.ai/2017/03/23/focus-on-coding
+http://www.fast.ai/2017/04/06/alternatives
+http://www.fast.ai/2017/05/07/parent
+http://www.fast.ai/2017/07/17/num-lin-alg
+http://www.fast.ai/2017/07/28/deep-learning-part-two-launch
+http://www.fast.ai/2017/07/28/killer-robots
+http://www.fast.ai/2017/08/15/diversity
+http://www.fast.ai/2017/08/16/diversity-crisis
+http://www.fast.ai/2017/08/17/diversity-sponsors
+http://www.fast.ai/2017/08/21/ai-in-medicine
+http://www.fast.ai/2017/08/25/language-modeling-sota
+http://www.fast.ai/2017/09/08/international-fellowship
+http://www.fast.ai/2017/09/08/introducing-pytorch-for-fastai
+http://www.fast.ai/2017/09/13/kosinski
+http://www.fast.ai/2017/09/19/accurate-info
+http://www.fast.ai/2017/11/02/ethics
+http://www.fast.ai/2017/11/13/validation-sets
+http://www.fast.ai/2017/11/16/what-you-need
+http://www.fast.ai/2017/12/18/personal-brand
+http://www.fast.ai/2018/01/02/diversity-2018
+http://www.fast.ai/2018/01/08/startups
+http://www.fast.ai/2018/01/09/diversity-sponsors
+http://www.fast.ai/2018/01/17/international-spring-2018
+http://www.fast.ai/2018/01/26/v2-launch
+http://www.fast.ai/2018/02/27/college-curriculum
+http://www.fast.ai/2018/04/10/stanford-salon
+http://www.fast.ai/2018/04/19/facebook
+http://www.fast.ai/2018/04/29/categorical-embeddings
+http://www.fast.ai/2018/04/30/dawnbench-fastai
+http://www.fast.ai/2018/05/07/part2-launch
+http://www.fast.ai/2018/07/02/adam-weight-decay
+http://www.fast.ai/2018/07/12/auto-ml-1
+http://www.fast.ai/2018/07/16/auto-ml2
+http://www.fast.ai/2018/07/23/auto-ml-3
+http://www.fast.ai/2018/08/07/hbr-bias-algorithms
+http://www.fast.ai/2018/08/10/fastai-diu-imagenet
+http://www.fast.ai/2018/08/16/diversity-fellowships
+http://www.fast.ai/2018/08/27/grad-school
+http://www.fast.ai/2018/09/24/ai-ethics-resources
+http://www.fast.ai/2018/09/26/ml-launch
+http://www.fast.ai/2018/10/02/fastai-ai
+http://www.fast.ai/2018/10/16/aws-datasets
+http://www.fast.ai/2019/01/02/one-year-of-deep-learning
+http://www.fast.ai/2019/01/10/swift-numerics
+http://www.fast.ai/2019/01/13/swift-random
+http://www.fast.ai/2019/01/24/course-v3
+http://www.fast.ai/2019/01/28/diversity-fellowships
+http://www.fast.ai/2019/01/29/five-scary-things
+http://www.fast.ai/2019/02/15/openai-gp2
+http://www.fast.ai/2019/02/15/fastec2
+http://www.fast.ai/2019/02/15/fastec2-script
+http://www.fast.ai/2019/02/21/dl-projects
+http://www.fast.ai/2019/03/04/ethics-framework
+http://www.fast.ai/2019/03/06/fastai-swift
+http://www.fast.ai/2019/04/22/ethics-action-1
+http://www.fast.ai/2019/04/25/ethics-action-2
+http://www.fast.ai/2019/05/03/ethics-action-3
+http://www.fast.ai/2019/05/03/decrappify
+http://www.fast.ai/2019/05/13/blogging-advice
+http://www.fast.ai/2019/05/28/google-nyt-mohan
+http://www.fast.ai/2019/06/17/latex-ppt
+http://www.fast.ai/2019/06/28/course-p2v3
+http://www.fast.ai/2019/07/08/fastai-nlp
+http://www.fast.ai/2019/08/05/center-applied-data-ethics
+http://www.fast.ai/2019/08/06/delegation
+http://www.fast.ai/2019/08/07/surveillance
+http://www.fast.ai/2019/09/24/metrics
+http://www.fast.ai/2019/11/04/CADE-update
+yt:video:unqsQJaECv0
+yt:video:7t6iOag6kcE
+yt:video:-CiLU9-RAGk
+yt:video:MMJVZ48IRkM
+yt:video:UWpf4ZSAHBo
+yt:video:PSHhmU5hIHA
+yt:video:NuS_JLkQbKc
+yt:video:BI8m7T5t4sw
+yt:video:e3zkGyVEx8I
+yt:video:JehxPoS27nU
+yt:video:_bVx4E0wlPc
+yt:video:_V_-62BVw54
+yt:video:hmB4fd8BRQg
+yt:video:FWV3eC3Dr1Y
+yt:video:eLEo4OQ-cuQ
+https://olgabotvinnik.com/blog/glamorized-exhaustion-is-not-productivity/
+https://olgabotvinnik.com/blog/constancy-and-moderation-wins-the-race/
+https://olgabotvinnik.com/blog/how-to-be-fabulously-successful-eric-lander/
+https://olgabotvinnik.com/blog/ziv-bar-joseph-marathons-and-computational-biology/
+https://olgabotvinnik.com/blog/bam-files-profit/
+https://olgabotvinnik.com/blog/how-to-request-a-letter-of-recommendation/
+https://olgabotvinnik.com/blog/logistic-regression-tutorial/
+https://olgabotvinnik.com/blog/3-boring-ways-to-be-productive/
+https://olgabotvinnik.com/blog/arianna-huffington-on-sleep-she-also-reminds-us/
+https://olgabotvinnik.com/blog/how-to-use-googles-internet-caching-to-your-advantage/
+https://olgabotvinnik.com/blog/how-to-set-helvetica-as-the-default-sans-serif-font-in/
+https://olgabotvinnik.com/blog/startups-life-learning-and-happiness-the-anti-todo/
+https://olgabotvinnik.com/blog/the-essence-of-the-problem/
+https://olgabotvinnik.com/blog/single-cell-genomics-will-change-the-world/
+https://olgabotvinnik.com/blog/implementing-graphic-design-principles-in-pythons/
+https://olgabotvinnik.com/blog/in-india-no-frills-hospitals-offer-800-heart/
+https://olgabotvinnik.com/blog/beautiful-boxplots-and-sassy-small-multiples/
+https://olgabotvinnik.com/blog/how-to-fail-and-sometimes-win-at-graduate-fellowships/
+https://olgabotvinnik.com/blog/the-r-script-that-will-change-your-life/
+https://olgabotvinnik.com/blog/prettyplotlib-painlessly-create-beautiful-matplotlib/
+https://olgabotvinnik.com/blog/science-meet-productivity-turned-1-today-thank/
+https://olgabotvinnik.com/blog/ucsd-scientific-python-user-group/
+https://olgabotvinnik.com/blog/everything-is-a-performance-make-your-fifteen-minutes/
+https://olgabotvinnik.com/blog/succinct-loop-testing-in-python/
+https://olgabotvinnik.com/blog/you-can-code-too/
+https://olgabotvinnik.com/blog/prettyplotlib-update/
+https://olgabotvinnik.com/blog/how-a-developer-learned-not-to-be-racist-and-sexist/
+https://olgabotvinnik.com/blog/most-of-the-time-you-fail/
+https://olgabotvinnik.com/blog/pythonpath-is-a-liar-site-py-and-easy-install-pth-tell/
+https://olgabotvinnik.com/blog/did-you-take-physics-or-chemistry-classes-as-undergrad/
+https://olgabotvinnik.com/blog/implementing-annotation-free-quantification-of-splice/
+https://olgabotvinnik.com/blog/migration-to-github-io/
+https://olgabotvinnik.com/blog/no-longer-actively-developing-prettyplotlib/
+https://olgabotvinnik.com/blog/re-shirtgate/
+https://olgabotvinnik.com/blog/teaching-data-cleaning/
+https://olgabotvinnik.com/blog/how-to-create-a-custom-genome-fasta-from-a-vcf-file/
+https://olgabotvinnik.com/blog/things-said-to-me/
+https://olgabotvinnik.com/blog/codeneuro-nyc-2015/
+https://olgabotvinnik.com/blog/igv-java-lang-nullpointerexception/
+https://olgabotvinnik.com/blog/time-is-citations/
+https://olgabotvinnik.com/blog/migrate-to-hugo/
+https://olgabotvinnik.com/blog/cshl-singlecell-2017/
+https://olgabotvinnik.com/blog/setting-up-aws-access-keys/
+https://olgabotvinnik.com/blog/macbook-setup/
+https://olgabotvinnik.com/blog/googledrive-ubuntu/
+https://olgabotvinnik.com/blog/ucsf-paper-access/
+https://olgabotvinnik.com/blog/job-seq-the-lowest-throughput-sequencing-technology/
+https://fharrell.com/post/new-year-goals/
+https://fharrell.com/post/ml-sample-size/
+https://fharrell.com/post/percent/
+https://fharrell.com/post/ordinal-info/
+https://fharrell.com/post/medml/
+https://fharrell.com/post/improve-research/
+https://fharrell.com/post/ymult/
+https://fharrell.com/post/stat-ml/
+https://fharrell.com/post/stat-ml2/
+https://fharrell.com/post/hteview/
+https://fharrell.com/post/disc/
+https://fharrell.com/post/mlconfusion/
+https://fharrell.com/post/addvalue/
+https://fharrell.com/post/varyor/
+https://fharrell.com/post/demohte/
+https://medium.com/p/c291752e4953
+https://medium.com/p/bb5bc82faaee
+https://medium.com/p/2d58ccf12ab1
+https://medium.com/p/b52053dedd32
+https://medium.com/p/ab76dc061833
+https://medium.com/p/354cf140a5a6
+https://medium.com/p/2be3eb3be977
+https://medium.com/p/9e45c1e34b60
+https://medium.com/p/bae679df0f5b
+https://medium.com/p/145b395f66c7
+https://medium.com/p/f95683e23c1d
+https://medium.com/p/c9e46741041
+https://medium.com/p/6c09de8fd57c
+https://medium.com/p/acd716f6450a
+https://medium.com/p/da8ed488a8c4
+https://medium.com/p/89053d2855be
+https://medium.com/p/1b78af2977df
+https://medium.com/p/72d75a9e06c2
+https://medium.com/p/3df7be5cb116
+https://medium.com/p/57060c0d2f19
+https://medium.com/p/ba8a399e9739
+https://medium.com/p/b86bd6ef4b72
+https://medium.com/p/146a67e69f71
+https://medium.com/p/6c974ac49c27
+https://medium.com/p/7546acfa3ceb
+https://medium.com/p/396e98e9c136
+https://medium.com/p/c47737de7ed3
+https://medium.com/p/cb8f55af8c30
+https://medium.com/p/3be0f36cdd47
+https://medium.com/p/5c93d0b2c139
+https://medium.com/p/fd02f754b37c
+https://medium.com/p/29be608480f
+https://medium.com/p/e137416baa05
+https://medium.com/p/450f656b44ca
+https://medium.com/p/69a2816c2f12
+http://zachholman.com/posts/three-quotes-from-early-githubbers
+http://zachholman.com/posts/women-in-the-room
+http://zachholman.com/posts/javacript-haters
+http://zachholman.com/posts/integration-tests
+http://zachholman.com/posts/the-depression-thing
+http://zachholman.com/posts/staying-productive-solo-founder
+http://zachholman.com/posts/a-stack-story
+http://zachholman.com/posts/apple-accessories-ecosystem-problem
+http://zachholman.com/talk/utc-is-enough-for-everyone-right
+http://zachholman.com/posts/double-shipping
+https://davebucklin.com/play/2016/03/11/mechanical-keyboards.html
+https://davebucklin.com/play/2016/04/13/audiophilia.html
+https://davebucklin.com/work/2016/06/19/the-purchase-funnel-danger-zone.html
+https://davebucklin.com/play/2016/09/25/learning-to-type.html
+https://davebucklin.com/play/2016/10/21/using-irssi-with-slack.html
+https://davebucklin.com/play/2016/11/02/wordpress-to-jekyll-part-1.html
+https://davebucklin.com/play/2016/11/06/wordpress-to-jekyll-part-2.html
+https://davebucklin.com/work/2016/11/28/getting-started-part-1.html
+https://davebucklin.com/play/2017/03/05/setting-up-twtxt.html
+https://davebucklin.com/play/2017/03/24/backing-up-dotfiles-with-stow-and-git.html
+https://davebucklin.com/play/2017/05/25/geeknote-evernote-command-line.html
+https://davebucklin.com/work/2017/09/11/diagrams-from-text-with-plantuml.html
+https://davebucklin.com/work/2017/09/17/information-gathering-management.html
+https://davebucklin.com/play/2017/11/02/shoving-off-lightsail.html
+https://davebucklin.com/play/2017/11/10/journal-to-timesheet.html
+https://davebucklin.com/work/2017/12/17/working-with-recruiters.html
+https://davebucklin.com/play/2017/12/31/plain-text.html
+https://davebucklin.com/work/2018/01/06/ranger-vim-crm.html
+https://davebucklin.com/play/2018/01/20/diy-dropbox.html
+https://davebucklin.com/play/2018/03/04/gopher-groff.html
+https://davebucklin.com/work/2018/03/12/corporate-it.html
+https://davebucklin.com/play/2018/03/31/how-to-gopher.html
+https://davebucklin.com/work/2018/04/14/learning-styles.html
+https://davebucklin.com/play/2018/04/17/evernote-extraction.html
+https://davebucklin.com/play/2018/04/23/vimwiki-inception.html
+https://davebucklin.com/play/2018/05/15/mailman-install-commentary.html
+https://davebucklin.com/play/2018/06/16/bbook.html
+https://davebucklin.com/play/2018/06/29/timeline-of-programming-languages.html
+https://davebucklin.com/play/2018/08/24/canon-cat-boxy-but-good.html
+https://davebucklin.com/play/2018/08/26/email-application-interface.html
+https://davebucklin.com/play/2018/09/03/usenet.html
+https://davebucklin.com/work/2018/09/27/casual-programming.html
+https://davebucklin.com/play/2018/10/24/maintenance-history-recutils.html
+https://davebucklin.com/work/2018/11/30/turning-the-wheel.html
+https://davebucklin.com/play/2019/05/18/playlists-cmux-x3.html
+https://davebucklin.com/play/2019/06/15/diction.html
+https://davebucklin.com/play/2019/06/30/catcam.html
+https://davebucklin.com/play/2019/08/10/2048.html
+https://davebucklin.com/play/2019/11/01/fastmail.html
+https://davebucklin.com/play/2019/11/10/programming-as-craft.html
+https://erikbern.com/2012/10/21/luigi-build-complex-pipelines-of-tasks
+https://erikbern.com/2012/10/29/a-neat-little-trick-with-time-decay
+https://erikbern.com/2012/11/18/tumblrs-awesome-project-names
+https://erikbern.com/2012/12/05/calculating-cosine-similarities-using-dimensionality-reduction
+https://erikbern.com/2013/01/13/momentum-and-mean-reversion-might-just-be-volatility-bias
+https://erikbern.com/2013/01/22/nyc-machine-learning-meetup
+https://erikbern.com/2013/01/27/slides-from-nyc-machine-learning-talk
+https://erikbern.com/2013/02/06/im-featured-in-mashable
+https://erikbern.com/2013/02/27/ml-at-twitter
+https://erikbern.com/2013/03/22/more-luigi-pres
+https://erikbern.com/2013/04/12/annoy
+https://erikbern.com/2013/04/13/being-data-driven
+https://erikbern.com/2013/04/26/presentation-about-luigi
+https://erikbern.com/2013/04/27/stuff-that-bothers-me-100x-faster-than-hadoop
+https://erikbern.com/2013/05/07/snakebite
+https://erikbern.com/2013/05/21/fermats-principle
+https://erikbern.com/2013/05/31/spotifys-discovery-page
+https://erikbern.com/2013/06/02/wikiphilia
+https://erikbern.com/2013/06/16/nodoc
+https://erikbern.com/2013/06/19/hdfs2cass
+https://erikbern.com/2013/06/26/more-luigi
+https://erikbern.com/2013/07/24/normalizing-multinomial-distributions
+https://erikbern.com/2013/07/27/more-luigi-presentation-from-oscon
+https://erikbern.com/2013/07/28/hubspots-creepy-picture-shows-how-to-maintain-monocultures-in-the-21st-century
+https://erikbern.com/2013/08/03/mlhadoop-at-nyc-predictive-analytics
+https://erikbern.com/2013/08/09/delivering-music-recommendations
+https://erikbern.com/2013/08/11/2d-embedding-of-5k-artists-win
+https://erikbern.com/2013/08/12/3d
+https://erikbern.com/2013/08/17/306
+https://erikbern.com/2013/09/04/vote-for-our-sxsw-panel
+https://erikbern.com/2013/09/16/implicit-data-and-collaborative-filtering
+https://erikbern.com/2013/10/18/statself-com
+https://erikbern.com/2013/11/02/model-benchmarks
+https://erikbern.com/2013/12/06/bagging-as-a-regularizer
+https://erikbern.com/2013/12/12/microsofts-new-marketing-strategy-give-up
+https://erikbern.com/2013/12/20/more-insight-into-recommender-algorithms
+https://erikbern.com/2014/01/12/benchmarking-nearest-neighbor-libraries-in-python
+https://erikbern.com/2014/01/23/ratio-metrics
+https://erikbern.com/2014/03/03/momentum-strategies
+https://erikbern.com/2014/03/22/luigi-party
+https://erikbern.com/2014/03/22/welcome-echo-nest
+https://erikbern.com/2014/04/01/music-recommendations-using-cover-images-part-1
+https://erikbern.com/2014/04/12/mlconf-2014
+https://erikbern.com/2014/04/24/the-power-of-ensembles
+https://erikbern.com/2014/06/08/how-to-build-up-a-data-team-everything-i-ever-learned-about-recruiting
+https://erikbern.com/2014/06/17/where-do-locals-go-in-nyc
+https://erikbern.com/2014/06/28/recurrent-neural-networks-for-collaborative-filtering
+https://erikbern.com/2014/07/30/in-defense-of-false-positives-why-you-cant-fail-with-ab-tests
+https://erikbern.com/2014/08/19/running-theano-on-ec2
+https://erikbern.com/2014/10/07/detecting-corporate-fraud-using-benfords-law
+https://erikbern.com/2014/10/10/the-filter-bubble-is-silly-and-you-cant-guess-what-happened-next
+https://erikbern.com/2014/11/11/annoying-blog-post
+https://erikbern.com/2014/11/15/luigi-spreading-to-the-west-coast
+https://erikbern.com/2014/11/22/optimizing-things-everything-is-a-proxy-for-a-proxy-for-a-proxy
+https://erikbern.com/2014/11/29/deep-learning-for-chess
+https://erikbern.com/2014/12/08/deep-learning-for-chess-addendum
+https://erikbern.com/2014/12/11/deep-learning-for-go
+https://erikbern.com/2014/12/16/luigi-talk-tomorrow
+https://erikbern.com/2014/12/17/luigi-presentation-nyc-data-science-dec-16-2014
+https://erikbern.com/2014/12/20/a-brief-history-of-hadoop-at-spotify-2008-2009
+https://erikbern.com/2014/12/28/i-already-found-the-best-gifs
+https://erikbern.com/2014/12/30/everything-i-learned-about-technical-debt
+https://erikbern.com/2015/01/13/scala-data-pipelines-for-music-recommendations
+https://erikbern.com/2015/02/11/leaving-spotify
+https://erikbern.com/2015/02/22/my-favorite-management-failures
+https://erikbern.com/2015/02/26/the-relationship-between-commit-size-and-commit-message-size
+https://erikbern.com/2015/03/14/pinterest-open-sources-pinball
+https://erikbern.com/2015/04/07/norvigs-claim-that-programming-competitions-correlate-negatively-with-being-good-on-the-job
+https://erikbern.com/2015/04/09/its-called-berksons-paradox
+https://erikbern.com/2015/04/22/black-box-machine-learning-in-the-cloud
+https://erikbern.com/2015/04/26/ping-the-world
+https://erikbern.com/2015/05/03/annoy-now-without-boost-dependencies-and-with-python-3-support
+https://erikbern.com/2015/05/26/40-better-precision-and-4x-faster-index-building-in-annoy
+https://erikbern.com/2015/05/28/the-lane-next-to-you-is-more-likely-to-be-slower-than-yours
+https://erikbern.com/2015/06/05/the-hardest-challenge-about-becoming-a-manager
+https://erikbern.com/2015/06/21/3d-in-d3
+https://erikbern.com/2015/07/02/more-luigi-alternatives
+https://erikbern.com/2015/07/04/benchmark-of-approximate-nearest-neighbor-libraries
+https://erikbern.com/2015/07/24/math-problem
+https://erikbern.com/2015/08/16/software-engineers-and-automation
+https://erikbern.com/2015/09/08/antipodes
+https://erikbern.com/2015/09/22/presentations-about-spotify-music-recommendations
+https://erikbern.com/2015/09/24/nearest-neighbor-methods-vector-models-part-1
+https://erikbern.com/2015/10/01/nearest-neighbors-and-vector-models-part-2-how-to-search-in-high-dimensional-spaces
+https://erikbern.com/2015/10/20/nearest-neighbors-and-vector-models-epilogue-curse-of-dimensionality
+https://erikbern.com/2015/10/28/interview-with-a-data-scientist-erik-bernhardsson
+https://erikbern.com/2015/10/31/mcmc-for-marketing-data
+https://erikbern.com/2015/11/04/looking-for-smart-people
+https://erikbern.com/2015/11/12/installing-tensorflow-on-aws
+https://erikbern.com/2015/11/28/there-is-no-magic-trick
+https://erikbern.com/2015/12/05/more-mcmc-analyzing-a-small-dataset-with-1-5-ratings
+https://erikbern.com/2016/01/01/books-i-read-in-2015
+https://erikbern.com/2016/01/08/i-believe-in-the-10x-engineer-but
+https://erikbern.com/2016/01/21/analyzing-50k-fonts-using-deep-neural-networks
+https://erikbern.com/2016/01/25/some-more-font-links
+https://erikbern.com/2016/02/03/my-issue-with-gpu-accelerated-deep-learning
+https://erikbern.com/2016/03/02/iterate-or-die
+https://erikbern.com/2016/03/12/meta-blogging
+https://erikbern.com/2016/03/16/exploding-offers-are-bullshit
+https://erikbern.com/2016/04/04/nyc-subway-math
+https://erikbern.com/2016/04/18/why-organizations-fail
+https://erikbern.com/2016/04/26/dollar-cost-averaging
+https://erikbern.com/2016/05/24/what-is-your-motivation
+https://erikbern.com/2016/06/02/approximate-nearest-news
+https://erikbern.com/2016/07/09/waiting-time-math
+https://erikbern.com/2016/08/05/when-machine-learning-matters
+https://erikbern.com/2016/09/08/state-drift
+https://erikbern.com/2016/10/25/pareto-efficiency
+https://erikbern.com/2016/11/01/are-data-sets-the-new-server-rooms
+https://erikbern.com/2016/12/05/the-half-life-of-code
+https://erikbern.com/2017/01/10/functional-programming-is-the-libertarianism-of-sw-eng
+https://erikbern.com/2017/02/01/language-pitch
+https://erikbern.com/2017/02/17/why-i-went-into-the-mortgage-industry
+https://erikbern.com/2017/03/15/the-eigenvector-of-why-we-moved-from-language-x-to-language-y
+https://erikbern.com/2017/04/09/the-mathematical-principles-of-management
+https://erikbern.com/2017/05/23/conversion-rates-you-are-most-likely-computing-them-wrong
+https://erikbern.com/2017/06/09/blogroll
+https://erikbern.com/2017/07/06/optimizing-for-iteration-speed
+https://erikbern.com/2017/07/12/the-most-twisted-coastline
+https://erikbern.com/2017/08/14/google-diversity-memo-global-warming-pascals-wager
+https://erikbern.com/2017/08/19/machine-platform-crowd
+https://erikbern.com/2017/08/29/the-software-engineering-rule-of-3
+https://erikbern.com/2017/09/06/the-number-of-letters-in-the-word-for-each-number
+https://erikbern.com/2017/09/26/on-the-equifax-breach-and-how-to-really-secure-prevent-theft
+https://erikbern.com/2017/10/30/why-conversion-matters-a-toy-model
+https://erikbern.com/2017/11/26/annoy-1.10-released-with-hamming-distance-and-windows-support
+https://erikbern.com/2017/12/12/learning-from-users-faster-using-machine-learning
+https://erikbern.com/2017/12/29/toxic-meeting-culture
+https://erikbern.com/2018/01/03/plotting-author-statistics-for-git-repos-using-git-of-theseus
+https://erikbern.com/2018/01/17/books-i-consumed-in-2017
+https://erikbern.com/2018/01/28/im-looking-for-data-engineers
+https://erikbern.com/2018/02/15/new-benchmarks-for-approximate-nearest-neighbors
+https://erikbern.com/2018/03/07/lessons-from-content-marketing-myself-aka-blogging-for-five-years
+https://erikbern.com/2018/03/27/waiting-time-load-factor-and-queueing-theory
+https://erikbern.com/2018/05/02/interviewing-is-a-noisy-prediction-problem
+https://erikbern.com/2018/06/04/missing-the-point-about-microservices
+https://erikbern.com/2018/06/17/new-approximate-nearest-neighbor-benchmarks
+https://erikbern.com/2018/08/16/business-secrets-from-terrible-people
+https://erikbern.com/2018/08/30/i-dont-want-to-learn-your-garbage-query-language
+https://erikbern.com/2018/10/08/the-hackers-guide-to-uncertainty-estimates
+https://erikbern.com/2019/01/10/data-architecture-vs-backend-architecture
+https://erikbern.com/2019/02/21/headcount-targets-feature-factories-and-when-to-hire-those-mythical-10x-people
+https://erikbern.com/2019/04/15/why-software-projects-take-longer-than-you-think-a-statistical-model
+https://erikbern.com/2019/08/05/modeling-conversion-rates-using-weibull-and-gamma-distributions
+https://erikbern.com/2019/09/12/misc-unsolicited-career-advice
+https://erikbern.com/2019/10/16/buffet-lines-are-terrible
+https://treyhunner.com/2018/02/python-3-s-range-better-than-python-2-s-xrange
+https://treyhunner.com/2018/02/python-range-is-not-an-iterator
+https://treyhunner.com/2018/03/tuple-unpacking-improves-python-code-readability
+https://treyhunner.com/2018/04/keyword-arguments-in-python
+https://treyhunner.com/2018/04/how-to-make-the-most-of-your-first-pycon
+https://treyhunner.com/2018/06/how-to-make-an-iterator-in-python
+https://treyhunner.com/2018/09/stop-writing-lambda-expressions
+https://treyhunner.com/2018/10/asterisks-in-python-what-they-are-and-how-to-use-them
+https://treyhunner.com/2018/11/python-morsels-sale-52-weeks-of-python
+https://treyhunner.com/2018/11/python-cyber-monday-sales
+https://treyhunner.com/2018/12/why-you-should-be-using-pathlib
+https://treyhunner.com/2019/01/no-really-pathlib-is-great
+https://treyhunner.com/2019/03/python-deep-comparisons-and-code-readability
+https://treyhunner.com/2019/03/unique-and-sentinel-values-in-python
+https://treyhunner.com/2019/03/abusing-and-overusing-list-comprehensions-in-python
+https://treyhunner.com/2019/04/making-the-most-of-the-pycon-sprints
+https://treyhunner.com/2019/04/why-you-shouldnt-inherit-from-list-and-dict-in-python
+https://treyhunner.com/2019/04/is-it-a-class-or-a-function-its-a-callable
+https://treyhunner.com/2019/05/python-builtins-worth-learning
+https://treyhunner.com/2019/06/loop-better-a-deeper-look-at-iteration-in-python
+https://aiweirdness.com/post/185883998702
+https://aiweirdness.com/post/186072231337
+https://aiweirdness.com/post/186235675877
+https://aiweirdness.com/post/186353419952
+https://aiweirdness.com/post/186539822077
+https://aiweirdness.com/post/186656280482
+https://aiweirdness.com/post/186862853387
+https://aiweirdness.com/post/187027270732
+https://aiweirdness.com/post/187189517887
+https://aiweirdness.com/post/187374759802
+https://aiweirdness.com/post/187489831262
+https://aiweirdness.com/post/187645450357
+https://aiweirdness.com/post/187819926757
+https://aiweirdness.com/post/187962817292
+https://aiweirdness.com/post/188214106227
+https://aiweirdness.com/post/188342947482
+https://aiweirdness.com/post/188429765367
+https://aiweirdness.com/post/188520435937
+https://aiweirdness.com/post/188723144977
+https://aiweirdness.com/post/188835401897
+http://inconsolation.wordpress.com/?p=9682
+http://inconsolation.wordpress.com/?p=9685
+http://inconsolation.wordpress.com/?p=9690
+http://inconsolation.wordpress.com/?p=9693
+http://inconsolation.wordpress.com/?p=9698
+http://inconsolation.wordpress.com/?p=9704
+http://inconsolation.wordpress.com/?p=9711
+http://inconsolation.wordpress.com/?p=9717
+http://inconsolation.wordpress.com/?p=9725
+http://inconsolation.wordpress.com/?p=9733
+http://lukeoakdenrayner.wordpress.com/?p=8238
+http://lukeoakdenrayner.wordpress.com/?p=7897
+http://lukeoakdenrayner.wordpress.com/?p=8379
+http://lukeoakdenrayner.wordpress.com/?p=8479
+http://lukeoakdenrayner.wordpress.com/?p=8535
+http://lukeoakdenrayner.wordpress.com/?p=8369
+http://lukeoakdenrayner.wordpress.com/?p=8633
+http://lukeoakdenrayner.wordpress.com/?p=8683
+http://lukeoakdenrayner.wordpress.com/?p=8782
+http://lukeoakdenrayner.wordpress.com/?p=8931
+http://www.calnewport.com/?p=7280
+http://www.calnewport.com/?p=7304
+http://www.calnewport.com/?p=7319
+https://www.calnewport.com/?p=7345
+https://www.calnewport.com/?p=7360
+https://www.calnewport.com/?p=7363
+https://www.calnewport.com/?p=7378
+https://www.calnewport.com/?p=7395
+https://www.calnewport.com/?p=7402
+https://machinelearningmastery.com/?p=8897
+https://machinelearningmastery.com/?p=8902
+https://machinelearningmastery.com/?p=9129
+https://machinelearningmastery.com/?p=8999
+https://machinelearningmastery.com/?p=9010
+PubMed:31618209
+PubMed:31672532
+PubMed:31677334
+PubMed:31685587
+PubMed:31706792
+PubMed:27139377
+PubMed:29298978
+PubMed:30869146
+PubMed:31001455
+https://sanctum.geek.nz/arabesque/?p=1312
+https://sanctum.geek.nz/arabesque/?p=1393
+https://sanctum.geek.nz/arabesque/?p=1453
+https://sanctum.geek.nz/arabesque/?p=1466
+https://sanctum.geek.nz/arabesque/?p=1500
+https://sanctum.geek.nz/arabesque/?p=1695
+https://sanctum.geek.nz/arabesque/?p=1782
+https://sanctum.geek.nz/arabesque/?p=1794
+https://sanctum.geek.nz/arabesque/?p=2108
+https://sanctum.geek.nz/arabesque/?p=2113
+5000subs
+first
+gopro5000
+corelibre
+wallpapers
+donei3
+battle1
+i3wmchad
+calcurse
+vidme
+masteringwebsite
+managewebsite
+muhrss
+2yearwointernet
+mpdncmpcpp
+websitebackend
+imminentplans
+newlarbssoon
+norel1
+outoftownlarbs
+podcast
+housecleaning
+10000subs
+lukegoldenage
+blockadsporn
+libraryhtml
+purismlaptops
+limitationscause
+eoma68on
+pandocpres
+decentralized
+bitchutepattodo
+battle2
+thinkpadweek
+shortcut2
+whichthinkpad
+t420
+sc-im1
+netneut
+vimspell
+linguisticsvids
+urxvt
+returningarizona
+chadrmarkdown
+rmarkdownintro
+st
+hardreset
+urlview
+rintro
+rfunctions
+rdataframes
+programsiuse
+https
+larbssoon
+forumrss
+torx
+i3dropdown
+i3webcams
+man
+forumvid
+muttwiznot
+muttwizprep
+muttwiz
+autistic
+sucklesssent
+destx220
+tripcode
+arch2para
+funandgames
+rssfeedclean
+muttwizsync
+archisameme
+sentvideos
+deusexinstall
+larbscoming
+paninisimin
+meetnoam
+liberapay
+oralssoon
+tripcodex220video
+aprilfools2018
+dmenu1
+newsboat
+arch2
+vimsublimeslave
+i3blocks
+vpsmove
+transfernamecheap
+timewaste
+linuxfestintro
+vimmouse
+https://lukesmith.xyz/2018.html#new-turbo-minimalist-site
+https://lukesmith.xyz/2018.html#on-my-new-blog-system
+https://lukesmith.xyz/2018.html#new-forum-up-and-under-preparation
+https://lukesmith.xyz/2018.html#excuse-the-rss-mess
+https://lukesmith.xyz/2018.html#check-github-for-the-blog-system
+https://lukesmith.xyz/2018.html#more-tinkering-today
+https://lukesmith.xyz/2018.html#guests-now-allowed-on-forum-perks-for-supporters.
+https://lukesmith.xyz/2018.html#video-on-the-blog-system
+https://lukesmith.xyz/2018.html#how-i-write-accent-marks-and-ipa-characters-in-vim
+https://lukesmith.xyz/2018.html#forum-now-has-http--ssl-lunduke-btfo-once-again
+https://lukesmith.xyz/2018.html#stream-soon
+https://lukesmith.xyz/2018.html#series-on-old-norse-and-language-learning
+https://lukesmith.xyz/2018.html#whomst-lives-in-georgia
+https://lukesmith.xyz/2018.html#exile-in-suburbia
+https://lukesmith.xyz/2018.html#lol-linuxfest
+https://lukesmith.xyz/2018.html#the-secrets-in-hamlets-mill
+https://lukesmith.xyz/2018.html#syncthing-video-also-patreon-changes
+https://lukesmith.xyz/2018.html#linuxfest-2018-review
+https://lukesmith.xyz/2018.html#linux-is-the-wild-west-talk-is-now-out
+https://lukesmith.xyz/2018.html#consciousness-bicamerality-and-book-reviews
+https://lukesmith.xyz/2018.html#video-on-gimp-basics
+https://lukesmith.xyz/2018.html#updates-about-money-and-patreon
+https://lukesmith.xyz/2018.html#first-imagemagick-videos
+https://lukesmith.xyz/2018.html#a-journey-to-athens
+https://lukesmith.xyz/2018.html#redesign-of-website
+https://lukesmith.xyz/2018.html#monetized-with-super-chats
+https://lukesmith.xyz/2018.html#i3blocks-reloaded
+https://lukesmith.xyz/2018.html#video-on-copying-and-pasting-from-vim
+https://lukesmith.xyz/2018.html#in-defense-of-pseudoscience
+https://lukesmith.xyz/2018.html#new-st-patches-xresources-and-pywal-compatibility
+https://lukesmith.xyz/2018.html#macs-pcs-and-the-power-of-public-relations
+https://lukesmith.xyz/2018.html#download-any-academic-article-free-a-one-liner
+https://lukesmith.xyz/2018.html#how-let-your-root-user-use-your-main-dotfiles
+https://lukesmith.xyz/2018.html#scripting-in-action
+https://lukesmith.xyz/2018.html#larbs-is-about-done
+https://lukesmith.xyz/2018.html#video-on-cronjobs-for-managing-my-system
+https://lukesmith.xyz/2018.html#minor-hack-pausing-all-mpv-videos-on-any-screen
+https://lukesmith.xyz/2018.html#dont-be-a-bash-brainlet
+https://lukesmith.xyz/2018.html#now-this-is-bash-autism
+https://lukesmith.xyz/2018.html#podcast-series-to-begin-shortly
+https://lukesmith.xyz/2018.html#minor-blog-addition
+https://lukesmith.xyz/2018.html#ive-deleted-my-twitter
+https://lukesmith.xyz/2018.html#intro-podcast-episode-up-and-rss-feed-available.
+https://lukesmith.xyz/2018.html#mfw-soydevs-would-use-php-for-this
+https://lukesmith.xyz/2018.html#full-msmtprc-support-added-to-mutt-wizard
+https://lukesmith.xyz/2018.html#the-real-bronze-age-mindset
+https://lukesmith.xyz/2018.html#cell-phones-and-the-bronze-age-collapse-1177-bc
+https://lukesmith.xyz/2018.html#capitalism-socialism-and-democracy-up
+https://lukesmith.xyz/2018.html#my-diet-following-the-memes
+https://lukesmith.xyz/2018.html#you-can-now-donate-bitcoin
+https://lukesmith.xyz/2018.html#notrelatedxyz-website-is-now-up
+https://lukesmith.xyz/2018.html#alex-jones-increasingly-based-now-even-more-banned-from-everything
+https://lukesmith.xyz/2018.html#we-need-to-start-studying-npcs-scientifically
+https://lukesmith.xyz/2018.html#terry-davis-has-died
+https://lukesmith.xyz/2018.html#thicc-podcast-episode-coming
+https://lukesmith.xyz/2018.html#le-purityspiral-nationalism
+https://lukesmith.xyz/2018.html#ssl-cert-failures-with-gmail-accounts-muttwizard
+https://lukesmith.xyz/2018.html#yes-im-doing-a-video-on-it
+https://lukesmith.xyz/2018.html#rip-lincucks-some-comments-on-recent-events
+https://lukesmith.xyz/2018.html#democracy-the-rule-of-npcs
+https://lukesmith.xyz/2018.html#any-paleoanthropologists-or-geneticists-reading-on-the-toba-population-bottleneck
+https://lukesmith.xyz/2018.html#break-week
+https://lukesmith.xyz/2018.html#video-up-on-bash-settings-and-aliases
+https://lukesmith.xyz/2018.html#not-related-episode-will-be-up-soon
+https://lukesmith.xyz/2018.html#episode-on-the-10000-year-explosion-and-pandoras-seed
+https://lukesmith.xyz/2018.html#trip-up-country-and-looking-for-land
+https://lukesmith.xyz/2018.html#livestream-for-those-who-missed-it
+https://lukesmith.xyz/2018.html#looking-for-land-for-uncle-lukes-cabin
+https://lukesmith.xyz/2018.html#video-review-and-overview-of-the-slice-battery-for-thinkpads
+https://lukesmith.xyz/2018.html#when-i-bring-back-the-forum-what-should-its-name-be
+https://lukesmith.xyz/2018.html#grofftroff-when-latex-and-pandoc-are-bloat
+https://lukesmith.xyz/2018.html#macros-in-groff-and-troff-and-other-basic-formatting
+https://lukesmith.xyz/2018.html#easy-emoji-use-with-dmenu
+https://lukesmith.xyz/2018.html#new-addresses-for-crypto-ethereum-litecoin-and-dash
+https://lukesmith.xyz/2018.html#latex-owned-epic-style-by-logical-unix-compliance-of-groff-and-refer
+https://lukesmith.xyz/2018.html#accented-and-other-unicode-characters-in-grofftroff
+https://lukesmith.xyz/2018.html#looking-for-larbs-user-submissions-
+https://lukesmith.xyz/2018.html#okay--now-this-is-epic---groff-correction-
+https://lukesmith.xyz/2018.html#bibliographies-and-references-automatically-with-refer-in-groff
+https://lukesmith.xyz/2018.html#possible-email-downage-today
+https://lukesmith.xyz/2018.html#some-potentially-relevant-changes-in-larbs-today
+https://lukesmith.xyz/2018.html#big-reshuffling-of-scripts-in-larbs-dotfiles
+https://lukesmith.xyz/2018.html#-live-streams-coming-back-
+https://lukesmith.xyz/2018.html#quick-tutorial-on-generating-qr-codes
+https://lukesmith.xyz/2018.html#not-quite-livestream-in-preparation
+https://lukesmith.xyz/2018.html#mutt-wizard-protonmail-bridge-compatibility
+https://lukesmith.xyz/2018.html#not-related---when-you-re-too-rational-to-be-rational-
+https://lukesmith.xyz/2018.html#video-on-eqn--formatting-math-and-statistics-in-groff-and-troff
+https://lukesmith.xyz/2018.html#how-do-you-do-urls-or-hyperlinks-in-a-groff-or-troff-document-
+https://lukesmith.xyz/2018.html#not-related--site-under-construction
+https://lukesmith.xyz/2018.html#adobe-reader-is-literally-hitler
+https://lukesmith.xyz/2018.html#battlestation-repair-video-
+https://lukesmith.xyz/2018.html#video-up-on-zathura-for-reading-pdfs--djvus--epubs-and-everything-else
+https://lukesmith.xyz/2018.html#podcast-syndicated-on-spotify
+https://lukesmith.xyz/2018.html#how-to-find-minimalist-programs
+https://lukesmith.xyz/2018.html#please-be-on-the-lookout-for-this-phenomenon-among-pretentious-zoomers
+https://lukesmith.xyz/2018.html#i-dab-on-all-you-nerds
+https://lukesmith.xyz/2018.html#note-to-newfriends--don-t-share-my-content-on-4chan-
+https://lukesmith.xyz/2018.html#gdp-and-income-is-a-measure-of-fragility
+https://lukesmith.xyz/2018.html#github-dotfiles-and-new-i3-video-soon
+https://lukesmith.xyz/2018.html#looking-for-a-new-colorscheme-for-my-terminal--recommendations-
+https://lukesmith.xyz/2018.html#lazy-sunday-video-on-cpu--temperature-and-memory-for-general-use
+https://lukesmith.xyz/2018.html#video-on-my-vimrc-and-vim-plug-ins-i-use
+https://lukesmith.xyz/2018.html#new-video-on-i3-configuration-and-tiling-window-managers
+https://lukesmith.xyz/2018.html#my-public-blog-script-lb-is-now-much-improved
+https://lukesmith.xyz/2018.html#new-st-build-additions-link-handling-and-xresources-and-pywal-compatibility
+https://lukesmith.xyz/2018.html#video-up-on-sed-and-regular-expressions
+https://lukesmith.xyz/2018.html#download-any-of-my-thumbnails-easily
+https://lukesmith.xyz/2018.html#are-you-thirsty-for-some-social-media-upcummies
+https://lukesmith.xyz/2018.html#my-rss-feed-is-getting-too-big
+https://lukesmith.xyz/2018.html#physiognomy-is-real-a-request
+https://lukesmith.xyz/2018.html#grug-like-new-notrelated-episode
+https://lukesmith.xyz/2018.html#luke-smith-in-1080p
+https://lukesmith.xyz/2018.html#transparencychroma-keys-in-mpv-or-vlc
+https://lukesmith.xyz/2018.html#do-you-hate-patreon-and-paypal
+https://lukesmith.xyz/2018.html#im-going-to-use-the-nnn-file-browser
+https://lukesmith.xyz/2018.html#running-commands-whenever-a-file-is-changed-with-entr
+https://lukesmith.xyz/2018.html#boomer-rants-in-woods-series
+https://lukesmith.xyz/2018.html#what-is-the-best-linux-distro
+https://lukesmith.xyz/2018.html#merry-christmas-and-bitchute-update
+https://lukesmith.xyz/2018.html#year-reviewend-of-year-livestream-incoming
+https://lukesmith.xyz/2018.html#the-new-years-livestream-will-be-on-atlantis-time
+https://lukesmith.xyz/2018.html#livestream-now-scheduled-on-youtube-and-video-requests
+https://lukesmith.xyz/2018.html#new-year-and-new-plans
+https://lukesmith.xyz/2019.html#a-hacking-wishlist
+https://lukesmith.xyz/2019.html#i-fell-ior-the-suckless-meme-in-image-viewers-too-sxiv
+https://lukesmith.xyz/2019.html#why-i-dont-use-polybar-anymore-and-on-ricing
+https://lukesmith.xyz/2019.html#nassim-taleb-on-iq-and-what-is-iq-anyway
+https://lukesmith.xyz/2019.html#why-i-dont-do-gnulinux-evangelism
+https://lukesmith.xyz/2019.html#adding-transparency-and-removing-whitespace-from-images-automatically-with-imagemagick
+https://lukesmith.xyz/2019.html#contemplating-a-brief-series-on-creating-a-website
+https://lukesmith.xyz/2019.html#hacking-wishlist-addition-moving-all-before-a-match-to-end-of-file
+https://lukesmith.xyz/2019.html#anyone-want-the-domain-name-currentyearnet-looking-to-sell
+https://lukesmith.xyz/2019.html#suck-on-this-blackpillers
+https://lukesmith.xyz/2019.html#anyone-want-to-redo-the-css-for-my-website
+https://lukesmith.xyz/2019.html#luke-steps-on-the-python-snek
+https://lukesmith.xyz/2019.html#recent-work
+https://lukesmith.xyz/2019.html#livestream-now
+https://lukesmith.xyz/2019.html#the-horrors-of-the-linux-terminal
+https://lukesmith.xyz/2019.html#anyone-got-ueberzug-image-previews-working-in-vifm
+https://lukesmith.xyz/2019.html#a-showcase-video-on-fish-as-a-shell
+https://lukesmith.xyz/2019.html#unaboomergeocities-livestream-soon
+https://lukesmith.xyz/2019.html#audio-problem-fixed-stream-active-immanently
+https://lukesmith.xyz/2019.html#some-entry-tips-to-using-suckless-programs
+https://lukesmith.xyz/2019.html#do-you-know-the-via-negativa
+https://lukesmith.xyz/2019.html#how-to-get-a-domain-name-for-cheap-or-free
+https://lukesmith.xyz/2019.html#preinnawoods-livestream-now
+https://lukesmith.xyz/2019.html#one-week-in-nowhere
+https://lukesmith.xyz/2019.html#some-riverfront-surveying
+https://lukesmith.xyz/2019.html#you-dont-choose-who-you-are
+https://lukesmith.xyz/2019.html#boomer-larps-in-woods
+https://lukesmith.xyz/2019.html#why-you-should-learn-latin
+https://lukesmith.xyz/2019.html#fuzzy-finder-fzf-a-dmenu-for-the-terminal
+https://lukesmith.xyz/2019.html#new-git-repo-greek-septuagintnew-testament-on-the-command-line
+https://lukesmith.xyz/2019.html#wow-what-a-bad-day-for-fedorafriends-luke-smith-btfos-logic-mlg-epic-style
+https://lukesmith.xyz/2019.html#the-downsides-of-bloated-software-r-markdown-and-latex
+https://lukesmith.xyz/2019.html#thinking-about-getting-a-document-camera-any-suggestions
+https://lukesmith.xyz/2019.html#pacman-for-package-management-on-arch-all-the-basics-and-more
+https://lukesmith.xyz/2019.html#college-tour-livestream-soon
+https://lukesmith.xyz/2019.html#college-stream-starting-now
+https://lukesmith.xyz/2019.html#boomer-forest-larp-episode-22
+https://lukesmith.xyz/2019.html#new-latin-vulgate-bible-repository
+https://lukesmith.xyz/2019.html#a-visit-to-the-georgia-guidestones
+https://lukesmith.xyz/2019.html#plumbing-in-linux-plan-9-from-bell-labs-style
+https://lukesmith.xyz/2019.html#my-repos-are-now-on-gitlab-and-will-be-updated-there-as-well
+https://lukesmith.xyz/2019.html#yanggangus-website-building-livestream-at-400-est
+https://lukesmith.xyz/2019.html#larbs-update-to-vifmuberzug-may-require-manual-intervention
+https://lukesmith.xyz/2019.html#livestream-starting-in-less-than-30-minutes
+https://lukesmith.xyz/2019.html#in-defense-of-pseudoscience-in-video-form
+https://lukesmith.xyz/2019.html#the-bible-on-the-command-line-tutorial
+https://lukesmith.xyz/2019.html#not-related-live-coming-soon-tomorrow
+https://lukesmith.xyz/2019.html#not-related-live-the-problem-with-academic-statistics-in-1-hour-2pm-edt
+https://lukesmith.xyz/2019.html#dont-document-software-if-you-want-to-avoid-pain
+https://lukesmith.xyz/2019.html#gnuesotericism-stream-in-an-hour
+https://lukesmith.xyz/2019.html#clear-your-rss-cache-error-fix
+https://lukesmith.xyz/2019.html#minor-dunst-uglinessbreakage-on-update-in-larbs
+https://lukesmith.xyz/2019.html#boomer-rants-in-woods-about-koding-these-days
+https://lukesmith.xyz/2019.html#using-shuf-and-random-for-randomization-in-the-command-line
+https://lukesmith.xyz/2019.html#boomer-vs-doomer-livestream-starting-imminently
+https://lukesmith.xyz/2019.html#blocking-links-from-certain-websites-on-an-apache-web-server
+https://lukesmith.xyz/2019.html#before-i-get-to-deep-into-this-does-this-exist-already
+https://lukesmith.xyz/2019.html#starting-a-mumble-server-and-unaboomer-cabin-series
+https://lukesmith.xyz/2019.html#exclusive-boomers-only-content
+https://lukesmith.xyz/2019.html#bibliographical-references-for-latex-groff-and-pandoc-without-the-effort
+https://lukesmith.xyz/2019.html#tagging-ogg-or-opus-files
+https://lukesmith.xyz/2019.html#why-prefer-free-and-open-source-software
+https://lukesmith.xyz/2019.html#pretty-funny-clip-of-alex-jones-harrassed-by-boomer-liberal
+https://lukesmith.xyz/2019.html#how-to-mount-and-access-android-phones-on-linux-computers
+https://lukesmith.xyz/2019.html#video-on-basic-configuration-of-muttneomutt
+https://lukesmith.xyz/2019.html#is-the-terminal-just-for-hipsters-also-livestream-soon
+https://lukesmith.xyz/2019.html#get-all-your-email-offline-for-archiving-mutt-etc-using-isync
+https://lukesmith.xyz/2019.html#the-right-side-of-history-is-a-spook-on-whig-history-and-selfdeception
+https://lukesmith.xyz/2019.html#muttwizard-20-release-everything-is-better-and-easier
+https://lukesmith.xyz/2019.html#acshually-some-even-better-muttwizard-changes
+https://lukesmith.xyz/2019.html#layin-down-pipes-like-a-unix-chad
+https://lukesmith.xyz/2019.html#everything-i-want-to-do-is-illegal-also-another-chadpiping-video
+https://lukesmith.xyz/2019.html#luke-digest-for-this-week
+https://lukesmith.xyz/2019.html#looking-for-a-comprehensive-book-on-gardening-and-planting-best-if-lindy-too
+https://lukesmith.xyz/2019.html#send-me-all-your-suckless-surf-hacks
+https://lukesmith.xyz/2019.html#who-needs-a-mouse-to-copy-output-the-extensibility-of-st
+https://lukesmith.xyz/2019.html#stream-with-kris-occhipinti
+https://lukesmith.xyz/2019.html#technology-meme-review-stream
+https://lukesmith.xyz/2019.html#lukes-digest-mid-may
+https://lukesmith.xyz/2019.html#larbs-is-going-throught-significant-changes
+https://lukesmith.xyz/2019.html#possible-mail-downage-today
+https://lukesmith.xyz/2019.html#email-is-still-down
+https://lukesmith.xyz/2019.html#a-script-that-automatically-sets-up-your-personal-mail-server
+https://lukesmith.xyz/2019.html#you-have-1-unread-mail-from-the-unaboomers-cabin
+https://lukesmith.xyz/2019.html#new-crypto-currency-addresses
+https://lukesmith.xyz/2019.html#the-stallman-stuff-is-cringe
+https://lukesmith.xyz/2019.html#video-on-the-zsh-or-z-shell-whatever-the-z-stands-for
+https://lukesmith.xyz/2019.html#little-neomutt-fix-for-muttwizard-users
+https://machinelearningmastery.com/?p=9043
+http://xpenguin.club/Xpenguin-Morrowind-Special-(With-Chris-Were-and-Drew)/
+https://www.calnewport.com/?p=7389
+https://aiweirdness.com/post/189170306297
+https://jvns.ca/blog/2019/02/17/organizing-this-blog-into-categories/
+https://jvns.ca/blog/2019/03/15/new-zine--bite-size-networking-/
+https://jvns.ca/blog/2019/03/26/what-are-monoidal-categories/
+https://jvns.ca/blog/2019/06/23/a-few-debugging-resources/
+https://jvns.ca/blog/brag-documents/
+https://jvns.ca/blog/2019/08/27/curl-exercises/
+https://jvns.ca/blog/2019/08/30/git-exercises--navigate-a-repository/
+https://jvns.ca/blog/2019/09/01/ways-to-write-zines-without-fancy-tools/
+https://jvns.ca/blog/2019/09/06/how-to-put-an-html-page-on-the-internet/
+https://jvns.ca/blog/2019/09/12/new-zine-on-http/
+https://jvns.ca/blog/2019/09/13/a-year-explaining-computer-things/
+https://jvns.ca/blog/2019/09/30/notes-on-building-sql-exercises/
+https://jvns.ca/blog/2019/10/01/zine-revenue-2019/
+https://jvns.ca/blog/2019/10/03/sql-queries-don-t-start-with-select/
+https://jvns.ca/blog/2019/10/28/sqlite-is-really-easy-to-compile/
+https://jvns.ca/blog/2019/10/28/some-research-on-shipping-print-zines/
+https://jvns.ca/blog/2019/11/18/some-notes-on-vector-drawing-apps/
+https://jvns.ca/blog/2019/11/18/how-containers-work--overlayfs/
+https://emptysqua.re/blog/no-substitute-for-human-allies/
+https://emptysqua.re/blog/most-lifehacks-work-briefly/
+https://emptysqua.re/blog/lincoln-national-cemetery-wreaths/
+https://emptysqua.re/blog/all-posts/dummy/
+https://emptysqua.re/blog/about/
+https://emptysqua.re/blog/first-post/
+https://emptysqua.re/blog/my-photo-show-on-the-lower-east-side/
+https://emptysqua.re/blog/using-jqtouch-js-with-ibutton-js/
+https://emptysqua.re/blog/python-coroutines/
+https://emptysqua.re/blog/my-tools/
+https://emptysqua.re/blog/pieter-hugo-permanent-error/
+https://emptysqua.re/blog/eido-roshi-resigns/
+https://emptysqua.re/blog/against-the-new-google-reader-ui/
+https://emptysqua.re/blog/myoji-sunim-gravely-ill/
+https://emptysqua.re/blog/balance/
+https://emptysqua.re/blog/letter-from-buddhist-and-yoga-teachers-in-support-of-the-occupy-movement/
+https://emptysqua.re/blog/im-the-new-python-evangelist-at-10gen/
+https://emptysqua.re/blog/unittests-code-coverage-in-pycharm/
+https://emptysqua.re/blog/makerbot-in-the-new-york-times/
+https://emptysqua.re/blog/more-on-google-reader/
+https://emptysqua.re/blog/nyc-python-meetup-recap/
+https://emptysqua.re/blog/adding-an-include-tag-to-underscore-js-templates/
+https://emptysqua.re/blog/mongo-profiling-hacks/
+https://emptysqua.re/blog/dharma-combat/
+https://emptysqua.re/blog/consistency-in-mongodb/
+https://emptysqua.re/blog/nginx-spellcasting/
+https://emptysqua.re/blog/3d-printed-math-sculptures/
+https://emptysqua.re/blog/matthew/
+https://emptysqua.re/blog/new-york-c-meetup-recap/
+https://emptysqua.re/blog/scott/
+https://emptysqua.re/blog/transcendental-meditation-for-veterans/
+https://emptysqua.re/blog/spontaneous-shrines/
+https://emptysqua.re/blog/photo-fire-sale-everything-must-go/
+https://emptysqua.re/blog/book-mongodb-in-action/
+https://emptysqua.re/blog/more-photos-of-scott/
+https://emptysqua.re/blog/abraham-lincoln-national-cemetery/
+https://emptysqua.re/blog/august-sander-and-seydou-keita/
+https://emptysqua.re/blog/save-the-monkey-reliably-writing-to-mongodb/
+https://emptysqua.re/blog/the-rise-of-developeronomics/
+https://emptysqua.re/blog/keep-watching-the-skies-slide-show-nytimes-com/
+https://emptysqua.re/blog/tornado-unittesting-eventually-correct/
+https://emptysqua.re/blog/zencation/
+https://emptysqua.re/blog/photos-of-old-animals/
+https://emptysqua.re/blog/how-to-do-an-isolated-install-of-brubeck/
+https://emptysqua.re/blog/this-thursday-a-talk-on-python-mongodb-and-asynchronous-web-frameworks/
+https://emptysqua.re/blog/andrea-bruce-uncovering-the-sadness-of-young-deaths/
+https://emptysqua.re/blog/slides-from-my-talk-on-asynchronous-web-frameworks-python-and-mongodb/
+https://emptysqua.re/blog/philly-mongodb-user-group-python-mongodb-and-asynchronous-web-frameworks/
+https://emptysqua.re/blog/third-normal-form-and-ultimate-truth/
+https://emptysqua.re/blog/zen-portraits/
+https://emptysqua.re/blog/so-youre-coming-to-a-career-fair/
+https://emptysqua.re/blog/career-fairs-part-2-how-can-startups-get-noticed/
+https://emptysqua.re/blog/sybil-myoshin-taylor/
+https://emptysqua.re/blog/generosity/
+https://emptysqua.re/blog/sybils-death-poem/
+https://emptysqua.re/blog/video-slides-and-code-about-async-python-and-mongodb/
+https://emptysqua.re/blog/tornado-unittesting-with-generators/
+https://emptysqua.re/blog/zen-photos-enkyo-roshi/
+https://emptysqua.re/blog/zen-photos-river-lanterns/
+https://emptysqua.re/blog/jukai-photos-jukai/
+https://emptysqua.re/blog/undoing-gevents-monkey-patching/
+https://emptysqua.re/blog/more-zen-portraits/
+https://emptysqua.re/blog/even-more-zen-portraits/
+https://emptysqua.re/blog/im-an-award-winning-photographer/
+https://emptysqua.re/blog/in-response-to-stop-looking-for-a-technical-co-founder/
+https://emptysqua.re/blog/review-of-being-geek-by-michael-lopp/
+https://emptysqua.re/blog/review-of-seamus-heaneys-translation-of-beowulf/
+https://emptysqua.re/blog/review-of-version-control-with-git-by-jon-loeliger/
+https://emptysqua.re/blog/pausing-with-tornado/
+https://emptysqua.re/blog/cetonia-aurata/
+https://emptysqua.re/blog/requests-in-python-and-mongodb/
+https://emptysqua.re/blog/pythons-swap-is-not-atomic/
+https://emptysqua.re/blog/review-of-the-corrections-by-jonathan-franzen/
+https://emptysqua.re/blog/against-resourcewarnings-in-python-3/
+https://emptysqua.re/blog/review-of-the-little-book-of-semaphores-by-allen-b-downey/
+https://emptysqua.re/blog/moving-virtualbox-and-vagrant-to-an-external-drive/
+https://emptysqua.re/blog/patience/
+https://emptysqua.re/blog/were-all-gonna-die/
+https://emptysqua.re/blog/review-of-introductory-graph-theory-by-gary-chartrand/
+https://emptysqua.re/blog/zen-street-retreat-photos/
+https://emptysqua.re/blog/a-natural-environment/
+https://emptysqua.re/blog/pythons-thread-locals-are-weird/
+https://emptysqua.re/blog/mollified-about-resourcewarnings/
+https://emptysqua.re/blog/syntax-highlighting-with-pycharm-pygments-and-keynote/
+https://emptysqua.re/blog/review-of-javascript-the-good-parts-by-douglas-crockford/
+https://emptysqua.re/blog/copying-a-python-functions-signature/
+https://emptysqua.re/blog/how-should-i-learn-tcp/
+https://emptysqua.re/blog/meditate-nyc-2012/
+https://emptysqua.re/blog/introducing-motor-an-asynchronous-mongodb-driver-for-python-and-tornado/
+https://emptysqua.re/blog/motor-internals-how-i-asynchronized-a-synchronous-library/
+https://emptysqua.re/blog/refactoring-tornado-code-with-gen-engine/
+https://emptysqua.re/blog/motor-four-strategies-for-maintainability/
+https://emptysqua.re/blog/zen-camp/
+https://emptysqua.re/blog/back-from-zen-camp/
+https://emptysqua.re/blog/review-of-the-evolution-of-god-by-robert-wright/
+https://emptysqua.re/blog/zen-and-the-body-politic/
+https://emptysqua.re/blog/alcatraz/
+https://emptysqua.re/blog/san-francisco/
+https://emptysqua.re/blog/this-blog-is-mongodb-2-2-powered/
+https://emptysqua.re/blog/review-of-the-snow-leopard-by-peter-matthiessen/
+https://emptysqua.re/blog/the-pacific-crest-trail/
+https://emptysqua.re/blog/motor-progress-report/
+https://emptysqua.re/blog/digital-dharma/
+https://emptysqua.re/blog/this-blog-is-pypy-powered/
+https://emptysqua.re/blog/spring-2012-shuso-hossen/
+https://emptysqua.re/blog/adorable/
+https://emptysqua.re/blog/social-organization-of-zen-practice/
+https://emptysqua.re/blog/ordination-ceremony-at-the-village-zendo/
+https://emptysqua.re/blog/review-of-opening-the-hand-of-thought-by-kosho-uchiyama/
+https://emptysqua.re/blog/dhyana/
+https://emptysqua.re/blog/review-of-let-us-now-praise-famous-men-by-james-agee-and-walker-evans/
+https://emptysqua.re/blog/video-of-me-explaining-motor/
+https://emptysqua.re/blog/regarding-warhol/
+https://emptysqua.re/blog/motor-progress-report-gridfs-logo/
+https://emptysqua.re/blog/eating-your-own-hamster-food/
+https://emptysqua.re/blog/optimizing-mongodb-compound-indexes/
+https://emptysqua.re/blog/in-transition/
+https://emptysqua.re/blog/upaya/
+https://emptysqua.re/blog/hurricane/
+https://emptysqua.re/blog/motor-installation-instructions/
+https://emptysqua.re/blog/the-whisperers/
+https://emptysqua.re/blog/gloria-and-rhoda/
+https://emptysqua.re/blog/motor-iterating-over-results/
+https://emptysqua.re/blog/faceless-killers/
+https://emptysqua.re/blog/street-portraits/
+https://emptysqua.re/blog/motor-iterating-over-results-the-grand-conclusion/
+https://emptysqua.re/blog/toro-synchronization-primitives-for-tornado-coroutines/
+https://emptysqua.re/blog/street-portraits-2/
+https://emptysqua.re/blog/the-fifth-patriarch-and-the-three-turnings/
+https://emptysqua.re/blog/pymongos-new-default-safe-writes/
+https://emptysqua.re/blog/soldier-field/
+https://emptysqua.re/blog/breaking-change-in-pymongo/
+https://emptysqua.re/blog/floating-lanterns/
+https://emptysqua.re/blog/shuso-hossen/
+https://emptysqua.re/blog/jukai/
+https://emptysqua.re/blog/the-chuang-tzu/
+https://emptysqua.re/blog/reading-from-mongodb-replica-sets-with-pymongo/
+https://emptysqua.re/blog/yieldpoints-simple-extensions-to-tornado-gen/
+https://emptysqua.re/blog/hungry-ghosts/
+https://emptysqua.re/blog/boxing-in-the-basement/
+https://emptysqua.re/blog/scatter-sites/
+https://emptysqua.re/blog/yes-every-mongodb-driver-supports-every-command/
+https://emptysqua.re/blog/motorconnection-has-been-renamed-motorclient/
+https://emptysqua.re/blog/chodo/
+https://emptysqua.re/blog/amaryllis/
+https://emptysqua.re/blog/python-increment-is-weird/
+https://emptysqua.re/blog/mushrooms/
+https://emptysqua.re/blog/python-increment-is-weird-part-ii/
+https://emptysqua.re/blog/the-middlesteins-by-jami-attenberg/
+https://emptysqua.re/blog/mongodb-full-text-search/
+https://emptysqua.re/blog/the-dude-the-zen-master-and-jon-stewart/
+https://emptysqua.re/blog/headshots/
+https://emptysqua.re/blog/a-village-zendo-scrapbook/
+https://emptysqua.re/blog/amaryllis-ii/
+https://emptysqua.re/blog/chicago-christmas/
+https://emptysqua.re/blog/collapse-by-jared-diamond/
+https://emptysqua.re/blog/ordinary-zen/
+https://emptysqua.re/blog/invitation-to-a-zen-street-retreat/
+https://emptysqua.re/blog/pymongo-2-4-2-is-out/
+https://emptysqua.re/blog/motor-is-growing-up/
+https://emptysqua.re/blog/knowing-when-a-python-thread-has-died/
+https://emptysqua.re/blog/author-photos/
+https://emptysqua.re/blog/an-event-synchronization-primitive-for-ruby/
+https://emptysqua.re/blog/what-its-like-to-work-for-10gen/
+https://emptysqua.re/blog/a-curious-concurrency-case/
+https://emptysqua.re/blog/photography-is-burning/
+https://emptysqua.re/blog/miami-photos/
+https://emptysqua.re/blog/motor-officially-released/
+https://emptysqua.re/blog/motor-01-migration/
+https://emptysqua.re/blog/review-of-roman-vishniac-rediscovered/
+https://emptysqua.re/blog/plop-python-profiler-with-call-graphs/
+https://emptysqua.re/blog/pycon-talk-on-toro/
+https://emptysqua.re/blog/building-node-applications-mongodb-backbone/
+https://emptysqua.re/blog/mongodb-applied-design-patterns/
+https://emptysqua.re/blog/shuso-hossen-spring-2013/
+https://emptysqua.re/blog/begging/
+https://emptysqua.re/blog/restructuredtext-in-pycharm-firefox-and-anger/
+https://emptysqua.re/blog/pycon-lightning-talk-about-toro/
+https://emptysqua.re/blog/toro-rewritten-for-tornado-3-0/
+https://emptysqua.re/blog/slides-from-my-talk-on-python-coroutines/
+https://emptysqua.re/blog/dzone-interviews-me/
+https://emptysqua.re/blog/i-will-pick-up-what-others-discard/
+https://emptysqua.re/blog/the-green-matrix/
+https://emptysqua.re/blog/moraffs-world/
+https://emptysqua.re/blog/april-street-portraits/
+https://emptysqua.re/blog/another-thing-about-pythons-threadlocals/
+https://emptysqua.re/blog/heading-out/
+https://emptysqua.re/blog/wasps-nest-read-copy-update-python/
+https://emptysqua.re/blog/street-retreat-recap/
+https://emptysqua.re/blog/tompkins-square-park/
+https://emptysqua.re/blog/people-of-willets-point/
+https://emptysqua.re/blog/ignition/
+https://emptysqua.re/blog/open-source-bridge/
+https://emptysqua.re/blog/sutro-baths/
+https://emptysqua.re/blog/motor-0-1-1-released/
+https://emptysqua.re/blog/recap-open-source-bridge/
+https://emptysqua.re/blog/real-time-profiling-a-mongodb-cluster/
+https://emptysqua.re/blog/synchronously-build-mongodb-indexes/
+https://emptysqua.re/blog/faith-in-harlem/
+https://emptysqua.re/blog/east-village/
+https://emptysqua.re/blog/search/
+https://emptysqua.re/blog/sean-skyler/
+https://emptysqua.re/blog/paging-geo-mongodb/
+https://emptysqua.re/blog/training-ourselves-not-to-be-alone/
+https://emptysqua.re/blog/good-night-sweet-hamster/
+https://emptysqua.re/blog/analyzing-python-c-extensions-with-cpychecker/
+https://emptysqua.re/blog/pymongo-2-6-released/
+https://emptysqua.re/blog/work-at-mongodb/
+https://emptysqua.re/blog/tendo-and-kaku/
+https://emptysqua.re/blog/pymongo-2-6-1-refleak-fix/
+https://emptysqua.re/blog/zen-at-war/
+https://emptysqua.re/blog/blogs-i-emulate/
+https://emptysqua.re/blog/pymongo-2-6-2-released/
+https://emptysqua.re/blog/introducing-charlotte-and-sybil/
+https://emptysqua.re/blog/porting-from-pymongo-to-motor/
+https://emptysqua.re/blog/python-c-extensions-and-mod-wsgi/
+https://emptysqua.re/blog/zen-mountain-center/
+https://emptysqua.re/blog/richard/
+https://emptysqua.re/blog/photos-from-open-source-bridge/
+https://emptysqua.re/blog/pymongo-2-6-3-released/
+https://emptysqua.re/blog/oshin-and-rebecca/
+https://emptysqua.re/blog/night-of-the-living-thread/
+https://emptysqua.re/blog/enkyo-and-tendo/
+https://emptysqua.re/blog/dawn-of-the-thread/
+https://emptysqua.re/blog/day-of-the-thread/
+https://emptysqua.re/blog/mukei/
+https://emptysqua.re/blog/austin/
+https://emptysqua.re/blog/shuso-hossen-summer-2013/
+https://emptysqua.re/blog/read-your-writes-consistency-pymongo/
+https://emptysqua.re/blog/monthly-music-hackathon-nyc/
+https://emptysqua.re/blog/motor-progress-report-the-road-to-0-2/
+https://emptysqua.re/blog/year-end/
+https://emptysqua.re/blog/weird-green-bug/
+https://emptysqua.re/blog/five-things/
+https://emptysqua.re/blog/rue-du-dragon/
+https://emptysqua.re/blog/the-time-capsule/
+https://emptysqua.re/blog/greenletprofiler/
+https://emptysqua.re/blog/escaping-callback-hell/
+https://emptysqua.re/blog/pymongo-2-7-rc0/
+https://emptysqua.re/blog/invitation-street-retreat-may-2014/
+https://emptysqua.re/blog/stealing/
+https://emptysqua.re/blog/begging-2014/
+https://emptysqua.re/blog/code-coverage-python-c-extensions/
+https://emptysqua.re/blog/multiple-asynchronous-events-tornado/
+https://emptysqua.re/blog/mongodb-testing-network-errors/
+https://emptysqua.re/blog/an-enlightening-failure/
+https://emptysqua.re/blog/pymongo-2-7-has-shipped/
+https://emptysqua.re/blog/announcing-motor-0-2-rc0/
+https://emptysqua.re/blog/motor-0-2-released/
+https://emptysqua.re/blog/pycon-2014-video-what-is-async/
+https://emptysqua.re/blog/pycon-apac-in-taipei/
+https://emptysqua.re/blog/speaking/
+https://emptysqua.re/blog/pycon-apac-2014-recap/
+https://emptysqua.re/blog/motor-0-2-1-released/
+https://emptysqua.re/blog/the-aura-of-the-live-demo/
+https://emptysqua.re/blog/motor-0-3-released/
+https://emptysqua.re/blog/refactoring-tornado-coroutines/
+https://emptysqua.re/blog/street-retreat-2014-recap/
+https://emptysqua.re/blog/rules-of-thumb-methods-and-functions/
+https://emptysqua.re/blog/goodbye-mongodb-world-hello-osb/
+https://emptysqua.re/blog/write-an-excellent-programming-blog/
+https://emptysqua.re/blog/resources-for-writing-about-programming/
+https://emptysqua.re/blog/motor-0-3-1-released/
+https://emptysqua.re/blog/toro-0-6-released/
+https://emptysqua.re/blog/motor-0-3-2-released/
+https://emptysqua.re/blog/let-us-now-praise-resourcewarnings/
+https://emptysqua.re/blog/jukai-2014/
+https://emptysqua.re/blog/shuso-hossen-summer-2014/
+https://emptysqua.re/blog/server-discovery-and-monitoring-spec/
+https://emptysqua.re/blog/peoples-climate-march-buddhists/
+https://emptysqua.re/blog/charlotte/
+https://emptysqua.re/blog/mongodb-boston/
+https://emptysqua.re/blog/motor-0-3-3-released/
+https://emptysqua.re/blog/restructured-text-chrome-livereload/
+https://emptysqua.re/blog/a-normal-accident-in-python-and-mod-wsgi/
+https://emptysqua.re/blog/toro-0-7-released/
+https://emptysqua.re/blog/midtown-street-portraits/
+https://emptysqua.re/blog/motor-0-3-4-released/
+https://emptysqua.re/blog/zen-chaplain-ordination/
+https://emptysqua.re/blog/pymongo-2-8-rc0/
+https://emptysqua.re/blog/good-idea-at-the-time-pymongo-start-request/
+https://emptysqua.re/blog/joel-forrester-quintet-with-christina-clare/
+https://emptysqua.re/blog/it-seemed-like-a-good-idea-at-the-time-pymongo-use-greenlets/
+https://emptysqua.re/blog/good-idea-at-the-time-pymongo/
+https://emptysqua.re/blog/if-siddhartha-didnt-leave-home/
+https://emptysqua.re/blog/good-idea-at-the-time-pymongo-copy-database/
+https://emptysqua.re/blog/good-idea-at-the-time-pymongo-mongoreplicasetclient/
+https://emptysqua.re/blog/2014-my-year-in-review/
+https://emptysqua.re/blog/year-end-2014-photos-1/
+https://emptysqua.re/blog/year-end-2014-photos-2/
+https://emptysqua.re/blog/shinryu-year-end-sesshin/
+https://emptysqua.re/blog/howard-year-end-sesshin/
+https://emptysqua.re/blog/seiki-year-end-sesshin/
+https://emptysqua.re/blog/sewing-year-end-sesshin/
+https://emptysqua.re/blog/accordion-impresario-walter-kuhr/
+https://emptysqua.re/blog/eko/
+https://emptysqua.re/blog/no-ambition-at-hanks-saloon/
+https://emptysqua.re/blog/william-zola/
+https://emptysqua.re/blog/pymongo-2-8-and-motor-0-4/
+https://emptysqua.re/blog/nashville/
+https://emptysqua.re/blog/zen-at-sing-sing/
+https://emptysqua.re/blog/weather-of-the-century-links/
+https://emptysqua.re/blog/pydev-of-the-week/
+https://emptysqua.re/blog/mentoring/
+https://emptysqua.re/blog/my-first-zen-talk/
+https://emptysqua.re/blog/mongodb-driver-issues-are-now-public/
+https://emptysqua.re/blog/pymongo-3-beta/
+https://emptysqua.re/blog/letter-from-a-prisoner-at-sing-sing/
+https://emptysqua.re/blog/skunkworks-mongo-conduction/
+https://emptysqua.re/blog/pymongo-use-greenlets-followup/
+https://emptysqua.re/blog/writing-a-thousand-deaths/
+https://emptysqua.re/blog/pymongo-key-order/
+https://emptysqua.re/blog/urban-sesshin-day-1-bowery-mission/
+https://emptysqua.re/blog/urban-sesshin-day-2-nyc-criminal-court/
+https://emptysqua.re/blog/urban-sesshin-day-3-diversity-and-racism/
+https://emptysqua.re/blog/zazenkai/
+https://emptysqua.re/blog/yangshan-plants-his-hoe/
+https://emptysqua.re/blog/response-to-asynchronous-python-and-databases/
+https://emptysqua.re/blog/pypy-garbage-collection-and-a-deadlock/
+https://emptysqua.re/blog/yangshan-plants-his-hoe-audio/
+https://emptysqua.re/blog/talk-python-podcast-python-and-mongodb/
+https://emptysqua.re/blog/announcing-pymongo-3/
+https://emptysqua.re/blog/eventually-correct-async-testing-tornado/
+https://emptysqua.re/blog/eventually-correct-links/
+https://emptysqua.re/blog/screencast-of-eventually-correct-async-testing-with-tornado/
+https://emptysqua.re/blog/pycon-video-eventually-correct-async-testing/
+https://emptysqua.re/blog/caution-critical-bug-in-pymongo-3-could-not-find-cursor-in-cache/
+https://emptysqua.re/blog/vote-for-me-at-open-source-bridge/
+https://emptysqua.re/blog/announcing-pymongo-3-0-1/
+https://emptysqua.re/blog/speaking-at-open-source-bridge-2015/
+https://emptysqua.re/blog/photos-from-my-shuso-hossen/
+https://emptysqua.re/blog/review-of-autotools-a-practitioners-guide/
+https://emptysqua.re/blog/download-stats-by-python-version-pymongo-motor-tornado/
+https://emptysqua.re/blog/announcing-motor-0-4-1/
+https://emptysqua.re/blog/announcing-pymongo-2-8-1/
+https://emptysqua.re/blog/announcing-pymongo-3-0-2/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-1-5/
+https://emptysqua.re/blog/announcing-libmongoc-1-1-6/
+https://emptysqua.re/blog/more-photos-my-shuso-hossen/
+https://emptysqua.re/blog/server-discovery-and-monitoring-in-mongodb-drivers/
+https://emptysqua.re/blog/server-discovery-and-monitoring-in-pymongo-perl-and-c/
+https://emptysqua.re/blog/tornado-locks-and-queues/
+https://emptysqua.re/blog/begging-2015/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-1-7/
+https://emptysqua.re/blog/desires-are-inexhaustible/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-1-8/
+https://emptysqua.re/blog/more-info-about-cat-herds-crook/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-1-9/
+https://emptysqua.re/blog/announcing-pymongo-3-0-3/
+https://emptysqua.re/blog/street-retreat-2015-recap/
+https://emptysqua.re/blog/grace/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-1-10/
+https://emptysqua.re/blog/motor-and-asyncio-update/
+https://emptysqua.re/blog/facing-everything-hiroshima-and-our-complicity/
+https://emptysqua.re/blog/announcing-libmongoc-1-2-beta/
+https://emptysqua.re/blog/pygotham-2015/
+https://emptysqua.re/blog/links-for-how-python-coroutines-work/
+https://emptysqua.re/blog/i-live-coded-an-async-coroutine-framework-in-32-5-minutes/
+https://emptysqua.re/blog/charlotte-at-two/
+https://emptysqua.re/blog/jukai-2015/
+https://emptysqua.re/blog/mongo-shell-crud-api/
+https://emptysqua.re/blog/toro-1-final-release/
+https://emptysqua.re/blog/announcing-libmongoc-1-2-beta1/
+https://emptysqua.re/blog/the-writers-writer/
+https://emptysqua.re/blog/500-lines-web-crawler-asyncio-coroutines/
+https://emptysqua.re/blog/east-river-state-park/
+https://emptysqua.re/blog/review-of-write-great-code/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-1-11/
+https://emptysqua.re/blog/march-to-triumph-as-a-mentor-at-software-as-craft-philadelphia/
+https://emptysqua.re/blog/seven-tips-for-pycon/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-2-0-release-candidate/
+https://emptysqua.re/blog/march-to-triumph-as-a-mentor-video/
+https://emptysqua.re/blog/black-pipe-testing/
+https://emptysqua.re/blog/announcing-pymongo-2-9/
+https://emptysqua.re/blog/how-do-python-coroutines-work-live-coding-video-from-open-source-bridge-2015/
+https://emptysqua.re/blog/black-pipe-testing-pymongo/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-2-0/
+https://emptysqua.re/blog/survey-how-do-you-use-python-with-mongodb/
+https://emptysqua.re/blog/mockupdb-test-libmongoc-mongodb-c-driver-python/
+https://emptysqua.re/blog/steve-jobs-movie-review/
+https://emptysqua.re/blog/mongodb-c-driver-survey/
+https://emptysqua.re/blog/nothing-exists-outside-the-mind/
+https://emptysqua.re/blog/link-mallard-html-with-yelp-build/
+https://emptysqua.re/blog/ikai-2015/
+https://emptysqua.re/blog/libmongoc-black-pipe-testing-mock-server/
+https://emptysqua.re/blog/oshin-2015/
+https://emptysqua.re/blog/porch-2015/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-2-1/
+https://emptysqua.re/blog/tiny-frog/
+https://emptysqua.re/blog/village-zendo-portraits/
+https://emptysqua.re/blog/announcing-pymongo-3-1-python-condition-variable/
+https://emptysqua.re/blog/test-mongodb-failures-mockupdb/
+https://emptysqua.re/blog/this-blog-runs-mongodb-3-2-rc2/
+https://emptysqua.re/blog/village-zendo-portraits-part-2/
+https://emptysqua.re/blog/motor-0-5-beta-asyncio-async-await/
+https://emptysqua.re/blog/tech-talks-are-campfires-jesses-three-reasons-you-should-speak-at-pycon/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-3-0-beta0/
+https://emptysqua.re/blog/dorothy-and-mae/
+https://emptysqua.re/blog/kinhin/
+https://emptysqua.re/blog/tokuyu-liturgy-master/
+https://emptysqua.re/blog/summer-ango-2015-interiors/
+https://emptysqua.re/blog/motor-0-5-asyncio-async-await-keywords/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-2-2/
+https://emptysqua.re/blog/finn-portraits/
+https://emptysqua.re/blog/black-pipe-testing-in-summary/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-3-0-rc0/
+https://emptysqua.re/blog/seizan-summer-2015/
+https://emptysqua.re/blog/ryotan-sensei/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-3-0/
+https://emptysqua.re/blog/announcing-pymongo-3-2/
+https://emptysqua.re/blog/zen-forms-summer-2015/
+https://emptysqua.re/blog/oshin-and-giyu/
+https://emptysqua.re/blog/porch-pictures/
+https://emptysqua.re/blog/getaddrinfo-deadlock/
+https://emptysqua.re/blog/insanity-of-self-improvement/
+https://emptysqua.re/blog/this-site-is-built-with-lektor/
+https://emptysqua.re/blog/experience-migrating-to-lektor/
+https://emptysqua.re/blog/author-photos-2015/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-3-1/
+https://emptysqua.re/blog/scale14x/
+https://emptysqua.re/blog/oryoki-2015/
+https://emptysqua.re/blog/scale14x-coroutines-talk/
+https://emptysqua.re/blog/milkweed/
+https://emptysqua.re/blog/zen-retreat-kitchen/
+https://emptysqua.re/blog/mac-python-getaddrinfo-queueing/
+https://emptysqua.re/blog/getaddrinfo-on-macosx/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-3-2/
+https://emptysqua.re/blog/how-to-compose-an-email-without-checking-your-inbox/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-3-3/
+https://emptysqua.re/blog/how-i-write-a-conference-talk/
+https://emptysqua.re/blog/announcing-winkerberos/
+https://emptysqua.re/blog/how-i-rehearse-a-conference-talk/
+https://emptysqua.re/blog/cat-herds-crook/
+https://emptysqua.re/blog/motor-0-6-released/
+https://emptysqua.re/blog/asyncio-getaddrinfo-short-circuit/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-3-4/
+https://emptysqua.re/blog/grandma-fran/
+https://emptysqua.re/blog/kaku-portrait/
+https://emptysqua.re/blog/traven-fusho-rice-shuso-hossen/
+https://emptysqua.re/blog/announcing-libbson-and-libmongoc-1-3-5/
+https://emptysqua.re/blog/studio-portraits-april-2016/
+https://emptysqua.re/blog/two-articles-for-psf/
+https://emptysqua.re/blog/fierce-tiger/
+https://emptysqua.re/blog/code-podcast/
+https://emptysqua.re/blog/bethlehem-steel/
+https://emptysqua.re/blog/april-portraits-2/
+https://emptysqua.re/blog/new-york-primary-2016/
+https://emptysqua.re/blog/union-square-west/
+https://emptysqua.re/blog/vote-for-me-at-open-source-bridge-2016/
+https://emptysqua.re/blog/c-driver-ubuntu/
+https://emptysqua.re/blog/sing-sing-joy-and-pain-witness/
+https://emptysqua.re/blog/backup-reminders-google-sheets/
+https://emptysqua.re/blog/lumps/
+https://emptysqua.re/blog/the-best-way-to-thank-your-mentor/
+https://emptysqua.re/blog/i-saw-you-fall/
+https://emptysqua.re/blog/how-i-prepare-24-hours-before-a-talk/
+https://emptysqua.re/blog/how-i-deliver-a-conference-talk/
+https://emptysqua.re/blog/the-write-an-excellent-programming-blog-page/
+https://emptysqua.re/blog/write-an-excellent-blog-pycon-2016/
+https://emptysqua.re/blog/my-two-favorite-talks-at-open-source-bridge-2016/
+https://emptysqua.re/blog/see-me-at-open-source-bridge-2016/
+https://emptysqua.re/blog/see-me-at-mongodb-world-2016/
+https://emptysqua.re/blog/smart-strategies-for-resilient-mongodb-applications/
+https://emptysqua.re/blog/gender-of-twitter-users-i-follow/
+https://emptysqua.re/blog/smart-strategies-for-resilient-mongodb-applications-screencast/
+https://emptysqua.re/blog/architecture-open-source-applications-500-lines-published/
+https://emptysqua.re/blog/how-to-write-resilient-mongodb-applications/
+https://emptysqua.re/blog/begging-2016/
+https://emptysqua.re/blog/talk-python-episode-on-writing/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-4-0-beta1/
+https://emptysqua.re/blog/we-need-more-headlines-like-no-evidence-for-flossing/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-4-0/
+https://emptysqua.re/blog/village-zendo-precepts-ceremony-2016/
+https://emptysqua.re/blog/stephen/
+https://emptysqua.re/blog/yankee-stadium/
+https://emptysqua.re/blog/water-tower/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-4-1/
+https://emptysqua.re/blog/9-11-and-non-killing/
+https://emptysqua.re/blog/street-retreat-2016-recap/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-4-2/
+https://emptysqua.re/blog/motor-0-7-beta/
+https://emptysqua.re/blog/computer-science-for-all/
+https://emptysqua.re/blog/winter-ango-2013/
+https://emptysqua.re/blog/mongodb-europe-2016-london/
+https://emptysqua.re/blog/yujin-shuso-hossen/
+https://emptysqua.re/blog/new-rochelle-landscapes/
+https://emptysqua.re/blog/motor-0-7/
+https://emptysqua.re/blog/doji-tokudo/
+https://emptysqua.re/blog/new-rochelle-surfaces/
+https://emptysqua.re/blog/motor-1-0/
+https://emptysqua.re/blog/mongodb-engineering-journal-getaddrinfo-article/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-5-0/
+https://emptysqua.re/blog/motor-1-1/
+https://emptysqua.re/blog/getaddrinfo-cpython-mac-and-bsd/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-5-1/
+https://emptysqua.re/blog/dramatic-performances-about-getaddrinfo/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-5-3/
+https://emptysqua.re/blog/joshin-sensei-year-end/
+https://emptysqua.re/blog/video-walkthrough-web-crawler-with-coroutines/
+https://emptysqua.re/blog/village-zendo-at-nyc-womens-march/
+https://emptysqua.re/blog/village-zendo-winter-retreat-2016/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-5-4/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-6-0/
+https://emptysqua.re/blog/motor-monitoring/
+https://emptysqua.re/blog/dealing-with-fear-confusion-lions-roar/
+https://emptysqua.re/blog/mae/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-6-1-and-1-5-5/
+https://emptysqua.re/blog/analyze-noise-complaints-r-mongodb-mongolite/
+https://emptysqua.re/blog/kansho-shuso-hossen/
+https://emptysqua.re/blog/who-broke-the-challenger-investigation/
+https://emptysqua.re/blog/chipy-and-chicago-pyladies-2017/
+https://emptysqua.re/blog/grok-the-gil-fast-thread-safe-python/
+https://emptysqua.re/blog/rest-in-peace-mae/
+https://emptysqua.re/blog/join-me-nyc-python-pycon-warmups-2017/
+https://emptysqua.re/blog/praxis-john/
+https://emptysqua.re/blog/under-the-bodhi-tree/
+https://emptysqua.re/blog/lets-grok-the-gil-at-pycon/
+https://emptysqua.re/blog/pycon-video-grok-the-gil/
+https://emptysqua.re/blog/ordinary-zen-in-edge-of-humanity/
+https://emptysqua.re/blog/memorial-day/
+https://emptysqua.re/blog/invitation-street-retreat-july-2017/
+https://emptysqua.re/blog/driver-features-for-mongodb-3-6/
+https://emptysqua.re/blog/unix-code-archeology-and-restoration/
+https://emptysqua.re/blog/preparing-for-sickness-old-age-death/
+https://emptysqua.re/blog/begging-2017/
+https://emptysqua.re/blog/your-nerve-plant/
+https://emptysqua.re/blog/pyladies-meetup-pygotham-brainstorming/
+https://emptysqua.re/blog/issan-house/
+https://emptysqua.re/blog/pygotham-call-for-proposals/
+https://emptysqua.re/blog/vote-for-pygotham-talks/
+https://emptysqua.re/blog/living-while-dying-is-tasy/
+https://emptysqua.re/blog/jukai-2017/
+https://emptysqua.re/blog/kaku-and-giyu/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-7-0/
+https://emptysqua.re/blog/jisei-shuso-hossen/
+https://emptysqua.re/blog/tokuyu-oshin-kaku/
+https://emptysqua.re/blog/window/
+https://emptysqua.re/blog/coaching-for-first-time-pygotham-speakers/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-8-0/
+https://emptysqua.re/blog/beginning-a-zen-meditation-practice-2017/
+https://emptysqua.re/blog/using-reflection-podcast/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-8-1/
+https://emptysqua.re/blog/recap-coaching-for-pygotham-speakers-2017/
+https://emptysqua.re/blog/author-andrea-bartz/
+https://emptysqua.re/blog/dharma-talk-why-generosity-turns-to-rage/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-8-2/
+https://emptysqua.re/blog/keynote-why-generosity-turns-to-rage/
+https://emptysqua.re/blog/motor-1-2-release-candidate/
+https://emptysqua.re/blog/join-me-pytennessee-2018/
+https://emptysqua.re/blog/motor-1-2-0/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-9-0/
+https://emptysqua.re/blog/praxis-michael/
+https://emptysqua.re/blog/running-in-circles/
+https://emptysqua.re/blog/global-diversity-cfp-day-workshop/
+https://emptysqua.re/blog/ada-and-grace/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-9-1/
+https://emptysqua.re/blog/libbson-and-libmongoc-1-9-2/
+https://emptysqua.re/blog/winter-retreat-2017/
+https://emptysqua.re/blog/embed-interns-in-teams/
+https://emptysqua.re/blog/public-speaking-workshops-february-2018/
+https://emptysqua.re/blog/the-real-shitstick/
+https://emptysqua.re/blog/cfps/
+https://emptysqua.re/blog/writing-winning-proposals-webinar/
+https://emptysqua.re/blog/further-reading-what-to-expect-when-youre-expiring/
+https://emptysqua.re/blog/yuuka-shuso-hossen/
+https://emptysqua.re/blog/why-did-rinzai-slap-jo/
+https://emptysqua.re/blog/justin-von-bujdoss-color/
+https://emptysqua.re/blog/motor-2-0/
+https://emptysqua.re/blog/coaching-for-pygotham-2018/
+https://emptysqua.re/blog/jukai-2018/
+https://emptysqua.re/blog/zmc-white-flowers/
+https://emptysqua.re/blog/zmc-san-jacinto/
+https://emptysqua.re/blog/meteor-dharma-talk/
+https://emptysqua.re/blog/zmc-coco/
+https://emptysqua.re/blog/zmc-kojin/
+https://emptysqua.re/blog/vote-for-my-confoo-2019-talks/
+https://emptysqua.re/blog/recap-coaching-for-pygotham-speakers-2018/
+https://emptysqua.re/blog/api-evolution-the-right-way/
+https://emptysqua.re/blog/rules-for-hyenas/
+https://emptysqua.re/blog/the-day-yunmen-broke-his-foot/
+https://emptysqua.re/blog/rip-grace/
+https://emptysqua.re/blog/garrison-2018-1/
+https://emptysqua.re/blog/garrison-2018-2/
+https://emptysqua.re/blog/rip-ada/
+https://emptysqua.re/blog/genro-summer-2018/
+https://emptysqua.re/blog/meaningless-striving/
+https://emptysqua.re/blog/adventurous-route-resources/
+https://emptysqua.re/blog/choosing-the-adventurous-route-video/
+https://emptysqua.re/blog/grand-central-2019/
+https://emptysqua.re/blog/red-hook/
+https://emptysqua.re/blog/api-evolution-pycon-canada-video/
+https://emptysqua.re/blog/reading-american-dharma/
+https://emptysqua.re/blog/are-the-six-senses-true-reality/
+https://emptysqua.re/blog/gertrude-and-hazel/
+https://emptysqua.re/blog/python-language-summit-2019/
+https://emptysqua.re/blog/sphinx-cats/
+https://emptysqua.re/blog/how-to-be-free-from-greed/
+https://emptysqua.re/blog/ravensbeard/
+https://emptysqua.re/blog/kaku/
+https://emptysqua.re/blog/pygotham-free-speaker-coaching-2019/
+https://emptysqua.re/blog/how-to-dissolve-the-self/
+https://emptysqua.re/blog/five-ways-to-establish-a-rock-solid-meditation-habit/
+https://emptysqua.re/blog/pygotham-2019-asl-live-captioning-playbook/
+https://emptysqua.re/blog/heartwood-sutta/
+https://standardebooks.org/ebooks/charles-dickens/a-tale-of-two-cities
+https://standardebooks.org/ebooks/victor-hugo/les-miserables/isabel-f-hapgood
+https://standardebooks.org/ebooks/william-shakespeare/henry-v
+https://standardebooks.org/ebooks/j-s-fletcher/the-charing-cross-mystery
+https://standardebooks.org/ebooks/samuel-pepys/the-diary
+https://standardebooks.org/ebooks/henry-lawson/while-the-billy-boils
+https://standardebooks.org/ebooks/john-milton/paradise-lost
+https://standardebooks.org/ebooks/sax-rohmer/brood-of-the-witch-queen
+https://standardebooks.org/ebooks/william-carlos-williams/poetry
+https://standardebooks.org/ebooks/john-buchan/mr-standfast
+https://standardebooks.org/ebooks/p-g-wodehouse/jeeves-stories
+https://standardebooks.org/ebooks/arthur-conan-doyle/the-valley-of-fear
+https://standardebooks.org/ebooks/booker-t-washington/up-from-slavery
+https://standardebooks.org/ebooks/john-reed/ten-days-that-shook-the-world
+https://standardebooks.org/ebooks/victor-hugo/notre-dame-de-paris/isabel-f-hapgood
+https://standardebooks.org/ebooks/mark-twain/the-adventures-of-tom-sawyer
+https://standardebooks.org/ebooks/jane-austen/sense-and-sensibility
+https://standardebooks.org/ebooks/leonid-andreyev/short-fiction/herman-bernstein_alexandra-linden_l-a-magnus_k-walter_w-h-lowe_the-russian-review_archibald-j-wolfe_john-cournos_r-s-townsend_maurice-magnus
+https://standardebooks.org/ebooks/jonathan-swift/gullivers-travels
+https://standardebooks.org/ebooks/suetonius/the-lives-of-the-caesars/j-c-rolfe
+https://standardebooks.org/ebooks/henry-james/the-golden-bowl
+https://standardebooks.org/ebooks/stanley-g-weinbaum/the-dark-other
+https://standardebooks.org/ebooks/evelyn-underhill/practical-mysticism
+https://standardebooks.org/ebooks/arthur-machen/the-hill-of-dreams
+https://standardebooks.org/ebooks/l-m-montgomery/anne-of-green-gables
+https://standardebooks.org/ebooks/frances-hodgson-burnett/little-lord-fauntleroy
+https://standardebooks.org/ebooks/a-a-milne/the-red-house-mystery
+https://standardebooks.org/ebooks/charlotte-bronte/jane-eyre
+https://standardebooks.org/ebooks/jack-london/the-sea-wolf
+https://standardebooks.org/ebooks/fyodor-sologub/short-fiction/john-cournos_stephen-graham_rosa-savory-graham_p-selver
+http://tastetesterdoc.com/?p=103
+http://tastetesterdoc.com/?p=109
+http://tastetesterdoc.com/?p=113
+http://tastetesterdoc.com/?p=117
+http://tastetesterdoc.com/?p=122
+http://tastetesterdoc.com/?p=126
+http://tastetesterdoc.com/?p=131
+http://tastetesterdoc.com/?p=136
+http://tastetesterdoc.com/?p=147
+http://tastetesterdoc.com/?p=162
+https://www.jpsmjournal.com/article/S0885-3924(19)30612-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30613-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30635-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(18)30180-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30103-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30298-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30374-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30386-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30387-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30434-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30435-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30443-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30444-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30446-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30448-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30449-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30451-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30447-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30458-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30459-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30455-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30438-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30452-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30456-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30462-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30463-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30450-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30461-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30474-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30505-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30507-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30454-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30460-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30508-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30509-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30506-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30510-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30511-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30513-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30512-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30514-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30523-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30524-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30525-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30526-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30528-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30529-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30527-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30530-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30531-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30562-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30563-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30564-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30566-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30567-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30565-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30568-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30569-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30571-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30532-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30572-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30573-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30574-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30575-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30576-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30577-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30579-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30580-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30581-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30596-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30598-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30597-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30570-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30578-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30603-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30604-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30605-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30606-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30607-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30608-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30582-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30609-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30610-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30637-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30639-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30638-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30640-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30641-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30642-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30643-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30644-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30645-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30646-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30647-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30649-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30651-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30652-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30653-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30648-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30654-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30595-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30650-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30663-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30664-5/fulltext?rss=yes
+https://beauhilton.com/on-making-this-website
+https://beauhilton.com/on-the-slogan
+https://beauhilton.com/a-workflow-for-remembering-all-that-science-and-also-everything
+https://beauhilton.com/Artificial-Intelligence-Definitions-and-Indefinitions
+https://beauhilton.com/python-write-my-paper
+https://beauhilton.com/r-markdown-python-friends
+https://beauhilton.com/chrome-extensions
+https://erikbern.com/2012/10/21/luigi-build-complex-pipelines-of-tasks.html
+https://erikbern.com/2012/10/29/a-neat-little-trick-with-time-decay.html
+https://erikbern.com/2012/11/18/tumblrs-awesome-project-names.html
+https://erikbern.com/2012/12/05/calculating-cosine-similarities-using-dimensionality-reduction.html
+https://erikbern.com/2013/01/13/momentum-and-mean-reversion-might-just-be-volatility-bias.html
+https://erikbern.com/2013/01/22/nyc-machine-learning-meetup.html
+https://erikbern.com/2013/01/27/slides-from-nyc-machine-learning-talk.html
+https://erikbern.com/2013/02/06/im-featured-in-mashable.html
+https://erikbern.com/2013/02/27/ml-at-twitter.html
+https://erikbern.com/2013/03/22/more-luigi-pres.html
+https://erikbern.com/2013/04/12/annoy.html
+https://erikbern.com/2013/04/13/being-data-driven.html
+https://erikbern.com/2013/04/26/presentation-about-luigi.html
+https://erikbern.com/2013/04/27/stuff-that-bothers-me-100x-faster-than-hadoop.html
+https://erikbern.com/2013/05/07/snakebite.html
+https://erikbern.com/2013/05/21/fermats-principle.html
+https://erikbern.com/2013/05/31/spotifys-discovery-page.html
+https://erikbern.com/2013/06/02/wikiphilia.html
+https://erikbern.com/2013/06/16/nodoc.html
+https://erikbern.com/2013/06/19/hdfs2cass.html
+https://erikbern.com/2013/06/26/more-luigi.html
+https://erikbern.com/2013/07/24/normalizing-multinomial-distributions.html
+https://erikbern.com/2013/07/27/more-luigi-presentation-from-oscon.html
+https://erikbern.com/2013/07/28/hubspots-creepy-picture-shows-how-to-maintain-monocultures-in-the-21st-century.html
+https://erikbern.com/2013/08/03/mlhadoop-at-nyc-predictive-analytics.html
+https://erikbern.com/2013/08/09/delivering-music-recommendations.html
+https://erikbern.com/2013/08/11/2d-embedding-of-5k-artists-win.html
+https://erikbern.com/2013/08/12/3d.html
+https://erikbern.com/2013/08/17/306.html
+https://erikbern.com/2013/09/04/vote-for-our-sxsw-panel.html
+https://erikbern.com/2013/09/16/implicit-data-and-collaborative-filtering.html
+https://erikbern.com/2013/10/18/statself-com.html
+https://erikbern.com/2013/11/02/model-benchmarks.html
+https://erikbern.com/2013/12/06/bagging-as-a-regularizer.html
+https://erikbern.com/2013/12/12/microsofts-new-marketing-strategy-give-up.html
+https://erikbern.com/2013/12/20/more-insight-into-recommender-algorithms.html
+https://erikbern.com/2014/01/12/benchmarking-nearest-neighbor-libraries-in-python.html
+https://erikbern.com/2014/01/23/ratio-metrics.html
+https://erikbern.com/2014/03/03/momentum-strategies.html
+https://erikbern.com/2014/03/22/welcome-echo-nest.html
+https://erikbern.com/2014/03/22/luigi-party.html
+https://erikbern.com/2014/04/01/music-recommendations-using-cover-images-part-1.html
+https://erikbern.com/2014/04/12/mlconf-2014.html
+https://erikbern.com/2014/04/24/the-power-of-ensembles.html
+https://erikbern.com/2014/06/08/how-to-build-up-a-data-team-everything-i-ever-learned-about-recruiting.html
+https://erikbern.com/2014/06/17/where-do-locals-go-in-nyc.html
+https://erikbern.com/2014/06/28/recurrent-neural-networks-for-collaborative-filtering.html
+https://erikbern.com/2014/07/30/in-defense-of-false-positives-why-you-cant-fail-with-ab-tests.html
+https://erikbern.com/2014/08/19/running-theano-on-ec2.html
+https://erikbern.com/2014/10/07/detecting-corporate-fraud-using-benfords-law.html
+https://erikbern.com/2014/10/10/the-filter-bubble-is-silly-and-you-cant-guess-what-happened-next.html
+https://erikbern.com/2014/11/11/annoying-blog-post.html
+https://erikbern.com/2014/11/15/luigi-spreading-to-the-west-coast.html
+https://erikbern.com/2014/11/22/optimizing-things-everything-is-a-proxy-for-a-proxy-for-a-proxy.html
+https://erikbern.com/2014/11/29/deep-learning-for-chess.html
+https://erikbern.com/2014/12/08/deep-learning-for-chess-addendum.html
+https://erikbern.com/2014/12/11/deep-learning-for-go.html
+https://erikbern.com/2014/12/16/luigi-talk-tomorrow.html
+https://erikbern.com/2014/12/17/luigi-presentation-nyc-data-science-dec-16-2014.html
+https://erikbern.com/2014/12/20/a-brief-history-of-hadoop-at-spotify-2008-2009.html
+https://erikbern.com/2014/12/28/i-already-found-the-best-gifs.html
+https://erikbern.com/2014/12/30/everything-i-learned-about-technical-debt.html
+https://erikbern.com/2015/01/13/scala-data-pipelines-for-music-recommendations.html
+https://erikbern.com/2015/02/11/leaving-spotify.html
+https://erikbern.com/2015/02/22/my-favorite-management-failures.html
+https://erikbern.com/2015/02/26/the-relationship-between-commit-size-and-commit-message-size.html
+https://erikbern.com/2015/03/14/pinterest-open-sources-pinball.html
+https://erikbern.com/2015/04/07/norvigs-claim-that-programming-competitions-correlate-negatively-with-being-good-on-the-job.html
+https://erikbern.com/2015/04/09/its-called-berksons-paradox.html
+https://erikbern.com/2015/04/22/black-box-machine-learning-in-the-cloud.html
+https://erikbern.com/2015/04/26/ping-the-world.html
+https://erikbern.com/2015/05/03/annoy-now-without-boost-dependencies-and-with-python-3-support.html
+https://erikbern.com/2015/05/26/40-better-precision-and-4x-faster-index-building-in-annoy.html
+https://erikbern.com/2015/05/28/the-lane-next-to-you-is-more-likely-to-be-slower-than-yours.html
+https://erikbern.com/2015/06/05/the-hardest-challenge-about-becoming-a-manager.html
+https://erikbern.com/2015/06/21/3d-in-d3.html
+https://erikbern.com/2015/07/02/more-luigi-alternatives.html
+https://erikbern.com/2015/07/04/benchmark-of-approximate-nearest-neighbor-libraries.html
+https://erikbern.com/2015/07/24/math-problem.html
+https://erikbern.com/2015/08/16/software-engineers-and-automation.html
+https://erikbern.com/2015/09/08/antipodes.html
+https://erikbern.com/2015/09/22/presentations-about-spotify-music-recommendations.html
+https://erikbern.com/2015/09/24/nearest-neighbor-methods-vector-models-part-1.html
+https://erikbern.com/2015/10/01/nearest-neighbors-and-vector-models-part-2-how-to-search-in-high-dimensional-spaces.html
+https://erikbern.com/2015/10/20/nearest-neighbors-and-vector-models-epilogue-curse-of-dimensionality.html
+https://erikbern.com/2015/10/28/interview-with-a-data-scientist-erik-bernhardsson.html
+https://erikbern.com/2015/10/31/mcmc-for-marketing-data.html
+https://erikbern.com/2015/11/04/looking-for-smart-people.html
+https://erikbern.com/2015/11/12/installing-tensorflow-on-aws.html
+https://erikbern.com/2015/11/28/there-is-no-magic-trick.html
+https://erikbern.com/2015/12/05/more-mcmc-analyzing-a-small-dataset-with-1-5-ratings.html
+https://erikbern.com/2016/01/01/books-i-read-in-2015.html
+https://erikbern.com/2016/01/08/i-believe-in-the-10x-engineer-but.html
+https://erikbern.com/2016/01/21/analyzing-50k-fonts-using-deep-neural-networks.html
+https://erikbern.com/2016/01/25/some-more-font-links.html
+https://erikbern.com/2016/02/03/my-issue-with-gpu-accelerated-deep-learning.html
+https://erikbern.com/2016/03/02/iterate-or-die.html
+https://erikbern.com/2016/03/12/meta-blogging.html
+https://erikbern.com/2016/03/16/exploding-offers-are-bullshit.html
+https://erikbern.com/2016/04/04/nyc-subway-math.html
+https://erikbern.com/2016/04/18/why-organizations-fail.html
+https://erikbern.com/2016/04/26/dollar-cost-averaging.html
+https://erikbern.com/2016/05/24/what-is-your-motivation.html
+https://erikbern.com/2016/06/02/approximate-nearest-news.html
+https://erikbern.com/2016/07/09/waiting-time-math.html
+https://erikbern.com/2016/08/05/when-machine-learning-matters.html
+https://erikbern.com/2016/09/08/state-drift.html
+https://erikbern.com/2016/10/25/pareto-efficiency.html
+https://erikbern.com/2016/11/01/are-data-sets-the-new-server-rooms.html
+https://erikbern.com/2016/12/05/the-half-life-of-code.html
+https://erikbern.com/2017/01/10/functional-programming-is-the-libertarianism-of-sw-eng.html
+https://erikbern.com/2017/02/01/language-pitch.html
+https://erikbern.com/2017/02/17/why-i-went-into-the-mortgage-industry.html
+https://erikbern.com/2017/03/15/the-eigenvector-of-why-we-moved-from-language-x-to-language-y.html
+https://erikbern.com/2017/05/23/conversion-rates-you-are-most-likely-computing-them-wrong.html
+https://erikbern.com/2017/06/09/blogroll.html
+https://erikbern.com/2017/07/06/optimizing-for-iteration-speed.html
+https://erikbern.com/2017/07/12/the-most-twisted-coastline.html
+https://erikbern.com/2017/08/14/google-diversity-memo-global-warming-pascals-wager.html
+https://erikbern.com/2017/08/19/machine-platform-crowd.html
+https://erikbern.com/2017/08/29/the-software-engineering-rule-of-3.html
+https://erikbern.com/2017/09/06/the-number-of-letters-in-the-word-for-each-number.html
+https://erikbern.com/2017/09/26/on-the-equifax-breach-and-how-to-really-secure-prevent-theft.html
+https://erikbern.com/2017/10/30/why-conversion-matters-a-toy-model.html
+https://erikbern.com/2017/11/26/annoy-1.10-released-with-hamming-distance-and-windows-support.html
+https://erikbern.com/2017/12/12/learning-from-users-faster-using-machine-learning.html
+https://erikbern.com/2017/12/29/toxic-meeting-culture.html
+https://erikbern.com/2018/01/03/plotting-author-statistics-for-git-repos-using-git-of-theseus.html
+https://erikbern.com/2018/01/28/im-looking-for-data-engineers.html
+https://erikbern.com/2018/02/15/new-benchmarks-for-approximate-nearest-neighbors.html
+https://erikbern.com/2018/03/07/lessons-from-content-marketing-myself-aka-blogging-for-five-years.html
+https://erikbern.com/2018/03/27/waiting-time-load-factor-and-queueing-theory.html
+https://erikbern.com/2018/05/02/interviewing-is-a-noisy-prediction-problem.html
+https://erikbern.com/2018/06/04/missing-the-point-about-microservices.html
+https://erikbern.com/2018/06/17/new-approximate-nearest-neighbor-benchmarks.html
+https://erikbern.com/2018/08/16/business-secrets-from-terrible-people.html
+https://erikbern.com/2018/08/30/i-dont-want-to-learn-your-garbage-query-language.html
+https://erikbern.com/2018/10/08/the-hackers-guide-to-uncertainty-estimates.html
+https://erikbern.com/2019/01/10/data-architecture-vs-backend-architecture.html
+https://erikbern.com/2019/02/21/headcount-targets-feature-factories-and-when-to-hire-those-mythical-10x-people.html
+https://erikbern.com/2019/04/15/why-software-projects-take-longer-than-you-think-a-statistical-model.html
+https://erikbern.com/2019/08/05/modeling-conversion-rates-using-weibull-and-gamma-distributions.html
+https://erikbern.com/2019/09/26/misc-unsolicited-career-advice.html
+https://erikbern.com/2019/10/16/buffet-lines-are-terrible.html
+https://www.mrmoneymustache.com/?p=15027
+https://www.mrmoneymustache.com/?p=15111
+https://www.mrmoneymustache.com/?p=15150
+https://www.mrmoneymustache.com/?p=15208
+https://www.mrmoneymustache.com/?p=15268
+https://www.mrmoneymustache.com/?p=15350
+https://www.mrmoneymustache.com/?p=15144
+https://www.mrmoneymustache.com/?p=15431
+https://www.mrmoneymustache.com/?p=15482
+https://www.mrmoneymustache.com/?p=15513
+https://www.mrmoneymustache.com/?p=15530
+https://www.mrmoneymustache.com/?p=15562
+https://www.mrmoneymustache.com/?p=15545
+https://www.mrmoneymustache.com/?p=15680
+https://www.mrmoneymustache.com/?p=15724
+https://www.mrmoneymustache.com/?p=15827
+PubMed:31748403
+http://xpenguin.club/Stadia-Special/
+https://standardebooks.org/ebooks/andre-norton/star-born
+https://standardebooks.org/ebooks/george-eliot/middlemarch
+https://www.jpsmjournal.com/article/S0885-3924(19)30665-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30667-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30668-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30669-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30671-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30670-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30672-4/fulltext?rss=yes
+https://aiweirdness.com/post/189313008792
+yt:video:ACeQjDPOdDY
+https://standardebooks.org/ebooks/anna-sewell/black-beauty
+https://standardebooks.org/ebooks/angela-brazil/a-popular-schoolgirl
+yt:video:GUQx72j9Q3Y
+yt:video:mH1GGI2Jpbs
+https://www.jpsmjournal.com/article/S0885-3924(19)30673-6/fulltext?rss=yes
+http://xpenguin.club/XPengIN-Linux,-Lutris,-Epic-and-Stadia-(Also-some-VPN-talk)/
+https://standardebooks.org/ebooks/anonymous/beowulf/john-lesslie-hall
+http://www.fast.ai/2019/12/02/nbdev
+yt:video:mxA9Gyyu6Rg
+yt:video:50p0Ao06cD0
+yt:video:82NBMvx6vFY
+yt:video:hMSByvFHOro
+https://lukesmith.xyz/2019.html#im-back-6-new-videos-out-and-more-coming
+https://www.jpsmjournal.com/article/S0885-3924(19)30674-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30675-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30676-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30678-5/fulltext?rss=yes
+yt:video:3NJIj47Tusw
+yt:video:4bezl5gXAcg
+https://medium.com/p/108c569e56c1
+https://lukesmith.xyz/2019.html#two-more-videos-and-important-larbs-problem
+https://standardebooks.org/ebooks/m-e-braddon/lady-audleys-secret
+https://aiweirdness.com/post/189511103367
+https://standardebooks.org/ebooks/john-muir/my-first-summer-in-the-sierra
+https://emptysqua.re/blog/pygotham-2019-speaker-coaching-recap/
+https://lukesmith.xyz/2019.html#im-thinking-about-using-bspwm
+http://xpenguin.club/BOOTLEGpenguin/
+https://standardebooks.org/ebooks/alexandre-dumas/the-three-musketeers/william-robson
+yt:video:VBNTAtpf_d4
+yt:video:_hNMfVIsyIc
+https://www.jpsmjournal.com/article/S0885-3924(19)30679-7/fulltext?rss=yes
+https://medium.com/p/f06efa6355fd
+https://medium.com/p/52c88557230d
+https://medium.com/p/90bcb80890ba
+https://standardebooks.org/ebooks/aldous-huxley/antic-hay
+https://standardebooks.org/ebooks/ella-cheever-thayer/wired-love
+https://standardebooks.org/ebooks/samuel-butler/the-way-of-all-flesh
+yt:video:wIJL-UoDGyk
+https://www.jpsmjournal.com/article/S0885-3924(19)30666-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30705-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30707-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30708-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30709-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30710-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30713-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30714-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30715-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30677-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30711-0/fulltext?rss=yes
+https://medium.com/p/f338d64ba821
+https://jvns.ca/blog/how-tracking-pixels-work/
+https://jvns.ca/blog/2019/12/26/whats-a-server/
+https://emptysqua.re/blog/when-the-buddha-met-a-murderer/
+https://standardebooks.org/ebooks/poul-anderson/short-fiction
+https://standardebooks.org/ebooks/charles-dickens/great-expectations
+https://www.jpsmjournal.com/article/S0885-3924(19)30680-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30706-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31056-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31058-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31061-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31062-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31063-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30602-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30601-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30712-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31059-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31060-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31064-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31066-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31065-6/fulltext?rss=yes
+https://medium.com/p/85098baed98
+https://medium.com/p/15f12c609e6a
+https://medium.com/p/843fcddbc1bf
+https://www.calnewport.com/?p=7443
+https://lukesmith.xyz/2019.html#merry-christmas-to-all-and-a-vid-from-the-archives
+https://www.jpsmjournal.com/article/S0885-3924(19)31076-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31077-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31078-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31079-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31080-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31081-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31084-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31086-3/fulltext?rss=yes
+https://www.mrmoneymustache.com/?p=15923
+https://standardebooks.org/ebooks/h-g-wells/tono-bungay
+https://www.jpsmjournal.com/article/S0885-3924(19)31085-1/fulltext?rss=yes
+https://jvns.ca/blog/2019-year-in-review/
+http://xpenguin.club/Valentines-day-special/
+http://xpenguin.club/The-End/
+https://www.jpsmjournal.com/article/S0885-3924(19)30682-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30683-9/fulltext?rss=yes
+https://medium.com/p/38d8e83deaf9
+https://medium.com/p/7773555400d8
+https://www.calnewport.com/?p=7447
+https://aiweirdness.com/post/189845472982
+https://aiweirdness.com/post/189979379637
+https://machinelearningmastery.com/?p=9861
+https://machinelearningmastery.com/?p=9289
+https://medium.com/p/9dc8d64c1a89
+https://medium.com/p/30769eec5df0
+yt:video:X9cBFNbihFU
+https://lukesmith.xyz/2019.html#new-video-on-new-books
+https://jvns.ca/blog/2020/01/05/paperwm/
+PubMed:31904799
+http://www.fast.ai/2020/01/07/data-questionnaire
+https://www.jpsmjournal.com/article/S0885-3924(19)31057-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31083-8/fulltext?rss=yes
+https://statmodeling.stat.columbia.edu/?p=41918
+https://statmodeling.stat.columbia.edu/?p=42783
+https://statmodeling.stat.columbia.edu/?p=41671
+https://statmodeling.stat.columbia.edu/?p=42788
+https://statmodeling.stat.columbia.edu/?p=42787
+https://statmodeling.stat.columbia.edu/?p=42792
+https://statmodeling.stat.columbia.edu/?p=41957
+https://statmodeling.stat.columbia.edu/?p=42657
+http://statmodeling.stat.columbia.edu/?p=40171
+https://statmodeling.stat.columbia.edu/?p=42817
+https://statmodeling.stat.columbia.edu/?p=42808
+https://statmodeling.stat.columbia.edu/?p=42835
+https://statmodeling.stat.columbia.edu/?p=42837
+https://statmodeling.stat.columbia.edu/?p=42842
+https://statmodeling.stat.columbia.edu/?p=42844
+https://statmodeling.stat.columbia.edu/?p=42848
+https://statmodeling.stat.columbia.edu/?p=42856
+https://statmodeling.stat.columbia.edu/?p=42016
+https://statmodeling.stat.columbia.edu/?p=42018
+http://statmodeling.stat.columbia.edu/?p=40183
+https://statmodeling.stat.columbia.edu/?p=41285
+https://statmodeling.stat.columbia.edu/?p=42870
+https://statmodeling.stat.columbia.edu/?p=42025
+https://statmodeling.stat.columbia.edu/?p=42041
+https://statmodeling.stat.columbia.edu/?p=42888
+http://xpenguin.club/HexShards-Tape1/
+https://www.jpsmjournal.com/article/S0885-3924(20)30001-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30002-6/fulltext?rss=yes
+https://aiweirdness.com/post/190160884937
+https://statmodeling.stat.columbia.edu/?p=42907
+http://www.fast.ai/2020/01/13/self_supervised
+https://medium.com/p/3a93573d4f07
+https://statmodeling.stat.columbia.edu/?p=42926
+https://statmodeling.stat.columbia.edu/?p=42051
+https://www.jpsmjournal.com/article/S0885-3924(20)30003-8/fulltext?rss=yes
+https://distill.pub/2020/attribution-baselines
+https://statmodeling.stat.columbia.edu/?p=42936
+http://www.fast.ai/2020/01/16/fast_template
+https://www.jpsmjournal.com/article/S0885-3924(19)31082-6/fulltext?rss=yes
+http://www.fast.ai/2020/01/18/gitblog
+http://www.fast.ai/2020/01/19/blog_screenshots
+https://aiweirdness.com/post/190313362077
+PubMed:31953887
+http://www.fast.ai/2020/01/20/nb2md
+http://www.fast.ai/2020/01/20/blog_overview
+yt:video:an0RFLzJ5Yo
+https://www.jpsmjournal.com/article/S0885-3924(20)30026-9/fulltext?rss=yes
+https://davebucklin.com/play/2020/01/19/expenses-ledger.html
+https://lukesmith.xyz/2019.html#newold-episode-of-not-related-out-every-scientific-paper-youve-read-is-wrong
+http://www.fast.ai/2020/01/21/responsible-government
+https://www.jpsmjournal.com/article/S0885-3924(20)30047-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30048-8/fulltext?rss=yes
+yt:video:6YfRgI0xrfI
+https://www.jpsmjournal.com/article/S0885-3924(19)30717-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30718-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30719-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30720-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30721-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30722-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30723-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30724-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30725-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30726-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30727-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30728-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30729-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30730-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30731-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30732-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30733-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30734-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30735-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30736-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30737-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30740-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30741-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30742-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30743-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30745-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30746-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30747-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30748-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30749-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30750-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30751-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30752-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30753-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30754-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30755-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30756-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30757-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30758-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30759-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30760-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30761-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30762-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30763-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30764-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30765-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30766-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30767-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30768-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30769-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30770-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30771-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30772-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30773-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30774-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30775-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30776-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30777-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30778-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30779-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30780-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30781-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30782-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30783-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30784-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30785-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30786-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30787-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30788-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30789-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30790-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30791-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30792-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30793-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30794-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30795-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30796-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30797-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30798-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30799-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30800-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30801-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30802-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30803-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30804-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30805-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30806-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30807-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30808-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30809-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30810-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30812-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30813-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30814-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30815-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30816-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30817-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30818-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30819-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30820-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30821-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30822-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30823-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30824-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30825-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30826-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30827-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30828-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30829-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30830-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30831-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30832-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30833-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30834-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30835-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30836-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30837-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30838-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30839-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30840-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30841-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30842-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30843-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30844-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30845-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30846-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30847-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30848-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30849-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30850-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30851-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30852-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30853-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30854-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30855-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30856-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30857-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30858-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30859-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30860-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30861-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30862-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30863-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30864-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30865-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30866-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30867-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30868-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30869-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30870-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30871-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30872-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30873-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30874-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30875-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30876-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30877-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30878-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30879-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30880-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30881-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30882-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30883-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30884-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30885-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30886-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30887-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30888-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30889-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30890-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30891-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30892-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30893-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30894-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30895-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30896-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30897-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30899-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30900-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30901-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30902-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30903-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30904-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30905-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30906-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30907-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30908-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30909-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30910-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30911-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30912-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30913-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30915-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30916-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30917-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30918-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30919-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30920-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30921-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30922-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30923-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30924-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30925-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30926-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30927-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30928-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30929-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30930-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30931-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30932-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30933-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30934-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30935-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30936-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30937-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30938-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30939-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30940-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30941-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30942-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30943-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30944-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30945-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30946-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30947-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30948-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30949-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30950-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30951-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30952-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30953-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30954-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30955-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30956-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30957-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30958-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30959-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30960-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30961-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30962-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30963-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30964-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30965-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30966-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30967-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30968-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30969-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30970-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30971-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30972-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30973-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30974-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30975-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30976-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30977-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30978-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30979-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30980-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30981-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30982-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30983-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30984-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30985-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30986-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30987-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30988-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30989-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30990-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30991-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30992-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30993-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30994-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30995-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30996-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30997-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30998-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)30999-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31000-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31001-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31002-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31003-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31004-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31005-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31006-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31007-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31008-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31009-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31010-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31011-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31012-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31013-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31014-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31015-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31016-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31017-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31018-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31019-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31020-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31021-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31022-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31023-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31024-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31025-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31026-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31027-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31028-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31029-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31030-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31031-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31032-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31033-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31034-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31035-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31036-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31037-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31038-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31039-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31040-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31041-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31042-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31043-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31044-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31045-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31046-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31047-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31048-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31049-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31050-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31051-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31052-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31053-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31054-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(19)31055-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30005-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30006-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30057-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30059-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30060-9/fulltext?rss=yes
+https://aiweirdness.com/post/190441069697
+yt:video:n7lYxXrzbjk
+https://www.calnewport.com/?p=7464
+https://www.mrmoneymustache.com/?p=15961
+blog/webmention-test
+blog/gear-we-took-to-new-zealand-part-3
+blog/gear-we-took-to-new-zealand-part-2
+blog/gear-we-took-to-new-zealand-final-part
+blog/styling-ordered-lists
+blog/ssl-on-your-local-nginx
+blog/beyond-tellerrand-and-indiewebcamp-2016
+http://www.rosipov.com/blog/desktop-notifications-from-chrome-secure-shell
+http://www.rosipov.com/blog/automating-octopress-publishing
+http://www.rosipov.com/blog/minimalist-phone-launcher
+https://www.jpsmjournal.com/article/S0885-3924(20)30061-0/fulltext?rss=yes
+https://standardebooks.org/ebooks/gaston-leroux/the-phantom-of-the-opera/alexander-teixeira-de-mattos
+PubMed:31987356
+https://standardebooks.org/ebooks/homer/the-iliad/william-cullen-bryant
+https://www.jpsmjournal.com/article/S0885-3924(20)30058-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30064-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30065-8/fulltext?rss=yes
+yt:video:f9qNXV01yzg
+https://www.jpsmjournal.com/article/S0885-3924(20)30062-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30063-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30066-X/fulltext?rss=yes
+PubMed:32003078
+yt:video:qRr1KRKVeh8
+https://aiweirdness.com/post/190569291992
+https://lukesmith.xyz/2019.html#big-fix-for-the-stsuckless-crashonemoji-error
+yt:video:2xl56IJGKwY
+yt:video:K3B8fIdixo0
+https://www.jpsmjournal.com/article/S0885-3924(20)30067-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30068-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30070-1/fulltext?rss=yes
+https://standardebooks.org/ebooks/homer/the-odyssey/william-cullen-bryant
+https://standardebooks.org/ebooks/john-w-campbell/islands-of-space
+http://lukeoakdenrayner.wordpress.com/?p=9082
+https://www.jpsmjournal.com/article/S0885-3924(20)30069-5/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30071-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30072-5/fulltext?rss=yes
+https://aiweirdness.com/post/190721709472
+https://standardebooks.org/ebooks/george-eliot/the-mill-on-the-floss
+https://www.jpsmjournal.com/article/S0885-3924(20)30073-7/fulltext?rss=yes
+https://jvns.ca/blog/compensation-questions/
+https://standardebooks.org/ebooks/anne-bronte/the-tenant-of-wildfell-hall
+https://standardebooks.org/ebooks/richmal-crompton/just-william
+https://standardebooks.org/ebooks/p-g-wodehouse/school-stories
+https://standardebooks.org/ebooks/william-shakespeare/much-ado-about-nothing
+https://standardebooks.org/ebooks/andre-norton/plague-ship
+https://standardebooks.org/ebooks/j-m-synge/the-playboy-of-the-western-world
+http://www.fast.ai/2020/02/09/CADE-big-picture
+http://www.fast.ai/2020/02/13/fastai-A-Layered-API-for-Deep-Learning
+http://www.fast.ai/2020/02/26/CADE-disinformation
+https://www.jpsmjournal.com/article/S0885-3924(20)30028-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30029-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30074-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30085-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30088-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30089-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30092-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30093-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30097-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30095-6/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30098-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30100-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30101-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30102-0/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30103-2/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30099-3/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30122-6/fulltext?rss=yes
+PubMed:32103158
+https://standardebooks.org/ebooks/laurence-sterne/the-life-and-opinions-of-tristram-shandy-gentleman
+https://olgabotvinnik.com/blog/hot-install-docker-container/
+https://aiweirdness.com/post/190825122292
+https://aiweirdness.com/post/611219307217797120
+https://lukesmith.xyz/2020.html#new-video-on-new-books
+https://lukesmith.xyz/2020.html#big-fix-for-the-stsuckless-crashonemoji-error
+https://standardebooks.org/ebooks/charles-dickens/oliver-twist
+https://www.jpsmjournal.com/article/S0885-3924(20)30121-4/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30123-8/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30124-X/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30125-1/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30126-3/fulltext?rss=yes
+https://aiweirdness.com/post/611853103688499200
+https://standardebooks.org/ebooks/herman-melville/short-fiction
+https://statmodeling.stat.columbia.edu/?p=43291
+https://www.jpsmjournal.com/article/S0885-3924(20)30128-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30129-9/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30131-7/fulltext?rss=yes
+https://www.jpsmjournal.com/article/S0885-3924(20)30132-9/fulltext?rss=yes
+https://www.calnewport.com/?p=7544
+https://www.jpsmjournal.com/article/S0885-3924(20)30134-2/fulltext?rss=yes
+yt:video:A6JXNZQwoYE
+https://jvns.ca/blog/2020/03/15/writing-shaders-with-signed-distance-functions/
+http://www.spoon-tamago.com/?p=47743
+http://www.spoon-tamago.com/?p=47758
+http://www.spoon-tamago.com/?p=47771
+http://www.spoon-tamago.com/?p=47794
+http://www.spoon-tamago.com/?p=47805
+http://www.spoon-tamago.com/?p=47817
+http://www.spoon-tamago.com/?p=47825
+http://www.spoon-tamago.com/?p=47840
+http://www.spoon-tamago.com/?p=47852
+http://thesheriffofsodium.com/?p=1581
+http://thesheriffofsodium.com/?p=1494
+http://thesheriffofsodium.com/?p=1486
+http://thesheriffofsodium.com/2020/01/13/how-is-the-three-digit-usmle-score-calculated/
+http://thesheriffofsodium.com/?p=1654
+http://thesheriffofsodium.com/?p=1565
+http://thesheriffofsodium.com/?p=1725
+http://thesheriffofsodium.com/?p=1886
+http://thesheriffofsodium.com/?p=1918
+http://thesheriffofsodium.com/2020/03/10/the-lecture-that-never-got-to-be/
+https://lukesmith.xyz/2020.html#font-gone-crazy-in-larbs
+yt:video:Q-Y5xqDkC50
+https://aiweirdness.com/post/614209593176899584
+https://lukesmith.xyz/2020.html#lincucks-fest-has-been-canceled
+https://aiweirdness.com/post/614935849124102144
+https://aiweirdness.com/post/615654447163621376
+yt:video:1mr3issv79s
+yt:video:Cu6VSf5aOaM
+https://medium.com/p/2178597ba921
diff --git a/newsboat/urls b/newsboat/urls
@@ -0,0 +1,41 @@
+# URLS for newsboat
+"query:Unread Articles:unread = \"yes\""
+https://sanctum.geek.nz/arabesque/feed/ "Tech" "Programming General"
+https://treyhunner.com/atom.xml "Python"
+https://inconsolation.wordpress.com/feed/ "Tech" "Command Line"
+https://olgabotvinnik.com/index.xml "Tech" "Biology"
+https://zachholman.com/atom "Tech"
+http://www.calnewport.com/blog/feed/ "Productivity" "Minimalism"
+https://www.youtube.com/feeds/videos.xml?channel_id=UC2eYFnH61tmytImy1mTYvhA "Tech" "Videos"
+https://lukesmith.xyz/rss.xml "Tech"
+http://www.fast.ai/atom.xml "ML"
+http://machinelearningmastery.com/blog/feed "ML"
+https://distill.pub/rss.xml "ML"
+https://erikbern.com/atom.xml "ML" "Tech"
+https://texblog.org/feed/ "TeX"
+http://aiweirdness.com/rss "ML"
+https://medium.com/feed/@williamkoehrsen "ML"
+https://medium.com/feed/@shiutangli "ML"
+https://medium.com/feed/@dipanzan.sarkar "ML"
+https://medium.com/feed/@citynorman "ML"
+https://lukeoakdenrayner.wordpress.com/feed/ "ML" "Medicine"
+https://eutils.ncbi.nlm.nih.gov/entrez/eutils/erss.cgi?rss_guid=1DoqKB8O4L1HKJ03CSM3_u9Nso2Mh3EAW0p2xKsNDP4weQmg5- "ML" "Medicine" # Isaac Kohane
+https://eutils.ncbi.nlm.nih.gov/entrez/eutils/erss.cgi?rss_guid=1h3SAs98aPqmd6Vfxn_uiAWup_3lYctL4aAFP-Y7Eg8Pn6DEFA "ML" "Medicine" # Andrew Beam
+https://eutils.ncbi.nlm.nih.gov/entrez/eutils/erss.cgi?rss_guid=1LYeLHGBis0h-Lsf3JolAU4vKQfag0FIfccYEuHHw588IEaouQ "ML" "Medicine" # Luke Oakden-Rayner
+https://eutils.ncbi.nlm.nih.gov/entrez/eutils/erss.cgi?rss_guid=1z_pxc-9fhPUGO3O_yTKHOiZnSIaAVzVxhd2tmq3tMYy6gxEhK "ML" "Medicine" # Scott Lundberg
+http://xpenguin.club/rss.xml "Tech"
+https://fharrell.com/post/index.xml "Statistics" "Medicine"
+https://davebucklin.com/feed.xml "Tech" "Gopher"
+http://feeds.feedburner.com/MrMoneyMustache "Finance"
+# https://www.jpsmjournal.com/current.rss "Medicine" "Palliative Care"
+https://beauhilton.com/feed.xml
+https://standardebooks.org/rss/new-releases "Literature"
+https://emptysqua.re/blog/index.xml "Tech" "Programming" "Buddhism"
+https://jvns.ca/atom.xml "Tech" "Teaching"
+https://tastetesterdoc.com/feed "Medicine" "Friends"
+https://statmodeling.stat.columbia.edu/feed/ "Stats" "Causal Inference"
+https://webgefrickel.de/blog/feed "Tech"
+https://www.rosipov.com/atom.xml "Tech"
+http://www.spoon-tamago.com/feed/ "Culture" "Japan"
+http://www.thesheriffofsodium.com/feed/ "medical education"
+# mutt gmail kjdfpopyuilrhqpe
diff --git a/notmuch-config b/notmuch-config
@@ -0,0 +1,14 @@
+[database]
+path=/home/beau/.local/share/mail
+[user]
+name=C. Beau Hilton
+primary_email=cbeauhilton@gmail.com
+[new]
+tags=unread;inbox;
+ignore=
+[search]
+exclude_tags=deleted;spam;
+[maildir]
+synchronize_flags=true
+[crypto]
+gpg_path=gpg
diff --git a/npm/npmrc b/npm/npmrc
@@ -0,0 +1,4 @@
+prefix=${XDG_DATA_HOME}/npm
+cache=${XDG_CACHE_HOME}/npm
+tmp=${XDG_RUNTIME_DIR}/npm
+init-module=${XDG_CONFIG_HOME}/npm/config/npm-init.js
diff --git a/nvim/.netrwhist b/nvim/.netrwhist
@@ -0,0 +1,3 @@
+let g:netrw_dirhistmax =10
+let g:netrw_dirhistcnt =1
+let g:netrw_dirhist_1='/home/beau/.config/fontconfig'
diff --git a/nvim/autoload/plug.vim b/nvim/autoload/plug.vim
@@ -0,0 +1,2597 @@
+" vim-plug: Vim plugin manager
+" ============================
+"
+" Download plug.vim and put it in ~/.vim/autoload
+"
+" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
+" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
+"
+" Edit your .vimrc
+"
+" call plug#begin('~/.vim/plugged')
+"
+" " Make sure you use single quotes
+"
+" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
+" Plug 'junegunn/vim-easy-align'
+"
+" " Any valid git URL is allowed
+" Plug 'https://github.com/junegunn/vim-github-dashboard.git'
+"
+" " Multiple Plug commands can be written in a single line using | separators
+" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
+"
+" " On-demand loading
+" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
+" Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
+"
+" " Using a non-master branch
+" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
+"
+" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
+" Plug 'fatih/vim-go', { 'tag': '*' }
+"
+" " Plugin options
+" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
+"
+" " Plugin outside ~/.vim/plugged with post-update hook
+" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
+"
+" " Unmanaged plugin (manually installed and updated)
+" Plug '~/my-prototype-plugin'
+"
+" " Initialize plugin system
+" call plug#end()
+"
+" Then reload .vimrc and :PlugInstall to install plugins.
+"
+" Plug options:
+"
+"| Option | Description |
+"| ----------------------- | ------------------------------------------------ |
+"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use |
+"| `rtp` | Subdirectory that contains Vim plugin |
+"| `dir` | Custom directory for the plugin |
+"| `as` | Use different name for the plugin |
+"| `do` | Post-update hook (string or funcref) |
+"| `on` | On-demand loading: Commands or `<Plug>`-mappings |
+"| `for` | On-demand loading: File types |
+"| `frozen` | Do not update unless explicitly specified |
+"
+" More information: https://github.com/junegunn/vim-plug
+"
+"
+" Copyright (c) 2017 Junegunn Choi
+"
+" MIT License
+"
+" Permission is hereby granted, free of charge, to any person obtaining
+" a copy of this software and associated documentation files (the
+" "Software"), to deal in the Software without restriction, including
+" without limitation the rights to use, copy, modify, merge, publish,
+" distribute, sublicense, and/or sell copies of the Software, and to
+" permit persons to whom the Software is furnished to do so, subject to
+" the following conditions:
+"
+" The above copyright notice and this permission notice shall be
+" included in all copies or substantial portions of the Software.
+"
+" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+if exists('g:loaded_plug')
+ finish
+endif
+let g:loaded_plug = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let s:plug_src = 'https://github.com/junegunn/vim-plug.git'
+let s:plug_tab = get(s:, 'plug_tab', -1)
+let s:plug_buf = get(s:, 'plug_buf', -1)
+let s:mac_gui = has('gui_macvim') && has('gui_running')
+let s:is_win = has('win32')
+let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win)
+let s:vim8 = has('patch-8.0.0039') && exists('*job_start')
+if s:is_win && &shellslash
+ set noshellslash
+ let s:me = resolve(expand('<sfile>:p'))
+ set shellslash
+else
+ let s:me = resolve(expand('<sfile>:p'))
+endif
+let s:base_spec = { 'branch': 'master', 'frozen': 0 }
+let s:TYPE = {
+\ 'string': type(''),
+\ 'list': type([]),
+\ 'dict': type({}),
+\ 'funcref': type(function('call'))
+\ }
+let s:loaded = get(s:, 'loaded', {})
+let s:triggers = get(s:, 'triggers', {})
+
+if s:is_win
+ function! s:plug_call(fn, ...)
+ let shellslash = &shellslash
+ try
+ set noshellslash
+ return call(a:fn, a:000)
+ finally
+ let &shellslash = shellslash
+ endtry
+ endfunction
+else
+ function! s:plug_call(fn, ...)
+ return call(a:fn, a:000)
+ endfunction
+endif
+
+function! s:plug_getcwd()
+ return s:plug_call('getcwd')
+endfunction
+
+function! s:plug_fnamemodify(fname, mods)
+ return s:plug_call('fnamemodify', a:fname, a:mods)
+endfunction
+
+function! s:plug_expand(fmt)
+ return s:plug_call('expand', a:fmt, 1)
+endfunction
+
+function! s:plug_tempname()
+ return s:plug_call('tempname')
+endfunction
+
+function! plug#begin(...)
+ if a:0 > 0
+ let s:plug_home_org = a:1
+ let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p'))
+ elseif exists('g:plug_home')
+ let home = s:path(g:plug_home)
+ elseif !empty(&rtp)
+ let home = s:path(split(&rtp, ',')[0]) . '/plugged'
+ else
+ return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.')
+ endif
+ if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp
+ return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.')
+ endif
+
+ let g:plug_home = home
+ let g:plugs = {}
+ let g:plugs_order = []
+ let s:triggers = {}
+
+ call s:define_commands()
+ return 1
+endfunction
+
+function! s:define_commands()
+ command! -nargs=+ -bar Plug call plug#(<args>)
+ if !executable('git')
+ return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.')
+ endif
+ if has('win32')
+ \ && &shellslash
+ \ && (&shell =~# 'cmd\.exe' || &shell =~# 'powershell\.exe')
+ return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.')
+ endif
+ if !has('nvim')
+ \ && (has('win32') || has('win32unix'))
+ \ && !has('multi_byte')
+ return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.')
+ endif
+ command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>])
+ command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>])
+ command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0)
+ command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif
+ command! -nargs=0 -bar PlugStatus call s:status()
+ command! -nargs=0 -bar PlugDiff call s:diff()
+ command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(<bang>0, <f-args>)
+endfunction
+
+function! s:to_a(v)
+ return type(a:v) == s:TYPE.list ? a:v : [a:v]
+endfunction
+
+function! s:to_s(v)
+ return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n"
+endfunction
+
+function! s:glob(from, pattern)
+ return s:lines(globpath(a:from, a:pattern))
+endfunction
+
+function! s:source(from, ...)
+ let found = 0
+ for pattern in a:000
+ for vim in s:glob(a:from, pattern)
+ execute 'source' s:esc(vim)
+ let found = 1
+ endfor
+ endfor
+ return found
+endfunction
+
+function! s:assoc(dict, key, val)
+ let a:dict[a:key] = add(get(a:dict, a:key, []), a:val)
+endfunction
+
+function! s:ask(message, ...)
+ call inputsave()
+ echohl WarningMsg
+ let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) '))
+ echohl None
+ call inputrestore()
+ echo "\r"
+ return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0
+endfunction
+
+function! s:ask_no_interrupt(...)
+ try
+ return call('s:ask', a:000)
+ catch
+ return 0
+ endtry
+endfunction
+
+function! s:lazy(plug, opt)
+ return has_key(a:plug, a:opt) &&
+ \ (empty(s:to_a(a:plug[a:opt])) ||
+ \ !isdirectory(a:plug.dir) ||
+ \ len(s:glob(s:rtp(a:plug), 'plugin')) ||
+ \ len(s:glob(s:rtp(a:plug), 'after/plugin')))
+endfunction
+
+function! plug#end()
+ if !exists('g:plugs')
+ return s:err('Call plug#begin() first')
+ endif
+
+ if exists('#PlugLOD')
+ augroup PlugLOD
+ autocmd!
+ augroup END
+ augroup! PlugLOD
+ endif
+ let lod = { 'ft': {}, 'map': {}, 'cmd': {} }
+
+ if exists('g:did_load_filetypes')
+ filetype off
+ endif
+ for name in g:plugs_order
+ if !has_key(g:plugs, name)
+ continue
+ endif
+ let plug = g:plugs[name]
+ if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for')
+ let s:loaded[name] = 1
+ continue
+ endif
+
+ if has_key(plug, 'on')
+ let s:triggers[name] = { 'map': [], 'cmd': [] }
+ for cmd in s:to_a(plug.on)
+ if cmd =~? '^<Plug>.\+'
+ if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i'))
+ call s:assoc(lod.map, cmd, name)
+ endif
+ call add(s:triggers[name].map, cmd)
+ elseif cmd =~# '^[A-Z]'
+ let cmd = substitute(cmd, '!*$', '', '')
+ if exists(':'.cmd) != 2
+ call s:assoc(lod.cmd, cmd, name)
+ endif
+ call add(s:triggers[name].cmd, cmd)
+ else
+ call s:err('Invalid `on` option: '.cmd.
+ \ '. Should start with an uppercase letter or `<Plug>`.')
+ endif
+ endfor
+ endif
+
+ if has_key(plug, 'for')
+ let types = s:to_a(plug.for)
+ if !empty(types)
+ augroup filetypedetect
+ call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim')
+ augroup END
+ endif
+ for type in types
+ call s:assoc(lod.ft, type, name)
+ endfor
+ endif
+ endfor
+
+ for [cmd, names] in items(lod.cmd)
+ execute printf(
+ \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)',
+ \ cmd, string(cmd), string(names))
+ endfor
+
+ for [map, names] in items(lod.map)
+ for [mode, map_prefix, key_prefix] in
+ \ [['i', '<C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
+ execute printf(
+ \ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>',
+ \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix)
+ endfor
+ endfor
+
+ for [ft, names] in items(lod.ft)
+ augroup PlugLOD
+ execute printf('autocmd FileType %s call <SID>lod_ft(%s, %s)',
+ \ ft, string(ft), string(names))
+ augroup END
+ endfor
+
+ call s:reorg_rtp()
+ filetype plugin indent on
+ if has('vim_starting')
+ if has('syntax') && !exists('g:syntax_on')
+ syntax enable
+ end
+ else
+ call s:reload_plugins()
+ endif
+endfunction
+
+function! s:loaded_names()
+ return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)')
+endfunction
+
+function! s:load_plugin(spec)
+ call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim')
+endfunction
+
+function! s:reload_plugins()
+ for name in s:loaded_names()
+ call s:load_plugin(g:plugs[name])
+ endfor
+endfunction
+
+function! s:trim(str)
+ return substitute(a:str, '[\/]\+$', '', '')
+endfunction
+
+function! s:version_requirement(val, min)
+ for idx in range(0, len(a:min) - 1)
+ let v = get(a:val, idx, 0)
+ if v < a:min[idx] | return 0
+ elseif v > a:min[idx] | return 1
+ endif
+ endfor
+ return 1
+endfunction
+
+function! s:git_version_requirement(...)
+ if !exists('s:git_version')
+ let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)')
+ endif
+ return s:version_requirement(s:git_version, a:000)
+endfunction
+
+function! s:progress_opt(base)
+ return a:base && !s:is_win &&
+ \ s:git_version_requirement(1, 7, 1) ? '--progress' : ''
+endfunction
+
+function! s:rtp(spec)
+ return s:path(a:spec.dir . get(a:spec, 'rtp', ''))
+endfunction
+
+if s:is_win
+ function! s:path(path)
+ return s:trim(substitute(a:path, '/', '\', 'g'))
+ endfunction
+
+ function! s:dirpath(path)
+ return s:path(a:path) . '\'
+ endfunction
+
+ function! s:is_local_plug(repo)
+ return a:repo =~? '^[a-z]:\|^[%~]'
+ endfunction
+
+ " Copied from fzf
+ function! s:wrap_cmds(cmds)
+ let cmds = [
+ \ '@echo off',
+ \ 'setlocal enabledelayedexpansion']
+ \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds])
+ \ + ['endlocal']
+ if has('iconv')
+ if !exists('s:codepage')
+ let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0)
+ endif
+ return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage))
+ endif
+ return map(cmds, 'v:val."\r"')
+ endfunction
+
+ function! s:batchfile(cmd)
+ let batchfile = s:plug_tempname().'.bat'
+ call writefile(s:wrap_cmds(a:cmd), batchfile)
+ let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0})
+ if &shell =~# 'powershell\.exe'
+ let cmd = '& ' . cmd
+ endif
+ return [batchfile, cmd]
+ endfunction
+else
+ function! s:path(path)
+ return s:trim(a:path)
+ endfunction
+
+ function! s:dirpath(path)
+ return substitute(a:path, '[/\\]*$', '/', '')
+ endfunction
+
+ function! s:is_local_plug(repo)
+ return a:repo[0] =~ '[/$~]'
+ endfunction
+endif
+
+function! s:err(msg)
+ echohl ErrorMsg
+ echom '[vim-plug] '.a:msg
+ echohl None
+endfunction
+
+function! s:warn(cmd, msg)
+ echohl WarningMsg
+ execute a:cmd 'a:msg'
+ echohl None
+endfunction
+
+function! s:esc(path)
+ return escape(a:path, ' ')
+endfunction
+
+function! s:escrtp(path)
+ return escape(a:path, ' ,')
+endfunction
+
+function! s:remove_rtp()
+ for name in s:loaded_names()
+ let rtp = s:rtp(g:plugs[name])
+ execute 'set rtp-='.s:escrtp(rtp)
+ let after = globpath(rtp, 'after')
+ if isdirectory(after)
+ execute 'set rtp-='.s:escrtp(after)
+ endif
+ endfor
+endfunction
+
+function! s:reorg_rtp()
+ if !empty(s:first_rtp)
+ execute 'set rtp-='.s:first_rtp
+ execute 'set rtp-='.s:last_rtp
+ endif
+
+ " &rtp is modified from outside
+ if exists('s:prtp') && s:prtp !=# &rtp
+ call s:remove_rtp()
+ unlet! s:middle
+ endif
+
+ let s:middle = get(s:, 'middle', &rtp)
+ let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])')
+ let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)')
+ let rtp = join(map(rtps, 'escape(v:val, ",")'), ',')
+ \ . ','.s:middle.','
+ \ . join(map(afters, 'escape(v:val, ",")'), ',')
+ let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g')
+ let s:prtp = &rtp
+
+ if !empty(s:first_rtp)
+ execute 'set rtp^='.s:first_rtp
+ execute 'set rtp+='.s:last_rtp
+ endif
+endfunction
+
+function! s:doautocmd(...)
+ if exists('#'.join(a:000, '#'))
+ execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '<nomodeline>' : '') join(a:000)
+ endif
+endfunction
+
+function! s:dobufread(names)
+ for name in a:names
+ let path = s:rtp(g:plugs[name])
+ for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin']
+ if len(finddir(dir, path))
+ if exists('#BufRead')
+ doautocmd BufRead
+ endif
+ return
+ endif
+ endfor
+ endfor
+endfunction
+
+function! plug#load(...)
+ if a:0 == 0
+ return s:err('Argument missing: plugin name(s) required')
+ endif
+ if !exists('g:plugs')
+ return s:err('plug#begin was not called')
+ endif
+ let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000
+ let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)')
+ if !empty(unknowns)
+ let s = len(unknowns) > 1 ? 's' : ''
+ return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', ')))
+ end
+ let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)')
+ if !empty(unloaded)
+ for name in unloaded
+ call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
+ endfor
+ call s:dobufread(unloaded)
+ return 1
+ end
+ return 0
+endfunction
+
+function! s:remove_triggers(name)
+ if !has_key(s:triggers, a:name)
+ return
+ endif
+ for cmd in s:triggers[a:name].cmd
+ execute 'silent! delc' cmd
+ endfor
+ for map in s:triggers[a:name].map
+ execute 'silent! unmap' map
+ execute 'silent! iunmap' map
+ endfor
+ call remove(s:triggers, a:name)
+endfunction
+
+function! s:lod(names, types, ...)
+ for name in a:names
+ call s:remove_triggers(name)
+ let s:loaded[name] = 1
+ endfor
+ call s:reorg_rtp()
+
+ for name in a:names
+ let rtp = s:rtp(g:plugs[name])
+ for dir in a:types
+ call s:source(rtp, dir.'/**/*.vim')
+ endfor
+ if a:0
+ if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2))
+ execute 'runtime' a:1
+ endif
+ call s:source(rtp, a:2)
+ endif
+ call s:doautocmd('User', name)
+ endfor
+endfunction
+
+function! s:lod_ft(pat, names)
+ let syn = 'syntax/'.a:pat.'.vim'
+ call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn)
+ execute 'autocmd! PlugLOD FileType' a:pat
+ call s:doautocmd('filetypeplugin', 'FileType')
+ call s:doautocmd('filetypeindent', 'FileType')
+endfunction
+
+function! s:lod_cmd(cmd, bang, l1, l2, args, names)
+ call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
+ call s:dobufread(a:names)
+ execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
+endfunction
+
+function! s:lod_map(map, names, with_prefix, prefix)
+ call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
+ call s:dobufread(a:names)
+ let extra = ''
+ while 1
+ let c = getchar(0)
+ if c == 0
+ break
+ endif
+ let extra .= nr2char(c)
+ endwhile
+
+ if a:with_prefix
+ let prefix = v:count ? v:count : ''
+ let prefix .= '"'.v:register.a:prefix
+ if mode(1) == 'no'
+ if v:operator == 'c'
+ let prefix = "\<esc>" . prefix
+ endif
+ let prefix .= v:operator
+ endif
+ call feedkeys(prefix, 'n')
+ endif
+ call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra)
+endfunction
+
+function! plug#(repo, ...)
+ if a:0 > 1
+ return s:err('Invalid number of arguments (1..2)')
+ endif
+
+ try
+ let repo = s:trim(a:repo)
+ let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec
+ let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??'))
+ let spec = extend(s:infer_properties(name, repo), opts)
+ if !has_key(g:plugs, name)
+ call add(g:plugs_order, name)
+ endif
+ let g:plugs[name] = spec
+ let s:loaded[name] = get(s:loaded, name, 0)
+ catch
+ return s:err(v:exception)
+ endtry
+endfunction
+
+function! s:parse_options(arg)
+ let opts = copy(s:base_spec)
+ let type = type(a:arg)
+ if type == s:TYPE.string
+ let opts.tag = a:arg
+ elseif type == s:TYPE.dict
+ call extend(opts, a:arg)
+ if has_key(opts, 'dir')
+ let opts.dir = s:dirpath(s:plug_expand(opts.dir))
+ endif
+ else
+ throw 'Invalid argument type (expected: string or dictionary)'
+ endif
+ return opts
+endfunction
+
+function! s:infer_properties(name, repo)
+ let repo = a:repo
+ if s:is_local_plug(repo)
+ return { 'dir': s:dirpath(s:plug_expand(repo)) }
+ else
+ if repo =~ ':'
+ let uri = repo
+ else
+ if repo !~ '/'
+ throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo)
+ endif
+ let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git')
+ let uri = printf(fmt, repo)
+ endif
+ return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri }
+ endif
+endfunction
+
+function! s:install(force, names)
+ call s:update_impl(0, a:force, a:names)
+endfunction
+
+function! s:update(force, names)
+ call s:update_impl(1, a:force, a:names)
+endfunction
+
+function! plug#helptags()
+ if !exists('g:plugs')
+ return s:err('plug#begin was not called')
+ endif
+ for spec in values(g:plugs)
+ let docd = join([s:rtp(spec), 'doc'], '/')
+ if isdirectory(docd)
+ silent! execute 'helptags' s:esc(docd)
+ endif
+ endfor
+ return 1
+endfunction
+
+function! s:syntax()
+ syntax clear
+ syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber
+ syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX
+ syn match plugNumber /[0-9]\+[0-9.]*/ contained
+ syn match plugBracket /[[\]]/ contained
+ syn match plugX /x/ contained
+ syn match plugDash /^-/
+ syn match plugPlus /^+/
+ syn match plugStar /^*/
+ syn match plugMessage /\(^- \)\@<=.*/
+ syn match plugName /\(^- \)\@<=[^ ]*:/
+ syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/
+ syn match plugTag /(tag: [^)]\+)/
+ syn match plugInstall /\(^+ \)\@<=[^:]*/
+ syn match plugUpdate /\(^* \)\@<=[^:]*/
+ syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag
+ syn match plugEdge /^ \X\+$/
+ syn match plugEdge /^ \X*/ contained nextgroup=plugSha
+ syn match plugSha /[0-9a-f]\{7,9}/ contained
+ syn match plugRelDate /([^)]*)$/ contained
+ syn match plugNotLoaded /(not loaded)$/
+ syn match plugError /^x.*/
+ syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/
+ syn match plugH2 /^.*:\n-\+$/
+ syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
+ hi def link plug1 Title
+ hi def link plug2 Repeat
+ hi def link plugH2 Type
+ hi def link plugX Exception
+ hi def link plugBracket Structure
+ hi def link plugNumber Number
+
+ hi def link plugDash Special
+ hi def link plugPlus Constant
+ hi def link plugStar Boolean
+
+ hi def link plugMessage Function
+ hi def link plugName Label
+ hi def link plugInstall Function
+ hi def link plugUpdate Type
+
+ hi def link plugError Error
+ hi def link plugDeleted Ignore
+ hi def link plugRelDate Comment
+ hi def link plugEdge PreProc
+ hi def link plugSha Identifier
+ hi def link plugTag Constant
+
+ hi def link plugNotLoaded Comment
+endfunction
+
+function! s:lpad(str, len)
+ return a:str . repeat(' ', a:len - len(a:str))
+endfunction
+
+function! s:lines(msg)
+ return split(a:msg, "[\r\n]")
+endfunction
+
+function! s:lastline(msg)
+ return get(s:lines(a:msg), -1, '')
+endfunction
+
+function! s:new_window()
+ execute get(g:, 'plug_window', 'vertical topleft new')
+endfunction
+
+function! s:plug_window_exists()
+ let buflist = tabpagebuflist(s:plug_tab)
+ return !empty(buflist) && index(buflist, s:plug_buf) >= 0
+endfunction
+
+function! s:switch_in()
+ if !s:plug_window_exists()
+ return 0
+ endif
+
+ if winbufnr(0) != s:plug_buf
+ let s:pos = [tabpagenr(), winnr(), winsaveview()]
+ execute 'normal!' s:plug_tab.'gt'
+ let winnr = bufwinnr(s:plug_buf)
+ execute winnr.'wincmd w'
+ call add(s:pos, winsaveview())
+ else
+ let s:pos = [winsaveview()]
+ endif
+
+ setlocal modifiable
+ return 1
+endfunction
+
+function! s:switch_out(...)
+ call winrestview(s:pos[-1])
+ setlocal nomodifiable
+ if a:0 > 0
+ execute a:1
+ endif
+
+ if len(s:pos) > 1
+ execute 'normal!' s:pos[0].'gt'
+ execute s:pos[1] 'wincmd w'
+ call winrestview(s:pos[2])
+ endif
+endfunction
+
+function! s:finish_bindings()
+ nnoremap <silent> <buffer> R :call <SID>retry()<cr>
+ nnoremap <silent> <buffer> D :PlugDiff<cr>
+ nnoremap <silent> <buffer> S :PlugStatus<cr>
+ nnoremap <silent> <buffer> U :call <SID>status_update()<cr>
+ xnoremap <silent> <buffer> U :call <SID>status_update()<cr>
+ nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr>
+ nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr>
+endfunction
+
+function! s:prepare(...)
+ if empty(s:plug_getcwd())
+ throw 'Invalid current working directory. Cannot proceed.'
+ endif
+
+ for evar in ['$GIT_DIR', '$GIT_WORK_TREE']
+ if exists(evar)
+ throw evar.' detected. Cannot proceed.'
+ endif
+ endfor
+
+ call s:job_abort()
+ if s:switch_in()
+ if b:plug_preview == 1
+ pc
+ endif
+ enew
+ else
+ call s:new_window()
+ endif
+
+ nnoremap <silent> <buffer> q :if b:plug_preview==1<bar>pc<bar>endif<bar>bd<cr>
+ if a:0 == 0
+ call s:finish_bindings()
+ endif
+ let b:plug_preview = -1
+ let s:plug_tab = tabpagenr()
+ let s:plug_buf = winbufnr(0)
+ call s:assign_name()
+
+ for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd']
+ execute 'silent! unmap <buffer>' k
+ endfor
+ setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell
+ if exists('+colorcolumn')
+ setlocal colorcolumn=
+ endif
+ setf vim-plug
+ if exists('g:syntax_on')
+ call s:syntax()
+ endif
+endfunction
+
+function! s:assign_name()
+ " Assign buffer name
+ let prefix = '[Plugins]'
+ let name = prefix
+ let idx = 2
+ while bufexists(name)
+ let name = printf('%s (%s)', prefix, idx)
+ let idx = idx + 1
+ endwhile
+ silent! execute 'f' fnameescape(name)
+endfunction
+
+function! s:chsh(swap)
+ let prev = [&shell, &shellcmdflag, &shellredir]
+ if !s:is_win && a:swap
+ set shell=sh shellredir=>%s\ 2>&1
+ endif
+ return prev
+endfunction
+
+function! s:bang(cmd, ...)
+ let batchfile = ''
+ try
+ let [sh, shellcmdflag, shrd] = s:chsh(a:0)
+ " FIXME: Escaping is incomplete. We could use shellescape with eval,
+ " but it won't work on Windows.
+ let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd
+ if s:is_win
+ let [batchfile, cmd] = s:batchfile(cmd)
+ endif
+ let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%')
+ execute "normal! :execute g:_plug_bang\<cr>\<cr>"
+ finally
+ unlet g:_plug_bang
+ let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
+ if s:is_win && filereadable(batchfile)
+ call delete(batchfile)
+ endif
+ endtry
+ return v:shell_error ? 'Exit status: ' . v:shell_error : ''
+endfunction
+
+function! s:regress_bar()
+ let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '')
+ call s:progress_bar(2, bar, len(bar))
+endfunction
+
+function! s:is_updated(dir)
+ return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir))
+endfunction
+
+function! s:do(pull, force, todo)
+ for [name, spec] in items(a:todo)
+ if !isdirectory(spec.dir)
+ continue
+ endif
+ let installed = has_key(s:update.new, name)
+ let updated = installed ? 0 :
+ \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir))
+ if a:force || installed || updated
+ execute 'cd' s:esc(spec.dir)
+ call append(3, '- Post-update hook for '. name .' ... ')
+ let error = ''
+ let type = type(spec.do)
+ if type == s:TYPE.string
+ if spec.do[0] == ':'
+ if !get(s:loaded, name, 0)
+ let s:loaded[name] = 1
+ call s:reorg_rtp()
+ endif
+ call s:load_plugin(spec)
+ try
+ execute spec.do[1:]
+ catch
+ let error = v:exception
+ endtry
+ if !s:plug_window_exists()
+ cd -
+ throw 'Warning: vim-plug was terminated by the post-update hook of '.name
+ endif
+ else
+ let error = s:bang(spec.do)
+ endif
+ elseif type == s:TYPE.funcref
+ try
+ let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged')
+ call spec.do({ 'name': name, 'status': status, 'force': a:force })
+ catch
+ let error = v:exception
+ endtry
+ else
+ let error = 'Invalid hook type'
+ endif
+ call s:switch_in()
+ call setline(4, empty(error) ? (getline(4) . 'OK')
+ \ : ('x' . getline(4)[1:] . error))
+ if !empty(error)
+ call add(s:update.errors, name)
+ call s:regress_bar()
+ endif
+ cd -
+ endif
+ endfor
+endfunction
+
+function! s:hash_match(a, b)
+ return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0
+endfunction
+
+function! s:checkout(spec)
+ let sha = a:spec.commit
+ let output = s:system('git rev-parse HEAD', a:spec.dir)
+ if !v:shell_error && !s:hash_match(sha, s:lines(output)[0])
+ let output = s:system(
+ \ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir)
+ endif
+ return output
+endfunction
+
+function! s:finish(pull)
+ let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen'))
+ if new_frozen
+ let s = new_frozen > 1 ? 's' : ''
+ call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s))
+ endif
+ call append(3, '- Finishing ... ') | 4
+ redraw
+ call plug#helptags()
+ call plug#end()
+ call setline(4, getline(4) . 'Done!')
+ redraw
+ let msgs = []
+ if !empty(s:update.errors)
+ call add(msgs, "Press 'R' to retry.")
+ endif
+ if a:pull && len(s:update.new) < len(filter(getline(5, '$'),
+ \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'"))
+ call add(msgs, "Press 'D' to see the updated changes.")
+ endif
+ echo join(msgs, ' ')
+ call s:finish_bindings()
+endfunction
+
+function! s:retry()
+ if empty(s:update.errors)
+ return
+ endif
+ echo
+ call s:update_impl(s:update.pull, s:update.force,
+ \ extend(copy(s:update.errors), [s:update.threads]))
+endfunction
+
+function! s:is_managed(name)
+ return has_key(g:plugs[a:name], 'uri')
+endfunction
+
+function! s:names(...)
+ return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)'))
+endfunction
+
+function! s:check_ruby()
+ silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'")
+ if !exists('g:plug_ruby')
+ redraw!
+ return s:warn('echom', 'Warning: Ruby interface is broken')
+ endif
+ let ruby_version = split(g:plug_ruby, '\.')
+ unlet g:plug_ruby
+ return s:version_requirement(ruby_version, [1, 8, 7])
+endfunction
+
+function! s:update_impl(pull, force, args) abort
+ let sync = index(a:args, '--sync') >= 0 || has('vim_starting')
+ let args = filter(copy(a:args), 'v:val != "--sync"')
+ let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
+ \ remove(args, -1) : get(g:, 'plug_threads', 16)
+
+ let managed = filter(copy(g:plugs), 's:is_managed(v:key)')
+ let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') :
+ \ filter(managed, 'index(args, v:key) >= 0')
+
+ if empty(todo)
+ return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install'))
+ endif
+
+ if !s:is_win && s:git_version_requirement(2, 3)
+ let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : ''
+ let $GIT_TERMINAL_PROMPT = 0
+ for plug in values(todo)
+ let plug.uri = substitute(plug.uri,
+ \ '^https://git::@github\.com', 'https://github.com', '')
+ endfor
+ endif
+
+ if !isdirectory(g:plug_home)
+ try
+ call mkdir(g:plug_home, 'p')
+ catch
+ return s:err(printf('Invalid plug directory: %s. '.
+ \ 'Try to call plug#begin with a valid directory', g:plug_home))
+ endtry
+ endif
+
+ if has('nvim') && !exists('*jobwait') && threads > 1
+ call s:warn('echom', '[vim-plug] Update Neovim for parallel installer')
+ endif
+
+ let use_job = s:nvim || s:vim8
+ let python = (has('python') || has('python3')) && !use_job
+ let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby()
+
+ let s:update = {
+ \ 'start': reltime(),
+ \ 'all': todo,
+ \ 'todo': copy(todo),
+ \ 'errors': [],
+ \ 'pull': a:pull,
+ \ 'force': a:force,
+ \ 'new': {},
+ \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1,
+ \ 'bar': '',
+ \ 'fin': 0
+ \ }
+
+ call s:prepare(1)
+ call append(0, ['', ''])
+ normal! 2G
+ silent! redraw
+
+ let s:clone_opt = get(g:, 'plug_shallow', 1) ?
+ \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : ''
+
+ if has('win32unix') || has('wsl')
+ let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input'
+ endif
+
+ let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : ''
+
+ " Python version requirement (>= 2.7)
+ if python && !has('python3') && !ruby && !use_job && s:update.threads > 1
+ redir => pyv
+ silent python import platform; print platform.python_version()
+ redir END
+ let python = s:version_requirement(
+ \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6])
+ endif
+
+ if (python || ruby) && s:update.threads > 1
+ try
+ let imd = &imd
+ if s:mac_gui
+ set noimd
+ endif
+ if ruby
+ call s:update_ruby()
+ else
+ call s:update_python()
+ endif
+ catch
+ let lines = getline(4, '$')
+ let printed = {}
+ silent! 4,$d _
+ for line in lines
+ let name = s:extract_name(line, '.', '')
+ if empty(name) || !has_key(printed, name)
+ call append('$', line)
+ if !empty(name)
+ let printed[name] = 1
+ if line[0] == 'x' && index(s:update.errors, name) < 0
+ call add(s:update.errors, name)
+ end
+ endif
+ endif
+ endfor
+ finally
+ let &imd = imd
+ call s:update_finish()
+ endtry
+ else
+ call s:update_vim()
+ while use_job && sync
+ sleep 100m
+ if s:update.fin
+ break
+ endif
+ endwhile
+ endif
+endfunction
+
+function! s:log4(name, msg)
+ call setline(4, printf('- %s (%s)', a:msg, a:name))
+ redraw
+endfunction
+
+function! s:update_finish()
+ if exists('s:git_terminal_prompt')
+ let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt
+ endif
+ if s:switch_in()
+ call append(3, '- Updating ...') | 4
+ for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))'))
+ let [pos, _] = s:logpos(name)
+ if !pos
+ continue
+ endif
+ if has_key(spec, 'commit')
+ call s:log4(name, 'Checking out '.spec.commit)
+ let out = s:checkout(spec)
+ elseif has_key(spec, 'tag')
+ let tag = spec.tag
+ if tag =~ '\*'
+ let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir))
+ if !v:shell_error && !empty(tags)
+ let tag = tags[0]
+ call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag))
+ call append(3, '')
+ endif
+ endif
+ call s:log4(name, 'Checking out '.tag)
+ let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir)
+ else
+ let branch = get(spec, 'branch', 'master')
+ call s:log4(name, 'Merging origin/'.s:esc(branch))
+ let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1'
+ \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir)
+ endif
+ if !v:shell_error && filereadable(spec.dir.'/.gitmodules') &&
+ \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir))
+ call s:log4(name, 'Updating submodules. This may take a while.')
+ let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir)
+ endif
+ let msg = s:format_message(v:shell_error ? 'x': '-', name, out)
+ if v:shell_error
+ call add(s:update.errors, name)
+ call s:regress_bar()
+ silent execute pos 'd _'
+ call append(4, msg) | 4
+ elseif !empty(out)
+ call setline(pos, msg[0])
+ endif
+ redraw
+ endfor
+ silent 4 d _
+ try
+ call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")'))
+ catch
+ call s:warn('echom', v:exception)
+ call s:warn('echo', '')
+ return
+ endtry
+ call s:finish(s:update.pull)
+ call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.')
+ call s:switch_out('normal! gg')
+ endif
+endfunction
+
+function! s:job_abort()
+ if (!s:nvim && !s:vim8) || !exists('s:jobs')
+ return
+ endif
+
+ for [name, j] in items(s:jobs)
+ if s:nvim
+ silent! call jobstop(j.jobid)
+ elseif s:vim8
+ silent! call job_stop(j.jobid)
+ endif
+ if j.new
+ call s:rm_rf(g:plugs[name].dir)
+ endif
+ endfor
+ let s:jobs = {}
+endfunction
+
+function! s:last_non_empty_line(lines)
+ let len = len(a:lines)
+ for idx in range(len)
+ let line = a:lines[len-idx-1]
+ if !empty(line)
+ return line
+ endif
+ endfor
+ return ''
+endfunction
+
+function! s:job_out_cb(self, data) abort
+ let self = a:self
+ let data = remove(self.lines, -1) . a:data
+ let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]')
+ call extend(self.lines, lines)
+ " To reduce the number of buffer updates
+ let self.tick = get(self, 'tick', -1) + 1
+ if !self.running || self.tick % len(s:jobs) == 0
+ let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-')
+ let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines)
+ call s:log(bullet, self.name, result)
+ endif
+endfunction
+
+function! s:job_exit_cb(self, data) abort
+ let a:self.running = 0
+ let a:self.error = a:data != 0
+ call s:reap(a:self.name)
+ call s:tick()
+endfunction
+
+function! s:job_cb(fn, job, ch, data)
+ if !s:plug_window_exists() " plug window closed
+ return s:job_abort()
+ endif
+ call call(a:fn, [a:job, a:data])
+endfunction
+
+function! s:nvim_cb(job_id, data, event) dict abort
+ return a:event == 'stdout' ?
+ \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) :
+ \ s:job_cb('s:job_exit_cb', self, 0, a:data)
+endfunction
+
+function! s:spawn(name, cmd, opts)
+ let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''],
+ \ 'new': get(a:opts, 'new', 0) }
+ let s:jobs[a:name] = job
+ let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir, 0) : a:cmd
+ let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd]
+
+ if s:nvim
+ call extend(job, {
+ \ 'on_stdout': function('s:nvim_cb'),
+ \ 'on_exit': function('s:nvim_cb'),
+ \ })
+ let jid = s:plug_call('jobstart', argv, job)
+ if jid > 0
+ let job.jobid = jid
+ else
+ let job.running = 0
+ let job.error = 1
+ let job.lines = [jid < 0 ? argv[0].' is not executable' :
+ \ 'Invalid arguments (or job table is full)']
+ endif
+ elseif s:vim8
+ let jid = job_start(s:is_win ? join(argv, ' ') : argv, {
+ \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]),
+ \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]),
+ \ 'out_mode': 'raw'
+ \})
+ if job_status(jid) == 'run'
+ let job.jobid = jid
+ else
+ let job.running = 0
+ let job.error = 1
+ let job.lines = ['Failed to start job']
+ endif
+ else
+ let job.lines = s:lines(call('s:system', [cmd]))
+ let job.error = v:shell_error != 0
+ let job.running = 0
+ endif
+endfunction
+
+function! s:reap(name)
+ let job = s:jobs[a:name]
+ if job.error
+ call add(s:update.errors, a:name)
+ elseif get(job, 'new', 0)
+ let s:update.new[a:name] = 1
+ endif
+ let s:update.bar .= job.error ? 'x' : '='
+
+ let bullet = job.error ? 'x' : '-'
+ let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines)
+ call s:log(bullet, a:name, empty(result) ? 'OK' : result)
+ call s:bar()
+
+ call remove(s:jobs, a:name)
+endfunction
+
+function! s:bar()
+ if s:switch_in()
+ let total = len(s:update.all)
+ call setline(1, (s:update.pull ? 'Updating' : 'Installing').
+ \ ' plugins ('.len(s:update.bar).'/'.total.')')
+ call s:progress_bar(2, s:update.bar, total)
+ call s:switch_out()
+ endif
+endfunction
+
+function! s:logpos(name)
+ let max = line('$')
+ for i in range(4, max > 4 ? max : 4)
+ if getline(i) =~# '^[-+x*] '.a:name.':'
+ for j in range(i + 1, max > 5 ? max : 5)
+ if getline(j) !~ '^ '
+ return [i, j - 1]
+ endif
+ endfor
+ return [i, i]
+ endif
+ endfor
+ return [0, 0]
+endfunction
+
+function! s:log(bullet, name, lines)
+ if s:switch_in()
+ let [b, e] = s:logpos(a:name)
+ if b > 0
+ silent execute printf('%d,%d d _', b, e)
+ if b > winheight('.')
+ let b = 4
+ endif
+ else
+ let b = 4
+ endif
+ " FIXME For some reason, nomodifiable is set after :d in vim8
+ setlocal modifiable
+ call append(b - 1, s:format_message(a:bullet, a:name, a:lines))
+ call s:switch_out()
+ endif
+endfunction
+
+function! s:update_vim()
+ let s:jobs = {}
+
+ call s:bar()
+ call s:tick()
+endfunction
+
+function! s:tick()
+ let pull = s:update.pull
+ let prog = s:progress_opt(s:nvim || s:vim8)
+while 1 " Without TCO, Vim stack is bound to explode
+ if empty(s:update.todo)
+ if empty(s:jobs) && !s:update.fin
+ call s:update_finish()
+ let s:update.fin = 1
+ endif
+ return
+ endif
+
+ let name = keys(s:update.todo)[0]
+ let spec = remove(s:update.todo, name)
+ let new = empty(globpath(spec.dir, '.git', 1))
+
+ call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
+ redraw
+
+ let has_tag = has_key(spec, 'tag')
+ if !new
+ let [error, _] = s:git_validate(spec, 0)
+ if empty(error)
+ if pull
+ let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : ''
+ call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir })
+ else
+ let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 }
+ endif
+ else
+ let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 }
+ endif
+ else
+ call s:spawn(name,
+ \ printf('git clone %s %s %s %s 2>&1',
+ \ has_tag ? '' : s:clone_opt,
+ \ prog,
+ \ plug#shellescape(spec.uri, {'script': 0}),
+ \ plug#shellescape(s:trim(spec.dir), {'script': 0})), { 'new': 1 })
+ endif
+
+ if !s:jobs[name].running
+ call s:reap(name)
+ endif
+ if len(s:jobs) >= s:update.threads
+ break
+ endif
+endwhile
+endfunction
+
+function! s:update_python()
+let py_exe = has('python') ? 'python' : 'python3'
+execute py_exe "<< EOF"
+import datetime
+import functools
+import os
+try:
+ import queue
+except ImportError:
+ import Queue as queue
+import random
+import re
+import shutil
+import signal
+import subprocess
+import tempfile
+import threading as thr
+import time
+import traceback
+import vim
+
+G_NVIM = vim.eval("has('nvim')") == '1'
+G_PULL = vim.eval('s:update.pull') == '1'
+G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1
+G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)'))
+G_CLONE_OPT = vim.eval('s:clone_opt')
+G_PROGRESS = vim.eval('s:progress_opt(1)')
+G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
+G_STOP = thr.Event()
+G_IS_WIN = vim.eval('s:is_win') == '1'
+
+class PlugError(Exception):
+ def __init__(self, msg):
+ self.msg = msg
+class CmdTimedOut(PlugError):
+ pass
+class CmdFailed(PlugError):
+ pass
+class InvalidURI(PlugError):
+ pass
+class Action(object):
+ INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-']
+
+class Buffer(object):
+ def __init__(self, lock, num_plugs, is_pull):
+ self.bar = ''
+ self.event = 'Updating' if is_pull else 'Installing'
+ self.lock = lock
+ self.maxy = int(vim.eval('winheight(".")'))
+ self.num_plugs = num_plugs
+
+ def __where(self, name):
+ """ Find first line with name in current buffer. Return line num. """
+ found, lnum = False, 0
+ matcher = re.compile('^[-+x*] {0}:'.format(name))
+ for line in vim.current.buffer:
+ if matcher.search(line) is not None:
+ found = True
+ break
+ lnum += 1
+
+ if not found:
+ lnum = -1
+ return lnum
+
+ def header(self):
+ curbuf = vim.current.buffer
+ curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs)
+
+ num_spaces = self.num_plugs - len(self.bar)
+ curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ')
+
+ with self.lock:
+ vim.command('normal! 2G')
+ vim.command('redraw')
+
+ def write(self, action, name, lines):
+ first, rest = lines[0], lines[1:]
+ msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)]
+ msg.extend([' ' + line for line in rest])
+
+ try:
+ if action == Action.ERROR:
+ self.bar += 'x'
+ vim.command("call add(s:update.errors, '{0}')".format(name))
+ elif action == Action.DONE:
+ self.bar += '='
+
+ curbuf = vim.current.buffer
+ lnum = self.__where(name)
+ if lnum != -1: # Found matching line num
+ del curbuf[lnum]
+ if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]):
+ lnum = 3
+ else:
+ lnum = 3
+ curbuf.append(msg, lnum)
+
+ self.header()
+ except vim.error:
+ pass
+
+class Command(object):
+ CD = 'cd /d' if G_IS_WIN else 'cd'
+
+ def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None):
+ self.cmd = cmd
+ if cmd_dir:
+ self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd)
+ self.timeout = timeout
+ self.callback = cb if cb else (lambda msg: None)
+ self.clean = clean if clean else (lambda: None)
+ self.proc = None
+
+ @property
+ def alive(self):
+ """ Returns true only if command still running. """
+ return self.proc and self.proc.poll() is None
+
+ def execute(self, ntries=3):
+ """ Execute the command with ntries if CmdTimedOut.
+ Returns the output of the command if no Exception.
+ """
+ attempt, finished, limit = 0, False, self.timeout
+
+ while not finished:
+ try:
+ attempt += 1
+ result = self.try_command()
+ finished = True
+ return result
+ except CmdTimedOut:
+ if attempt != ntries:
+ self.notify_retry()
+ self.timeout += limit
+ else:
+ raise
+
+ def notify_retry(self):
+ """ Retry required for command, notify user. """
+ for count in range(3, 0, -1):
+ if G_STOP.is_set():
+ raise KeyboardInterrupt
+ msg = 'Timeout. Will retry in {0} second{1} ...'.format(
+ count, 's' if count != 1 else '')
+ self.callback([msg])
+ time.sleep(1)
+ self.callback(['Retrying ...'])
+
+ def try_command(self):
+ """ Execute a cmd & poll for callback. Returns list of output.
+ Raises CmdFailed -> return code for Popen isn't 0
+ Raises CmdTimedOut -> command exceeded timeout without new output
+ """
+ first_line = True
+
+ try:
+ tfile = tempfile.NamedTemporaryFile(mode='w+b')
+ preexec_fn = not G_IS_WIN and os.setsid or None
+ self.proc = subprocess.Popen(self.cmd, stdout=tfile,
+ stderr=subprocess.STDOUT,
+ stdin=subprocess.PIPE, shell=True,
+ preexec_fn=preexec_fn)
+ thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,))
+ thrd.start()
+
+ thread_not_started = True
+ while thread_not_started:
+ try:
+ thrd.join(0.1)
+ thread_not_started = False
+ except RuntimeError:
+ pass
+
+ while self.alive:
+ if G_STOP.is_set():
+ raise KeyboardInterrupt
+
+ if first_line or random.random() < G_LOG_PROB:
+ first_line = False
+ line = '' if G_IS_WIN else nonblock_read(tfile.name)
+ if line:
+ self.callback([line])
+
+ time_diff = time.time() - os.path.getmtime(tfile.name)
+ if time_diff > self.timeout:
+ raise CmdTimedOut(['Timeout!'])
+
+ thrd.join(0.5)
+
+ tfile.seek(0)
+ result = [line.decode('utf-8', 'replace').rstrip() for line in tfile]
+
+ if self.proc.returncode != 0:
+ raise CmdFailed([''] + result)
+
+ return result
+ except:
+ self.terminate()
+ raise
+
+ def terminate(self):
+ """ Terminate process and cleanup. """
+ if self.alive:
+ if G_IS_WIN:
+ os.kill(self.proc.pid, signal.SIGINT)
+ else:
+ os.killpg(self.proc.pid, signal.SIGTERM)
+ self.clean()
+
+class Plugin(object):
+ def __init__(self, name, args, buf_q, lock):
+ self.name = name
+ self.args = args
+ self.buf_q = buf_q
+ self.lock = lock
+ self.tag = args.get('tag', 0)
+
+ def manage(self):
+ try:
+ if os.path.exists(self.args['dir']):
+ self.update()
+ else:
+ self.install()
+ with self.lock:
+ thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
+ except PlugError as exc:
+ self.write(Action.ERROR, self.name, exc.msg)
+ except KeyboardInterrupt:
+ G_STOP.set()
+ self.write(Action.ERROR, self.name, ['Interrupted!'])
+ except:
+ # Any exception except those above print stack trace
+ msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip())
+ self.write(Action.ERROR, self.name, msg.split('\n'))
+ raise
+
+ def install(self):
+ target = self.args['dir']
+ if target[-1] == '\\':
+ target = target[0:-1]
+
+ def clean(target):
+ def _clean():
+ try:
+ shutil.rmtree(target)
+ except OSError:
+ pass
+ return _clean
+
+ self.write(Action.INSTALL, self.name, ['Installing ...'])
+ callback = functools.partial(self.write, Action.INSTALL, self.name)
+ cmd = 'git clone {0} {1} {2} {3} 2>&1'.format(
+ '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'],
+ esc(target))
+ com = Command(cmd, None, G_TIMEOUT, callback, clean(target))
+ result = com.execute(G_RETRIES)
+ self.write(Action.DONE, self.name, result[-1:])
+
+ def repo_uri(self):
+ cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url'
+ command = Command(cmd, self.args['dir'], G_TIMEOUT,)
+ result = command.execute(G_RETRIES)
+ return result[-1]
+
+ def update(self):
+ actual_uri = self.repo_uri()
+ expect_uri = self.args['uri']
+ regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$')
+ ma = regex.match(actual_uri)
+ mb = regex.match(expect_uri)
+ if ma is None or mb is None or ma.groups() != mb.groups():
+ msg = ['',
+ 'Invalid URI: {0}'.format(actual_uri),
+ 'Expected {0}'.format(expect_uri),
+ 'PlugClean required.']
+ raise InvalidURI(msg)
+
+ if G_PULL:
+ self.write(Action.UPDATE, self.name, ['Updating ...'])
+ callback = functools.partial(self.write, Action.UPDATE, self.name)
+ fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else ''
+ cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS)
+ com = Command(cmd, self.args['dir'], G_TIMEOUT, callback)
+ result = com.execute(G_RETRIES)
+ self.write(Action.DONE, self.name, result[-1:])
+ else:
+ self.write(Action.DONE, self.name, ['Already installed'])
+
+ def write(self, action, name, msg):
+ self.buf_q.put((action, name, msg))
+
+class PlugThread(thr.Thread):
+ def __init__(self, tname, args):
+ super(PlugThread, self).__init__()
+ self.tname = tname
+ self.args = args
+
+ def run(self):
+ thr.current_thread().name = self.tname
+ buf_q, work_q, lock = self.args
+
+ try:
+ while not G_STOP.is_set():
+ name, args = work_q.get_nowait()
+ plug = Plugin(name, args, buf_q, lock)
+ plug.manage()
+ work_q.task_done()
+ except queue.Empty:
+ pass
+
+class RefreshThread(thr.Thread):
+ def __init__(self, lock):
+ super(RefreshThread, self).__init__()
+ self.lock = lock
+ self.running = True
+
+ def run(self):
+ while self.running:
+ with self.lock:
+ thread_vim_command('noautocmd normal! a')
+ time.sleep(0.33)
+
+ def stop(self):
+ self.running = False
+
+if G_NVIM:
+ def thread_vim_command(cmd):
+ vim.session.threadsafe_call(lambda: vim.command(cmd))
+else:
+ def thread_vim_command(cmd):
+ vim.command(cmd)
+
+def esc(name):
+ return '"' + name.replace('"', '\"') + '"'
+
+def nonblock_read(fname):
+ """ Read a file with nonblock flag. Return the last line. """
+ fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK)
+ buf = os.read(fread, 100000).decode('utf-8', 'replace')
+ os.close(fread)
+
+ line = buf.rstrip('\r\n')
+ left = max(line.rfind('\r'), line.rfind('\n'))
+ if left != -1:
+ left += 1
+ line = line[left:]
+
+ return line
+
+def main():
+ thr.current_thread().name = 'main'
+ nthreads = int(vim.eval('s:update.threads'))
+ plugs = vim.eval('s:update.todo')
+ mac_gui = vim.eval('s:mac_gui') == '1'
+
+ lock = thr.Lock()
+ buf = Buffer(lock, len(plugs), G_PULL)
+ buf_q, work_q = queue.Queue(), queue.Queue()
+ for work in plugs.items():
+ work_q.put(work)
+
+ start_cnt = thr.active_count()
+ for num in range(nthreads):
+ tname = 'PlugT-{0:02}'.format(num)
+ thread = PlugThread(tname, (buf_q, work_q, lock))
+ thread.start()
+ if mac_gui:
+ rthread = RefreshThread(lock)
+ rthread.start()
+
+ while not buf_q.empty() or thr.active_count() != start_cnt:
+ try:
+ action, name, msg = buf_q.get(True, 0.25)
+ buf.write(action, name, ['OK'] if not msg else msg)
+ buf_q.task_done()
+ except queue.Empty:
+ pass
+ except KeyboardInterrupt:
+ G_STOP.set()
+
+ if mac_gui:
+ rthread.stop()
+ rthread.join()
+
+main()
+EOF
+endfunction
+
+function! s:update_ruby()
+ ruby << EOF
+ module PlugStream
+ SEP = ["\r", "\n", nil]
+ def get_line
+ buffer = ''
+ loop do
+ char = readchar rescue return
+ if SEP.include? char.chr
+ buffer << $/
+ break
+ else
+ buffer << char
+ end
+ end
+ buffer
+ end
+ end unless defined?(PlugStream)
+
+ def esc arg
+ %["#{arg.gsub('"', '\"')}"]
+ end
+
+ def killall pid
+ pids = [pid]
+ if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
+ pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil }
+ else
+ unless `which pgrep 2> /dev/null`.empty?
+ children = pids
+ until children.empty?
+ children = children.map { |pid|
+ `pgrep -P #{pid}`.lines.map { |l| l.chomp }
+ }.flatten
+ pids += children
+ end
+ end
+ pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
+ end
+ end
+
+ def compare_git_uri a, b
+ regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$}
+ regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1)
+ end
+
+ require 'thread'
+ require 'fileutils'
+ require 'timeout'
+ running = true
+ iswin = VIM::evaluate('s:is_win').to_i == 1
+ pull = VIM::evaluate('s:update.pull').to_i == 1
+ base = VIM::evaluate('g:plug_home')
+ all = VIM::evaluate('s:update.todo')
+ limit = VIM::evaluate('get(g:, "plug_timeout", 60)')
+ tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1
+ nthr = VIM::evaluate('s:update.threads').to_i
+ maxy = VIM::evaluate('winheight(".")').to_i
+ vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/
+ cd = iswin ? 'cd /d' : 'cd'
+ tot = VIM::evaluate('len(s:update.todo)') || 0
+ bar = ''
+ skip = 'Already installed'
+ mtx = Mutex.new
+ take1 = proc { mtx.synchronize { running && all.shift } }
+ logh = proc {
+ cnt = bar.length
+ $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})"
+ $curbuf[2] = '[' + bar.ljust(tot) + ']'
+ VIM::command('normal! 2G')
+ VIM::command('redraw')
+ }
+ where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } }
+ log = proc { |name, result, type|
+ mtx.synchronize do
+ ing = ![true, false].include?(type)
+ bar += type ? '=' : 'x' unless ing
+ b = case type
+ when :install then '+' when :update then '*'
+ when true, nil then '-' else
+ VIM::command("call add(s:update.errors, '#{name}')")
+ 'x'
+ end
+ result =
+ if type || type.nil?
+ ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"]
+ elsif result =~ /^Interrupted|^Timeout/
+ ["#{b} #{name}: #{result}"]
+ else
+ ["#{b} #{name}"] + result.lines.map { |l| " " << l }
+ end
+ if lnum = where.call(name)
+ $curbuf.delete lnum
+ lnum = 4 if ing && lnum > maxy
+ end
+ result.each_with_index do |line, offset|
+ $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp)
+ end
+ logh.call
+ end
+ }
+ bt = proc { |cmd, name, type, cleanup|
+ tried = timeout = 0
+ begin
+ tried += 1
+ timeout += limit
+ fd = nil
+ data = ''
+ if iswin
+ Timeout::timeout(timeout) do
+ tmp = VIM::evaluate('tempname()')
+ system("(#{cmd}) > #{tmp}")
+ data = File.read(tmp).chomp
+ File.unlink tmp rescue nil
+ end
+ else
+ fd = IO.popen(cmd).extend(PlugStream)
+ first_line = true
+ log_prob = 1.0 / nthr
+ while line = Timeout::timeout(timeout) { fd.get_line }
+ data << line
+ log.call name, line.chomp, type if name && (first_line || rand < log_prob)
+ first_line = false
+ end
+ fd.close
+ end
+ [$? == 0, data.chomp]
+ rescue Timeout::Error, Interrupt => e
+ if fd && !fd.closed?
+ killall fd.pid
+ fd.close
+ end
+ cleanup.call if cleanup
+ if e.is_a?(Timeout::Error) && tried < tries
+ 3.downto(1) do |countdown|
+ s = countdown > 1 ? 's' : ''
+ log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type
+ sleep 1
+ end
+ log.call name, 'Retrying ...', type
+ retry
+ end
+ [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"]
+ end
+ }
+ main = Thread.current
+ threads = []
+ watcher = Thread.new {
+ if vim7
+ while VIM::evaluate('getchar(1)')
+ sleep 0.1
+ end
+ else
+ require 'io/console' # >= Ruby 1.9
+ nil until IO.console.getch == 3.chr
+ end
+ mtx.synchronize do
+ running = false
+ threads.each { |t| t.raise Interrupt } unless vim7
+ end
+ threads.each { |t| t.join rescue nil }
+ main.kill
+ }
+ refresh = Thread.new {
+ while true
+ mtx.synchronize do
+ break unless running
+ VIM::command('noautocmd normal! a')
+ end
+ sleep 0.2
+ end
+ } if VIM::evaluate('s:mac_gui') == 1
+
+ clone_opt = VIM::evaluate('s:clone_opt')
+ progress = VIM::evaluate('s:progress_opt(1)')
+ nthr.times do
+ mtx.synchronize do
+ threads << Thread.new {
+ while pair = take1.call
+ name = pair.first
+ dir, uri, tag = pair.last.values_at *%w[dir uri tag]
+ exists = File.directory? dir
+ ok, result =
+ if exists
+ chdir = "#{cd} #{iswin ? dir : esc(dir)}"
+ ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil
+ current_uri = data.lines.to_a.last
+ if !ret
+ if data =~ /^Interrupted|^Timeout/
+ [false, data]
+ else
+ [false, [data.chomp, "PlugClean required."].join($/)]
+ end
+ elsif !compare_git_uri(current_uri, uri)
+ [false, ["Invalid URI: #{current_uri}",
+ "Expected: #{uri}",
+ "PlugClean required."].join($/)]
+ else
+ if pull
+ log.call name, 'Updating ...', :update
+ fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : ''
+ bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil
+ else
+ [true, skip]
+ end
+ end
+ else
+ d = esc dir.sub(%r{[\\/]+$}, '')
+ log.call name, 'Installing ...', :install
+ bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc {
+ FileUtils.rm_rf dir
+ }
+ end
+ mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok
+ log.call name, result, ok
+ end
+ } if running
+ end
+ end
+ threads.each { |t| t.join rescue nil }
+ logh.call
+ refresh.kill if refresh
+ watcher.kill
+EOF
+endfunction
+
+function! s:shellesc_cmd(arg, script)
+ let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g')
+ return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g')
+endfunction
+
+function! s:shellesc_ps1(arg)
+ return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'"
+endfunction
+
+function! s:shellesc_sh(arg)
+ return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'"
+endfunction
+
+function! plug#shellescape(arg, ...)
+ let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {}
+ let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh')
+ let script = get(opts, 'script', 1)
+ if shell =~# 'cmd\.exe'
+ return s:shellesc_cmd(a:arg, script)
+ elseif shell =~# 'powershell\.exe' || shell =~# 'pwsh$'
+ return s:shellesc_ps1(a:arg)
+ endif
+ return s:shellesc_sh(a:arg)
+endfunction
+
+function! s:glob_dir(path)
+ return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)')
+endfunction
+
+function! s:progress_bar(line, bar, total)
+ call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']')
+endfunction
+
+function! s:compare_git_uri(a, b)
+ " See `git help clone'
+ " https:// [user@] github.com[:port] / junegunn/vim-plug [.git]
+ " [git@] github.com[:port] : junegunn/vim-plug [.git]
+ " file:// / junegunn/vim-plug [/]
+ " / junegunn/vim-plug [/]
+ let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$'
+ let ma = matchlist(a:a, pat)
+ let mb = matchlist(a:b, pat)
+ return ma[1:2] ==# mb[1:2]
+endfunction
+
+function! s:format_message(bullet, name, message)
+ if a:bullet != 'x'
+ return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))]
+ else
+ let lines = map(s:lines(a:message), '" ".v:val')
+ return extend([printf('x %s:', a:name)], lines)
+ endif
+endfunction
+
+function! s:with_cd(cmd, dir, ...)
+ let script = a:0 > 0 ? a:1 : 1
+ return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd)
+endfunction
+
+function! s:system(cmd, ...)
+ let batchfile = ''
+ try
+ let [sh, shellcmdflag, shrd] = s:chsh(1)
+ let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd
+ if s:is_win
+ let [batchfile, cmd] = s:batchfile(cmd)
+ endif
+ return system(cmd)
+ finally
+ let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
+ if s:is_win && filereadable(batchfile)
+ call delete(batchfile)
+ endif
+ endtry
+endfunction
+
+function! s:system_chomp(...)
+ let ret = call('s:system', a:000)
+ return v:shell_error ? '' : substitute(ret, '\n$', '', '')
+endfunction
+
+function! s:git_validate(spec, check_branch)
+ let err = ''
+ if isdirectory(a:spec.dir)
+ let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir))
+ let remote = result[-1]
+ if v:shell_error
+ let err = join([remote, 'PlugClean required.'], "\n")
+ elseif !s:compare_git_uri(remote, a:spec.uri)
+ let err = join(['Invalid URI: '.remote,
+ \ 'Expected: '.a:spec.uri,
+ \ 'PlugClean required.'], "\n")
+ elseif a:check_branch && has_key(a:spec, 'commit')
+ let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir))
+ let sha = result[-1]
+ if v:shell_error
+ let err = join(add(result, 'PlugClean required.'), "\n")
+ elseif !s:hash_match(sha, a:spec.commit)
+ let err = join([printf('Invalid HEAD (expected: %s, actual: %s)',
+ \ a:spec.commit[:6], sha[:6]),
+ \ 'PlugUpdate required.'], "\n")
+ endif
+ elseif a:check_branch
+ let branch = result[0]
+ " Check tag
+ if has_key(a:spec, 'tag')
+ let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir)
+ if a:spec.tag !=# tag && a:spec.tag !~ '\*'
+ let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.',
+ \ (empty(tag) ? 'N/A' : tag), a:spec.tag)
+ endif
+ " Check branch
+ elseif a:spec.branch !=# branch
+ let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.',
+ \ branch, a:spec.branch)
+ endif
+ if empty(err)
+ let [ahead, behind] = split(s:lastline(s:system(printf(
+ \ 'git rev-list --count --left-right HEAD...origin/%s',
+ \ a:spec.branch), a:spec.dir)), '\t')
+ if !v:shell_error && ahead
+ if behind
+ " Only mention PlugClean if diverged, otherwise it's likely to be
+ " pushable (and probably not that messed up).
+ let err = printf(
+ \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n"
+ \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind)
+ else
+ let err = printf("Ahead of origin/%s by %d commit(s).\n"
+ \ .'Cannot update until local changes are pushed.',
+ \ a:spec.branch, ahead)
+ endif
+ endif
+ endif
+ endif
+ else
+ let err = 'Not found'
+ endif
+ return [err, err =~# 'PlugClean']
+endfunction
+
+function! s:rm_rf(dir)
+ if isdirectory(a:dir)
+ call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . plug#shellescape(a:dir))
+ endif
+endfunction
+
+function! s:clean(force)
+ call s:prepare()
+ call append(0, 'Searching for invalid plugins in '.g:plug_home)
+ call append(1, '')
+
+ " List of valid directories
+ let dirs = []
+ let errs = {}
+ let [cnt, total] = [0, len(g:plugs)]
+ for [name, spec] in items(g:plugs)
+ if !s:is_managed(name)
+ call add(dirs, spec.dir)
+ else
+ let [err, clean] = s:git_validate(spec, 1)
+ if clean
+ let errs[spec.dir] = s:lines(err)[0]
+ else
+ call add(dirs, spec.dir)
+ endif
+ endif
+ let cnt += 1
+ call s:progress_bar(2, repeat('=', cnt), total)
+ normal! 2G
+ redraw
+ endfor
+
+ let allowed = {}
+ for dir in dirs
+ let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1
+ let allowed[dir] = 1
+ for child in s:glob_dir(dir)
+ let allowed[child] = 1
+ endfor
+ endfor
+
+ let todo = []
+ let found = sort(s:glob_dir(g:plug_home))
+ while !empty(found)
+ let f = remove(found, 0)
+ if !has_key(allowed, f) && isdirectory(f)
+ call add(todo, f)
+ call append(line('$'), '- ' . f)
+ if has_key(errs, f)
+ call append(line('$'), ' ' . errs[f])
+ endif
+ let found = filter(found, 'stridx(v:val, f) != 0')
+ end
+ endwhile
+
+ 4
+ redraw
+ if empty(todo)
+ call append(line('$'), 'Already clean.')
+ else
+ let s:clean_count = 0
+ call append(3, ['Directories to delete:', ''])
+ redraw!
+ if a:force || s:ask_no_interrupt('Delete all directories?')
+ call s:delete([6, line('$')], 1)
+ else
+ call setline(4, 'Cancelled.')
+ nnoremap <silent> <buffer> d :set opfunc=<sid>delete_op<cr>g@
+ nmap <silent> <buffer> dd d_
+ xnoremap <silent> <buffer> d :<c-u>call <sid>delete_op(visualmode(), 1)<cr>
+ echo 'Delete the lines (d{motion}) to delete the corresponding directories'
+ endif
+ endif
+ 4
+ setlocal nomodifiable
+endfunction
+
+function! s:delete_op(type, ...)
+ call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0)
+endfunction
+
+function! s:delete(range, force)
+ let [l1, l2] = a:range
+ let force = a:force
+ while l1 <= l2
+ let line = getline(l1)
+ if line =~ '^- ' && isdirectory(line[2:])
+ execute l1
+ redraw!
+ let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1)
+ let force = force || answer > 1
+ if answer
+ call s:rm_rf(line[2:])
+ setlocal modifiable
+ call setline(l1, '~'.line[1:])
+ let s:clean_count += 1
+ call setline(4, printf('Removed %d directories.', s:clean_count))
+ setlocal nomodifiable
+ endif
+ endif
+ let l1 += 1
+ endwhile
+endfunction
+
+function! s:upgrade()
+ echo 'Downloading the latest version of vim-plug'
+ redraw
+ let tmp = s:plug_tempname()
+ let new = tmp . '/plug.vim'
+
+ try
+ let out = s:system(printf('git clone --depth 1 %s %s', plug#shellescape(s:plug_src), plug#shellescape(tmp)))
+ if v:shell_error
+ return s:err('Error upgrading vim-plug: '. out)
+ endif
+
+ if readfile(s:me) ==# readfile(new)
+ echo 'vim-plug is already up-to-date'
+ return 0
+ else
+ call rename(s:me, s:me . '.old')
+ call rename(new, s:me)
+ unlet g:loaded_plug
+ echo 'vim-plug has been upgraded'
+ return 1
+ endif
+ finally
+ silent! call s:rm_rf(tmp)
+ endtry
+endfunction
+
+function! s:upgrade_specs()
+ for spec in values(g:plugs)
+ let spec.frozen = get(spec, 'frozen', 0)
+ endfor
+endfunction
+
+function! s:status()
+ call s:prepare()
+ call append(0, 'Checking plugins')
+ call append(1, '')
+
+ let ecnt = 0
+ let unloaded = 0
+ let [cnt, total] = [0, len(g:plugs)]
+ for [name, spec] in items(g:plugs)
+ let is_dir = isdirectory(spec.dir)
+ if has_key(spec, 'uri')
+ if is_dir
+ let [err, _] = s:git_validate(spec, 1)
+ let [valid, msg] = [empty(err), empty(err) ? 'OK' : err]
+ else
+ let [valid, msg] = [0, 'Not found. Try PlugInstall.']
+ endif
+ else
+ if is_dir
+ let [valid, msg] = [1, 'OK']
+ else
+ let [valid, msg] = [0, 'Not found.']
+ endif
+ endif
+ let cnt += 1
+ let ecnt += !valid
+ " `s:loaded` entry can be missing if PlugUpgraded
+ if is_dir && get(s:loaded, name, -1) == 0
+ let unloaded = 1
+ let msg .= ' (not loaded)'
+ endif
+ call s:progress_bar(2, repeat('=', cnt), total)
+ call append(3, s:format_message(valid ? '-' : 'x', name, msg))
+ normal! 2G
+ redraw
+ endfor
+ call setline(1, 'Finished. '.ecnt.' error(s).')
+ normal! gg
+ setlocal nomodifiable
+ if unloaded
+ echo "Press 'L' on each line to load plugin, or 'U' to update"
+ nnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
+ xnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
+ end
+endfunction
+
+function! s:extract_name(str, prefix, suffix)
+ return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$')
+endfunction
+
+function! s:status_load(lnum)
+ let line = getline(a:lnum)
+ let name = s:extract_name(line, '-', '(not loaded)')
+ if !empty(name)
+ call plug#load(name)
+ setlocal modifiable
+ call setline(a:lnum, substitute(line, ' (not loaded)$', '', ''))
+ setlocal nomodifiable
+ endif
+endfunction
+
+function! s:status_update() range
+ let lines = getline(a:firstline, a:lastline)
+ let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)')
+ if !empty(names)
+ echo
+ execute 'PlugUpdate' join(names)
+ endif
+endfunction
+
+function! s:is_preview_window_open()
+ silent! wincmd P
+ if &previewwindow
+ wincmd p
+ return 1
+ endif
+endfunction
+
+function! s:find_name(lnum)
+ for lnum in reverse(range(1, a:lnum))
+ let line = getline(lnum)
+ if empty(line)
+ return ''
+ endif
+ let name = s:extract_name(line, '-', '')
+ if !empty(name)
+ return name
+ endif
+ endfor
+ return ''
+endfunction
+
+function! s:preview_commit()
+ if b:plug_preview < 0
+ let b:plug_preview = !s:is_preview_window_open()
+ endif
+
+ let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}')
+ if empty(sha)
+ return
+ endif
+
+ let name = s:find_name(line('.'))
+ if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir)
+ return
+ endif
+
+ if exists('g:plug_pwindow') && !s:is_preview_window_open()
+ execute g:plug_pwindow
+ execute 'e' sha
+ else
+ execute 'pedit' sha
+ wincmd P
+ endif
+ setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable
+ let batchfile = ''
+ try
+ let [sh, shellcmdflag, shrd] = s:chsh(1)
+ let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha
+ if s:is_win
+ let [batchfile, cmd] = s:batchfile(cmd)
+ endif
+ execute 'silent %!' cmd
+ finally
+ let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
+ if s:is_win && filereadable(batchfile)
+ call delete(batchfile)
+ endif
+ endtry
+ setlocal nomodifiable
+ nnoremap <silent> <buffer> q :q<cr>
+ wincmd p
+endfunction
+
+function! s:section(flags)
+ call search('\(^[x-] \)\@<=[^:]\+:', a:flags)
+endfunction
+
+function! s:format_git_log(line)
+ let indent = ' '
+ let tokens = split(a:line, nr2char(1))
+ if len(tokens) != 5
+ return indent.substitute(a:line, '\s*$', '', '')
+ endif
+ let [graph, sha, refs, subject, date] = tokens
+ let tag = matchstr(refs, 'tag: [^,)]\+')
+ let tag = empty(tag) ? ' ' : ' ('.tag.') '
+ return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date)
+endfunction
+
+function! s:append_ul(lnum, text)
+ call append(a:lnum, ['', a:text, repeat('-', len(a:text))])
+endfunction
+
+function! s:diff()
+ call s:prepare()
+ call append(0, ['Collecting changes ...', ''])
+ let cnts = [0, 0]
+ let bar = ''
+ let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)')
+ call s:progress_bar(2, bar, len(total))
+ for origin in [1, 0]
+ let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))'))))
+ if empty(plugs)
+ continue
+ endif
+ call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:')
+ for [k, v] in plugs
+ let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..'
+ let cmd = 'git log --graph --color=never '
+ \ . (s:git_version_requirement(2, 10, 0) ? '--no-show-signature ' : '')
+ \ . join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 'plug#shellescape(v:val)'))
+ if has_key(v, 'rtp')
+ let cmd .= ' -- '.plug#shellescape(v.rtp)
+ endif
+ let diff = s:system_chomp(cmd, v.dir)
+ if !empty(diff)
+ let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : ''
+ call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)')))
+ let cnts[origin] += 1
+ endif
+ let bar .= '='
+ call s:progress_bar(2, bar, len(total))
+ normal! 2G
+ redraw
+ endfor
+ if !cnts[origin]
+ call append(5, ['', 'N/A'])
+ endif
+ endfor
+ call setline(1, printf('%d plugin(s) updated.', cnts[0])
+ \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : ''))
+
+ if cnts[0] || cnts[1]
+ nnoremap <silent> <buffer> <plug>(plug-preview) :silent! call <SID>preview_commit()<cr>
+ if empty(maparg("\<cr>", 'n'))
+ nmap <buffer> <cr> <plug>(plug-preview)
+ endif
+ if empty(maparg('o', 'n'))
+ nmap <buffer> o <plug>(plug-preview)
+ endif
+ endif
+ if cnts[0]
+ nnoremap <silent> <buffer> X :call <SID>revert()<cr>
+ echo "Press 'X' on each block to revert the update"
+ endif
+ normal! gg
+ setlocal nomodifiable
+endfunction
+
+function! s:revert()
+ if search('^Pending updates', 'bnW')
+ return
+ endif
+
+ let name = s:find_name(line('.'))
+ if empty(name) || !has_key(g:plugs, name) ||
+ \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y'
+ return
+ endif
+
+ call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir)
+ setlocal modifiable
+ normal! "_dap
+ setlocal nomodifiable
+ echo 'Reverted'
+endfunction
+
+function! s:snapshot(force, ...) abort
+ call s:prepare()
+ setf vim
+ call append(0, ['" Generated by vim-plug',
+ \ '" '.strftime("%c"),
+ \ '" :source this file in vim to restore the snapshot',
+ \ '" or execute: vim -S snapshot.vim',
+ \ '', '', 'PlugUpdate!'])
+ 1
+ let anchor = line('$') - 3
+ let names = sort(keys(filter(copy(g:plugs),
+ \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)')))
+ for name in reverse(names)
+ let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir)
+ if !empty(sha)
+ call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
+ redraw
+ endif
+ endfor
+
+ if a:0 > 0
+ let fn = s:plug_expand(a:1)
+ if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?'))
+ return
+ endif
+ call writefile(getline(1, '$'), fn)
+ echo 'Saved as '.a:1
+ silent execute 'e' s:esc(fn)
+ setf vim
+ endif
+endfunction
+
+function! s:split_rtp()
+ return split(&rtp, '\\\@<!,')
+endfunction
+
+let s:first_rtp = s:escrtp(get(s:split_rtp(), 0, ''))
+let s:last_rtp = s:escrtp(get(s:split_rtp(), -1, ''))
+
+if exists('g:plugs')
+ let g:plugs_order = get(g:, 'plugs_order', keys(g:plugs))
+ call s:upgrade_specs()
+ call s:define_commands()
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/nvim/autoload/plug.vim.old b/nvim/autoload/plug.vim.old
@@ -0,0 +1,2541 @@
+" vim-plug: Vim plugin manager
+" ============================
+"
+" Download plug.vim and put it in ~/.vim/autoload
+"
+" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
+" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
+"
+" Edit your .vimrc
+"
+" call plug#begin('~/.vim/plugged')
+"
+" " Make sure you use single quotes
+"
+" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align
+" Plug 'junegunn/vim-easy-align'
+"
+" " Any valid git URL is allowed
+" Plug 'https://github.com/junegunn/vim-github-dashboard.git'
+"
+" " Multiple Plug commands can be written in a single line using | separators
+" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
+"
+" " On-demand loading
+" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }
+" Plug 'tpope/vim-fireplace', { 'for': 'clojure' }
+"
+" " Using a non-master branch
+" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
+"
+" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above)
+" Plug 'fatih/vim-go', { 'tag': '*' }
+"
+" " Plugin options
+" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
+"
+" " Plugin outside ~/.vim/plugged with post-update hook
+" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
+"
+" " Unmanaged plugin (manually installed and updated)
+" Plug '~/my-prototype-plugin'
+"
+" " Initialize plugin system
+" call plug#end()
+"
+" Then reload .vimrc and :PlugInstall to install plugins.
+"
+" Plug options:
+"
+"| Option | Description |
+"| ----------------------- | ------------------------------------------------ |
+"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use |
+"| `rtp` | Subdirectory that contains Vim plugin |
+"| `dir` | Custom directory for the plugin |
+"| `as` | Use different name for the plugin |
+"| `do` | Post-update hook (string or funcref) |
+"| `on` | On-demand loading: Commands or `<Plug>`-mappings |
+"| `for` | On-demand loading: File types |
+"| `frozen` | Do not update unless explicitly specified |
+"
+" More information: https://github.com/junegunn/vim-plug
+"
+"
+" Copyright (c) 2017 Junegunn Choi
+"
+" MIT License
+"
+" Permission is hereby granted, free of charge, to any person obtaining
+" a copy of this software and associated documentation files (the
+" "Software"), to deal in the Software without restriction, including
+" without limitation the rights to use, copy, modify, merge, publish,
+" distribute, sublicense, and/or sell copies of the Software, and to
+" permit persons to whom the Software is furnished to do so, subject to
+" the following conditions:
+"
+" The above copyright notice and this permission notice shall be
+" included in all copies or substantial portions of the Software.
+"
+" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+if exists('g:loaded_plug')
+ finish
+endif
+let g:loaded_plug = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let s:plug_src = 'https://github.com/junegunn/vim-plug.git'
+let s:plug_tab = get(s:, 'plug_tab', -1)
+let s:plug_buf = get(s:, 'plug_buf', -1)
+let s:mac_gui = has('gui_macvim') && has('gui_running')
+let s:is_win = has('win32')
+let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win)
+let s:vim8 = has('patch-8.0.0039') && exists('*job_start')
+let s:me = resolve(expand('<sfile>:p'))
+let s:base_spec = { 'branch': 'master', 'frozen': 0 }
+let s:TYPE = {
+\ 'string': type(''),
+\ 'list': type([]),
+\ 'dict': type({}),
+\ 'funcref': type(function('call'))
+\ }
+let s:loaded = get(s:, 'loaded', {})
+let s:triggers = get(s:, 'triggers', {})
+
+function! plug#begin(...)
+ if a:0 > 0
+ let s:plug_home_org = a:1
+ let home = s:path(fnamemodify(expand(a:1), ':p'))
+ elseif exists('g:plug_home')
+ let home = s:path(g:plug_home)
+ elseif !empty(&rtp)
+ let home = s:path(split(&rtp, ',')[0]) . '/plugged'
+ else
+ return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.')
+ endif
+ if fnamemodify(home, ':t') ==# 'plugin' && fnamemodify(home, ':h') ==# s:first_rtp
+ return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.')
+ endif
+
+ let g:plug_home = home
+ let g:plugs = {}
+ let g:plugs_order = []
+ let s:triggers = {}
+
+ call s:define_commands()
+ return 1
+endfunction
+
+function! s:define_commands()
+ command! -nargs=+ -bar Plug call plug#(<args>)
+ if !executable('git')
+ return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.')
+ endif
+ command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>])
+ command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>])
+ command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0)
+ command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif
+ command! -nargs=0 -bar PlugStatus call s:status()
+ command! -nargs=0 -bar PlugDiff call s:diff()
+ command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(<bang>0, <f-args>)
+endfunction
+
+function! s:to_a(v)
+ return type(a:v) == s:TYPE.list ? a:v : [a:v]
+endfunction
+
+function! s:to_s(v)
+ return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n"
+endfunction
+
+function! s:glob(from, pattern)
+ return s:lines(globpath(a:from, a:pattern))
+endfunction
+
+function! s:source(from, ...)
+ let found = 0
+ for pattern in a:000
+ for vim in s:glob(a:from, pattern)
+ execute 'source' s:esc(vim)
+ let found = 1
+ endfor
+ endfor
+ return found
+endfunction
+
+function! s:assoc(dict, key, val)
+ let a:dict[a:key] = add(get(a:dict, a:key, []), a:val)
+endfunction
+
+function! s:ask(message, ...)
+ call inputsave()
+ echohl WarningMsg
+ let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) '))
+ echohl None
+ call inputrestore()
+ echo "\r"
+ return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0
+endfunction
+
+function! s:ask_no_interrupt(...)
+ try
+ return call('s:ask', a:000)
+ catch
+ return 0
+ endtry
+endfunction
+
+function! s:lazy(plug, opt)
+ return has_key(a:plug, a:opt) &&
+ \ (empty(s:to_a(a:plug[a:opt])) ||
+ \ !isdirectory(a:plug.dir) ||
+ \ len(s:glob(s:rtp(a:plug), 'plugin')) ||
+ \ len(s:glob(s:rtp(a:plug), 'after/plugin')))
+endfunction
+
+function! plug#end()
+ if !exists('g:plugs')
+ return s:err('Call plug#begin() first')
+ endif
+
+ if exists('#PlugLOD')
+ augroup PlugLOD
+ autocmd!
+ augroup END
+ augroup! PlugLOD
+ endif
+ let lod = { 'ft': {}, 'map': {}, 'cmd': {} }
+
+ if exists('g:did_load_filetypes')
+ filetype off
+ endif
+ for name in g:plugs_order
+ if !has_key(g:plugs, name)
+ continue
+ endif
+ let plug = g:plugs[name]
+ if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for')
+ let s:loaded[name] = 1
+ continue
+ endif
+
+ if has_key(plug, 'on')
+ let s:triggers[name] = { 'map': [], 'cmd': [] }
+ for cmd in s:to_a(plug.on)
+ if cmd =~? '^<Plug>.\+'
+ if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i'))
+ call s:assoc(lod.map, cmd, name)
+ endif
+ call add(s:triggers[name].map, cmd)
+ elseif cmd =~# '^[A-Z]'
+ let cmd = substitute(cmd, '!*$', '', '')
+ if exists(':'.cmd) != 2
+ call s:assoc(lod.cmd, cmd, name)
+ endif
+ call add(s:triggers[name].cmd, cmd)
+ else
+ call s:err('Invalid `on` option: '.cmd.
+ \ '. Should start with an uppercase letter or `<Plug>`.')
+ endif
+ endfor
+ endif
+
+ if has_key(plug, 'for')
+ let types = s:to_a(plug.for)
+ if !empty(types)
+ augroup filetypedetect
+ call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim')
+ augroup END
+ endif
+ for type in types
+ call s:assoc(lod.ft, type, name)
+ endfor
+ endif
+ endfor
+
+ for [cmd, names] in items(lod.cmd)
+ execute printf(
+ \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)',
+ \ cmd, string(cmd), string(names))
+ endfor
+
+ for [map, names] in items(lod.map)
+ for [mode, map_prefix, key_prefix] in
+ \ [['i', '<C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
+ execute printf(
+ \ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>',
+ \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix)
+ endfor
+ endfor
+
+ for [ft, names] in items(lod.ft)
+ augroup PlugLOD
+ execute printf('autocmd FileType %s call <SID>lod_ft(%s, %s)',
+ \ ft, string(ft), string(names))
+ augroup END
+ endfor
+
+ call s:reorg_rtp()
+ filetype plugin indent on
+ if has('vim_starting')
+ if has('syntax') && !exists('g:syntax_on')
+ syntax enable
+ end
+ else
+ call s:reload_plugins()
+ endif
+endfunction
+
+function! s:loaded_names()
+ return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)')
+endfunction
+
+function! s:load_plugin(spec)
+ call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim')
+endfunction
+
+function! s:reload_plugins()
+ for name in s:loaded_names()
+ call s:load_plugin(g:plugs[name])
+ endfor
+endfunction
+
+function! s:trim(str)
+ return substitute(a:str, '[\/]\+$', '', '')
+endfunction
+
+function! s:version_requirement(val, min)
+ for idx in range(0, len(a:min) - 1)
+ let v = get(a:val, idx, 0)
+ if v < a:min[idx] | return 0
+ elseif v > a:min[idx] | return 1
+ endif
+ endfor
+ return 1
+endfunction
+
+function! s:git_version_requirement(...)
+ if !exists('s:git_version')
+ let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)')
+ endif
+ return s:version_requirement(s:git_version, a:000)
+endfunction
+
+function! s:progress_opt(base)
+ return a:base && !s:is_win &&
+ \ s:git_version_requirement(1, 7, 1) ? '--progress' : ''
+endfunction
+
+function! s:rtp(spec)
+ return s:path(a:spec.dir . get(a:spec, 'rtp', ''))
+endfunction
+
+if s:is_win
+ function! s:path(path)
+ return s:trim(substitute(a:path, '/', '\', 'g'))
+ endfunction
+
+ function! s:dirpath(path)
+ return s:path(a:path) . '\'
+ endfunction
+
+ function! s:is_local_plug(repo)
+ return a:repo =~? '^[a-z]:\|^[%~]'
+ endfunction
+
+ " Copied from fzf
+ function! s:wrap_cmds(cmds)
+ let use_chcp = executable('sed')
+ return map([
+ \ '@echo off',
+ \ 'setlocal enabledelayedexpansion']
+ \ + (use_chcp ? [
+ \ 'for /f "usebackq" %%a in (`chcp ^| sed "s/[^0-9]//gp"`) do set origchcp=%%a',
+ \ 'chcp 65001 > nul'] : [])
+ \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds])
+ \ + (use_chcp ? ['chcp !origchcp! > nul'] : [])
+ \ + ['endlocal'],
+ \ 'v:val."\r"')
+ endfunction
+
+ function! s:batchfile(cmd)
+ let batchfile = tempname().'.bat'
+ call writefile(s:wrap_cmds(a:cmd), batchfile)
+ let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 1})
+ if &shell =~# 'powershell\.exe$'
+ let cmd = '& ' . cmd
+ endif
+ return [batchfile, cmd]
+ endfunction
+else
+ function! s:path(path)
+ return s:trim(a:path)
+ endfunction
+
+ function! s:dirpath(path)
+ return substitute(a:path, '[/\\]*$', '/', '')
+ endfunction
+
+ function! s:is_local_plug(repo)
+ return a:repo[0] =~ '[/$~]'
+ endfunction
+endif
+
+function! s:err(msg)
+ echohl ErrorMsg
+ echom '[vim-plug] '.a:msg
+ echohl None
+endfunction
+
+function! s:warn(cmd, msg)
+ echohl WarningMsg
+ execute a:cmd 'a:msg'
+ echohl None
+endfunction
+
+function! s:esc(path)
+ return escape(a:path, ' ')
+endfunction
+
+function! s:escrtp(path)
+ return escape(a:path, ' ,')
+endfunction
+
+function! s:remove_rtp()
+ for name in s:loaded_names()
+ let rtp = s:rtp(g:plugs[name])
+ execute 'set rtp-='.s:escrtp(rtp)
+ let after = globpath(rtp, 'after')
+ if isdirectory(after)
+ execute 'set rtp-='.s:escrtp(after)
+ endif
+ endfor
+endfunction
+
+function! s:reorg_rtp()
+ if !empty(s:first_rtp)
+ execute 'set rtp-='.s:first_rtp
+ execute 'set rtp-='.s:last_rtp
+ endif
+
+ " &rtp is modified from outside
+ if exists('s:prtp') && s:prtp !=# &rtp
+ call s:remove_rtp()
+ unlet! s:middle
+ endif
+
+ let s:middle = get(s:, 'middle', &rtp)
+ let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])')
+ let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)')
+ let rtp = join(map(rtps, 'escape(v:val, ",")'), ',')
+ \ . ','.s:middle.','
+ \ . join(map(afters, 'escape(v:val, ",")'), ',')
+ let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g')
+ let s:prtp = &rtp
+
+ if !empty(s:first_rtp)
+ execute 'set rtp^='.s:first_rtp
+ execute 'set rtp+='.s:last_rtp
+ endif
+endfunction
+
+function! s:doautocmd(...)
+ if exists('#'.join(a:000, '#'))
+ execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '<nomodeline>' : '') join(a:000)
+ endif
+endfunction
+
+function! s:dobufread(names)
+ for name in a:names
+ let path = s:rtp(g:plugs[name])
+ for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin']
+ if len(finddir(dir, path))
+ if exists('#BufRead')
+ doautocmd BufRead
+ endif
+ return
+ endif
+ endfor
+ endfor
+endfunction
+
+function! plug#load(...)
+ if a:0 == 0
+ return s:err('Argument missing: plugin name(s) required')
+ endif
+ if !exists('g:plugs')
+ return s:err('plug#begin was not called')
+ endif
+ let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000
+ let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)')
+ if !empty(unknowns)
+ let s = len(unknowns) > 1 ? 's' : ''
+ return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', ')))
+ end
+ let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)')
+ if !empty(unloaded)
+ for name in unloaded
+ call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
+ endfor
+ call s:dobufread(unloaded)
+ return 1
+ end
+ return 0
+endfunction
+
+function! s:remove_triggers(name)
+ if !has_key(s:triggers, a:name)
+ return
+ endif
+ for cmd in s:triggers[a:name].cmd
+ execute 'silent! delc' cmd
+ endfor
+ for map in s:triggers[a:name].map
+ execute 'silent! unmap' map
+ execute 'silent! iunmap' map
+ endfor
+ call remove(s:triggers, a:name)
+endfunction
+
+function! s:lod(names, types, ...)
+ for name in a:names
+ call s:remove_triggers(name)
+ let s:loaded[name] = 1
+ endfor
+ call s:reorg_rtp()
+
+ for name in a:names
+ let rtp = s:rtp(g:plugs[name])
+ for dir in a:types
+ call s:source(rtp, dir.'/**/*.vim')
+ endfor
+ if a:0
+ if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2))
+ execute 'runtime' a:1
+ endif
+ call s:source(rtp, a:2)
+ endif
+ call s:doautocmd('User', name)
+ endfor
+endfunction
+
+function! s:lod_ft(pat, names)
+ let syn = 'syntax/'.a:pat.'.vim'
+ call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn)
+ execute 'autocmd! PlugLOD FileType' a:pat
+ call s:doautocmd('filetypeplugin', 'FileType')
+ call s:doautocmd('filetypeindent', 'FileType')
+endfunction
+
+function! s:lod_cmd(cmd, bang, l1, l2, args, names)
+ call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
+ call s:dobufread(a:names)
+ execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args)
+endfunction
+
+function! s:lod_map(map, names, with_prefix, prefix)
+ call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin'])
+ call s:dobufread(a:names)
+ let extra = ''
+ while 1
+ let c = getchar(0)
+ if c == 0
+ break
+ endif
+ let extra .= nr2char(c)
+ endwhile
+
+ if a:with_prefix
+ let prefix = v:count ? v:count : ''
+ let prefix .= '"'.v:register.a:prefix
+ if mode(1) == 'no'
+ if v:operator == 'c'
+ let prefix = "\<esc>" . prefix
+ endif
+ let prefix .= v:operator
+ endif
+ call feedkeys(prefix, 'n')
+ endif
+ call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra)
+endfunction
+
+function! plug#(repo, ...)
+ if a:0 > 1
+ return s:err('Invalid number of arguments (1..2)')
+ endif
+
+ try
+ let repo = s:trim(a:repo)
+ let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec
+ let name = get(opts, 'as', fnamemodify(repo, ':t:s?\.git$??'))
+ let spec = extend(s:infer_properties(name, repo), opts)
+ if !has_key(g:plugs, name)
+ call add(g:plugs_order, name)
+ endif
+ let g:plugs[name] = spec
+ let s:loaded[name] = get(s:loaded, name, 0)
+ catch
+ return s:err(v:exception)
+ endtry
+endfunction
+
+function! s:parse_options(arg)
+ let opts = copy(s:base_spec)
+ let type = type(a:arg)
+ if type == s:TYPE.string
+ let opts.tag = a:arg
+ elseif type == s:TYPE.dict
+ call extend(opts, a:arg)
+ if has_key(opts, 'dir')
+ let opts.dir = s:dirpath(expand(opts.dir))
+ endif
+ else
+ throw 'Invalid argument type (expected: string or dictionary)'
+ endif
+ return opts
+endfunction
+
+function! s:infer_properties(name, repo)
+ let repo = a:repo
+ if s:is_local_plug(repo)
+ return { 'dir': s:dirpath(expand(repo)) }
+ else
+ if repo =~ ':'
+ let uri = repo
+ else
+ if repo !~ '/'
+ throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo)
+ endif
+ let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git')
+ let uri = printf(fmt, repo)
+ endif
+ return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri }
+ endif
+endfunction
+
+function! s:install(force, names)
+ call s:update_impl(0, a:force, a:names)
+endfunction
+
+function! s:update(force, names)
+ call s:update_impl(1, a:force, a:names)
+endfunction
+
+function! plug#helptags()
+ if !exists('g:plugs')
+ return s:err('plug#begin was not called')
+ endif
+ for spec in values(g:plugs)
+ let docd = join([s:rtp(spec), 'doc'], '/')
+ if isdirectory(docd)
+ silent! execute 'helptags' s:esc(docd)
+ endif
+ endfor
+ return 1
+endfunction
+
+function! s:syntax()
+ syntax clear
+ syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber
+ syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX
+ syn match plugNumber /[0-9]\+[0-9.]*/ contained
+ syn match plugBracket /[[\]]/ contained
+ syn match plugX /x/ contained
+ syn match plugDash /^-/
+ syn match plugPlus /^+/
+ syn match plugStar /^*/
+ syn match plugMessage /\(^- \)\@<=.*/
+ syn match plugName /\(^- \)\@<=[^ ]*:/
+ syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/
+ syn match plugTag /(tag: [^)]\+)/
+ syn match plugInstall /\(^+ \)\@<=[^:]*/
+ syn match plugUpdate /\(^* \)\@<=[^:]*/
+ syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag
+ syn match plugEdge /^ \X\+$/
+ syn match plugEdge /^ \X*/ contained nextgroup=plugSha
+ syn match plugSha /[0-9a-f]\{7,9}/ contained
+ syn match plugRelDate /([^)]*)$/ contained
+ syn match plugNotLoaded /(not loaded)$/
+ syn match plugError /^x.*/
+ syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/
+ syn match plugH2 /^.*:\n-\+$/
+ syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
+ hi def link plug1 Title
+ hi def link plug2 Repeat
+ hi def link plugH2 Type
+ hi def link plugX Exception
+ hi def link plugBracket Structure
+ hi def link plugNumber Number
+
+ hi def link plugDash Special
+ hi def link plugPlus Constant
+ hi def link plugStar Boolean
+
+ hi def link plugMessage Function
+ hi def link plugName Label
+ hi def link plugInstall Function
+ hi def link plugUpdate Type
+
+ hi def link plugError Error
+ hi def link plugDeleted Ignore
+ hi def link plugRelDate Comment
+ hi def link plugEdge PreProc
+ hi def link plugSha Identifier
+ hi def link plugTag Constant
+
+ hi def link plugNotLoaded Comment
+endfunction
+
+function! s:lpad(str, len)
+ return a:str . repeat(' ', a:len - len(a:str))
+endfunction
+
+function! s:lines(msg)
+ return split(a:msg, "[\r\n]")
+endfunction
+
+function! s:lastline(msg)
+ return get(s:lines(a:msg), -1, '')
+endfunction
+
+function! s:new_window()
+ execute get(g:, 'plug_window', 'vertical topleft new')
+endfunction
+
+function! s:plug_window_exists()
+ let buflist = tabpagebuflist(s:plug_tab)
+ return !empty(buflist) && index(buflist, s:plug_buf) >= 0
+endfunction
+
+function! s:switch_in()
+ if !s:plug_window_exists()
+ return 0
+ endif
+
+ if winbufnr(0) != s:plug_buf
+ let s:pos = [tabpagenr(), winnr(), winsaveview()]
+ execute 'normal!' s:plug_tab.'gt'
+ let winnr = bufwinnr(s:plug_buf)
+ execute winnr.'wincmd w'
+ call add(s:pos, winsaveview())
+ else
+ let s:pos = [winsaveview()]
+ endif
+
+ setlocal modifiable
+ return 1
+endfunction
+
+function! s:switch_out(...)
+ call winrestview(s:pos[-1])
+ setlocal nomodifiable
+ if a:0 > 0
+ execute a:1
+ endif
+
+ if len(s:pos) > 1
+ execute 'normal!' s:pos[0].'gt'
+ execute s:pos[1] 'wincmd w'
+ call winrestview(s:pos[2])
+ endif
+endfunction
+
+function! s:finish_bindings()
+ nnoremap <silent> <buffer> R :call <SID>retry()<cr>
+ nnoremap <silent> <buffer> D :PlugDiff<cr>
+ nnoremap <silent> <buffer> S :PlugStatus<cr>
+ nnoremap <silent> <buffer> U :call <SID>status_update()<cr>
+ xnoremap <silent> <buffer> U :call <SID>status_update()<cr>
+ nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr>
+ nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr>
+endfunction
+
+function! s:prepare(...)
+ if empty(getcwd())
+ throw 'Invalid current working directory. Cannot proceed.'
+ endif
+
+ for evar in ['$GIT_DIR', '$GIT_WORK_TREE']
+ if exists(evar)
+ throw evar.' detected. Cannot proceed.'
+ endif
+ endfor
+
+ call s:job_abort()
+ if s:switch_in()
+ if b:plug_preview == 1
+ pc
+ endif
+ enew
+ else
+ call s:new_window()
+ endif
+
+ nnoremap <silent> <buffer> q :if b:plug_preview==1<bar>pc<bar>endif<bar>bd<cr>
+ if a:0 == 0
+ call s:finish_bindings()
+ endif
+ let b:plug_preview = -1
+ let s:plug_tab = tabpagenr()
+ let s:plug_buf = winbufnr(0)
+ call s:assign_name()
+
+ for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd']
+ execute 'silent! unmap <buffer>' k
+ endfor
+ setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell
+ if exists('+colorcolumn')
+ setlocal colorcolumn=
+ endif
+ setf vim-plug
+ if exists('g:syntax_on')
+ call s:syntax()
+ endif
+endfunction
+
+function! s:assign_name()
+ " Assign buffer name
+ let prefix = '[Plugins]'
+ let name = prefix
+ let idx = 2
+ while bufexists(name)
+ let name = printf('%s (%s)', prefix, idx)
+ let idx = idx + 1
+ endwhile
+ silent! execute 'f' fnameescape(name)
+endfunction
+
+function! s:chsh(swap)
+ let prev = [&shell, &shellcmdflag, &shellredir]
+ if !s:is_win && a:swap
+ set shell=sh shellredir=>%s\ 2>&1
+ endif
+ return prev
+endfunction
+
+function! s:bang(cmd, ...)
+ let batchfile = ''
+ try
+ let [sh, shellcmdflag, shrd] = s:chsh(a:0)
+ " FIXME: Escaping is incomplete. We could use shellescape with eval,
+ " but it won't work on Windows.
+ let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd
+ if s:is_win
+ let [batchfile, cmd] = s:batchfile(cmd)
+ endif
+ let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%')
+ execute "normal! :execute g:_plug_bang\<cr>\<cr>"
+ finally
+ unlet g:_plug_bang
+ let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
+ if s:is_win && filereadable(batchfile)
+ call delete(batchfile)
+ endif
+ endtry
+ return v:shell_error ? 'Exit status: ' . v:shell_error : ''
+endfunction
+
+function! s:regress_bar()
+ let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '')
+ call s:progress_bar(2, bar, len(bar))
+endfunction
+
+function! s:is_updated(dir)
+ return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir))
+endfunction
+
+function! s:do(pull, force, todo)
+ for [name, spec] in items(a:todo)
+ if !isdirectory(spec.dir)
+ continue
+ endif
+ let installed = has_key(s:update.new, name)
+ let updated = installed ? 0 :
+ \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir))
+ if a:force || installed || updated
+ execute 'cd' s:esc(spec.dir)
+ call append(3, '- Post-update hook for '. name .' ... ')
+ let error = ''
+ let type = type(spec.do)
+ if type == s:TYPE.string
+ if spec.do[0] == ':'
+ if !get(s:loaded, name, 0)
+ let s:loaded[name] = 1
+ call s:reorg_rtp()
+ endif
+ call s:load_plugin(spec)
+ try
+ execute spec.do[1:]
+ catch
+ let error = v:exception
+ endtry
+ if !s:plug_window_exists()
+ cd -
+ throw 'Warning: vim-plug was terminated by the post-update hook of '.name
+ endif
+ else
+ let error = s:bang(spec.do)
+ endif
+ elseif type == s:TYPE.funcref
+ try
+ let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged')
+ call spec.do({ 'name': name, 'status': status, 'force': a:force })
+ catch
+ let error = v:exception
+ endtry
+ else
+ let error = 'Invalid hook type'
+ endif
+ call s:switch_in()
+ call setline(4, empty(error) ? (getline(4) . 'OK')
+ \ : ('x' . getline(4)[1:] . error))
+ if !empty(error)
+ call add(s:update.errors, name)
+ call s:regress_bar()
+ endif
+ cd -
+ endif
+ endfor
+endfunction
+
+function! s:hash_match(a, b)
+ return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0
+endfunction
+
+function! s:checkout(spec)
+ let sha = a:spec.commit
+ let output = s:system('git rev-parse HEAD', a:spec.dir)
+ if !v:shell_error && !s:hash_match(sha, s:lines(output)[0])
+ let output = s:system(
+ \ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir)
+ endif
+ return output
+endfunction
+
+function! s:finish(pull)
+ let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen'))
+ if new_frozen
+ let s = new_frozen > 1 ? 's' : ''
+ call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s))
+ endif
+ call append(3, '- Finishing ... ') | 4
+ redraw
+ call plug#helptags()
+ call plug#end()
+ call setline(4, getline(4) . 'Done!')
+ redraw
+ let msgs = []
+ if !empty(s:update.errors)
+ call add(msgs, "Press 'R' to retry.")
+ endif
+ if a:pull && len(s:update.new) < len(filter(getline(5, '$'),
+ \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'"))
+ call add(msgs, "Press 'D' to see the updated changes.")
+ endif
+ echo join(msgs, ' ')
+ call s:finish_bindings()
+endfunction
+
+function! s:retry()
+ if empty(s:update.errors)
+ return
+ endif
+ echo
+ call s:update_impl(s:update.pull, s:update.force,
+ \ extend(copy(s:update.errors), [s:update.threads]))
+endfunction
+
+function! s:is_managed(name)
+ return has_key(g:plugs[a:name], 'uri')
+endfunction
+
+function! s:names(...)
+ return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)'))
+endfunction
+
+function! s:check_ruby()
+ silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'")
+ if !exists('g:plug_ruby')
+ redraw!
+ return s:warn('echom', 'Warning: Ruby interface is broken')
+ endif
+ let ruby_version = split(g:plug_ruby, '\.')
+ unlet g:plug_ruby
+ return s:version_requirement(ruby_version, [1, 8, 7])
+endfunction
+
+function! s:update_impl(pull, force, args) abort
+ let sync = index(a:args, '--sync') >= 0 || has('vim_starting')
+ let args = filter(copy(a:args), 'v:val != "--sync"')
+ let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
+ \ remove(args, -1) : get(g:, 'plug_threads', 16)
+
+ let managed = filter(copy(g:plugs), 's:is_managed(v:key)')
+ let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') :
+ \ filter(managed, 'index(args, v:key) >= 0')
+
+ if empty(todo)
+ return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install'))
+ endif
+
+ if !s:is_win && s:git_version_requirement(2, 3)
+ let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : ''
+ let $GIT_TERMINAL_PROMPT = 0
+ for plug in values(todo)
+ let plug.uri = substitute(plug.uri,
+ \ '^https://git::@github\.com', 'https://github.com', '')
+ endfor
+ endif
+
+ if !isdirectory(g:plug_home)
+ try
+ call mkdir(g:plug_home, 'p')
+ catch
+ return s:err(printf('Invalid plug directory: %s. '.
+ \ 'Try to call plug#begin with a valid directory', g:plug_home))
+ endtry
+ endif
+
+ if has('nvim') && !exists('*jobwait') && threads > 1
+ call s:warn('echom', '[vim-plug] Update Neovim for parallel installer')
+ endif
+
+ let use_job = s:nvim || s:vim8
+ let python = (has('python') || has('python3')) && !use_job
+ let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby()
+
+ let s:update = {
+ \ 'start': reltime(),
+ \ 'all': todo,
+ \ 'todo': copy(todo),
+ \ 'errors': [],
+ \ 'pull': a:pull,
+ \ 'force': a:force,
+ \ 'new': {},
+ \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1,
+ \ 'bar': '',
+ \ 'fin': 0
+ \ }
+
+ call s:prepare(1)
+ call append(0, ['', ''])
+ normal! 2G
+ silent! redraw
+
+ let s:clone_opt = get(g:, 'plug_shallow', 1) ?
+ \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : ''
+
+ if has('win32unix') || has('wsl')
+ let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input'
+ endif
+
+ let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : ''
+
+ " Python version requirement (>= 2.7)
+ if python && !has('python3') && !ruby && !use_job && s:update.threads > 1
+ redir => pyv
+ silent python import platform; print platform.python_version()
+ redir END
+ let python = s:version_requirement(
+ \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6])
+ endif
+
+ if (python || ruby) && s:update.threads > 1
+ try
+ let imd = &imd
+ if s:mac_gui
+ set noimd
+ endif
+ if ruby
+ call s:update_ruby()
+ else
+ call s:update_python()
+ endif
+ catch
+ let lines = getline(4, '$')
+ let printed = {}
+ silent! 4,$d _
+ for line in lines
+ let name = s:extract_name(line, '.', '')
+ if empty(name) || !has_key(printed, name)
+ call append('$', line)
+ if !empty(name)
+ let printed[name] = 1
+ if line[0] == 'x' && index(s:update.errors, name) < 0
+ call add(s:update.errors, name)
+ end
+ endif
+ endif
+ endfor
+ finally
+ let &imd = imd
+ call s:update_finish()
+ endtry
+ else
+ call s:update_vim()
+ while use_job && sync
+ sleep 100m
+ if s:update.fin
+ break
+ endif
+ endwhile
+ endif
+endfunction
+
+function! s:log4(name, msg)
+ call setline(4, printf('- %s (%s)', a:msg, a:name))
+ redraw
+endfunction
+
+function! s:update_finish()
+ if exists('s:git_terminal_prompt')
+ let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt
+ endif
+ if s:switch_in()
+ call append(3, '- Updating ...') | 4
+ for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))'))
+ let [pos, _] = s:logpos(name)
+ if !pos
+ continue
+ endif
+ if has_key(spec, 'commit')
+ call s:log4(name, 'Checking out '.spec.commit)
+ let out = s:checkout(spec)
+ elseif has_key(spec, 'tag')
+ let tag = spec.tag
+ if tag =~ '\*'
+ let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir))
+ if !v:shell_error && !empty(tags)
+ let tag = tags[0]
+ call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag))
+ call append(3, '')
+ endif
+ endif
+ call s:log4(name, 'Checking out '.tag)
+ let out = s:system('git checkout -q '.s:esc(tag).' -- 2>&1', spec.dir)
+ else
+ let branch = s:esc(get(spec, 'branch', 'master'))
+ call s:log4(name, 'Merging origin/'.branch)
+ let out = s:system('git checkout -q '.branch.' -- 2>&1'
+ \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir)
+ endif
+ if !v:shell_error && filereadable(spec.dir.'/.gitmodules') &&
+ \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir))
+ call s:log4(name, 'Updating submodules. This may take a while.')
+ let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir)
+ endif
+ let msg = s:format_message(v:shell_error ? 'x': '-', name, out)
+ if v:shell_error
+ call add(s:update.errors, name)
+ call s:regress_bar()
+ silent execute pos 'd _'
+ call append(4, msg) | 4
+ elseif !empty(out)
+ call setline(pos, msg[0])
+ endif
+ redraw
+ endfor
+ silent 4 d _
+ try
+ call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")'))
+ catch
+ call s:warn('echom', v:exception)
+ call s:warn('echo', '')
+ return
+ endtry
+ call s:finish(s:update.pull)
+ call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.')
+ call s:switch_out('normal! gg')
+ endif
+endfunction
+
+function! s:job_abort()
+ if (!s:nvim && !s:vim8) || !exists('s:jobs')
+ return
+ endif
+
+ for [name, j] in items(s:jobs)
+ if s:nvim
+ silent! call jobstop(j.jobid)
+ elseif s:vim8
+ silent! call job_stop(j.jobid)
+ endif
+ if j.new
+ call s:system('rm -rf ' . plug#shellescape(g:plugs[name].dir))
+ endif
+ endfor
+ let s:jobs = {}
+endfunction
+
+function! s:last_non_empty_line(lines)
+ let len = len(a:lines)
+ for idx in range(len)
+ let line = a:lines[len-idx-1]
+ if !empty(line)
+ return line
+ endif
+ endfor
+ return ''
+endfunction
+
+function! s:job_out_cb(self, data) abort
+ let self = a:self
+ let data = remove(self.lines, -1) . a:data
+ let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]')
+ call extend(self.lines, lines)
+ " To reduce the number of buffer updates
+ let self.tick = get(self, 'tick', -1) + 1
+ if !self.running || self.tick % len(s:jobs) == 0
+ let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-')
+ let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines)
+ call s:log(bullet, self.name, result)
+ endif
+endfunction
+
+function! s:job_exit_cb(self, data) abort
+ let a:self.running = 0
+ let a:self.error = a:data != 0
+ call s:reap(a:self.name)
+ call s:tick()
+endfunction
+
+function! s:job_cb(fn, job, ch, data)
+ if !s:plug_window_exists() " plug window closed
+ return s:job_abort()
+ endif
+ call call(a:fn, [a:job, a:data])
+endfunction
+
+function! s:nvim_cb(job_id, data, event) dict abort
+ return a:event == 'stdout' ?
+ \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) :
+ \ s:job_cb('s:job_exit_cb', self, 0, a:data)
+endfunction
+
+function! s:spawn(name, cmd, opts)
+ let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''],
+ \ 'new': get(a:opts, 'new', 0) }
+ let s:jobs[a:name] = job
+ let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir, 0) : a:cmd
+ let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd]
+
+ if s:nvim
+ call extend(job, {
+ \ 'on_stdout': function('s:nvim_cb'),
+ \ 'on_exit': function('s:nvim_cb'),
+ \ })
+ let jid = jobstart(argv, job)
+ if jid > 0
+ let job.jobid = jid
+ else
+ let job.running = 0
+ let job.error = 1
+ let job.lines = [jid < 0 ? argv[0].' is not executable' :
+ \ 'Invalid arguments (or job table is full)']
+ endif
+ elseif s:vim8
+ let jid = job_start(s:is_win ? join(argv, ' ') : argv, {
+ \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]),
+ \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]),
+ \ 'out_mode': 'raw'
+ \})
+ if job_status(jid) == 'run'
+ let job.jobid = jid
+ else
+ let job.running = 0
+ let job.error = 1
+ let job.lines = ['Failed to start job']
+ endif
+ else
+ let job.lines = s:lines(call('s:system', [cmd]))
+ let job.error = v:shell_error != 0
+ let job.running = 0
+ endif
+endfunction
+
+function! s:reap(name)
+ let job = s:jobs[a:name]
+ if job.error
+ call add(s:update.errors, a:name)
+ elseif get(job, 'new', 0)
+ let s:update.new[a:name] = 1
+ endif
+ let s:update.bar .= job.error ? 'x' : '='
+
+ let bullet = job.error ? 'x' : '-'
+ let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines)
+ call s:log(bullet, a:name, empty(result) ? 'OK' : result)
+ call s:bar()
+
+ call remove(s:jobs, a:name)
+endfunction
+
+function! s:bar()
+ if s:switch_in()
+ let total = len(s:update.all)
+ call setline(1, (s:update.pull ? 'Updating' : 'Installing').
+ \ ' plugins ('.len(s:update.bar).'/'.total.')')
+ call s:progress_bar(2, s:update.bar, total)
+ call s:switch_out()
+ endif
+endfunction
+
+function! s:logpos(name)
+ for i in range(4, line('$'))
+ if getline(i) =~# '^[-+x*] '.a:name.':'
+ for j in range(i + 1, line('$'))
+ if getline(j) !~ '^ '
+ return [i, j - 1]
+ endif
+ endfor
+ return [i, i]
+ endif
+ endfor
+ return [0, 0]
+endfunction
+
+function! s:log(bullet, name, lines)
+ if s:switch_in()
+ let [b, e] = s:logpos(a:name)
+ if b > 0
+ silent execute printf('%d,%d d _', b, e)
+ if b > winheight('.')
+ let b = 4
+ endif
+ else
+ let b = 4
+ endif
+ " FIXME For some reason, nomodifiable is set after :d in vim8
+ setlocal modifiable
+ call append(b - 1, s:format_message(a:bullet, a:name, a:lines))
+ call s:switch_out()
+ endif
+endfunction
+
+function! s:update_vim()
+ let s:jobs = {}
+
+ call s:bar()
+ call s:tick()
+endfunction
+
+function! s:tick()
+ let pull = s:update.pull
+ let prog = s:progress_opt(s:nvim || s:vim8)
+while 1 " Without TCO, Vim stack is bound to explode
+ if empty(s:update.todo)
+ if empty(s:jobs) && !s:update.fin
+ call s:update_finish()
+ let s:update.fin = 1
+ endif
+ return
+ endif
+
+ let name = keys(s:update.todo)[0]
+ let spec = remove(s:update.todo, name)
+ let new = empty(globpath(spec.dir, '.git', 1))
+
+ call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
+ redraw
+
+ let has_tag = has_key(spec, 'tag')
+ if !new
+ let [error, _] = s:git_validate(spec, 0)
+ if empty(error)
+ if pull
+ let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : ''
+ call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir })
+ else
+ let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 }
+ endif
+ else
+ let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 }
+ endif
+ else
+ call s:spawn(name,
+ \ printf('git clone %s %s %s %s 2>&1',
+ \ has_tag ? '' : s:clone_opt,
+ \ prog,
+ \ plug#shellescape(spec.uri, {'script': 0}),
+ \ plug#shellescape(s:trim(spec.dir), {'script': 0})), { 'new': 1 })
+ endif
+
+ if !s:jobs[name].running
+ call s:reap(name)
+ endif
+ if len(s:jobs) >= s:update.threads
+ break
+ endif
+endwhile
+endfunction
+
+function! s:update_python()
+let py_exe = has('python') ? 'python' : 'python3'
+execute py_exe "<< EOF"
+import datetime
+import functools
+import os
+try:
+ import queue
+except ImportError:
+ import Queue as queue
+import random
+import re
+import shutil
+import signal
+import subprocess
+import tempfile
+import threading as thr
+import time
+import traceback
+import vim
+
+G_NVIM = vim.eval("has('nvim')") == '1'
+G_PULL = vim.eval('s:update.pull') == '1'
+G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1
+G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)'))
+G_CLONE_OPT = vim.eval('s:clone_opt')
+G_PROGRESS = vim.eval('s:progress_opt(1)')
+G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
+G_STOP = thr.Event()
+G_IS_WIN = vim.eval('s:is_win') == '1'
+
+class PlugError(Exception):
+ def __init__(self, msg):
+ self.msg = msg
+class CmdTimedOut(PlugError):
+ pass
+class CmdFailed(PlugError):
+ pass
+class InvalidURI(PlugError):
+ pass
+class Action(object):
+ INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-']
+
+class Buffer(object):
+ def __init__(self, lock, num_plugs, is_pull):
+ self.bar = ''
+ self.event = 'Updating' if is_pull else 'Installing'
+ self.lock = lock
+ self.maxy = int(vim.eval('winheight(".")'))
+ self.num_plugs = num_plugs
+
+ def __where(self, name):
+ """ Find first line with name in current buffer. Return line num. """
+ found, lnum = False, 0
+ matcher = re.compile('^[-+x*] {0}:'.format(name))
+ for line in vim.current.buffer:
+ if matcher.search(line) is not None:
+ found = True
+ break
+ lnum += 1
+
+ if not found:
+ lnum = -1
+ return lnum
+
+ def header(self):
+ curbuf = vim.current.buffer
+ curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs)
+
+ num_spaces = self.num_plugs - len(self.bar)
+ curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ')
+
+ with self.lock:
+ vim.command('normal! 2G')
+ vim.command('redraw')
+
+ def write(self, action, name, lines):
+ first, rest = lines[0], lines[1:]
+ msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)]
+ msg.extend([' ' + line for line in rest])
+
+ try:
+ if action == Action.ERROR:
+ self.bar += 'x'
+ vim.command("call add(s:update.errors, '{0}')".format(name))
+ elif action == Action.DONE:
+ self.bar += '='
+
+ curbuf = vim.current.buffer
+ lnum = self.__where(name)
+ if lnum != -1: # Found matching line num
+ del curbuf[lnum]
+ if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]):
+ lnum = 3
+ else:
+ lnum = 3
+ curbuf.append(msg, lnum)
+
+ self.header()
+ except vim.error:
+ pass
+
+class Command(object):
+ CD = 'cd /d' if G_IS_WIN else 'cd'
+
+ def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None):
+ self.cmd = cmd
+ if cmd_dir:
+ self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd)
+ self.timeout = timeout
+ self.callback = cb if cb else (lambda msg: None)
+ self.clean = clean if clean else (lambda: None)
+ self.proc = None
+
+ @property
+ def alive(self):
+ """ Returns true only if command still running. """
+ return self.proc and self.proc.poll() is None
+
+ def execute(self, ntries=3):
+ """ Execute the command with ntries if CmdTimedOut.
+ Returns the output of the command if no Exception.
+ """
+ attempt, finished, limit = 0, False, self.timeout
+
+ while not finished:
+ try:
+ attempt += 1
+ result = self.try_command()
+ finished = True
+ return result
+ except CmdTimedOut:
+ if attempt != ntries:
+ self.notify_retry()
+ self.timeout += limit
+ else:
+ raise
+
+ def notify_retry(self):
+ """ Retry required for command, notify user. """
+ for count in range(3, 0, -1):
+ if G_STOP.is_set():
+ raise KeyboardInterrupt
+ msg = 'Timeout. Will retry in {0} second{1} ...'.format(
+ count, 's' if count != 1 else '')
+ self.callback([msg])
+ time.sleep(1)
+ self.callback(['Retrying ...'])
+
+ def try_command(self):
+ """ Execute a cmd & poll for callback. Returns list of output.
+ Raises CmdFailed -> return code for Popen isn't 0
+ Raises CmdTimedOut -> command exceeded timeout without new output
+ """
+ first_line = True
+
+ try:
+ tfile = tempfile.NamedTemporaryFile(mode='w+b')
+ preexec_fn = not G_IS_WIN and os.setsid or None
+ self.proc = subprocess.Popen(self.cmd, stdout=tfile,
+ stderr=subprocess.STDOUT,
+ stdin=subprocess.PIPE, shell=True,
+ preexec_fn=preexec_fn)
+ thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,))
+ thrd.start()
+
+ thread_not_started = True
+ while thread_not_started:
+ try:
+ thrd.join(0.1)
+ thread_not_started = False
+ except RuntimeError:
+ pass
+
+ while self.alive:
+ if G_STOP.is_set():
+ raise KeyboardInterrupt
+
+ if first_line or random.random() < G_LOG_PROB:
+ first_line = False
+ line = '' if G_IS_WIN else nonblock_read(tfile.name)
+ if line:
+ self.callback([line])
+
+ time_diff = time.time() - os.path.getmtime(tfile.name)
+ if time_diff > self.timeout:
+ raise CmdTimedOut(['Timeout!'])
+
+ thrd.join(0.5)
+
+ tfile.seek(0)
+ result = [line.decode('utf-8', 'replace').rstrip() for line in tfile]
+
+ if self.proc.returncode != 0:
+ raise CmdFailed([''] + result)
+
+ return result
+ except:
+ self.terminate()
+ raise
+
+ def terminate(self):
+ """ Terminate process and cleanup. """
+ if self.alive:
+ if G_IS_WIN:
+ os.kill(self.proc.pid, signal.SIGINT)
+ else:
+ os.killpg(self.proc.pid, signal.SIGTERM)
+ self.clean()
+
+class Plugin(object):
+ def __init__(self, name, args, buf_q, lock):
+ self.name = name
+ self.args = args
+ self.buf_q = buf_q
+ self.lock = lock
+ self.tag = args.get('tag', 0)
+
+ def manage(self):
+ try:
+ if os.path.exists(self.args['dir']):
+ self.update()
+ else:
+ self.install()
+ with self.lock:
+ thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
+ except PlugError as exc:
+ self.write(Action.ERROR, self.name, exc.msg)
+ except KeyboardInterrupt:
+ G_STOP.set()
+ self.write(Action.ERROR, self.name, ['Interrupted!'])
+ except:
+ # Any exception except those above print stack trace
+ msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip())
+ self.write(Action.ERROR, self.name, msg.split('\n'))
+ raise
+
+ def install(self):
+ target = self.args['dir']
+ if target[-1] == '\\':
+ target = target[0:-1]
+
+ def clean(target):
+ def _clean():
+ try:
+ shutil.rmtree(target)
+ except OSError:
+ pass
+ return _clean
+
+ self.write(Action.INSTALL, self.name, ['Installing ...'])
+ callback = functools.partial(self.write, Action.INSTALL, self.name)
+ cmd = 'git clone {0} {1} {2} {3} 2>&1'.format(
+ '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'],
+ esc(target))
+ com = Command(cmd, None, G_TIMEOUT, callback, clean(target))
+ result = com.execute(G_RETRIES)
+ self.write(Action.DONE, self.name, result[-1:])
+
+ def repo_uri(self):
+ cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url'
+ command = Command(cmd, self.args['dir'], G_TIMEOUT,)
+ result = command.execute(G_RETRIES)
+ return result[-1]
+
+ def update(self):
+ actual_uri = self.repo_uri()
+ expect_uri = self.args['uri']
+ regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$')
+ ma = regex.match(actual_uri)
+ mb = regex.match(expect_uri)
+ if ma is None or mb is None or ma.groups() != mb.groups():
+ msg = ['',
+ 'Invalid URI: {0}'.format(actual_uri),
+ 'Expected {0}'.format(expect_uri),
+ 'PlugClean required.']
+ raise InvalidURI(msg)
+
+ if G_PULL:
+ self.write(Action.UPDATE, self.name, ['Updating ...'])
+ callback = functools.partial(self.write, Action.UPDATE, self.name)
+ fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else ''
+ cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS)
+ com = Command(cmd, self.args['dir'], G_TIMEOUT, callback)
+ result = com.execute(G_RETRIES)
+ self.write(Action.DONE, self.name, result[-1:])
+ else:
+ self.write(Action.DONE, self.name, ['Already installed'])
+
+ def write(self, action, name, msg):
+ self.buf_q.put((action, name, msg))
+
+class PlugThread(thr.Thread):
+ def __init__(self, tname, args):
+ super(PlugThread, self).__init__()
+ self.tname = tname
+ self.args = args
+
+ def run(self):
+ thr.current_thread().name = self.tname
+ buf_q, work_q, lock = self.args
+
+ try:
+ while not G_STOP.is_set():
+ name, args = work_q.get_nowait()
+ plug = Plugin(name, args, buf_q, lock)
+ plug.manage()
+ work_q.task_done()
+ except queue.Empty:
+ pass
+
+class RefreshThread(thr.Thread):
+ def __init__(self, lock):
+ super(RefreshThread, self).__init__()
+ self.lock = lock
+ self.running = True
+
+ def run(self):
+ while self.running:
+ with self.lock:
+ thread_vim_command('noautocmd normal! a')
+ time.sleep(0.33)
+
+ def stop(self):
+ self.running = False
+
+if G_NVIM:
+ def thread_vim_command(cmd):
+ vim.session.threadsafe_call(lambda: vim.command(cmd))
+else:
+ def thread_vim_command(cmd):
+ vim.command(cmd)
+
+def esc(name):
+ return '"' + name.replace('"', '\"') + '"'
+
+def nonblock_read(fname):
+ """ Read a file with nonblock flag. Return the last line. """
+ fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK)
+ buf = os.read(fread, 100000).decode('utf-8', 'replace')
+ os.close(fread)
+
+ line = buf.rstrip('\r\n')
+ left = max(line.rfind('\r'), line.rfind('\n'))
+ if left != -1:
+ left += 1
+ line = line[left:]
+
+ return line
+
+def main():
+ thr.current_thread().name = 'main'
+ nthreads = int(vim.eval('s:update.threads'))
+ plugs = vim.eval('s:update.todo')
+ mac_gui = vim.eval('s:mac_gui') == '1'
+
+ lock = thr.Lock()
+ buf = Buffer(lock, len(plugs), G_PULL)
+ buf_q, work_q = queue.Queue(), queue.Queue()
+ for work in plugs.items():
+ work_q.put(work)
+
+ start_cnt = thr.active_count()
+ for num in range(nthreads):
+ tname = 'PlugT-{0:02}'.format(num)
+ thread = PlugThread(tname, (buf_q, work_q, lock))
+ thread.start()
+ if mac_gui:
+ rthread = RefreshThread(lock)
+ rthread.start()
+
+ while not buf_q.empty() or thr.active_count() != start_cnt:
+ try:
+ action, name, msg = buf_q.get(True, 0.25)
+ buf.write(action, name, ['OK'] if not msg else msg)
+ buf_q.task_done()
+ except queue.Empty:
+ pass
+ except KeyboardInterrupt:
+ G_STOP.set()
+
+ if mac_gui:
+ rthread.stop()
+ rthread.join()
+
+main()
+EOF
+endfunction
+
+function! s:update_ruby()
+ ruby << EOF
+ module PlugStream
+ SEP = ["\r", "\n", nil]
+ def get_line
+ buffer = ''
+ loop do
+ char = readchar rescue return
+ if SEP.include? char.chr
+ buffer << $/
+ break
+ else
+ buffer << char
+ end
+ end
+ buffer
+ end
+ end unless defined?(PlugStream)
+
+ def esc arg
+ %["#{arg.gsub('"', '\"')}"]
+ end
+
+ def killall pid
+ pids = [pid]
+ if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
+ pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil }
+ else
+ unless `which pgrep 2> /dev/null`.empty?
+ children = pids
+ until children.empty?
+ children = children.map { |pid|
+ `pgrep -P #{pid}`.lines.map { |l| l.chomp }
+ }.flatten
+ pids += children
+ end
+ end
+ pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
+ end
+ end
+
+ def compare_git_uri a, b
+ regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$}
+ regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1)
+ end
+
+ require 'thread'
+ require 'fileutils'
+ require 'timeout'
+ running = true
+ iswin = VIM::evaluate('s:is_win').to_i == 1
+ pull = VIM::evaluate('s:update.pull').to_i == 1
+ base = VIM::evaluate('g:plug_home')
+ all = VIM::evaluate('s:update.todo')
+ limit = VIM::evaluate('get(g:, "plug_timeout", 60)')
+ tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1
+ nthr = VIM::evaluate('s:update.threads').to_i
+ maxy = VIM::evaluate('winheight(".")').to_i
+ vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/
+ cd = iswin ? 'cd /d' : 'cd'
+ tot = VIM::evaluate('len(s:update.todo)') || 0
+ bar = ''
+ skip = 'Already installed'
+ mtx = Mutex.new
+ take1 = proc { mtx.synchronize { running && all.shift } }
+ logh = proc {
+ cnt = bar.length
+ $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})"
+ $curbuf[2] = '[' + bar.ljust(tot) + ']'
+ VIM::command('normal! 2G')
+ VIM::command('redraw')
+ }
+ where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } }
+ log = proc { |name, result, type|
+ mtx.synchronize do
+ ing = ![true, false].include?(type)
+ bar += type ? '=' : 'x' unless ing
+ b = case type
+ when :install then '+' when :update then '*'
+ when true, nil then '-' else
+ VIM::command("call add(s:update.errors, '#{name}')")
+ 'x'
+ end
+ result =
+ if type || type.nil?
+ ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"]
+ elsif result =~ /^Interrupted|^Timeout/
+ ["#{b} #{name}: #{result}"]
+ else
+ ["#{b} #{name}"] + result.lines.map { |l| " " << l }
+ end
+ if lnum = where.call(name)
+ $curbuf.delete lnum
+ lnum = 4 if ing && lnum > maxy
+ end
+ result.each_with_index do |line, offset|
+ $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp)
+ end
+ logh.call
+ end
+ }
+ bt = proc { |cmd, name, type, cleanup|
+ tried = timeout = 0
+ begin
+ tried += 1
+ timeout += limit
+ fd = nil
+ data = ''
+ if iswin
+ Timeout::timeout(timeout) do
+ tmp = VIM::evaluate('tempname()')
+ system("(#{cmd}) > #{tmp}")
+ data = File.read(tmp).chomp
+ File.unlink tmp rescue nil
+ end
+ else
+ fd = IO.popen(cmd).extend(PlugStream)
+ first_line = true
+ log_prob = 1.0 / nthr
+ while line = Timeout::timeout(timeout) { fd.get_line }
+ data << line
+ log.call name, line.chomp, type if name && (first_line || rand < log_prob)
+ first_line = false
+ end
+ fd.close
+ end
+ [$? == 0, data.chomp]
+ rescue Timeout::Error, Interrupt => e
+ if fd && !fd.closed?
+ killall fd.pid
+ fd.close
+ end
+ cleanup.call if cleanup
+ if e.is_a?(Timeout::Error) && tried < tries
+ 3.downto(1) do |countdown|
+ s = countdown > 1 ? 's' : ''
+ log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type
+ sleep 1
+ end
+ log.call name, 'Retrying ...', type
+ retry
+ end
+ [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"]
+ end
+ }
+ main = Thread.current
+ threads = []
+ watcher = Thread.new {
+ if vim7
+ while VIM::evaluate('getchar(1)')
+ sleep 0.1
+ end
+ else
+ require 'io/console' # >= Ruby 1.9
+ nil until IO.console.getch == 3.chr
+ end
+ mtx.synchronize do
+ running = false
+ threads.each { |t| t.raise Interrupt } unless vim7
+ end
+ threads.each { |t| t.join rescue nil }
+ main.kill
+ }
+ refresh = Thread.new {
+ while true
+ mtx.synchronize do
+ break unless running
+ VIM::command('noautocmd normal! a')
+ end
+ sleep 0.2
+ end
+ } if VIM::evaluate('s:mac_gui') == 1
+
+ clone_opt = VIM::evaluate('s:clone_opt')
+ progress = VIM::evaluate('s:progress_opt(1)')
+ nthr.times do
+ mtx.synchronize do
+ threads << Thread.new {
+ while pair = take1.call
+ name = pair.first
+ dir, uri, tag = pair.last.values_at *%w[dir uri tag]
+ exists = File.directory? dir
+ ok, result =
+ if exists
+ chdir = "#{cd} #{iswin ? dir : esc(dir)}"
+ ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil
+ current_uri = data.lines.to_a.last
+ if !ret
+ if data =~ /^Interrupted|^Timeout/
+ [false, data]
+ else
+ [false, [data.chomp, "PlugClean required."].join($/)]
+ end
+ elsif !compare_git_uri(current_uri, uri)
+ [false, ["Invalid URI: #{current_uri}",
+ "Expected: #{uri}",
+ "PlugClean required."].join($/)]
+ else
+ if pull
+ log.call name, 'Updating ...', :update
+ fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : ''
+ bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil
+ else
+ [true, skip]
+ end
+ end
+ else
+ d = esc dir.sub(%r{[\\/]+$}, '')
+ log.call name, 'Installing ...', :install
+ bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc {
+ FileUtils.rm_rf dir
+ }
+ end
+ mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok
+ log.call name, result, ok
+ end
+ } if running
+ end
+ end
+ threads.each { |t| t.join rescue nil }
+ logh.call
+ refresh.kill if refresh
+ watcher.kill
+EOF
+endfunction
+
+function! s:shellesc_cmd(arg, script)
+ let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g')
+ return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g')
+endfunction
+
+function! s:shellesc_ps1(arg)
+ return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'"
+endfunction
+
+function! plug#shellescape(arg, ...)
+ let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {}
+ let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh')
+ let script = get(opts, 'script', 1)
+ if shell =~# 'cmd\.exe$'
+ return s:shellesc_cmd(a:arg, script)
+ elseif shell =~# 'powershell\.exe$' || shell =~# 'pwsh$'
+ return s:shellesc_ps1(a:arg)
+ endif
+ return shellescape(a:arg)
+endfunction
+
+function! s:glob_dir(path)
+ return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)')
+endfunction
+
+function! s:progress_bar(line, bar, total)
+ call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']')
+endfunction
+
+function! s:compare_git_uri(a, b)
+ " See `git help clone'
+ " https:// [user@] github.com[:port] / junegunn/vim-plug [.git]
+ " [git@] github.com[:port] : junegunn/vim-plug [.git]
+ " file:// / junegunn/vim-plug [/]
+ " / junegunn/vim-plug [/]
+ let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$'
+ let ma = matchlist(a:a, pat)
+ let mb = matchlist(a:b, pat)
+ return ma[1:2] ==# mb[1:2]
+endfunction
+
+function! s:format_message(bullet, name, message)
+ if a:bullet != 'x'
+ return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))]
+ else
+ let lines = map(s:lines(a:message), '" ".v:val')
+ return extend([printf('x %s:', a:name)], lines)
+ endif
+endfunction
+
+function! s:with_cd(cmd, dir, ...)
+ let script = a:0 > 0 ? a:1 : 1
+ return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd)
+endfunction
+
+function! s:system(cmd, ...)
+ let batchfile = ''
+ try
+ let [sh, shellcmdflag, shrd] = s:chsh(1)
+ let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd
+ if s:is_win
+ let [batchfile, cmd] = s:batchfile(cmd)
+ endif
+ return system(cmd)
+ finally
+ let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
+ if s:is_win && filereadable(batchfile)
+ call delete(batchfile)
+ endif
+ endtry
+endfunction
+
+function! s:system_chomp(...)
+ let ret = call('s:system', a:000)
+ return v:shell_error ? '' : substitute(ret, '\n$', '', '')
+endfunction
+
+function! s:git_validate(spec, check_branch)
+ let err = ''
+ if isdirectory(a:spec.dir)
+ let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir))
+ let remote = result[-1]
+ if v:shell_error
+ let err = join([remote, 'PlugClean required.'], "\n")
+ elseif !s:compare_git_uri(remote, a:spec.uri)
+ let err = join(['Invalid URI: '.remote,
+ \ 'Expected: '.a:spec.uri,
+ \ 'PlugClean required.'], "\n")
+ elseif a:check_branch && has_key(a:spec, 'commit')
+ let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir))
+ let sha = result[-1]
+ if v:shell_error
+ let err = join(add(result, 'PlugClean required.'), "\n")
+ elseif !s:hash_match(sha, a:spec.commit)
+ let err = join([printf('Invalid HEAD (expected: %s, actual: %s)',
+ \ a:spec.commit[:6], sha[:6]),
+ \ 'PlugUpdate required.'], "\n")
+ endif
+ elseif a:check_branch
+ let branch = result[0]
+ " Check tag
+ if has_key(a:spec, 'tag')
+ let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir)
+ if a:spec.tag !=# tag && a:spec.tag !~ '\*'
+ let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.',
+ \ (empty(tag) ? 'N/A' : tag), a:spec.tag)
+ endif
+ " Check branch
+ elseif a:spec.branch !=# branch
+ let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.',
+ \ branch, a:spec.branch)
+ endif
+ if empty(err)
+ let [ahead, behind] = split(s:lastline(s:system(printf(
+ \ 'git rev-list --count --left-right HEAD...origin/%s',
+ \ a:spec.branch), a:spec.dir)), '\t')
+ if !v:shell_error && ahead
+ if behind
+ " Only mention PlugClean if diverged, otherwise it's likely to be
+ " pushable (and probably not that messed up).
+ let err = printf(
+ \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n"
+ \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind)
+ else
+ let err = printf("Ahead of origin/%s by %d commit(s).\n"
+ \ .'Cannot update until local changes are pushed.',
+ \ a:spec.branch, ahead)
+ endif
+ endif
+ endif
+ endif
+ else
+ let err = 'Not found'
+ endif
+ return [err, err =~# 'PlugClean']
+endfunction
+
+function! s:rm_rf(dir)
+ if isdirectory(a:dir)
+ call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . plug#shellescape(a:dir))
+ endif
+endfunction
+
+function! s:clean(force)
+ call s:prepare()
+ call append(0, 'Searching for invalid plugins in '.g:plug_home)
+ call append(1, '')
+
+ " List of valid directories
+ let dirs = []
+ let errs = {}
+ let [cnt, total] = [0, len(g:plugs)]
+ for [name, spec] in items(g:plugs)
+ if !s:is_managed(name)
+ call add(dirs, spec.dir)
+ else
+ let [err, clean] = s:git_validate(spec, 1)
+ if clean
+ let errs[spec.dir] = s:lines(err)[0]
+ else
+ call add(dirs, spec.dir)
+ endif
+ endif
+ let cnt += 1
+ call s:progress_bar(2, repeat('=', cnt), total)
+ normal! 2G
+ redraw
+ endfor
+
+ let allowed = {}
+ for dir in dirs
+ let allowed[s:dirpath(fnamemodify(dir, ':h:h'))] = 1
+ let allowed[dir] = 1
+ for child in s:glob_dir(dir)
+ let allowed[child] = 1
+ endfor
+ endfor
+
+ let todo = []
+ let found = sort(s:glob_dir(g:plug_home))
+ while !empty(found)
+ let f = remove(found, 0)
+ if !has_key(allowed, f) && isdirectory(f)
+ call add(todo, f)
+ call append(line('$'), '- ' . f)
+ if has_key(errs, f)
+ call append(line('$'), ' ' . errs[f])
+ endif
+ let found = filter(found, 'stridx(v:val, f) != 0')
+ end
+ endwhile
+
+ 4
+ redraw
+ if empty(todo)
+ call append(line('$'), 'Already clean.')
+ else
+ let s:clean_count = 0
+ call append(3, ['Directories to delete:', ''])
+ redraw!
+ if a:force || s:ask_no_interrupt('Delete all directories?')
+ call s:delete([6, line('$')], 1)
+ else
+ call setline(4, 'Cancelled.')
+ nnoremap <silent> <buffer> d :set opfunc=<sid>delete_op<cr>g@
+ nmap <silent> <buffer> dd d_
+ xnoremap <silent> <buffer> d :<c-u>call <sid>delete_op(visualmode(), 1)<cr>
+ echo 'Delete the lines (d{motion}) to delete the corresponding directories'
+ endif
+ endif
+ 4
+ setlocal nomodifiable
+endfunction
+
+function! s:delete_op(type, ...)
+ call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0)
+endfunction
+
+function! s:delete(range, force)
+ let [l1, l2] = a:range
+ let force = a:force
+ while l1 <= l2
+ let line = getline(l1)
+ if line =~ '^- ' && isdirectory(line[2:])
+ execute l1
+ redraw!
+ let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1)
+ let force = force || answer > 1
+ if answer
+ call s:rm_rf(line[2:])
+ setlocal modifiable
+ call setline(l1, '~'.line[1:])
+ let s:clean_count += 1
+ call setline(4, printf('Removed %d directories.', s:clean_count))
+ setlocal nomodifiable
+ endif
+ endif
+ let l1 += 1
+ endwhile
+endfunction
+
+function! s:upgrade()
+ echo 'Downloading the latest version of vim-plug'
+ redraw
+ let tmp = tempname()
+ let new = tmp . '/plug.vim'
+
+ try
+ let out = s:system(printf('git clone --depth 1 %s %s', plug#shellescape(s:plug_src), plug#shellescape(tmp)))
+ if v:shell_error
+ return s:err('Error upgrading vim-plug: '. out)
+ endif
+
+ if readfile(s:me) ==# readfile(new)
+ echo 'vim-plug is already up-to-date'
+ return 0
+ else
+ call rename(s:me, s:me . '.old')
+ call rename(new, s:me)
+ unlet g:loaded_plug
+ echo 'vim-plug has been upgraded'
+ return 1
+ endif
+ finally
+ silent! call s:rm_rf(tmp)
+ endtry
+endfunction
+
+function! s:upgrade_specs()
+ for spec in values(g:plugs)
+ let spec.frozen = get(spec, 'frozen', 0)
+ endfor
+endfunction
+
+function! s:status()
+ call s:prepare()
+ call append(0, 'Checking plugins')
+ call append(1, '')
+
+ let ecnt = 0
+ let unloaded = 0
+ let [cnt, total] = [0, len(g:plugs)]
+ for [name, spec] in items(g:plugs)
+ let is_dir = isdirectory(spec.dir)
+ if has_key(spec, 'uri')
+ if is_dir
+ let [err, _] = s:git_validate(spec, 1)
+ let [valid, msg] = [empty(err), empty(err) ? 'OK' : err]
+ else
+ let [valid, msg] = [0, 'Not found. Try PlugInstall.']
+ endif
+ else
+ if is_dir
+ let [valid, msg] = [1, 'OK']
+ else
+ let [valid, msg] = [0, 'Not found.']
+ endif
+ endif
+ let cnt += 1
+ let ecnt += !valid
+ " `s:loaded` entry can be missing if PlugUpgraded
+ if is_dir && get(s:loaded, name, -1) == 0
+ let unloaded = 1
+ let msg .= ' (not loaded)'
+ endif
+ call s:progress_bar(2, repeat('=', cnt), total)
+ call append(3, s:format_message(valid ? '-' : 'x', name, msg))
+ normal! 2G
+ redraw
+ endfor
+ call setline(1, 'Finished. '.ecnt.' error(s).')
+ normal! gg
+ setlocal nomodifiable
+ if unloaded
+ echo "Press 'L' on each line to load plugin, or 'U' to update"
+ nnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
+ xnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr>
+ end
+endfunction
+
+function! s:extract_name(str, prefix, suffix)
+ return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$')
+endfunction
+
+function! s:status_load(lnum)
+ let line = getline(a:lnum)
+ let name = s:extract_name(line, '-', '(not loaded)')
+ if !empty(name)
+ call plug#load(name)
+ setlocal modifiable
+ call setline(a:lnum, substitute(line, ' (not loaded)$', '', ''))
+ setlocal nomodifiable
+ endif
+endfunction
+
+function! s:status_update() range
+ let lines = getline(a:firstline, a:lastline)
+ let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)')
+ if !empty(names)
+ echo
+ execute 'PlugUpdate' join(names)
+ endif
+endfunction
+
+function! s:is_preview_window_open()
+ silent! wincmd P
+ if &previewwindow
+ wincmd p
+ return 1
+ endif
+endfunction
+
+function! s:find_name(lnum)
+ for lnum in reverse(range(1, a:lnum))
+ let line = getline(lnum)
+ if empty(line)
+ return ''
+ endif
+ let name = s:extract_name(line, '-', '')
+ if !empty(name)
+ return name
+ endif
+ endfor
+ return ''
+endfunction
+
+function! s:preview_commit()
+ if b:plug_preview < 0
+ let b:plug_preview = !s:is_preview_window_open()
+ endif
+
+ let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}')
+ if empty(sha)
+ return
+ endif
+
+ let name = s:find_name(line('.'))
+ if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir)
+ return
+ endif
+
+ if exists('g:plug_pwindow') && !s:is_preview_window_open()
+ execute g:plug_pwindow
+ execute 'e' sha
+ else
+ execute 'pedit' sha
+ wincmd P
+ endif
+ setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable
+ let batchfile = ''
+ try
+ let [sh, shellcmdflag, shrd] = s:chsh(1)
+ let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha
+ if s:is_win
+ let [batchfile, cmd] = s:batchfile(cmd)
+ endif
+ execute 'silent %!' cmd
+ finally
+ let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd]
+ if s:is_win && filereadable(batchfile)
+ call delete(batchfile)
+ endif
+ endtry
+ setlocal nomodifiable
+ nnoremap <silent> <buffer> q :q<cr>
+ wincmd p
+endfunction
+
+function! s:section(flags)
+ call search('\(^[x-] \)\@<=[^:]\+:', a:flags)
+endfunction
+
+function! s:format_git_log(line)
+ let indent = ' '
+ let tokens = split(a:line, nr2char(1))
+ if len(tokens) != 5
+ return indent.substitute(a:line, '\s*$', '', '')
+ endif
+ let [graph, sha, refs, subject, date] = tokens
+ let tag = matchstr(refs, 'tag: [^,)]\+')
+ let tag = empty(tag) ? ' ' : ' ('.tag.') '
+ return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date)
+endfunction
+
+function! s:append_ul(lnum, text)
+ call append(a:lnum, ['', a:text, repeat('-', len(a:text))])
+endfunction
+
+function! s:diff()
+ call s:prepare()
+ call append(0, ['Collecting changes ...', ''])
+ let cnts = [0, 0]
+ let bar = ''
+ let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)')
+ call s:progress_bar(2, bar, len(total))
+ for origin in [1, 0]
+ let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))'))))
+ if empty(plugs)
+ continue
+ endif
+ call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:')
+ for [k, v] in plugs
+ let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..'
+ let cmd = 'git log --graph --color=never '.join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 'plug#shellescape(v:val)'))
+ if has_key(v, 'rtp')
+ let cmd .= ' -- '.plug#shellescape(v.rtp)
+ endif
+ let diff = s:system_chomp(cmd, v.dir)
+ if !empty(diff)
+ let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : ''
+ call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)')))
+ let cnts[origin] += 1
+ endif
+ let bar .= '='
+ call s:progress_bar(2, bar, len(total))
+ normal! 2G
+ redraw
+ endfor
+ if !cnts[origin]
+ call append(5, ['', 'N/A'])
+ endif
+ endfor
+ call setline(1, printf('%d plugin(s) updated.', cnts[0])
+ \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : ''))
+
+ if cnts[0] || cnts[1]
+ nnoremap <silent> <buffer> <plug>(plug-preview) :silent! call <SID>preview_commit()<cr>
+ if empty(maparg("\<cr>", 'n'))
+ nmap <buffer> <cr> <plug>(plug-preview)
+ endif
+ if empty(maparg('o', 'n'))
+ nmap <buffer> o <plug>(plug-preview)
+ endif
+ endif
+ if cnts[0]
+ nnoremap <silent> <buffer> X :call <SID>revert()<cr>
+ echo "Press 'X' on each block to revert the update"
+ endif
+ normal! gg
+ setlocal nomodifiable
+endfunction
+
+function! s:revert()
+ if search('^Pending updates', 'bnW')
+ return
+ endif
+
+ let name = s:find_name(line('.'))
+ if empty(name) || !has_key(g:plugs, name) ||
+ \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y'
+ return
+ endif
+
+ call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch).' --', g:plugs[name].dir)
+ setlocal modifiable
+ normal! "_dap
+ setlocal nomodifiable
+ echo 'Reverted'
+endfunction
+
+function! s:snapshot(force, ...) abort
+ call s:prepare()
+ setf vim
+ call append(0, ['" Generated by vim-plug',
+ \ '" '.strftime("%c"),
+ \ '" :source this file in vim to restore the snapshot',
+ \ '" or execute: vim -S snapshot.vim',
+ \ '', '', 'PlugUpdate!'])
+ 1
+ let anchor = line('$') - 3
+ let names = sort(keys(filter(copy(g:plugs),
+ \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)')))
+ for name in reverse(names)
+ let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir)
+ if !empty(sha)
+ call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
+ redraw
+ endif
+ endfor
+
+ if a:0 > 0
+ let fn = expand(a:1)
+ if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?'))
+ return
+ endif
+ call writefile(getline(1, '$'), fn)
+ echo 'Saved as '.a:1
+ silent execute 'e' s:esc(fn)
+ setf vim
+ endif
+endfunction
+
+function! s:split_rtp()
+ return split(&rtp, '\\\@<!,')
+endfunction
+
+let s:first_rtp = s:escrtp(get(s:split_rtp(), 0, ''))
+let s:last_rtp = s:escrtp(get(s:split_rtp(), -1, ''))
+
+if exists('g:plugs')
+ let g:plugs_order = get(g:, 'plugs_order', keys(g:plugs))
+ call s:upgrade_specs()
+ call s:define_commands()
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/nvim/cache/citation_vim_cache b/nvim/cache/citation_vim_cache
Binary files differ.
diff --git a/nvim/colors/selenized_bw.vim b/nvim/colors/selenized_bw.vim
@@ -0,0 +1,723 @@
+" Name: Selenized black/white, beta version
+" Author: Jan Warchoł <jan.warchol@gmail.com>
+" Maintainer: Jan Warchoł <jan.warchol@gmail.com>
+" License: Vim License (see `:help license`)
+" Last Updated: Sat 25 Apr 2020 17:38:38
+
+" Generated by Colortemplate v2.0.0
+
+hi clear
+if exists('syntax_on')
+ syntax reset
+endif
+
+let g:colors_name = 'selenized_bw'
+
+let s:t_Co = exists('&t_Co') && !empty(&t_Co) && &t_Co > 1 ? &t_Co : 2
+let s:italics = (&t_ZH != '' && &t_ZH != '[7m') || has('gui_running') || has('nvim')
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ if &background ==# 'dark'
+ let g:terminal_ansi_colors = ['#252525', '#ed4a46', '#70b433', '#dbb32d',
+ \ '#368aeb', '#eb6eb7', '#3fc5b7', '#777777', '#3b3b3b', '#ff5e56',
+ \ '#83c746', '#efc541', '#4f9cfe', '#ff81ca', '#56d8c9', '#dedede']
+ if has('nvim')
+ let g:terminal_color_0 = '#181818'
+ let g:terminal_color_1 = '#ed4a46'
+ let g:terminal_color_2 = '#70b433'
+ let g:terminal_color_3 = '#dbb32d'
+ let g:terminal_color_4 = '#368aeb'
+ let g:terminal_color_5 = '#eb6eb7'
+ let g:terminal_color_6 = '#3fc5b7'
+ let g:terminal_color_7 = '#777777'
+ let g:terminal_color_8 = '#3b3b3b'
+ let g:terminal_color_9 = '#ff5e56'
+ let g:terminal_color_10 = '#83c746'
+ let g:terminal_color_11 = '#efc541'
+ let g:terminal_color_12 = '#4f9cfe'
+ let g:terminal_color_13 = '#ff81ca'
+ let g:terminal_color_14 = '#56d8c9'
+ let g:terminal_color_15 = '#dedede'
+ endif
+ hi Normal guifg=#b9b9b9 guibg=#181818 guisp=NONE gui=NONE cterm=NONE
+ hi IncSearch guifg=#e67f43 guibg=NONE guisp=NONE gui=reverse cterm=reverse
+ hi Search guifg=#dbb32d guibg=NONE guisp=NONE gui=reverse cterm=reverse
+ hi! link QuickFixLine Search
+ hi Visual guifg=NONE guibg=#3b3b3b guisp=NONE gui=NONE cterm=NONE
+ hi MatchParen guifg=#efc541 guibg=#3b3b3b guisp=NONE gui=bold cterm=bold
+ hi Cursor guifg=NONE guibg=NONE guisp=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi! link lCursor Cursor
+ hi CursorLine guifg=NONE guibg=#252525 guisp=NONE gui=NONE cterm=NONE
+ hi CursorColumn guifg=NONE guibg=#252525 guisp=NONE gui=NONE cterm=NONE
+ hi Folded guifg=NONE guibg=#252525 guisp=NONE gui=NONE cterm=NONE
+ hi ColorColumn guifg=NONE guibg=#3b3b3b guisp=NONE gui=NONE cterm=NONE
+ hi LineNr guifg=#777777 guibg=#252525 guisp=NONE gui=NONE cterm=NONE
+ hi CursorLineNr guifg=#dedede guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi VertSplit guifg=#777777 guibg=#777777 guisp=NONE gui=NONE cterm=NONE
+ hi StatusLine guifg=NONE guibg=NONE guisp=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi StatusLineNC guifg=NONE guibg=#3b3b3b guisp=NONE gui=NONE cterm=NONE
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi TabLineSel guifg=#dedede guibg=#252525 guisp=NONE gui=bold,reverse cterm=bold,reverse
+ hi TabLine guifg=#777777 guibg=NONE guisp=NONE gui=reverse cterm=reverse
+ hi TabLineFill guifg=#777777 guibg=NONE guisp=NONE gui=reverse cterm=reverse
+ hi ToolbarButton guifg=NONE guibg=NONE guisp=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ToolbarLine guifg=NONE guibg=#3b3b3b guisp=NONE gui=NONE cterm=NONE
+ hi Pmenu guifg=#777777 guibg=#252525 guisp=NONE gui=NONE cterm=NONE
+ hi PmenuSel guifg=NONE guibg=#3b3b3b guisp=NONE gui=NONE cterm=NONE
+ hi PmenuThumb guifg=NONE guibg=#777777 guisp=NONE gui=NONE cterm=NONE
+ hi PmenuSbar guifg=NONE guibg=#3b3b3b guisp=NONE gui=NONE cterm=NONE
+ hi DiffAdd guifg=#70b433 guibg=#252525 guisp=NONE gui=NONE cterm=NONE
+ hi DiffChange guifg=NONE guibg=#252525 guisp=NONE gui=NONE cterm=NONE
+ hi DiffDelete guifg=#ed4a46 guibg=#252525 guisp=NONE gui=NONE cterm=NONE
+ hi DiffText guifg=#252525 guibg=#dbb32d guisp=NONE gui=NONE cterm=NONE
+ hi Comment guifg=#777777 guibg=NONE guisp=NONE gui=italic cterm=italic
+ hi Constant guifg=#3fc5b7 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link String Constant
+ hi! link Number Constant
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Float Constant
+ hi Identifier guifg=#4f9cfe guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link Function Identifier
+ hi Statement guifg=#efc541 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link Conditional Statement
+ hi! link Repeat Statement
+ hi! link Keyword Statement
+ hi! link Label Statement
+ hi! link Exception Statement
+ hi! link Operator Statement
+ hi PreProc guifg=#e67f43 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link Define PreProc
+ hi! link PreCondit PreProc
+ hi! link Include PreProc
+ hi! link Macro Include
+ hi Type guifg=#70b433 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link Typedef Type
+ hi! link StorageClass Type
+ hi! link Structure Type
+ hi Special guifg=#ed4a46 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link SpecialChar Special
+ hi! link Delimiter Special
+ hi! link SpecialComment Special
+ hi! link Debug Special
+ hi! link Tag Special
+ hi Error guifg=#ed4a46 guibg=NONE guisp=NONE gui=bold cterm=bold
+ hi Todo guifg=#eb6eb7 guibg=NONE guisp=NONE gui=bold cterm=bold
+ hi Underlined guifg=#a580e2 guibg=NONE guisp=NONE gui=underline cterm=underline
+ hi Ignore guifg=#3b3b3b guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi VimCommand guifg=#dbb32d guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi RubyDefine guifg=#dedede guibg=NONE guisp=NONE gui=bold cterm=bold
+ if !s:italics
+ hi Comment gui=NONE cterm=NONE
+ endif
+ if get(g:, 'selenized_green_keywords', 0)
+ hi Statement guifg=#70b433 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi Type guifg=#dbb32d guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ endif
+ hi Terminal guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Conceal guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Directory guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi EndOfBuffer guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ErrorMsg guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi FoldColumn guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ModeMsg guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MoreMsg guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi NonText guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Question guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpecialKey guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellBad guifg=NONE guibg=NONE guisp=#ed4a46 gui=undercurl ctermfg=NONE ctermbg=NONE cterm=undercurl
+ hi SpellCap guifg=NONE guibg=NONE guisp=#ed4a46 gui=undercurl ctermfg=NONE ctermbg=NONE cterm=undercurl
+ hi SpellLocal guifg=NONE guibg=NONE guisp=#dbb32d gui=undercurl ctermfg=NONE ctermbg=NONE cterm=undercurl
+ hi SpellRare guifg=NONE guibg=NONE guisp=#3fc5b7 gui=undercurl ctermfg=NONE ctermbg=NONE cterm=undercurl
+ hi Title guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VisualNOS guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WarningMsg guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WildMenu guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ unlet s:t_Co s:italics
+ finish
+ endif
+ " Light background
+ let g:terminal_ansi_colors = ['#ebebeb', '#d6000c', '#1d9700', '#c49700',
+ \ '#0064e4', '#dd0f9d', '#00ad9c', '#878787', '#cdcdcd', '#bf0000',
+ \ '#008400', '#af8500', '#0054cf', '#c7008b', '#009a8a', '#282828']
+ if has('nvim')
+ let g:terminal_color_0 = '#ebebeb'
+ let g:terminal_color_1 = '#d6000c'
+ let g:terminal_color_2 = '#1d9700'
+ let g:terminal_color_3 = '#c49700'
+ let g:terminal_color_4 = '#0064e4'
+ let g:terminal_color_5 = '#dd0f9d'
+ let g:terminal_color_6 = '#00ad9c'
+ let g:terminal_color_7 = '#878787'
+ let g:terminal_color_8 = '#cdcdcd'
+ let g:terminal_color_9 = '#bf0000'
+ let g:terminal_color_10 = '#008400'
+ let g:terminal_color_11 = '#af8500'
+ let g:terminal_color_12 = '#0054cf'
+ let g:terminal_color_13 = '#c7008b'
+ let g:terminal_color_14 = '#009a8a'
+ let g:terminal_color_15 = '#282828'
+ endif
+ hi Normal guifg=#474747 guibg=#ffffff guisp=NONE gui=NONE cterm=NONE
+ hi IncSearch guifg=#d04a00 guibg=NONE guisp=NONE gui=reverse cterm=reverse
+ hi Search guifg=#c49700 guibg=NONE guisp=NONE gui=reverse cterm=reverse
+ hi! link QuickFixLine Search
+ hi Visual guifg=NONE guibg=#cdcdcd guisp=NONE gui=NONE cterm=NONE
+ hi MatchParen guifg=#af8500 guibg=#cdcdcd guisp=NONE gui=bold cterm=bold
+ hi Cursor guifg=NONE guibg=NONE guisp=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi! link lCursor Cursor
+ hi CursorLine guifg=NONE guibg=#ebebeb guisp=NONE gui=NONE cterm=NONE
+ hi CursorColumn guifg=NONE guibg=#ebebeb guisp=NONE gui=NONE cterm=NONE
+ hi Folded guifg=NONE guibg=#ebebeb guisp=NONE gui=NONE cterm=NONE
+ hi ColorColumn guifg=NONE guibg=#cdcdcd guisp=NONE gui=NONE cterm=NONE
+ hi LineNr guifg=#878787 guibg=#ebebeb guisp=NONE gui=NONE cterm=NONE
+ hi CursorLineNr guifg=#282828 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi VertSplit guifg=#878787 guibg=#878787 guisp=NONE gui=NONE cterm=NONE
+ hi StatusLine guifg=NONE guibg=NONE guisp=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi StatusLineNC guifg=NONE guibg=#cdcdcd guisp=NONE gui=NONE cterm=NONE
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi TabLineSel guifg=#282828 guibg=#ebebeb guisp=NONE gui=bold,reverse cterm=bold,reverse
+ hi TabLine guifg=#878787 guibg=NONE guisp=NONE gui=reverse cterm=reverse
+ hi TabLineFill guifg=#878787 guibg=NONE guisp=NONE gui=reverse cterm=reverse
+ hi ToolbarButton guifg=NONE guibg=NONE guisp=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ToolbarLine guifg=NONE guibg=#cdcdcd guisp=NONE gui=NONE cterm=NONE
+ hi Pmenu guifg=#878787 guibg=#ebebeb guisp=NONE gui=NONE cterm=NONE
+ hi PmenuSel guifg=NONE guibg=#cdcdcd guisp=NONE gui=NONE cterm=NONE
+ hi PmenuThumb guifg=NONE guibg=#878787 guisp=NONE gui=NONE cterm=NONE
+ hi PmenuSbar guifg=NONE guibg=#cdcdcd guisp=NONE gui=NONE cterm=NONE
+ hi DiffAdd guifg=#1d9700 guibg=#ebebeb guisp=NONE gui=NONE cterm=NONE
+ hi DiffChange guifg=NONE guibg=#ebebeb guisp=NONE gui=NONE cterm=NONE
+ hi DiffDelete guifg=#d6000c guibg=#ebebeb guisp=NONE gui=NONE cterm=NONE
+ hi DiffText guifg=#ebebeb guibg=#c49700 guisp=NONE gui=NONE cterm=NONE
+ hi Comment guifg=#878787 guibg=NONE guisp=NONE gui=italic cterm=italic
+ hi Constant guifg=#00ad9c guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link String Constant
+ hi! link Number Constant
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Float Constant
+ hi Identifier guifg=#0054cf guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link Function Identifier
+ hi Statement guifg=#af8500 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link Conditional Statement
+ hi! link Repeat Statement
+ hi! link Keyword Statement
+ hi! link Label Statement
+ hi! link Exception Statement
+ hi! link Operator Statement
+ hi PreProc guifg=#d04a00 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link Define PreProc
+ hi! link PreCondit PreProc
+ hi! link Include PreProc
+ hi! link Macro Include
+ hi Type guifg=#1d9700 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link Typedef Type
+ hi! link StorageClass Type
+ hi! link Structure Type
+ hi Special guifg=#d6000c guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi! link SpecialChar Special
+ hi! link Delimiter Special
+ hi! link SpecialComment Special
+ hi! link Debug Special
+ hi! link Tag Special
+ hi Error guifg=#d6000c guibg=NONE guisp=NONE gui=bold cterm=bold
+ hi Todo guifg=#dd0f9d guibg=NONE guisp=NONE gui=bold cterm=bold
+ hi Underlined guifg=#7f51d6 guibg=NONE guisp=NONE gui=underline cterm=underline
+ hi Ignore guifg=#cdcdcd guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi VimCommand guifg=#c49700 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi RubyDefine guifg=#282828 guibg=NONE guisp=NONE gui=bold cterm=bold
+ if !s:italics
+ hi Comment gui=NONE cterm=NONE
+ endif
+ if get(g:, 'selenized_green_keywords', 0)
+ hi Statement guifg=#1d9700 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ hi Type guifg=#c49700 guibg=NONE guisp=NONE gui=NONE cterm=NONE
+ endif
+ hi Terminal guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Conceal guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Directory guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi EndOfBuffer guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ErrorMsg guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi FoldColumn guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ModeMsg guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MoreMsg guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi NonText guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Question guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpecialKey guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellBad guifg=NONE guibg=NONE guisp=#d6000c gui=undercurl ctermfg=NONE ctermbg=NONE cterm=undercurl
+ hi SpellCap guifg=NONE guibg=NONE guisp=#d6000c gui=undercurl ctermfg=NONE ctermbg=NONE cterm=undercurl
+ hi SpellLocal guifg=NONE guibg=NONE guisp=#c49700 gui=undercurl ctermfg=NONE ctermbg=NONE cterm=undercurl
+ hi SpellRare guifg=NONE guibg=NONE guisp=#00ad9c gui=undercurl ctermfg=NONE ctermbg=NONE cterm=undercurl
+ hi Title guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VisualNOS guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WarningMsg guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WildMenu guifg=NONE guibg=NONE guisp=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ unlet s:t_Co s:italics
+ finish
+endif
+
+if s:t_Co >= 256
+ if &background ==# 'dark'
+ hi Normal ctermfg=250 ctermbg=234 cterm=NONE
+ if !has('patch-8.0.0616') && !has('nvim') " Fix for Vim bug
+ set background=dark
+ endif
+ hi IncSearch ctermfg=173 ctermbg=NONE cterm=reverse
+ hi Search ctermfg=178 ctermbg=NONE cterm=reverse
+ hi! link QuickFixLine Search
+ hi Visual ctermfg=NONE ctermbg=237 cterm=NONE
+ hi MatchParen ctermfg=178 ctermbg=237 cterm=bold
+ hi Cursor ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi! link lCursor Cursor
+ hi CursorLine ctermfg=NONE ctermbg=235 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=235 cterm=NONE
+ hi Folded ctermfg=NONE ctermbg=235 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=237 cterm=NONE
+ hi LineNr ctermfg=243 ctermbg=235 cterm=NONE
+ hi CursorLineNr ctermfg=253 ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=243 ctermbg=243 cterm=NONE
+ hi StatusLine ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi StatusLineNC ctermfg=NONE ctermbg=237 cterm=NONE
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi TabLineSel ctermfg=253 ctermbg=235 cterm=bold,reverse
+ hi TabLine ctermfg=243 ctermbg=NONE cterm=reverse
+ hi TabLineFill ctermfg=243 ctermbg=NONE cterm=reverse
+ hi ToolbarButton ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=237 cterm=NONE
+ hi Pmenu ctermfg=243 ctermbg=235 cterm=NONE
+ hi PmenuSel ctermfg=NONE ctermbg=237 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=243 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=237 cterm=NONE
+ hi DiffAdd ctermfg=70 ctermbg=235 cterm=NONE
+ hi DiffChange ctermfg=NONE ctermbg=235 cterm=NONE
+ hi DiffDelete ctermfg=203 ctermbg=235 cterm=NONE
+ hi DiffText ctermfg=235 ctermbg=178 cterm=NONE
+ hi Comment ctermfg=243 ctermbg=NONE cterm=italic
+ hi Constant ctermfg=44 ctermbg=NONE cterm=NONE
+ hi! link String Constant
+ hi! link Number Constant
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Float Constant
+ hi Identifier ctermfg=39 ctermbg=NONE cterm=NONE
+ hi! link Function Identifier
+ hi Statement ctermfg=178 ctermbg=NONE cterm=NONE
+ hi! link Conditional Statement
+ hi! link Repeat Statement
+ hi! link Keyword Statement
+ hi! link Label Statement
+ hi! link Exception Statement
+ hi! link Operator Statement
+ hi PreProc ctermfg=173 ctermbg=NONE cterm=NONE
+ hi! link Define PreProc
+ hi! link PreCondit PreProc
+ hi! link Include PreProc
+ hi! link Macro Include
+ hi Type ctermfg=70 ctermbg=NONE cterm=NONE
+ hi! link Typedef Type
+ hi! link StorageClass Type
+ hi! link Structure Type
+ hi Special ctermfg=203 ctermbg=NONE cterm=NONE
+ hi! link SpecialChar Special
+ hi! link Delimiter Special
+ hi! link SpecialComment Special
+ hi! link Debug Special
+ hi! link Tag Special
+ hi Error ctermfg=203 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=205 ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=140 ctermbg=NONE cterm=underline
+ hi Ignore ctermfg=237 ctermbg=NONE cterm=NONE
+ hi VimCommand ctermfg=178 ctermbg=NONE cterm=NONE
+ hi RubyDefine ctermfg=253 ctermbg=NONE cterm=bold
+ if !s:italics
+ hi Comment cterm=NONE
+ endif
+ if get(g:, 'selenized_green_keywords', 0)
+ hi Statement ctermfg=70 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=178 ctermbg=NONE cterm=NONE
+ endif
+ hi Terminal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Question ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=NONE ctermbg=NONE cterm=NONE
+ unlet s:t_Co s:italics
+ finish
+ endif
+ " Light background
+ hi Normal ctermfg=238 ctermbg=231 cterm=NONE
+ hi IncSearch ctermfg=166 ctermbg=NONE cterm=reverse
+ hi Search ctermfg=136 ctermbg=NONE cterm=reverse
+ hi! link QuickFixLine Search
+ hi Visual ctermfg=NONE ctermbg=252 cterm=NONE
+ hi MatchParen ctermfg=136 ctermbg=252 cterm=bold
+ hi Cursor ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi! link lCursor Cursor
+ hi CursorLine ctermfg=NONE ctermbg=255 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=255 cterm=NONE
+ hi Folded ctermfg=NONE ctermbg=255 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=252 cterm=NONE
+ hi LineNr ctermfg=102 ctermbg=255 cterm=NONE
+ hi CursorLineNr ctermfg=235 ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=102 ctermbg=102 cterm=NONE
+ hi StatusLine ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi StatusLineNC ctermfg=NONE ctermbg=252 cterm=NONE
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi TabLineSel ctermfg=235 ctermbg=255 cterm=bold,reverse
+ hi TabLine ctermfg=102 ctermbg=NONE cterm=reverse
+ hi TabLineFill ctermfg=102 ctermbg=NONE cterm=reverse
+ hi ToolbarButton ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=252 cterm=NONE
+ hi Pmenu ctermfg=102 ctermbg=255 cterm=NONE
+ hi PmenuSel ctermfg=NONE ctermbg=252 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=102 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=252 cterm=NONE
+ hi DiffAdd ctermfg=28 ctermbg=255 cterm=NONE
+ hi DiffChange ctermfg=NONE ctermbg=255 cterm=NONE
+ hi DiffDelete ctermfg=160 ctermbg=255 cterm=NONE
+ hi DiffText ctermfg=255 ctermbg=136 cterm=NONE
+ hi Comment ctermfg=102 ctermbg=NONE cterm=italic
+ hi Constant ctermfg=37 ctermbg=NONE cterm=NONE
+ hi! link String Constant
+ hi! link Number Constant
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Float Constant
+ hi Identifier ctermfg=26 ctermbg=NONE cterm=NONE
+ hi! link Function Identifier
+ hi Statement ctermfg=136 ctermbg=NONE cterm=NONE
+ hi! link Conditional Statement
+ hi! link Repeat Statement
+ hi! link Keyword Statement
+ hi! link Label Statement
+ hi! link Exception Statement
+ hi! link Operator Statement
+ hi PreProc ctermfg=166 ctermbg=NONE cterm=NONE
+ hi! link Define PreProc
+ hi! link PreCondit PreProc
+ hi! link Include PreProc
+ hi! link Macro Include
+ hi Type ctermfg=28 ctermbg=NONE cterm=NONE
+ hi! link Typedef Type
+ hi! link StorageClass Type
+ hi! link Structure Type
+ hi Special ctermfg=160 ctermbg=NONE cterm=NONE
+ hi! link SpecialChar Special
+ hi! link Delimiter Special
+ hi! link SpecialComment Special
+ hi! link Debug Special
+ hi! link Tag Special
+ hi Error ctermfg=160 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=163 ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=98 ctermbg=NONE cterm=underline
+ hi Ignore ctermfg=252 ctermbg=NONE cterm=NONE
+ hi VimCommand ctermfg=136 ctermbg=NONE cterm=NONE
+ hi RubyDefine ctermfg=235 ctermbg=NONE cterm=bold
+ if !s:italics
+ hi Comment cterm=NONE
+ endif
+ if get(g:, 'selenized_green_keywords', 0)
+ hi Statement ctermfg=28 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=136 ctermbg=NONE cterm=NONE
+ endif
+ hi Terminal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Question ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=NONE ctermbg=NONE cterm=NONE
+ unlet s:t_Co s:italics
+ finish
+endif
+
+if s:t_Co >= 16
+ if &background ==# 'dark'
+ hi Normal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi IncSearch ctermfg=DarkMagenta ctermbg=NONE cterm=reverse
+ hi Search ctermfg=DarkYellow ctermbg=NONE cterm=reverse
+ hi! link QuickFixLine Search
+ hi Visual ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi MatchParen ctermfg=LightYellow ctermbg=DarkGrey cterm=bold
+ hi Cursor ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi! link lCursor Cursor
+ hi CursorLine ctermfg=NONE ctermbg=Black cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=Black cterm=NONE
+ hi Folded ctermfg=NONE ctermbg=Black cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi LineNr ctermfg=LightGrey ctermbg=Black cterm=NONE
+ hi CursorLineNr ctermfg=White ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=LightGrey ctermbg=LightGrey cterm=NONE
+ hi StatusLine ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi StatusLineNC ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi TabLineSel ctermfg=White ctermbg=Black cterm=bold,reverse
+ hi TabLine ctermfg=LightGrey ctermbg=NONE cterm=reverse
+ hi TabLineFill ctermfg=LightGrey ctermbg=NONE cterm=reverse
+ hi ToolbarButton ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi Pmenu ctermfg=LightGrey ctermbg=Black cterm=NONE
+ hi PmenuSel ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=LightGrey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi DiffAdd ctermfg=DarkGreen ctermbg=Black cterm=NONE
+ hi DiffChange ctermfg=NONE ctermbg=Black cterm=NONE
+ hi DiffDelete ctermfg=DarkRed ctermbg=Black cterm=NONE
+ hi DiffText ctermfg=Black ctermbg=DarkYellow cterm=NONE
+ hi Comment ctermfg=LightGrey ctermbg=NONE cterm=italic
+ hi Constant ctermfg=DarkCyan ctermbg=NONE cterm=NONE
+ hi! link String Constant
+ hi! link Number Constant
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Float Constant
+ hi Identifier ctermfg=LightBlue ctermbg=NONE cterm=NONE
+ hi! link Function Identifier
+ hi Statement ctermfg=LightYellow ctermbg=NONE cterm=NONE
+ hi! link Conditional Statement
+ hi! link Repeat Statement
+ hi! link Keyword Statement
+ hi! link Label Statement
+ hi! link Exception Statement
+ hi! link Operator Statement
+ hi PreProc ctermfg=DarkMagenta ctermbg=NONE cterm=NONE
+ hi! link Define PreProc
+ hi! link PreCondit PreProc
+ hi! link Include PreProc
+ hi! link Macro Include
+ hi Type ctermfg=DarkGreen ctermbg=NONE cterm=NONE
+ hi! link Typedef Type
+ hi! link StorageClass Type
+ hi! link Structure Type
+ hi Special ctermfg=DarkRed ctermbg=NONE cterm=NONE
+ hi! link SpecialChar Special
+ hi! link Delimiter Special
+ hi! link SpecialComment Special
+ hi! link Debug Special
+ hi! link Tag Special
+ hi Error ctermfg=DarkRed ctermbg=NONE cterm=bold
+ hi Todo ctermfg=DarkMagenta ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=LightBlue ctermbg=NONE cterm=underline
+ hi Ignore ctermfg=DarkGrey ctermbg=NONE cterm=NONE
+ hi VimCommand ctermfg=DarkYellow ctermbg=NONE cterm=NONE
+ hi RubyDefine ctermfg=White ctermbg=NONE cterm=bold
+ if !s:italics
+ hi Comment cterm=NONE
+ endif
+ if get(g:, 'selenized_green_keywords', 0)
+ hi Statement ctermfg=DarkGreen ctermbg=NONE cterm=NONE
+ hi Type ctermfg=DarkYellow ctermbg=NONE cterm=NONE
+ endif
+ hi Terminal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Question ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=NONE ctermbg=NONE cterm=NONE
+ unlet s:t_Co s:italics
+ finish
+ endif
+ " Light background
+ hi Normal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi IncSearch ctermfg=DarkMagenta ctermbg=NONE cterm=reverse
+ hi Search ctermfg=DarkYellow ctermbg=NONE cterm=reverse
+ hi! link QuickFixLine Search
+ hi Visual ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi MatchParen ctermfg=LightYellow ctermbg=DarkGrey cterm=bold
+ hi Cursor ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi! link lCursor Cursor
+ hi CursorLine ctermfg=NONE ctermbg=Black cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=Black cterm=NONE
+ hi Folded ctermfg=NONE ctermbg=Black cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi LineNr ctermfg=LightGrey ctermbg=Black cterm=NONE
+ hi CursorLineNr ctermfg=White ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=LightGrey ctermbg=LightGrey cterm=NONE
+ hi StatusLine ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi StatusLineNC ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi TabLineSel ctermfg=White ctermbg=Black cterm=bold,reverse
+ hi TabLine ctermfg=LightGrey ctermbg=NONE cterm=reverse
+ hi TabLineFill ctermfg=LightGrey ctermbg=NONE cterm=reverse
+ hi ToolbarButton ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi Pmenu ctermfg=LightGrey ctermbg=Black cterm=NONE
+ hi PmenuSel ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=LightGrey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=DarkGrey cterm=NONE
+ hi DiffAdd ctermfg=DarkGreen ctermbg=Black cterm=NONE
+ hi DiffChange ctermfg=NONE ctermbg=Black cterm=NONE
+ hi DiffDelete ctermfg=DarkRed ctermbg=Black cterm=NONE
+ hi DiffText ctermfg=Black ctermbg=DarkYellow cterm=NONE
+ hi Comment ctermfg=LightGrey ctermbg=NONE cterm=italic
+ hi Constant ctermfg=DarkCyan ctermbg=NONE cterm=NONE
+ hi! link String Constant
+ hi! link Number Constant
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Float Constant
+ hi Identifier ctermfg=LightBlue ctermbg=NONE cterm=NONE
+ hi! link Function Identifier
+ hi Statement ctermfg=LightYellow ctermbg=NONE cterm=NONE
+ hi! link Conditional Statement
+ hi! link Repeat Statement
+ hi! link Keyword Statement
+ hi! link Label Statement
+ hi! link Exception Statement
+ hi! link Operator Statement
+ hi PreProc ctermfg=DarkMagenta ctermbg=NONE cterm=NONE
+ hi! link Define PreProc
+ hi! link PreCondit PreProc
+ hi! link Include PreProc
+ hi! link Macro Include
+ hi Type ctermfg=DarkGreen ctermbg=NONE cterm=NONE
+ hi! link Typedef Type
+ hi! link StorageClass Type
+ hi! link Structure Type
+ hi Special ctermfg=DarkRed ctermbg=NONE cterm=NONE
+ hi! link SpecialChar Special
+ hi! link Delimiter Special
+ hi! link SpecialComment Special
+ hi! link Debug Special
+ hi! link Tag Special
+ hi Error ctermfg=DarkRed ctermbg=NONE cterm=bold
+ hi Todo ctermfg=DarkMagenta ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=LightBlue ctermbg=NONE cterm=underline
+ hi Ignore ctermfg=DarkGrey ctermbg=NONE cterm=NONE
+ hi VimCommand ctermfg=DarkYellow ctermbg=NONE cterm=NONE
+ hi RubyDefine ctermfg=White ctermbg=NONE cterm=bold
+ if !s:italics
+ hi Comment cterm=NONE
+ endif
+ if get(g:, 'selenized_green_keywords', 0)
+ hi Statement ctermfg=DarkGreen ctermbg=NONE cterm=NONE
+ hi Type ctermfg=DarkYellow ctermbg=NONE cterm=NONE
+ endif
+ hi Terminal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Question ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=NONE ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=NONE ctermbg=NONE cterm=NONE
+ unlet s:t_Co s:italics
+ finish
+endif
+
+" Background: dark
+" Color: bg_0 #181818 ~ none
+" Color: bg_1 #252525 ~ Black
+" Color: bg_2 #3b3b3b ~ DarkGrey
+" Color: dim_0 #777777 ~ LightGrey
+" Color: fg_0 #b9b9b9 ~ none
+" Color: fg_1 #dedede ~ White
+" Color: red #ed4a46 203 DarkRed
+" Color: green #70b433 ~ DarkGreen
+" Color: yellow #dbb32d ~ DarkYellow
+" Color: blue #368aeb 33 DarkBlue
+" Color: magenta #eb6eb7 ~ DarkMagenta
+" Color: cyan #3fc5b7 ~ DarkCyan
+" Color: br_red #ff5e56 ~ LightRed
+" Color: br_green #83c746 ~ LightGreen
+" Color: br_yellow #efc541 178 LightYellow
+" Color: br_blue #4f9cfe 39 LightBlue
+" Color: br_magenta #ff81ca ~ LightMagenta
+" Color: br_cyan #56d8c9 ~ LightCyan
+" Color: orange #e67f43 ~ DarkMagenta
+" Color: violet #a580e2 ~ LightBlue
+" Color: br_orange #fa9153 ~ LightMagenta
+" Color: br_violet #b891f5 ~ LightBlue
+" Term colors: bg_1 red green yellow blue magenta cyan dim_0
+" Term colors: bg_2 br_red br_green br_yellow br_blue br_magenta br_cyan fg_1
+" Background: light
+" Color: bg_0 #ffffff ~ none
+" Color: bg_1 #ebebeb ~ Black
+" Color: bg_2 #cdcdcd ~ DarkGrey
+" Color: dim_0 #878787 ~ LightGrey
+" Color: fg_0 #474747 ~ none
+" Color: fg_1 #282828 ~ White
+" Color: red #d6000c ~ DarkRed
+" Color: green #1d9700 ~ DarkGreen
+" Color: yellow #c49700 ~ DarkYellow
+" Color: blue #0064e4 ~ DarkBlue
+" Color: magenta #dd0f9d ~ DarkMagenta
+" Color: cyan #00ad9c ~ DarkCyan
+" Color: br_red #bf0000 ~ LightRed
+" Color: br_green #008400 ~ LightGreen
+" Color: br_yellow #af8500 ~ LightYellow
+" Color: br_blue #0054cf ~ LightBlue
+" Color: br_magenta #c7008b ~ LightMagenta
+" Color: br_cyan #009a8a ~ LightCyan
+" Color: orange #d04a00 ~ DarkMagenta
+" Color: violet #7f51d6 ~ LightBlue
+" Color: br_orange #ba3700 ~ LightMagenta
+" Color: br_violet #6b40c3 ~ LightBlue
+" Term colors: bg_1 red green yellow blue magenta cyan dim_0
+" Term colors: bg_2 br_red br_green br_yellow br_blue br_magenta br_cyan fg_1
+" vim: et ts=2 sw=2
+
+ hi NonText ctermbg=none
+ hi Normal guibg=NONE ctermbg=NONE
diff --git a/nvim/init.vim b/nvim/init.vim
@@ -0,0 +1,238 @@
+" Hello and welcome!
+
+let mapleader =","
+
+if ! filereadable(expand('~/.config/nvim/autoload/plug.vim'))
+ echo "Downloading junegunn/vim-plug to manage plugins..."
+ silent !mkdir -p ~/.config/nvim/autoload/
+ silent !curl "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim" > ~/.config/nvim/autoload/plug.vim
+ autocmd VimEnter * PlugInstall
+endif
+
+call plug#begin('~/.config/nvim/plugged')
+
+ Plug 'machakann/vim-sandwich'
+ Plug 'tpope/vim-commentary'
+
+ Plug 'junegunn/goyo.vim'
+ Plug 'junegunn/limelight.vim'
+
+ Plug 'kovetskiy/sxhkd-vim' " detects sxhkd filetype, handles highlighting and indentation
+ Plug 'frazrepo/vim-rainbow'
+ Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() } }
+
+ Plug 'ap/vim-css-color'
+
+ " theming
+
+ syntax on
+
+ " active full color palette before theming
+ if (has("termguicolors"))
+ set termguicolors
+ endif
+
+ colorscheme selenized_bw
+ set background=dark
+ " make background transparent
+ hi NonText ctermbg=none
+ hi Normal guibg=NONE ctermbg=NONE
+
+ Plug 'bling/vim-airline'
+ Plug 'vim-airline/vim-airline-themes'
+ let g:airline_theme='akhatib'
+
+
+call plug#end()
+
+" path to python
+ let g:python3_host_prog = '/usr/bin/python3'
+ let g:python_host_prog = '/usr/bin/python2'
+
+
+" Some basics:
+ set go=a
+ set mouse=a " automatically enable mouse usage
+ set completeopt+=preview
+
+
+ autocmd! CompleteDone * if pumvisible() == 0 | pclose | endif
+
+
+ " search
+ set incsearch " find as you type
+ set hlsearch " highlight search terms
+ set ignorecase " case insensitive search
+ set smartcase " case sensitive when upper case present
+ " clear current search highlighting with //
+ nmap <silent> // :nohlsearch<CR>
+
+ " indentation and tabbing
+ filetype indent on
+ set autoindent
+ set tabstop
+ set expandtab
+ set softtabstop=4
+ set shiftwidth=4
+
+ set clipboard+=unnamedplus
+ set updatetime=300
+ set nocompatible
+ set encoding=utf-8
+ set number relativenumber
+ autocmd CursorHold * update
+ set nofoldenable
+ set noswapfile
+ filetype plugin on
+ set foldmethod=syntax
+
+
+ nnoremap <leader>sv :source $MYVIMRC<cr>
+
+" Enable autocompletion:
+ set wildmode=longest,list,full
+
+" Shortcutting split navigation:
+ map <C-h> <C-w>h
+ map <C-j> <C-w>j
+ map <C-k> <C-w>k
+ map <C-l> <C-w>l
+
+" Move up and down in autocomplete with <c-j> and <c-k>
+ inoremap <expr> <C-j> ("\<C-n>")
+ inoremap <expr> <C-k> ("\<C-p>")
+
+" Disables automatic commenting on newline:
+ autocmd FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
+
+" vim rainbow settings
+ let g:rainbow_active = 1
+
+" run Black with F9
+ " nnoremap <F9> :Black<CR>
+
+" Goyo plugin makes text more readable when writing prose:
+ map <leader>f :Goyo \| set linebreak<CR>
+
+" Spell-check set to <leader>o, 'o' for 'orthography':
+ map <leader>o :setlocal spell! spelllang=en_us<CR>
+
+" Splits open at the bottom and right.
+ set splitbelow splitright
+
+" Shortcut split opening
+ nnoremap <leader>h :split<Space>
+ nnoremap <leader>v :vsplit<Space>
+
+" Check file in shellcheck:
+ map <leader>s :!clear && shellcheck %<CR>
+
+" Open my bibliography file in split
+ " map <leader>b :vsp<space>$BIB<CR>
+ " map <leader>r :vsp<space>$REFER<CR>
+" Replace all is aliased to S.
+ nnoremap S :%s//g<Left><Left>
+
+" Compile document, be it groff/LaTeX/markdown/etc.
+ map <leader>c :w! \| !compiler <c-r>%<CR>
+
+" Open corresponding .pdf/.html or preview
+ map <leader>p :!opout <c-r>%<CR><CR>
+
+
+ autocmd BufRead,BufNewFile /tmp/calcurse* set filetype=markdown
+ autocmd BufRead,BufNewFile *.ms,*.me,*.mom,*.man set filetype=groff
+ autocmd BufRead,BufNewFile *.tex set filetype=tex
+
+" Goyo and Limelight activate and deactivated together
+ autocmd! User GoyoEnter Limelight
+ autocmd! User GoyoLeave Limelight!
+
+" Enable Goyo by default for mutt writting
+ " Goyo's width will be the line limit in mutt.
+ autocmd BufRead,BufNewFile /tmp/neomutt* let g:goyo_width=80
+ autocmd BufRead,BufNewFile /tmp/neomutt* :Goyo
+
+" Enable Goyo by default for markdown writing
+ autocmd BufRead,BufNewFile *.md :Goyo
+
+" Color name (:help cterm-colors) or ANSI code
+ let g:limelight_conceal_ctermfg = 'gray'
+ let g:limelight_conceal_ctermfg = 240
+
+" Color name (:help gui-colors) or RGB color
+ let g:limelight_conceal_guifg = 'DarkGray'
+ let g:limelight_conceal_guifg = '#777777'
+
+" Automatically deletes all trailing whitespace on save.
+ autocmd BufWritePre * %s/\s\+$//e
+
+" When shortcut files are updated:
+ autocmd BufWritePost ~/.config/bmdirs,~/.config/bmfiles !shortcuts
+
+" Update binds when sxhkdrc is updated.
+ autocmd BufWritePost *sxhkdrc !pkill -USR1 sxhkd
+
+" Run xrdb whenever Xdefaults or Xresources are updated.
+ autocmd BufWritePost *Xresources,*Xdefaults !xrdb %
+
+" Alias write and quit to Q
+ nnoremap Q :wq<CR>
+
+" Navigating with guides
+ inoremap ;g <++>
+ inoremap <leader><leader> <Esc>/<++><Enter>"_c4l
+ vnoremap <leader><leader> <Esc>/<++><Enter>"_c4l
+ map <leader><leader> <Esc>/<++><Enter>"_c4l
+
+" Save file as sudo on files that require root permission
+ cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
+
+" markdown
+ autocmd Filetype markdown,rmd map <leader>w yiWi[<esc>Ea](<esc>pa)
+ autocmd Filetype markdown,rmd inoremap ,n ---<Enter><Enter>
+ autocmd Filetype markdown,rmd inoremap ,b ****<++><Esc>F*hi
+ autocmd Filetype markdown,rmd inoremap ,s ~~~~<++><Esc>F~hi
+ autocmd Filetype markdown,rmd inoremap ,e **<++><Esc>F*i
+ autocmd Filetype markdown,rmd inoremap ,h ====<Space><++><Esc>F=hi
+ autocmd Filetype markdown,rmd inoremap ,i ![](<++>)<++><Esc>F[a
+ autocmd Filetype markdown,rmd inoremap ,a [](<++>)<++><Esc>F[a
+ autocmd Filetype markdown,rmd inoremap ,1 #<Space><Enter><++><Esc>kA
+ autocmd Filetype markdown,rmd inoremap ,2 ##<Space><Enter><++><Esc>kA
+ autocmd Filetype markdown,rmd inoremap ,3 ###<Space><Enter><++><Esc>kA
+ autocmd Filetype markdown,rmd inoremap ,l --------<Enter>
+ autocmd Filetype rmd inoremap ,r ```{r}<CR>```<CR><CR><esc>2kO
+ autocmd Filetype rmd inoremap ,p ```{python}<CR>```<CR><CR><esc>2kO
+ autocmd Filetype rmd inoremap ,c ```<cr>```<cr><cr><esc>2kO
+
+" markdown preview
+ " set to 1, nvim will open the preview window after entering the markdown buffer
+ " default: 0
+ let g:mkdp_auto_start = 0
+
+ " set to 1, the nvim will auto close current preview window when change
+ " from markdown buffer to another buffer
+ " default: 1
+ let g:mkdp_auto_close = 1
+
+ " set to 1, the vim will refresh markdown when save the buffer or
+ " leave from insert mode, default 0 is auto refresh markdown as you edit or
+ " move the cursor
+ " default: 0
+ let g:mkdp_refresh_slow = 0
+
+ " set to 1, the MarkdownPreview command can be use for all files,
+ " by default it can be use in markdown file
+ " default: 0
+ let g:mkdp_command_for_global = 0
+
+ " preview page title
+ " ${name} will be replace with the file name
+ let g:mkdp_page_title = '「${name}」'
+
+" citations
+ let g:citation_vim_bibtex_file="repos/life/dox/acad.bib"
+ let g:citation_vim_mode="bibtex"
+ let g:citation_vim_cache_path='~/.config/nvim/cache'
+ let g:citation_vim_description_format = "{} ┃ {} ┃ {} ┃ {} ┃ {}"
+ let g:citation_vim_description_fields = ["key","author","publication","journal","doi"]
diff --git a/nvim/spell/en.utf-8.add b/nvim/spell/en.utf-8.add
@@ -0,0 +1,12 @@
+confounders
+Zhao
+SHAP
+explainability
+performant
+GBM
+untuned
+Rajkomar
+ROC-AUC
+SVM
+ROC
+PDPs
diff --git a/nvim/spell/en.utf-8.add.spl b/nvim/spell/en.utf-8.add.spl
Binary files differ.
diff --git a/pam/pam_environment b/pam/pam_environment
@@ -0,0 +1,3 @@
+SSH_AGENT_PID DEFAULT=
+SSH_AUTH_SOCK DEFAULT="${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh"
+GNUPGHOME DEFAULT="/home/beau/.config/gnupg"
diff --git a/profile b/profile
@@ -0,0 +1,86 @@
+#!/usr/bin/env sh
+
+# Profile file. Runs on login.
+
+# Adds ruby to path
+PATH="$PATH:$(ruby -e 'puts Gem.user_dir')/bin"
+
+# Adds `~/.local/bin/` and all subdirectories to $PATH
+export PATH="$PATH:$(du "$HOME/.local/bin/" | cut -f2 | tr '\n' ':' | sed 's/:*$//')"
+
+export EDITOR="nvim"
+export TERMINAL="st"
+export BROWSER="chromium"
+export READER="zathura"
+export FILE="nnn"
+
+export XDG_CONFIG_HOME="$HOME/.config"
+export XDG_DATA_HOME="$HOME/.local/share"
+export XDG_CACHE_HOME="$HOME/.cache"
+
+# export XAUTHORITY="$XDG_RUNTIME_DIR/Xauthority" # mess with this sometime
+
+export BIB="$HOME/repos/life/dox/acad.bib"
+export REFER="$HOME/repos/life/dox/thesis/thesis.refer"
+
+export CARGO_HOME="$XDG_DATA_HOME"/cargo
+export GEM_HOME="$XDG_DATA_HOME"/gem
+export GEM_SPEC_CACHE="$XDG_CACHE_HOME"/gem
+export NPM_CONFIG_USERCONFIG=$XDG_CONFIG_HOME/npm/npmrc
+
+export LESSHISTFILE="-"
+export SUDO_ASKPASS="$HOME/.local/bin/tools/dmenupass"
+export NOTMUCH_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/notmuch-config"
+export GTK2_RC_FILES="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-2.0/gtkrc-2.0"
+export ZDOTDIR="${XDG_CONFIG_HOME:-$HOME/.config}/zsh"
+export WGETRC="${XDG_CONFIG_HOME:-$HOME/.config}/wget/wgetrc"
+export INPUTRC="${XDG_CONFIG_HOME:-$HOME/.config}/inputrc"
+export PASSWORD_STORE_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/password-store"
+export XINITRC="$XDG_CONFIG_HOME"/X11/xinitrc
+export WAKATIME_HOME="$XDG_CONFIG_HOME"/wakatime
+export MAILCAPS="$XDG_CONFIG_HOME"/tuir/mailcap
+
+export CONDARC="${XDG_CONFIG_HOME:-$HOME/.config}/conda/.condarc"
+export IPYTHONDIR="${XDG_CONFIG_HOME:-$HOME/.config}/jupyter"
+export JUPYTER_CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/jupyter"
+
+export R_ENVIRON_USER="${XDG_CONFIG_HOME:-$HOME/.config}/R/Renviron"
+
+export GPG_TTY=$(tty)
+export GPG_AGENT_INFO=""
+
+# less/man colors
+export LESS=-R
+export LESS_TERMCAP_mb="$(printf '%b' '[1;31m')"; a="${a%_}"
+export LESS_TERMCAP_md="$(printf '%b' '[1;36m')"; a="${a%_}"
+export LESS_TERMCAP_me="$(printf '%b' '[0m')"; a="${a%_}"
+export LESS_TERMCAP_so="$(printf '%b' '[01;44;33m')"; a="${a%_}"
+export LESS_TERMCAP_se="$(printf '%b' '[0m')"; a="${a%_}"
+export LESS_TERMCAP_us="$(printf '%b' '[1;32m')"; a="${a%_}"
+export LESS_TERMCAP_ue="$(printf '%b' '[0m')"; a="${a%_}"
+
+mpd >/dev/null 2>&1 &
+
+[ ! -f ~/.config/shortcutrc ] && shortcuts >/dev/null 2>&1
+
+
+# Start SSH Agent automatically on login
+if [ -z "$SSH_AUTH_SOCK" ]
+then
+ # Check for a currently running instance of the agent
+ RUNNING_AGENT="`ps -ax | grep 'ssh-agent -s' | grep -v grep | wc -l | tr -d '[:space:]'`"
+ if [ "$RUNNING_AGENT" = "0" ]
+ then
+ # Launch a new instance of the agent
+ ssh-agent -s &> .ssh/ssh-agent
+ fi
+ eval `cat .ssh/ssh-agent`
+fi
+
+# Start graphical server on tty1 if not already running.
+[ "$(tty)" = "/dev/tty1" ] && ! ps -e | grep -qw Xorg && exec startx "$XDG_CONFIG_HOME/X11/xinitrc" --
+
+# Switch escape and caps if tty:
+sudo -n loadkeys ~/.local/bin/ttymaps.kmap 2>/dev/null
+
+gpg-connect-agent updatestartuptty /bye >/dev/null
diff --git a/rclone/rclone.conf b/rclone/rclone.conf
@@ -0,0 +1,10 @@
+[cwru]
+type = drive
+scope = drive
+token = {"access_token":"ya29.Il-xBzcsu4NNxBhayBYW1MbXPoRjPKz8-vvUQrH7YE-FjofBuEOIbgckRwaI3ru_uXvVAAMhKRoBT8FFRrYoNi_MWns71We7Bxw1a6tQIkF5swEYCORmCtGW-DNC-0-jqA","token_type":"Bearer","refresh_token":"1//04TDdz5vPTf4xCgYIARAAGAQSNwF-L9IrG4bHUjzB6aDEMUp7UoYrXhWbyiy0ratQte7-jhM9q4HYkFFVEU5hKLIaBYkxEhDL0M4","expiry":"2019-11-19T19:18:55.11796147-05:00"}
+
+[cbh]
+type = drive
+scope = drive
+token = {"access_token":"ya29.Il-xB1V-6F9xlb_PADHEv2n6TMIirOEkwwonOnM0XCL-fBt4LJLaCduLxAG0lSgrfWRBJgb7n_okqWy0u08TC37ZT8mQoOJORZh5dCmYZ9xqWm5f2_9rzOXU4svSezd5CQ","token_type":"Bearer","refresh_token":"1//04rykCrKN52DDCgYIARAAGAQSNwF-L9Iralm6EdCL03Piagrr0iSYrcLvKF67GOuA7PPLOfGh046xW9Zfq9TUBI6MB2bZ6adJZdg","expiry":"2019-11-19T19:20:14.801067957-05:00"}
+
diff --git a/shortcutrc b/shortcutrc
@@ -0,0 +1,23 @@
+# vim: filetype=sh
+alias h="cd ~/ && ls -a" \
+d="cd ~/dox && ls -a" \
+D="cd ~/dl && ls -a" \
+m="cd ~/tunes && ls -a" \
+pp="cd ~/pix && ls -a" \
+vv="cd ~/vids && ls -a" \
+cf="cd ~/.config && ls -a" \
+sc="cd ~/.local/bin && ls -a" \
+mn="cd /mnt && ls -a" \
+bf="$EDITOR ~/.config/bmfiles" \
+bd="$EDITOR ~/.config/bmdirs" \
+cfb="$EDITOR ~/.bashrc" \
+cfa="$EDITOR ~/.config/aliasrc" \
+cfz="$EDITOR ~/.zshrc" \
+cfv="$EDITOR ~/.config/nvim/init.vim" \
+cfm="$EDITOR ~/.config/mutt/muttrc" \
+cfd="$EDITOR ~/.Xdefaults" \
+cfu="$EDITOR ~/.config/newsboat/urls" \
+cfn="$EDITOR ~/.config/newsboat/config" \
+cfmb="$EDITOR ~/.config/ncmpcpp/bindings" \
+cfmc="$EDITOR ~/.config/ncmpcpp/config" \
+cfk="$EDITOR ~/.config/sxhkd/sxhkdrc" \
diff --git a/sxhkd/sxhkdrc b/sxhkd/sxhkdrc
@@ -0,0 +1,150 @@
+# Basic binds
+super + Return
+ $TERMINAL -e tmux
+super + d
+ dmenu_run
+super + r
+ $TERMINAL -e $FILE
+super + e
+ $TERMINAL -e neomutt; pkill -RTMIN+12 blocks
+super + m
+ $TERMINAL -e ncmpcpp
+super + n
+ $TERMINAL -e newsboat
+super + i
+ $TERMINAL -e htop
+super + c
+ $TERMINAL -e calcurse -D ~/.config/calcurse
+super + v
+ $TERMINAL -e $EDITOR ~/repos/vimwiki/index.md
+super + shift + a
+ $TERMINAL -e pulsemixer; pkill -RTMIN+10 i3blocks
+super + shift + c
+ camtoggle
+super + shift + e
+ tutorialvids
+super + w
+ $BROWSER
+super + shift + w
+ $TERMINAL -e sudo nmtui
+super + shift + g
+ gimp
+
+# Et cetera...
+super + grave
+ dmenuunicode
+super + Scroll_Lock
+ killall screenkey || screenkey
+super + Insert
+ showclip
+super + Pause
+ xcqr
+super + shift + x
+ prompt "Shutdown computer?" "sudo -A shutdown -h now"
+super + shift + BackSpace
+ prompt "Reboot computer?" "sudo -A shutdown -r now"
+super + x
+ mpc pause; pauseallmpv; i3lock -e -f -c 1d2021; xset dpms force off
+XF86Launch1
+ xset dpms force off
+XF86AudioMute
+ lmc mute
+XF86AudioLowerVolume
+ lmc down 5
+shift+XF86AudioLowerVolume
+ lmc down 10
+control+XF86AudioLowerVolume
+ lmc down 1
+XF86AudioRaiseVolume
+ lmc up 5
+shift+XF86AudioRaiseVolume
+ lmc up 10
+control+XF86AudioRaiseVolume
+ lmc up 1
+XF86AudioNext
+ lmc next
+XF86AudioPlay
+ lmc toggle
+XF86AudioPrev
+ lmc prev
+XF86AudioStop
+ lmc toggle
+XF86MonBrightnessDown
+ xbacklight -dec 15
+XF86MonBrightnessUp
+ xbacklight -inc 15
+
+
+# Recording
+# Take screenshot
+Print
+ maim pic-full-$(date '+%y%m%d-%H%M-%S').png
+# Pick screenshot type
+shift + Print
+ maimpick
+# Record audio or video
+super + Print
+ dmenurecord
+super + End
+ dmenurecord
+# kill active recording
+super + Delete
+ dmenurecord kill
+
+# Pause audio
+super + {_,shift +} p
+ lmc {toggle,pause}
+# Changes to next/previous tracks
+super + {comma,period}
+ lmc {prev,next}
+# Restart track
+super + shift + less
+ lmc replay
+# Increase volume
+super + {equal,plus}
+ lmc up {5,15}
+# Decrease volume
+super {_,shift +} + minus
+ lmc down {5,15}
+# Seek foward in song
+super + {_,shift +} bracketright
+ lmc forward {10,120}
+# Seek backward in song
+super + {_,shift +} bracketleft
+ lmc back {10,120}
+
+# Function keys
+# Show readme
+super + F1
+ groff -mom $HOME/.local/share/larbs/readme.mom -Tpdf | zathura -
+# F2 is restart in dwm.
+# Change display
+super + F3
+ displayselect
+# Hibernate
+super + F4
+ prompt 'Hibernate computer?' 'sudo systemctl suspend'
+# Restart/rescan wifi/eth networks
+super + F5
+ sudo -A systemctl restart NetworkManager
+# Start torrent daemon/open interface
+super + F6
+ torwrap
+# toggle torrent daemon
+super + F7
+ td-toggle
+# sync email
+super + F8
+ mailsync
+# Mount a USB drive or Android device
+super + F9
+ dmenumount
+# Unmount a USB drive or Android device
+super + F10
+ dmenuumount
+# Search with Duckduckgo
+super + F11
+ ducksearch
+# Network Manager interface
+super + F12
+ $TERMINAL -e sudo -A nmtui
diff --git a/sxiv/exec/key-handler b/sxiv/exec/key-handler
@@ -0,0 +1,32 @@
+#!/usr/bin/env sh
+while read file
+do
+ case "$1" in
+ "w") setbg "$file" & ;;
+ "c")
+ [ -z "$destdir" ] && destdir="$(sed "s/\s.*#.*$//;/^\s*$/d" ~/.config/bmdirs | awk '{print $2}' | dmenu -l 20 -i -p "Copy file(s) to where?" | sed "s|~|$HOME|g")"
+ [ -z "$destdir" ] && exit
+ cp "$file" "$destdir" && notify-send -i "$(readlink -f "$file")" "$file copied to $destdir." &
+ ;;
+ "m")
+ [ -z "$destdir" ] && destdir="$(sed "s/\s.*#.*$//;/^\s*$/d" ~/.config/bmdirs | awk '{print $2}' | dmenu -l 20 -i -p "Move file(s) to where?" | sed "s|~|$HOME|g")"
+ [ -z "$destdir" ] && exit
+ mv "$file" "$destdir" && notify-send -i "$(readlink -f "$file")" "$file moved to $destdir." &
+ ;;
+ "r")
+ convert -rotate 90 "$file" "$file" ;;
+ "R")
+ convert -rotate -90 "$file" "$file" ;;
+ "f")
+ convert -flop "$file" "$file" ;;
+ "y")
+ echo -n "$file" | xclip -selection clipboard &&
+ notify-send "$file copied to clipboard" & ;;
+ "Y")
+ readlink -f "$file" | xclip -selection clipboard &&
+ notify-send "$(readlink -f "$file") copied to clipboard" & ;;
+ "d")
+ [ "$(printf "No\\nYes" | dmenu -i -p "Really delete $file?")" = "Yes" ] && rm "$file" && notify-send "$file deleted." ;;
+ "g") ifinstalled gimp && gimp "$file" & ;;
+ esac
+done
diff --git a/systemd/user/ssh-agent.service b/systemd/user/ssh-agent.service
@@ -0,0 +1,23 @@
+# setup module
+echo '[Unit]
+Description=SSH key agent
+
+[Service]
+Type=simple
+Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
+ExecStart=/usr/bin/ssh-agent -D -a $SSH_AUTH_SOCK
+
+[Install]
+WantedBy=default.target' \
+ > ~/.config/systemd/user/ssh-agent.service
+
+# setup environment
+echo 'SSH_AUTH_SOCK DEFAULT="${XDG_RUNTIME_DIR}/ssh-agent.socket"' \
+ > ~/.pam_environment
+
+# enable now and at boot
+systemctl --user start ssh-agent
+systemctl --user enable ssh-agent
+
+# enable lingering
+loginctl enable-linger $(whoami)
diff --git a/tmux/tmux.conf b/tmux/tmux.conf
@@ -0,0 +1,49 @@
+
+unbind C-b
+set -g prefix '\'
+bind-key '\' send-prefix
+
+# activate truecolor support
+set -g default-terminal "tmux-256color"
+set -ga terminal-overrides ",*256col*:Tc"
+set status-bg default
+set-option -g status-right ' [#(git branch)]#[fg=white] #[fg=white]%R %m-%d#(acpi | cut -d ',' -f 2)#[default]'
+
+setw -g mode-keys vi
+set -g mouse on
+setw -g automatic-rename
+set -g history-limit 30000
+set-option -g visual-activity on
+set-option -g set-titles on
+set-option -g set-titles-string '#H:#S.#I.#P #W #T'
+
+# copy-pasta
+set -g set-clipboard external
+bind-key P paste-buffer
+bind -T copy-mode-vi v send-keys -X begin-selection
+bind -T copy-mode-vi r send-keys -X rectangle-toggle
+bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -i -f -selection primary"
+bind C-y run "tmux save-buffer - | xclip -i -sel primary"
+bind C-p run "tmux set-buffer -- \"$(xclip -o -sel primary);\"; tmux paste-buffer -p"
+# Selection with mouse copies to clipboard, in addition to the default action.
+unbind -n -Tcopy-mode-vi MouseDragEnd1Pane
+bind -Tcopy-mode-vi MouseDragEnd1Pane send -X copy-selection-and-cancel\; run "tmux save-buffer - | xclip -i -sel clipboard > /dev/null"
+# Middle click to paste from the clipboard
+unbind-key MouseDown2Pane
+bind-key -n MouseDown2Pane run "tmux set-buffer -- \"$(xclip -o -sel primary);\"; tmux paste-buffer -p"
+
+bind-key r source-file ~/.config/tmux/tmux.conf
+bind-key Space list-panes
+
+set-window-option -g window-status-current-style bg=red
+setw -g aggressive-resize on
+bind-key h select-pane -L
+bind-key j select-pane -D
+bind-key k select-pane -U
+bind-key l select-pane -R
+bind-key -r C-h resize-pane -L
+bind-key -r C-j resize-pane -D
+bind-key -r C-k resize-pane -U
+bind-key -r C-l resize-pane -R
+
+
diff --git a/tuir/mailcap b/tuir/mailcap
@@ -0,0 +1,70 @@
+# Example mailcap file for Terminal UI for Reddit
+# https://gitlab.com/ajak/tuir/
+#
+# Copy the contents of this file to {HOME}/.mailcap, or point to it using $MAILCAPS
+# Then launch TUIR using the --enable-media flag. All shell commands defined in
+# this file depend on external programs that must be installed on your system.
+#
+# HELP REQUESTED! If you come up with your own commands (especially for OS X)
+# and would like to share, please post an issue on the GitHub tracker and we
+# can get them added to this file as references.
+#
+#
+# Mailcap 101
+# - The first entry with a matching MIME type will be executed, * is a wildcard
+# - %s will be replaced with the image or video url
+# - Add ``test=test -n "$DISPLAY"`` if your command opens a new window
+# - Add ``needsterminal`` for commands that use the terminal
+# - Add ``copiousoutput`` for commands that dump text to stdout
+
+###############################################################################
+# Commands below this point will open media in a separate window without
+# pausing execution of TUIR.
+###############################################################################
+
+# Feh is a simple and effective image viewer
+# Note that tuir returns a list of urls for imgur albums, so we don't put quotes
+# around the `%s`
+image/x-imgur-album; feh -g 640x480 -. %s; test=test -n "$DISPLAY"
+image/gif; mpv '%s' --autofit 640x480 --loop=inf; test=test -n "$DISPLAY"
+image/*; feh -g 640x480 -. '%s'; test=test -n "$DISPLAY"
+
+# Youtube videos are assigned a custom mime-type, which can be streamed with
+# vlc or youtube-dl.
+video/x-youtube; vlc '%s' --width 640 --height 480; test=test -n "$DISPLAY"
+video/x-youtube; mpv --ytdl-format=bestvideo+bestaudio/best '%s' --autofit 640x480; test=test -n "$DISPLAY"
+
+# Mpv is a simple and effective video streamer
+video/*; mpv '%s' --autofit 640x480 --loop=inf; test=test -n "$DISPLAY"
+
+###############################################################################
+# Commands below this point will attempt to display media directly in the
+# terminal when a desktop is not available (e.g. inside of an SSH session)
+###############################################################################
+
+# View images directly in your terminal with iTerm2
+# curl -L https://iterm2.com/misc/install_shell_integration_and_utilities.sh | bash
+# image/*; bash -c '[[ "%s" == http* ]] && (curl -s %s | ~/.iterm2/imgcat) || ~/.iterm2/imgcat %s' && read -n 1; needsterminal
+
+# View true images in the terminal, supported by rxvt-unicode, xterm and st
+# Requires the w3m-img package
+# image/*; w3m -o 'ext_image_viewer=off' '%s'; needsterminal
+
+# Don't have a solution for albums yet
+image/x-imgur-album; echo
+
+# 256 color images using half-width unicode characters
+# Much higher quality that img2txt, but must be built from source
+# https://github.com/rossy/img2xterm
+image/*; curl -s '%s' | convert -resize 80x80 - jpg:/tmp/tuir.jpg && img2xterm /tmp/tuir.jpg; needsterminal; copiousoutput
+
+# Display images in classic ascii using img2txt and lib-caca
+image/*; curl -s '%s' | convert - jpg:/tmp/tuir.jpg && img2txt -f utf8 /tmp/tuir.jpg; needsterminal; copiousoutput
+
+# Full motion videos - requires a framebuffer to view
+video/x-youtube; mpv -vo drm -quiet '%s'; needsterminal
+video/*; mpv -vo drm -quiet '%s'; needsterminal
+
+# Ascii videos
+# video/x-youtube; youtube-dl -q -o - '%s' | mplayer -cache 8192 -vo caca -quiet -; needsterminal
+# video/*; wget '%s' -O - | mplayer -cache 8192 -vo caca -quiet -; needsterminal
diff --git a/tuir/tuir.cfg b/tuir/tuir.cfg
@@ -0,0 +1,186 @@
+; Terminal UI for Reddit Configuration File
+; https://gitlab.com/ajak/tuir
+;
+; This file should be placed in $XDG_CONFIG/tuir/tuir.cfg
+; If $XDG_CONFIG is not set, use ~/.config/tuir/tuir.cfg
+
+[tuir]
+##################
+# General Settings
+##################
+
+; Turn on ascii-only mode to disable all unicode characters.
+; This may be necessary for compatibility with some terminal browsers.
+ascii = False
+
+; Turn on monochrome mode to disable color.
+monochrome = False
+
+; Data being copied is piped into this command
+;clipboard_cmd = xclip
+;clipboard_cmd = xsel -b -i
+;clipboard_cmd = wl-copy
+;clipboard_cmd = pbcopy w
+
+; Flash when an invalid action is executed.
+flash = True
+
+; Enable debugging by logging all HTTP requests and errors to the given file.
+;log = /tmp/tuir.log
+
+; Default subreddit that will be opened when the program launches.
+subreddit = front
+;subreddit = python
+;subreddit = python+linux+programming
+;subreddit = all
+
+; Allow tuir to store reddit authentication credentials between sessions.
+persistent = True
+
+; Automatically log in on startup, if credentials are available.
+autologin = True
+
+; Clear any stored credentials when the program starts.
+clear_auth = False
+
+; Maximum number of opened links that will be saved in the history file.
+history_size = 200
+
+; Open external links using programs defined in the mailcap config.
+enable_media = True
+
+; Maximum number of columns for a comment
+max_comment_cols = 120
+
+; Maximum number of columns for pager
+;max_pager_cols = 70
+
+; Hide username if logged in, display "Logged in" instead
+hide_username = False
+
+; Color theme, use "tuir --list-themes" to view a list of valid options.
+; This can be an absolute filepath, or the name of a theme file that has
+; been installed into either the custom of default theme paths.
+;theme = molokai
+
+; Open a new browser window instead of a new tab in existing instance
+force_new_browser_window = False
+
+################
+# OAuth Settings
+################
+; This sections defines the paramaters that will be used during the OAuth
+; authentication process. tuir is registered as an "installed app",
+; see https://github.com/reddit/reddit/wiki/OAuth2 for more information.
+
+; These settings are defined at https://www.reddit.com/prefs/apps and should
+; not be altered unless you are defining your own developer application.
+oauth_client_id = zjyhNI7tK8ivzQ
+oauth_client_secret = praw_gapfill
+oauth_redirect_uri = http://127.0.0.1:65000/
+
+; Port that the tuir webserver will listen on. This should match the redirect
+; uri defined above.
+oauth_redirect_port = 65000
+
+; Access permissions that will be requested.
+oauth_scope = edit,history,identity,mysubreddits,privatemessages,read,report,save,submit,subscribe,vote
+
+; This is a separate token for the imgur api. It's used to extract images
+; from imgur links and albums so they can be opened with mailcap.
+; See https://imgur.com/account/settings/apps to generate your own key.
+imgur_client_id = b33d69ac8931734
+
+[bindings]
+##############
+# Key Bindings
+##############
+; If you would like to define custom bindings, copy this section into your
+; config file with the [bindings] heading. All commands must be bound to at
+; least one key for the config to be valid.
+;
+; 1.) Plain keys can be represented by either uppercase/lowercase characters
+; or the hexadecimal numbers referring their ascii codes. For reference, see
+; https://en.wikipedia.org/wiki/ASCII#ASCII_printable_code_chart
+; e.g. Q, q, 1, ?
+; e.g. 0x20 (space), 0x3c (less-than sign)
+;
+; 2.) Special ascii control codes should be surrounded with <>. For reference,
+; see https://en.wikipedia.org/wiki/ASCII#ASCII_control_code_chart
+; e.g. <LF> (enter), <ESC> (escape)
+;
+; 3.) Other special keys are defined by curses, they should be surrounded by <>
+; and prefixed with KEY_. For reference, see
+; https://docs.python.org/2/library/curses.html#constants
+; e.g. <KEY_LEFT> (left arrow), <KEY_F5>, <KEY_NPAGE> (page down)
+;
+; Notes:
+; - Curses <KEY_ENTER> is unreliable and should always be used in conjunction
+; with <LF>.
+; - Use 0x20 for the space key.
+; - A subset of Ctrl modifiers are available through the ascii control codes.
+; For example, Ctrl-D will trigger an <EOT> signal. See the table above for
+; a complete reference.
+
+; Base page
+EXIT = q
+FORCE_EXIT = Q
+HELP = ?
+SORT_1 = 1
+SORT_2 = 2
+SORT_3 = 3
+SORT_4 = 4
+SORT_5 = 5
+SORT_6 = 6
+SORT_7 = 7
+MOVE_UP = k, <KEY_UP>
+MOVE_DOWN = j, <KEY_DOWN>
+PREVIOUS_THEME = <KEY_F2>
+NEXT_THEME = <KEY_F3>
+PAGE_UP = m, <KEY_PPAGE>, <NAK>
+PAGE_DOWN = n, <KEY_NPAGE>, <EOT>
+PAGE_TOP = gg
+PAGE_BOTTOM = G
+UPVOTE = a
+DOWNVOTE = z
+LOGIN = u
+DELETE = d
+EDIT = e
+INBOX = i
+REFRESH = r, <KEY_F5>
+PROMPT = /
+SAVE = w
+COPY_PERMALINK = y
+COPY_URL = Y
+PRIVATE_MESSAGE = C
+SUBSCRIPTIONS = s
+MULTIREDDITS = S
+
+; Submission page
+SUBMISSION_TOGGLE_COMMENT = 0x20
+SUBMISSION_OPEN_IN_BROWSER = o, <LF>, <KEY_ENTER>
+SUBMISSION_POST = c
+SUBMISSION_EXIT = h, <KEY_LEFT>
+SUBMISSION_OPEN_IN_PAGER = l, <KEY_RIGHT>
+SUBMISSION_OPEN_IN_URLVIEWER = b
+SUBMISSION_GOTO_PARENT = K
+SUBMISSION_GOTO_SIBLING = J
+
+; Subreddit page
+SUBREDDIT_SEARCH = f
+SUBREDDIT_POST = c
+SUBREDDIT_OPEN = l, <KEY_RIGHT>
+SUBREDDIT_OPEN_IN_BROWSER = o, <LF>, <KEY_ENTER>
+SUBREDDIT_FRONTPAGE = p
+SUBREDDIT_HIDE = 0x20
+
+; Subscription page
+SUBSCRIPTION_SELECT = l, <LF>, <KEY_ENTER>, <KEY_RIGHT>
+SUBSCRIPTION_EXIT = h, s, S, <ESC>, <KEY_LEFT>
+
+; Inbox page
+INBOX_VIEW_CONTEXT = l, <KEY_RIGHT>
+INBOX_OPEN_SUBMISSION = o, <LF>, <KEY_ENTER>
+INBOX_REPLY = c
+INBOX_MARK_READ = w
+INBOX_EXIT = h, <ESC>, <KEY_LEFT>
diff --git a/user-dirs.dirs b/user-dirs.dirs
@@ -0,0 +1 @@
+XDG_DESKTOP_DIR="$HOME/"
diff --git a/vlc/vlc-qt-interface.conf b/vlc/vlc-qt-interface.conf
@@ -0,0 +1,24 @@
+[General]
+filedialog-path=@Variant(\0\0\0\x11\0\0\0Ofile:///home/beau/vids/mov/Ponyo%20on%20the%20Cliff%20by%20the%20Sea%202009.mkv)
+geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\xff\xff\xff\xfe\0\0\x1\xfe\0\0\x1\xc8\0\0\x3\x1\0\0\0\0\0\0\x2\0\0\0\x1\xc6\0\0\x2\xff\0\0\0\0\0\0\0\0\x5V\0\0\0\0\0\0\x2\0\0\0\x1\xc6\0\0\x2\xff)
+
+[FullScreen]
+pos=@Point(0 0)
+screen=@Rect(0 0 0 0)
+wide=false
+
+[MainWindow]
+adv-controls=0
+bgSize=@Size(1304 613)
+pl-dock-status=true
+playlist-visible=false
+playlistSize=@Size(-1 -1)
+status-bar-visible=false
+
+[OpenDialog]
+advanced=false
+size=@Size(526 400)
+
+[RecentsMRL]
+list=file:///home/beau/vids/mov/Ponyo%20on%20the%20Cliff%20by%20the%20Sea%202009.mkv, file:///home/beau/vids/mov/Song.of.the.Sea.2014.1080p.BluRay.x264.YIFY.mp4
+times=690147, 0
diff --git a/vlc/vlcrc b/vlc/vlcrc
@@ -0,0 +1,4814 @@
+###
+### vlc 3.0.8
+###
+
+###
+### lines beginning with a '#' character are comments
+###
+
+[stream_out_transcode] # Transcode stream output
+
+# Video encoder (string)
+#sout-transcode-venc=
+
+# Destination video codec (string)
+#sout-transcode-vcodec=
+
+# Video bitrate (integer)
+#sout-transcode-vb=0
+
+# Video scaling (float)
+#sout-transcode-scale=0.000000
+
+# Video frame-rate (string)
+#sout-transcode-fps=
+
+# Deinterlace video (boolean)
+#sout-transcode-deinterlace=0
+
+# Deinterlace module (string)
+#sout-transcode-deinterlace-module=deinterlace
+
+# Video width (integer)
+#sout-transcode-width=0
+
+# Video height (integer)
+#sout-transcode-height=0
+
+# Maximum video width (integer)
+#sout-transcode-maxwidth=0
+
+# Maximum video height (integer)
+#sout-transcode-maxheight=0
+
+# Video filter (string)
+#sout-transcode-vfilter=
+
+# Audio encoder (string)
+#sout-transcode-aenc=
+
+# Destination audio codec (string)
+#sout-transcode-acodec=
+
+# Audio bitrate (integer)
+#sout-transcode-ab=96
+
+# Audio language (string)
+#sout-transcode-alang=
+
+# Audio channels (integer)
+#sout-transcode-channels=0
+
+# Audio sample rate (integer)
+#sout-transcode-samplerate=0
+
+# Audio filter (string)
+#sout-transcode-afilter=
+
+# Subtitle encoder (string)
+#sout-transcode-senc=
+
+# Destination subtitle codec (string)
+#sout-transcode-scodec=
+
+# Destination subtitle codec (boolean)
+#sout-transcode-soverlay=0
+
+# Overlays (string)
+#sout-transcode-sfilter=
+
+# Number of threads (integer)
+#sout-transcode-threads=0
+
+# Picture pool size (integer)
+#sout-transcode-pool-size=10
+
+# High priority (boolean)
+#sout-transcode-high-priority=0
+
+[setid] # Change the id of an elementary stream
+
+# Elementary Stream ID (integer)
+#sout-setid-id=0
+
+# New ES ID (integer)
+#sout-setid-new-id=0
+
+# Elementary Stream ID (integer)
+#sout-setlang-id=0
+
+# Language (string)
+#sout-setlang-lang=eng
+
+[stream_out_rtp] # RTP stream output
+
+# Destination (string)
+#sout-rtp-dst=
+
+# SDP (string)
+#sout-rtp-sdp=
+
+# Muxer (string)
+#sout-rtp-mux=
+
+# SAP announcing (boolean)
+#sout-rtp-sap=0
+
+# Session name (string)
+#sout-rtp-name=
+
+# Session category (string)
+#sout-rtp-cat=
+
+# Session description (string)
+#sout-rtp-description=
+
+# Session URL (string)
+#sout-rtp-url=
+
+# Session email (string)
+#sout-rtp-email=
+
+# Transport protocol (string)
+#sout-rtp-proto=udp
+
+# Port (integer)
+#sout-rtp-port=5004
+
+# Audio port (integer)
+#sout-rtp-port-audio=0
+
+# Video port (integer)
+#sout-rtp-port-video=0
+
+# Hop limit (TTL) (integer)
+#sout-rtp-ttl=-1
+
+# RTP/RTCP multiplexing (boolean)
+#sout-rtp-rtcp-mux=0
+
+# Caching value (ms) (integer)
+#sout-rtp-caching=300
+
+# MP4A LATM (boolean)
+#sout-rtp-mp4a-latm=0
+
+# RTSP session timeout (s) (integer)
+#rtsp-timeout=60
+
+# Username (string)
+#sout-rtsp-user=
+
+# Password (string)
+#sout-rtsp-pwd=
+
+[stats] # Writes statistic info about stream
+
+# Output file (string)
+#sout-stats-output=
+
+# Prefix to show on output line (string)
+#sout-stats-prefix=stats
+
+[record] # Record stream output
+
+# Destination prefix (string)
+#sout-record-dst-prefix=
+
+[bridge] # Bridge stream output
+
+# ID (integer)
+#sout-bridge-out-id=0
+
+# Destination bridge-in name (string)
+#sout-bridge-out-in-name=default
+
+# Delay (integer)
+#sout-bridge-in-delay=0
+
+# ID Offset (integer)
+#sout-bridge-in-id-offset=8192
+
+# Name of current instance (string)
+#sout-bridge-in-name=default
+
+# Fallback to placeholder stream when out of data (boolean)
+#sout-bridge-in-placeholder=0
+
+# Placeholder delay (integer)
+#sout-bridge-in-placeholder-delay=200
+
+# Wait for I frame before toggling placeholder (boolean)
+#sout-bridge-in-placeholder-switch-on-iframe=1
+
+[es] # Elementary stream output
+
+# Output access method (string)
+#sout-es-access=
+
+# Output muxer (string)
+#sout-es-mux=
+
+# Output URL (string)
+#sout-es-dst=
+
+# Audio output access method (string)
+#sout-es-access-audio=
+
+# Audio output muxer (string)
+#sout-es-mux-audio=
+
+# Audio output URL (string)
+#sout-es-dst-audio=
+
+# Video output access method (string)
+#sout-es-access-video=
+
+# Video output muxer (string)
+#sout-es-mux-video=
+
+# Video output URL (string)
+#sout-es-dst-video=
+
+[smem] # Stream output to memory buffer
+
+# Time Synchronized output (boolean)
+#sout-smem-time-sync=1
+
+[display] # Display stream output
+
+# Enable audio (boolean)
+#sout-display-audio=1
+
+# Enable video (boolean)
+#sout-display-video=1
+
+# Delay (ms) (integer)
+#sout-display-delay=100
+
+[mosaic_bridge] # Mosaic bridge stream output
+
+# ID (string)
+#sout-mosaic-bridge-id=Id
+
+# Video width (integer)
+#sout-mosaic-bridge-width=0
+
+# Video height (integer)
+#sout-mosaic-bridge-height=0
+
+# Sample aspect ratio (string)
+#sout-mosaic-bridge-sar=1:1
+
+# Image chroma (string)
+#sout-mosaic-bridge-chroma=
+
+# Video filter (string)
+#sout-mosaic-bridge-vfilter=
+
+# Transparency (integer)
+#sout-mosaic-bridge-alpha=255
+
+# X offset (integer)
+#sout-mosaic-bridge-x=-1
+
+# Y offset (integer)
+#sout-mosaic-bridge-y=-1
+
+[delay] # Delay a stream
+
+# Elementary Stream ID (integer)
+#sout-delay-id=0
+
+# Delay of the ES (ms) (integer)
+#sout-delay-delay=0
+
+[stream_out_chromecast] # Chromecast stream output
+
+# ? (string)
+#sout-chromecast-ip=
+
+# ? (integer)
+#sout-chromecast-port=8009
+
+# ? (boolean)
+#sout-chromecast-video=1
+
+# HTTP port (integer)
+#sout-chromecast-http-port=8010
+
+# Performance warning (integer)
+sout-chromecast-show-perf-warning=0
+
+# Enable Audio passthrough (boolean)
+#sout-chromecast-audio-passthrough=0
+
+# Conversion quality (integer)
+#sout-chromecast-conversion-quality=1
+
+[stream_out_standard] # Standard stream output
+
+# Output access method (string)
+#sout-standard-access=
+
+# Output muxer (string)
+#sout-standard-mux=
+
+# Output destination (string)
+#sout-standard-dst=
+
+# Address to bind to (helper setting for dst) (string)
+#sout-standard-bind=
+
+# Filename for stream (helper setting for dst) (string)
+#sout-standard-path=
+
+# SAP announcing (boolean)
+#sout-standard-sap=0
+
+# Session name (string)
+#sout-standard-name=
+
+# Session description (string)
+#sout-standard-description=
+
+# Session URL (string)
+#sout-standard-url=
+
+# Session email (string)
+#sout-standard-email=
+
+[mono] # Stereo to mono downmixer
+
+# Use downmix algorithm (boolean)
+#sout-mono-downmix=1
+
+# Select channel to keep (integer)
+#sout-mono-channel=-1
+
+[soxr] # soxr
+
+# Resampling quality (integer)
+#soxr-resampler-quality=2
+
+[audiobargraph_a] # Audio part of the BarGraph function
+
+# Defines if BarGraph information should be sent (integer)
+#audiobargraph_a-bargraph=1
+
+# Sends the barGraph information every n audio packets (integer)
+#audiobargraph_a-bargraph_repetition=4
+
+# Defines if silence alarm information should be sent (integer)
+#audiobargraph_a-silence=1
+
+# Time window to use in ms (integer)
+#audiobargraph_a-time_window=5000
+
+# Minimum Audio level to raise the alarm (float)
+#audiobargraph_a-alarm_threshold=0.020000
+
+# Time between two alarm messages in ms (integer)
+#audiobargraph_a-repetition_time=2000
+
+[scaletempo_pitch] # Pitch Shifter
+
+# Stride Length (integer)
+#scaletempo-stride=30
+
+# Overlap Length (float)
+#scaletempo-overlap=0.200000
+
+# Search Length (integer)
+#scaletempo-search=14
+
+# Pitch Shift (float)
+#pitch-shift=0.000000
+
+[gain] # Gain control filter
+
+# Gain multiplier (float)
+#gain-value=1.000000
+
+[remap] # Audio channel remapper
+
+# Left (integer)
+#aout-remap-channel-left=0
+
+# Center (integer)
+#aout-remap-channel-center=1
+
+# Right (integer)
+#aout-remap-channel-right=2
+
+# Rear left (integer)
+#aout-remap-channel-rearleft=3
+
+# Rear center (integer)
+#aout-remap-channel-rearcenter=4
+
+# Rear right (integer)
+#aout-remap-channel-rearright=5
+
+# Side left (integer)
+#aout-remap-channel-middleleft=6
+
+# Side right (integer)
+#aout-remap-channel-middleright=7
+
+# Low-frequency effects (integer)
+#aout-remap-channel-lfe=8
+
+# Normalize channels (boolean)
+#aout-remap-normalize=1
+
+[param_eq] # Parametric Equalizer
+
+# Low freq (Hz) (float)
+#param-eq-lowf=100.000000
+
+# Low freq gain (dB) (float)
+#param-eq-lowgain=0.000000
+
+# High freq (Hz) (float)
+#param-eq-highf=10000.000000
+
+# High freq gain (dB) (float)
+#param-eq-highgain=0.000000
+
+# Freq 1 (Hz) (float)
+#param-eq-f1=300.000000
+
+# Freq 1 gain (dB) (float)
+#param-eq-gain1=0.000000
+
+# Freq 1 Q (float)
+#param-eq-q1=3.000000
+
+# Freq 2 (Hz) (float)
+#param-eq-f2=1000.000000
+
+# Freq 2 gain (dB) (float)
+#param-eq-gain2=0.000000
+
+# Freq 2 Q (float)
+#param-eq-q2=3.000000
+
+# Freq 3 (Hz) (float)
+#param-eq-f3=3000.000000
+
+# Freq 3 gain (dB) (float)
+#param-eq-gain3=0.000000
+
+# Freq 3 Q (float)
+#param-eq-q3=3.000000
+
+[equalizer] # Equalizer with 10 bands
+
+# Equalizer preset (string)
+#equalizer-preset=flat
+
+# Bands gain (string)
+#equalizer-bands=
+
+# Two pass (boolean)
+#equalizer-2pass=0
+
+# Use VLC frequency bands (boolean)
+#equalizer-vlcfreqs=1
+
+# Global gain (float)
+#equalizer-preamp=12.000000
+
+[speex_resampler] # Speex resampler
+
+# Resampling quality (integer)
+#speex-resampler-quality=4
+
+[normvol] # Volume normalizer
+
+# Number of audio buffers (integer)
+#norm-buff-size=20
+
+# Maximal volume level (float)
+#norm-max-level=2.000000
+
+[scaletempo] # Audio tempo scaler synched with rate
+
+# Stride Length (integer)
+#scaletempo-stride=30
+
+# Overlap Length (float)
+#scaletempo-overlap=0.200000
+
+# Search Length (integer)
+#scaletempo-search=14
+
+[compressor] # Dynamic range compressor
+
+# RMS/peak (float)
+#compressor-rms-peak=0.200000
+
+# Attack time (float)
+#compressor-attack=25.000000
+
+# Release time (float)
+#compressor-release=100.000000
+
+# Threshold level (float)
+#compressor-threshold=-11.000000
+
+# Ratio (float)
+#compressor-ratio=4.000000
+
+# Knee radius (float)
+#compressor-knee=5.000000
+
+# Makeup gain (float)
+#compressor-makeup-gain=7.000000
+
+[stereo_widen] # Simple stereo widening effect
+
+# Delay time (float)
+#stereowiden-delay=20.000000
+
+# Feedback gain (float)
+#stereowiden-feedback=0.300000
+
+# Crossfeed (float)
+#stereowiden-crossfeed=0.300000
+
+# Dry mix (float)
+#stereowiden-dry-mix=0.800000
+
+[spatializer] # Audio Spatializer
+
+# Room size (float)
+#spatializer-roomsize=0.850000
+
+# Room width (float)
+#spatializer-width=1.000000
+
+# Wet (float)
+#spatializer-wet=0.400000
+
+# Dry (float)
+#spatializer-dry=0.500000
+
+# Damp (float)
+#spatializer-damp=0.500000
+
+[headphone] # Headphone virtual spatialization effect
+
+# Characteristic dimension (integer)
+#headphone-dim=10
+
+# Compensate delay (boolean)
+#headphone-compensate=0
+
+# No decoding of Dolby Surround (boolean)
+#headphone-dolby=0
+
+[chorus_flanger] # Sound Delay
+
+# Delay time (float)
+#delay-time=20.000000
+
+# Sweep Depth (float)
+#sweep-depth=6.000000
+
+# Sweep Rate (float)
+#sweep-rate=6.000000
+
+# Feedback gain (float)
+#feedback-gain=0.500000
+
+# Wet mix (float)
+#wet-mix=0.400000
+
+# Dry Mix (float)
+#dry-mix=0.400000
+
+[samplerate] # Secret Rabbit Code (libsamplerate) resampler
+
+# Sample rate converter type (integer)
+#src-converter-type=2
+
+[panoramix] # Panoramix: wall with overlap video filter
+
+# Number of columns (integer)
+#panoramix-cols=-1
+
+# Number of rows (integer)
+#panoramix-rows=-1
+
+# length of the overlapping area (in %) (integer)
+#panoramix-bz-length=100
+
+# height of the overlapping area (in %) (integer)
+#panoramix-bz-height=100
+
+# Attenuation (boolean)
+#panoramix-attenuate=1
+
+# Attenuation, begin (in %) (integer)
+#panoramix-bz-begin=0
+
+# Attenuation, middle (in %) (integer)
+#panoramix-bz-middle=50
+
+# Attenuation, end (in %) (integer)
+#panoramix-bz-end=100
+
+# middle position (in %) (integer)
+#panoramix-bz-middle-pos=50
+
+# Gamma (Red) correction (float)
+#panoramix-bz-gamma-red=1.000000
+
+# Gamma (Green) correction (float)
+#panoramix-bz-gamma-green=1.000000
+
+# Gamma (Blue) correction (float)
+#panoramix-bz-gamma-blue=1.000000
+
+# Black Crush for Red (integer)
+#panoramix-bz-blackcrush-red=140
+
+# Black Crush for Green (integer)
+#panoramix-bz-blackcrush-green=140
+
+# Black Crush for Blue (integer)
+#panoramix-bz-blackcrush-blue=140
+
+# White Crush for Red (integer)
+#panoramix-bz-whitecrush-red=200
+
+# White Crush for Green (integer)
+#panoramix-bz-whitecrush-green=200
+
+# White Crush for Blue (integer)
+#panoramix-bz-whitecrush-blue=200
+
+# Black Level for Red (integer)
+#panoramix-bz-blacklevel-red=150
+
+# Black Level for Green (integer)
+#panoramix-bz-blacklevel-green=150
+
+# Black Level for Blue (integer)
+#panoramix-bz-blacklevel-blue=150
+
+# White Level for Red (integer)
+#panoramix-bz-whitelevel-red=0
+
+# White Level for Green (integer)
+#panoramix-bz-whitelevel-green=0
+
+# White Level for Blue (integer)
+#panoramix-bz-whitelevel-blue=0
+
+# Active windows (string)
+#panoramix-active=
+
+[wall] # Wall video filter
+
+# Number of columns (integer)
+#wall-cols=3
+
+# Number of rows (integer)
+#wall-rows=3
+
+# Active windows (string)
+#wall-active=
+
+# Element aspect ratio (string)
+#wall-element-aspect=16:9
+
+[clone] # Clone video filter
+
+# Number of clones (integer)
+#clone-count=2
+
+# Video output modules (string)
+#clone-vout-list=
+
+[netsync] # Network synchronization
+
+# Network master clock (boolean)
+#netsync-master=0
+
+# Master server IP address (string)
+#netsync-master-ip=
+
+# UDP timeout (in ms) (integer)
+#netsync-timeout=500
+
+[motion] # motion control interface
+
+[oldrc] # Remote control interface
+
+# Show stream position (boolean)
+#rc-show-pos=0
+
+# Fake TTY (boolean)
+#rc-fake-tty=0
+
+# UNIX socket command input (string)
+#rc-unix=
+
+# TCP command input (string)
+#rc-host=
+
+[gestures] # Mouse gestures control interface
+
+# Motion threshold (10-100) (integer)
+#gestures-threshold=30
+
+# Trigger button (string)
+#gestures-button=left
+
+[lua] # Lua interpreter
+
+# Lua interface (string)
+#lua-intf=dummy
+
+# Lua interface configuration (string)
+#lua-config=
+
+# Password (string)
+#http-password=
+
+# Source directory (string)
+#http-src=
+
+# Directory index (boolean)
+#http-index=0
+
+# TCP command input (string)
+#rc-host=
+
+# CLI input (string)
+#cli-host=
+
+# Host (string)
+#telnet-host=localhost
+
+# Port (integer)
+#telnet-port=4212
+
+# Password (string)
+#telnet-password=
+
+[vaapi_filters] # Video Accelerated API filters
+
+# Denoise strength (0-2) (float)
+#denoise-sigma=1.000000
+
+[asf] # ASF muxer
+
+# Title (string)
+#sout-asf-title=
+
+# Author (string)
+#sout-asf-author=
+
+# Copyright (string)
+#sout-asf-copyright=
+
+# Comment (string)
+#sout-asf-comment=
+
+# Rating (string)
+#sout-asf-rating=
+
+# Packet Size (integer)
+#sout-asf-packet-size=4096
+
+# Bitrate override (integer)
+#sout-asf-bitrate-override=0
+
+[mp4] # MP4/MOV muxer
+
+# Create "Fast Start" files (boolean)
+#sout-mp4-faststart=1
+
+[mux_ts] # TS muxer (libdvbpsi)
+
+# Digital TV Standard (string)
+#sout-ts-standard=dvb
+
+# Video PID (integer)
+#sout-ts-pid-video=100
+
+# Audio PID (integer)
+#sout-ts-pid-audio=200
+
+# SPU PID (integer)
+#sout-ts-pid-spu=300
+
+# PMT PID (integer)
+#sout-ts-pid-pmt=32
+
+# TS ID (integer)
+#sout-ts-tsid=0
+
+# NET ID (integer)
+#sout-ts-netid=0
+
+# PMT Program numbers (string)
+#sout-ts-program-pmt=
+
+# Set PID to ID of ES (boolean)
+#sout-ts-es-id-pid=0
+
+# Mux PMT (requires --sout-ts-es-id-pid) (string)
+#sout-ts-muxpmt=
+
+# SDT Descriptors (requires --sout-ts-es-id-pid) (string)
+#sout-ts-sdtdesc=
+
+# Data alignment (boolean)
+#sout-ts-alignment=1
+
+# Shaping delay (ms) (integer)
+#sout-ts-shaping=200
+
+# Use keyframes (boolean)
+#sout-ts-use-key-frames=0
+
+# PCR interval (ms) (integer)
+#sout-ts-pcr=70
+
+# Minimum B (deprecated) (integer)
+#sout-ts-bmin=0
+
+# Maximum B (deprecated) (integer)
+#sout-ts-bmax=0
+
+# DTS delay (ms) (integer)
+#sout-ts-dts-delay=400
+
+# Crypt audio (boolean)
+#sout-ts-crypt-audio=1
+
+# Crypt video (boolean)
+#sout-ts-crypt-video=1
+
+# CSA Key (string)
+#sout-ts-csa-ck=
+
+# Second CSA Key (string)
+#sout-ts-csa2-ck=
+
+# CSA Key in use (string)
+#sout-ts-csa-use=1
+
+# Packet size in bytes to encrypt (integer)
+#sout-ts-csa-pkt=188
+
+[mux_ogg] # Ogg/OGM muxer
+
+# Index interval (integer)
+#sout-ogg-indexintvl=1000
+
+# Index size ratio (float)
+#sout-ogg-indexratio=1.000000
+
+[ps] # PS muxer
+
+# DTS delay (ms) (integer)
+#sout-ps-dts-delay=200
+
+# PES maximum size (integer)
+#sout-ps-pes-max-size=65500
+
+[avi] # AVI muxer
+
+# Artist (string)
+#sout-avi-artist=
+
+# Date (string)
+#sout-avi-date=
+
+# Genre (string)
+#sout-avi-genre=
+
+# Copyright (string)
+#sout-avi-copyright=
+
+# Comment (string)
+#sout-avi-comment=
+
+# Name (string)
+#sout-avi-name=
+
+# Subject (string)
+#sout-avi-subject=
+
+# Encoder (string)
+#sout-avi-encoder=VLC Media Player - 3.0.8 Vetinari
+
+# Keywords (string)
+#sout-avi-keywords=
+
+[notify] # LibNotify Notification Plugin
+
+# Timeout (ms) (integer)
+#notify-timeout=4000
+
+[nfs] # NFS input
+
+# Set NFS uid/guid automatically (boolean)
+#nfs-auto-guid=1
+
+[access] # HTTPS input
+
+# Cookies forwarding (boolean)
+#http-forward-cookies=1
+
+# User agent (string)
+#http-user-agent=
+
+[sftp] # SFTP input
+
+# SFTP port (integer)
+#sftp-port=22
+
+# Username (string)
+#sftp-user=
+
+# Password (string)
+#sftp-pwd=
+
+[libbluray] # Blu-ray Disc support (libbluray)
+
+# Blu-ray menus (boolean)
+#bluray-menu=1
+
+# Region code (string)
+#bluray-region=B
+
+[access_jack] # JACK audio input
+
+# Pace (boolean)
+#jack-input-use-vlc-pace=0
+
+# Auto connection (boolean)
+#jack-input-auto-connect=0
+
+[concat] # Concatenated inputs
+
+# Inputs list (string)
+#concat-list=
+
+[filesystem] # File input
+
+# List special files (boolean)
+#list-special-files=0
+
+[satip] # SAT>IP Receiver Plugin
+
+# Receive buffer (integer)
+#satip-buffer=4194304
+
+# Request multicast stream (boolean)
+#satip-multicast=0
+
+# Host (string)
+#satip-host=
+
+[ftp] # FTP input
+
+# Username (string)
+#ftp-user=
+
+# Password (string)
+#ftp-pwd=
+
+# FTP account (string)
+#ftp-account=anonymous
+
+[dvdnav] # DVDnav Input
+
+# DVD angle (integer)
+#dvdnav-angle=1
+
+# Start directly in menu (boolean)
+#dvdnav-menu=1
+
+[dvb] # DVB input with v4l2 support
+
+# Probe DVB card for capabilities (boolean)
+#dvb-probe=1
+
+# Satellite scanning config (string)
+#dvb-satellite=
+
+# Scan tuning list (string)
+#dvb-scanlist=
+
+# Use NIT for scanning services (boolean)
+#dvb-scan-nit=1
+
+[live555] # RTP/RTSP/SDP demuxer (using Live555)
+
+# Use RTP over RTSP (TCP) (boolean)
+#rtsp-tcp=0
+
+# Client port (integer)
+#rtp-client-port=-1
+
+# Force multicast RTP via RTSP (boolean)
+#rtsp-mcast=0
+
+# Tunnel RTSP and RTP over HTTP (boolean)
+#rtsp-http=0
+
+# HTTP tunnel port (integer)
+#rtsp-http-port=80
+
+# Kasenna RTSP dialect (boolean)
+#rtsp-kasenna=0
+
+# WMServer RTSP dialect (boolean)
+#rtsp-wmserver=0
+
+# Username (string)
+#rtsp-user=
+
+# Password (string)
+#rtsp-pwd=
+
+# RTSP frame buffer size (integer)
+#rtsp-frame-buffer-size=250000
+
+[timecode] # Time code subpicture elementary stream generator
+
+# Frame rate (string)
+#timecode-fps=25/1
+
+[vdr] # VDR recordings
+
+# Chapter offset in ms (integer)
+#vdr-chapter-offset=0
+
+# Frame rate (float)
+#vdr-fps=25.000000
+
+[dtv] # Digital Television and Radio
+
+# DVB adapter (integer)
+#dvb-adapter=0
+
+# DVB device (integer)
+#dvb-device=0
+
+# Do not demultiplex (boolean)
+#dvb-budget-mode=0
+
+# Frequency (Hz) (integer)
+#dvb-frequency=0
+
+# Spectrum inversion (integer)
+#dvb-inversion=-1
+
+# Bandwidth (MHz) (integer)
+#dvb-bandwidth=0
+
+# Transmission mode (integer)
+#dvb-transmission=0
+
+# Guard interval (string)
+#dvb-guard=
+
+# High-priority code rate (string)
+#dvb-code-rate-hp=
+
+# Low-priority code rate (string)
+#dvb-code-rate-lp=
+
+# Hierarchy mode (integer)
+#dvb-hierarchy=-1
+
+# DVB-T2 Physical Layer Pipe (integer)
+#dvb-plp-id=0
+
+# Layer A modulation (string)
+#dvb-a-modulation=
+
+# Layer A code rate (string)
+#dvb-a-fec=
+
+# Layer A segments count (integer)
+#dvb-a-count=0
+
+# Layer A time interleaving (integer)
+#dvb-a-interleaving=0
+
+# Layer B modulation (string)
+#dvb-b-modulation=
+
+# Layer B code rate (string)
+#dvb-b-fec=
+
+# Layer B segments count (integer)
+#dvb-b-count=0
+
+# Layer B time interleaving (integer)
+#dvb-b-interleaving=0
+
+# Layer C modulation (string)
+#dvb-c-modulation=
+
+# Layer C code rate (string)
+#dvb-c-fec=
+
+# Layer C segments count (integer)
+#dvb-c-count=0
+
+# Layer C time interleaving (integer)
+#dvb-c-interleaving=0
+
+# Modulation / Constellation (string)
+#dvb-modulation=
+
+# Symbol rate (bauds) (integer)
+#dvb-srate=0
+
+# FEC code rate (string)
+#dvb-fec=
+
+# Stream identifier (integer)
+#dvb-stream=0
+
+# Pilot (integer)
+#dvb-pilot=-1
+
+# Roll-off factor (integer)
+#dvb-rolloff=-1
+
+# Transport stream ID (integer)
+#dvb-ts-id=0
+
+# Polarization (Voltage) (string)
+#dvb-polarization=
+
+# (integer)
+#dvb-voltage=13
+
+# High LNB voltage (boolean)
+#dvb-high-voltage=0
+
+# Local oscillator low frequency (kHz) (integer)
+#dvb-lnb-low=0
+
+# Local oscillator high frequency (kHz) (integer)
+#dvb-lnb-high=0
+
+# Universal LNB switch frequency (kHz) (integer)
+#dvb-lnb-switch=11700000
+
+# DiSEqC LNB number (integer)
+#dvb-satno=0
+
+# Uncommitted DiSEqC LNB number (integer)
+#dvb-uncommitted=0
+
+# Continuous 22kHz tone (integer)
+#dvb-tone=-1
+
+[linsys_hdsdi] # HD-SDI Input
+
+# Link # (integer)
+#linsys-hdsdi-link=0
+
+# Video ID (integer)
+#linsys-hdsdi-id-video=0
+
+# Aspect ratio (string)
+#linsys-hdsdi-aspect-ratio=
+
+# Audio configuration (string)
+#linsys-hdsdi-audio=0=1,1
+
+[udp] # UDP input
+
+# UDP Source timeout (sec) (integer)
+#udp-timeout=-1
+
+[access_alsa] # ALSA audio capture
+
+# Stereo (boolean)
+#alsa-stereo=1
+
+# Sample rate (integer)
+#alsa-samplerate=48000
+
+[shm] # Shared memory framebuffer
+
+# Frame rate (float)
+#shm-fps=10.000000
+
+# Frame buffer depth (integer)
+#shm-depth=0
+
+# Frame buffer width (integer)
+#shm-width=800
+
+# Frame buffer height (integer)
+#shm-height=480
+
+[xcb_screen] # Screen capture (with X11/XCB)
+
+# Frame rate (float)
+#screen-fps=2.000000
+
+# Region left column (integer)
+#screen-left=0
+
+# Region top row (integer)
+#screen-top=0
+
+# Capture region width (integer)
+#screen-width=0
+
+# Capture region height (integer)
+#screen-height=0
+
+# Follow the mouse (boolean)
+#screen-follow-mouse=0
+
+[avio] # libavformat AVIO access
+
+# Advanced options (string)
+#avio-options=
+
+# Advanced options (string)
+#sout-avio-options=
+
+[imem] # Memory input
+
+# ID (integer)
+#imem-id=-1
+
+# Group (integer)
+#imem-group=0
+
+# Category (integer)
+#imem-cat=0
+
+# Codec (string)
+#imem-codec=
+
+# Language (string)
+#imem-language=
+
+# Sample rate (integer)
+#imem-samplerate=0
+
+# Channels count (integer)
+#imem-channels=0
+
+# Width (integer)
+#imem-width=0
+
+# Height (integer)
+#imem-height=0
+
+# Display aspect ratio (string)
+#imem-dar=
+
+# Frame rate (string)
+#imem-fps=
+
+# Size (integer)
+#imem-size=0
+
+[rtp] # Real-Time Protocol (RTP) input
+
+# RTCP (local) port (integer)
+#rtcp-port=0
+
+# Maximum RTP sources (integer)
+#rtp-max-src=1
+
+# RTP source timeout (sec) (integer)
+#rtp-timeout=5
+
+# Maximum RTP sequence number dropout (integer)
+#rtp-max-dropout=3000
+
+# Maximum RTP sequence number misordering (integer)
+#rtp-max-misorder=100
+
+# RTP payload format assumed for dynamic payloads (string)
+#rtp-dynamic-pt=
+
+[access_mms] # Microsoft Media Server (MMS) input
+
+# TCP/UDP timeout (ms) (integer)
+#mms-timeout=5000
+
+# Force selection of all streams (boolean)
+#mms-all=0
+
+# Maximum bitrate (integer)
+#mms-maxbitrate=0
+
+[dvdread] # DVDRead Input (no menu support)
+
+# DVD angle (integer)
+#dvdread-angle=1
+
+[cdda] # Audio CD input
+
+# Audio CD device (string)
+#cd-audio=/dev/sr0
+
+# CDDB Server (string)
+#cddb-server=freedb.videolan.org
+
+# CDDB port (integer)
+#cddb-port=80
+
+[http] # HTTP input
+
+# Auto re-connect (boolean)
+#http-reconnect=0
+
+[smb] # SMB input
+
+# Username (string)
+#smb-user=
+
+# Password (string)
+#smb-pwd=
+
+# SMB domain (string)
+#smb-domain=
+
+[swscale] # Video scaling filter
+
+# Scaling mode (integer)
+#swscale-mode=2
+
+[rawdv] # DV (Digital Video) demuxer
+
+# Hurry up (boolean)
+#rawdv-hurry-up=0
+
+[subtitle] # Text subtitle parser
+
+# Frames per Second (float)
+#sub-fps=0.000000
+
+# Subtitle delay (integer)
+#sub-delay=0
+
+# Subtitle format (string)
+#sub-type=auto
+
+# Subtitle description (string)
+#sub-description=
+
+[mkv] # Matroska stream demuxer
+
+# Respect ordered chapters (boolean)
+#mkv-use-ordered-chapters=1
+
+# Chapter codecs (boolean)
+#mkv-use-chapter-codec=1
+
+# Preload MKV files in the same directory (boolean)
+#mkv-preload-local-dir=1
+
+# Seek based on percent not time (boolean)
+#mkv-seek-percent=0
+
+# Dummy Elements (boolean)
+#mkv-use-dummy=0
+
+# Preload clusters (boolean)
+#mkv-preload-clusters=0
+
+[ps] # MPEG-PS demuxer
+
+# Trust MPEG timestamps (boolean)
+#ps-trust-timestamps=1
+
+[rawvid] # Raw video demuxer
+
+# Frames per Second (string)
+#rawvid-fps=
+
+# Width (integer)
+#rawvid-width=0
+
+# Height (integer)
+#rawvid-height=0
+
+# Force chroma (Use carefully) (string)
+#rawvid-chroma=
+
+# Aspect ratio (string)
+#rawvid-aspect-ratio=
+
+[demuxdump] # File dumper
+
+# Dump module (string)
+#demuxdump-access=file
+
+# Dump filename (string)
+#demuxdump-file=stream-demux.dump
+
+# Append to existing file (boolean)
+#demuxdump-append=0
+
+[h26x] # H264 video demuxer
+
+# Frames per Second (float)
+#h264-fps=0.000000
+
+# Frames per Second (float)
+#hevc-fps=0.000000
+
+[avi] # AVI demuxer
+
+# Force interleaved method (boolean)
+#avi-interleaved=0
+
+# Force index creation (integer)
+#avi-index=0
+
+[mp4] # MP4 stream demuxer
+
+# M4A audio only (boolean)
+#mp4-m4a-audioonly=0
+
+[image] # Image demuxer
+
+# ES ID (integer)
+#image-id=-1
+
+# Group (integer)
+#image-group=0
+
+# Decode (boolean)
+#image-decode=1
+
+# Forced chroma (string)
+#image-chroma=
+
+# Duration in seconds (float)
+#image-duration=10.000000
+
+# Frame rate (string)
+#image-fps=10/1
+
+# Real-time (boolean)
+#image-realtime=0
+
+[ts] # MPEG Transport Stream demuxer
+
+# Digital TV Standard (string)
+#ts-standard=auto
+
+# Extra PMT (string)
+#ts-extra-pmt=
+
+# Trust in-stream PCR (boolean)
+#ts-trust-pcr=1
+
+# Set id of ES to PID (boolean)
+#ts-es-id-pid=1
+
+# CSA Key (string)
+#ts-csa-ck=
+
+# Second CSA Key (string)
+#ts-csa2-ck=
+
+# Packet size in bytes to decrypt (integer)
+#ts-csa-pkt=188
+
+# Separate sub-streams (boolean)
+#ts-split-es=1
+
+# Seek based on percent not time (boolean)
+#ts-seek-percent=0
+
+# Check packets continuity counter (boolean)
+#ts-cc-check=1
+
+# Only create ES on program sending data (boolean)
+#ts-pmtfix-waitdata=1
+
+# Try to generate PAT/PMT if missing (boolean)
+#ts-patfix=1
+
+# Try to fix too early PCR (or late DTS) (boolean)
+#ts-pcr-offsetfix=1
+
+[vc1] # VC1 video demuxer
+
+# Frames per Second (float)
+#vc1-fps=25.000000
+
+[es] # MPEG-I/II/4 / A52 / DTS / MLP audio
+
+# Frames per Second (float)
+#es-fps=25.000000
+
+[rawaud] # Raw audio demuxer
+
+# Audio channels (integer)
+#rawaud-channels=2
+
+# Audio samplerate (Hz) (integer)
+#rawaud-samplerate=48000
+
+# FOURCC code of raw input format (string)
+#rawaud-fourcc=s16l
+
+# Forces the audio language (string)
+#rawaud-lang=eng
+
+[mod] # MOD demuxer (libmodplug)
+
+# Noise reduction (boolean)
+#mod-noisereduction=1
+
+# Reverb (boolean)
+#mod-reverb=0
+
+# Reverberation level (integer)
+#mod-reverb-level=0
+
+# Reverberation delay (integer)
+#mod-reverb-delay=40
+
+# Mega bass (boolean)
+#mod-megabass=0
+
+# Mega bass level (integer)
+#mod-megabass-level=0
+
+# Mega bass cutoff (integer)
+#mod-megabass-range=10
+
+# Surround (boolean)
+#mod-surround=0
+
+# Surround level (integer)
+#mod-surround-level=0
+
+# Surround delay (ms) (integer)
+#mod-surround-delay=5
+
+[playlist] # Playlist
+
+# Skip ads (boolean)
+#playlist-skip-ads=1
+
+# Show shoutcast adult content (boolean)
+#shoutcast-show-adult=0
+
+[adaptive] # Unified adaptive streaming for DASH/HLS
+
+# Adaptive Logic (string)
+#adaptive-logic=
+
+# Maximum device width (integer)
+#adaptive-maxwidth=0
+
+# Maximum device height (integer)
+#adaptive-maxheight=0
+
+# Fixed Bandwidth in KiB/s (integer)
+#adaptive-bw=250
+
+# Use regular HTTP modules (boolean)
+#adaptive-use-access=0
+
+[mjpeg] # M-JPEG camera demuxer
+
+# Frames per Second (float)
+#mjpeg-fps=0.000000
+
+[diracsys] # Dirac video demuxer
+
+# Value to adjust dts by (integer)
+#dirac-dts-offset=0
+
+[avformat] # Avformat demuxer
+
+# Format name (string)
+#avformat-format=
+
+# Advanced options (string)
+#avformat-options=
+
+# Avformat mux (string)
+#sout-avformat-mux=
+
+# Advanced options (string)
+#sout-avformat-options=
+
+# Reset timestamps (boolean)
+#sout-avformat-reset-ts=0
+
+[prefetch] # Stream prefetch filter
+
+# Buffer size (integer)
+#prefetch-buffer-size=16384
+
+# Read size (integer)
+#prefetch-read-size=16777216
+
+# Seek threshold (integer)
+#prefetch-seek-threshold=16384
+
+[logger] # File logging
+
+[audioscrobbler] # Submission of played songs to last.fm
+
+# Username (string)
+#lastfm-username=
+
+# Password (string)
+#lastfm-password=
+
+# Scrobbler URL (string)
+#scrobbler-url=post.audioscrobbler.com
+
+[rtsp] # Legacy RTSP VoD server
+
+# MUX for RAW RTSP transport (string)
+#rtsp-raw-mux=ts
+
+# Maximum number of connections (integer)
+#rtsp-throttle-users=0
+
+# Sets the timeout option in the RTSP session string (integer)
+#rtsp-session-timeout=5
+
+[gnutls] # GNU TLS transport layer security
+
+# Use system trust database (boolean)
+#gnutls-system-trust=1
+
+# Trust directory (string)
+#gnutls-dir-trust=
+
+# TLS cipher priorities (string)
+#gnutls-priorities=NORMAL
+
+[amem] # Audio memory output
+
+# Sample format (string)
+#amem-format=S16N
+
+# Sample rate (integer)
+#amem-rate=44100
+
+# Channels count (integer)
+#amem-channels=2
+
+[alsa] # ALSA audio output
+
+# Audio output device (string)
+#alsa-audio-device=default
+
+# Audio output channels (integer)
+#alsa-audio-channels=6
+
+# Software gain (float)
+#alsa-gain=1.000000
+
+[afile] # File audio output
+
+# Output file (string)
+#audiofile-file=audiofile.wav
+
+# Output format (string)
+#audiofile-format=s16
+
+# Number of output channels (integer)
+#audiofile-channels=0
+
+# Add WAVE header (boolean)
+#audiofile-wav=1
+
+[jack] # JACK audio output
+
+# Automatically connect to writable clients (boolean)
+#jack-auto-connect=1
+
+# Connect to clients matching (string)
+#jack-connect-regex=system
+
+# JACK client name (string)
+#jack-name=
+
+# Software gain (float)
+#jack-gain=1.000000
+
+[svg] # svg
+
+# SVG template file (string)
+#svg-template-file=
+
+[freetype] # Freetype2 font renderer
+
+# Font (string)
+#freetype-font=Serif Bold
+
+# Monospace Font (string)
+#freetype-monofont=Monospace
+
+# Font size in pixels (integer)
+#freetype-fontsize=0
+
+# Relative font size (integer)
+#freetype-rel-fontsize=0
+
+# Text opacity (integer)
+#freetype-opacity=255
+
+# Text default color (integer)
+#freetype-color=16777215
+
+# Force bold (boolean)
+#freetype-bold=0
+
+# Background opacity (integer)
+#freetype-background-opacity=0
+
+# Background color (integer)
+#freetype-background-color=0
+
+# Outline opacity (integer)
+#freetype-outline-opacity=255
+
+# Outline color (integer)
+#freetype-outline-color=0
+
+# Outline thickness (integer)
+#freetype-outline-thickness=4
+
+# Shadow opacity (integer)
+#freetype-shadow-opacity=128
+
+# Shadow color (integer)
+#freetype-shadow-color=0
+
+# Shadow angle (float)
+#freetype-shadow-angle=-45.000000
+
+# Shadow distance (float)
+#freetype-shadow-distance=0.060000
+
+# Use YUVP renderer (boolean)
+#freetype-yuvp=0
+
+# Text direction (integer)
+#freetype-text-direction=0
+
+[extract] # Extract RGB component video filter
+
+# RGB component to extract (integer)
+#extract-component=16711680
+
+[adjust] # Image properties filter
+
+# Image contrast (0-2) (float)
+#contrast=1.000000
+
+# Image brightness (0-2) (float)
+#brightness=1.000000
+
+# Image hue (-180..180) (float)
+#hue=0.000000
+
+# Image saturation (0-3) (float)
+#saturation=1.000000
+
+# Image gamma (0-10) (float)
+#gamma=1.000000
+
+# Brightness threshold (boolean)
+#brightness-threshold=0
+
+[colorthres] # Color threshold filter
+
+# Color (integer)
+#colorthres-color=16711680
+
+# Saturation threshold (integer)
+#colorthres-saturationthres=20
+
+# Similarity threshold (integer)
+#colorthres-similaritythres=15
+
+[alphamask] # Alpha mask video filter
+
+# Transparency mask (string)
+#alphamask-mask=
+
+[bluescreen] # Bluescreen video filter
+
+# Bluescreen U value (integer)
+#bluescreen-u=120
+
+# Bluescreen V value (integer)
+#bluescreen-v=90
+
+# Bluescreen U tolerance (integer)
+#bluescreen-ut=17
+
+# Bluescreen V tolerance (integer)
+#bluescreen-vt=17
+
+[postproc] # Video post processing filter
+
+# Post processing quality (integer)
+#postproc-q=6
+
+# FFmpeg post processing filter chains (string)
+#postproc-name=default
+
+[blendbench] # Blending benchmark filter
+
+# Number of time to blend (integer)
+#blendbench-loops=1000
+
+# Alpha of the blended image (integer)
+#blendbench-alpha=128
+
+# Image to be blended onto (string)
+#blendbench-base-image=
+
+# Chroma for the base image (string)
+#blendbench-base-chroma=I420
+
+# Image which will be blended (string)
+#blendbench-blend-image=
+
+# Chroma for the blend image (string)
+#blendbench-blend-chroma=YUVA
+
+[antiflicker] # antiflicker video filter
+
+# Window size (integer)
+#antiflicker-window-size=10
+
+# Softening value (integer)
+#antiflicker-softening-size=10
+
+[sharpen] # Sharpen video filter
+
+# Sharpen strength (0-2) (float)
+#sharpen-sigma=0.050000
+
+[hqdn3d] # High Quality 3D Denoiser filter
+
+# Spatial luma strength (0-254) (float)
+#hqdn3d-luma-spat=4.000000
+
+# Spatial chroma strength (0-254) (float)
+#hqdn3d-chroma-spat=3.000000
+
+# Temporal luma strength (0-254) (float)
+#hqdn3d-luma-temp=6.000000
+
+# Temporal chroma strength (0-254) (float)
+#hqdn3d-chroma-temp=4.500000
+
+[rotate] # Rotate video filter
+
+# Angle in degrees (float)
+#rotate-angle=30.000000
+
+# Use motion sensors (boolean)
+#rotate-use-motion=0
+
+[fps] # FPS conversion video filter
+
+# Frame rate (string)
+#fps-fps=
+
+[ball] # Ball video filter
+
+# Ball color (string)
+#ball-color=red
+
+# Ball speed (integer)
+#ball-speed=4
+
+# Ball size (integer)
+#ball-size=10
+
+# Gradient threshold (integer)
+#ball-gradient-threshold=40
+
+# Edge visible (boolean)
+#ball-edge-visible=1
+
+[sepia] # Sepia video filter
+
+# Sepia intensity (integer)
+#sepia-intensity=120
+
+[canvas] # Canvas video filter
+
+# Output width (integer)
+#canvas-width=0
+
+# Output height (integer)
+#canvas-height=0
+
+# Output picture aspect ratio (string)
+#canvas-aspect=
+
+# Pad video (boolean)
+#canvas-padd=1
+
+[gradfun] # Gradfun video filter
+
+# Radius (integer)
+#gradfun-radius=16
+
+# Strength (float)
+#gradfun-strength=1.200000
+
+[mirror] # Mirror video filter
+
+# Mirror orientation (integer)
+#mirror-split=0
+
+# Direction (integer)
+#mirror-direction=0
+
+[gradient] # Gradient video filter
+
+# Distort mode (string)
+#gradient-mode=gradient
+
+# Gradient image type (integer)
+#gradient-type=0
+
+# Apply cartoon effect (boolean)
+#gradient-cartoon=1
+
+[croppadd] # Video cropping filter
+
+# Pixels to crop from top (integer)
+#croppadd-croptop=0
+
+# Pixels to crop from bottom (integer)
+#croppadd-cropbottom=0
+
+# Pixels to crop from left (integer)
+#croppadd-cropleft=0
+
+# Pixels to crop from right (integer)
+#croppadd-cropright=0
+
+# Pixels to padd to top (integer)
+#croppadd-paddtop=0
+
+# Pixels to padd to bottom (integer)
+#croppadd-paddbottom=0
+
+# Pixels to padd to left (integer)
+#croppadd-paddleft=0
+
+# Pixels to padd to right (integer)
+#croppadd-paddright=0
+
+[deinterlace] # Deinterlacing video filter
+
+# Streaming deinterlace mode (string)
+#sout-deinterlace-mode=blend
+
+# Phosphor chroma mode for 4:2:0 input (integer)
+#sout-deinterlace-phosphor-chroma=2
+
+# Phosphor old field dimmer strength (integer)
+#sout-deinterlace-phosphor-dimmer=2
+
+[motionblur] # Motion blur filter
+
+# Blur factor (1-127) (integer)
+#blur-factor=80
+
+[grain] # Grain video filter
+
+# Variance (float)
+#grain-variance=2.000000
+
+# Minimal period (integer)
+#grain-period-min=1
+
+# Maximal period (integer)
+#grain-period-max=48
+
+[gaussianblur] # Gaussian blur video filter
+
+# Gaussian's std deviation (float)
+#gaussianblur-sigma=2.000000
+
+[anaglyph] # Convert 3D picture to anaglyph image video filter
+
+# Color scheme (string)
+#anaglyph-scheme=red-cyan
+
+[scene] # Scene video filter
+
+# Image format (string)
+#scene-format=png
+
+# Image width (integer)
+#scene-width=-1
+
+# Image height (integer)
+#scene-height=-1
+
+# Filename prefix (string)
+#scene-prefix=scene
+
+# Directory path prefix (string)
+#scene-path=
+
+# Always write to the same file (boolean)
+#scene-replace=0
+
+# Recording ratio (integer)
+#scene-ratio=50
+
+[posterize] # Posterize video filter
+
+# Posterize level (integer)
+#posterize-level=6
+
+[transform] # Video transformation filter
+
+# Transform type (string)
+#transform-type=90
+
+[puzzle] # Puzzle interactive game video filter
+
+# Number of puzzle rows (integer)
+#puzzle-rows=4
+
+# Number of puzzle columns (integer)
+#puzzle-cols=4
+
+# Border (integer)
+#puzzle-border=3
+
+# Small preview (boolean)
+#puzzle-preview=0
+
+# Small preview size (integer)
+#puzzle-preview-size=15
+
+# Piece edge shape size (integer)
+#puzzle-shape-size=90
+
+# Auto shuffle (integer)
+#puzzle-auto-shuffle=0
+
+# Auto solve (integer)
+#puzzle-auto-solve=0
+
+# Rotation (integer)
+#puzzle-rotation=0
+
+# Game mode (integer)
+#puzzle-mode=0
+
+[erase] # Erase video filter
+
+# Image mask (string)
+#erase-mask=
+
+# X coordinate (integer)
+#erase-x=0
+
+# Y coordinate (integer)
+#erase-y=0
+
+[qt] # Qt interface
+
+# Start in minimal view (without menus) (boolean)
+#qt-minimal-view=0
+
+# Systray icon (boolean)
+#qt-system-tray=1
+
+# Show notification popup on track change (integer)
+#qt-notification=1
+
+# Start VLC with only a systray icon (boolean)
+#qt-start-minimized=0
+
+# Pause the video playback when minimized (boolean)
+#qt-pause-minimized=0
+
+# Windows opacity between 0.1 and 1 (float)
+#qt-opacity=1.000000
+
+# Fullscreen controller opacity between 0.1 and 1 (float)
+#qt-fs-opacity=0.800000
+
+# Resize interface to the native video size (boolean)
+#qt-video-autoresize=1
+
+# Show playing item name in window title (boolean)
+#qt-name-in-title=1
+
+# Show a controller in fullscreen mode (boolean)
+#qt-fs-controller=1
+
+# Save the recently played items in the menu (boolean)
+#qt-recentplay=1
+
+# List of words separated by | to filter (string)
+#qt-recentplay-filter=
+
+# Continue playback? (integer)
+#qt-continue=1
+
+# Embed the file browser in open dialog (boolean)
+#qt-embedded-open=0
+
+# Show advanced preferences over simple ones (boolean)
+#qt-advanced-pref=0
+
+# Show unimportant error and warnings dialogs (boolean)
+#qt-error-dialogs=1
+
+# Define the colors of the volume slider (string)
+#qt-slider-colours=153;210;153;20;210;20;255;199;15;245;39;29
+
+# Ask for network policy at start (boolean)
+qt-privacy-ask=0
+
+# Define which screen fullscreen goes (integer)
+#qt-fullscreen-screennumber=-1
+
+# Load extensions on startup (boolean)
+#qt-autoload-extensions=1
+
+# Display background cone or art (boolean)
+#qt-bgcone=1
+
+# Expanding background cone or art (boolean)
+#qt-bgcone-expands=0
+
+# Allow automatic icon changes (boolean)
+#qt-icon-change=1
+
+# Maximum Volume displayed (integer)
+#qt-max-volume=125
+
+# Fullscreen controller mouse sensitivity (integer)
+#qt-fs-sensitivity=3
+
+# When to raise the interface (integer)
+#qt-auto-raise=1
+
+[skins2] # Skinnable Interface
+
+# Skin to use (string)
+#skins2-last=
+
+# Config of last used skin (string)
+#skins2-config=
+
+# Enable transparency effects (boolean)
+#skins2-transparency=0
+
+# Use a skinned playlist (boolean)
+#skinned-playlist=1
+
+# Display video in a skinned window if any (boolean)
+#skinned-video=1
+
+[ncurses] # Ncurses interface
+
+# Filebrowser starting point (string)
+#browse-dir=
+
+[fb] # GNU/Linux framebuffer video output
+
+# Framebuffer device (string)
+#fbdev=/dev/fb0
+
+# Run fb on current tty (boolean)
+#fb-tty=1
+
+# Image format (default RGB) (string)
+#fb-chroma=
+
+# Framebuffer resolution to use (integer)
+#fb-mode=4
+
+# Framebuffer uses hw acceleration (boolean)
+#fb-hw-accel=1
+
+[vmem] # Video memory output
+
+# Width (integer)
+#vmem-width=320
+
+# Height (integer)
+#vmem-height=200
+
+# Pitch (integer)
+#vmem-pitch=640
+
+# Chroma (string)
+#vmem-chroma=RV16
+
+[xcb_x11] # X11 video output (XCB)
+
+[wl_shell] # Wayland shell surface
+
+# Wayland display (string)
+#wl-display=
+
+[yuv] # YUV video output
+
+# device, fifo or filename (string)
+#yuv-file=stream.yuv
+
+# Chroma used (string)
+#yuv-chroma=
+
+# Add a YUV4MPEG2 header (boolean)
+#yuv-yuv4mpeg2=0
+
+[vdummy] # Dummy video output
+
+# Dummy image chroma format (string)
+#dummy-chroma=
+
+[xdg_shell] # XDG shell surface
+
+# Wayland display (string)
+#wl-display=
+
+[gl] # OpenGL video output
+
+# OpenGL extension (string)
+#gl=
+
+# Open GL/GLES hardware converter (string)
+#glconv=
+
+[xcb_xv] # XVideo output (XCB)
+
+# XVideo adaptor number (integer)
+#xvideo-adaptor=-1
+
+# XVideo format id (integer)
+#xvideo-format-id=0
+
+[flaschen] # Flaschen-Taschen video output
+
+# Flaschen-Taschen display address (string)
+#flaschen-display=
+
+# Width (integer)
+#flaschen-width=25
+
+# Height (integer)
+#flaschen-height=20
+
+[xcb_window] # X11 video window (XCB)
+
+# X11 display (string)
+#x11-display=
+
+[dvbsub] # DVB subtitles decoder
+
+# Subpicture position (integer)
+#dvbsub-position=8
+
+# Decoding X coordinate (integer)
+#dvbsub-x=-1
+
+# Decoding Y coordinate (integer)
+#dvbsub-y=-1
+
+# Encoding X coordinate (integer)
+#sout-dvbsub-x=-1
+
+# Encoding Y coordinate (integer)
+#sout-dvbsub-y=-1
+
+[theora] # Theora video decoder
+
+# Post processing quality (integer)
+#theora-postproc=-1
+
+# Encoding quality (integer)
+#sout-theora-quality=2
+
+[avcodec] # FFmpeg audio/video decoder
+
+# Direct rendering (boolean)
+#avcodec-dr=1
+
+# Show corrupted frames (boolean)
+#avcodec-corrupted=1
+
+# Error resilience (integer)
+#avcodec-error-resilience=1
+
+# Workaround bugs (integer)
+#avcodec-workaround-bugs=1
+
+# Hurry up (boolean)
+#avcodec-hurry-up=1
+
+# Skip frame (default=0) (integer)
+#avcodec-skip-frame=0
+
+# Skip idct (default=0) (integer)
+#avcodec-skip-idct=0
+
+# Allow speed tricks (boolean)
+#avcodec-fast=0
+
+# Skip the loop filter for H.264 decoding (integer)
+#avcodec-skiploopfilter=0
+
+# Debug mask (integer)
+#avcodec-debug=0
+
+# Codec name (string)
+#avcodec-codec=
+
+# Hardware decoding (string)
+#avcodec-hw=any
+
+# Threads (integer)
+#avcodec-threads=0
+
+# Advanced options (string)
+#avcodec-options=
+
+# Codec name (string)
+#sout-avcodec-codec=
+
+# Quality level (string)
+#sout-avcodec-hq=rd
+
+# Ratio of key frames (integer)
+#sout-avcodec-keyint=0
+
+# Ratio of B frames (integer)
+#sout-avcodec-bframes=0
+
+# Hurry up (boolean)
+#sout-avcodec-hurry-up=0
+
+# Interlaced encoding (boolean)
+#sout-avcodec-interlace=0
+
+# Interlaced motion estimation (boolean)
+#sout-avcodec-interlace-me=1
+
+# Video bitrate tolerance (integer)
+#sout-avcodec-vt=0
+
+# Pre-motion estimation (boolean)
+#sout-avcodec-pre-me=0
+
+# Rate control buffer size (integer)
+#sout-avcodec-rc-buffer-size=0
+
+# Rate control buffer aggressiveness (float)
+#sout-avcodec-rc-buffer-aggressivity=1.000000
+
+# I quantization factor (float)
+#sout-avcodec-i-quant-factor=0.000000
+
+# Noise reduction (integer)
+#sout-avcodec-noise-reduction=0
+
+# MPEG4 quantization matrix (boolean)
+#sout-avcodec-mpeg4-matrix=0
+
+# Minimum video quantizer scale (integer)
+#sout-avcodec-qmin=0
+
+# Maximum video quantizer scale (integer)
+#sout-avcodec-qmax=0
+
+# Trellis quantization (boolean)
+#sout-avcodec-trellis=0
+
+# Fixed quantizer scale (float)
+#sout-avcodec-qscale=3.000000
+
+# Strict standard compliance (integer)
+#sout-avcodec-strict=0
+
+# Luminance masking (float)
+#sout-avcodec-lumi-masking=0.000000
+
+# Darkness masking (float)
+#sout-avcodec-dark-masking=0.000000
+
+# Motion masking (float)
+#sout-avcodec-p-masking=0.000000
+
+# Border masking (float)
+#sout-avcodec-border-masking=0.000000
+
+# Luminance elimination (integer)
+#sout-avcodec-luma-elim-threshold=0
+
+# Chrominance elimination (integer)
+#sout-avcodec-chroma-elim-threshold=0
+
+# Specify AAC audio profile to use (string)
+#sout-avcodec-aac-profile=low
+
+# Advanced options (string)
+#sout-avcodec-options=
+
+[subsusf] # USF subtitles decoder
+
+# Formatted Subtitles (boolean)
+#subsdec-formatted=1
+
+[vorbis] # Vorbis audio decoder
+
+# Encoding quality (integer)
+#sout-vorbis-quality=0
+
+# Maximum encoding bitrate (integer)
+#sout-vorbis-max-bitrate=0
+
+# Minimum encoding bitrate (integer)
+#sout-vorbis-min-bitrate=0
+
+# CBR encoding (boolean)
+#sout-vorbis-cbr=0
+
+[subsdec] # Text subtitle decoder
+
+# Subtitle justification (integer)
+#subsdec-align=-1
+
+# Subtitle text encoding (string)
+#subsdec-encoding=
+
+# UTF-8 subtitle autodetection (boolean)
+#subsdec-autodetect-utf8=1
+
+[telx] # Teletext subtitles decoder
+
+# Override page (integer)
+#telx-override-page=-1
+
+# Ignore subtitle flag (boolean)
+#telx-ignore-subtitle-flag=0
+
+# Workaround for France (boolean)
+#telx-french-workaround=0
+
+[speex] # Speex audio decoder
+
+# Mode (integer)
+#sout-speex-mode=0
+
+# Encoding complexity (integer)
+#sout-speex-complexity=3
+
+# CBR encoding (boolean)
+#sout-speex-cbr=0
+
+# Encoding quality (float)
+#sout-speex-quality=8.000000
+
+# Maximal bitrate (integer)
+#sout-speex-max-bitrate=0
+
+# Voice activity detection (boolean)
+#sout-speex-vad=1
+
+# Discontinuous Transmission (boolean)
+#sout-speex-dtx=0
+
+[gstdecode] # GStreamer Based Decoder
+
+# Use DecodeBin (boolean)
+#use-decodebin=1
+
+[svgdec] # SVG video decoder
+
+# Image width (integer)
+#svg-width=-1
+
+# Image height (integer)
+#svg-height=-1
+
+# Scale factor (float)
+#svg-scale=-1.000000
+
+[ttml] # TTML subtitles decoder
+
+# Subtitle justification (integer)
+#ttml-align=0
+
+[svcdsub] # Philips OGT (SVCD subtitle) decoder
+
+[ddummy] # Dummy decoder
+
+# Save raw codec data (boolean)
+#dummy-save-es=0
+
+[x264] # H.264/MPEG-4 Part 10/AVC encoder (x264)
+
+# Maximum GOP size (integer)
+#sout-x264-keyint=250
+
+# Minimum GOP size (integer)
+#sout-x264-min-keyint=25
+
+# Use recovery points to close GOPs (boolean)
+#sout-x264-opengop=0
+
+# Enable compatibility hacks for Blu-ray support (boolean)
+#sout-x264-bluray-compat=0
+
+# Extra I-frames aggressivity (integer)
+#sout-x264-scenecut=40
+
+# B-frames between I and P (integer)
+#sout-x264-bframes=3
+
+# Adaptive B-frame decision (integer)
+#sout-x264-b-adapt=1
+
+# Influence (bias) B-frames usage (integer)
+#sout-x264-b-bias=0
+
+# Keep some B-frames as references (string)
+#sout-x264-bpyramid=normal
+
+# CABAC (boolean)
+#sout-x264-cabac=1
+
+# Use fullrange instead of TV colorrange (boolean)
+#sout-x264-fullrange=0
+
+# Number of reference frames (integer)
+#sout-x264-ref=3
+
+# Skip loop filter (boolean)
+#sout-x264-nf=0
+
+# Loop filter AlphaC0 and Beta parameters alpha:beta (string)
+#sout-x264-deblock=0:0
+
+# Strength of psychovisual optimization, default is "1.0:0.0" (string)
+#sout-x264-psy-rd=1.0:0.0
+
+# Use Psy-optimizations (boolean)
+#sout-x264-psy=1
+
+# H.264 level (string)
+#sout-x264-level=0
+
+# H.264 profile (string)
+#sout-x264-profile=high
+
+# Interlaced mode (boolean)
+#sout-x264-interlaced=0
+
+# Frame packing (integer)
+#sout-x264-frame-packing=-1
+
+# Force number of slices per frame (integer)
+#sout-x264-slices=0
+
+# Limit the size of each slice in bytes (integer)
+#sout-x264-slice-max-size=0
+
+# Limit the size of each slice in macroblocks (integer)
+#sout-x264-slice-max-mbs=0
+
+# HRD-timing information (string)
+#sout-x264-hrd=none
+
+# Set QP (integer)
+#sout-x264-qp=-1
+
+# Quality-based VBR (integer)
+#sout-x264-crf=23
+
+# Min QP (integer)
+#sout-x264-qpmin=10
+
+# Max QP (integer)
+#sout-x264-qpmax=51
+
+# Max QP step (integer)
+#sout-x264-qpstep=4
+
+# Average bitrate tolerance (float)
+#sout-x264-ratetol=1.000000
+
+# Max local bitrate (integer)
+#sout-x264-vbv-maxrate=0
+
+# VBV buffer (integer)
+#sout-x264-vbv-bufsize=0
+
+# Initial VBV buffer occupancy (float)
+#sout-x264-vbv-init=0.900000
+
+# QP factor between I and P (float)
+#sout-x264-ipratio=1.400000
+
+# QP factor between P and B (float)
+#sout-x264-pbratio=1.300000
+
+# QP difference between chroma and luma (integer)
+#sout-x264-chroma-qp-offset=0
+
+# Multipass ratecontrol (integer)
+#sout-x264-pass=0
+
+# QP curve compression (float)
+#sout-x264-qcomp=0.600000
+
+# Reduce fluctuations in QP (float)
+#sout-x264-cplxblur=20.000000
+
+# Reduce fluctuations in QP (float)
+#sout-x264-qblur=0.500000
+
+# How AQ distributes bits (integer)
+#sout-x264-aq-mode=1
+
+# Strength of AQ (float)
+#sout-x264-aq-strength=1.000000
+
+# Partitions to consider (string)
+#sout-x264-partitions=normal
+
+# Direct MV prediction mode (string)
+#sout-x264-direct=spatial
+
+# Direct prediction size (integer)
+#sout-x264-direct-8x8=1
+
+# Weighted prediction for B-frames (boolean)
+#sout-x264-weightb=1
+
+# Weighted prediction for P-frames (integer)
+#sout-x264-weightp=2
+
+# Integer pixel motion estimation method (string)
+#sout-x264-me=hex
+
+# Maximum motion vector search range (integer)
+#sout-x264-merange=16
+
+# Maximum motion vector length (integer)
+#sout-x264-mvrange=-1
+
+# Minimum buffer space between threads (integer)
+#sout-x264-mvrange-thread=-1
+
+# Subpixel motion estimation and partition decision quality (integer)
+#sout-x264-subme=7
+
+# Decide references on a per partition basis (boolean)
+#sout-x264-mixed-refs=1
+
+# Chroma in motion estimation (boolean)
+#sout-x264-chroma-me=1
+
+# Adaptive spatial transform size (boolean)
+#sout-x264-8x8dct=1
+
+# Trellis RD quantization (integer)
+#sout-x264-trellis=1
+
+# Framecount to use on frametype lookahead (integer)
+#sout-x264-lookahead=40
+
+# Use Periodic Intra Refresh (boolean)
+#sout-x264-intra-refresh=0
+
+# Use mb-tree ratecontrol (boolean)
+#sout-x264-mbtree=1
+
+# Early SKIP detection on P-frames (boolean)
+#sout-x264-fast-pskip=1
+
+# Coefficient thresholding on P-frames (boolean)
+#sout-x264-dct-decimate=1
+
+# Noise reduction (integer)
+#sout-x264-nr=0
+
+# Inter luma quantization deadzone (integer)
+#sout-x264-deadzone-inter=21
+
+# Intra luma quantization deadzone (integer)
+#sout-x264-deadzone-intra=11
+
+# Non-deterministic optimizations when threaded (boolean)
+#sout-x264-non-deterministic=0
+
+# CPU optimizations (boolean)
+#sout-x264-asm=1
+
+# PSNR computation (boolean)
+#sout-x264-psnr=0
+
+# SSIM computation (boolean)
+#sout-x264-ssim=0
+
+# Quiet mode (boolean)
+#sout-x264-quiet=0
+
+# SPS and PPS id numbers (integer)
+#sout-x264-sps-id=0
+
+# Access unit delimiters (boolean)
+#sout-x264-aud=0
+
+# Statistics (boolean)
+#sout-x264-verbose=0
+
+# Filename for 2 pass stats file (string)
+#sout-x264-stats=x264_2pass.log
+
+# Default preset setting used (string)
+#sout-x264-preset=
+
+# Default tune setting used (string)
+#sout-x264-tune=
+
+# x264 advanced options (string)
+#sout-x264-options=
+
+[jpeg] # JPEG image decoder
+
+# Quality level (integer)
+#sout-jpeg-quality=95
+
+[spudec] # DVD subtitles decoder
+
+# Disable DVD subtitle transparency (boolean)
+#dvdsub-transparency=0
+
+[dav1d] # Dav1d video decoder
+
+# Frames Threads (integer)
+#dav1d-thread-frames=0
+
+# Tiles Threads (integer)
+#dav1d-thread-tiles=0
+
+[aribsub] # ARIB subtitles decoder
+
+# Ignore ruby (furigana) (boolean)
+#aribsub-ignore-ruby=0
+
+# Use Core Text renderer (boolean)
+#aribsub-use-coretext=0
+
+[vpx] # WebM video decoder
+
+# Quality mode (integer)
+#sout-vpx-quality-mode=1000000
+
+[qsv] # Intel QuickSync Video encoder for MPEG4-Part10/MPEG2 (aka H.264/H.262)
+
+# Enable software mode (boolean)
+#sout-qsv-software=0
+
+# Codec Profile (string)
+#sout-qsv-h264-profile=unspecified
+
+# Codec Level (string)
+#sout-qsv-h264-level=unspecified
+
+# Codec Profile (string)
+#sout-qsv-mpeg2-profile=unspecified
+
+# Codec Level (string)
+#sout-qsv-mpeg2-level=unspecified
+
+# Group of Picture size (integer)
+#sout-qsv-gop-size=32
+
+# Group of Picture Reference Distance (integer)
+#sout-qsv-gop-refdist=4
+
+# IDR interval (integer)
+#sout-qsv-idr-interval=0
+
+# Target Usage (string)
+#sout-qsv-target-usage=quality
+
+# Rate Control Method (string)
+#sout-qsv-rc-method=vbr
+
+# Quantization parameter (integer)
+#sout-qsv-qp=0
+
+# Quantization parameter for I-frames (integer)
+#sout-qsv-qpi=0
+
+# Quantization parameter for P-frames (integer)
+#sout-qsv-qpp=0
+
+# Quantization parameter for B-frames (integer)
+#sout-qsv-qpb=0
+
+# Maximum Bitrate (integer)
+#sout-qsv-bitrate-max=0
+
+# Accuracy of RateControl (integer)
+#sout-qsv-accuracy=0
+
+# Convergence time of 'avbr' RateControl (integer)
+#sout-qsv-convergence=0
+
+# Number of slices per frame (integer)
+#sout-qsv-num-slice=0
+
+# Number of reference frames (integer)
+#sout-qsv-num-ref-frame=0
+
+# Number of parallel operations (integer)
+#sout-qsv-async-depth=4
+
+[a52] # ATSC A/52 (AC-3) audio decoder
+
+# A/52 dynamic range compression (boolean)
+#a52-dynrng=1
+
+[cc] # Closed Captions decoder
+
+# Opacity (boolean)
+#cc-opaque=1
+
+[twolame] # Libtwolame audio encoder
+
+# Encoding quality (float)
+#sout-twolame-quality=0.000000
+
+# Stereo mode (integer)
+#sout-twolame-mode=0
+
+# VBR mode (boolean)
+#sout-twolame-vbr=0
+
+# Psycho-acoustic model (integer)
+#sout-twolame-psy=3
+
+[x26410b] # H.264/MPEG-4 Part 10/AVC encoder (x264 10-bit)
+
+# Maximum GOP size (integer)
+#sout-x26410b-keyint=250
+
+# Minimum GOP size (integer)
+#sout-x26410b-min-keyint=25
+
+# Use recovery points to close GOPs (boolean)
+#sout-x26410b-opengop=0
+
+# Enable compatibility hacks for Blu-ray support (boolean)
+#sout-x26410b-bluray-compat=0
+
+# Extra I-frames aggressivity (integer)
+#sout-x26410b-scenecut=40
+
+# B-frames between I and P (integer)
+#sout-x26410b-bframes=3
+
+# Adaptive B-frame decision (integer)
+#sout-x26410b-b-adapt=1
+
+# Influence (bias) B-frames usage (integer)
+#sout-x26410b-b-bias=0
+
+# Keep some B-frames as references (string)
+#sout-x26410b-bpyramid=normal
+
+# CABAC (boolean)
+#sout-x26410b-cabac=1
+
+# Use fullrange instead of TV colorrange (boolean)
+#sout-x26410b-fullrange=0
+
+# Number of reference frames (integer)
+#sout-x26410b-ref=3
+
+# Skip loop filter (boolean)
+#sout-x26410b-nf=0
+
+# Loop filter AlphaC0 and Beta parameters alpha:beta (string)
+#sout-x26410b-deblock=0:0
+
+# Strength of psychovisual optimization, default is "1.0:0.0" (string)
+#sout-x26410b-psy-rd=1.0:0.0
+
+# Use Psy-optimizations (boolean)
+#sout-x26410b-psy=1
+
+# H.264 level (string)
+#sout-x26410b-level=0
+
+# H.264 profile (string)
+#sout-x26410b-profile=high
+
+# Interlaced mode (boolean)
+#sout-x26410b-interlaced=0
+
+# Frame packing (integer)
+#sout-x26410b-frame-packing=-1
+
+# Force number of slices per frame (integer)
+#sout-x26410b-slices=0
+
+# Limit the size of each slice in bytes (integer)
+#sout-x26410b-slice-max-size=0
+
+# Limit the size of each slice in macroblocks (integer)
+#sout-x26410b-slice-max-mbs=0
+
+# HRD-timing information (string)
+#sout-x26410b-hrd=none
+
+# Set QP (integer)
+#sout-x26410b-qp=-1
+
+# Quality-based VBR (integer)
+#sout-x26410b-crf=23
+
+# Min QP (integer)
+#sout-x26410b-qpmin=10
+
+# Max QP (integer)
+#sout-x26410b-qpmax=51
+
+# Max QP step (integer)
+#sout-x26410b-qpstep=4
+
+# Average bitrate tolerance (float)
+#sout-x26410b-ratetol=1.000000
+
+# Max local bitrate (integer)
+#sout-x26410b-vbv-maxrate=0
+
+# VBV buffer (integer)
+#sout-x26410b-vbv-bufsize=0
+
+# Initial VBV buffer occupancy (float)
+#sout-x26410b-vbv-init=0.900000
+
+# QP factor between I and P (float)
+#sout-x26410b-ipratio=1.400000
+
+# QP factor between P and B (float)
+#sout-x26410b-pbratio=1.300000
+
+# QP difference between chroma and luma (integer)
+#sout-x26410b-chroma-qp-offset=0
+
+# Multipass ratecontrol (integer)
+#sout-x26410b-pass=0
+
+# QP curve compression (float)
+#sout-x26410b-qcomp=0.600000
+
+# Reduce fluctuations in QP (float)
+#sout-x26410b-cplxblur=20.000000
+
+# Reduce fluctuations in QP (float)
+#sout-x26410b-qblur=0.500000
+
+# How AQ distributes bits (integer)
+#sout-x26410b-aq-mode=1
+
+# Strength of AQ (float)
+#sout-x26410b-aq-strength=1.000000
+
+# Partitions to consider (string)
+#sout-x26410b-partitions=normal
+
+# Direct MV prediction mode (string)
+#sout-x26410b-direct=spatial
+
+# Direct prediction size (integer)
+#sout-x26410b-direct-8x8=1
+
+# Weighted prediction for B-frames (boolean)
+#sout-x26410b-weightb=1
+
+# Weighted prediction for P-frames (integer)
+#sout-x26410b-weightp=2
+
+# Integer pixel motion estimation method (string)
+#sout-x26410b-me=hex
+
+# Maximum motion vector search range (integer)
+#sout-x26410b-merange=16
+
+# Maximum motion vector length (integer)
+#sout-x26410b-mvrange=-1
+
+# Minimum buffer space between threads (integer)
+#sout-x26410b-mvrange-thread=-1
+
+# Subpixel motion estimation and partition decision quality (integer)
+#sout-x26410b-subme=7
+
+# Decide references on a per partition basis (boolean)
+#sout-x26410b-mixed-refs=1
+
+# Chroma in motion estimation (boolean)
+#sout-x26410b-chroma-me=1
+
+# Adaptive spatial transform size (boolean)
+#sout-x26410b-8x8dct=1
+
+# Trellis RD quantization (integer)
+#sout-x26410b-trellis=1
+
+# Framecount to use on frametype lookahead (integer)
+#sout-x26410b-lookahead=40
+
+# Use Periodic Intra Refresh (boolean)
+#sout-x26410b-intra-refresh=0
+
+# Use mb-tree ratecontrol (boolean)
+#sout-x26410b-mbtree=1
+
+# Early SKIP detection on P-frames (boolean)
+#sout-x26410b-fast-pskip=1
+
+# Coefficient thresholding on P-frames (boolean)
+#sout-x26410b-dct-decimate=1
+
+# Noise reduction (integer)
+#sout-x26410b-nr=0
+
+# Inter luma quantization deadzone (integer)
+#sout-x26410b-deadzone-inter=21
+
+# Intra luma quantization deadzone (integer)
+#sout-x26410b-deadzone-intra=11
+
+# Non-deterministic optimizations when threaded (boolean)
+#sout-x26410b-non-deterministic=0
+
+# CPU optimizations (boolean)
+#sout-x26410b-asm=1
+
+# PSNR computation (boolean)
+#sout-x26410b-psnr=0
+
+# SSIM computation (boolean)
+#sout-x26410b-ssim=0
+
+# Quiet mode (boolean)
+#sout-x26410b-quiet=0
+
+# SPS and PPS id numbers (integer)
+#sout-x26410b-sps-id=0
+
+# Access unit delimiters (boolean)
+#sout-x26410b-aud=0
+
+# Statistics (boolean)
+#sout-x26410b-verbose=0
+
+# Filename for 2 pass stats file (string)
+#sout-x26410b-stats=x264_2pass.log
+
+# Default preset setting used (string)
+#sout-x26410b-preset=
+
+# Default tune setting used (string)
+#sout-x26410b-tune=
+
+# x264 advanced options (string)
+#sout-x26410b-options=
+
+[dca] # DTS Coherent Acoustics audio decoder
+
+# DTS dynamic range compression (boolean)
+#dts-dynrng=1
+
+[folder] # Folder meta data
+
+# Album art filename (string)
+#album-art-filename=
+
+[logo] # Logo sub source
+
+# Logo filenames (string)
+#logo-file=
+
+# X coordinate (integer)
+#logo-x=-1
+
+# Y coordinate (integer)
+#logo-y=-1
+
+# Logo individual image time in ms (integer)
+#logo-delay=1000
+
+# Logo animation # of loops (integer)
+#logo-repeat=-1
+
+# Opacity of the logo (integer)
+#logo-opacity=255
+
+# Logo position (integer)
+#logo-position=-1
+
+[mosaic] # Mosaic video sub source
+
+# Transparency (integer)
+#mosaic-alpha=255
+
+# Height (integer)
+#mosaic-height=100
+
+# Width (integer)
+#mosaic-width=100
+
+# Mosaic alignment (integer)
+#mosaic-align=5
+
+# Top left corner X coordinate (integer)
+#mosaic-xoffset=0
+
+# Top left corner Y coordinate (integer)
+#mosaic-yoffset=0
+
+# Border width (integer)
+#mosaic-borderw=0
+
+# Border height (integer)
+#mosaic-borderh=0
+
+# Positioning method (integer)
+#mosaic-position=0
+
+# Number of rows (integer)
+#mosaic-rows=2
+
+# Number of columns (integer)
+#mosaic-cols=2
+
+# Keep aspect ratio (boolean)
+#mosaic-keep-aspect-ratio=0
+
+# Keep original size (boolean)
+#mosaic-keep-picture=0
+
+# Elements order (string)
+#mosaic-order=
+
+# Offsets in order (string)
+#mosaic-offsets=
+
+# Delay (integer)
+#mosaic-delay=0
+
+[rss] # RSS and Atom feed display
+
+# Feed URLs (string)
+#rss-urls=
+
+# X offset (integer)
+#rss-x=0
+
+# Y offset (integer)
+#rss-y=0
+
+# Text position (integer)
+#rss-position=-1
+
+# Opacity (integer)
+#rss-opacity=255
+
+# Color (integer)
+#rss-color=16777215
+
+# Font size, pixels (integer)
+#rss-size=0
+
+# Speed of feeds (integer)
+#rss-speed=100000
+
+# Max length (integer)
+#rss-length=60
+
+# Refresh time (integer)
+#rss-ttl=1800
+
+# Feed images (boolean)
+#rss-images=1
+
+# Title display mode (integer)
+#rss-title=-1
+
+[marq] # Marquee display
+
+# Text (string)
+#marq-marquee=VLC
+
+# Text file (string)
+#marq-file=
+
+# X offset (integer)
+#marq-x=0
+
+# Y offset (integer)
+#marq-y=0
+
+# Marquee position (integer)
+#marq-position=-1
+
+# Opacity (integer)
+#marq-opacity=255
+
+# Color (integer)
+#marq-color=16777215
+
+# Font size, pixels (integer)
+#marq-size=0
+
+# Timeout (integer)
+#marq-timeout=0
+
+# Refresh period in ms (integer)
+#marq-refresh=1000
+
+[audiobargraph_v] # Audio Bar Graph Video sub source
+
+# X coordinate (integer)
+#audiobargraph_v-x=0
+
+# Y coordinate (integer)
+#audiobargraph_v-y=0
+
+# Transparency of the bargraph (integer)
+#audiobargraph_v-transparency=255
+
+# Bargraph position (integer)
+#audiobargraph_v-position=-1
+
+# Bar width in pixel (integer)
+#audiobargraph_v-barWidth=10
+
+# Bar Height in pixel (integer)
+#audiobargraph_v-barHeight=400
+
+[dynamicoverlay] # Dynamic video overlay
+
+# Input FIFO (string)
+#overlay-input=
+
+# Output FIFO (string)
+#overlay-output=
+
+[subsdelay] # Subtitle delay
+
+# Delay calculation mode (integer)
+#subsdelay-mode=1
+
+# Calculation factor (float)
+#subsdelay-factor=2.000000
+
+# Maximum overlapping subtitles (integer)
+#subsdelay-overlap=3
+
+# Minimum alpha value (integer)
+#subsdelay-min-alpha=70
+
+# Interval between two disappearances (integer)
+#subsdelay-min-stops=1000
+
+# Interval between appearance and disappearance (integer)
+#subsdelay-min-start-stop=1000
+
+# Interval between disappearance and appearance (integer)
+#subsdelay-min-stop-start=1000
+
+[file] # Secrets are stored on a file without any encryption
+
+# ? (string)
+#keystore-file=
+
+[mpegvideo] # MPEG-I/II video packetizer
+
+# Sync on Intra Frame (boolean)
+#packetizer-mpegvideo-sync-iframe=0
+
+[file] # File logger
+
+# Log to file (boolean)
+#file-logging=0
+
+# Log filename (string)
+#logfile=
+
+# Log format (string)
+#logmode=text
+
+# Verbosity (integer)
+#log-verbose=-1
+
+[syslog] # System logger (syslog)
+
+# System log (syslog) (boolean)
+#syslog=0
+
+# Debug messages (boolean)
+#syslog-debug=0
+
+# Identity (string)
+#syslog-ident=vlc
+
+# Facility (string)
+#syslog-facility=user
+
+[console] # Console logger
+
+[vdpau_chroma] # VDPAU surface conversions
+
+# Deinterlace (integer)
+#vdpau-deinterlace=1
+
+# Inverse telecine (boolean)
+#vdpau-ivtc=0
+
+# Deinterlace chroma skip (boolean)
+#vdpau-chroma-skip=0
+
+# Noise reduction level (float)
+#vdpau-noise-reduction=0.000000
+
+# Scaling quality (integer)
+#vdpau-scaling=0
+
+[visual] # Visualizer filter
+
+# Effects list (string)
+#effect-list=spectrum
+
+# Video width (integer)
+#effect-width=800
+
+# Video height (integer)
+#effect-height=500
+
+# FFT window (string)
+#effect-fft-window=flat
+
+# Kaiser window parameter (float)
+#effect-kaiser-param=3.000000
+
+# Show 80 bands instead of 20 (boolean)
+#visual-80-bands=1
+
+# Draw peaks in the analyzer (boolean)
+#visual-peaks=1
+
+# Enable original graphic spectrum (boolean)
+#spect-show-original=0
+
+# Draw the base of the bands (boolean)
+#spect-show-base=1
+
+# Base pixel radius (integer)
+#spect-radius=42
+
+# Spectral sections (integer)
+#spect-sections=3
+
+# V-plane color (integer)
+#spect-color=80
+
+# Draw bands in the spectrometer (boolean)
+#spect-show-bands=1
+
+# Show 80 bands instead of 20 (boolean)
+#spect-80-bands=1
+
+# Number of blank pixels between bands. (integer)
+#spect-separ=1
+
+# Amplification (integer)
+#spect-amp=8
+
+# Draw peaks in the analyzer (boolean)
+#spect-show-peaks=1
+
+# Peak extra width (integer)
+#spect-peak-width=61
+
+# Peak height (integer)
+#spect-peak-height=1
+
+[glspectrum] # 3D OpenGL spectrum visualization
+
+# Video width (integer)
+#glspectrum-width=400
+
+# Video height (integer)
+#glspectrum-height=300
+
+[upnp] # Universal Plug'n'Play
+
+# SAT>IP channel list (string)
+#satip-channelist=auto
+
+# Custom SAT>IP channel list URL (string)
+#satip-channellist-url=
+
+[sap] # Network streams (SAP)
+
+# SAP multicast address (string)
+#sap-addr=
+
+# SAP timeout (seconds) (integer)
+#sap-timeout=1800
+
+# Try to parse the announce (boolean)
+#sap-parse=1
+
+# SAP Strict mode (boolean)
+#sap-strict=0
+
+[podcast] # Podcasts
+
+# Podcast URLs list (string)
+#podcast-urls=
+
+[access_output_shout] # IceCAST output
+
+# Stream name (string)
+#sout-shout-name=VLC media player - Live stream
+
+# Stream description (string)
+#sout-shout-description=Live stream from VLC media player
+
+# Stream MP3 (boolean)
+#sout-shout-mp3=0
+
+# Genre description (string)
+#sout-shout-genre=Alternative
+
+# URL description (string)
+#sout-shout-url=http://www.videolan.org/vlc
+
+# Bitrate (string)
+#sout-shout-bitrate=
+
+# Samplerate (string)
+#sout-shout-samplerate=
+
+# Number of channels (string)
+#sout-shout-channels=
+
+# Ogg Vorbis Quality (string)
+#sout-shout-quality=
+
+# Stream public (boolean)
+#sout-shout-public=0
+
+[udp] # UDP stream output
+
+# Caching value (ms) (integer)
+#sout-udp-caching=300
+
+# Group packets (integer)
+#sout-udp-group=1
+
+[file] # File stream output
+
+# Overwrite existing file (boolean)
+#sout-file-overwrite=1
+
+# Append to file (boolean)
+#sout-file-append=0
+
+# Format time and date (boolean)
+#sout-file-format=0
+
+# Synchronous writing (boolean)
+#sout-file-sync=0
+
+[http] # HTTP stream output
+
+# Username (string)
+#sout-http-user=
+
+# Password (string)
+#sout-http-pwd=
+
+# Mime (string)
+#sout-http-mime=
+
+# Metacube (boolean)
+#sout-http-metacube=0
+
+[core] # core program
+
+# Enable audio (boolean)
+#audio=1
+
+# Audio gain (float)
+#gain=1.000000
+
+# Audio output volume step (float)
+#volume-step=12.800000
+
+# Remember the audio volume (boolean)
+#volume-save=1
+
+# Force S/PDIF support (boolean)
+#spdif=0
+
+# Force detection of Dolby Surround (integer)
+#force-dolby-surround=0
+
+# Stereo audio output mode (integer)
+#stereo-mode=0
+
+# Audio desynchronization compensation (integer)
+#audio-desync=0
+
+# Replay gain mode (string)
+#audio-replay-gain-mode=none
+
+# Replay preamp (float)
+#audio-replay-gain-preamp=0.000000
+
+# Default replay gain (float)
+#audio-replay-gain-default=-7.000000
+
+# Peak protection (boolean)
+#audio-replay-gain-peak-protection=1
+
+# Enable time stretching audio (boolean)
+#audio-time-stretch=1
+
+# Audio output module (string)
+#aout=
+
+# Media role (string)
+#role=video
+
+# Audio filters (string)
+#audio-filter=
+
+# Audio visualizations (string)
+#audio-visual=none
+
+# Audio resampler (string)
+#audio-resampler=
+
+# Enable video (boolean)
+#video=1
+
+# Grayscale video output (boolean)
+#grayscale=0
+
+# Fullscreen video output (boolean)
+#fullscreen=0
+
+# Embedded video (boolean)
+#embedded-video=1
+
+# (boolean)
+#xlib=1
+
+# Drop late frames (boolean)
+#drop-late-frames=1
+
+# Skip frames (boolean)
+#skip-frames=1
+
+# Quiet synchro (boolean)
+#quiet-synchro=0
+
+# Key press events (boolean)
+#keyboard-events=1
+
+# Mouse events (boolean)
+#mouse-events=1
+
+# Always on top (boolean)
+#video-on-top=0
+
+# Enable wallpaper mode (boolean)
+#video-wallpaper=0
+
+# Disable screensaver (boolean)
+#disable-screensaver=1
+
+# Show media title on video (boolean)
+#video-title-show=1
+
+# Show video title for x milliseconds (integer)
+#video-title-timeout=5000
+
+# Position of video title (integer)
+#video-title-position=8
+
+# Hide cursor and fullscreen controller after x milliseconds (integer)
+#mouse-hide-timeout=1000
+
+# Video snapshot directory (or filename) (string)
+#snapshot-path=
+
+# Video snapshot file prefix (string)
+#snapshot-prefix=vlcsnap-
+
+# Video snapshot format (string)
+#snapshot-format=png
+
+# Display video snapshot preview (boolean)
+#snapshot-preview=1
+
+# Use sequential numbers instead of timestamps (boolean)
+#snapshot-sequential=0
+
+# Video snapshot width (integer)
+#snapshot-width=-1
+
+# Video snapshot height (integer)
+#snapshot-height=-1
+
+# Video width (integer)
+#width=-1
+
+# Video height (integer)
+#height=-1
+
+# Video X coordinate (integer)
+#video-x=0
+
+# Video Y coordinate (integer)
+#video-y=0
+
+# Video cropping (string)
+#crop=
+
+# Custom crop ratios list (string)
+#custom-crop-ratios=
+
+# Source aspect ratio (string)
+#aspect-ratio=
+
+# Video Auto Scaling (boolean)
+#autoscale=1
+
+# Monitor pixel aspect ratio (string)
+#monitor-par=
+
+# Custom aspect ratios list (string)
+#custom-aspect-ratios=
+
+# Fix HDTV height (boolean)
+#hdtv-fix=1
+
+# Window decorations (boolean)
+#video-deco=1
+
+# Video title (string)
+#video-title=
+
+# Video alignment (integer)
+#align=0
+
+# Zoom video (float)
+#zoom=1.000000
+
+# Deinterlace (integer)
+#deinterlace=-1
+
+# Deinterlace mode (string)
+#deinterlace-mode=auto
+
+# Video output module (string)
+#vout=
+
+# Video filter module (string)
+#video-filter=
+
+# Video splitter module (string)
+#video-splitter=
+
+# Enable sub-pictures (boolean)
+#spu=1
+
+# On Screen Display (boolean)
+#osd=1
+
+# Text rendering module (string)
+#text-renderer=
+
+# Use subtitle file (string)
+#sub-file=
+
+# Autodetect subtitle files (boolean)
+#sub-autodetect-file=1
+
+# Subtitle autodetection fuzziness (integer)
+#sub-autodetect-fuzzy=3
+
+# Subtitle autodetection paths (string)
+#sub-autodetect-path=./Subtitles, ./subtitles, ./Subs, ./subs
+
+# Force subtitle position (integer)
+#sub-margin=0
+
+# Subpictures source module (string)
+#sub-source=
+
+# Subpictures filter module (string)
+#sub-filter=
+
+# Program (integer)
+#program=0
+
+# Programs (string)
+#programs=
+
+# Audio track (integer)
+#audio-track=-1
+
+# Subtitle track (integer)
+#sub-track=-1
+
+# Audio language (string)
+#audio-language=
+
+# Subtitle language (string)
+#sub-language=
+
+# Menu language (string)
+#menu-language=
+
+# Audio track ID (integer)
+#audio-track-id=-1
+
+# Subtitle track ID (integer)
+#sub-track-id=-1
+
+# Preferred Closed Captions decoder (integer)
+#captions=608
+
+# Preferred video resolution (integer)
+#preferred-resolution=-1
+
+# Input repetitions (integer)
+#input-repeat=0
+
+# Start time (float)
+#start-time=0.000000
+
+# Stop time (float)
+#stop-time=0.000000
+
+# Run time (float)
+#run-time=0.000000
+
+# Fast seek (boolean)
+#input-fast-seek=0
+
+# Playback speed (float)
+#rate=1.000000
+
+# Input list (string)
+#input-list=
+
+# Input slave (experimental) (string)
+#input-slave=
+
+# Bookmarks list for a stream (string)
+#bookmarks=
+
+# DVD device (string)
+#dvd=/dev/sr0
+
+# VCD device (string)
+#vcd=/dev/sr0
+
+# MTU of the network interface (integer)
+#mtu=1400
+
+# TCP connection timeout (integer)
+#ipv4-timeout=5000
+
+# HTTP server address (string)
+#http-host=
+
+# HTTP server port (integer)
+#http-port=8080
+
+# HTTPS server port (integer)
+#https-port=8443
+
+# RTSP server address (string)
+#rtsp-host=
+
+# RTSP server port (integer)
+#rtsp-port=554
+
+# HTTP/TLS server certificate (string)
+#http-cert=
+
+# HTTP/TLS server private key (string)
+#http-key=
+
+# SOCKS server (string)
+#socks=
+
+# SOCKS user name (string)
+#socks-user=
+
+# SOCKS password (string)
+#socks-pwd=
+
+# Title metadata (string)
+#meta-title=
+
+# Author metadata (string)
+#meta-author=
+
+# Artist metadata (string)
+#meta-artist=
+
+# Genre metadata (string)
+#meta-genre=
+
+# Copyright metadata (string)
+#meta-copyright=
+
+# Description metadata (string)
+#meta-description=
+
+# Date metadata (string)
+#meta-date=
+
+# URL metadata (string)
+#meta-url=
+
+# File caching (ms) (integer)
+#file-caching=300
+
+# Live capture caching (ms) (integer)
+#live-caching=300
+
+# Disc caching (ms) (integer)
+#disc-caching=300
+
+# Network caching (ms) (integer)
+#network-caching=1000
+
+# Clock reference average counter (integer)
+#cr-average=40
+
+# Clock synchronisation (integer)
+#clock-synchro=-1
+
+# Clock jitter (integer)
+#clock-jitter=5000
+
+# Network synchronisation (boolean)
+#network-synchronisation=0
+
+# Record directory (string)
+#input-record-path=
+
+# Prefer native stream recording (boolean)
+#input-record-native=1
+
+# Timeshift directory (string)
+#input-timeshift-path=
+
+# Timeshift granularity (integer)
+#input-timeshift-granularity=-1
+
+# Change title according to current media (string)
+#input-title-format=$Z
+
+# Disable all lua plugins (boolean)
+#lua=1
+
+# Preferred decoders list (string)
+#codec=
+
+# Preferred encoders list (string)
+#encoder=
+
+# Access module (string)
+#access=
+
+# Demux module (string)
+#demux=any
+
+# Stream filter module (string)
+#stream-filter=
+
+# Demux filter module (string)
+#demux-filter=
+
+# Default stream output chain (string)
+#sout=
+
+# Display while streaming (boolean)
+#sout-display=0
+
+# Keep stream output open (boolean)
+#sout-keep=0
+
+# Enable streaming of all ES (boolean)
+#sout-all=1
+
+# Enable audio stream output (boolean)
+#sout-audio=1
+
+# Enable video stream output (boolean)
+#sout-video=1
+
+# Enable SPU stream output (boolean)
+#sout-spu=1
+
+# Stream output muxer caching (ms) (integer)
+#sout-mux-caching=1500
+
+# VLM configuration file (string)
+#vlm-conf=
+
+# SAP announcement interval (integer)
+#sap-interval=5
+
+# Mux module (string)
+#mux=
+
+# Access output module (string)
+#access_output=
+
+# Hop limit (TTL) (integer)
+#ttl=-1
+
+# Multicast output interface (string)
+#miface=
+
+# DiffServ Code Point (integer)
+#dscp=0
+
+# Preferred packetizer list (string)
+#packetizer=
+
+# VoD server module (string)
+#vod-server=
+
+# Use a plugins cache (boolean)
+#plugins-cache=1
+
+# Scan for new plugins (boolean)
+#plugins-scan=1
+
+# Preferred keystore list (string)
+#keystore=
+
+# Allow real-time priority (boolean)
+#rt-priority=0
+
+# Adjust VLC priority (integer)
+#rt-offset=0
+
+# Play files randomly forever (boolean)
+#random=0
+
+# Repeat all (boolean)
+#loop=0
+
+# Repeat current item (boolean)
+#repeat=0
+
+# Play and exit (boolean)
+#play-and-exit=0
+
+# Play and stop (boolean)
+#play-and-stop=0
+
+# Play and pause (boolean)
+#play-and-pause=0
+
+# Start paused (boolean)
+#start-paused=0
+
+# Auto start (boolean)
+#playlist-autostart=1
+
+# Pause on audio communication (boolean)
+#playlist-cork=1
+
+# Allow only one running instance (boolean)
+#one-instance=0
+
+# Use only one instance when started from file manager (boolean)
+#one-instance-when-started-from-file=1
+
+# Enqueue items into playlist in one instance mode (boolean)
+#playlist-enqueue=0
+
+# Expose media player via D-Bus (boolean)
+#dbus=0
+
+# Use media library (boolean)
+#media-library=0
+
+# Display playlist tree (boolean)
+#playlist-tree=0
+
+# Default stream (string)
+#open=
+
+# Automatically preparse items (boolean)
+#auto-preparse=1
+
+# Preparsing timeout (integer)
+#preparse-timeout=5000
+
+# Allow metadata network access (boolean)
+metadata-network-access=1
+
+# Subdirectory behavior (string)
+#recursive=collapse
+
+# Ignored extensions (string)
+#ignore-filetypes=m3u,db,nfo,ini,jpg,jpeg,ljpg,gif,png,pgm,pgmyuv,pbm,pam,tga,bmp,pnm,xpm,xcf,pcx,tif,tiff,lbm,sfv,txt,sub,idx,srt,cue,ssa
+
+# Show hidden files (boolean)
+#show-hiddenfiles=0
+
+# Services discovery modules (string)
+#services-discovery=
+
+# Run as daemon process (boolean)
+#daemon=0
+
+# Write process id to file (string)
+#pidfile=
+
+# Show advanced options (boolean)
+#advanced=0
+
+# Interface interaction (boolean)
+#interact=1
+
+# Locally collect statistics (boolean)
+#stats=1
+
+# Interface module (string)
+#intf=
+
+# Extra interface modules (string)
+#extraintf=
+
+# Control interfaces (string)
+#control=
+
+# Mouse wheel vertical axis control (integer)
+#hotkeys-y-wheel-mode=0
+
+# Mouse wheel horizontal axis control (integer)
+#hotkeys-x-wheel-mode=2
+
+# Fullscreen (string)
+#global-key-toggle-fullscreen=
+
+# Fullscreen (string)
+#key-toggle-fullscreen=f
+
+# Exit fullscreen (string)
+#global-key-leave-fullscreen=
+
+# Exit fullscreen (string)
+#key-leave-fullscreen=Esc
+
+# Play/Pause (string)
+#global-key-play-pause=
+
+# Play/Pause (string)
+#key-play-pause=Space Media Play Pause
+
+# Pause only (string)
+#global-key-pause=
+
+# Pause only (string)
+#key-pause=Browser Stop
+
+# Play only (string)
+#global-key-play=
+
+# Play only (string)
+#key-play=Browser Refresh
+
+# Faster (string)
+#global-key-faster=
+
+# Faster (string)
+#key-faster=+
+
+# Slower (string)
+#global-key-slower=
+
+# Slower (string)
+#key-slower=-
+
+# Normal rate (string)
+#global-key-rate-normal=
+
+# Normal rate (string)
+#key-rate-normal==
+
+# Faster (fine) (string)
+#global-key-rate-faster-fine=
+
+# Faster (fine) (string)
+#key-rate-faster-fine=]
+
+# Slower (fine) (string)
+#global-key-rate-slower-fine=
+
+# Slower (fine) (string)
+#key-rate-slower-fine=[
+
+# Next (string)
+#global-key-next=
+
+# Next (string)
+#key-next=n Media Next Track
+
+# Previous (string)
+#global-key-prev=
+
+# Previous (string)
+#key-prev=p Media Prev Track
+
+# Stop (string)
+#global-key-stop=
+
+# Stop (string)
+#key-stop=s Media Stop
+
+# Position (string)
+#global-key-position=
+
+# Position (string)
+#key-position=t
+
+# Very short backwards jump (string)
+#global-key-jump-extrashort=
+
+# Very short backwards jump (string)
+#key-jump-extrashort=Shift+Left
+
+# Very short forward jump (string)
+#global-key-jump+extrashort=
+
+# Very short forward jump (string)
+#key-jump+extrashort=Shift+Right
+
+# Short backwards jump (string)
+#global-key-jump-short=
+
+# Short backwards jump (string)
+#key-jump-short=Alt+Left
+
+# Short forward jump (string)
+#global-key-jump+short=
+
+# Short forward jump (string)
+#key-jump+short=Alt+Right
+
+# Medium backwards jump (string)
+#global-key-jump-medium=
+
+# Medium backwards jump (string)
+#key-jump-medium=Ctrl+Left
+
+# Medium forward jump (string)
+#global-key-jump+medium=
+
+# Medium forward jump (string)
+#key-jump+medium=Ctrl+Right
+
+# Long backwards jump (string)
+#global-key-jump-long=
+
+# Long backwards jump (string)
+#key-jump-long=Ctrl+Alt+Left
+
+# Long forward jump (string)
+#global-key-jump+long=
+
+# Long forward jump (string)
+#key-jump+long=Ctrl+Alt+Right
+
+# Next frame (string)
+#global-key-frame-next=
+
+# Next frame (string)
+#key-frame-next=e Browser Next
+
+# Activate (string)
+#global-key-nav-activate=
+
+# Activate (string)
+#key-nav-activate=Enter
+
+# Navigate up (string)
+#global-key-nav-up=
+
+# Navigate up (string)
+#key-nav-up=Up
+
+# Navigate down (string)
+#global-key-nav-down=
+
+# Navigate down (string)
+#key-nav-down=Down
+
+# Navigate left (string)
+#global-key-nav-left=
+
+# Navigate left (string)
+#key-nav-left=Left
+
+# Navigate right (string)
+#global-key-nav-right=
+
+# Navigate right (string)
+#key-nav-right=Right
+
+# Go to the DVD menu (string)
+#global-key-disc-menu=
+
+# Go to the DVD menu (string)
+#key-disc-menu=Shift+m
+
+# Select previous DVD title (string)
+#global-key-title-prev=
+
+# Select previous DVD title (string)
+#key-title-prev=Shift+o
+
+# Select next DVD title (string)
+#global-key-title-next=
+
+# Select next DVD title (string)
+#key-title-next=Shift+b
+
+# Select prev DVD chapter (string)
+#global-key-chapter-prev=
+
+# Select prev DVD chapter (string)
+#key-chapter-prev=Shift+p
+
+# Select next DVD chapter (string)
+#global-key-chapter-next=
+
+# Select next DVD chapter (string)
+#key-chapter-next=Shift+n
+
+# Quit (string)
+#global-key-quit=
+
+# Quit (string)
+#key-quit=Ctrl+q
+
+# Volume up (string)
+#global-key-vol-up=
+
+# Volume up (string)
+#key-vol-up=Ctrl+Up Volume Up
+
+# Volume down (string)
+#global-key-vol-down=
+
+# Volume down (string)
+#key-vol-down=Ctrl+Down Volume Down
+
+# Mute (string)
+#global-key-vol-mute=
+
+# Mute (string)
+#key-vol-mute=m Volume Mute
+
+# Subtitle delay up (string)
+#global-key-subdelay-up=
+
+# Subtitle delay up (string)
+#key-subdelay-up=h
+
+# Subtitle delay down (string)
+#global-key-subdelay-down=
+
+# Subtitle delay down (string)
+#key-subdelay-down=g
+
+# Subtitle sync / bookmark audio timestamp (string)
+#global-key-subsync-markaudio=
+
+# Subtitle sync / bookmark audio timestamp (string)
+#key-subsync-markaudio=Shift+h
+
+# Subtitle sync / bookmark subtitle timestamp (string)
+#global-key-subsync-marksub=
+
+# Subtitle sync / bookmark subtitle timestamp (string)
+#key-subsync-marksub=Shift+j
+
+# Subtitle sync / synchronize audio & subtitle timestamps (string)
+#global-key-subsync-apply=
+
+# Subtitle sync / synchronize audio & subtitle timestamps (string)
+#key-subsync-apply=Shift+k
+
+# Subtitle sync / reset audio & subtitle synchronization (string)
+#global-key-subsync-reset=
+
+# Subtitle sync / reset audio & subtitle synchronization (string)
+#key-subsync-reset=Ctrl+Shift+k
+
+# Subtitle position up (string)
+#global-key-subpos-up=
+
+# Subtitle position up (string)
+#key-subpos-up=
+
+# Subtitle position down (string)
+#global-key-subpos-down=
+
+# Subtitle position down (string)
+#key-subpos-down=
+
+# Audio delay up (string)
+#global-key-audiodelay-up=
+
+# Audio delay up (string)
+#key-audiodelay-up=k
+
+# Audio delay down (string)
+#global-key-audiodelay-down=
+
+# Audio delay down (string)
+#key-audiodelay-down=j
+
+# Cycle audio track (string)
+#global-key-audio-track=
+
+# Cycle audio track (string)
+#key-audio-track=b
+
+# Cycle through audio devices (string)
+#global-key-audiodevice-cycle=
+
+# Cycle through audio devices (string)
+#key-audiodevice-cycle=Shift+a
+
+# Cycle subtitle track in reverse order (string)
+#global-key-subtitle-revtrack=
+
+# Cycle subtitle track in reverse order (string)
+#key-subtitle-revtrack=Alt+v
+
+# Cycle subtitle track (string)
+#global-key-subtitle-track=
+
+# Cycle subtitle track (string)
+#key-subtitle-track=v
+
+# Toggle subtitles (string)
+#global-key-subtitle-toggle=
+
+# Toggle subtitles (string)
+#key-subtitle-toggle=Shift+v
+
+# Cycle next program Service ID (string)
+#global-key-program-sid-next=
+
+# Cycle next program Service ID (string)
+#key-program-sid-next=x
+
+# Cycle previous program Service ID (string)
+#global-key-program-sid-prev=
+
+# Cycle previous program Service ID (string)
+#key-program-sid-prev=Shift+x
+
+# Cycle source aspect ratio (string)
+#global-key-aspect-ratio=
+
+# Cycle source aspect ratio (string)
+#key-aspect-ratio=a
+
+# Cycle video crop (string)
+#global-key-crop=
+
+# Cycle video crop (string)
+#key-crop=c
+
+# Toggle autoscaling (string)
+#global-key-toggle-autoscale=
+
+# Toggle autoscaling (string)
+#key-toggle-autoscale=o
+
+# Increase scale factor (string)
+#global-key-incr-scalefactor=
+
+# Increase scale factor (string)
+#key-incr-scalefactor=Alt+o
+
+# Decrease scale factor (string)
+#global-key-decr-scalefactor=
+
+# Decrease scale factor (string)
+#key-decr-scalefactor=Alt+Shift+o
+
+# Toggle deinterlacing (string)
+#global-key-deinterlace=
+
+# Toggle deinterlacing (string)
+#key-deinterlace=d
+
+# Cycle deinterlace modes (string)
+#global-key-deinterlace-mode=
+
+# Cycle deinterlace modes (string)
+#key-deinterlace-mode=Shift+d
+
+# Show controller in fullscreen (string)
+#global-key-intf-show=
+
+# Show controller in fullscreen (string)
+#key-intf-show=i
+
+# Boss key (string)
+#global-key-intf-boss=
+
+# Boss key (string)
+#key-intf-boss=
+
+# Context menu (string)
+#global-key-intf-popup-menu=
+
+# Context menu (string)
+#key-intf-popup-menu=Menu
+
+# Take video snapshot (string)
+#global-key-snapshot=
+
+# Take video snapshot (string)
+#key-snapshot=Shift+s
+
+# Record (string)
+#global-key-record=
+
+# Record (string)
+#key-record=Shift+r
+
+# Zoom (string)
+#global-key-zoom=
+
+# Zoom (string)
+#key-zoom=z
+
+# Un-Zoom (string)
+#global-key-unzoom=
+
+# Un-Zoom (string)
+#key-unzoom=Shift+z
+
+# Toggle wallpaper mode in video output (string)
+#global-key-wallpaper=
+
+# Toggle wallpaper mode in video output (string)
+#key-wallpaper=w
+
+# Crop one pixel from the top of the video (string)
+#global-key-crop-top=
+
+# Crop one pixel from the top of the video (string)
+#key-crop-top=Alt+r
+
+# Uncrop one pixel from the top of the video (string)
+#global-key-uncrop-top=
+
+# Uncrop one pixel from the top of the video (string)
+#key-uncrop-top=Alt+Shift+r
+
+# Crop one pixel from the left of the video (string)
+#global-key-crop-left=
+
+# Crop one pixel from the left of the video (string)
+#key-crop-left=Alt+d
+
+# Uncrop one pixel from the left of the video (string)
+#global-key-uncrop-left=
+
+# Uncrop one pixel from the left of the video (string)
+#key-uncrop-left=Alt+Shift+d
+
+# Crop one pixel from the bottom of the video (string)
+#global-key-crop-bottom=
+
+# Crop one pixel from the bottom of the video (string)
+#key-crop-bottom=Alt+c
+
+# Uncrop one pixel from the bottom of the video (string)
+#global-key-uncrop-bottom=
+
+# Uncrop one pixel from the bottom of the video (string)
+#key-uncrop-bottom=Alt+Shift+c
+
+# Crop one pixel from the right of the video (string)
+#global-key-crop-right=
+
+# Crop one pixel from the right of the video (string)
+#key-crop-right=Alt+f
+
+# Uncrop one pixel from the right of the video (string)
+#global-key-uncrop-right=
+
+# Uncrop one pixel from the right of the video (string)
+#key-uncrop-right=Alt+Shift+f
+
+# Random (string)
+#global-key-random=
+
+# Random (string)
+#key-random=r
+
+# Normal/Loop/Repeat (string)
+#global-key-loop=
+
+# Normal/Loop/Repeat (string)
+#key-loop=l
+
+# Shrink the viewpoint field of view (360°) (string)
+#global-key-viewpoint-fov-in=
+
+# Shrink the viewpoint field of view (360°) (string)
+#key-viewpoint-fov-in=Page Up
+
+# Expand the viewpoint field of view (360°) (string)
+#global-key-viewpoint-fov-out=
+
+# Expand the viewpoint field of view (360°) (string)
+#key-viewpoint-fov-out=Page Down
+
+# Roll the viewpoint clockwise (360°) (string)
+#global-key-viewpoint-roll-clock=
+
+# Roll the viewpoint clockwise (360°) (string)
+#key-viewpoint-roll-clock=
+
+# Roll the viewpoint anti-clockwise (360°) (string)
+#global-key-viewpoint-roll-anticlock=
+
+# Roll the viewpoint anti-clockwise (360°) (string)
+#key-viewpoint-roll-anticlock=
+
+# 1:4 Quarter (string)
+#global-key-zoom-quarter=
+
+# 1:4 Quarter (string)
+#key-zoom-quarter=Alt+1
+
+# 1:2 Half (string)
+#global-key-zoom-half=
+
+# 1:2 Half (string)
+#key-zoom-half=Alt+2
+
+# 1:1 Original (string)
+#global-key-zoom-original=
+
+# 1:1 Original (string)
+#key-zoom-original=Alt+3
+
+# 2:1 Double (string)
+#global-key-zoom-double=
+
+# 2:1 Double (string)
+#key-zoom-double=Alt+4
+
+# Very short jump length (integer)
+#extrashort-jump-size=3
+
+# Short jump length (integer)
+#short-jump-size=10
+
+# Medium jump length (integer)
+#medium-jump-size=60
+
+# Long jump length (integer)
+#long-jump-size=300
+
+# Set playlist bookmark 1 (string)
+#global-key-set-bookmark1=
+
+# Set playlist bookmark 1 (string)
+#key-set-bookmark1=Ctrl+F1
+
+# Set playlist bookmark 2 (string)
+#global-key-set-bookmark2=
+
+# Set playlist bookmark 2 (string)
+#key-set-bookmark2=Ctrl+F2
+
+# Set playlist bookmark 3 (string)
+#global-key-set-bookmark3=
+
+# Set playlist bookmark 3 (string)
+#key-set-bookmark3=Ctrl+F3
+
+# Set playlist bookmark 4 (string)
+#global-key-set-bookmark4=
+
+# Set playlist bookmark 4 (string)
+#key-set-bookmark4=Ctrl+F4
+
+# Set playlist bookmark 5 (string)
+#global-key-set-bookmark5=
+
+# Set playlist bookmark 5 (string)
+#key-set-bookmark5=Ctrl+F5
+
+# Set playlist bookmark 6 (string)
+#global-key-set-bookmark6=
+
+# Set playlist bookmark 6 (string)
+#key-set-bookmark6=Ctrl+F6
+
+# Set playlist bookmark 7 (string)
+#global-key-set-bookmark7=
+
+# Set playlist bookmark 7 (string)
+#key-set-bookmark7=Ctrl+F7
+
+# Set playlist bookmark 8 (string)
+#global-key-set-bookmark8=
+
+# Set playlist bookmark 8 (string)
+#key-set-bookmark8=Ctrl+F8
+
+# Set playlist bookmark 9 (string)
+#global-key-set-bookmark9=
+
+# Set playlist bookmark 9 (string)
+#key-set-bookmark9=Ctrl+F9
+
+# Set playlist bookmark 10 (string)
+#global-key-set-bookmark10=
+
+# Set playlist bookmark 10 (string)
+#key-set-bookmark10=Ctrl+F10
+
+# Play playlist bookmark 1 (string)
+#global-key-play-bookmark1=
+
+# Play playlist bookmark 1 (string)
+#key-play-bookmark1=F1
+
+# Play playlist bookmark 2 (string)
+#global-key-play-bookmark2=
+
+# Play playlist bookmark 2 (string)
+#key-play-bookmark2=F2
+
+# Play playlist bookmark 3 (string)
+#global-key-play-bookmark3=
+
+# Play playlist bookmark 3 (string)
+#key-play-bookmark3=F3
+
+# Play playlist bookmark 4 (string)
+#global-key-play-bookmark4=
+
+# Play playlist bookmark 4 (string)
+#key-play-bookmark4=F4
+
+# Play playlist bookmark 5 (string)
+#global-key-play-bookmark5=
+
+# Play playlist bookmark 5 (string)
+#key-play-bookmark5=F5
+
+# Play playlist bookmark 6 (string)
+#global-key-play-bookmark6=
+
+# Play playlist bookmark 6 (string)
+#key-play-bookmark6=F6
+
+# Play playlist bookmark 7 (string)
+#global-key-play-bookmark7=
+
+# Play playlist bookmark 7 (string)
+#key-play-bookmark7=F7
+
+# Play playlist bookmark 8 (string)
+#global-key-play-bookmark8=
+
+# Play playlist bookmark 8 (string)
+#key-play-bookmark8=F8
+
+# Play playlist bookmark 9 (string)
+#global-key-play-bookmark9=
+
+# Play playlist bookmark 9 (string)
+#key-play-bookmark9=F9
+
+# Play playlist bookmark 10 (string)
+#global-key-play-bookmark10=
+
+# Play playlist bookmark 10 (string)
+#key-play-bookmark10=F10
+
+# Clear the playlist (string)
+#global-key-clear-playlist=
+
+# Clear the playlist (string)
+#key-clear-playlist=Ctrl+w
+
+# Reset subtitles text scale (string)
+#global-key-subtitle-text-scale-normal=
+
+# Reset subtitles text scale (string)
+#key-subtitle-text-scale-normal=Ctrl+0
+
+# Scale down subtitles text (string)
+#global-key-subtitle-text-scale-up=
+
+# Scale down subtitles text (string)
+#key-subtitle-text-scale-up=Ctrl+Mouse Wheel Up
+
+# Scale up subtitles text (string)
+#global-key-subtitle-text-scale-down=
+
+# Scale up subtitles text (string)
+#key-subtitle-text-scale-down=Ctrl+Mouse Wheel Down
+
+# Playlist bookmark 1 (string)
+#bookmark1=
+
+# Playlist bookmark 2 (string)
+#bookmark2=
+
+# Playlist bookmark 3 (string)
+#bookmark3=
+
+# Playlist bookmark 4 (string)
+#bookmark4=
+
+# Playlist bookmark 5 (string)
+#bookmark5=
+
+# Playlist bookmark 6 (string)
+#bookmark6=
+
+# Playlist bookmark 7 (string)
+#bookmark7=
+
+# Playlist bookmark 8 (string)
+#bookmark8=
+
+# Playlist bookmark 9 (string)
+#bookmark9=
+
+# Playlist bookmark 10 (string)
+#bookmark10=
+
diff --git a/wall.png b/wall.png
Binary files differ.
diff --git a/wget/wgetrc b/wget/wgetrc
@@ -0,0 +1 @@
+hsts-file=~/.cache/wget-hsts
diff --git a/xprofile b/xprofile
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+# Fix Gnome Apps Slow Start due to failing services
+# Add this when you include flatpak in your system
+dbus-update-activation-environment --systemd DBUS_SESSION_BUS_ADDRESS DISPLAY XAUTHORITY
+
+mpd &
+remaps &
+sxhkd &
+setbg &
+xcompmgr &
+dunst &
+xset r rate 300 50 &
+unclutter &
diff --git a/xterm/selenized-black.xdefaults b/xterm/selenized-black.xdefaults
@@ -0,0 +1,24 @@
+! Selenized black color palette for xterm.
+
+xterm*background: rgb:18/18/18
+xterm*foreground: rgb:b9/b9/b9
+
+! normal colors: "black", red, green, yellow, blue, magenta, cyan, "white"
+xterm*color0: rgb:25/25/25
+xterm*color1: rgb:ed/4a/46
+xterm*color2: rgb:70/b4/33
+xterm*color3: rgb:db/b3/2d
+xterm*color4: rgb:36/8a/eb
+xterm*color5: rgb:eb/6e/b7
+xterm*color6: rgb:3f/c5/b7
+xterm*color7: rgb:77/77/77
+
+! bright/bold versions of colors (in the same order)
+xterm*color8: rgb:3b/3b/3b
+xterm*color9: rgb:ff/5e/56
+xterm*color10: rgb:83/c7/46
+xterm*color11: rgb:ef/c5/41
+xterm*color12: rgb:4f/9c/fe
+xterm*color13: rgb:ff/81/ca
+xterm*color14: rgb:56/d8/c9
+xterm*color15: rgb:de/de/de
diff --git a/youtube-dl/config b/youtube-dl/config
@@ -0,0 +1,8 @@
+-o ~/vids/%(title)s.%(ext)s
+--restrict-filenames
+--external-downloader aria2c
+--external-downloader-args '-c -j 3 -x 3 -s 3 -k 1M'
+--add-metadata --all-subs --embed-subs --embed-thumbnail
+--merge-output-format mkv
+--write-info-json
+-i
diff --git a/zathura/zathurarc b/zathura/zathurarc
@@ -0,0 +1,12 @@
+set statusbar-h-padding 0
+set statusbar-v-padding 0
+set page-padding 1
+map u scroll half-up
+map d scroll half-down
+map D toggle_page_mode
+map r reload
+map R rotate
+map K zoom in
+map J zoom out
+map i recolor
+map p print
diff --git a/zsh/.zcompdump b/zsh/.zcompdump
@@ -0,0 +1,1968 @@
+#files: 927 version: 5.8
+
+_comps=(
+'-' '_precommand'
+'-*-' '_bootctl'
+'.' '_source'
+'5g' '_go'
+'5l' '_go'
+'6g' '_go'
+'6l' '_go'
+'8g' '_go'
+'8l' '_go'
+'a2ps' '_a2ps'
+'aaaa' '_hosts'
+'aap' '_aap'
+'abcde' '_abcde'
+'ack' '_ack'
+'ack2' '_ack'
+'ack-grep' '_ack'
+'ack-standalone' '_ack'
+'acpi' '_acpi'
+'acpitool' '_acpitool'
+'acroread' '_acroread'
+'adb' '_adb'
+'add-zle-hook-widget' '_add-zle-hook-widget'
+'add-zsh-hook' '_add-zsh-hook'
+'admin' '_sccs'
+'afew' '_afew'
+'ag' '_the_silver_searcher'
+'ali' '_mh'
+'alias' '_alias'
+'amaya' '_webbrowser'
+'analyseplugin' '_analyseplugin'
+'android' '_android'
+'animate' '_imagemagick'
+'anno' '_mh'
+'ansible' '_ansible'
+'ansible-config' '_ansible'
+'ansible-console' '_ansible'
+'ansible-doc' '_ansible'
+'ansible-galaxy' '_ansible'
+'ansible-inventory' '_ansible'
+'ansible-playbook' '_ansible'
+'ansible-pull' '_ansible'
+'ansible-vault' '_ansible'
+'ant' '_ant'
+'antiword' '_antiword'
+'aodh' '_openstack'
+'aoss' '_precommand'
+'apache2ctl' '_apachectl'
+'apachectl' '_apachectl'
+'aplay' '_alsa-utils'
+'apm' '_apm'
+'appletviewer' '_java'
+'apropos' '_man'
+'apvlv' '_pdf'
+'archlinux-java' '_archlinux-java'
+'arecord' '_alsa-utils'
+'arena' '_webbrowser'
+'arp' '_arp'
+'arping' '_arping'
+'-array-value-' '_value'
+'artisan' '_artisan'
+'asciidoctor' '_asciidoctor'
+'asciinema' '_asciinema'
+'ash' '_sh'
+'-assign-parameter-' '_assign'
+'at' '_at'
+'atach' '_atach'
+'atq' '_at'
+'atrm' '_at'
+'attr' '_attr'
+'augtool' '_augeas'
+'autoload' '_typeset'
+'avahi-browse' '_avahi'
+'avahi-browse-domains' '_avahi'
+'avahi-resolve' '_avahi'
+'avahi-resolve-address' '_avahi'
+'avahi-resolve-host-name' '_avahi'
+'awk' '_awk'
+'b2sum' '_md5sum'
+'barbican' '_openstack'
+'base32' '_base64'
+'base64' '_base64'
+'basename' '_basename'
+'bash' '_bash'
+'batch' '_at'
+'baz' '_baz'
+'beep' '_beep'
+'bg' '_jobs_bg'
+'bibtex' '_bibtex'
+'bindkey' '_bindkey'
+'bison' '_bison'
+'bitcoin-cli' '_bitcoin-cli'
+'bmake' '_make'
+'bogofilter' '_bogofilter'
+'bogotune' '_bogofilter'
+'bogoutil' '_bogofilter'
+'bootctl' '_bootctl'
+'bower' '_bower'
+'bpython' '_bpython'
+'bpython2' '_bpython'
+'bpython2-gtk' '_bpython'
+'bpython2-urwid' '_bpython'
+'bpython3' '_bpython'
+'bpython3-gtk' '_bpython'
+'bpython3-urwid' '_bpython'
+'bpython-gtk' '_bpython'
+'bpython-urwid' '_bpython'
+'-brace-parameter-' '_brace_parameter'
+'brctl' '_brctl'
+'bsdgrep' '_grep'
+'bsdtar' '_tar'
+'bspc' '_bspc'
+'btdownloadcurses' '_bittorrent'
+'btdownloadgui' '_bittorrent'
+'btdownloadheadless' '_bittorrent'
+'btlaunchmany' '_bittorrent'
+'btlaunchmanycurses' '_bittorrent'
+'btmakemetafile' '_bittorrent'
+'btreannounce' '_bittorrent'
+'btrename' '_bittorrent'
+'btrfs' '_btrfs'
+'btshowmetainfo' '_bittorrent'
+'bttrack' '_bittorrent'
+'buildhash' '_ispell'
+'builtin' '_builtin'
+'bundle' '_bundle'
+'bunzip2' '_bzip2'
+'burst' '_mh'
+'busctl' '_busctl'
+'bzcat' '_bzip2'
+'bzegrep' '_grep'
+'bzfgrep' '_grep'
+'bzgrep' '_grep'
+'bzip2' '_bzip2'
+'bzip2recover' '_bzip2'
+'bzr' '_bzr'
+'c++' '_gcc'
+'cabal' '_cabal'
+'caffeinate' '_caffeinate'
+'cal' '_cal'
+'calendar' '_calendar'
+'cap' '_cap'
+'cask' '_cask'
+'cat' '_cat'
+'catchsegv' '_precommand'
+'cc' '_gcc'
+'ccache' '_ccache'
+'ccal' '_ccal'
+'cd' '_cd'
+'cdc' '_sccs'
+'cdcd' '_cdcd'
+'cdr' '_cdr'
+'cdrdao' '_cdrdao'
+'cdrecord' '_cdrecord'
+'ceilometer' '_openstack'
+'certtool' '_gnutls'
+'cf' '_cf'
+'cftp' '_twisted'
+'chage' '_users'
+'chattr' '_chattr'
+'chcon' '_chcon'
+'chdir' '_cd'
+'cheat' '_cheat'
+'chfn' '_users'
+'chgrp' '_chown'
+'chimera' '_webbrowser'
+'chkconfig' '_chkconfig'
+'chkstow' '_stow'
+'chmod' '_chmod'
+'choc' '_choc'
+'chown' '_chown'
+'chpass' '_chsh'
+'chromium' '_chromium'
+'chroot' '_chroot'
+'chrt' '_chrt'
+'chsh' '_chsh'
+'ci' '_rcs'
+'cifsiostat' '_sysstat'
+'cinder' '_openstack'
+'ckeygen' '_twisted'
+'cksum' '_cksum'
+'clang' '_gcc'
+'clang++' '_gcc'
+'clay' '_clay'
+'clear' '_nothing'
+'cloudkitty' '_openstack'
+'clusterdb' '_postgresql'
+'cmake' '_cmake'
+'cmp' '_cmp'
+'co' '_rcs'
+'code' '_code'
+'coffee' '_coffee'
+'column' '_column'
+'comb' '_sccs'
+'combine' '_imagemagick'
+'combinediff' '_patchutils'
+'comm' '_comm'
+'-command-' '_autocd'
+'command' '_command'
+'-command-line-' '_normal'
+'comp' '_mh'
+'compadd' '_compadd'
+'compdef' '_compdef'
+'composer' '_composer'
+'composite' '_imagemagick'
+'compress' '_compress'
+'conan' '_conan'
+'conch' '_twisted'
+'concourse' '_concourse'
+'-condition-' '_condition'
+'config.status' '_configure'
+'configure' '_configure'
+'console' '_console'
+'convert' '_imagemagick'
+'coredumpctl' '_coredumpctl'
+'cowsay' '_cowsay'
+'cowthink' '_cowsay'
+'cp' '_cp'
+'cpio' '_cpio'
+'cplay' '_cplay'
+'cppcheck' '_cppcheck'
+'cpupower' '_cpupower'
+'createdb' '_pgsql_utils'
+'createuser' '_pgsql_utils'
+'crontab' '_crontab'
+'crsh' '_cssh'
+'cryptsetup' '_cryptsetup'
+'cscope' '_cscope'
+'csh' '_sh'
+'cssh' '_cssh'
+'curl' '_curl'
+'cut' '_cut'
+'cvs' '_cvs'
+'dad' '_dad'
+'darcs' '_darcs'
+'dash' '_sh'
+'date' '_date'
+'dbus-launch' '_dbus'
+'dbus-monitor' '_dbus'
+'dbus-send' '_dbus'
+'dconf' '_dconf'
+'dcop' '_dcop'
+'dcopclient' '_dcop'
+'dcopfind' '_dcop'
+'dcopobject' '_dcop'
+'dcopref' '_dcop'
+'dcopstart' '_dcop'
+'dd' '_dd'
+'debuild' '_debuild'
+'declare' '_typeset'
+'-default-' '_default'
+'delta' '_sccs'
+'designate' '_openstack'
+'devtodo' '_devtodo'
+'df' '_df'
+'dget' '_dget'
+'dhclient' '_dhclient'
+'dhclient3' '_dhclient'
+'dhcpcd' '_dhcpcd'
+'diana' '_diana'
+'dict' '_dict'
+'diff' '_diff'
+'diff3' '_diff3'
+'diffstat' '_diffstat'
+'dig' '_dig'
+'dillo' '_webbrowser'
+'dircmp' '_directories'
+'dirs' '_dirs'
+'disable' '_disable'
+'disown' '_jobs_fg'
+'display' '_imagemagick'
+'dist' '_mh'
+'django-admin' '_django'
+'django-admin.py' '_django'
+'dkms' '_dkms'
+'dmake' '_make'
+'dmesg' '_dmesg'
+'dmidecode' '_dmidecode'
+'doas' '_doas'
+'docpad' '_docpad'
+'domainname' '_yp'
+'dos2unix' '_dos2unix'
+'drill' '_drill'
+'dropdb' '_pgsql_utils'
+'dropuser' '_pgsql_utils'
+'drush' '_drush'
+'dsh' '_dsh'
+'dtruss' '_dtruss'
+'du' '_du'
+'dvibook' '_dvi'
+'dviconcat' '_dvi'
+'dvicopy' '_dvi'
+'dvidvi' '_dvi'
+'dvipdf' '_dvi'
+'dvips' '_dvi'
+'dviselect' '_dvi'
+'dvitodvi' '_dvi'
+'dvitype' '_dvi'
+'dwb' '_webbrowser'
+'e2label' '_e2label'
+'eatmydata' '_precommand'
+'ecasound' '_ecasound'
+'ecdsautil' '_ecdsautil'
+'echotc' '_echotc'
+'echoti' '_echoti'
+'ed' '_ed'
+'egrep' '_grep'
+'elfdump' '_elfdump'
+'elinks' '_elinks'
+'emulate' '_emulate'
+'emulator' '_emulator'
+'enable' '_enable'
+'enscript' '_enscript'
+'entr' '_entr'
+'env' '_env'
+'envdir' '_envdir'
+'eog' '_eog'
+'epdfview' '_pdf'
+'epsffit' '_psutils'
+'-equal-' '_equal'
+'erb' '_ruby'
+'espeak' '_espeak'
+'etags' '_etags'
+'ethtool' '_ethtool'
+'eu-nm' '_nm'
+'eu-objdump' '_objdump'
+'eu-readelf' '_readelf'
+'eu-strings' '_strings'
+'eval' '_precommand'
+'eview' '_vim'
+'evim' '_vim'
+'evince' '_evince'
+'exec' '_exec'
+'expand' '_unexpand'
+'export' '_typeset'
+'exportfs' '_exportfs'
+'express' '_webbrowser'
+'extcheck' '_java'
+'extractres' '_psutils'
+'fab' '_fab'
+'fail2ban-client' '_fail2ban-client'
+'fakeroot' '_fakeroot'
+'false' '_nothing'
+'fc' '_fc'
+'fc-list' '_xft_fonts'
+'fc-match' '_xft_fonts'
+'feh' '_feh'
+'fetchmail' '_fetchmail'
+'ffind' '_ffind'
+'ffmpeg' '_ffmpeg'
+'fg' '_jobs_fg'
+'fgrep' '_grep'
+'figlet' '_figlet'
+'filterdiff' '_patchutils'
+'find' '_find'
+'findaffix' '_ispell'
+'findmnt' '_findmnt'
+'finger' '_finger'
+'firefox' '_mozilla'
+'-first-' '_first'
+'fixdlsrps' '_psutils'
+'fixfmps' '_psutils'
+'fixmacps' '_psutils'
+'fixpsditps' '_psutils'
+'fixpspps' '_psutils'
+'fixscribeps' '_psutils'
+'fixtpps' '_psutils'
+'fixwfwps' '_psutils'
+'fixwpps' '_psutils'
+'fixwwps' '_psutils'
+'flac' '_flac'
+'flameshot' '_flameshot'
+'fleetctl' '_fleetctl'
+'flex' '_flex'
+'flex++' '_flex'
+'flipdiff' '_patchutils'
+'flist' '_mh'
+'flists' '_mh'
+'float' '_typeset'
+'flutter' '_flutter'
+'fly' '_concourse'
+'fmt' '_fmt'
+'fmttest' '_mh'
+'fned' '_zed'
+'fnext' '_mh'
+'fold' '_fold'
+'folder' '_mh'
+'folders' '_mh'
+'force' '_force'
+'fortune' '_fortune'
+'forw' '_mh'
+'fprev' '_mh'
+'free' '_free'
+'freebsd-make' '_make'
+'freezer' '_openstack'
+'fsh' '_fsh'
+'ftp' '_hosts'
+'functions' '_typeset'
+'fuser' '_fuser'
+'fusermount' '_fusermount'
+'fwhois' '_whois'
+'fwupdmgr' '_fwupdmgr'
+'g++' '_gcc'
+'galeon' '_webbrowser'
+'gas' '_gas'
+'gawk' '_awk'
+'gb2sum' '_md5sum'
+'gbase32' '_base64'
+'gbase64' '_base64'
+'gbasename' '_basename'
+'gcat' '_cat'
+'gcc' '_gcc'
+'gccgo' '_go'
+'gchgrp' '_chown'
+'gchmod' '_chmod'
+'gchown' '_chown'
+'gchroot' '_chroot'
+'gcksum' '_cksum'
+'gcmp' '_cmp'
+'gcomm' '_comm'
+'gcore' '_gcore'
+'gcp' '_cp'
+'gcut' '_cut'
+'gdate' '_date'
+'gdb' '_gdb'
+'gdd' '_dd'
+'gdf' '_df'
+'gdiff' '_diff'
+'gdu' '_du'
+'geany' '_geany'
+'gegrep' '_grep'
+'gem' '_gem'
+'genisoimage' '_genisoimage'
+'genv' '_env'
+'get' '_sccs'
+'getafm' '_psutils'
+'getconf' '_getconf'
+'getent' '_getent'
+'getfacl' '_getfacl'
+'getfacl.exe' '_getfacl'
+'getfattr' '_attr'
+'getmail' '_getmail'
+'getopt' '_getopt'
+'getopts' '_vars'
+'gex' '_vim'
+'gexpand' '_unexpand'
+'gfgrep' '_grep'
+'gfind' '_find'
+'gfmt' '_fmt'
+'gfold' '_fold'
+'ggetopt' '_getopt'
+'ggrep' '_grep'
+'ggv' '_gnome-gv'
+'ghc' '_ghc'
+'ghci' '_ghc'
+'ghc-pkg' '_ghc'
+'ghead' '_head'
+'ghostscript' '_ghostscript'
+'ghostview' '_pspdf'
+'gid' '_id'
+'ginstall' '_install'
+'gist' '_gist'
+'git' '_git'
+'git-cvsserver' '_git'
+'git-flow' '_git-flow'
+'git-journal' '_git-journal'
+'gitk' '_git'
+'git-pulls' '_git-pulls'
+'git-receive-pack' '_git'
+'git-revise' '_git-revise'
+'git-shell' '_git'
+'git-upload-archive' '_git'
+'git-upload-pack' '_git'
+'git-wtf' '_git-wtf'
+'gjoin' '_join'
+'glance' '_openstack'
+'glances' '_glances'
+'gln' '_ln'
+'global' '_global'
+'glocate' '_locate'
+'gls' '_ls'
+'gm' '_graphicsmagick'
+'gmake' '_make'
+'gmd5sum' '_md5sum'
+'gmkdir' '_mkdir'
+'gmkfifo' '_mkfifo'
+'gmknod' '_mknod'
+'gmktemp' '_mktemp'
+'gmplayer' '_mplayer'
+'gmv' '_mv'
+'gnl' '_nl'
+'gnocchi' '_openstack'
+'gnome-gv' '_gnome-gv'
+'gnumfmt' '_numfmt'
+'gnupod_addsong' '_gnupod'
+'gnupod_addsong.pl' '_gnupod'
+'gnupod_check' '_gnupod'
+'gnupod_check.pl' '_gnupod'
+'gnupod_INIT' '_gnupod'
+'gnupod_INIT.pl' '_gnupod'
+'gnupod_search' '_gnupod'
+'gnupod_search.pl' '_gnupod'
+'gnutls-cli' '_gnutls'
+'gnutls-cli-debug' '_gnutls'
+'gnutls-serv' '_gnutls'
+'go' '_golang'
+'god' '_od'
+'gofmt' '_go'
+'google' '_google'
+'gpasswd' '_gpasswd'
+'gpaste' '_paste'
+'gpatch' '_patch'
+'gpg' '_gpg'
+'gpg2' '_gpg'
+'gpgv' '_gpg'
+'gpg-zip' '_gpg'
+'gphoto2' '_gphoto2'
+'gprintenv' '_printenv'
+'gprof' '_gprof'
+'gqview' '_gqview'
+'gradle' '_gradle'
+'gradlew' '_gradle'
+'grail' '_webbrowser'
+'greadlink' '_readlink'
+'grep' '_grep'
+'grepdiff' '_patchutils'
+'grm' '_rm'
+'grmdir' '_rmdir'
+'groff' '_groff'
+'groupadd' '_user_admin'
+'groupdel' '_groups'
+'groupmod' '_user_admin'
+'groups' '_users'
+'growisofs' '_growisofs'
+'gs' '_ghostscript'
+'gsbj' '_pspdf'
+'gsdj' '_pspdf'
+'gsdj500' '_pspdf'
+'gsed' '_sed'
+'gseq' '_seq'
+'gsettings' '_gsettings'
+'gsha1sum' '_md5sum'
+'gsha224sum' '_md5sum'
+'gsha256sum' '_md5sum'
+'gsha384sum' '_md5sum'
+'gsha512sum' '_md5sum'
+'gshred' '_shred'
+'gshuf' '_shuf'
+'gslj' '_pspdf'
+'gslp' '_pspdf'
+'gsnd' '_pspdf'
+'gsort' '_sort'
+'gsplit' '_split'
+'gstat' '_stat'
+'gstdbuf' '_stdbuf'
+'gstrings' '_strings'
+'gstty' '_stty'
+'gsum' '_cksum'
+'gtac' '_tac'
+'gtail' '_tail'
+'gtar' '_tar'
+'gtee' '_tee'
+'gtimeout' '_timeout'
+'gtk-launch' '_gtk-launch'
+'gtouch' '_touch'
+'gtr' '_tr'
+'gtty' '_tty'
+'guilt' '_guilt'
+'guilt-add' '_guilt'
+'guilt-applied' '_guilt'
+'guilt-delete' '_guilt'
+'guilt-files' '_guilt'
+'guilt-fold' '_guilt'
+'guilt-fork' '_guilt'
+'guilt-header' '_guilt'
+'guilt-help' '_guilt'
+'guilt-import' '_guilt'
+'guilt-import-commit' '_guilt'
+'guilt-init' '_guilt'
+'guilt-new' '_guilt'
+'guilt-next' '_guilt'
+'guilt-patchbomb' '_guilt'
+'guilt-pop' '_guilt'
+'guilt-prev' '_guilt'
+'guilt-push' '_guilt'
+'guilt-rebase' '_guilt'
+'guilt-refresh' '_guilt'
+'guilt-rm' '_guilt'
+'guilt-series' '_guilt'
+'guilt-status' '_guilt'
+'guilt-top' '_guilt'
+'guilt-unapplied' '_guilt'
+'guname' '_uname'
+'gunexpand' '_unexpand'
+'guniq' '_uniq'
+'gunzip' '_gzip'
+'guptime' '_uptime'
+'gv' '_gv'
+'gview' '_vim'
+'gvim' '_vim'
+'gvimdiff' '_vim'
+'gwc' '_wc'
+'gwho' '_who'
+'gxargs' '_xargs'
+'gzcat' '_gzip'
+'gzegrep' '_grep'
+'gzfgrep' '_grep'
+'gzgrep' '_grep'
+'gzilla' '_webbrowser'
+'gzip' '_gzip'
+'hash' '_hash'
+'hd' '_hexdump'
+'head' '_head'
+'heat' '_openstack'
+'help' '_sccs'
+'hexdump' '_hexdump'
+'hilite' '_precommand'
+'history' '_fc'
+'hledger' '_hledger'
+'homestead' '_homestead'
+'host' '_host'
+'hostname' '_hostname'
+'hostnamectl' '_hostnamectl'
+'hotjava' '_webbrowser'
+'htop' '_htop'
+'http' '_httpie'
+'ibus' '_ibus'
+'iceweasel' '_mozilla'
+'icombine' '_ispell'
+'iconv' '_iconv'
+'iconvconfig' '_iconvconfig'
+'id' '_id'
+'identify' '_imagemagick'
+'ifconfig' '_ifconfig'
+'ifdown' '_net_interfaces'
+'iftop' '_iftop'
+'ifup' '_net_interfaces'
+'ijoin' '_ispell'
+'import' '_imagemagick'
+'inc' '_mh'
+'includeres' '_psutils'
+'include-what-you-use' '_include-what-you-use'
+'info' '_texinfo'
+'infocmp' '_terminals'
+'initctl' '_initctl'
+'initdb' '_pgsql_utils'
+'insmod' '_modutils'
+'install' '_install'
+'install-info' '_texinfo'
+'integer' '_typeset'
+'interdiff' '_patchutils'
+'inxi' '_inxi'
+'ionice' '_ionice'
+'iostat' '_iostat'
+'ip' '_ip'
+'ip6tables' '_iptables'
+'ip6tables-restore' '_iptables'
+'ip6tables-save' '_iptables'
+'ipkg' '_opkg'
+'ipsec' '_ipsec'
+'ipset' '_ipset'
+'iptables' '_iptables'
+'iptables-restore' '_iptables'
+'iptables-save' '_iptables'
+'irb' '_ruby'
+'ironic' '_openstack'
+'irssi' '_irssi'
+'isag' '_sysstat'
+'ispell' '_ispell'
+'iwconfig' '_iwconfig'
+'jadetex' '_tex'
+'jar' '_java'
+'jarsigner' '_java'
+'java' '_java'
+'javac' '_java'
+'javadoc' '_java'
+'javah' '_java'
+'javap' '_java'
+'jdb' '_java'
+'jmeter' '_jmeter'
+'jmeter-plugins' '_jmeter-plugins'
+'jobs' '_jobs_builtin'
+'joe' '_joe'
+'join' '_join'
+'jonas' '_jonas'
+'journalctl' '_journalctl'
+'jq' '_jq'
+'jrnl' '_jrnl'
+'kak' '_kak'
+'kdeconnect-cli' '_kdeconnect'
+'kernel-install' '_kernel-install'
+'keystone' '_openstack'
+'keytool' '_java'
+'kfmclient' '_kfmclient'
+'kill' '_kill'
+'killall' '_killall'
+'killall5' '_killall'
+'kioclient' '_kfmclient'
+'kitchen' '_kitchen'
+'knife' '_knife'
+'knock' '_knock'
+'konqueror' '_webbrowser'
+'kpartx' '_kpartx'
+'kpdf' '_pdf'
+'ksh' '_sh'
+'ksh88' '_sh'
+'ksh93' '_sh'
+'kvno' '_kvno'
+'last' '_last'
+'lastb' '_last'
+'latex' '_tex'
+'latexmk' '_tex'
+'ldconfig' '_ldconfig'
+'ldconfig.real' '_ldconfig'
+'ldd' '_ldd'
+'less' '_less'
+'let' '_math'
+'lftp' '_ncftp'
+'lha' '_lha'
+'libinput' '_libinput'
+'light' '_webbrowser'
+'limit' '_limit'
+'links' '_links'
+'links2' '_links'
+'linux' '_uml'
+'lldb' '_lldb'
+'llvm-g++' '_gcc'
+'llvm-gcc' '_gcc'
+'llvm-objdump' '_objdump'
+'ln' '_ln'
+'loadkeys' '_loadkeys'
+'local' '_typeset'
+'locale' '_locale'
+'localectl' '_localectl'
+'localedef' '_localedef'
+'locate' '_locate'
+'log' '_nothing'
+'loginctl' '_loginctl'
+'logname' '_nothing'
+'look' '_look'
+'losetup' '_losetup'
+'lp' '_lp'
+'lpadmin' '_lp'
+'lpinfo' '_lp'
+'lpoptions' '_lp'
+'lpq' '_lp'
+'lpr' '_lp'
+'lprm' '_lp'
+'lpstat' '_lp'
+'ls' '_ls'
+'lsattr' '_lsattr'
+'lsblk' '_lsblk'
+'lsdiff' '_patchutils'
+'lsinitcpio' '_mkinitcpio'
+'lsmod' '_modutils'
+'lsof' '_lsof'
+'lsusb' '_lsusb'
+'ltrace' '_ltrace'
+'lua' '_lua'
+'luarocks' '_luarocks'
+'lunchy' '_lunchy'
+'lynx' '_lynx'
+'lz4' '_lz4'
+'lz4c' '_lz4'
+'lz4c32' '_lz4'
+'lz4cat' '_lz4'
+'lzcat' '_xz'
+'lzma' '_xz'
+'lzop' '_lzop'
+'mac2unix' '_dos2unix'
+'machinectl' '_machinectl'
+'magnum' '_openstack'
+'mail' '_mail'
+'Mail' '_mail'
+'mailx' '_mail'
+'make' '_make'
+'makeinfo' '_texinfo'
+'makepkg' '_pacman'
+'man' '_man'
+'manage.py' '_django'
+'manila' '_openstack'
+'mark' '_mh'
+'-math-' '_math'
+'matlab' '_matlab'
+'mattrib' '_mtools'
+'mc' '_mc'
+'mcd' '_mtools'
+'mcopy' '_mtools'
+'md2' '_cksum'
+'md4' '_cksum'
+'md5' '_cksum'
+'md5sum' '_md5sum'
+'mdadm' '_mdadm'
+'mdel' '_mtools'
+'mdeltree' '_mtools'
+'mdir' '_mtools'
+'mdu' '_mtools'
+'mencal' '_mencal'
+'mere' '_mere'
+'merge' '_rcs'
+'metaflac' '_flac'
+'mformat' '_mtools'
+'mgv' '_pspdf'
+'mhfixmsg' '_mh'
+'mhlist' '_mh'
+'mhmail' '_mh'
+'mhn' '_mh'
+'mhparam' '_mh'
+'mhpath' '_mh'
+'mhshow' '_mh'
+'mhstore' '_mh'
+'middleman' '_middleman'
+'mii-tool' '_mii-tool'
+'mina' '_mina'
+'mistral' '_openstack'
+'mix' '_mix'
+'mkdir' '_mkdir'
+'mkfifo' '_mkfifo'
+'mkinitcpio' '_mkinitcpio'
+'mkisofs' '_growisofs'
+'mknod' '_mknod'
+'mksh' '_sh'
+'mktemp' '_mktemp'
+'mktunes' '_gnupod'
+'mktunes.pl' '_gnupod'
+'mlabel' '_mtools'
+'mlocate' '_locate'
+'mmd' '_mtools'
+'mmm' '_webbrowser'
+'mmount' '_mtools'
+'mmove' '_mtools'
+'modinfo' '_modutils'
+'modprobe' '_modutils'
+'module' '_module'
+'mogrify' '_imagemagick'
+'monasca' '_openstack'
+'mondoarchive' '_mondo'
+'montage' '_imagemagick'
+'moosic' '_moosic'
+'Mosaic' '_webbrowser'
+'mosh' '_mosh'
+'mount' '_mount'
+'mozilla' '_mozilla'
+'mozilla-firefox' '_mozilla'
+'mozilla-xremote-client' '_mozilla'
+'mpc' '_mpc'
+'mplayer' '_mplayer'
+'mpstat' '_sysstat'
+'mpv' '_mpv'
+'mr' '_myrepos'
+'mrd' '_mtools'
+'mread' '_mtools'
+'mren' '_mtools'
+'msgchk' '_mh'
+'mt' '_mt'
+'mtn' '_monotone'
+'mtoolstest' '_mtools'
+'mtr' '_mtr'
+'mtype' '_mtools'
+'munchlist' '_ispell'
+'mupdf' '_mupdf'
+'murano' '_openstack'
+'mush' '_mail'
+'mussh' '_mussh'
+'mutt' '_mutt'
+'mux' '_tmuxinator'
+'mv' '_mv'
+'mvim' '_vim'
+'mvn' '_mvn'
+'mvnDebug' '_mvn'
+'mx' '_hosts'
+'mysql' '_mysql_utils'
+'mysqladmin' '_mysql_utils'
+'mysqldiff' '_mysqldiff'
+'mysqldump' '_mysql_utils'
+'mysqlimport' '_mysql_utils'
+'mysqlshow' '_mysql_utils'
+'nail' '_mail'
+'nano' '_nano'
+'native2ascii' '_java'
+'nautilus' '_nautilus'
+'nawk' '_awk'
+'nc' '_netcat'
+'ncal' '_cal'
+'ncftp' '_ncftp'
+'ncl' '_nedit'
+'nedit' '_nedit'
+'nedit-nc' '_nedit'
+'netcat' '_netcat'
+'netrik' '_webbrowser'
+'netscape' '_netscape'
+'netstat' '_netstat'
+'networkctl' '_networkctl'
+'neutron' '_openstack'
+'new' '_mh'
+'newgrp' '_groups'
+'next' '_mh'
+'nft' '_nftables'
+'nginx' '_nginx'
+'ngrep' '_ngrep'
+'nice' '_nice'
+'nkf' '_nkf'
+'nl' '_nl'
+'nm' '_nm'
+'nmap' '_nmap'
+'nmblookup' '_samba'
+'nmcli' '_networkmanager'
+'nnn' '_nnn'
+'nocorrect' '_precommand'
+'node' '_node'
+'noglob' '_precommand'
+'nohup' '_precommand'
+'notmuch' '_notmuch'
+'nova' '_openstack'
+'npm' '_npm'
+'ns' '_hosts'
+'nslookup' '_nslookup'
+'ntalk' '_other_accounts'
+'numfmt' '_numfmt'
+'nvim' '_vim'
+'nvm' '_nvm'
+'objdump' '_objdump'
+'od' '_od'
+'ogg123' '_vorbis'
+'oggdec' '_vorbis'
+'oggenc' '_vorbis'
+'ogginfo' '_vorbis'
+'oksh' '_sh'
+'okular' '_okular'
+'openssl' '_openssl'
+'openstack' '_openstack'
+'opera' '_webbrowser'
+'opera-next' '_webbrowser'
+'opkg' '_opkg'
+'optirun' '_optirun'
+'p4' '_perforce'
+'p4d' '_perforce'
+'pacat' '_pulseaudio'
+'pack' '_pack'
+'packf' '_mh'
+'pacman' '_pacman'
+'pacman-key' '_pacman'
+'pacman.static' '_pacman'
+'pacmd' '_pulseaudio'
+'pactl' '_pulseaudio'
+'padsp' '_pulseaudio'
+'pandoc' '_pandoc'
+'paplay' '_pulseaudio'
+'-parameter-' '_parameter'
+'parec' '_pulseaudio'
+'parecord' '_pulseaudio'
+'pass' '_pass'
+'passwd' '_users'
+'paste' '_paste'
+'pasuspender' '_pulseaudio'
+'patch' '_patch'
+'patool' '_patool'
+'pax' '_pax'
+'pcat' '_pack'
+'pcred' '_pids'
+'pdf2dsc' '_pdf'
+'pdf2ps' '_pdf'
+'pdffonts' '_pdf'
+'pdfimages' '_pdf'
+'pdfinfo' '_pdf'
+'pdfjadetex' '_tex'
+'pdflatex' '_tex'
+'pdfopt' '_pdf'
+'pdftex' '_tex'
+'pdftexi2dvi' '_texinfo'
+'pdftk' '_pdftk'
+'pdftopbm' '_pdf'
+'pdftops' '_pdf'
+'pdftotext' '_pdf'
+'pdksh' '_sh'
+'perf' '_perf'
+'periscope' '_periscope'
+'perl' '_perl'
+'perldoc' '_perldoc'
+'pfiles' '_pids'
+'pflags' '_pids'
+'pg_config' '_postgresql'
+'pg_ctl' '_postgresql'
+'pg_dump' '_pgsql_utils'
+'pg_dumpall' '_pgsql_utils'
+'pg_isready' '_postgresql'
+'pgrep' '_pgrep'
+'pg_restore' '_pgsql_utils'
+'pg_upgrade' '_postgresql'
+'phing' '_phing'
+'php' '_php'
+'pick' '_mh'
+'picocom' '_picocom'
+'pidof' '_pidof'
+'pidstat' '_sysstat'
+'pigz' '_gzip'
+'pine' '_pine'
+'pinef' '_pine'
+'pinfo' '_texinfo'
+'ping' '_ping'
+'ping6' '_ping'
+'pixz' '_pixz'
+'pkcon' '_pkcon'
+'pkgadd' '_pkgadd'
+'pkg-config' '_pkg-config'
+'pkgfile' '_pkgfile'
+'pkginfo' '_pkginfo'
+'pkgrm' '_pkgrm'
+'pkill' '_pgrep'
+'play' '_play'
+'pldd' '_pids'
+'pm2' '_pm2'
+'pmake' '_make'
+'pman' '_perl_modules'
+'pmap' '_pmap'
+'pmcat' '_perl_modules'
+'pmdesc' '_perl_modules'
+'pmeth' '_perl_modules'
+'pmexp' '_perl_modules'
+'pmfunc' '_perl_modules'
+'pmload' '_perl_modules'
+'pmls' '_perl_modules'
+'pmpath' '_perl_modules'
+'pmvers' '_perl_modules'
+'podgrep' '_perl_modules'
+'podpath' '_perl_modules'
+'podtoc' '_perl_modules'
+'poff' '_pon'
+'policytool' '_java'
+'polybar' '_polybar'
+'polybar-msg' '_polybar_msg'
+'pon' '_pon'
+'popd' '_directory_stack'
+'port' '_port'
+'postconf' '_postfix'
+'postgres' '_postgresql'
+'postmaster' '_postgresql'
+'postqueue' '_postfix'
+'postsuper' '_postfix'
+'prev' '_mh'
+'print' '_print'
+'printenv' '_printenv'
+'printf' '_print'
+'prompt' '_prompt'
+'protoc' '_protoc'
+'prove' '_prove'
+'prs' '_sccs'
+'prt' '_sccs'
+'prun' '_pids'
+'ps' '_ps'
+'ps2ascii' '_pspdf'
+'ps2epsi' '_postscript'
+'ps2pdf' '_postscript'
+'ps2pdf12' '_postscript'
+'ps2pdf13' '_postscript'
+'ps2pdf14' '_postscript'
+'ps2pdfwr' '_postscript'
+'ps2ps' '_postscript'
+'psbook' '_psutils'
+'psed' '_sed'
+'psig' '_pids'
+'psmerge' '_psutils'
+'psmulti' '_postscript'
+'psnup' '_psutils'
+'psql' '_pgsql_utils'
+'psresize' '_psutils'
+'psselect' '_psutils'
+'pstack' '_pids'
+'pstoedit' '_pspdf'
+'pstop' '_pids'
+'pstops' '_psutils'
+'pstotgif' '_pspdf'
+'pswrap' '_postscript'
+'pulseaudio' '_pulseaudio'
+'pump' '_pump'
+'pushd' '_cd'
+'pv' '_pv'
+'pwait' '_pids'
+'pwdx' '_pids'
+'pwgen' '_pwgen'
+'pygmentize' '_pygmentize'
+'pyhtmlizer' '_twisted'
+'qdbus' '_qdbus'
+'qiv' '_qiv'
+'qpdf' '_qpdf'
+'quilt' '_quilt'
+'r' '_fc'
+'rails' '_rails'
+'rake' '_rake'
+'ralio' '_ralio'
+'ranlib' '_ranlib'
+'rar' '_rar'
+'rc' '_sh'
+'_rclone' '_rclone'
+'rclone' '_rclone'
+'rcp' '_rlogin'
+'rcs' '_rcs'
+'rcsdiff' '_rcs'
+'rdesktop' '_rdesktop'
+'read' '_read'
+'readelf' '_readelf'
+'readlink' '_readlink'
+'readonly' '_typeset'
+'rec' '_redis-cli'
+'-redirect-' '_redirect'
+'-redirect-,<,bunzip2' '_bzip2'
+'-redirect-,<,bzip2' '_bzip2'
+'-redirect-,>,bzip2' '_bzip2'
+'-redirect-,<,compress' '_compress'
+'-redirect-,>,compress' '_compress'
+'-redirect-,-default-,-default-' '_files'
+'-redirect-,<,gunzip' '_gzip'
+'-redirect-,<,gzip' '_gzip'
+'-redirect-,>,gzip' '_gzip'
+'-redirect-,<,uncompress' '_compress'
+'-redirect-,<,unxz' '_xz'
+'-redirect-,<,xz' '_xz'
+'-redirect-,>,xz' '_xz'
+'redis-cli' '_redis-cli'
+'refile' '_mh'
+'rehash' '_hash'
+'reindexdb' '_postgresql'
+'reload' '_initctl'
+'remsh' '_rlogin'
+'renice' '_renice'
+'repl' '_mh'
+'resolvectl' '_resolvectl'
+'restart' '_initctl'
+'retawq' '_webbrowser'
+'rfkill' '_rfkill'
+'rg' '_rg'
+'rgview' '_vim'
+'rgvim' '_vim'
+'ri' '_ri'
+'rkt' '_rkt'
+'rlogin' '_rlogin'
+'rm' '_rm'
+'rmd160' '_cksum'
+'rmdel' '_sccs'
+'rmdir' '_rmdir'
+'rmf' '_mh'
+'rmic' '_java'
+'rmid' '_java'
+'rmiregistry' '_java'
+'rmm' '_mh'
+'rmmod' '_modutils'
+'route' '_route'
+'rrdtool' '_rrdtool'
+'rsh' '_rlogin'
+'rslsync' '_rslsync'
+'rspec' '_rspec'
+'rsvm' '_rsvm'
+'rsync' '_rsync'
+'rtin' '_tin'
+'rubber' '_rubber'
+'rubber-info' '_rubber'
+'rubber-pipe' '_rubber'
+'rubocop' '_rubocop'
+'ruby' '_ruby'
+'ruby-mri' '_ruby'
+'run-help' '_run-help'
+'rup' '_hosts'
+'rusage' '_precommand'
+'rview' '_vim'
+'rvim' '_vim'
+'rwho' '_hosts'
+'rxvt' '_urxvt'
+'s2p' '_sed'
+'sact' '_sccs'
+'sadf' '_sysstat'
+'sahara' '_openstack'
+'sar' '_sysstat'
+'sbt' '_sbt'
+'scala' '_scala'
+'scalac' '_scala'
+'scan' '_mh'
+'sccs' '_sccs'
+'sccsdiff' '_sccs'
+'sched' '_sched'
+'schedtool' '_schedtool'
+'scons' '_scons'
+'scp' '_ssh'
+'screen' '_screen'
+'script' '_script'
+'scriptreplay' '_script'
+'scrub' '_scrub'
+'sdd' '_sdd'
+'seaf-cli' '_seafile'
+'sed' '_sed'
+'senlin' '_openstack'
+'seq' '_seq'
+'serialver' '_java'
+'service' '_service'
+'set' '_set'
+'setcap' '_setcap'
+'setfacl' '_setfacl'
+'setfacl.exe' '_setfacl'
+'setfattr' '_attr'
+'setopt' '_setopt'
+'setsid' '_setsid'
+'setup.py' '_setup.py'
+'setxkbmap' '_setxkbmap'
+'sfdx' '_sfdx'
+'sftp' '_ssh'
+'sh' '_sh'
+'sha1' '_cksum'
+'sha1sum' '_md5sum'
+'sha224sum' '_md5sum'
+'sha256' '_cksum'
+'sha256sum' '_md5sum'
+'sha384' '_cksum'
+'sha384sum' '_md5sum'
+'sha512' '_cksum'
+'sha512sum' '_md5sum'
+'sha512t256' '_cksum'
+'shasum' '_shasum'
+'shell-script' '_bootctl'
+'shift' '_arrays'
+'show' '_mh'
+'showchar' '_psutils'
+'showmount' '_showmount'
+'showoff' '_showoff'
+'shred' '_shred'
+'shuf' '_shuf'
+'shutdown' '_shutdown'
+'sisu' '_sisu'
+'skein1024' '_cksum'
+'skein256' '_cksum'
+'skein512' '_cksum'
+'skipstone' '_webbrowser'
+'slabtop' '_slabtop'
+'slitex' '_tex'
+'slocate' '_locate'
+'slogin' '_ssh'
+'slrn' '_slrn'
+'smartctl' '_smartmontools'
+'smbclient' '_samba'
+'smbcontrol' '_samba'
+'smbstatus' '_samba'
+'soa' '_hosts'
+'socket' '_socket'
+'sort' '_sort'
+'sortm' '_mh'
+'source' '_source'
+'spamassassin' '_spamassassin'
+'split' '_split'
+'splitdiff' '_patchutils'
+'sqlite' '_sqlite'
+'sqlite3' '_sqlite'
+'sqsh' '_sqsh'
+'sr' '_surfraw'
+'srm' '_srm'
+'srptool' '_gnutls'
+'ss' '_ss'
+'ssh' '_ssh'
+'ssh-add' '_ssh'
+'ssh-agent' '_ssh'
+'ssh-copy-id' '_ssh'
+'sshfs' '_sshfs'
+'ssh-keygen' '_ssh'
+'ssh-keyscan' '_ssh'
+'stack' '_stack'
+'star' '_tar'
+'start' '_initctl'
+'stat' '_stat'
+'status' '_initctl'
+'stdbuf' '_stdbuf'
+'stg' '_stgit'
+'stop' '_initctl'
+'stow' '_stow'
+'strace' '_strace'
+'strace64' '_strace'
+'strftime' '_strftime'
+'strings' '_strings'
+'strip' '_strip'
+'strongswan' '_ipsec'
+'stty' '_stty'
+'su' '_su'
+'subl' '_subl'
+'subliminal' '_subliminal'
+'-subscript-' '_subscript'
+'sudo' '_sudo'
+'sudoedit' '_sudo'
+'sum' '_cksum'
+'supervisorctl' '_supervisorctl'
+'surfraw' '_surfraw'
+'sv' '_runit'
+'svm' '_svm'
+'svn' '_subversion'
+'svnadmin' '_subversion'
+'svnadmin-static' '_subversion'
+'svnlite' '_subversion'
+'swaks' '_swaks'
+'swanctl' '_swanctl'
+'swift' '_swift'
+'swiftc' '_swift'
+'sync' '_nothing'
+'sysctl' '_sysctl'
+'systemctl' '_systemctl'
+'systemd-analyze' '_systemd-analyze'
+'systemd-ask-password' '_systemd'
+'systemd-cat' '_systemd'
+'systemd-cgls' '_systemd'
+'systemd-cgtop' '_systemd'
+'systemd-delta' '_systemd-delta'
+'systemd-detect-virt' '_systemd'
+'systemd-inhibit' '_systemd-inhibit'
+'systemd-machine-id-setup' '_systemd'
+'systemd-notify' '_systemd'
+'systemd-nspawn' '_systemd-nspawn'
+'systemd-resolve' '_resolvectl'
+'systemd-run' '_systemd-run'
+'systemd-tmpfiles' '_systemd-tmpfiles'
+'systemd-tty-ask-password-agent' '_systemd'
+'tac' '_tac'
+'tacker' '_openstack'
+'tail' '_tail'
+'talk' '_other_accounts'
+'tar' '_tar'
+'tardy' '_tardy'
+'tarsnap' '_tarsnap'
+'tcpdump' '_tcpdump'
+'tcp_open' '_tcpsys'
+'tcptraceroute' '_tcptraceroute'
+'tcsh' '_sh'
+'tda' '_devtodo'
+'tdd' '_devtodo'
+'tde' '_devtodo'
+'tdr' '_devtodo'
+'teamocil' '_teamocil'
+'tee' '_tee'
+'telnet' '_telnet'
+'tex' '_tex'
+'texi2any' '_texinfo'
+'texi2dvi' '_texinfo'
+'texi2pdf' '_texinfo'
+'texindex' '_texinfo'
+'tg' '_topgit'
+'thor' '_thor'
+'tidy' '_tidy'
+'tig' '_git'
+'-tilde-' '_tilde'
+'time' '_precommand'
+'timedatectl' '_timedatectl'
+'timeout' '_timeout'
+'times' '_nothing'
+'tin' '_tin'
+'tkconch' '_twisted'
+'tkinfo' '_texinfo'
+'tla' '_tla'
+'tload' '_tload'
+'tmux' '_tmux'
+'tmuxinator' '_tmuxinator'
+'tmuxp' '_tmuxp'
+'todo' '_devtodo'
+'todo.sh' '_todo.sh'
+'toilet' '_toilet'
+'top' '_top'
+'totdconfig' '_totd'
+'touch' '_touch'
+'tox' '_tox'
+'tpb' '_tpb'
+'tput' '_tput'
+'tr' '_tr'
+'tracepath' '_tracepath'
+'tracepath6' '_tracepath'
+'traceroute' '_hosts'
+'transmission-remote' '_transmission'
+'trap' '_trap'
+'trash' '_trash-put'
+'trash-empty' '_trash-empty'
+'trash-list' '_trash-list'
+'trash-put' '_trash-put'
+'trash-restore' '_trash-restore'
+'tree' '_tree'
+'trial' '_twisted'
+'trove' '_openstack'
+'true' '_nothing'
+'truss' '_truss'
+'tryaffix' '_ispell'
+'tty' '_tty'
+'ttyctl' '_ttyctl'
+'tunctl' '_uml'
+'tune2fs' '_tune2fs'
+'tunes2pod' '_gnupod'
+'tunes2pod.pl' '_gnupod'
+'twidge' '_twidge'
+'twist' '_twisted'
+'twistd' '_twisted'
+'txt' '_hosts'
+'type' '_which'
+'typeset' '_typeset'
+'udevadm' '_udevadm'
+'udisksctl' '_udisksctl'
+'ufw' '_ufw'
+'ulimit' '_ulimit'
+'uml_mconsole' '_uml'
+'uml_moo' '_uml'
+'uml_switch' '_uml'
+'umount' '_mount'
+'unace' '_unace'
+'unalias' '_aliases'
+'uname' '_uname'
+'uncompress' '_compress'
+'unexpand' '_unexpand'
+'unfunction' '_functions'
+'unget' '_sccs'
+'unhash' '_unhash'
+'uniq' '_uniq'
+'unison' '_unison'
+'units' '_units'
+'unix2dos' '_dos2unix'
+'unix2mac' '_dos2unix'
+'unlimit' '_limits'
+'unlz4' '_lz4'
+'unlzma' '_xz'
+'unpack' '_pack'
+'unpigz' '_gzip'
+'unrar' '_rar'
+'unset' '_vars'
+'unsetopt' '_setopt'
+'unwrapdiff' '_patchutils'
+'unxz' '_xz'
+'unzip' '_zip'
+'uptime' '_uptime'
+'urxvt' '_urxvt'
+'urxvt256c' '_urxvt'
+'urxvt256cc' '_urxvt'
+'urxvt256c-ml' '_urxvt'
+'urxvt256c-mlc' '_urxvt'
+'urxvtc' '_urxvt'
+'useradd' '_user_admin'
+'userdel' '_users'
+'usermod' '_user_admin'
+'vacuumdb' '_pgsql_utils'
+'vagrant' '_vagrant'
+'val' '_sccs'
+'valgrind' '_valgrind'
+'-value-' '_value'
+'-value-,ADB_TRACE,-default-' '_adb'
+'-value-,ANDROID_LOG_TAGS,-default-' '_adb'
+'-value-,ANDROID_SERIAL,-default-' '_adb'
+'-value-,ANSIBLE_STDOUT_CALLBACK,-default-' '_ansible'
+'-value-,ANT_ARGS,-default-' '_ant'
+'-value-,CFLAGS,-default-' '_gcc'
+'-value-,CMAKE_GENERATOR,-default-' '_cmake'
+'-value-,CPPFLAGS,-default-' '_gcc'
+'-value-,CXXFLAGS,-default-' '_gcc'
+'-value-,-default-,-command-' '_zargs'
+'-value-,-default-,-default-' '_value'
+'-value-,DISPLAY,-default-' '_x_display'
+'-value-,GREP_OPTIONS,-default-' '_grep'
+'-value-,GZIP,-default-' '_gzip'
+'-value-,LANG,-default-' '_locales'
+'-value-,LANGUAGE,-default-' '_locales'
+'-value-,LD_DEBUG,-default-' '_ld_debug'
+'-value-,LDFLAGS,-default-' '_gcc'
+'-value-,LESSCHARSET,-default-' '_less'
+'-value-,LESS,-default-' '_less'
+'-value-,LOOPDEV_DEBUG,-default-' '_losetup'
+'-value-,LPDEST,-default-' '_printers'
+'-value-,MPD_HOST,-default' '_mpc'
+'-value-,P4CLIENT,-default-' '_perforce'
+'-value-,P4MERGE,-default-' '_perforce'
+'-value-,P4PORT,-default-' '_perforce'
+'-value-,P4USER,-default-' '_perforce'
+'-value-,PERLDOC,-default-' '_perldoc'
+'-value-,PRINTER,-default-' '_printers'
+'-value-,PROMPT2,-default-' '_ps1234'
+'-value-,PROMPT3,-default-' '_ps1234'
+'-value-,PROMPT4,-default-' '_ps1234'
+'-value-,PROMPT,-default-' '_ps1234'
+'-value-,PS1,-default-' '_ps1234'
+'-value-,PS2,-default-' '_ps1234'
+'-value-,PS3,-default-' '_ps1234'
+'-value-,PS4,-default-' '_ps1234'
+'-value-,RPROMPT2,-default-' '_ps1234'
+'-value-,RPROMPT,-default-' '_ps1234'
+'-value-,RPS1,-default-' '_ps1234'
+'-value-,RPS2,-default-' '_ps1234'
+'-value-,SPROMPT,-default-' '_ps1234'
+'-value-,TERM,-default-' '_terminals'
+'-value-,TERMINFO_DIRS,-default-' '_dir_list'
+'-value-,TZ,-default-' '_time_zone'
+'-value-,VALGRIND_OPTS,-default-' '_valgrind'
+'-value-,WWW_HOME,-default-' '_urls'
+'-value-,XML_CATALOG_FILES,-default-' '_xmlsoft'
+'-value-,XZ_DEFAULTS,-default-' '_xz'
+'-value-,XZ_OPT,-default-' '_xz'
+'-vared-' '_in_vared'
+'vared' '_vared'
+'VBoxHeadless' '_virtualbox'
+'VBoxManage' '_virtualbox'
+'vcsh' '_vcsh'
+'vifm' '_vifm'
+'vim' '_vim'
+'vimdiff' '_vim'
+'virsh' '_libvirt'
+'virt-admin' '_libvirt'
+'virt-host-validate' '_libvirt'
+'virt-pki-validate' '_libvirt'
+'virt-xml-validate' '_libvirt'
+'visudo' '_visudo'
+'vitrage' '_openstack'
+'vmstat' '_vmstat'
+'vncserver' '_vnc'
+'vncviewer' '_vnc'
+'vnstat' '_vnstat'
+'vorbiscomment' '_vorbis'
+'vpnc' '_vpnc'
+'vpnc-connect' '_vpnc'
+'vserver' '_vserver'
+'w' '_w'
+'w3m' '_w3m'
+'wait' '_wait'
+'watch' '_watch'
+'watcher' '_openstack'
+'wc' '_wc'
+'wemux' '_wemux'
+'wget' '_wget'
+'wg-quick' '_wg-quick'
+'what' '_sccs'
+'whatis' '_man'
+'whence' '_which'
+'where' '_which'
+'whereis' '_whereis'
+'which' '_which'
+'who' '_who'
+'whoami' '_nothing'
+'whois' '_whois'
+'whom' '_mh'
+'wiggle' '_wiggle'
+'wipefs' '_wipefs'
+'wodim' '_cdrecord'
+'wpa_cli' '_wpa_cli'
+'write' '_users_on'
+'www' '_webbrowser'
+'xargs' '_xargs'
+'xattr' '_attr'
+'xauth' '_xauth'
+'xautolock' '_xautolock'
+'xclip' '_xclip'
+'xdpyinfo' '_x_utils'
+'xdvi' '_xdvi'
+'xelatex' '_tex'
+'xetex' '_tex'
+'xev' '_x_utils'
+'xfd' '_x_utils'
+'xfig' '_xfig'
+'xfontsel' '_x_utils'
+'xfreerdp' '_rdesktop'
+'xhost' '_x_utils'
+'xinput' '_xinput'
+'xkill' '_x_utils'
+'xli' '_xloadimage'
+'xloadimage' '_xloadimage'
+'xlsatoms' '_x_utils'
+'xlsclients' '_x_utils'
+'xml' '_xmlstarlet'
+'xmllint' '_xmlsoft'
+'xmlstarlet' '_xmlstarlet'
+'xmms2' '_xmms2'
+'xmodmap' '_xmodmap'
+'xmosaic' '_webbrowser'
+'xon' '_x_utils'
+'xournal' '_xournal'
+'xpdf' '_xpdf'
+'xping' '_hosts'
+'xprop' '_x_utils'
+'xrandr' '_xrandr'
+'xrdb' '_x_utils'
+'xscreensaver-command' '_xscreensaver'
+'xsel' '_xsel'
+'xset' '_xset'
+'xsetbg' '_xloadimage'
+'xsetroot' '_x_utils'
+'xsltproc' '_xmlsoft'
+'xterm' '_xterm'
+'xtightvncviewer' '_vnc'
+'xtp' '_imagemagick'
+'xv' '_xv'
+'xview' '_xloadimage'
+'xvnc4viewer' '_vnc'
+'xvncviewer' '_vnc'
+'xwallpaper' '_xwallpaper'
+'xwd' '_x_utils'
+'xwininfo' '_x_utils'
+'xwit' '_xwit'
+'xwud' '_x_utils'
+'xxd' '_xxd'
+'xz' '_xz'
+'xzcat' '_xz'
+'yafc' '_yafc'
+'yaourt' '_yaourt'
+'yaourt.static' '_yaourt'
+'yarn' '_yarn'
+'yash' '_sh'
+'yay' '_yay'
+'youtube-dl' '_youtube-dl'
+'ypbind' '_yp'
+'ypcat' '_yp'
+'ypmatch' '_yp'
+'yppasswd' '_yp'
+'yppoll' '_yp'
+'yppush' '_yp'
+'ypserv' '_yp'
+'ypset' '_yp'
+'ypwhich' '_yp'
+'ypxfr' '_yp'
+'ytalk' '_other_accounts'
+'zargs' '_zargs'
+'zathura' '_zathura'
+'zcalc' '_zcalc'
+'-zcalc-line-' '_zcalc_line'
+'zcash-cli' '_zcash-cli'
+'zcat' '_zcat'
+'zcompile' '_zcompile'
+'zcp' '_zmv'
+'zdelattr' '_zattr'
+'zdump' '_zdump'
+'zeal' '_zeal'
+'zed' '_zed'
+'zegrep' '_grep'
+'zen' '_webbrowser'
+'zf_chgrp' '_chown'
+'zf_chmod' '_chmod'
+'zf_chown' '_chown'
+'zfgrep' '_grep'
+'zf_ln' '_ln'
+'zf_mkdir' '_mkdir'
+'zf_mv' '_mv'
+'zf_rm' '_rm'
+'zf_rmdir' '_rmdir'
+'zfs' '_zfs'
+'zgetattr' '_zattr'
+'zgrep' '_grep'
+'zip' '_zip'
+'zipinfo' '_zip'
+'zle' '_zle'
+'zlistattr' '_zattr'
+'zln' '_zmv'
+'zmail' '_mail'
+'zmodload' '_zmodload'
+'zmv' '_zmv'
+'zone' '_hosts'
+'zparseopts' '_zparseopts'
+'zpool' '_zpool'
+'zpty' '_zpty'
+'zsetattr' '_zattr'
+'zsh' '_zsh'
+'zsh-mime-handler' '_zsh-mime-handler'
+'zsocket' '_zsocket'
+'zstat' '_stat'
+'zstyle' '_zstyle'
+'ztodo' '_ztodo'
+'zun' '_openstack'
+'zxpdf' '_xpdf'
+)
+
+_services=(
+'bzcat' 'bunzip2'
+'gchgrp' 'chgrp'
+'gchown' 'chown'
+'gnupod_addsong.pl' 'gnupod_addsong'
+'gnupod_check.pl' 'gnupod_check'
+'gnupod_INIT.pl' 'gnupod_INIT'
+'gnupod_search.pl' 'gnupod_search'
+'gpg2' 'gpg'
+'gzcat' 'gunzip'
+'iceweasel' 'firefox'
+'lzcat' 'unxz'
+'lzma' 'xz'
+'Mail' 'mail'
+'mailx' 'mail'
+'mktunes.pl' 'mktunes'
+'nail' 'mail'
+'ncl' 'nc'
+'nedit-nc' 'nc'
+'pacman.static' 'pacman'
+'pcat' 'unpack'
+'-redirect-,<,bunzip2' 'bunzip2'
+'-redirect-,<,bzip2' 'bzip2'
+'-redirect-,>,bzip2' 'bunzip2'
+'-redirect-,<,compress' 'compress'
+'-redirect-,>,compress' 'uncompress'
+'-redirect-,<,gunzip' 'gunzip'
+'-redirect-,<,gzip' 'gzip'
+'-redirect-,>,gzip' 'gunzip'
+'-redirect-,<,uncompress' 'uncompress'
+'-redirect-,<,unxz' 'unxz'
+'-redirect-,<,xz' 'xz'
+'-redirect-,>,xz' 'unxz'
+'remsh' 'rsh'
+'slogin' 'ssh'
+'svnadmin-static' 'svnadmin'
+'svnlite' 'svn'
+'tunes2pod.pl' 'tunes2pod'
+'unlzma' 'unxz'
+'VBoxHeadless' 'vboxheadless'
+'VBoxManage' 'vboxmanage'
+'xelatex' 'latex'
+'xetex' 'tex'
+'xzcat' 'unxz'
+'yaourt.static' 'yaourt'
+'zf_chgrp' 'chgrp'
+'zf_chown' 'chown'
+)
+
+_patcomps=(
+'*/(init|rc[0-9S]#).d/*' '_init_d'
+'notmuch-*' '_notmuch'
+)
+
+_postpatcomps=(
+'c++-*' '_gcc'
+'g++-*' '_gcc'
+'gcc-*' '_gcc'
+'gem[0-9.]#' '_gem'
+'lua[0-9.-]##' '_lua'
+'(p[bgpn]m*|*top[bgpn]m)' '_pbm'
+'php[0-9.-]' '_php'
+'pydoc[0-9.]#' '_pydoc'
+'python[0-9.]#' '_python'
+'qemu(|-system-*)' '_qemu'
+'(ruby|[ei]rb)[0-9.]#' '_ruby'
+'shasum(|5).*' '_shasum'
+'(texi(2*|ndex))' '_texi'
+'(tiff*|*2tiff|pal2rgb)' '_tiff'
+'-value-,CCACHE_*,-default-' '_ccache'
+'-value-,CGO*,-default-' '_golang'
+'-value-,(ftp|http(|s))_proxy,-default-' '_urls'
+'-value-,GO*,-default-' '_golang'
+'-value-,LC_*,-default-' '_locales'
+'-value-,*path,-default-' '_directories'
+'-value-,*PATH,-default-' '_dir_list'
+'-value-,RUBY(LIB|OPT|PATH),-default-' '_ruby'
+'*/X11(|R<4->)/*' '_x_arguments'
+'yodl(|2*)' '_yodl'
+'zf*' '_zftp'
+)
+
+_compautos=(
+'_call_program' '+X'
+)
+
+zle -C _bash_complete-word .complete-word _bash_completions
+zle -C _bash_list-choices .list-choices _bash_completions
+zle -C _complete_debug .complete-word _complete_debug
+zle -C _complete_help .complete-word _complete_help
+zle -C _complete_tag .complete-word _complete_tag
+zle -C _correct_filename .complete-word _correct_filename
+zle -C _correct_word .complete-word _correct_word
+zle -C _expand_alias .complete-word _expand_alias
+zle -C _expand_word .complete-word _expand_word
+zle -C _history-complete-newer .complete-word _history_complete_word
+zle -C _history-complete-older .complete-word _history_complete_word
+zle -C _list_expansions .list-choices _expand_word
+zle -C _most_recent_file .complete-word _most_recent_file
+zle -C _next_tags .list-choices _next_tags
+zle -C _read_comp .complete-word _read_comp
+bindkey '^X^R' _read_comp
+bindkey '^X?' _complete_debug
+bindkey '^XC' _correct_filename
+bindkey '^Xa' _expand_alias
+bindkey '^Xc' _correct_word
+bindkey '^Xd' _list_expansions
+bindkey '^Xe' _expand_word
+bindkey '^Xh' _complete_help
+bindkey '^Xm' _most_recent_file
+bindkey '^Xn' _next_tags
+bindkey '^Xt' _complete_tag
+bindkey '^X~' _bash_list-choices
+bindkey '^[,' _history-complete-newer
+bindkey '^[/' _history-complete-older
+bindkey '^[~' _bash_complete-word
+
+autoload -Uz _afew _android _archlinux-java _artisan _atach \
+ _bitcoin-cli _bootctl _bower _bspc _bundle \
+ _busctl _caffeinate _cap _cask _ccache \
+ _cf _cheat _choc _chromium _cmake \
+ _coffee _composer _conan _concourse _console \
+ _coredumpctl _cppcheck _curl _dad _debuild \
+ _dget _dhcpcd _diana _docpad _drush \
+ _ecdsautil _email-notmuch _emulator _envdir _exportfs \
+ _fab _fail2ban-client _ffind _flameshot _fleetctl \
+ _flutter _force _fwupdmgr _gas _ghc \
+ _gist _git-flow _git-journal _git-pulls _git-revise \
+ _git-wtf _glances _golang _google _gtk-launch \
+ _hledger _homestead _hostnamectl _httpie _ibus \
+ _include-what-you-use _inxi _jmeter _jmeter-plugins _jonas \
+ _journalctl _jrnl _kak _kernel-install _kitchen \
+ _knife _language_codes _libinput _localectl _loginctl \
+ _lunchy _machinectl _mc _middleman _mina \
+ _mix _mkinitcpio _mpv _mussh _mvn \
+ _nano _networkctl _nftables _nnn _node \
+ _notmuch _nvm _openssl _optirun _pacman \
+ _pass _patool _perf _periscope _pgsql_utils \
+ _phing _pixz _pkcon _pkgfile _play \
+ _pm2 _polybar _polybar_msg _port _protoc \
+ _pulseaudio _pygmentize _qpdf _rails _ralio \
+ _rclone _redis-cli _resolvectl _rfkill _rg \
+ _rkt _rslsync _rspec _rsvm _rubocop \
+ _sbt _scala _scrub _sdd _sd_hosts_or_user_at_host \
+ _sd_machines _sd_outputmodes _sd_unit_files _setcap _setup.py \
+ _sfdx _showoff _srm _stack _subl \
+ _subliminal _supervisorctl _svm _systemctl _systemd \
+ _systemd-analyze _systemd-delta _systemd-inhibit _systemd-nspawn _systemd-run \
+ _systemd-tmpfiles _tarsnap _teamocil _the_silver_searcher _thor \
+ _timedatectl _tmuxinator _tmuxp _tox _trash-empty \
+ _trash-list _trash-put _trash-restore _udevadm _udisksctl \
+ _ufw _vagrant _vifm _virtualbox _vnstat \
+ _wemux _wg-quick _xinput _xsel _xwallpaper \
+ _yaourt _yarn _yay _youtube-dl _zathura \
+ _zcash-cli _cdr _all_labels _all_matches _alternative \
+ _approximate _arg_compile _arguments _bash_completions _cache_invalid \
+ _call_function _combination _complete _complete_debug _complete_help \
+ _complete_help_generic _complete_tag _comp_locale _correct _correct_filename \
+ _correct_word _describe _description _dispatch _expand \
+ _expand_alias _expand_word _extensions _external_pwds _generic \
+ _guard _history _history_complete_word _ignored _list \
+ _main_complete _match _menu _message _most_recent_file \
+ _multi_parts _next_label _next_tags _normal _nothing \
+ _oldlist _pick_variant _prefix _read_comp _regex_arguments \
+ _regex_words _requested _retrieve_cache _sep_parts _sequence \
+ _set_command _setup _store_cache _sub_commands _tags \
+ _user_expand _values _wanted _acpi _acpitool \
+ _alsa-utils _analyseplugin _brctl _btrfs _chattr \
+ _chcon _chrt _cpupower _cryptsetup _dkms \
+ _e2label _ethtool _findmnt _free _fuse_arguments \
+ _fusermount _fuse_values _gpasswd _htop _iconvconfig \
+ _ionice _ipset _iptables _iwconfig _kpartx \
+ _losetup _lsattr _lsblk _lsusb _ltrace \
+ _mdadm _mii-tool _modutils _mondo _networkmanager \
+ _opkg _pidof _pmap _qdbus _schedtool \
+ _selinux_contexts _selinux_roles _selinux_types _selinux_users _setsid \
+ _slabtop _ss _sshfs _strace _sysstat \
+ _tload _tpb _tracepath _tune2fs _uml \
+ _valgrind _vserver _wakeup_capable_devices _wipefs _wpa_cli \
+ _a2ps _aap _abcde _absolute_command_paths _ack \
+ _adb _ansible _ant _antiword _apachectl \
+ _apm _arch_archives _arch_namespace _arp _arping \
+ _asciidoctor _asciinema _at _attr _augeas \
+ _avahi _awk _base64 _basename _bash \
+ _baudrates _baz _beep _bibtex _bind_addresses \
+ _bison _bittorrent _bogofilter _bpf_filters _bpython \
+ _bzip2 _bzr _cabal _cal _calendar \
+ _canonical_paths _cat _ccal _cdcd _cdrdao \
+ _cdrecord _chkconfig _chmod _chown _chroot \
+ _chsh _cksum _clay _cmdambivalent _cmdstring \
+ _cmp _column _comm _composer _compress \
+ _configure _cowsay _cp _cpio _cplay \
+ _crontab _cscope _cssh _ctags_tags _curl \
+ _cut _cvs _darcs _date _date_formats \
+ _dates _dbus _dconf _dd _devtodo \
+ _df _dhclient _dict _dict_words _diff \
+ _diff3 _diff_options _diffstat _dig _directories \
+ _dir_list _django _dmesg _dmidecode _dns_types \
+ _doas _domains _dos2unix _drill _dsh \
+ _dtruss _du _dvi _ecasound _ed \
+ _elfdump _elinks _email_addresses _enscript _entr \
+ _env _espeak _etags _fakeroot _feh \
+ _fetchmail _ffmpeg _figlet _file_modes _files \
+ _file_systems _find _find_net_interfaces _finger _flac \
+ _flex _fmt _fold _fortune _fsh \
+ _fuser _gcc _gcore _gdb _gem \
+ _genisoimage _getconf _getent _getfacl _getmail \
+ _getopt _ghostscript _git _global _global_tags \
+ _gnu_generic _gnupod _gnutls _go _gpg \
+ _gphoto2 _gprof _gradle _graphicsmagick _grep \
+ _groff _groups _growisofs _gsettings _guilt \
+ _gzip _have_glob_qual _head _hexdump _host \
+ _hostname _hosts _iconv _id _ifconfig \
+ _iftop _imagemagick _initctl _init_d _install \
+ _iostat _ip _ipsec _irssi _ispell \
+ _java _java_class _joe _join _jq \
+ _killall _knock _kvno _last _ldconfig \
+ _ldd _ld_debug _less _lha _libvirt \
+ _links _list_files _lldb _ln _loadkeys \
+ _locale _localedef _locales _locate _look \
+ _lp _ls _lsof _lua _luarocks \
+ _lynx _lz4 _lzop _mail _mailboxes \
+ _make _man _md5sum _mencal _mh \
+ _mime_types _mkdir _mkfifo _mknod _mktemp \
+ _module _monotone _moosic _mosh _mount \
+ _mpc _mt _mtools _mtr _mutt \
+ _mv _my_accounts _myrepos _mysqldiff _mysql_utils \
+ _ncftp _netcat _net_interfaces _netstat _newsgroups \
+ _nginx _ngrep _nice _nkf _nl \
+ _nm _nmap _npm _nslookup _numfmt \
+ _objdump _object_files _od _openstack _other_accounts \
+ _pack _pandoc _paste _patch _patchutils \
+ _path_commands _path_files _pax _pbm _pdf \
+ _perforce _perl _perl_basepods _perldoc _perl_modules \
+ _pgrep _php _picocom _pids _pine \
+ _ping _pkgadd _pkg-config _pkginfo _pkg_instance \
+ _pkgrm _pon _ports _postfix _postgresql \
+ _postscript _printenv _printers _process_names _prove \
+ _ps _pspdf _psutils _pump _pv \
+ _pwgen _pydoc _python _python_modules _qemu \
+ _quilt _rake _ranlib _rar _rclone \
+ _rcs _readelf _readlink _remote_files _renice \
+ _ri _rlogin _rm _rmdir _route \
+ _rrdtool _rsync _rubber _ruby _runit \
+ _samba _sccs _scons _screen _script \
+ _seafile _sed _seq _service _services \
+ _setfacl _sh _shasum _showmount _shred \
+ _shuf _shutdown _signals _sisu _slrn \
+ _smartmontools _socket _sort _spamassassin _split \
+ _sqlite _sqsh _ssh _ssh_hosts _stat \
+ _stdbuf _stgit _stow _strings _strip \
+ _stty _su _subversion _sudo _surfraw \
+ _swaks _swanctl _swift _sys_calls _sysctl \
+ _tac _tail _tar _tar_archive _tardy \
+ _tcpdump _tcptraceroute _tee _telnet _terminals \
+ _tex _texi _texinfo _tidy _tiff \
+ _tilde_files _timeout _time_zone _tin _tla \
+ _tmux _todo.sh _toilet _top _topgit \
+ _totd _touch _tput _tr _transmission \
+ _tree _truss _tty _ttys _twidge \
+ _twisted _umountable _unace _uname _unexpand \
+ _uniq _unison _units _uptime _urls \
+ _user_admin _user_at_host _users _users_on _vcsh \
+ _vim _visudo _vmstat _vorbis _vpnc \
+ _w _w3m _watch _wc _webbrowser \
+ _wget _whereis _who _whois _wiggle \
+ _xargs _xmlsoft _xmlstarlet _xmms2 _xxd \
+ _xz _yafc _yodl _yp _zcat \
+ _zdump _zfs _zfs_dataset _zfs_keysource_props _zfs_pool \
+ _zip _zpool _zsh _acroread _code \
+ _dcop _eog _evince _geany _gnome-gv \
+ _gqview _gv _kdeconnect _kfmclient _matlab \
+ _mozilla _mplayer _mupdf _nautilus _nedit \
+ _netscape _okular _pdftk _qiv _rdesktop \
+ _setxkbmap _sublimetext _urxvt _vnc _x_arguments \
+ _xauth _xautolock _x_borderwidth _xclip _x_color \
+ _x_colormapid _x_cursor _x_display _xdvi _x_extension \
+ _xfig _x_font _xft_fonts _x_geometry _x_keysym \
+ _xloadimage _x_locale _x_modifier _xmodmap _x_name \
+ _xournal _xpdf _xrandr _x_resource _xscreensaver \
+ _x_selection_timeout _xset _xt_arguments _xterm _x_title \
+ _xt_session_id _x_utils _xv _x_visual _x_window \
+ _xwit _zeal _add-zle-hook-widget _add-zsh-hook _alias \
+ _aliases _arrays _assign _autocd _bindkey \
+ _brace_parameter _builtin _cd _command _command_names \
+ _compadd _compdef _completers _condition _default \
+ _delimiters _directory_stack _dirs _disable _dynamic_directory_name \
+ _echotc _echoti _emulate _enable _equal \
+ _exec _fc _file_descriptors _first _functions \
+ _globflags _globqual_delims _globquals _hash _history_modifiers \
+ _in_vared _jobs _jobs_bg _jobs_builtin _jobs_fg \
+ _kill _limit _limits _math _math_params \
+ _mere _module_math_func _options _options_set _options_unset \
+ _parameter _parameters _precommand _print _prompt \
+ _ps1234 _read _redirect _run-help _sched \
+ _set _setopt _source _strftime _subscript \
+ _suffix_alias_files _tcpsys _tilde _trap _ttyctl \
+ _typeset _ulimit _unhash _user_math_func _value \
+ _vared _vars _wait _which _widgets \
+ _zargs _zattr _zcalc _zcalc_line _zcompile \
+ _zed _zftp _zle _zmodload _zmv \
+ _zparseopts _zpty _zsh-mime-handler _zsocket _zstyle \
+ _ztodo
+autoload -Uz +X _call_program
+
+typeset -gUa _comp_assocs
+_comp_assocs=( '' )
diff --git a/zsh/.zshrc b/zsh/.zshrc
@@ -0,0 +1,159 @@
+autoload -U colors && colors # Load colors
+
+setopt autocd # Automatically cd into typed directory.
+setopt SHARE_HISTORY
+setopt HIST_IGNORE_ALL_DUPS
+stty stop undef # Disable ctrl-s to freeze terminal.
+
+# History in cache directory:
+HISTSIZE=1000000
+SAVEHIST=1000000
+HISTFILE=~/.cache/zsh/history
+
+# don't add garbage to history
+function hist() {
+ [[ "$#1" -lt 7 \
+ || "$1" = "run-help "* \
+ || "$1" = "cd "* \
+ || "$1" = "man "* \
+ || "$1" = "h "* \
+ || "$1" = "~ "* ]]
+ return $(( 1 - $? ))
+}
+# Load aliases and shortcuts if existent.
+[ -f "${XDG_CONFIG_HOME:-$HOME/.config}/shortcutrc" ] && source "${XDG_CONFIG_HOME:-$HOME/.config}/shortcutrc"
+[ -f "${XDG_CONFIG_HOME:-$HOME/.config}/aliasrc" ] && source "${XDG_CONFIG_HOME:-$HOME/.config}/aliasrc"
+[ -f "${XDG_CONFIG_HOME:-$HOME/.config}/zshnameddirrc" ] && source "${XDG_CONFIG_HOME:-$HOME/.config}/zshnameddirrc"
+
+# load ssh agent
+if [ ! -S ~/.ssh/ssh_auth_sock ]; then
+ eval `ssh-agent`
+ ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
+fi
+export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
+ssh-add -l > /dev/null || ssh-add
+
+# Basic auto/tab complete:
+autoload -U compinit
+zstyle ':completion:*' menu select
+zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
+
+zmodload zsh/complist
+compinit
+_comp_options+=(globdots) # Include hidden files.
+
+# vi mode
+bindkey -v
+export KEYTIMEOUT=1
+
+# Enable searching through history
+bindkey '^R' history-incremental-pattern-search-backward
+
+# Use vim keys in tab complete menu:
+bindkey -M menuselect 'h' vi-backward-char
+bindkey -M menuselect 'k' vi-up-line-or-history
+bindkey -M menuselect 'l' vi-forward-char
+bindkey -M menuselect 'j' vi-down-line-or-history
+bindkey -v '^?' backward-delete-char
+
+# Change cursor shape for different vi modes.
+function zle-keymap-select {
+ if [[ ${KEYMAP} == vicmd ]] ||
+ [[ $1 = 'block' ]]; then
+ echo -ne '\e[1 q'
+ elif [[ ${KEYMAP} == main ]] ||
+ [[ ${KEYMAP} == viins ]] ||
+ [[ ${KEYMAP} = '' ]] ||
+ [[ $1 = 'beam' ]]; then
+ echo -ne '\e[5 q'
+ fi
+}
+
+zle -N zle-keymap-select
+
+# ci", ci', ci`, di", etc
+autoload -U select-quoted
+zle -N select-quoted
+for m in visual viopp; do
+ for c in {a,i}{\',\",\`}; do
+ bindkey -M $m $c select-quoted
+ done
+done
+
+# ci{, ci(, ci<, di{, etc
+autoload -U select-bracketed
+zle -N select-bracketed
+for m in visual viopp; do
+ for c in {a,i}${(s..)^:-'()[]{}<>bB'}; do
+ bindkey -M $m $c select-bracketed
+ done
+done
+
+zle-line-init() {
+ zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere)
+ echo -ne "\e[5 q"
+}
+
+zle -N zle-line-init
+
+echo -ne '\e[5 q' # Use beam shape cursor on startup.
+preexec() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt.
+
+bindkey -s '^o' 'lfcd\n'
+bindkey -s '^a' 'bc -l\n'
+bindkey -s '^f' 'cd "$(dirname "$(fzf)")"\n'
+bindkey '^[[P' delete-char
+
+# Edit line in vim with ctrl-e:
+autoload edit-command-line; zle -N edit-command-line
+bindkey '^e' edit-command-line
+
+# Load zsh-syntax-highlighting
+source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh 2>/dev/null
+
+# Suggest aliases for commands
+source /usr/share/zsh/plugins/zsh-you-should-use/you-should-use.plugin.zsh 2>/dev/null
+
+# Search repos for programs that can't be found
+source /usr/share/doc/pkgfile/command-not-found.zsh 2>/dev/null
+
+SPACESHIP_PROMPT_ADD_NEWLINE=false
+SPACESHIP_PROMPT_SEPARATE_LINE=false
+#SPACESHIP_CHAR_SYMBOL=➜➜➜➜➜❯➜
+SPACESHIP_CHAR_SUFFIX=
+SPACESHIP_USER_SHOW=false
+SPACESHIP_HOST_SHOW=false
+SPACESHIP_GIT_SHOW=false
+
+SPACESHIP_DIR_SHOW=true
+SPACESHIP_DIR_COLOR=#777777
+SPACESHIP_CONDA_SHOW=true
+SPACESHIP_VENV_SHOW=true
+SPACESHIP_PYENV_SHOW=true
+
+SPACESHIP_HG_SHOW=false
+SPACESHIP_PACKAGE_SHOW=false
+SPACESHIP_NODE_SHOW=false
+SPACESHIP_RUBY_SHOW=false
+SPACESHIP_ELM_SHOW=false
+SPACESHIP_ELIXIR_SHOW=false
+SPACESHIP_XCODE_SHOW_LOCAL=false
+SPACESHIP_SWIFT_SHOW_LOCAL=false
+SPACESHIP_GOLANG_SHOW=false
+SPACESHIP_PHP_SHOW=false
+SPACESHIP_RUST_SHOW=false
+SPACESHIP_JULIA_SHOW=false
+SPACESHIP_DOCKER_SHOW=false
+SPACESHIP_DOCKER_CONTEXT_SHOW=false
+SPACESHIP_AWS_SHOW=false
+SPACESHIP_DOTNET_SHOW=false
+SPACESHIP_EMBER_SHOW=false
+SPACESHIP_KUBECONTEXT_SHOW=false
+SPACESHIP_TERRAFORM_SHOW=false
+SPACESHIP_TERRAFORM_SHOW=false
+SPACESHIP_VI_MODE_SHOW=false
+SPACESHIP_JOBS_SHOW=false
+
+# Spaceship Prompt
+autoload -U promptinit; promptinit
+prompt spaceship