├── .gitignore ├── Brewfile ├── README.md ├── _files ├── .gitconfig ├── JetBrainsMono-Regular.ttf ├── JetBrainsMonoNerdFontPropo-Medium.ttf ├── fnando.itermexport ├── fnando.itermkeymap ├── fnando.terminal ├── macOS.sh ├── timemachine.sh └── windows-terminal.json ├── fnando ├── .bin │ ├── adb-send-input │ ├── backup-brew │ ├── backup-ccc │ ├── bolt-hud │ ├── current-ip │ ├── data-url │ ├── decrypt │ ├── docker │ ├── encrypt │ ├── ffmpeg-loudness │ ├── ffmpeg-slow-down-audio │ ├── ffmpeg-split-audio-channels │ ├── format-git-message │ ├── gh-action-status │ ├── git-buster │ ├── git-current │ ├── git-empty │ ├── git-track │ ├── git-undo │ ├── git-view │ ├── git-wip │ ├── imgcat │ ├── instagram-slice │ ├── list-ios-simulators │ ├── pretty_html │ ├── prince │ ├── restart-dns │ ├── rscp │ ├── rtf │ ├── server │ ├── slim-vid │ ├── spoof │ ├── tmignore │ ├── tunnel │ ├── vectorize │ ├── whatsapp-media │ ├── whatsapp-vid │ └── yt ├── .config │ ├── gh │ │ └── config.yml │ ├── ghostty │ │ └── config │ ├── irb │ │ ├── irbrc │ │ └── shell_command.rb │ ├── ll.toml │ ├── safari.css │ ├── starship.toml │ ├── tmux │ │ └── tmux.conf │ ├── zed │ │ ├── keymap.json │ │ └── settings.json │ ├── zsh-user │ │ ├── after.sample.sh │ │ └── before.sample.sh │ └── zsh │ │ ├── 1password.sh │ │ ├── aliases.sh │ │ ├── android-studio.sh │ │ ├── bundler.sh │ │ ├── cd.sh │ │ ├── exports.sh │ │ ├── fzf.sh │ │ ├── git.sh │ │ ├── init.sh │ │ ├── keybindings.sh │ │ ├── md.sh │ │ ├── mise.sh │ │ ├── options.sh │ │ ├── psgrep.sh │ │ ├── starship.sh │ │ ├── sublime-text.sh │ │ ├── tmux.sh │ │ ├── utils.sh │ │ ├── vscode.sh │ │ └── zinit.sh ├── .default-gems ├── .default-npm-packages ├── .dockerignore ├── .editorconfig ├── .eslintrc ├── .gemrc ├── .gitattributes ├── .gitignore ├── .hushlogin ├── .inputrc ├── .my.cnf ├── .psqlrc ├── .railsrc ├── .rubocop.yml ├── .screenrc ├── .sqliterc ├── .ssh │ └── config ├── .stow-global-ignore ├── .vimrc ├── .vundle.vim ├── .yarnrc.yml ├── .zshrc └── Library │ ├── Application Support │ └── iTerm2 │ │ └── DynamicProfiles │ │ └── iterm-profiles.json │ └── LaunchAgents │ └── com.fnando.backup-brew.plist ├── install ├── terminal.png └── update /.gitignore: -------------------------------------------------------------------------------- 1 | fnando/.config/gh/hosts.yml 2 | fnando/.config/zsh/user.sh 3 | fnando/.config/tpm/plugins/ 4 | fnando/.config/tmux/plugins/ 5 | fnando/.bin/mailhog 6 | -------------------------------------------------------------------------------- /Brewfile: -------------------------------------------------------------------------------- 1 | tap "1password/tap" 2 | tap "akeru-inc/tap" 3 | tap "amiaopensource/amiaos" 4 | tap "aws/tap" 5 | tap "cdalvaro/tap" 6 | tap "cloudflare/cloudflare" 7 | tap "codeclimate/formulae" 8 | tap "fermyon/tap" 9 | tap "fnando/tap" 10 | tap "gobuffalo/tap" 11 | tap "goreleaser/tap" 12 | tap "hashicorp/tap" 13 | tap "heroku/brew" 14 | tap "homebrew-ffmpeg/ffmpeg" 15 | tap "homebrew/bundle" 16 | tap "homebrew/command-not-found" 17 | tap "homebrew/services" 18 | tap "jakehilborn/jakehilborn" 19 | tap "jonof/kenutils" 20 | tap "pls-rs/pls" 21 | tap "puma/puma" 22 | tap "russellbanks/tap" 23 | tap "sergiobenitez/osxct" 24 | tap "sidneys/homebrew" 25 | tap "stellar/tap" 26 | tap "stripe/stripe-cli" 27 | tap "wix/brew" 28 | # Search tool like grep, but optimized for programmers 29 | brew "ack" 30 | # Run your GitHub Actions locally 31 | brew "act" 32 | # Recompression utilities for .PNG, .MNG, .ZIP, and .GZ files 33 | brew "advancecomp" 34 | # Library for manipulating PNG images 35 | brew "libpng" 36 | # Zstandard is a real-time compression algorithm 37 | brew "zstd" 38 | # Image format providing lossless and lossy compression for web images 39 | brew "webp" 40 | # New file format for still image compression 41 | brew "jpeg-xl" 42 | # Codec library for encoding and decoding AV1 video streams 43 | brew "aom" 44 | # Software library to render fonts 45 | brew "freetype" 46 | # GNU internationalization (i18n) and localization (l10n) library 47 | brew "gettext" 48 | # Cryptography and SSL/TLS Toolkit 49 | brew "openssl@3" 50 | # Core application library for C 51 | brew "glib" 52 | # OpenType text shaping engine 53 | brew "harfbuzz" 54 | # Development kit for the Java programming language 55 | brew "openjdk" 56 | # Tool for reverse engineering 3rd party, closed, binary Android apps 57 | brew "apktool" 58 | # C library implementing the SSH2 protocol 59 | brew "libssh2" 60 | # Download with resuming and segmented downloading 61 | brew "aria2" 62 | # Record and share terminal sessions 63 | brew "asciinema" 64 | # Ogg Bitstream Library 65 | brew "libogg" 66 | # Free lossless audio codec 67 | brew "flac" 68 | # GNU multiple precision arithmetic library 69 | brew "gmp" 70 | # GNU compiler collection 71 | brew "gcc" 72 | # High quality MPEG Audio Layer III (MP3) encoder 73 | brew "lame" 74 | # Audio codec 75 | brew "opus" 76 | # Optimized BLAS library 77 | brew "openblas" 78 | # Package for scientific computing with Python 79 | brew "numpy" 80 | # Extract annotations from audio signals 81 | brew "aubio" 82 | # Automatic configure script builder 83 | brew "autoconf" 84 | # Shell extension to jump to frequently used directories 85 | brew "autojump" 86 | # Tool for generating GNU Standards-compliant Makefiles 87 | brew "automake" 88 | # Official Amazon AWS command-line interface 89 | brew "awscli" 90 | # Bourne-Again SHell, a UNIX command interpreter 91 | brew "bash" 92 | # Programmable completion for Bash 3.2 93 | brew "bash-completion" 94 | # Regular expressions library 95 | brew "oniguruma" 96 | # Clone of cat(1) with syntax highlighting and Git integration 97 | brew "bat" 98 | # Garbage collector for C and C++ 99 | brew "bdw-gc" 100 | # Parser generator 101 | brew "bison" 102 | # Collection of portable C++ source libraries 103 | brew "boost" 104 | # Command-line tool to manipulate Android App Bundles 105 | brew "bundletool" 106 | # Freely available high-quality data compressor 107 | brew "bzip2" 108 | # Extract files from Microsoft cabinet files 109 | brew "cabextract" 110 | # Powerful, enterprise-ready, open source web server with automatic HTTPS 111 | brew "caddy", restart_service: true 112 | # Cargo subcommand for displaying when Rust dependencies are out of date 113 | brew "cargo-outdated" 114 | # CD/DVD/Blu-ray premastering and recording software 115 | brew "cdrtools" 116 | # Statistics utility to count lines of code 117 | brew "cloc" 118 | # Cross-platform make 119 | brew "cmake" 120 | # Unit testing framework for C 121 | brew "cmocka" 122 | # Minimalistic plugin API for video effects 123 | brew "frei0r" 124 | # Asynchronous event library 125 | brew "libevent" 126 | # Validating, recursive, caching DNS resolver 127 | brew "unbound" 128 | # GNU Transport Layer Security (TLS) Library 129 | brew "gnutls" 130 | # Image processing and image analysis library 131 | brew "leptonica" 132 | # Subtitle renderer for the ASS/SSA subtitle format 133 | brew "libass" 134 | # NaCl networking and cryptography library 135 | brew "libsodium" 136 | # Audio codecs extracted from Android open source project 137 | brew "opencore-amr" 138 | # Framework for layout and rendering of i18n text 139 | brew "pango" 140 | # Fastest and safest AV1 video encoder 141 | brew "rav1e" 142 | # OCR (Optical Character Recognition) engine 143 | brew "tesseract" 144 | # Open video compression format 145 | brew "theora" 146 | # High-performance, high-quality MPEG-4 video library 147 | brew "xvid" 148 | # Play, record, convert, and stream audio and video 149 | brew "ffmpeg" 150 | # Music player with an ncurses based interface 151 | brew "cmus" 152 | # Container runtimes on MacOS (and Linux) with minimal setup 153 | brew "colima" 154 | # Color-highlighted diff(1) output 155 | brew "colordiff" 156 | # Like tail(1), but with various colors for specified output 157 | brew "colortail" 158 | # GNU File, Shell, and Text utilities 159 | brew "coreutils" 160 | # Unit testing framework handling automated tests in C++ 161 | brew "cpptest" 162 | # YAML Parser 163 | brew "libyaml" 164 | # Next-gen compiler infrastructure 165 | brew "llvm" 166 | # Package compiler and linker metadata toolkit 167 | brew "pkgconf" 168 | # Fast and statically typed, compiled language with Ruby-like syntax 169 | brew "crystal" 170 | # Clean Docker containers, images, networks, and volumes 171 | brew "docker-clean" 172 | # Isolated development environments using Docker 173 | brew "docker-compose" 174 | # Utilities for the ext2, ext3, and ext4 file systems 175 | brew "e2fsprogs" 176 | # Collection of reusable C++ library artifacts developed at Facebook 177 | brew "folly" 178 | # C++14 implementation of the TLS-1.3 standard 179 | brew "fizz" 180 | # Modular, composable client/server abstractions framework 181 | brew "wangle" 182 | # Facebook's branch of Apache Thrift, including a new C++ server 183 | brew "fbthrift" 184 | # Thrift functions for querying information from a service 185 | brew "fb303" 186 | # Shared library for Watchman and Eden projects 187 | brew "edencommon" 188 | # Validate EPUB files, version 2.0 and later 189 | brew "epubcheck" 190 | # Extremely fast JavaScript bundler and minifier 191 | brew "esbuild" 192 | # Text to speech, software speech synthesizer 193 | brew "espeak" 194 | # Perl lib for reading and writing EXIF metadata 195 | brew "exiftool" 196 | # ISO AAC audio encoder 197 | brew "faac" 198 | # Like neofetch, but much faster because written mostly in C 199 | brew "fastfetch" 200 | # Standalone library of the Fraunhofer FDK AAC code from Android 201 | brew "fdk-aac" 202 | # Play, record, convert, and stream audio and video 203 | brew "ffmpeg@4" 204 | # User-friendly command-line shell for UNIX-like operating systems 205 | brew "fish" 206 | # Infamous electronic fortune-cookie generator 207 | brew "fortune" 208 | # Library for FreeImage, a dependency-free graphics library 209 | brew "freeimage" 210 | # Generic library support script 211 | brew "libtool" 212 | # ODBC 3 connectivity for UNIX 213 | brew "unixodbc" 214 | # Libraries to talk to Microsoft SQL Server and Sybase databases 215 | brew "freetds" 216 | # Platform built on V8 to build network applications 217 | brew "node" 218 | # Terminal JSON viewer 219 | brew "fx" 220 | # Command-line fuzzy finder written in Go 221 | brew "fzf" 222 | # Graphics library to dynamically manipulate images 223 | brew "gd" 224 | # WebDriver <-> Marionette proxy 225 | brew "geckodriver" 226 | # GitHub command-line tool 227 | brew "gh" 228 | # JBIG2 decoder and library (for monochrome documents) 229 | brew "jbig2dec" 230 | # Interpreter for PostScript and PDF 231 | brew "ghostscript" 232 | # GIF image/animation creator/editor 233 | brew "gifsicle" 234 | # Distributed revision control system 235 | brew "git" 236 | # Syntax-highlighting pager for git and diff output 237 | brew "git-delta" 238 | # GNU implementation of the famous stream editor 239 | brew "gnu-sed" 240 | # Common error values for all GnuPG components 241 | brew "libgpg-error" 242 | # X.509 and CMS library 243 | brew "libksba" 244 | # Passphrase entry dialog utilizing the Assuan protocol 245 | brew "pinentry" 246 | # GNU Pretty Good Privacy (PGP) package 247 | brew "gnupg" 248 | # Generate introspection data for GObject libraries 249 | brew "gobject-introspection" 250 | # GNU grep, egrep and fgrep 251 | brew "grep" 252 | # Fulltext search engine and column store 253 | brew "groonga" 254 | # Library for reading and writing H264 video streams 255 | brew "h264bitstream" 256 | # Smarter Dockerfile linter to validate best practices 257 | brew "hadolint" 258 | # File format designed to store large amounts of data 259 | brew "hdf5" 260 | # Advanced HTML-to-text converter 261 | brew "html2text" 262 | # User-friendly cURL replacement (command-line HTTP client) 263 | brew "httpie" 264 | # Curl statistics made simple 265 | brew "httpstat" 266 | # Improved colored diff 267 | brew "icdiff" 268 | # ISO/IEC 23008-12:2017 HEIF file format decoder and encoder 269 | brew "libheif" 270 | # Tools and libraries to manipulate images in many formats 271 | brew "imagemagick" 272 | # EXIF parsing library 273 | brew "libexif" 274 | # Library to render SVG files using Cairo 275 | brew "librsvg" 276 | # Libraries for security-enabled client and server applications 277 | brew "nss" 278 | # C library to read whole-slide images (a.k.a. virtual slides) 279 | brew "openslide" 280 | # PDF rendering library (based on the xpdf-3.0 code base) 281 | brew "poppler" 282 | # Image processing library 283 | brew "vips" 284 | # Fast and secure server for resizing and converting remote images 285 | brew "imgproxy" 286 | # Install and debug iPhone apps from the command-line 287 | brew "ios-deploy" 288 | # Modular IRC client 289 | brew "irssi" 290 | # Implementation of malloc emphasizing fragmentation avoidance 291 | brew "jemalloc" 292 | # Extract Digicam setting info from EXIF JPEG headers 293 | brew "jhead" 294 | # Image manipulation library 295 | brew "jpeg" 296 | # Utility to optimize JPEG files 297 | brew "jpegoptim" 298 | # Lightweight and flexible command-line JSON processor 299 | brew "jq" 300 | # Implementations for atomic memory update operations 301 | brew "libatomic_ops" 302 | # BSD-style licensed readline alternative 303 | brew "libedit" 304 | # Conversion library 305 | brew "libiconv" 306 | # Implementation of the file(1) command 307 | brew "libmagic" 308 | # Extensible, open standard container format for audio/video 309 | brew "libmatroska" 310 | # VisualOn AAC encoder library 311 | brew "libvo-aacenc" 312 | # C library for reading, creating, and modifying zip archives 313 | brew "libzip" 314 | # LZMA-based compression program similar to gzip or bzip2 315 | brew "lzip" 316 | # Creates dependencies in makefiles 317 | brew "makedepend" 318 | # CLI for Node.js style checker and lint tool for Markdown files 319 | brew "markdownlint-cli" 320 | # High performance, distributed memory object caching system 321 | brew "memcached" 322 | # Minimalist GNU for Windows and GCC cross-compilers 323 | brew "mingw-w64" 324 | # Polyglot runtime manager (asdf rust clone) 325 | brew "mise" 326 | # Simple tool to make locally trusted development certificates 327 | brew "mkcert" 328 | # QUIC transport protocol implementation 329 | brew "mvfst" 330 | # General-purpose lossless data-compression library 331 | brew "zlib" 332 | # Open source relational database management system 333 | brew "mysql" 334 | # Open source relational database management system 335 | brew "mysql-client" 336 | # Small build system for use with gyp or CMake 337 | brew "ninja" 338 | # Port scanning utility for large networks 339 | brew "nmap" 340 | # Retrieves currently playing media, and simulates media actions 341 | brew "nowplaying-cli" 342 | # PNG file optimizer 343 | brew "optipng" 344 | # Oil Runtime Compiler (ORC) 345 | brew "orc" 346 | # Clean C library for processing UTF-8 Unicode data 347 | brew "utf8proc" 348 | # Terminal multiplexer 349 | brew "tmux" 350 | # Process manager for Procfile-based applications and tmux 351 | brew "overmind" 352 | # Multithreaded PNG optimizer written in Rust 353 | brew "oxipng" 354 | # CLI for Postgres with auto-completion and syntax highlighting 355 | brew "pgcli" 356 | # Granddaddy of HTML tools, with support for modern standards 357 | brew "tidy-html5" 358 | # General-purpose scripting language 359 | brew "php" 360 | # Tool to automatically fix PHP coding standards issues 361 | brew "php-cs-fixer" 362 | # General-purpose scripting language 363 | brew "php@8.1" 364 | # Pinentry for GPG on Mac 365 | brew "pinentry-mac" 366 | # Python dependency management tool 367 | brew "pipenv" 368 | # Optimizer for PNG files 369 | brew "pngcrush" 370 | # PNG image optimizing utility 371 | brew "pngquant" 372 | # Object-relational database system 373 | brew "postgresql@17", link: true 374 | # Convert bitmaps to vector graphics 375 | brew "potrace" 376 | # Pretty-print tabular data in Python 377 | brew "python-tabulate" 378 | # Generic machine emulator and virtualizer 379 | brew "qemu" 380 | # Cross-platform application and UI framework 381 | brew "qt" 382 | # Sampling profiler for Ruby 383 | brew "rbspy" 384 | # Generate C-based recognizers from regular expressions 385 | brew "re2c" 386 | # Reattach process (e.g., tmux) to background 387 | brew "reattach-to-user-namespace" 388 | # Persistent key-value database, with built-in net interface 389 | brew "redis" 390 | # Readline wrapper: adds readline support to tools that lack it 391 | brew "rlwrap" 392 | # Utility that provides fast incremental file transfer 393 | brew "rsync" 394 | # Ruby autoformatter 395 | brew "rubyfmt" 396 | # Command-line tool for the Amazon S3 service 397 | brew "s3cmd" 398 | # Fast and accurate code counter with complexity and COCOMO estimates 399 | brew "scc" 400 | # High-speed implementation of the Dirac codec 401 | brew "schroedinger" 402 | # Substitute for classic 'make' tool with autoconf/automake functionality 403 | brew "scons" 404 | # SDL 1.2 compatibility layer that uses SDL 2.0 behind the scenes 405 | brew "sdl12-compat" 406 | # Easily detect and prevent bugs and anti-patterns in your codebase 407 | brew "semgrep" 408 | # Static analysis and lint tool, for (ba)sh scripts 409 | brew "shellcheck" 410 | # Autoformat shell script source code 411 | brew "shfmt" 412 | # HTTP regression testing and benchmarking utility 413 | brew "siege" 414 | # SOund eXchange: universal sound sample translator 415 | brew "sox" 416 | # SQL linter and auto-formatter for Humans 417 | brew "sqlfluff" 418 | # Add a public key to a remote machine's authorized_keys file 419 | brew "ssh-copy-id" 420 | # Proxy server that works as a poor man's VPN 421 | brew "sshuttle" 422 | # Test SSL/TLS enabled services to discover supported cipher suites 423 | brew "sslscan" 424 | # Cross-shell prompt for astronauts 425 | brew "starship" 426 | # Stellar command-line tool for interacting with the Stellar network 427 | brew "stellar-cli" 428 | # Organize software neatly under a single directory tree (e.g. /usr/local) 429 | brew "stow" 430 | # Nodejs-based tool for optimizing SVG vector graphics files 431 | brew "svgo" 432 | # Formatting tool for reformatting Swift code 433 | brew "swiftformat" 434 | # Tool to enforce Swift style and conventions 435 | brew "swiftlint" 436 | # User interface to the TELNET protocol 437 | brew "telnet" 438 | # Send macOS User Notifications from the command-line 439 | brew "terminal-notifier" 440 | # Program that allows you to count code, quickly 441 | brew "tokei" 442 | # Anonymizing overlay network for TCP 443 | brew "tor" 444 | # Display directories as trees (with optional color/HTML output) 445 | brew "tree" 446 | # Command-line unarchiving tools supporting multiple formats 447 | brew "unar" 448 | # Compress/expand executable files 449 | brew "upx" 450 | # URI parsing library (strictly RFC 3986 compliant) 451 | brew "uriparser" 452 | # Syntax-aware linter for prose 453 | brew "vale" 454 | # Command-line tool for Vapor (Server-side Swift web framework) 455 | brew "vapor" 456 | # Executes a program periodically, showing output fullscreen 457 | brew "watch" 458 | # Watch files and take action when they change 459 | brew "watchman" 460 | # Internet file retriever 461 | brew "wget" 462 | # Library to create, extract, and modify Windows Imaging files 463 | brew "wimlib" 464 | # Linter for YAML files 465 | brew "yamllint" 466 | # Feature-rich command-line audio/video downloader 467 | brew "yt-dlp" 468 | # Pluggable terminal workspace, with terminal multiplexer as the base feature 469 | brew "zellij" 470 | # Flexible and fast Zsh plugin manager 471 | brew "zinit" 472 | # UNIX shell (command interpreter) 473 | brew "zsh" 474 | # Fish-like fast/unobtrusive autosuggestions for zsh 475 | brew "zsh-autosuggestions" 476 | # Feature-rich syntax highlighting for Zsh 477 | brew "zsh-fast-syntax-highlighting" 478 | # Fish shell like syntax highlighting for zsh 479 | brew "zsh-syntax-highlighting" 480 | # ZSH plugin that reminds you to use existing aliases for commands you just typed 481 | brew "zsh-you-should-use" 482 | # macOS app notarization helper 483 | brew "akeru-inc/tap/xcnotary" 484 | # Open-source tool for building and running serverless WebAssembly applications 485 | brew "fermyon/tap/spin" 486 | # A prettier terminal's ls command, with color and https://www.nerdfonts.com/ icons. 487 | brew "fnando/tap/ll" 488 | # A command-line tool to retrieve secrets from 1Password, with custom output to several formats. Depends on 1Password's own `op` command. 489 | brew "fnando/tap/op-env" 490 | brew "gobuffalo/tap/buffalo" 491 | # Everything you need to get started with Heroku 492 | brew "heroku/brew/heroku" 493 | # Ken Silverman's PNG optimisation utility 494 | brew "jonof/kenutils/pngout" 495 | # Komac - Community Manifest Creator for Windows Package Manager (WinGet) 496 | brew "russellbanks/tap/komac" 497 | # x86_64 Linux GNU Toolchain 498 | brew "sergiobenitez/osxct/x86_64-unknown-linux-gnu" 499 | # Extract, view, and test RAR archives 500 | brew "sidneys/homebrew/unrar" 501 | # Stripe CLI utility 502 | brew "stripe/stripe-cli/stripe" 503 | # Apple simulator utilities 504 | brew "wix/brew/applesimutils" 505 | # Command-line interface for 1Password 506 | cask "1password-cli" 507 | # Application launcher and productivity software 508 | cask "alfred" 509 | # User-friendly GUI app for Homebrew 510 | cask "applite" 511 | # Tool to uninstall unwanted applications and their support files 512 | cask "appzapper" 513 | # Menu bar icon organiser 514 | cask "bartender" 515 | # E-books management software 516 | cask "calibre" 517 | # Automated testing of webapps for Google Chrome 518 | cask "chromedriver" 519 | # Application window manager focusing on simplicity 520 | cask "divvy" 521 | # App to build and share containerised applications and microservices 522 | cask "docker" 523 | # Web browser 524 | cask "firefox" 525 | # Dreamcast, Naomi and Atomiswave emulator 526 | cask "flycast" 527 | cask "font-jetbrains-mono" 528 | cask "font-jetbrains-mono-nerd-font" 529 | # Web browser 530 | cask "google-chrome" 531 | # Utility to hide menu bar items 532 | cask "hiddenbar" 533 | # Terminal emulator as alternative to Apple's Terminal app 534 | cask "iterm2" 535 | # Tool to control external monitor brightness & volume 536 | cask "monitorcontrol" 537 | # Music tagger 538 | cask "musicbrainz-picard" 539 | # Retro video game emulation 540 | cask "openemu" 541 | # Thumbnails, static previews, cover art and metadata for video files 542 | cask "qlvideo" 543 | # Tool that provides consistent, highly configurable symbols for apps 544 | cask "sf-symbols" 545 | # Digital design and prototyping platform 546 | cask "sketch" 547 | # Team communication and collaboration software 548 | cask "slack" 549 | # Control your Sonos system 550 | cask "sonos" 551 | # System monitor for the menu bar 552 | cask "stats" 553 | # Text editor for code, markup and prose 554 | cask "sublime-text" 555 | # Native GUI tool for relational databases 556 | cask "tableplus" 557 | # Unpacks archive files 558 | cask "the-unarchiver" 559 | # Virtual machines UI using QEMU 560 | cask "utm" 561 | # Open-source code editor 562 | cask "visual-studio-code", args: { appdir: "/Applications" } 563 | # Multimedia player 564 | cask "vlc" 565 | # Alternative and privacy-friendly YouTube frontend 566 | cask "yattee" 567 | # Multiplayer code editor 568 | cask "zed" 569 | # Video communication and virtual meeting platform 570 | cask "zoom" 571 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Dotfiles 2 | 3 | ![Screenshot of my terminal](https://github.com/fnando/dotfiles/blob/main/terminal.png) 4 | 5 | Welcome to my dotfiles! It features: 6 | 7 | - Light theme 8 | - ZSH configuration 9 | - [mise](https://mise.jdx.dev/) as runtime manager 10 | 11 | ## Requirements 12 | 13 | ### Install dependencies 14 | 15 | On macOS: 16 | 17 | ```bash 18 | brew install stow git zsh starship jq fnando/tap/ll fnando/tap/op-env 19 | brew install iterm2 --cask 20 | ``` 21 | 22 | ### Install ZSH 23 | 24 | Make it available: 25 | 26 | ```bash 27 | grep -q -f $(which zsh) /etc/shells || echo $(which zsh) | sudo tee -a /etc/shells 28 | ``` 29 | 30 | Finally, set it as the default shell: 31 | 32 | ```bash 33 | chsh -s $(which zsh) 34 | ``` 35 | 36 | On macOS you may want to disable the line that sets the `PATH` on 37 | `/etc/zprofile`. 38 | 39 | ### Install Dotfiles 40 | 41 | 1. Clone https://github.com/fnando/dotfiles somewhere, like `~/.dotfiles`. 42 | 2. Go to `~/.dotfiles` then run `./install`. 43 | 3. Now run `stow fnando -t $HOME` to symlink all config files. 44 | 4. Restart your terminal. 45 | 46 | How it works: most of the configuration is managed by 47 | [stow](https://www.gnu.org/software/stow/), which symlinks files to the right 48 | places. That means you can easily add or remove configurations by adding or 49 | changing files on the `~/.dotfiles` directory. Then you can commit and push 50 | these changes to your own repo. 51 | 52 | ### Install Nerd Fonts 53 | 54 | Install a [Nerd Font](https://github.com/ryanoasis/nerd-fonts) and activate it 55 | on your terminal profile. I personally like 56 | [JetBrains Mono](https://www.jetbrains.com/lp/mono/)'s variant. 57 | 58 | ## License 59 | 60 | Copyright (c) 2014 Nando Vieira 61 | 62 | MIT License 63 | 64 | Permission is hereby granted, free of charge, to any person obtaining a copy of 65 | this software and associated documentation files (the "Software"), to deal in 66 | the Software without restriction, including without limitation the rights to 67 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 68 | the Software, and to permit persons to whom the Software is furnished to do so, 69 | subject to the following conditions: 70 | 71 | The above copyright notice and this permission notice shall be included in all 72 | copies or substantial portions of the Software. 73 | 74 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 75 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 76 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 77 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 78 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 79 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 80 | -------------------------------------------------------------------------------- /_files/.gitconfig: -------------------------------------------------------------------------------- 1 | [color] 2 | branch = auto 3 | diff = auto 4 | status = auto 5 | ui = true 6 | [color "diff"] 7 | commit = yellow 8 | frag = cyan 9 | meta = yellow 10 | new = green 11 | old = red 12 | plain = black 13 | whitespace = red reverse 14 | [commit] 15 | verbose = true 16 | [alias] 17 | b = branch 18 | ca = commit --amend 19 | ci = commit 20 | co = checkout 21 | dw = diff --word-diff 22 | fl = log -p 23 | lg = log --oneline --decorate 24 | sb = status -sb 25 | sh = !git-sh 26 | st = status 27 | who = shortlog -s -- 28 | [help] 29 | autocorrect = 1 30 | [branch] 31 | autosetuprebase = always 32 | sort = -committerdate 33 | [push] 34 | default = current 35 | autosetupremote = true 36 | [core] 37 | excludesfile = ~/.gitignore 38 | attributesfile = ~/.gitattributes 39 | [merge] 40 | ff = only 41 | [fetch] 42 | prune = true 43 | pruneTags = true 44 | all = true 45 | [color "diff-highlight"] 46 | newHighlight = green reverse 47 | newNormal = green 48 | oldHighlight = red reverse 49 | oldNormal = red 50 | [init] 51 | defaultBranch = main 52 | [rebase] 53 | autosquash = true 54 | updaterefs = true 55 | [pull] 56 | rebase = true 57 | [tag] 58 | sort = version:refname 59 | [diff] 60 | colormoved = plain 61 | renames = true 62 | mnemonicprefix = true 63 | algorithm = histogram 64 | -------------------------------------------------------------------------------- /_files/JetBrainsMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fnando/dotfiles/74c14ad646669d9bb4c9d4153cf034025da04192/_files/JetBrainsMono-Regular.ttf -------------------------------------------------------------------------------- /_files/JetBrainsMonoNerdFontPropo-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fnando/dotfiles/74c14ad646669d9bb4c9d4153cf034025da04192/_files/JetBrainsMonoNerdFontPropo-Medium.ttf -------------------------------------------------------------------------------- /_files/fnando.itermexport: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fnando/dotfiles/74c14ad646669d9bb4c9d4153cf034025da04192/_files/fnando.itermexport -------------------------------------------------------------------------------- /_files/fnando.itermkeymap: -------------------------------------------------------------------------------- 1 | { 2 | "Touch Bar Items": [], 3 | "Key Mappings": { 4 | "0xf728-0x80000": { 5 | "Action": 10, 6 | "Text": "d" 7 | }, 8 | "0xf702-0x280000": { 9 | "Action": 10, 10 | "Text": "b" 11 | }, 12 | "0xf70d-0x20000": { 13 | "Action": 10, 14 | "Text": "[21;2~" 15 | }, 16 | "0x7f-0x80000": { 17 | "Action": 11, 18 | "Text": "0x1b 0x7f" 19 | }, 20 | "0xf708-0x20000": { 21 | "Action": 10, 22 | "Text": "[15;2~" 23 | }, 24 | "0x33-0x40000": { 25 | "Action": 11, 26 | "Text": "0x1b" 27 | }, 28 | "0xf703-0x260000": { 29 | "Action": 10, 30 | "Text": "[1;6C" 31 | }, 32 | "0xf729-0x20000": { 33 | "Action": 10, 34 | "Text": "[1;2H" 35 | }, 36 | "0xf702-0x260000": { 37 | "Action": 10, 38 | "Text": "[1;6D" 39 | }, 40 | "0x38-0x40000": { 41 | "Action": 11, 42 | "Text": "0x7f" 43 | }, 44 | "0xf72b-0x40000": { 45 | "Action": 10, 46 | "Text": "[1;5F" 47 | }, 48 | "0xf70c-0x20000": { 49 | "Action": 10, 50 | "Text": "[20;2~" 51 | }, 52 | "0xf701-0x260000": { 53 | "Action": 10, 54 | "Text": "[1;6B" 55 | }, 56 | "0x32-0x40000": { 57 | "Action": 11, 58 | "Text": "0x00" 59 | }, 60 | "0xf707-0x20000": { 61 | "Action": 10, 62 | "Text": "[1;2S" 63 | }, 64 | "0xf703-0x240000": { 65 | "Text": "f", 66 | "Action": 10 67 | }, 68 | "0xf700-0x260000": { 69 | "Action": 10, 70 | "Text": "[1;6A" 71 | }, 72 | "0xf702-0x240000": { 73 | "Text": "b", 74 | "Action": 10 75 | }, 76 | "0xf703-0x300000": { 77 | "Action": 11, 78 | "Text": "0x5" 79 | }, 80 | "0x37-0x40000": { 81 | "Action": 11, 82 | "Text": "0x1f" 83 | }, 84 | "0x3-0x200000": { 85 | "Action": 11, 86 | "Text": "0xd" 87 | }, 88 | "0xf701-0x240000": { 89 | "Action": 10, 90 | "Text": "[1;5B" 91 | }, 92 | "0xf702-0x300000": { 93 | "Action": 11, 94 | "Text": "0x1" 95 | }, 96 | "0xf703-0x220000": { 97 | "Action": 10, 98 | "Text": "[1;2C" 99 | }, 100 | "0xf739-0x0": { 101 | "Action": 13, 102 | "Text": "" 103 | }, 104 | "0xf70b-0x20000": { 105 | "Action": 10, 106 | "Text": "[19;2~" 107 | }, 108 | "0xf728-0x0": { 109 | "Action": 11, 110 | "Text": "0x4" 111 | }, 112 | "0xf706-0x20000": { 113 | "Action": 10, 114 | "Text": "[1;2R" 115 | }, 116 | "0xf700-0x240000": { 117 | "Action": 10, 118 | "Text": "[1;5A" 119 | }, 120 | "0xf702-0x220000": { 121 | "Action": 10, 122 | "Text": "[1;2D" 123 | }, 124 | "0x36-0x40000": { 125 | "Action": 11, 126 | "Text": "0x1e" 127 | }, 128 | "0xf70f-0x20000": { 129 | "Action": 10, 130 | "Text": "[24;2~" 131 | }, 132 | "0xf701-0x220000": { 133 | "Action": 10, 134 | "Text": "[1;2B" 135 | }, 136 | "0xf70a-0x20000": { 137 | "Action": 10, 138 | "Text": "[18;2~" 139 | }, 140 | "0xf729-0x40000": { 141 | "Action": 10, 142 | "Text": "[1;5H" 143 | }, 144 | "0xf72b-0x20000": { 145 | "Action": 10, 146 | "Text": "[1;2F" 147 | }, 148 | "0xf700-0x220000": { 149 | "Action": 10, 150 | "Text": "[1;2A" 151 | }, 152 | "0x30-0x200000": { 153 | "Action": 12, 154 | "Text": "0" 155 | }, 156 | "0xf705-0x20000": { 157 | "Action": 10, 158 | "Text": "[1;2Q" 159 | }, 160 | "0x31-0x200000": { 161 | "Action": 12, 162 | "Text": "1" 163 | }, 164 | "0x33-0x200000": { 165 | "Action": 12, 166 | "Text": "3" 167 | }, 168 | "0x35-0x40000": { 169 | "Action": 11, 170 | "Text": "0x1d" 171 | }, 172 | "0x34-0x200000": { 173 | "Action": 12, 174 | "Text": "4" 175 | }, 176 | "0x32-0x200000": { 177 | "Action": 12, 178 | "Text": "2" 179 | }, 180 | "0x35-0x200000": { 181 | "Action": 12, 182 | "Text": "5" 183 | }, 184 | "0x36-0x200000": { 185 | "Action": 12, 186 | "Text": "6" 187 | }, 188 | "0x37-0x200000": { 189 | "Action": 12, 190 | "Text": "7" 191 | }, 192 | "0x2d-0x40000": { 193 | "Action": 11, 194 | "Text": "0x1f" 195 | }, 196 | "0x38-0x200000": { 197 | "Action": 12, 198 | "Text": "8" 199 | }, 200 | "0x2a-0x200000": { 201 | "Action": 12, 202 | "Text": "*" 203 | }, 204 | "0x39-0x200000": { 205 | "Action": 12, 206 | "Text": "9" 207 | }, 208 | "0x2b-0x200000": { 209 | "Action": 12, 210 | "Text": "+" 211 | }, 212 | "0xf70e-0x20000": { 213 | "Action": 10, 214 | "Text": "[23;2~" 215 | }, 216 | "0x2e-0x200000": { 217 | "Action": 12, 218 | "Text": "." 219 | }, 220 | "0x2d-0x200000": { 221 | "Action": 12, 222 | "Text": "-" 223 | }, 224 | "0xf709-0x20000": { 225 | "Action": 10, 226 | "Text": "[17;2~" 227 | }, 228 | "0x7f-0x100000": { 229 | "Action": 11, 230 | "Text": "0x15" 231 | }, 232 | "0x2f-0x200000": { 233 | "Action": 12, 234 | "Text": "/" 235 | }, 236 | "0xf704-0x20000": { 237 | "Action": 10, 238 | "Text": "[1;2P" 239 | }, 240 | "0x34-0x40000": { 241 | "Action": 11, 242 | "Text": "0x1c" 243 | }, 244 | "0xf703-0x280000": { 245 | "Action": 10, 246 | "Text": "f" 247 | } 248 | } 249 | } 250 | 251 | -------------------------------------------------------------------------------- /_files/fnando.terminal: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ANSIBlackColor 6 | 7 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 8 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 9 | LjEzMzMzMzMzMzMgMC4xMzMzMzMzMzMzIDAuMTMzMzMzMzMzMwAQAYAC0hAREhNaJGNs 10 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 11 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 12 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 13 | 14 | ANSIBlueColor 15 | 16 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 17 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 18 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECcwLjIwNjE3NDMx 19 | NCAwLjQ3OTM5NzQ0NTkgMC41NTg5OTIzMjYzIDFPECUwLjE2NDc1MTQxMDUgMC40MDQ0 20 | MjE3NDY3IDAuNDg1MzgwNTkAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF0hoN 21 | GxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABh 22 | Y3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAA 23 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAAB 24 | UAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAA 25 | ABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2 26 | dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNo 27 | AAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAA 28 | AENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA 29 | AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIu 30 | MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 31 | WFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABv 32 | ogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rl 33 | c2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRw 34 | Oi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 35 | AAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91 36 | ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdC 37 | IGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAA 38 | AAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAA 39 | AAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEA 40 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAE 41 | EwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAA 42 | AAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZ 43 | AB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA 44 | mgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEf 45 | ASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB 46 | 2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLB 47 | AssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD 48 | 7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJ 49 | BVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG 50 | 9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjS 51 | COcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvML 52 | CwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10 53 | DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQ 54 | QxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxND 55 | E2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8W 56 | shbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpR 57 | GncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAe 58 | ah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKv 59 | It0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kn 60 | eierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxu 61 | LKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox 62 | 8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec 63 | N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE9 64 | 4D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RH 65 | RIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxL 66 | U0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8 67 | UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4Wgda 68 | VlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJ 69 | Ypxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q 70 | 92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4 71 | dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9 72 | QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobX 73 | hzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaR 74 | P5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuv 75 | nByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum 76 | /adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJL 77 | ssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+ 78 | hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3 79 | yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX 80 | 4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T8 81 | 5YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozz 82 | GfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+ABNIe 83 | HyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRhWE5T 84 | T2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05TQ29s 85 | b3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcAPwBF 86 | AFAAXQBjAHAAhQCMALYA3gDgAOIA5ADrAPAA9gD4APoA/AEBAQkNVQ1XDVwNZw1wDX4N 87 | gg2JDZINlw2kDacNtA25DcENxA3WDdkN3gAAAAAAAAIBAAAAAAAAAC8AAAAAAAAAAAAA 88 | AAAAAA3g 89 | 90 | ANSIBrightBlackColor 91 | 92 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 93 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 94 | LjEzMzMzMzMzMzMgMC4xMzMzMzMzMzMzIDAuMTMzMzMzMzMzMwAQAYAC0hAREhNaJGNs 95 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 96 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 97 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 98 | 99 | ANSIBrightBlueColor 100 | 101 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 102 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 103 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECcwLjIwNjE3NDMx 104 | NCAwLjQ3OTM5NzQ0NTkgMC41NTg5OTIzMjYzIDFPECUwLjE2NDc1MTQxMDUgMC40MDQ0 105 | MjE3NDY3IDAuNDg1MzgwNTkAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF0hoN 106 | GxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABh 107 | Y3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAA 108 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAAB 109 | UAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAA 110 | ABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2 111 | dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNo 112 | AAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAA 113 | AENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA 114 | AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIu 115 | MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 116 | WFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABv 117 | ogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rl 118 | c2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRw 119 | Oi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 120 | AAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91 121 | ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdC 122 | IGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAA 123 | AAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAA 124 | AAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEA 125 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAE 126 | EwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAA 127 | AAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZ 128 | AB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA 129 | mgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEf 130 | ASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB 131 | 2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLB 132 | AssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD 133 | 7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJ 134 | BVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG 135 | 9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjS 136 | COcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvML 137 | CwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10 138 | DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQ 139 | QxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxND 140 | E2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8W 141 | shbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpR 142 | GncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAe 143 | ah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKv 144 | It0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kn 145 | eierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxu 146 | LKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox 147 | 8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec 148 | N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE9 149 | 4D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RH 150 | RIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxL 151 | U0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8 152 | UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4Wgda 153 | VlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJ 154 | Ypxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q 155 | 92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4 156 | dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9 157 | QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobX 158 | hzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaR 159 | P5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuv 160 | nByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum 161 | /adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJL 162 | ssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+ 163 | hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3 164 | yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX 165 | 4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T8 166 | 5YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozz 167 | GfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+ABNIe 168 | HyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRhWE5T 169 | T2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05TQ29s 170 | b3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcAPwBF 171 | AFAAXQBjAHAAhQCMALYA3gDgAOIA5ADrAPAA9gD4APoA/AEBAQkNVQ1XDVwNZw1wDX4N 172 | gg2JDZINlw2kDacNtA25DcENxA3WDdkN3gAAAAAAAAIBAAAAAAAAAC8AAAAAAAAAAAAA 173 | AAAAAA3g 174 | 175 | ANSIBrightGreenColor 176 | 177 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 178 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 179 | LjI2NjY2NjY2NjcgMC40MzEzNzI1NDkgMC4wNzg0MzEzNzI1NQAQAYAC0hAREhNaJGNs 180 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 181 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 182 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 183 | 184 | ANSIBrightMagentaColor 185 | 186 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 187 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPEBsw 188 | LjQwMDAwMDAwNiAwIDAuNTUyOTQxMjAzMQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xh 189 | c3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SA 190 | AQgRGiMtMjc7QUhOW2KAgoSJlJ2lqLHDxssAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAA 191 | AAAAAAAAzQ== 192 | 193 | ANSIBrightRedColor 194 | 195 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 196 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw 197 | Ljg5NDExNzY1MzQgMC4xODAzOTIxNjEgMC4xNDExNzY0NzcxABABgALSEBESE1okY2xh 198 | c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 199 | ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA 200 | ABkAAAAAAAAAAAAAAAAAAADY 201 | 202 | ANSIBrightWhiteColor 203 | 204 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 205 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 206 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjc0NDI2OTg3 207 | MjEgMC43NDQyNjk4NzIxIDAuNzQ0MjY5ODcyMSAxTxAnMC42OTA2NDc2MDIxIDAuNjkw 208 | NjI2OTE5MyAwLjY5MDYzODYwMTgAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF 209 | 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx 210 | AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA 211 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 212 | AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC 213 | GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA 214 | AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 215 | ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 216 | AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz 217 | YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 218 | LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 219 | AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA 220 | AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 221 | z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo 222 | dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 223 | AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv 224 | bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg 225 | UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA 226 | AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA 227 | AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y 228 | LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt 229 | zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA 230 | AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A 231 | FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ 232 | AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB 233 | GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ 234 | AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC 235 | tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT 236 | A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF 237 | OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR 238 | BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI 239 | vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc 240 | CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN 241 | Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ 242 | ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT 243 | IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs 244 | Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa 245 | KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W 246 | HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi 247 | giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY 248 | J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs 249 | OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC 250 | Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 251 | YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h 252 | PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE 253 | A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE 254 | SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS 255 | MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 256 | WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh 257 | 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI 258 | ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz 259 | XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB 260 | fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G 261 | cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu 262 | kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb 263 | QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa 264 | poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx 265 | 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P 266 | vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK 267 | OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY 268 | 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk 269 | c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ 270 | 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A 271 | BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh 272 | WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T 273 | Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA 274 | PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z 275 | DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA 276 | AAAAAAAAAA3j 277 | 278 | ANSIBrightYellowColor 279 | 280 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 281 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECkw 282 | Ljk3NjQ3MDY0OTIgMC42ODIzNTI5NjAxIDAuMDA3ODQzMTM3NzE5ABACgALSEBESE1ok 283 | Y2xhc3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJj 284 | aGl2ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYo6Qkpeiq7O2v9HU2QAAAAAAAAEBAAAA 285 | AAAAABkAAAAAAAAAAAAAAAAAAADb 286 | 287 | ANSIGreenColor 288 | 289 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 290 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 291 | LjI2NjY2NjY2NjcgMC40MzEzNzI1NDkgMC4wNzg0MzEzNzI1NQAQAYAC0hAREhNaJGNs 292 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 293 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 294 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 295 | 296 | ANSIMagentaColor 297 | 298 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 299 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPEBsw 300 | LjQwMDAwMDAwNiAwIDAuNTUyOTQxMjAzMQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xh 301 | c3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SA 302 | AQgRGiMtMjc7QUhOW2KAgoSJlJ2lqLHDxssAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAA 303 | AAAAAAAAzQ== 304 | 305 | ANSIRedColor 306 | 307 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 308 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw 309 | Ljg5NDExNzY1MzQgMC4xODAzOTIxNjEgMC4xNDExNzY0NzcxABABgALSEBESE1okY2xh 310 | c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2 311 | ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA 312 | ABkAAAAAAAAAAAAAAAAAAADY 313 | 314 | ANSIWhiteColor 315 | 316 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 317 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T 318 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjYyMzA1ODgw 319 | NDYgMC42MjMwNTg4MDQ2IDAuNjIzMDU4ODA0NiAxTxAnMC41NTQ2NTM0MDYxIDAuNTU0 320 | NjM2ODk1NyAwLjU1NDY0NjI1MzYAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF 321 | 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx 322 | AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA 323 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0 324 | AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC 325 | GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA 326 | AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0 327 | ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0 328 | AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz 329 | YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2 330 | LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 331 | AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA 332 | AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2 333 | z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo 334 | dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 335 | AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv 336 | bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg 337 | UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA 338 | AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA 339 | AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y 340 | LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt 341 | zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA 342 | AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A 343 | FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ 344 | AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB 345 | GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ 346 | AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC 347 | tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT 348 | A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF 349 | OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR 350 | BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI 351 | vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc 352 | CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN 353 | Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ 354 | ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT 355 | IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs 356 | Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa 357 | KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W 358 | HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi 359 | giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY 360 | J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs 361 | OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC 362 | Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3 363 | YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h 364 | PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE 365 | A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE 366 | SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS 367 | MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4 368 | WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh 369 | 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI 370 | ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz 371 | XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB 372 | fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G 373 | cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu 374 | kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb 375 | QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa 376 | poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx 377 | 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P 378 | vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK 379 | OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY 380 | 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk 381 | c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/ 382 | 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A 383 | BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh 384 | WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T 385 | Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA 386 | PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z 387 | DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA 388 | AAAAAAAAAA3j 389 | 390 | ANSIYellowColor 391 | 392 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 393 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECkw 394 | Ljk3NjQ3MDY0OTIgMC42ODIzNTI5NjAxIDAuMDA3ODQzMTM3NzE5ABACgALSEBESE1ok 395 | Y2xhc3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJj 396 | aGl2ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYo6Qkpeiq7O2v9HU2QAAAAAAAAEBAAAA 397 | AAAAABkAAAAAAAAAAAAAAAAAAADb 398 | 399 | Bell 400 | 401 | BellBounceCritical 402 | 403 | BlinkText 404 | 405 | CursorBlink 406 | 407 | CursorColor 408 | 409 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 410 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 411 | LjMwNzUwNjYzMzMgMC4zMDc1MDY2MzMzIDAuMzA3NTA2NjMzMwAQAYAC0hAREhNaJGNs 412 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 413 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 414 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 415 | 416 | CursorType 417 | 0 418 | DisableANSIColor 419 | 420 | EscapeNonASCIICharacters 421 | 422 | Font 423 | 424 | YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 425 | AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs 426 | YXNzI0AwAAAAAAAAEBCAAoADXxAcSGFja05lcmRGb250Q29tcGxldGUtUmVndWxhctIT 427 | FBUWWiRjbGFzc25hbWVYJGNsYXNzZXNWTlNGb250ohUXWE5TT2JqZWN0XxAPTlNLZXll 428 | ZEFyY2hpdmVy0RobVHJvb3SAAQgRGiMtMjc8QktSW2JpcnR2eJecp7C3usPV2N0AAAAA 429 | AAABAQAAAAAAAAAcAAAAAAAAAAAAAAAAAAAA3w== 430 | 431 | FontAntialias 432 | 433 | FontHeightSpacing 434 | 1.2 435 | FontWidthSpacing 436 | 1 437 | Linewrap 438 | 439 | ProfileCurrentVersion 440 | 2.0600000000000001 441 | ShowActiveProcessArgumentsInTitle 442 | 443 | ShowActiveProcessInTabTitle 444 | 445 | ShowActiveProcessInTitle 446 | 447 | ShowCommandKeyInTitle 448 | 449 | ShowComponentsWhenTabHasCustomTitle 450 | 451 | ShowDimensionsInTitle 452 | 453 | ShowRepresentedURLPathInTitle 454 | 455 | ShowShellCommandInTitle 456 | 457 | ShowWindowSettingsNameInTitle 458 | 459 | TextBoldColor 460 | 461 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 462 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 463 | LjEzMzMzMzMzMzMgMC4xMzMzMzMzMzMzIDAuMTMzMzMzMzMzMwAQAYAC0hAREhNaJGNs 464 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 465 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 466 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 467 | 468 | TextColor 469 | 470 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS 471 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw 472 | LjEzMzMzMzMzMzMgMC4xMzMzMzMzMzMzIDAuMTMzMzMzMzMzMwAQAYAC0hAREhNaJGNs 473 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp 474 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA 475 | AAAZAAAAAAAAAAAAAAAAAAAA2Q== 476 | 477 | UseBoldFonts 478 | 479 | UseBrightBold 480 | 481 | VisualBell 482 | 483 | WindowTitle 484 | Terminal 485 | columnCount 486 | 191 487 | keyMapBoundKeys 488 | 489 | $F708 490 | [25~ 491 | $F709 492 | [26~ 493 | $F70A 494 | [28~ 495 | $F70B 496 | [29~ 497 | $F70C 498 | [31~ 499 | $F70D 500 | [22~ 501 | $F70E 502 | [33~ 503 | $F70F 504 | [34~ 505 | F704 506 | OP 507 | F705 508 | OQ 509 | F706 510 | OR 511 | F707 512 | OS 513 | F708 514 | [15~ 515 | F709 516 | [17~ 517 | F70A 518 | [18~ 519 | F70B 520 | [19~ 521 | F70C 522 | [20~ 523 | F70D 524 | [21~ 525 | F70E 526 | [23~ 527 | F70F 528 | [24~ 529 | F710 530 | [25~ 531 | F711 532 | [26~ 533 | F712 534 | [28~ 535 | F713 536 | [29~ 537 | F714 538 | [31~ 539 | F715 540 | [32~ 541 | F716 542 | [33~ 543 | F717 544 | [34~ 545 | F728 546 | [3~ 547 | ^F702 548 | b 549 | ^F703 550 | f 551 | ~F702 552 | b 553 | ~F703 554 | f 555 | ~F704 556 | [17~ 557 | ~F705 558 | [18~ 559 | ~F706 560 | [19~ 561 | ~F707 562 | [20~ 563 | ~F708 564 | [21~ 565 | ~F709 566 | [23~ 567 | ~F70A 568 | [24~ 569 | ~F70B 570 | [25~ 571 | ~F70C 572 | [26~ 573 | ~F70D 574 | [28~ 575 | ~F70E 576 | [29~ 577 | ~F70F 578 | [31~ 579 | ~F710 580 | [32~ 581 | ~F711 582 | [33~ 583 | ~F712 584 | [34~ 585 | 586 | name 587 | fnando 588 | rowCount 589 | 44 590 | type 591 | Window Settings 592 | 593 | 594 | -------------------------------------------------------------------------------- /_files/macOS.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Disable menu bar transparency 4 | defaults write NSGlobalDomain AppleEnableMenuBarTransparency -bool false 5 | 6 | # Show remaining battery time; hide percentage 7 | defaults write com.apple.menuextra.battery ShowPercent -string "NO" 8 | defaults write com.apple.menuextra.battery ShowTime -string "YES" 9 | 10 | # Increase window resize speed for Cocoa applications 11 | defaults write NSGlobalDomain NSWindowResizeTime -float 0.001 12 | 13 | # Enable subpixel font rendering on non-Apple LCDs 14 | defaults write NSGlobalDomain AppleFontSmoothing -int 2 15 | 16 | # Show all filename extensions in Finder 17 | defaults write NSGlobalDomain AppleShowAllExtensions -bool true 18 | 19 | # Allow text selection in Quick Look 20 | defaults write com.apple.finder QLEnableTextSelection -bool true 21 | 22 | # Show item info below desktop icons 23 | /usr/libexec/PlistBuddy -c "Set :DesktopViewSettings:IconViewSettings:showItemInfo true" ~/Library/Preferences/com.apple.finder.plist 24 | 25 | # Enable snap-to-grid for desktop icons 26 | /usr/libexec/PlistBuddy -c "Set :DesktopViewSettings:IconViewSettings:arrangeBy grid" ~/Library/Preferences/com.apple.finder.plist 27 | 28 | # Expand save panel by default 29 | defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true 30 | defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode2 -bool true 31 | 32 | # Expand print panel by default 33 | defaults write NSGlobalDomain PMPrintingExpandedStateForPrint -bool true 34 | defaults write NSGlobalDomain PMPrintingExpandedStateForPrint2 -bool true 35 | 36 | # Automatically quit printer app once the print jobs complete 37 | defaults write com.apple.print.PrintingPrefs "Quit When Finished" -bool true 38 | 39 | # Disable the “Are you sure you want to open this application?” dialog 40 | defaults write com.apple.LaunchServices LSQuarantine -bool false 41 | 42 | # Check for software updates daily, not just once per week 43 | defaults write com.apple.SoftwareUpdate ScheduleFrequency -int 1 44 | 45 | # Trackpad: enable tap to click for this user and for the login screen 46 | defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true 47 | defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1 48 | defaults write NSGlobalDomain com.apple.mouse.tapBehavior -int 1 49 | 50 | # Set up trackpad behavior. 51 | defaults write com.apple.AppleMultitouchTrackpad Clicking -int 1 52 | defaults write com.apple.AppleMultitouchTrackpad DragLock -int 0 53 | defaults write com.apple.AppleMultitouchTrackpad Dragging -int 1 54 | 55 | # Set mouse speed. 56 | defaults write -g com.apple.mouse.scaling 2 57 | 58 | # Disable shake mouse pointer to locate. 59 | defaults write -g CGDisableCursorLocationMagnification -int 1 60 | 61 | # Increase sound quality for Bluetooth headphones/headsets 62 | defaults write com.apple.BluetoothAudioAgent "Apple Bitpool Max (editable)" -int 80 63 | defaults write com.apple.BluetoothAudioAgent "Apple Bitpool Min (editable)" -int 80 64 | defaults write com.apple.BluetoothAudioAgent "Apple Initial Bitpool (editable)" -int 80 65 | defaults write com.apple.BluetoothAudioAgent "Apple Initial Bitpool Min (editable)" -int 80 66 | defaults write com.apple.BluetoothAudioAgent "Negotiated Bitpool" -int 80 67 | defaults write com.apple.BluetoothAudioAgent "Negotiated Bitpool Max" -int 80 68 | defaults write com.apple.BluetoothAudioAgent "Negotiated Bitpool Min" -int 80 69 | 70 | # Enable full keyboard access for all controls 71 | # (e.g. enable Tab in modal dialogs) 72 | defaults write NSGlobalDomain AppleKeyboardUIMode -int 3 73 | 74 | # Faster key repetition 75 | defaults write NSGlobalDomain InitialKeyRepeat -int 15 76 | defaults write NSGlobalDomain KeyRepeat -int 2 77 | 78 | # Disable press-and-hold for keys in favor of key repeat 79 | defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false 80 | 81 | # Set language and text formats 82 | # Note: if you’re in the US, replace `EUR` with `USD`, `Centimeters` with 83 | # `Inches`, `en_GB` with `en_US`, and `true` with `false`. 84 | defaults write NSGlobalDomain AppleLanguages -array "en" "pt-BR" 85 | defaults write NSGlobalDomain AppleLocale -string "en_CA@currency=CAD" 86 | defaults write NSGlobalDomain AppleMeasurementUnits -string "Centimeters" 87 | defaults write NSGlobalDomain AppleMetricUnits -bool true 88 | 89 | # Disable auto-correct 90 | defaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false 91 | 92 | # Disables auto capitalization 93 | defaults write NSGlobalDomain NSAutomaticCapitalizationEnabled -bool false 94 | 95 | # Disables "smart" dashes 96 | defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false 97 | 98 | # Disables automatic period substitutions 99 | defaults write NSGlobalDomain NSAutomaticPeriodSubstitutionEnabled -bool false 100 | 101 | # Disables smart quotes 102 | defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false 103 | 104 | # Require password immediately after sleep or screen saver begins 105 | defaults write com.apple.screensaver askForPassword -int 1 106 | defaults write com.apple.screensaver askForPasswordDelay -int 0 107 | 108 | # Save screenshots in PNG format (other options: BMP, GIF, JPG, PDF, TIFF) 109 | defaults write com.apple.screencapture type -string "png" 110 | 111 | # Save screenshots to downloads folder. 112 | defaults write com.apple.screencapture location -string "${HOME}/Downloads" 113 | 114 | # allow quitting Finder via ⌘ + Q; doing so will also hide desktop icons 115 | defaults write com.apple.finder QuitMenuItem -bool false 116 | 117 | # Disable window animations and Get Info animations 118 | defaults write com.apple.finder DisableAllAnimations -bool true 119 | 120 | # Disable shadow in screenshots 121 | defaults write com.apple.screencapture disable-shadow -bool true 122 | 123 | # Set default Finder path. 124 | # For desktop, use `PfDe`. 125 | # For other paths, use `PfLo` and `file:///full/path/here/` 126 | defaults write com.apple.finder NewWindowTarget -string "PfHm" 127 | defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}/" 128 | 129 | # Show icons for hard drives, servers, and removable media on the desktop 130 | defaults write com.apple.finder ShowExternalHardDrivesOnDesktop -bool true 131 | defaults write com.apple.finder ShowHardDrivesOnDesktop -bool false 132 | defaults write com.apple.finder ShowMountedServersOnDesktop -bool true 133 | defaults write com.apple.finder ShowRemovableMediaOnDesktop -bool true 134 | 135 | # Show all filename extensions 136 | defaults write NSGlobalDomain AppleShowAllExtensions -bool true 137 | 138 | # Show status bar on Finder 139 | defaults write com.apple.finder ShowStatusBar -bool true 140 | 141 | # Show path bar on Finder 142 | defaults write com.apple.finder ShowPathbar -bool true 143 | 144 | # Show sidebar on Finder 145 | defaults write com.apple.finder ShowSidebar -bool true 146 | 147 | # Display full POSIX path as Finder window title 148 | defaults write com.apple.finder _FXShowPosixPathInTitle -bool true 149 | 150 | # When performing a search, search the current folder by default 151 | defaults write com.apple.finder FXDefaultSearchScope -string "SCcf" 152 | 153 | # Disable the warning when changing a file extension 154 | defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false 155 | 156 | # Group files by name 157 | defaults write com.apple.finder FXPreferredGroupBy -string "Name" 158 | 159 | # Enable spring loading for directories 160 | defaults write NSGlobalDomain com.apple.springing.enabled -bool true 161 | 162 | # Remove the spring loading delay for directories 163 | defaults write NSGlobalDomain com.apple.springing.delay -float 0 164 | 165 | # Avoid creating .DS_Store files on network volumes 166 | defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true 167 | 168 | # Disable disk image verification 169 | defaults write com.apple.frameworks.diskimages skip-verify -bool true 170 | defaults write com.apple.frameworks.diskimages skip-verify-locked -bool true 171 | defaults write com.apple.frameworks.diskimages skip-verify-remote -bool true 172 | 173 | # Automatically open a new Finder window when a volume is mounted 174 | defaults write com.apple.frameworks.diskimages auto-open-ro-root -bool true 175 | defaults write com.apple.frameworks.diskimages auto-open-rw-root -bool true 176 | defaults write com.apple.finder OpenWindowForNewRemovableDisk -bool true 177 | 178 | # Use list view in all Finder windows by default 179 | # Four-letter codes for the other view modes: `icnv`, `clmv`, `Flwv` 180 | defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv" 181 | 182 | # Disable the warning before emptying the Trash 183 | defaults write com.apple.finder WarnOnEmptyTrash -bool false 184 | 185 | # Empty Trash securely by default 186 | defaults write com.apple.finder EmptyTrashSecurely -bool true 187 | 188 | # Show the ~/Library folder 189 | chflags nohidden ~/Library 190 | 191 | # Expand the following File Info panes: 192 | # “General”, “Open with”, and “Sharing & Permissions” 193 | defaults write com.apple.finder FXInfoPanesExpanded -dict \ 194 | General -bool true \ 195 | OpenWith -bool true \ 196 | Privileges -bool true 197 | 198 | # Enable highlight hover effect for the grid view of a stack (Dock) 199 | defaults write com.apple.dock mouse-over-hilite-stack -bool true 200 | 201 | # Set the icon size of Dock items to 36 pixels 202 | defaults write com.apple.dock tilesize -int 36 203 | 204 | # Change minimize/maximize window effect 205 | defaults write com.apple.dock mineffect -string "scale" 206 | 207 | # Minimize windows into their application’s icon 208 | defaults write com.apple.dock minimize-to-application -bool true 209 | 210 | # Enable spring loading for all Dock items 211 | defaults write com.apple.dock enable-spring-load-actions-on-all-items -bool true 212 | 213 | # Show indicator lights for open applications in the Dock 214 | defaults write com.apple.dock show-process-indicators -bool true 215 | 216 | # Disable Dashboard 217 | defaults write com.apple.dashboard mcx-disabled -bool true 218 | 219 | # Don’t show Dashboard as a Space 220 | defaults write com.apple.dock dashboard-in-overlay -bool true 221 | 222 | # Don’t automatically rearrange Spaces based on most recent use 223 | defaults write com.apple.dock mru-spaces -bool false 224 | 225 | # Automatically hide and show the Dock 226 | defaults write com.apple.dock autohide -bool true 227 | 228 | # Remove the auto-hiding Dock delay 229 | defaults write com.apple.dock autohide-delay -float 0 230 | 231 | # Use Dock on the left 232 | defaults write com.apple.dock orientation -string "left" 233 | 234 | # Enable the 2D Dock 235 | defaults write com.apple.dock no-glass -bool true 236 | 237 | # Set Dock zoom size 238 | defaults write com.apple.dock magnification -int 1 239 | 240 | # Remove the animation when hiding/showing the Dock 241 | defaults write com.apple.dock autohide-time-modifier -float 0 242 | 243 | # Press Tab to highlight each item on a web page 244 | defaults write com.apple.Safari WebKitTabToLinksPreferenceKey -bool true 245 | defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2TabsToLinks -bool true 246 | 247 | # Tell Safari to open new window links in tabs 248 | defaults write com.apple.Safari TargetedClicksCreateTabs -bool true 249 | 250 | # Reduce delay when rendering pages 251 | defaults write com.apple.Safari WebKitInitialTimedLayoutDelay 0.1 252 | 253 | # Show the full URL in the address bar (note: this still hides the scheme) 254 | defaults write com.apple.Safari ShowFullURLInSmartSearchField -bool true 255 | 256 | # Disable Safari's AutoFill. 257 | defaults write com.apple.Safari AutoFillFromAddressBook -bool false 258 | defaults write com.apple.Safari AutoFillPasswords -bool false 259 | defaults write com.apple.Safari AutoFillCreditCardData -bool false 260 | defaults write com.apple.Safari AutoFillMiscellaneousForms -bool false 261 | 262 | # Set Safari’s home page to `about:blank` for faster loading 263 | defaults write com.apple.Safari HomePage -string "about:blank" 264 | 265 | # Prevent Safari from opening ‘safe’ files automatically after downloading 266 | defaults write com.apple.Safari AutoOpenSafeDownloads -bool false 267 | 268 | # Allow hitting the Backspace key to go to the previous page in history 269 | defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2BackspaceKeyNavigationEnabled -bool false 270 | 271 | # Hide Safari’s bookmarks bar by default 272 | defaults write com.apple.Safari ShowFavoritesBar -bool false 273 | 274 | # Hide Safari’s sidebar in Top Sites 275 | defaults write com.apple.Safari ShowSidebarInTopSites -bool false 276 | 277 | # Disable Safari’s thumbnail cache for History and Top Sites 278 | defaults write com.apple.Safari DebugSnapshotsUpdatePolicy -int 2 279 | 280 | # Enable Safari’s debug menu 281 | defaults write com.apple.Safari IncludeInternalDebugMenu -bool true 282 | 283 | # Make Safari’s search banners default to Contains instead of Starts With 284 | defaults write com.apple.Safari FindOnPageMatchesWordStartsOnly -bool false 285 | 286 | # Remove useless icons from Safari’s bookmarks bar 287 | defaults write com.apple.Safari ProxiesInBookmarksBar "()" 288 | 289 | # Enable the Develop menu and the Web Inspector in Safari 290 | defaults write com.apple.Safari IncludeDevelopMenu -bool true 291 | defaults write com.apple.Safari WebKitDeveloperExtrasEnabledPreferenceKey -bool true 292 | defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2DeveloperExtrasEnabled -bool true 293 | 294 | # Add a context menu item for showing the Web Inspector in web views 295 | defaults write NSGlobalDomain WebKitDeveloperExtras -bool true 296 | 297 | # Copy email addresses as `foo@example.com` instead of `Foo Bar ` in Mail.app 298 | defaults write com.apple.mail AddressesIncludeNameOnPasteboard -bool false 299 | 300 | # Add the keyboard shortcut ⌘ + Enter to send an email in Mail.app 301 | defaults write com.apple.mail NSUserKeyEquivalents -dict-add "Send" -string "@\\U21a9" 302 | 303 | # Add ⌘ + D to archive messages 304 | defaults write com.apple.mail NSUserKeyEquivalents -dict-add "Archive" -string "@d" 305 | 306 | # Display emails in threaded mode, sorted by date (oldest at the top) 307 | defaults write com.apple.mail DraftsViewerAttributes -dict-add "DisplayInThreadedMode" -string "yes" 308 | defaults write com.apple.mail DraftsViewerAttributes -dict-add "SortedDescending" -string "yes" 309 | defaults write com.apple.mail DraftsViewerAttributes -dict-add "SortOrder" -string "received-date" 310 | 311 | # Disable inline attachments (just show the icons) 312 | defaults write com.apple.mail DisableInlineAttachmentViewing -bool true 313 | 314 | # Disable automatic spell checking 315 | defaults write com.apple.mail SpellCheckingBehavior -string "NoSpellCheckingEnabled" 316 | 317 | # Sort messages in thread from oldest to newest 318 | defaults write com.apple.mail ConversationViewSortDescending -int 0 319 | 320 | # Disable contact photos 321 | defaults write com.apple.mail EnableContactPhotos -int 0 322 | 323 | # Only use UTF-8 in Terminal.app 324 | defaults write com.apple.terminal StringEncodings -array 4 325 | 326 | # Prevent Time Machine from prompting to use new hard drives as backup volume 327 | defaults write com.apple.TimeMachine DoNotOfferNewDisksForBackup -bool true 328 | 329 | # Show the main window when launching Activity Monitor 330 | defaults write com.apple.ActivityMonitor OpenMainWindow -bool true 331 | 332 | # Visualize CPU usage in the Activity Monitor Dock icon 333 | defaults write com.apple.ActivityMonitor IconType -int 5 334 | 335 | # Show all processes in Activity Monitor 336 | defaults write com.apple.ActivityMonitor ShowCategory -int 0 337 | 338 | # Sort Activity Monitor results by CPU usage 339 | defaults write com.apple.ActivityMonitor SortColumn -string "CPUUsage" 340 | defaults write com.apple.ActivityMonitor SortDirection -int 0 341 | 342 | # Disable automatic emoji substitution (i.e. use plain text smileys) 343 | defaults write com.apple.messageshelper.MessageController SOInputLineSettings -dict-add "automaticEmojiSubstitutionEnablediMessage" -bool false 344 | 345 | # Disable t.co urls on Tweetbot 346 | defaults write com.tapbots.TweetbotMac OpenURLsDirectly -bool true 347 | 348 | # Don't automatically open Photos.app when connecting iPhone/iTunes 349 | defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool true 350 | defaults write com.apple.iTunes dontAutomaticallySyncIPods -bool true 351 | 352 | # Disable backups on iTunes 353 | defaults write com.apple.iTunes DeviceBackupsDisabled -bool true 354 | 355 | # Disable Mission Control and Quick Note shortcuts. 356 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 118 " 357 | 358 | enabled 359 | 360 | 361 | value 362 | 363 | type 364 | standard 365 | 366 | parameters 367 | 368 | 65535 369 | 18 370 | 262144 371 | 372 | 373 | 374 | " 375 | 376 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 190 " 377 | 378 | enabled 379 | 380 | 381 | value 382 | 383 | type 384 | standard 385 | 386 | parameters 387 | 388 | 113 389 | 12 390 | 8388608 391 | 392 | 393 | 394 | " 395 | 396 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 79 " 397 | 398 | enabled 399 | 400 | 401 | value 402 | 403 | type 404 | standard 405 | 406 | parameters 407 | 408 | 65535 409 | 123 410 | 8650752 411 | 412 | 413 | 414 | " 415 | 416 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 80 " 417 | 418 | enabled 419 | 420 | 421 | value 422 | 423 | type 424 | standard 425 | 426 | parameters 427 | 428 | 65535 429 | 123 430 | 8781824 431 | 432 | 433 | 434 | " 435 | 436 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 81 " 437 | 438 | enabled 439 | 440 | 441 | value 442 | 443 | type 444 | standard 445 | 446 | parameters 447 | 448 | 65535 449 | 124 450 | 8650752 451 | 452 | 453 | 454 | " 455 | 456 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 82 " 457 | 458 | enabled 459 | 460 | 461 | value 462 | 463 | type 464 | standard 465 | 466 | parameters 467 | 468 | 65535 469 | 124 470 | 8781824 471 | 472 | 473 | 474 | " 475 | 476 | # Play feedback when volume is changed 477 | defaults write NSGlobalDomain com.apple.sound.beep.feedback -bool false 478 | 479 | # Set 1Password's Archive shortcut to cmd-d. 480 | defaults write com.agilebits.onepassword7 NSUserKeyEquivalents -dict-add "Archive" -string "@d" 481 | 482 | # Save Simulator's screenshots to ~/Downloads 483 | defaults write com.apple.iphonesimulator ScreenShotSaveLocation -string ~/Downloads 484 | 485 | echo "OSX Hacks Done. Note that some of these changes require a logout/restart to take effect." 486 | -------------------------------------------------------------------------------- /_files/timemachine.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | # This file sets exclusions for Time Machine backups. 6 | # You must run this file with `sudo timemachine.sh`. 7 | 8 | tmutil addexclusion -p /Applications 9 | tmutil addexclusion -p /Library 10 | tmutil addexclusion -p /opt/homebrew 11 | tmutil addexclusion -p /private 12 | tmutil addexclusion -p /System 13 | tmutil addexclusion -p /usr/local 14 | tmutil addexclusion -p ~/.android 15 | tmutil addexclusion -p ~/.asdf 16 | tmutil addexclusion -p ~/.bundle 17 | tmutil addexclusion -p ~/.cache 18 | tmutil addexclusion -p ~/.cocoapods 19 | tmutil addexclusion -p ~/.composer 20 | tmutil addexclusion -p ~/.electron 21 | tmutil addexclusion -p ~/.gradle 22 | tmutil addexclusion -p ~/.kerl 23 | tmutil addexclusion -p ~/.local 24 | tmutil addexclusion -p ~/.m2 25 | tmutil addexclusion -p ~/.node-gyp 26 | tmutil addexclusion -p ~/.npm 27 | tmutil addexclusion -p ~/.nvm 28 | tmutil addexclusion -p ~/.solargraph 29 | tmutil addexclusion -p ~/.vagrant.d 30 | tmutil addexclusion -p ~/.vpython-root 31 | tmutil addexclusion -p ~/.vscode 32 | tmutil addexclusion -p ~/.vscode-insiders 33 | tmutil addexclusion -p ~/Downloads 34 | tmutil addexclusion -p ~/Library/Android 35 | tmutil addexclusion -p ~/Library/Application\ Support/Adobe 36 | tmutil addexclusion -p ~/Library/Application\ Support/Bartalina 37 | tmutil addexclusion -p ~/Library/Application\ Support/Blackmagic\ Design 38 | tmutil addexclusion -p ~/Library/Application\ Support/BraveSoftware 39 | tmutil addexclusion -p ~/Library/Application\ Support/Caches 40 | tmutil addexclusion -p ~/Library/Application\ Support/CleanShot 41 | tmutil addexclusion -p ~/Library/Application\ Support/Code\ -\ Insiders 42 | tmutil addexclusion -p ~/Library/Application\ Support/com.sonos.macController 43 | tmutil addexclusion -p ~/Library/Application\ Support/com.sonos.macController2 44 | tmutil addexclusion -p ~/Library/Application\ Support/Dash 45 | tmutil addexclusion -p ~/Library/Application\ Support/discord 46 | tmutil addexclusion -p ~/Library/Application\ Support/Firefox 47 | tmutil addexclusion -p ~/Library/Application\ Support/Google 48 | tmutil addexclusion -p ~/Library/Application\ Support/Imaging\ Edge\ Desktop 49 | tmutil addexclusion -p ~/Library/Application\ Support/InVision\ Studio 50 | tmutil addexclusion -p ~/Library/Application\ Support/JetBrains 51 | tmutil addexclusion -p ~/Library/Application\ Support/Keybase 52 | tmutil addexclusion -p ~/Library/Application\ Support/Knowledge 53 | tmutil addexclusion -p ~/Library/Application\ Support/kotlin 54 | tmutil addexclusion -p ~/Library/Application\ Support/Ledger\ Live 55 | tmutil addexclusion -p ~/Library/Application\ Support/Mozilla 56 | tmutil addexclusion -p ~/Library/Application\ Support/now 57 | tmutil addexclusion -p ~/Library/Application\ Support/nwjs 58 | tmutil addexclusion -p ~/Library/Application\ Support/OpenEmu 59 | tmutil addexclusion -p ~/Library/Application\ Support/org.videolan.vlc 60 | tmutil addexclusion -p ~/Library/Application\ Support/React\ Native\ Debugger 61 | tmutil addexclusion -p ~/Library/Application\ Support/Slack 62 | tmutil addexclusion -p ~/Library/Application\ Support/Sonos 63 | tmutil addexclusion -p ~/Library/Application\ Support/SonosV2 64 | tmutil addexclusion -p ~/Library/Application\ Support/Spotify 65 | tmutil addexclusion -p ~/Library/Application\ Support/zoom.us 66 | tmutil addexclusion -p ~/Library/Caches 67 | tmutil addexclusion -p ~/Library/Containers 68 | tmutil addexclusion -p ~/Library/Detox 69 | tmutil addexclusion -p ~/Library/Developer 70 | tmutil addexclusion -p ~/Library/Group\ Containers 71 | tmutil addexclusion -p ~/Library/Logs 72 | tmutil addexclusion -p ~/Library/Java 73 | tmutil addexclusion -p ~/Library/Mail 74 | tmutil addexclusion -p ~/Library/Messages 75 | tmutil addexclusion -p ~/Library/Metadata 76 | tmutil addexclusion -p ~/Library/Mobile\ Documents 77 | tmutil addexclusion -p ~/Library/Safari 78 | tmutil addexclusion -p ~/Library/SafariTechnologyPreview 79 | tmutil addexclusion -p ~/Library/Screen\ Savers 80 | tmutil addexclusion -p ~/Library/WebKit 81 | tmutil addexclusion -p ~/Movies 82 | tmutil addexclusion -p ~/VirtualBox\ VMs 83 | tmutil addexclusion -p ~/.local/share/mise 84 | 85 | tmignore 86 | -------------------------------------------------------------------------------- /_files/windows-terminal.json: -------------------------------------------------------------------------------- 1 | { 2 | "$help": "https://aka.ms/terminal-documentation", 3 | "$schema": "https://aka.ms/terminal-profiles-schema", 4 | "actions": [ 5 | { 6 | "command": { 7 | "action": "copy", 8 | "singleLine": false 9 | }, 10 | "keys": "ctrl+c" 11 | }, 12 | { 13 | "command": "paste", 14 | "keys": "ctrl+v" 15 | }, 16 | { 17 | "command": { 18 | "action": "splitPane", 19 | "split": "auto", 20 | "splitMode": "duplicate" 21 | }, 22 | "keys": "alt+shift+d" 23 | }, 24 | { 25 | "command": "find", 26 | "keys": "ctrl+shift+f" 27 | } 28 | ], 29 | "copyFormatting": "none", 30 | "copyOnSelect": false, 31 | "defaultProfile": "{574e775e-4f2a-5b96-ac1e-a2962a402336}", 32 | "newTabMenu": [ 33 | { 34 | "type": "remainingProfiles" 35 | } 36 | ], 37 | "profiles": { 38 | "defaults": { 39 | "colorScheme": "fnando" 40 | }, 41 | "list": [ 42 | { 43 | "commandline": "%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe", 44 | "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}", 45 | "hidden": false, 46 | "name": "Windows PowerShell" 47 | }, 48 | { 49 | "commandline": "%SystemRoot%\\System32\\cmd.exe", 50 | "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}", 51 | "hidden": false, 52 | "name": "Command Prompt" 53 | }, 54 | { 55 | "colorScheme": "fnando", 56 | "font": { 57 | "cellHeight": "1.5", 58 | "face": "JetBrainsMono Nerd Font Propo", 59 | "size": 14.0, 60 | "weight": "semi-bold" 61 | }, 62 | "guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}", 63 | "hidden": false, 64 | "name": "PowerShell", 65 | "source": "Windows.Terminal.PowershellCore" 66 | }, 67 | { 68 | "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}", 69 | "hidden": false, 70 | "name": "Azure Cloud Shell", 71 | "source": "Windows.Terminal.Azure" 72 | } 73 | ] 74 | }, 75 | "schemes": [ 76 | { 77 | "background": "#0C0C0C", 78 | "black": "#0C0C0C", 79 | "blue": "#0037DA", 80 | "brightBlack": "#767676", 81 | "brightBlue": "#3B78FF", 82 | "brightCyan": "#61D6D6", 83 | "brightGreen": "#16C60C", 84 | "brightPurple": "#B4009E", 85 | "brightRed": "#E74856", 86 | "brightWhite": "#F2F2F2", 87 | "brightYellow": "#F9F1A5", 88 | "cursorColor": "#FFFFFF", 89 | "cyan": "#3A96DD", 90 | "foreground": "#CCCCCC", 91 | "green": "#13A10E", 92 | "name": "Campbell", 93 | "purple": "#881798", 94 | "red": "#C50F1F", 95 | "selectionBackground": "#FFFFFF", 96 | "white": "#CCCCCC", 97 | "yellow": "#C19C00" 98 | }, 99 | { 100 | "background": "#012456", 101 | "black": "#0C0C0C", 102 | "blue": "#0037DA", 103 | "brightBlack": "#767676", 104 | "brightBlue": "#3B78FF", 105 | "brightCyan": "#61D6D6", 106 | "brightGreen": "#16C60C", 107 | "brightPurple": "#B4009E", 108 | "brightRed": "#E74856", 109 | "brightWhite": "#F2F2F2", 110 | "brightYellow": "#F9F1A5", 111 | "cursorColor": "#FFFFFF", 112 | "cyan": "#3A96DD", 113 | "foreground": "#CCCCCC", 114 | "green": "#13A10E", 115 | "name": "Campbell Powershell", 116 | "purple": "#881798", 117 | "red": "#C50F1F", 118 | "selectionBackground": "#FFFFFF", 119 | "white": "#CCCCCC", 120 | "yellow": "#C19C00" 121 | }, 122 | { 123 | "background": "#282C34", 124 | "black": "#282C34", 125 | "blue": "#61AFEF", 126 | "brightBlack": "#5A6374", 127 | "brightBlue": "#61AFEF", 128 | "brightCyan": "#56B6C2", 129 | "brightGreen": "#98C379", 130 | "brightPurple": "#C678DD", 131 | "brightRed": "#E06C75", 132 | "brightWhite": "#DCDFE4", 133 | "brightYellow": "#E5C07B", 134 | "cursorColor": "#FFFFFF", 135 | "cyan": "#56B6C2", 136 | "foreground": "#DCDFE4", 137 | "green": "#98C379", 138 | "name": "One Half Dark", 139 | "purple": "#C678DD", 140 | "red": "#E06C75", 141 | "selectionBackground": "#FFFFFF", 142 | "white": "#DCDFE4", 143 | "yellow": "#E5C07B" 144 | }, 145 | { 146 | "background": "#FAFAFA", 147 | "black": "#383A42", 148 | "blue": "#0184BC", 149 | "brightBlack": "#4F525D", 150 | "brightBlue": "#61AFEF", 151 | "brightCyan": "#56B5C1", 152 | "brightGreen": "#98C379", 153 | "brightPurple": "#C577DD", 154 | "brightRed": "#DF6C75", 155 | "brightWhite": "#FFFFFF", 156 | "brightYellow": "#E4C07A", 157 | "cursorColor": "#4F525D", 158 | "cyan": "#0997B3", 159 | "foreground": "#383A42", 160 | "green": "#50A14F", 161 | "name": "One Half Light", 162 | "purple": "#A626A4", 163 | "red": "#E45649", 164 | "selectionBackground": "#4F525D", 165 | "white": "#FAFAFA", 166 | "yellow": "#C18301" 167 | }, 168 | { 169 | "background": "#002B36", 170 | "black": "#002B36", 171 | "blue": "#268BD2", 172 | "brightBlack": "#073642", 173 | "brightBlue": "#839496", 174 | "brightCyan": "#93A1A1", 175 | "brightGreen": "#586E75", 176 | "brightPurple": "#6C71C4", 177 | "brightRed": "#CB4B16", 178 | "brightWhite": "#FDF6E3", 179 | "brightYellow": "#657B83", 180 | "cursorColor": "#FFFFFF", 181 | "cyan": "#2AA198", 182 | "foreground": "#839496", 183 | "green": "#859900", 184 | "name": "Solarized Dark", 185 | "purple": "#D33682", 186 | "red": "#DC322F", 187 | "selectionBackground": "#FFFFFF", 188 | "white": "#EEE8D5", 189 | "yellow": "#B58900" 190 | }, 191 | { 192 | "background": "#FDF6E3", 193 | "black": "#002B36", 194 | "blue": "#268BD2", 195 | "brightBlack": "#073642", 196 | "brightBlue": "#839496", 197 | "brightCyan": "#93A1A1", 198 | "brightGreen": "#586E75", 199 | "brightPurple": "#6C71C4", 200 | "brightRed": "#CB4B16", 201 | "brightWhite": "#FDF6E3", 202 | "brightYellow": "#657B83", 203 | "cursorColor": "#002B36", 204 | "cyan": "#2AA198", 205 | "foreground": "#657B83", 206 | "green": "#859900", 207 | "name": "Solarized Light", 208 | "purple": "#D33682", 209 | "red": "#DC322F", 210 | "selectionBackground": "#073642", 211 | "white": "#EEE8D5", 212 | "yellow": "#B58900" 213 | }, 214 | { 215 | "background": "#000000", 216 | "black": "#000000", 217 | "blue": "#3465A4", 218 | "brightBlack": "#555753", 219 | "brightBlue": "#729FCF", 220 | "brightCyan": "#34E2E2", 221 | "brightGreen": "#8AE234", 222 | "brightPurple": "#AD7FA8", 223 | "brightRed": "#EF2929", 224 | "brightWhite": "#EEEEEC", 225 | "brightYellow": "#FCE94F", 226 | "cursorColor": "#FFFFFF", 227 | "cyan": "#06989A", 228 | "foreground": "#D3D7CF", 229 | "green": "#4E9A06", 230 | "name": "Tango Dark", 231 | "purple": "#75507B", 232 | "red": "#CC0000", 233 | "selectionBackground": "#FFFFFF", 234 | "white": "#D3D7CF", 235 | "yellow": "#C4A000" 236 | }, 237 | { 238 | "background": "#FFFFFF", 239 | "black": "#000000", 240 | "blue": "#3465A4", 241 | "brightBlack": "#555753", 242 | "brightBlue": "#729FCF", 243 | "brightCyan": "#34E2E2", 244 | "brightGreen": "#8AE234", 245 | "brightPurple": "#AD7FA8", 246 | "brightRed": "#EF2929", 247 | "brightWhite": "#EEEEEC", 248 | "brightYellow": "#FCE94F", 249 | "cursorColor": "#000000", 250 | "cyan": "#06989A", 251 | "foreground": "#555753", 252 | "green": "#4E9A06", 253 | "name": "Tango Light", 254 | "purple": "#75507B", 255 | "red": "#CC0000", 256 | "selectionBackground": "#555753", 257 | "white": "#D3D7CF", 258 | "yellow": "#C4A000" 259 | }, 260 | { 261 | "background": "#000000", 262 | "black": "#000000", 263 | "blue": "#000080", 264 | "brightBlack": "#808080", 265 | "brightBlue": "#0000FF", 266 | "brightCyan": "#00FFFF", 267 | "brightGreen": "#00FF00", 268 | "brightPurple": "#FF00FF", 269 | "brightRed": "#FF0000", 270 | "brightWhite": "#FFFFFF", 271 | "brightYellow": "#FFFF00", 272 | "cursorColor": "#FFFFFF", 273 | "cyan": "#008080", 274 | "foreground": "#C0C0C0", 275 | "green": "#008000", 276 | "name": "Vintage", 277 | "purple": "#800080", 278 | "red": "#800000", 279 | "selectionBackground": "#FFFFFF", 280 | "white": "#C0C0C0", 281 | "yellow": "#808000" 282 | }, 283 | { 284 | "background": "#FFFFFF", 285 | "black": "#212121", 286 | "blue": "#4397CB", 287 | "brightBlack": "#212121", 288 | "brightBlue": "#4397CB", 289 | "brightCyan": "#49A3AF", 290 | "brightGreen": "#6B9C57", 291 | "brightPurple": "#5C0E87", 292 | "brightRed": "#D35A34", 293 | "brightWhite": "#777777", 294 | "brightYellow": "#EDB13D", 295 | "cursorColor": "#4795DA", 296 | "cyan": "#49A3AF", 297 | "foreground": "#212121", 298 | "green": "#6B9C57", 299 | "name": "fnando", 300 | "purple": "#5C0E87", 301 | "red": "#D35A34", 302 | "selectionBackground": "#c6dcfc", 303 | "white": "#777777", 304 | "yellow": "#EDB13D" 305 | } 306 | ], 307 | "theme": "light", 308 | "themes": [] 309 | } 310 | -------------------------------------------------------------------------------- /fnando/.bin/adb-send-input: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "shellwords" 4 | 5 | words = `pbpaste` 6 | .chomp 7 | .split("%s") 8 | .flat_map {|word| [word.gsub(" ", "%s"), "%", "s"] } 9 | .slice(0..-3) 10 | 11 | words.each do |word| 12 | system "adb", "shell", "input", "text", word 13 | end 14 | -------------------------------------------------------------------------------- /fnando/.bin/backup-brew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | PATH="$PATH:$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin" 4 | 5 | cd $HOME 6 | brew bundle dump 7 | mv Brewfile .Brewfile 8 | 9 | terminal-notifier \ 10 | -message "Brew package list has been backed up to ~/.Brewfile" \ 11 | -title 'Homebrew Backup' \ 12 | -group homebrew \ 13 | &> /dev/null 14 | -------------------------------------------------------------------------------- /fnando/.bin/backup-ccc: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | PATH="$PATH:$HOME/.local/bin:/usr/local/bin" 4 | 5 | terminal-notifier \ 6 | -message "CCC has finished a backup routine" \ 7 | -ignoreDnD \ 8 | -title "Carbon Copy Clone" \ 9 | -group CCC \ 10 | &> /dev/null 11 | -------------------------------------------------------------------------------- /fnando/.bin/bolt-hud: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | icon=checkmark.circle 4 | summary="Finished in $BOLT_ELAPSED, $BOLT_TEST_COUNT tests" 5 | 6 | if [[ "$BOLT_FAIL_COUNT" != "0" ]]; then 7 | icon=exclamationmark.triangle 8 | summary="$summary, $BOLT_FAIL_COUNT failed" 9 | fi 10 | 11 | if [[ "$BOLT_SKIP_COUNT" != "0" ]]; then 12 | summary="$summary, $BOLT_SKIP_COUNT skipped" 13 | fi 14 | 15 | http --form --ignore-stdin POST http://127.0.0.1:32323/hud title="$BOLT_TITLE" message="$summary" symbolName=$icon 16 | -------------------------------------------------------------------------------- /fnando/.bin/current-ip: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [[ "$(uname)" == "Darwin" ]]; then 4 | interface=${1:-en0} 5 | ifconfig $interface | grep 'inet ' | cut -d' ' -f2 6 | else 7 | interface=${1:-eth0} 8 | ifconfig $interface | grep 'inet addr' | sed -E 's/[^:]+:([^ ]+).*$/\1/' 9 | fi 10 | -------------------------------------------------------------------------------- /fnando/.bin/data-url: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | require "optparse" 5 | require "base64" 6 | 7 | options = {} 8 | OptionParser.new do |parser| 9 | parser.banner = "Usage: #{$PROGRAM_NAME} [options]" 10 | 11 | parser.on("-e=EXTENSION", "--extension=EXTENSION", 12 | "Set file extension (to be used with stdin)") do |extension| 13 | options[:extension] = extension 14 | end 15 | 16 | parser.on("-i=INPUT", "--input=INPUT", 17 | "Set file that will be used. Use `-` for stdin") do |input| 18 | options[:input] = input 19 | end 20 | end.parse! 21 | 22 | if options[:input] == "-" 23 | contents = $stdin.read 24 | extension = options.fetch(:extension) do 25 | puts "ERROR: Extension hasn't been set with stdin" 26 | exit 1 27 | end 28 | elsif options[:input] && File.file?(options[:input]) 29 | contents = File.read(options[:input]) 30 | extension = File.extname(options[:input]).to_s 31 | else 32 | puts "ERROR: Input hasn't been set" 33 | exit 1 34 | end 35 | 36 | content_types = { 37 | "svg" => "image/svg+xml", 38 | "png" => "image/png", 39 | "jpg" => "image/jpeg", 40 | "jpeg" => "image/jpeg", 41 | "webp" => "image/webp", 42 | "gif" => "image/gif" 43 | } 44 | 45 | extension = extension.delete(".").downcase 46 | content_type = content_types.fetch(extension) do 47 | puts "ERROR: #{extension.inspect} is not a valid extension" 48 | end 49 | 50 | puts "data:#{content_type};base64,#{Base64.strict_encode64(contents)}" 51 | -------------------------------------------------------------------------------- /fnando/.bin/decrypt: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | input=$1 3 | output=${2:-${input%.*}} 4 | 5 | usage() { 6 | echo "Usage: decrypt INPUT_FILE OUTPUT_FILE" 7 | } 8 | 9 | if [[ "$input" == "" ]]; then 10 | usage 11 | exit 1 12 | fi 13 | 14 | if [[ "$output" == "" ]]; then 15 | usage 16 | exit 1 17 | fi 18 | 19 | openssl enc -aes-256-cbc -pbkdf2 -salt -d -in "$input" -out "$output" 20 | -------------------------------------------------------------------------------- /fnando/.bin/docker: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | podman $@ 4 | -------------------------------------------------------------------------------- /fnando/.bin/encrypt: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | input=$1 3 | output=${2:-$input.encrypted} 4 | 5 | usage() { 6 | echo "Usage: encrypt INPUT_FILE OUTPUT_FILE" 7 | } 8 | 9 | if [[ "$input" == "" ]]; then 10 | usage 11 | exit 1 12 | fi 13 | 14 | if [[ "$output" == "" ]]; then 15 | usage 16 | exit 1 17 | fi 18 | 19 | openssl enc -aes-256-cbc -pbkdf2 -salt -pbkdf2 -in "$input" -out "$output" 20 | -------------------------------------------------------------------------------- /fnando/.bin/ffmpeg-loudness: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ffmpeg -i "$1" -af ebur128=framelog=verbose -f null - 2>&1 | awk '/I:/{print $2}' 4 | -------------------------------------------------------------------------------- /fnando/.bin/ffmpeg-slow-down-audio: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | input = ARGV[0] 5 | rate = (ARGV[1] || 0.75).to_f 6 | dirname = File.dirname(input) 7 | basename = File.basename(input, ".*") 8 | percentage = (rate * 100).to_i 9 | output = File.join(dirname, "#{basename} (Slowed by #{percentage}%).mp3") 10 | 11 | command = [ 12 | "ffmpeg", 13 | "-i", 14 | input, 15 | "-filter:a", 16 | "atempo=#{rate}", 17 | "-vn", 18 | output 19 | ] 20 | 21 | system(*command) 22 | -------------------------------------------------------------------------------- /fnando/.bin/ffmpeg-split-audio-channels: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | input = ARGV[0] 5 | dirname = File.dirname(input) 6 | basename = File.basename(input, ".*") 7 | 8 | left_channel_output = File.join(dirname, "#{basename} (Left).mp3") 9 | right_channel_output = File.join(dirname, "#{basename} (Right).mp3") 10 | 11 | command = [ 12 | "ffmpeg", 13 | "-i", 14 | input, 15 | "-map_channel", 16 | "0.0.0", 17 | left_channel_output, 18 | "-map_channel", 19 | "0.0.1", 20 | right_channel_output 21 | ] 22 | 23 | system(*command) 24 | -------------------------------------------------------------------------------- /fnando/.bin/format-git-message: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | require "open3" 5 | 6 | file = ARGV.last 7 | 8 | exit(1) unless File.file?(file) 9 | 10 | content = File.read(file) 11 | number_of_lines = 0 12 | lines = content.lines.map(&:chomp) 13 | 14 | lines.each do |line| 15 | break if line.include?("# Please enter the commit message") 16 | 17 | number_of_lines += 1 18 | end 19 | 20 | message_lines = lines.shift(number_of_lines).map {|line| line.chomp.rstrip } 21 | 22 | formatted = message_lines.each_with_object([]) do |line, buffer| 23 | line = line.chomp 24 | prefix = " " * line[/^(([-*]|[a-z\d]+[.)])\s+)/, 1].to_s.size 25 | 26 | if line.size <= 72 || line.count(" ") <= 1 27 | buffer << line 28 | else 29 | words = line.split 30 | new_line = "" 31 | 32 | words.each do |word| 33 | new_line = if new_line.size + word.size < 72 34 | "#{new_line}#{word} " 35 | else 36 | buffer << new_line unless new_line.empty? 37 | "#{prefix}#{word} " 38 | end 39 | end 40 | 41 | buffer << new_line.rstrip 42 | end 43 | end 44 | 45 | puts lines.unshift(*formatted).join("\n") 46 | -------------------------------------------------------------------------------- /fnando/.bin/gh-action-status: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | require "English" 5 | require "json" 6 | 7 | data = JSON.parse(`gh run list --json databaseId,name`, symbolize_names: true) 8 | run_id = data.select {|action| action[:name] == ARGV[0] } 9 | .map {|action| action[:databaseId] } 10 | .max 11 | 12 | system "gh", "run", "view", run_id.to_s, "--exit-status" 13 | 14 | failed = $CHILD_STATUS.exitstatus.nonzero? 15 | 16 | system "gh", "run", "view", run_id.to_s, "--log-failed" if failed 17 | -------------------------------------------------------------------------------- /fnando/.bin/git-buster: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | file="$1" 4 | 5 | [ "$file" == "" ] && echo "Usage: git buster FILE" > /dev/stderr && exit 1 6 | 7 | git filter-branch -f --prune-empty --tag-name-filter cat --tree-filter "rm -f $file" -- --all 8 | git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 9 | git reflog expire --expire=now --all && git gc --prune=now --aggressive 10 | echo "$file" >> .gitignore 11 | -------------------------------------------------------------------------------- /fnando/.bin/git-current: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | echo `git branch 2> /dev/null | grep \* | sed 's/* //'` 4 | 5 | -------------------------------------------------------------------------------- /fnando/.bin/git-empty: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | git symbolic-ref HEAD "refs/heads/$1" 4 | rm .git/index 5 | git clean -fdx 6 | -------------------------------------------------------------------------------- /fnando/.bin/git-track: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | branch=`git branch 2> /dev/null | grep \* | sed 's/* //'` 3 | git config branch.$branch.remote origin 4 | git config branch.$branch.merge refs/heads/$branch 5 | echo "tracking origin/$branch" 6 | -------------------------------------------------------------------------------- /fnando/.bin/git-undo: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | git reset --soft HEAD^1 -------------------------------------------------------------------------------- /fnando/.bin/git-view: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | require "json" 5 | 6 | def command_json(command) 7 | JSON.parse(command, symbolize_names: true) 8 | end 9 | 10 | repo = command_json(`gh repo view --json nameWithOwner`).fetch(:nameWithOwner) 11 | branch = `git b --show-current`.chomp 12 | commit = `git rev-parse HEAD`.chomp if branch.empty? 13 | 14 | if branch 15 | pull_request = command_json(`gh pr list --json headRefName,number`) 16 | .find {|pr| pr[:headRefName] == branch } 17 | end 18 | 19 | url = if pull_request 20 | "https://github.com/#{repo}/pull/#{pull_request[:number]}" 21 | elsif branch != "" 22 | "https://github.com/#{repo}/tree/#{branch}" 23 | elsif commit != "" 24 | "https://github.com/#{repo}/tree/#{commit}" 25 | else 26 | "https://github.com/#{repo}" 27 | end 28 | 29 | system "open", url 30 | -------------------------------------------------------------------------------- /fnando/.bin/git-wip: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | git add . 3 | git commit --no-verify --all --message "WIP" 4 | -------------------------------------------------------------------------------- /fnando/.bin/imgcat: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # tmux requires unrecognized OSC sequences to be wrapped with DCS tmux; 4 | # ST, and for all ESCs in to be replaced with ESC ESC. It 5 | # only accepts ESC backslash for ST. We use TERM instead of TMUX because TERM 6 | # gets passed through ssh. 7 | function print_osc() { 8 | if [[ $TERM == screen* ]]; then 9 | printf "\033Ptmux;\033\033]" 10 | else 11 | printf "\033]" 12 | fi 13 | } 14 | 15 | # More of the tmux workaround described above. 16 | function print_st() { 17 | if [[ $TERM == screen* ]]; then 18 | printf "\a\033\\" 19 | else 20 | printf "\a" 21 | fi 22 | } 23 | 24 | function load_version() { 25 | if [ -z ${IMGCAT_BASE64_VERSION+x} ]; then 26 | IMGCAT_BASE64_VERSION=$(base64 --version 2>&1) 27 | export IMGCAT_BASE64_VERSION 28 | fi 29 | } 30 | 31 | function b64_encode() { 32 | load_version 33 | if [[ $IMGCAT_BASE64_VERSION =~ GNU ]]; then 34 | # Disable line wrap 35 | base64 -w0 36 | else 37 | base64 38 | fi 39 | } 40 | 41 | function b64_decode() { 42 | load_version 43 | if [[ $IMGCAT_BASE64_VERSION =~ fourmilab ]]; then 44 | BASE64ARG=-d 45 | elif [[ $IMGCAT_BASE64_VERSION =~ GNU ]]; then 46 | BASE64ARG=-di 47 | else 48 | BASE64ARG=-D 49 | fi 50 | base64 $BASE64ARG 51 | } 52 | 53 | # print_image filename inline base64contents print_filename 54 | # filename: Filename to convey to client 55 | # inline: 0 or 1 56 | # base64contents: Base64-encoded contents 57 | # print_filename: If non-empty, print the filename 58 | # before outputting the image 59 | function print_image() { 60 | print_osc 61 | printf '1337;File=' 62 | if [[ -n $1 ]]; then 63 | printf "name=%s;" "$(printf "%s" "$1" | b64_encode)" 64 | fi 65 | 66 | printf "%s" "$3" | b64_decode | wc -c | awk '{printf "size=%d",$1}' 67 | printf ";inline=%s" "$2" 68 | printf ":" 69 | printf "%s" "$3" 70 | print_st 71 | printf '\n' 72 | if [[ -n $4 ]]; then 73 | echo "$1" 74 | fi 75 | } 76 | 77 | function error() { 78 | echo "ERROR: $*" 1>&2 79 | } 80 | 81 | function show_help() { 82 | echo "Usage: imgcat [-p] filename ..." 1>&2 83 | echo " or: cat filename | imgcat" 1>&2 84 | } 85 | 86 | function check_dependency() { 87 | if ! (builtin command -V "$1" >/dev/null 2>&1); then 88 | echo "imgcat: missing dependency: can't find $1" 1>&2 89 | exit 1 90 | fi 91 | } 92 | 93 | ## Main 94 | 95 | if [ -t 0 ]; then 96 | has_stdin=f 97 | else 98 | has_stdin=t 99 | fi 100 | 101 | # Show help if no arguments and no stdin. 102 | if [ $has_stdin = f ] && [ $# -eq 0 ]; then 103 | show_help 104 | exit 105 | fi 106 | 107 | check_dependency awk 108 | check_dependency base64 109 | check_dependency wc 110 | 111 | # Look for command line flags. 112 | while [ $# -gt 0 ]; do 113 | case "$1" in 114 | -h | --h | --help) 115 | show_help 116 | exit 117 | ;; 118 | -p | --p | --print) 119 | print_filename=1 120 | ;; 121 | -u | --u | --url) 122 | check_dependency curl 123 | encoded_image=$(curl -s "$2" | b64_encode) || ( 124 | error "No such file or url $2" 125 | exit 2 126 | ) 127 | has_stdin=f 128 | print_image "$2" 1 "$encoded_image" "$print_filename" 129 | set -- "${@:1:1}" "-u" "${@:3}" 130 | if [ "$#" -eq 2 ]; then 131 | exit 132 | fi 133 | ;; 134 | -*) 135 | error "Unknown option flag: $1" 136 | show_help 137 | exit 1 138 | ;; 139 | *) 140 | if [ -r "$1" ]; then 141 | has_stdin=f 142 | print_image "$1" 1 "$(b64_encode <"$1")" "$print_filename" 143 | else 144 | error "imgcat: $1: No such file or directory" 145 | exit 2 146 | fi 147 | ;; 148 | esac 149 | shift 150 | done 151 | 152 | # Read and print stdin 153 | if [ $has_stdin = t ]; then 154 | print_image "" 1 "$(cat | b64_encode)" "" 155 | fi 156 | 157 | exit 0 158 | -------------------------------------------------------------------------------- /fnando/.bin/instagram-slice: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "fileutils" 4 | require "json" 5 | 6 | input_path = File.expand_path(ARGV[0]) 7 | input_dir = File.dirname(input_path) 8 | file_name = File.basename(input_path, ".*") 9 | output_dir = File.join(input_dir, file_name) 10 | 11 | meta = JSON.parse(`ffprobe -v error -show_format -show_entries stream=width,height -i #{input_path.inspect} -print_format json`) 12 | duration = Float(meta.dig("format", "duration")) 13 | 14 | slices_count = (duration / 60).ceil 15 | FileUtils.mkdir_p(output_dir) 16 | 17 | slices_count.times do |index| 18 | start_time = "00:0#{index}:00.00" 19 | output_path = File.join(output_dir, "#{file_name}-#{index + 1}.mp4") 20 | system "ffmpeg", "-i", input_path, "-ss", start_time, "-t", "59.99", "-c", "copy", "-v", "quiet", "-y", output_path 21 | FileUtils.touch output_path, mtime: Time.now - 30 + index 22 | end 23 | -------------------------------------------------------------------------------- /fnando/.bin/list-ios-simulators: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | xcrun simctl list --json devices available | jq '.devices | to_entries[] | (.key | capture("com\\.apple\\.CoreSimulator\\.SimRuntime\\.iOS-(?.+)")) as {$version} | .value[] | {name: "\(.name)", version: $version | sub("-"; "."), udid}' 4 | -------------------------------------------------------------------------------- /fnando/.bin/pretty_html: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | gem "nokogiri" 5 | require "nokogiri" 6 | 7 | path = File.expand_path(ARGV[0]) if ARGV.any? 8 | 9 | contents = if $stdin.tty? 10 | File.read(path) 11 | else 12 | $stdin.read 13 | end 14 | 15 | html = Nokogiri::HTML(contents).to_xhtml(indent: 2) 16 | 17 | if path 18 | File.open(path, "w") do |io| 19 | io << html 20 | end 21 | else 22 | puts html 23 | end 24 | -------------------------------------------------------------------------------- /fnando/.bin/prince: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | exec "$HOME/.local/princexml/lib/prince/bin/prince" --prefix="$HOME/.local/princexml/lib/prince" "$@" 4 | -------------------------------------------------------------------------------- /fnando/.bin/restart-dns: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | sudo dscacheutil -flushcache 4 | sudo killall -HUP mDNSResponder 5 | -------------------------------------------------------------------------------- /fnando/.bin/rscp: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [ -z "$1" ]; then 4 | echo "Usage: rscp " 5 | exit 1 6 | fi 7 | 8 | rsync -vr --partial --progress -e ssh $1 $2 9 | -------------------------------------------------------------------------------- /fnando/.bin/rtf: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [[ "$#" = 0 ]]; then 4 | echo "Usage: rtf LEXER [theme=tango]" 5 | exit 6 | fi 7 | 8 | lexer="$1" 9 | theme="${2:-tango}" 10 | 11 | pygmentize -l "$lexer" -f rtf -O style="$theme",fontsize=40,fontface=Hack | 12 | sed -E 's/\\b / /g' | # remove bold 13 | sed -E 's/\\f0/\\f0\\sl288\\slmult1/g' # add 1.2 line height 14 | -------------------------------------------------------------------------------- /fnando/.bin/server: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | gem "rack" 5 | gem "rackup" 6 | gem "puma" 7 | require "rack" 8 | require "rackup" 9 | require "yaml" 10 | require "optparse" 11 | 12 | options = {root: Dir.pwd, index: true} 13 | 14 | OptionParser.new do |opts| 15 | opts.banner = "Usage: #{$PROGRAM_NAME} [options]" 16 | 17 | opts.on("-r", "--root=DIR", 18 | "Set root directory. Defaults to current directory.") do |root| 19 | options[:root] = File.expand_path(root) 20 | end 21 | 22 | opts.on("-i", "--index", "Use index files. Defaults to true.") do |index| 23 | options[:index] = index 24 | end 25 | 26 | opts.on("-p", "--port=PORT", "Defaults to 1234.") do |port| 27 | options[:port] = port 28 | end 29 | 30 | opts.on("-b", "--binding=BINDING", "Defaults to 127.0.0.1.") do |binding| 31 | options[:binding] = binding 32 | end 33 | 34 | opts.on("-h", "--help", "Prints this help") do 35 | puts opts 36 | exit 37 | end 38 | end.parse! 39 | 40 | app = Rack::Builder.app do 41 | use Rack::ContentLength 42 | use Rack::CommonLogger 43 | use Rack::Deflater 44 | 45 | if options[:index] 46 | use Rack::Static, 47 | urls: {"/" => "index.html"}, 48 | root: options[:root] 49 | end 50 | 51 | run lambda {|env| 52 | directory_app = Rack::Directory.new(options[:root]) 53 | response = directory_app.call(env) 54 | 55 | return response if response.first == 200 56 | 57 | index_file = File.join(options[:root], "index.html") 58 | 59 | if File.file?(index_file) 60 | return [200, {"Content-Type" => "text/html"}, [File.read(index_file)]] 61 | end 62 | 63 | response 64 | } 65 | end 66 | 67 | handler = Rackup::Handler.pick(%w[puma]) 68 | handler.run app, 69 | Port: options.fetch(:port, 1234), 70 | Host: options.fetch(:binding, "127.0.0.1") 71 | -------------------------------------------------------------------------------- /fnando/.bin/slim-vid: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | require "fileutils" 5 | require "securerandom" 6 | require "active_support" 7 | require "optparse" 8 | require "shellwords" 9 | 10 | helpers = Object.new.extend(ActiveSupport::NumberHelper) 11 | keep_audio = false 12 | verbose = false 13 | 14 | OptionParser.new do |parser| 15 | parser.banner = "Usage: #{$PROGRAM_NAME} [options]" 16 | 17 | parser.on("-a", "--audio", "Keep audio track") do |value| 18 | keep_audio = value 19 | end 20 | 21 | parser.on("-v", "--verbose", "Verbose output") do |value| 22 | verbose = value 23 | end 24 | end.parse! 25 | 26 | input = ARGV.first 27 | 28 | if !input || !File.file?(input) 29 | puts "ERROR: Please provide a valid video file" 30 | exit 1 31 | end 32 | 33 | input = File.expand_path(input) 34 | name = File.basename(input, ".*") 35 | dir = File.dirname(input) 36 | ext = File.extname(input) 37 | id = SecureRandom.hex(10) 38 | output = File.join(dir, "#{name}.#{id}#{ext}") 39 | cmd = [ 40 | "ffmpeg", 41 | verbose ? nil : ["-loglevel", "quiet"], 42 | "-i", input, 43 | keep_audio ? nil : "-an", 44 | output 45 | ].flatten.compact 46 | 47 | cmd_str = cmd.map {|arg| Shellwords.escape(arg) }.join(" ") 48 | puts "=> Command: #{cmd_str}" 49 | 50 | system(*cmd) 51 | 52 | original_size = File.size(input) 53 | slim_size = File.size(output) 54 | 55 | puts "Original file: #{helpers.number_to_human_size(original_size)}" 56 | puts "Slim file: #{helpers.number_to_human_size(slim_size)}" 57 | 58 | FileUtils.move(input, File.join(dir, "#{name}.original.#{id}.#{ext}")) 59 | FileUtils.move(output, input) 60 | -------------------------------------------------------------------------------- /fnando/.bin/spoof: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | default_eth_device=$(system_profiler SPAirPortDataType | grep -E ' en\d:' | tr -d ' ' | tr -d ':') 4 | 5 | if [[ "$@" =~ "-h" ]]; then 6 | echo "Usage: spoof [ETHERNET_INTERFACE]" 7 | echo 8 | echo "ETHERNET_INTERFACE defaults to $default_eth_device." 9 | exit 10 | fi 11 | 12 | current-mac() { 13 | eth_device=$1 14 | ifconfig $eth_device | grep '\tether ' | cut -d' ' -f2 15 | } 16 | 17 | eth_device=${1:-$default_eth_device} 18 | echo "from: $(current-mac $eth_device)" 19 | mac=$(openssl rand -hex 1 | tr '[:lower:]' '[:upper:]' | xargs echo "obase=2;ibase=16;" | bc | cut -c1-6 | sed 's/$/00/' | xargs echo "obase=16;ibase=2;" | bc | sed "s/$/:$(openssl rand -hex 5 | sed 's/\(..\)/\1:/g; s/.$//' | tr '[:lower:]' '[:upper:]')/") 20 | sudo ifconfig $eth_device ether $mac 21 | echo " to: $(current-mac $eth_device)" 22 | -------------------------------------------------------------------------------- /fnando/.bin/tmignore: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | find $HOME/Projects -name 'node_modules' -type d -depth 3 -exec tmutil addexclusion -p {} \; 4 | find $HOME/Projects -name '.gradle' -type d -depth 4 -exec tmutil addexclusion -p {} \; 5 | find $HOME/Projects -regex '.*/android/app/build' -type d -depth 5 -exec tmutil addexclusion -p {} \; 6 | find $HOME/Projects -regex '.*/target' -type d -depth 3 -exec tmutil addexclusion -p {} \; 7 | find $HOME/Projects -regex '.*/Pods' -type d -depth 4 -exec tmutil addexclusion -p {} \; 8 | -------------------------------------------------------------------------------- /fnando/.bin/tunnel: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | require "securerandom" 5 | require "optparse" 6 | require "bundler/inline" 7 | 8 | gemfile do 9 | source "https://rubygems.org" 10 | gem "net-ssh" 11 | gem "net-scp" 12 | gem "ed25519" 13 | gem "haikunate" 14 | gem "bcrypt_pbkdf" 15 | end 16 | 17 | require "net/ssh" 18 | require "net/scp" 19 | require "haikunate" 20 | 21 | # There are a few puts on this class that cannot be disabled by setting the log. 22 | # Let's override `puts` so the console it's clean! 23 | Net::SSH::Service::Forward.class_eval do 24 | def puts(*) 25 | end 26 | end 27 | 28 | options = { 29 | local_port: 3000, 30 | remote_port: 0, 31 | subdomain: Haiku.call, 32 | verbose: false 33 | } 34 | 35 | OptionParser.new do |parser| 36 | parser.banner = "Usage: #{$PROGRAM_NAME} [options]" 37 | 38 | parser.on("-p", "--port=PORT", "Set local port. Defaults to 3000.") do |port| 39 | options[:local_port] = port.to_i 40 | end 41 | 42 | parser.on( 43 | "-r", 44 | "--remote-port=PORT", 45 | "Set remote port. Defaults to the next available port." 46 | ) do |port| 47 | options[:remote_port] = port.to_i 48 | end 49 | 50 | parser.on("-v", "--verbose", "Run in verbose mode") do |verbose| 51 | options[:verbose] = verbose 52 | end 53 | 54 | parser.on( 55 | "-s", 56 | "--subdomain=SUBDOMAIN", 57 | "Set subdomain. Defaults to random." 58 | ) do |subdomain| 59 | options[:subdomain] = subdomain 60 | end 61 | end.parse! 62 | 63 | puts "=> options: #{options}" if options[:verbose] 64 | 65 | stop = false 66 | 67 | trap("INT") do 68 | stop = true 69 | puts "\n⚙️ Shutting down https://#{options[:subdomain]}.t.fnando.dev" 70 | end 71 | 72 | reload_cmd = "service caddy restart" 73 | verbose = options[:verbose] ? Logger::DEBUG : nil 74 | logger = Logger.new(verbose ? $stdout : StringIO.new) 75 | options => {local_port:, remote_port:} 76 | 77 | run = lambda do 78 | Net::SSH.start( 79 | "ssh.t.fnando.dev", 80 | "root", 81 | use_agent: true, 82 | verbose:, 83 | logger: 84 | ) do |ssh| 85 | assigned_port = nil 86 | 87 | session = ssh.forward.remote(local_port, "localhost", remote_port) do |port| 88 | assigned_port = port 89 | end 90 | 91 | session.loop { !assigned_port } 92 | 93 | contents = <<~CADDYFILE 94 | #{options[:subdomain]}.t.fnando.dev { 95 | \treverse_proxy :#{assigned_port} 96 | } 97 | CADDYFILE 98 | 99 | caddyfile = "/tmp/caddyfile" 100 | remote_caddyfile = "/etc/caddy/sites-enabled/#{options[:subdomain]}.conf" 101 | 102 | File.open(caddyfile, "w+") {|io| io << contents } 103 | 104 | ssh.scp.upload(caddyfile, remote_caddyfile) 105 | sleep 0.1 106 | ssh.exec reload_cmd 107 | 108 | puts 109 | puts "⚡️ localhost:#{local_port} ➡️ localhost:#{assigned_port}" 110 | puts "⚡️ https://#{options[:subdomain]}.t.fnando.dev" 111 | puts "🙅‍♂️ Press ctrl-c to stop" 112 | 113 | ssh.loop { !stop } 114 | ssh.exec "rm -rf #{remote_caddyfile}" 115 | ssh.exec reload_cmd 116 | puts "👋 Bye!" 117 | end 118 | end 119 | 120 | loop do 121 | break if stop 122 | 123 | run.call unless stop 124 | rescue Errno::ECONNREFUSED 125 | puts "⚠️ localhost:#{local_port} is not running... waiting!" 126 | 127 | loop do 128 | break if stop 129 | 130 | Socket.tcp("localhost", local_port, connect_timeout: 1).close 131 | break 132 | rescue Errno::ECONNREFUSED 133 | sleep 1 134 | end 135 | end 136 | -------------------------------------------------------------------------------- /fnando/.bin/vectorize: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | require "shellwords" 5 | require "tempfile" 6 | 7 | tmpfile = File.join(Dir.tmpdir, "file.bmp") 8 | input = ARGV.first.to_s.strip 9 | 10 | if input.empty? 11 | $stderr << "USAGE: #{$PROGRAM_NAME} [IMAGE_PATH]\n" 12 | exit 1 13 | end 14 | 15 | unless File.file?(input) 16 | $stderr << "ERROR: #{input.inspect} is not a valid file.\n" 17 | exit 1 18 | end 19 | 20 | system "convert", 21 | Shellwords.shellescape(input), 22 | "-alpha", 23 | "remove", 24 | "-alpha", 25 | "off", 26 | "-auto-threshold", 27 | "otsu", 28 | tmpfile 29 | 30 | output = File.join(File.dirname(input), "#{File.basename(input, '.*')}.svg") 31 | bgcolor = `convert #{Shellwords.shellescape(tmpfile)} -format "%[pixel:u.p{0,0}]" info:`.chomp 32 | has_black_bgcolor = bgcolor == "srgb(0,0,0)" 33 | 34 | system( 35 | *[ 36 | "potrace", 37 | Shellwords.shellescape(tmpfile), 38 | has_black_bgcolor ? "--invert" : nil, 39 | "--svg", 40 | "--output", 41 | Shellwords.shellescape(output) 42 | ].compact 43 | ) 44 | -------------------------------------------------------------------------------- /fnando/.bin/whatsapp-media: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # frozen_string_literal: true 3 | 4 | require "time" 5 | require "fileutils" 6 | 7 | files = ARGV.filter do |file| 8 | next unless file.match?(/\.(jp?eg|mp4)$/i) 9 | 10 | true 11 | end 12 | 13 | counter = Hash.new {|h, k| h[k] = -1 } 14 | 15 | files.each do |file| 16 | matches = 17 | file.match(/(?\d{4}-\d{2}-\d{2}).*?(?