[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Call script with parameters ...\n2. Type ...\n3. Wait for ... seconds\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Desktop (please complete the following information):**\n - OS: [e.g. MacOS]\n - make version (make --version)\n - Script version\n - copy/paste output\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/workflows/bash_unit.yml",
    "content": "name: bash_unit CI\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  ubuntu:\n    runs-on: ubuntu-latest\n    if: \"! contains(toJSON(github.event.commits.*.message), '[skip ci]')\"\n\n    steps:\n    - uses: actions/checkout@v2\n\n    - name: install Ubuntu dependencies with sudo apt install -y\n      run: sudo apt install -y gawk\n\n    - name: Unit testing with bash_unit\n      run: ./run_tests.sh\n\n  macos:\n    runs-on: macos-latest\n    if: \"! contains(toJSON(github.event.commits.*.message), '[skip ci]') && contains(toJSON(github.event.commits.*.message), '[macos]')\"\n\n    steps:\n    - uses: actions/checkout@v2\n\n    - name: install MacOS dependencies with brew install\n      run: brew install gawk\n\n    - name: Unit testing with bash_unit\n      run: ./run_tests.sh\n"
  },
  {
    "path": ".github/workflows/shellcheck.yml",
    "content": "name: Shellcheck CI\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  shellcheck:\n    runs-on: ubuntu-latest\n    if: \"! contains(toJSON(github.event.commits.*.message), '[skip ci]')\"\n\n    steps:\n    - uses: actions/checkout@v2\n\n    - name: Check for code quality errors\n      run: ./run_linter.sh\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "Change Log\n==========\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](http://keepachangelog.com/)\nand this project adheres to [Semantic Versioning](http://semver.org/).\n\n## [Unreleased]\n- WIP\n\n## [1.0.0](https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/releases/tag/1.0.0)\n\n### Added\n- .github/ISSU_TEMPLATE/bug_report.md\n- .github/ISSU_TEMPLATE/feature_request.md\n- .github/workflows/bash_unit.yml\n- .github/workflows/shellcheck.yml\n- CHANGELOG.md\n- CODE_OF_CONDUCT.md\n- CONTRIBUTING.md\n- LICENSE\n- run_linter.sh\n- run_tests.sh\n- unit tests\n\n### Modified\n- install.sh\n- README.md\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at contact@christitus.com. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n \n## How do I... <a name=\"toc\"></a>\n\n* [Use This Guide](#introduction)?\n* Ask or Say Something? 🤔🐛😱\n  * [Request Support](#request-support)\n  * [Report an Error or Bug](#report-an-error-or-bug)\n  * [Request a Feature](#request-a-feature)\n* Make Something? 🤓👩🏽‍💻📜🍳\n  * [Project Setup](#project-setup)\n  * [Contribute Documentation](#contribute-documentation)\n  * [Contribute Code](#contribute-code)\n* Manage Something ✅🙆🏼💃👔\n  * [Provide Support on Issues](#provide-support-on-issues)\n  * [Label Issues](#label-issues)\n  * [Clean Up Issues and PRs](#clean-up-issues-and-prs)\n  * [Review Pull Requests](#review-pull-requests)\n  * [Merge Pull Requests](#merge-pull-requests)\n  * [Tag a Release](#tag-a-release)\n  * [Join the Project Team](#join-the-project-team)\n* Add a Guide Like This One [To My Project](#attribution)? 🤖😻👻\n\n## Introduction\n\nThank you so much for your interest in contributing!. All types of contributions are encouraged and valued. See the [table of contents](#toc) for different ways to help and details about how this project handles them!📝\n\nPlease make sure to read the relevant section before making your contribution! It will make it a lot easier for us maintainers to make the most of it and smooth out the experience for all involved. 💚\n\n## Request Support\n\nIf you have a question about this project, how to use it, or just need clarification about something:\n\n* Open an Issue at https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/issues\n* Provide as much context as you can about what you're running into.\n* Provide project and platform versions (bash, basher, etc), depending on what seems relevant. If not, please be ready to provide that information if maintainers ask for it.\n\nOnce it's filed:\n\n* The project team will [label the issue](#label-issues).\n* Someone will try to have a response soon.\n* If you or the maintainers don't respond to an issue for 30 days, the [issue will be closed](#clean-up-issues-and-prs). \n  If you want to come back to it, reply (once, please), and we'll reopen the existing issue. Please avoid filing new issues as extensions of one you already made.\n\n## Report an Error or Bug\n\nIf you run into an error or bug with the project:\n\n* Open an Issue at https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/issues\n* Include *reproduction steps* that someone else can follow to recreate the bug or error on their own.\n* Provide project and platform versions (OS, bash, basher, etc), depending on what seems relevant. If not, please be ready to provide that information if maintainers ask for it.\n\nOnce it's filed:\n\n* The project team will [label the issue](#label-issues).\n* A team member will try to reproduce the issue with your provided steps. If there are no repro steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced.\n* If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be [implemented by someone](#contribute-code).\n* If you or the maintainers don't respond to an issue for 30 days, the [issue will be closed](#clean-up-issues-and-prs). If you want to come back to it, reply (once, please), and we'll reopen the existing issue. Please avoid filing new issues as extensions of one you already made.\n* `critical` issues may be left open, depending on perceived immediacy and severity, even past the 30 day deadline.\n\n## Request a Feature\n\nIf the project doesn't do something you need or want it to do:\n\n* Open an Issue at https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/issues\n* Provide as much context as you can about what you're running into.\n* Please be clear about why existing features and alternatives would not work for you.\n\nOnce it's filed:\n\n* The project team will [label the issue](#label-issues).\n* The project team will evaluate the feature request, possibly asking you more questions to understand its purpose and any relevant requirements. If the issue is closed, the team will convey their reasoning and suggest an alternative path forward.\n* If the feature request is accepted, it will be marked for implementation with `feature-accepted`, which can then be done by either by a core team member or by anyone in the community who wants to [contribute code](#contribute-code).\n\nNote: The team is unlikely to be able to accept every single feature request that is filed. Please understand if they need to say no.\n\n## Project Setup\n\nSo you want to contribute some code! That's great! This project uses GitHub Pull Requests to manage contributions, so [read up on how to fork a GitHub project and file a PR](https://guides.github.com/activities/forking) if you've never done it before.\n\nIf this seems like a lot or you aren't able to do all this setup, you might also be able to [edit the files directly](https://help.github.com/articles/editing-files-in-another-user-s-repository/) without having to do any of this setup. Yes, [even code](#contribute-code).\n\nIf you want to go the usual route and run the project locally, though:\n\n* [Fork the project](https://guides.github.com/activities/forking/#fork)\n\nThen in your terminal:\n* `cd path/to/your/clone`\n\nAnd you should be ready to go!\n\n## Contribute Documentation\n\nDocumentation is a super important, critical part of this project. Docs are how we keep track of what we're doing, how, and why. It's how we stay on the same page about our policies. And it's how we tell others everything they need in order to be able to use this project -- or contribute to it. So thank you in advance.\n\nDocumentation contributions of any size are welcome! Feel free to file a PR even if you're just rewording a sentence to be more clear, or fixing a spelling mistake!\n\nTo contribute documentation:\n\n* [Set up the project](#project-setup).\n* Edit or add any relevant documentation.\n* Make sure your changes are formatted correctly and consistently with the rest of the documentation.\n* Re-read what you wrote, and run a spellchecker on it to make sure you didn't miss anything.\n* Write clear, concise commit message(s) using [conventional-changelog format](https://github.com/conventional-changelog/conventional-changelog-angular/blob/master/convention.md). Documentation commits should use `docs(<component>): <message>`.\n* Go to https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/pulls and open a new pull request with your changes.\n* If your PR is connected to an open issue, add a line in your PR's description that says `Fixes: #123`, where `#123` is the number of the issue you're fixing.\n\nOnce you've filed the PR:\n\n* One or more maintainers will use GitHub's review feature to review your PR.\n* If the maintainer asks for any changes, edit your changes, push, and ask for another review.\n* If the maintainer decides to pass on your PR, they will thank you for the contribution and explain why they won't be accepting the changes. That's ok! We still really appreciate you taking the time to do it, and we don't take that lightly. 💚\n* If your PR gets accepted, it will be marked as such, and merged into the `latest` branch soon after. Your contribution will be distributed to the masses next time the maintainers [tag a release](#tag-a-release)\n\n## Contribute Code\n\nWe like code commits a lot! They're super handy, and they keep the project going and doing the work it needs to do to be useful to others.\n\nCode contributions of just about any size are acceptable!\n\nThe main difference between code contributions and documentation contributions is that contributing code requires inclusion of relevant tests for the code being added or changed. Contributions without accompanying tests will be held off until a test is added, unless the maintainers consider the specific tests to be either impossible, or way too much of a burden for such a contribution.\n\nTo contribute code:\n\n* [Set up the project](#project-setup).\n* Make any necessary changes to the source code.\n* Include any [additional documentation](#contribute-documentation) the changes might need.\n* Write tests that verify that your contribution works as expected.\n* Write clear, concise commit message(s) using [conventional-changelog format](https://github.com/conventional-changelog/conventional-changelog-angular/blob/master/convention.md).\n* Dependency updates, additions, or removals must be in individual commits, and the message must use the format: `<prefix>(deps): PKG@VERSION`, where `<prefix>` is any of the usual `conventional-changelog` prefixes, at your discretion.\n* Go to https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/pulls and open a new pull request with your changes.\n* If your PR is connected to an open issue, add a line in your PR's description that says `Fixes: #123`, where `#123` is the number of the issue you're fixing.\n\nOnce you've filed the PR:\n\n* Barring special circumstances, maintainers will not review PRs until all checks pass (Travis, AppVeyor, etc).\n* One or more maintainers will use GitHub's review feature to review your PR.\n* If the maintainer asks for any changes, edit your changes, push, and ask for another review. Additional tags (such as `needs-tests`) will be added depending on the review.\n* If the maintainer decides to pass on your PR, they will thank you for the contribution and explain why they won't be accepting the changes. That's ok! We still really appreciate you taking the time to do it, and we don't take that lightly. 💚\n* If your PR gets accepted, it will be marked as such, and merged into the `latest` branch soon after. Your contribution will be distributed to the masses next time the maintainers [tag a release](#tag-a-release)\n\n## Provide Support on Issues\n\nHelping out other users with their questions is a really awesome way of contributing to any community. It's not uncommon for most of the issues on an open source projects being support-related questions by users trying to understand something they ran into, or find their way around a known bug.\n\nSometimes, the `support` label will be added to things that turn out to actually be other things, like bugs or feature requests. In that case, suss out the details with the person who filed the original issue, add a comment explaining what the bug is, and change the label from `support` to `bug` or `feature`. If you can't do this yourself, @mention a maintainer so they can do it.\n\nIn order to help other folks out with their questions:\n\n* Go to the issue tracker and [filter open issues by the `support` label](https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/issues?q=is%3Aopen+is%3Aissue+label%3Asupport).\n* Read through the list until you find something that you're familiar enough with to give an answer to.\n* Respond to the issue with whatever details are needed to clarify the question, or get more details about what's going on.\n* Once the discussion wraps up and things are clarified, either close the issue, or ask the original issue filer (or a maintainer) to close it for you.\n\nSome notes on picking up support issues:\n\n* Avoid responding to issues you don't know you can answer accurately.\n* As much as possible, try to refer to past issues with accepted answers. Link to them from your replies with the `#123` format.\n* Be kind and patient with users -- often, folks who have run into confusing things might be upset or impatient. This is ok. Try to understand where they're coming from, and if you're too uncomfortable with the tone, feel free to stay away or withdraw from the issue. (note: if the user is outright hostile or is violating the CoC, [refer to the Code of Conduct](CODE_OF_CONDUCT.md) to resolve the conflict).\n\n## Label Issues\n\nOne of the most important tasks in handling issues is labeling them usefully and accurately. All other tasks involving issues ultimately rely on the issue being classified in such a way that relevant parties looking to do their own tasks can find them quickly and easily.\n\nIn order to label issues, [open up the list of unlabeled issues](https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/issues?q=is%3Aopen+is%3Aissue+no%3Alabel) and, **from newest to oldest**, read through each one and apply issue labels according to the table below. If you're unsure about what label to apply, skip the issue and try the next one: don't feel obligated to label each and every issue yourself!\n\nLabel | Apply When | Notes\n--- | --- | ---\n`bug` | Cases where the code (or documentation) is behaving in a way it wasn't intended to. | If something is happening that surprises the *user* but does not go against the way the code is designed, it should use the `enhancement` label.\n`critical` | Added to `bug` issues if the problem described makes the code completely unusable in a common situation. |\n`documentation` | Added to issues or pull requests that affect any of the documentation for the project. | Can be combined with other labels, such as `bug` or `enhancement`.\n`duplicate` | Added to issues or PRs that refer to the exact same issue as another one that's been previously labeled. | Duplicate issues should be marked and closed right away, with a message referencing the issue it's a duplicate of (with `#123`)\n`enhancement` | Added to [feature requests](#request-a-feature), PRs, or documentation issues that are purely additive: the code or docs currently work as expected, but a change is being requested or suggested. |\n`help wanted` | Applied by [Committers](#join-the-project-team) to issues and PRs that they would like to get outside help for. Generally, this means it's lower priority for the maintainer team to itself implement, but that the community is encouraged to pick up if they so desire | Never applied on first-pass labeling.\n`in-progress` | Applied by [Committers](#join-the-project-team) to PRs that are pending some work before they're ready for review. | The original PR submitter should @mention the team member that applied the label once the PR is complete.\n`performance` | This issue or PR is directly related to improving performance. |\n`refactor` | Added to issues or PRs that deal with cleaning up or modifying the project for the betterment of it. |\n`starter` | Applied by [Committers](#join-the-project-team) to issues that they consider good introductions to the project for people who have not contributed before. These are not necessarily \"easy\", but rather focused around how much context is necessary in order to understand what needs to be done for this project in particular. | Existing project members are expected to stay away from these unless they increase in priority.\n`support` | This issue is either asking a question about how to use the project, clarifying the reason for unexpected behavior, or possibly reporting a `bug` but does not have enough detail yet to determine whether it would count as such. | The label should be switched to `bug` if reliable reproduction steps are provided. Issues primarily with unintended configurations of a user's environment are not considered bugs, even if they cause crashes.\n`tests` | This issue or PR either requests or adds primarily tests to the project. | If a PR is pending tests, that will be handled through the [PR review process](#review-pull-requests)\n`wontfix` | Labelers may apply this label to issues that clearly have nothing at all to do with the project or are otherwise entirely outside of its scope/sphere of influence. [Committers](#join-the-project-team) may apply this label and close an issue or PR if they decide to pass on an otherwise relevant issue. | The issue or PR should be closed as soon as the label is applied, and a clear explanation provided of why the label was used. Contributors are free to contest the labeling, but the decision ultimately falls on committers as to whether to accept something or not.\n\n## Clean Up Issues and PRs\n\nIssues and PRs can go stale after a while. Maybe they're abandoned. Maybe the team will just plain not have time to address them any time soon.\n\nIn these cases, they should be closed until they're brought up again or the interaction starts over.\n\nTo clean up issues and PRs:\n\n* Search the issue tracker for issues or PRs, and add the term `updated:<=YYYY-MM-DD`, where the date is 30 days before today.\n* Go through each issue *from oldest to newest*, and close them if **all of the following are true**:\n  * not opened by a maintainer\n  * not marked as `critical`\n  * not marked as `starter` or `help wanted` (these might stick around for a while, in general, as they're intended to be available)\n  * no explicit messages in the comments asking for it to be left open\n  * does not belong to a milestone\n* Leave a message when closing saying \"Cleaning up stale issue. Please reopen or ping us if and when you're ready to resume this. See https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/blob/latest/CONTRIBUTING.md#clean-up-issues-and-prs for more details.\"\n\n## Review Pull Requests\n\nWhile anyone can comment on a PR, add feedback, etc, PRs are only *approved* by team members with Issue Tracker or higher permissions.\n\nPR reviews use [GitHub's own review feature](https://help.github.com/articles/about-pull-request-reviews/), which manages comments, approval, and review iteration.\n\nSome notes:\n\n* You may ask for minor changes (\"nitpicks\"), but consider whether they are really blockers to merging: try to err on the side of \"approve, with comments\".\n* *ALL PULL REQUESTS* should be covered by a test: either by a previously-failing test, an existing test that covers the entire functionality of the submitted code, or new tests to verify any new/changed behavior. All tests must also pass and follow established conventions. Test coverage should not drop, unless the specific case is considered reasonable by maintainers.\n* Please make sure you're familiar with the code or documentation being updated, unless it's a minor change (spellchecking, minor formatting, etc). You may @mention another project member who you think is better suited for the review, but still provide a non-approving review of your own.\n* Be extra kind: people who submit code/doc contributions are putting themselves in a pretty vulnerable position, and have put time and care into what they've done (even if that's not obvious to you!) -- always respond with respect, be understanding, but don't feel like you need to sacrifice your standards for their sake, either. Just don't be a jerk about it?\n\n## Merge Pull Requests\n\nProject Team will merge pull requests after review.\n\n## Tag A Release\n\nProject Team will bump tags/version with [setver](https://github.com/pforret/setver) as a patch or minor versionupdate.\nReleases are done manually for important changes.\n\n\n## Join the Project Team\n\n### Ways to Join\n\nThere are many ways to contribute! Most of them don't require any official status unless otherwise noted. That said, there's a couple of positions that grant special repository abilities, and this section describes how they're granted and what they do.\n\nAll of the below positions are granted based on the project team's needs, as well as their consensus opinion about whether they would like to work with the person and think that they would fit well into that position. The process is relatively informal, and it's likely that people who express interest in participating can just be granted the permissions they'd like.\n\nYou can spot a collaborator on the repo by looking for the `[Collaborator]` or `[Owner]` tags next to their names.\n\nPermission | Description\n--- | ---\nIssue Tracker | Granted to contributors who express a strong interest in spending time on the project's issue tracker. These tasks are mainly [labeling issues](#label-issues), [cleaning up old ones](#clean-up-issues-and-prs), and [reviewing pull requests](#review-pull-requests), as well as all the usual things non-team-member contributors can do. Issue handlers should not merge pull requests, tag releases, or directly commit code themselves: that should still be done through the usual pull request process. Becoming an Issue Handler means the project team trusts you to understand enough of the team's process and context to implement it on the issue tracker.\nCommitter | Granted to contributors who want to handle the actual pull request merges, tagging new versions, etc. Committers should have a good level of familiarity with the codebase, and enough context to understand the implications of various changes, as well as a good sense of the will and expectations of the project team.\nAdmin/Owner | Granted to people ultimately responsible for the project, its community, etc.\n\n## Attribution\n\nThis guide was generated using the WeAllJS `CONTRIBUTING.md` generator. [Make your own](https://npm.im/weallcontribute)!\n\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 Chris Titus, Matthias Morin\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "![GH language](https://img.shields.io/github/languages/top/ChrisTitusTech/Top-5-Bootloader-Themes)\n![GH license](https://img.shields.io/github/license/ChrisTitusTech/Top-5-Bootloader-Themes)\n![GH stars](https://img.shields.io/github/stars/ChrisTitusTech/Top-5-Bootloader-Themes)\n![Bash CI](https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/workflows/bash_unit%20CI/badge.svg)\n![Shellcheck CI](https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/workflows/Shellcheck%20CI/badge.svg)\n\nChrisTitusTech Top 5 Bootloader Themes\n======================================\n\nInstall Bootloader Themes with ease.\n\n- Chris Titus Tech Channel : [https://www.youtube.com/@christitustech](https://www.youtube.com/@christitustech)\n- Chris Titus Tech YouTube Video : [Bootloader Themes | Install & Configuration](https://www.youtube.com/watch?v=BAyzHP1Cqb0)\n- Full Walkthrough : [https://christitus.com/bootloader-themes](https://christitus.com/bootloader-themes)\n\n🚀 Installation\n---------------\n\nSimply enter following commands in your terminal :\n\n```bash\n$ git clone https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes\n$ cd Top-5-Bootloader-Themes\n$ sudo ./install.sh\n```\n\n💻 Dependencies\n---------------\n\n**ChrisTitusTech Top 5 Bootloader Themes** requires the following dependencies:\n\n- git\n\n---\n\n### 🔖 git\n\n#### 🐧 Install git (Linux)\n\n```bash\n$ sudo apt-get install --assume-yes git\n```\n\n#### 🏁 Install git (Windows)\n\nDownload and install latest version from here [git-scm.com](https://git-scm.com/download/win)\n\n#### 🍎 Install git (OSX)\n\n```bash\n$ brew install git\n```\n\n#### 🔧 git configuration\n\nPush current branch only if upstream exists\n\n```bash\n$ git config --global push.default simple\n```\n\nSet vim as git default editor\n\n```bash\n$ git config --global core.editor 'vim'\n```\n\n🤝 Contributing\n---------------\n\nThank you for your interest in contributing to **ChrisTitusTech Top 5 Bootloader Themes**.\n\nPlease review the [code of conduct](./CODE_OF_CONDUCT.md) and [contribution guidelines](./CONTRIBUTING.md) before starting to work on any features.\n\nIf you want to open an issue, please check first if it was not [reported already](https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/issues) before creating a new one.\n\n📜 License\n----------\n\nCopyrights (c) 2021 &quot;Chris Titus&quot; &lt;contact@christitus.com&gt; &amp; &quot;Matthias Morin&quot; &lt;mat@tangoman.io&gt;\n\n[![License](https://img.shields.io/badge/Licence-MIT-green.svg)](LICENSE)\nDistributed under the MIT license.\n\nIf you like **ChrisTitusTech Top 5 Bootloader Themes** please star, follow or tweet about it:\n\n[![GitHub stars](https://img.shields.io/github/stars/ChrisTitusTech/Top-5-Bootloader-Themes?style=social)](https://github.com/ChrisTitusTech/Top-5-Bootloader-Themes/stargazers)\n[![GitHub followers](https://img.shields.io/github/followers/ChrisTitusTech?style=social)](https://github.com/ChrisTitusTech)\n[![Twitter](https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Fgithub.com%2FChrisTitusTech%2FTop-5-Bootloader-Themes)](https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2FChrisTitusTech%2FTop-5-Bootloader-Themes)\n\n🙏 Acknowledgements\n-------------------\n\nThere is no obligation, but follow me ([TangoMan75](https://github.com/TangoMan75)) on GitHub and star some cool open source projects you like, it helps a lot. Thanks.\n"
  },
  {
    "path": "install.sh",
    "content": "#!/bin/bash\n\n#/**\n# * ChrisTechTips Grub2 Theme Installer\n# *\n# * @license MIT\n# * @author  \"Chris Titus\" <contact@christitus.com>\n# * @author  \"Matthias Morin\" <mat@tangoman.io>\n# * @version 1.0.0\n# * @link    https://youtu.be/BAyzHP1Cqb0\n# */\n\n#THEME_DIR='/usr/share/grub/themes'\nTHEME_DIR='/boot/grub/themes'\nTHEME_NAME=''\n\nfunction echo_title() {     echo -ne \"\\033[1;44;37m${*}\\033[0m\\n\"; }\nfunction echo_caption() {   echo -ne \"\\033[0;1;44m${*}\\033[0m\\n\"; }\nfunction echo_bold() {      echo -ne \"\\033[0;1;34m${*}\\033[0m\\n\"; }\nfunction echo_danger() {    echo -ne \"\\033[0;31m${*}\\033[0m\\n\"; }\nfunction echo_success() {   echo -ne \"\\033[0;32m${*}\\033[0m\\n\"; }\nfunction echo_warning() {   echo -ne \"\\033[0;33m${*}\\033[0m\\n\"; }\nfunction echo_secondary() { echo -ne \"\\033[0;34m${*}\\033[0m\\n\"; }\nfunction echo_info() {      echo -ne \"\\033[0;35m${*}\\033[0m\\n\"; }\nfunction echo_primary() {   echo -ne \"\\033[0;36m${*}\\033[0m\\n\"; }\nfunction echo_error() {     echo -ne \"\\033[0;1;31merror:\\033[0;31m\\t${*}\\033[0m\\n\"; }\nfunction echo_label() {     echo -ne \"\\033[0;1;32m${*}:\\033[0m\\t\"; }\nfunction echo_prompt() {    echo -ne \"\\033[0;36m${*}\\033[0m \"; }\n\nfunction splash() {\n    local hr\n    hr=\" **$(printf \"%${#1}s\" | tr ' ' '*')** \"\n    echo_title \"${hr}\"\n    echo_title \" * $1 * \"\n    echo_title \"${hr}\"\n    echo\n}\n\nfunction check_root() {\n    # Checking for root access and proceed if it is present\n    ROOT_UID=0\n    if [[ ! \"${UID}\" -eq \"${ROOT_UID}\" ]]; then\n        # Error message\n        echo_error 'Run me as root.'\n        echo_info 'try sudo ./install.sh'\n        exit 1\n    fi\n}\n\nfunction select_theme() {\n    themes=('Vimix' 'Cyberpunk' 'Shodan' 'fallout' 'CyberRe' 'minegrub-theme' 'Quit')\n\n    PS3=$(echo_prompt '\\nChoose The Theme You Want: ')\n    select THEME_NAME in \"${themes[@]}\"; do\n        case \"${THEME_NAME}\" in\n            'Vimix')\n                splash 'Installing Vimix Theme...'\n                break;;\n            'Cyberpunk')\n                splash 'Installing Cyberpunk Theme...'\n                break;;\n            'Shodan')\n                splash 'Installing Shodan Theme...'\n                break;;\n            'fallout')\n                splash 'Installing fallout Theme...'\n                break;;\n            'CyberRe')\n                splash 'Installing CyberRe Theme...'\n                break;;\n            'minegrub-theme')\n                splash 'Installing Minecraft Theme...'\n                break;;\n            'Quit')\n                echo_info 'User requested exit...!'\n                exit 0;;\n            *) echo_warning \"invalid option \\\"${REPLY}\\\"\";;\n        esac\n    done\n}\n\nfunction backup() {\n    # Backup grub config\n    echo_info 'cp -an /etc/default/grub /etc/default/grub.bak'\n    cp -an /etc/default/grub /etc/default/grub.bak\n}\n\nfunction install_theme() {\n    # create themes directory if not exists\n    if [[ ! -d \"${THEME_DIR}/${THEME_NAME}\" ]]; then\n        # Copy theme\n        echo_primary \"Installing ${THEME_NAME} theme...\"\n\n        echo_info \"mkdir -p \\\"${THEME_DIR}/${THEME_NAME}\\\"\"\n        mkdir -p \"${THEME_DIR}/${THEME_NAME}\"\n\n        echo_info \"cp -a ./themes/\\\"${THEME_NAME}\\\"/* \\\"${THEME_DIR}/${THEME_NAME}\\\"\"\n        cp -a ./themes/\"${THEME_NAME}\"/* \"${THEME_DIR}/${THEME_NAME}\"\n    fi\n}\n\nfunction config_grub() {\n    echo_primary 'Enabling grub menu'\n    # remove default grub style if any\n    echo_info \"sed -i '/GRUB_TIMEOUT_STYLE=/d' /etc/default/grub\"\n    sed -i '/GRUB_TIMEOUT_STYLE=/d' /etc/default/grub\n\n    # issue #16\n    echo_info \"sed -i '/GRUB_TERMINAL_OUTPUT=/d' /etc/default/grub\"\n    sed -i '/GRUB_TERMINAL_OUTPUT=/d' /etc/default/grub\n\n    echo_info \"echo 'GRUB_TIMEOUT_STYLE=\\\"menu\\\"' >> /etc/default/grub\"\n    echo 'GRUB_TIMEOUT_STYLE=\"menu\"' >> /etc/default/grub\n\n    #--------------------------------------------------\n\n    echo_primary 'Setting grub timeout to 60 seconds'\n    # remove default timeout if any\n    echo_info \"sed -i '/GRUB_TIMEOUT=/d' /etc/default/grub\"\n    sed -i '/GRUB_TIMEOUT=/d' /etc/default/grub\n\n    echo_info \"echo 'GRUB_TIMEOUT=\\\"60\\\"' >> /etc/default/grub\"\n    echo 'GRUB_TIMEOUT=\"60\"' >> /etc/default/grub\n\n    #--------------------------------------------------\n\n    echo_primary \"Setting ${THEME_NAME} as default\"\n    # remove theme if any\n    echo_info \"sed -i '/GRUB_THEME=/d' /etc/default/grub\"\n    sed -i '/GRUB_THEME=/d' /etc/default/grub\n\n    echo_info \"echo \\\"GRUB_THEME=\\\"${THEME_DIR}/${THEME_NAME}/theme.txt\\\"\\\" >> /etc/default/grub\"\n    echo \"GRUB_THEME=\\\"${THEME_DIR}/${THEME_NAME}/theme.txt\\\"\" >> /etc/default/grub\n    \n    #--------------------------------------------------\n\n    echo_primary 'Setting grub graphics mode to auto'\n    # remove default timeout if any\n    echo_info \"sed -i '/GRUB_GFXMODE=/d' /etc/default/grub\"\n    sed -i '/GRUB_GFXMODE=/d' /etc/default/grub\n\n    echo_info \"echo 'GRUB_GFXMODE=\\\"auto\\\"' >> /etc/default/grub\"\n    echo 'GRUB_GFXMODE=\"auto\"' >> /etc/default/grub   \n}\n\nfunction update_grub() {\n    # Update grub config\n    echo_primary 'Updating grub config...'\n    if [[ -x \"$(command -v update-grub)\" ]]; then\n        echo_info 'update-grub'\n        update-grub\n\n    elif [[ -x \"$(command -v grub-mkconfig)\" ]]; then\n        echo_info 'grub-mkconfig -o /boot/grub/grub.cfg'\n        grub-mkconfig -o /boot/grub/grub.cfg\n\n    elif [[ -x \"$(command -v grub2-mkconfig)\" ]]; then\n        if [[ -x \"$(command -v zypper)\" ]]; then\n            echo_info 'grub2-mkconfig -o /boot/grub2/grub.cfg'\n            grub2-mkconfig -o /boot/grub2/grub.cfg\n\n        elif [[ -x \"$(command -v dnf)\" ]]; then\n            echo_info 'grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg'\n            grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg\n        fi\n    fi\n}\n\nfunction main() {\n    splash 'The Matrix awaits you...'\n\n    check_root\n    select_theme\n\n    install_theme\n\n    config_grub\n    update_grub\n\n    echo_success 'Boot Theme Update Successful!'\n}\n\nmain\n"
  },
  {
    "path": "run_linter.sh",
    "content": "#!/bin/bash\n\n#/**\n# * TangoMan shellcheck linter\n# *\n# * @license MIT\n# * @author  \"Matthias Morin\" <mat@tangoman.io>\n# */\n\nfunction echo_title() {     echo -ne \"\\033[1;44;37m${*}\\033[0m\\n\"; }\nfunction echo_caption() {   echo -ne \"\\033[0;1;44m${*}\\033[0m\\n\"; }\nfunction echo_bold() {      echo -ne \"\\033[0;1;34m${*}\\033[0m\\n\"; }\nfunction echo_danger() {    echo -ne \"\\033[0;31m${*}\\033[0m\\n\"; }\nfunction echo_success() {   echo -ne \"\\033[0;32m${*}\\033[0m\\n\"; }\nfunction echo_warning() {   echo -ne \"\\033[0;33m${*}\\033[0m\\n\"; }\nfunction echo_secondary() { echo -ne \"\\033[0;34m${*}\\033[0m\\n\"; }\nfunction echo_info() {      echo -ne \"\\033[0;35m${*}\\033[0m\\n\"; }\nfunction echo_primary() {   echo -ne \"\\033[0;36m${*}\\033[0m\\n\"; }\nfunction echo_error() {     echo -ne \"\\033[0;1;31merror:\\033[0;31m\\t${*}\\033[0m\\n\"; }\nfunction echo_label() {     echo -ne \"\\033[0;1;32m${*}:\\033[0m\\t\"; }\nfunction echo_prompt() {    echo -ne \"\\033[0;36m${*}\\033[0m \"; }\n\nclear\n\necho_title ' ############################## '\necho_title ' # TangoMan Shellcheck Linter # '\necho_title ' ############################## '\necho\n\nif [ ! -x \"$(command -v shellcheck)\" ]; then\n    echo_error \"\\\"$(basename \"${0}\")\\\" requires shellcheck, try: 'sudo apt-get install -y shellcheck'\"\n    exit 1\nfi\n\necho_info \"find . -name '*.sh' | sort -t '\\0' -n | xargs shellcheck\"\nfind . -name '*.sh' | sort -t '\\0' -n | xargs shellcheck\n\n"
  },
  {
    "path": "run_tests.sh",
    "content": "#!/bin/bash\n\n#/**\n# * TangoMan Test Runner\n# *\n# * Runs tests in test directory with bash_unit\n# *\n# * @licence MIT\n# * @author  \"Matthias Morin\" <mat@tangoman.io>\n# */\n\nfunction echo_title() {     echo -ne \"\\033[1;44;37m${*}\\033[0m\\n\"; }\nfunction echo_caption() {   echo -ne \"\\033[0;1;44m${*}\\033[0m\\n\"; }\nfunction echo_bold() {      echo -ne \"\\033[0;1;34m${*}\\033[0m\\n\"; }\nfunction echo_danger() {    echo -ne \"\\033[0;31m${*}\\033[0m\\n\"; }\nfunction echo_success() {   echo -ne \"\\033[0;32m${*}\\033[0m\\n\"; }\nfunction echo_warning() {   echo -ne \"\\033[0;33m${*}\\033[0m\\n\"; }\nfunction echo_secondary() { echo -ne \"\\033[0;34m${*}\\033[0m\\n\"; }\nfunction echo_info() {      echo -ne \"\\033[0;35m${*}\\033[0m\\n\"; }\nfunction echo_primary() {   echo -ne \"\\033[0;36m${*}\\033[0m\\n\"; }\nfunction echo_error() {     echo -ne \"\\033[0;1;31merror:\\033[0;31m\\t${*}\\033[0m\\n\"; }\nfunction echo_label() {     echo -ne \"\\033[0;1;32m${*}:\\033[0m\\t\"; }\nfunction echo_prompt() {    echo -ne \"\\033[0;36m${*}\\033[0m \"; }\n\ntest_directory=\"$(realpath \"$(pwd)\")/tests\"\n\nclear\n\necho_title ' ######################## '\necho_title ' # TangoMan Test Runner # '\necho_title ' ######################## '\necho\n\nif [ ! -d \"${test_directory}\" ]; then\n    mkdir -p \"${test_directory}\"\n\n    cat > \"${test_directory}/test_bash.sh\" <<EOF\n#!/bin/bash\n\n# https://github.com/pgrange/bash_unit\n#\n#     assert \"test -e /tmp/the_file\"\n#     assert_fails \"grep this /tmp/the_file\" \"should not write 'this' in /tmp/the_file\"\n#     assert_status_code 25 code\n#     assert_equals \"a string\" \"another string\" \"a string should be another string\"\n#     assert_not_equals \"a string\" \"a string\" \"a string should be different from another string\"\n#     fake ps echo hello world\n\ntest_can_fail() {\n    fail \"You need to write some tests\"\n}\nEOF\nfi\n\nif [ ! -f \"${test_directory}/bash_unit\" ]; then\n    if [ -x \"$(command -v wget)\" ]; then\n        echo_info \"wget -qO \\\"${test_directory}/bash_unit\\\" https://raw.githubusercontent.com/pgrange/bash_unit/master/bash_unit\"\n        wget -qO \"${test_directory}/bash_unit\" https://raw.githubusercontent.com/pgrange/bash_unit/master/bash_unit\n\n    elif [ -x \"$(command -v curl)\" ]; then\n        echo_info \"curl -sSL -o \\\"${test_directory}/bash_unit\\\" https://raw.githubusercontent.com/pgrange/bash_unit/master/bash_unit\"\n        curl -sSL -o \"${test_directory}/bash_unit\" https://raw.githubusercontent.com/pgrange/bash_unit/master/bash_unit\n\n    else\n        echo_error \"could not find \\\"bash_unit\\\" executable, please install manually\"\n        exit 1\n    fi\nfi\n\nif [ ! -x \"${test_directory}/bash_unit\" ]; then\n    echo_info \"chmod +x \\\"${test_directory}\\\"/bash_unit\"\n    chmod +x \"${test_directory}\"/bash_unit\nfi\n\necho_info \"cd \\\"${test_directory}\\\" || exit 1\"\ncd \"${test_directory}\" || exit 1\n\necho_info './bash_unit -f tap test_*'\n./bash_unit -f tap test_*\n\n"
  },
  {
    "path": "tests/bash_unit",
    "content": "#!/usr/bin/env bash\n#\n#   bash unit testing enterprise edition framework for professionals\n#   Copyright (C) 2011-2016 Pascal Grange\n#   This program is free software; you can redistribute it and/or modify\n#   it under the terms of the GNU General Public License as published by\n#   the Free Software Foundation; either version 3 of the License, or\n#   (at your option) any later version.\n#   This program is distributed in the hope that it will be useful,\n#   but WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n#   GNU General Public License for more details.\n#   You should have received a copy of the GNU General Public License\n#   along with this program; if not, write to the Free Software Foundation,\n#   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA\n#\n#  https://github.com/pgrange/bash_unit\n\nVERSION=v1.7.1\n\nESCAPE=$(printf \"\\033\")\nNOCOLOR=\"${ESCAPE}[0m\"\nRED=\"${ESCAPE}[91m\"\nGREEN=\"${ESCAPE}[92m\"\nYELLOW=\"${ESCAPE}[93m\"\nBLUE=\"${ESCAPE}[94m\"\n\n# Make bash_unit immune to some basic unix commands faking\nCAT=\"$(which cat)\"\nSED=\"$(which sed)\"\nGREP=\"$(which grep)\"\nRM=\"$(which rm)\"\n\nfail() {\n  local message=${1:-}\n  local stdout=${2:-}\n  local stderr=${3:-}\n\n  notify_test_failed \"$__bash_unit_current_test__\" \"$message\"\n  [[ ! -z $stdout ]] && [ -s \"$stdout\" ] && notify_stdout < \"$stdout\"\n  [[ ! -z $stderr ]] && [ -s \"$stderr\" ] && notify_stderr < \"$stderr\"\n\n  stacktrace | notify_stack\n  exit 1\n}\n\nassert() {\n  local assertion=$1\n  local message=${2:-}\n\n  _assert_expression \\\n    \"$assertion\" \\\n    \"[ \\$status == 0 ]\" \\\n    \"\\\"$message\\\"\"\n}\n\nassert_fails() {\n  local assertion=$1\n  local message=${2:-}\n\n  _assert_expression \\\n    \"$assertion\" \\\n    \"[ \\$status != 0 ]\" \\\n    \"\\\"$message\\\"\"\n}\n\nassert_fail() {\n  #deprecated, use assert_fails instead\n  assert_fails \"$@\"\n}\n\nassert_status_code() {\n  local expected_status=$1\n  local assertion=\"$2\"\n  local message=\"${3:-}\"\n\n  _assert_expression \\\n    \"$assertion\" \\\n    \"[ \\$status == $expected_status ]\" \\\n    \"\\\"$message\\\" expected status code $expected_status but was \\$status\"\n}\n\n_assert_expression() {\n  local assertion=$1\n  local condition=$2\n  local message=$3\n  (\n    local stdout=$(mktemp)\n    local stderr=$(mktemp)\n    trap \"$RM  -f \\\"$stdout\\\" \\\"$stderr\\\"\" EXIT\n\n    local status\n    eval \"($assertion)\" >\"$stdout\" 2>\"$stderr\" && status=$? || status=$?\n    if ! eval \"$condition\"\n    then\n      fail \"$(eval echo $message)\" \"$stdout\" \"$stderr\"\n    fi\n  ) || exit $?\n}\n\nassert_equals() {\n  local expected=$1\n  local actual=$2\n  local message=${3:-}\n  [[ -z $message ]] || message=\"$message\\n\"\n  \n  if [ \"$expected\" != \"$actual\" ]\n  then\n    fail \"$message expected [$expected] but was [$actual]\"\n  fi\n}\n\nassert_not_equals() {\n  local unexpected=$1\n  local actual=$2\n  local message=${3:-}\n  [[ -z $message ]] || message=\"$message\\n\"\n\n  [ \"$unexpected\" != \"$actual\" ] || \\\n    fail \"$message expected different value than [$unexpected] but was the same\"\n}\n\nfake() {\n  local command=$1\n  shift\n  if [ $# -gt 0 ]\n  then\n    eval \"function $command() { export FAKE_PARAMS=\\\"\\$@\\\" ; $@ ; }\"\n  else\n    eval \"function $command() { echo \\\"$($CAT)\\\" ; }\"\n  fi\n  export -f $command\n}\n\nstacktrace() {\n  local i=1\n  while ! [ -z \"${BASH_SOURCE[$i]:-}\" ]\n  do\n    echo ${BASH_SOURCE[$i]}:${BASH_LINENO[$((i-1))]}:${FUNCNAME[$i]}\\(\\)\n    i=$((i + 1))\n  done | \"$GREP\" -v \"^$BASH_SOURCE\"\n}\n\nrun_test_suite() {\n  local failure=0\n\n  declare -F | \"$GREP\" ' setup_suite$' >/dev/null && setup_suite\n\n  for pending_test in $(set | \"$GREP\"  -E '^(pending|todo).* \\(\\)' | \"$GREP\" -E \"$test_pattern\" | \"$SED\" -e 's: .*::')\n  do\n    notify_test_starting \"$pending_test\"\n    notify_test_pending \"$pending_test\"\n  done\n\n\n  for test in $(set | \"$GREP\"  -E '^test.* \\(\\)' | \"$GREP\" -E \"$test_pattern\" | \"$SED\" -e 's: .*::')\n  do\n    (\n      local status=0\n      declare -F | \"$GREP\" ' setup$' >/dev/null && setup\n      (__bash_unit_current_test__=\"$test\" run_test) || status=$?\n      declare -F | \"$GREP\" ' teardown$' >/dev/null && teardown\n      exit $status\n    )\n    failure=$(( $? || failure))\n  done\n\n  declare -F | \"$GREP\" ' teardown_suite$' >/dev/null && teardown_suite\n\n  return $failure\n}\n\nrun_test() {\n  set -e\n  notify_test_starting \"$__bash_unit_current_test__\"\n  \"$__bash_unit_current_test__\" && notify_test_succeeded \"$__bash_unit_current_test__\"\n}\n\nusage() {\n  echo \"$1\" >&2\n  echo \"$0 [-f <output format>] [-p <pattern1>] [-p <pattern2>]... <test_file1> <test_file2>...\" >&2\n  echo >&2\n  echo \"Runs tests in test files that match <pattern>s\" >&2\n  echo \"<output format> is optional only supported value is tap\" >&2\n  echo \"-v to get current version information\" >&2\n  echo \"See https://github.com/pgrange/bash_unit\" >&2\n  exit 1\n}\n\n# Formating\n\npretty_success() {\n  pretty_format \"$GREEN\" \"\\u2713\" \"${1:-}\"\n}\n\npretty_warning() {\n  pretty_format \"$YELLOW\" \"\\u2717\" \"$1\"\n}\n\npretty_failure() {\n  pretty_format \"$RED\" \"\\u2717\" \"${1:-}\"\n}\n\npretty_format() {\n  local color=\"$1\"\n  local pretty_symbol=\"$2\"\n  local alt_symbol=\"$3\"\n  local term_utf8=false\n  if is_terminal && [[ \"$LANG\" =~ .*UTF-8.* ]]\n  then\n    term_utf8=true\n  fi\n  (\n    $CAT\n    if $term_utf8\n    then\n      echo -en \" $pretty_symbol \"\n    else\n      [[ ! -z \"$alt_symbol\" ]] && echo -en \" $alt_symbol \"\n    fi\n  ) | color \"$color\"\n}\n\ncolor() {\n  _start_color() {\n    if is_terminal ; then echo -en \"$color\" ; fi\n  }\n  _stop_color() {\n    if is_terminal ; then echo -en \"$NOCOLOR\" ; fi\n  }\n  local color=$1\n  shift\n  _start_color\n  if [ $# -gt 0 ]\n  then\n    echo $*\n  else\n    $CAT\n  fi\n  _stop_color\n}\n\nis_terminal() {\n  [ -t 1 ] || [[ \"${FORCE_COLOR}\" == true ]]\n}\n\ntext_format() {\n  notify_suite_starting() {\n    local test_file=\"$1\"\n    echo \"Running tests in $test_file\"\n  }\n  notify_test_starting() {\n    local test=\"$1\"\n    echo -n \"Running $test... \" | color \"$BLUE\"\n  }\n  notify_test_pending() {\n    echo -n \"PENDING\" | pretty_warning\n    echo\n  }\n\n  notify_test_succeeded() {\n    echo -n \"SUCCESS\" | pretty_success\n    echo\n  }\n  notify_test_failed() {\n    local message=\"$2\"\n    echo -n \"FAILURE\" | pretty_failure\n    echo\n    [[ -z $message  ]] || printf -- \"$message\\n\"\n  }\n  notify_stdout() {\n    \"$SED\" 's:^:out> :' | color \"$GREEN\"\n  }\n  notify_stderr() {\n    \"$SED\" 's:^:err> :' | color \"$RED\"\n  }\n  notify_stack() {\n    color \"$YELLOW\"\n  }\n}\n\ntap_format() {\n  notify_suite_starting() {\n    local test_file=\"$1\"\n    echo \"# Running tests in $test_file\"\n  }\n  notify_test_starting() {\n    echo -n\n  }\n  notify_test_pending() {\n    local test=\"$1\"\n    echo -n \"ok\" | pretty_warning -\n    echo -n \"$test\" | color \"$BLUE\"\n    echo \" # skip test to be written\" | color \"$YELLOW\"\n  }\n  notify_test_succeeded() {\n    local test=\"$1\"\n    echo -n \"ok\" | pretty_success -\n    echo \"$test\" | color \"$BLUE\"\n  }\n  notify_test_failed() {\n    local test=\"$1\"\n    local message=\"$2\"\n    echo -n \"not ok\" | pretty_failure -\n    echo \"$test\" | color \"$BLUE\"\n    [[ -z $message  ]] || printf -- \"$message\\n\" | \"$SED\" -u -e 's/^/# /'\n  }\n  notify_stdout() {\n    \"$SED\" 's:^:# out> :' | color \"$GREEN\"\n  }\n  notify_stderr() {\n    \"$SED\" 's:^:# err> :' | color \"$RED\"\n  }\n  notify_stack() {\n    \"$SED\" 's:^:# :' | color \"$YELLOW\"\n  }\n}\n\noutput_format=text\ntest_pattern=\"\"\nseparator=\"\"\nwhile getopts \"vp:f:\" option\ndo\n  case \"$option\" in\n    p)\n      test_pattern=\"${test_pattern}${separator}${OPTARG}\"\n      separator=\"|\"\n      ;;\n    f)\n      output_format=\"${OPTARG}\"\n      ;;\n    v)\n      echo \"bash_unit $VERSION\"\n      exit\n      ;;\n    ?|:)\n      usage\n      ;;\n  esac\ndone\nshift $((OPTIND-1))\n\nfor test_file in \"$@\"\ndo\n  test -e \"$test_file\" || usage \"file does not exist: $test_file\"\n  test -r \"$test_file\" || usage \"can not read file: $test_file\"\ndone\n\ncase \"$output_format\" in\n  text)\n    text_format\n    ;;\n  tap)\n    tap_format\n    ;;\n  *)\n    usage \"unsupproted output format: $output_format\"\n    ;;\nesac\n\n#run tests received as parameters\nfailure=0\nfor test_file in \"$@\"\ndo\n  notify_suite_starting \"$test_file\"\n  (\n    set -e # Ensure bash_unit with exit with failure\n           # in case of syntax error.\n    if [[ \"${STICK_TO_CWD}\" != true ]]\n    then\n      cd \"$(dirname \"$test_file\")\"\n      source \"$(basename \"$test_file\")\"\n    else\n      source \"$test_file\"\n    fi\n    set +e\n    run_test_suite\n  )\n  failure=$(( $? || failure))\ndone\nexit $failure\n"
  },
  {
    "path": "tests/test_install.sh",
    "content": "#!/bin/bash\n\n# https://github.com/pgrange/bash_unit\n#\n#     assert \"test -e /tmp/the_file\"\n#     assert_fails \"grep this /tmp/the_file\" \"should not write 'this' in /tmp/the_file\"\n#     assert_status_code 25 code # 127: command not found; 126: command not executable\n#     assert_equals \"a string\" \"another string\" \"a string should be another string\"\n#     assert_not_equals \"a string\" \"a string\" \"a string should be different from another string\"\n#     fake ps echo hello world\n\nsrc_file=\"../install.sh\"\n\ntest_script_execution_should_return_expected_status_code() {\n    # script should be run with root privileges\n    assert_status_code 1 \"${src_file}\"\n}\n"
  },
  {
    "path": "themes/CyberRe/theme.txt",
    "content": "# Copyright (C) 2020 L. Henrique Lopes - HENK\n\n# general settings\n title-text: \"\"\n title-color: \"#3ec6ae\"\n message-font: \"DejaVu Sans Regular 14\"\n message-color: \"#fd262e\"\n message-bg-color: \"#808080\"\n desktop-image: \"background.png\"\n desktop-color: \"#808080\"\n terminal-font: \"DejaVu Sans Regular 14\"\n\n\n# boot menu\n+ boot_menu {\n    left = 28%\n    width = 50%\n    top = 22%\n    height = 45%\t\n    item_font = \"DroidLogo Regular 17\"\n    item_color = \"#fb3048\"\n    selected_item_font = \"DroidLogo Regular 17\"\n    selected_item_color = \"#74d6cf\"\n    icon_width = 16\n    icon_height = 16\n    item_height = 33\n    item_padding = 20\n    item_icon_space = 5\n    item_spacing = 5\n    menu_pixmap_style = \"boot_menu2_*.png\"\n    selected_item_pixmap_style = \"highlight_*.png\"\n}\n\n# Show progress\n+ progress_bar {\n  id = \"__timeout__\"\n  left = 0%\n  width = 100%\n  top = 99%\n  height = 31\n  show_text = false\n  text = \"\"\n  fg_color = \"#3daee9\"\n  bg_color = \"#31363b\"\n  border_color = \"#31363b\"\n  highlight_style = \"progress_highlight_*.png\"\n}\n\n\n"
  },
  {
    "path": "themes/Cyberpunk/theme.txt",
    "content": "# GRUB2 gfxmenu Linux theme\n# Designed for any resolution\n\n# Global Property\ntitle-text: \"\"\ndesktop-image: \"background.png\"\ndesktop-color: \"#000000\"\nterminal-font: \"Terminus Regular 14\"\nterminal-box: \"terminal_box_*.png\"\nterminal-left: \"0\"\nterminal-top: \"0\"\nterminal-width: \"100%\"\nterminal-height: \"100%\"\nterminal-border: \"0\"\n\n# Show the boot menu\n+ boot_menu {\n  left = 30%\n  top = 28%\n  width = 45%\n  height = 50%\n  item_font = \"Blender Pro Regular 16\"\n  item_color = \"#ffff00\"\n  selected_item_color = \"#000000\"\n  icon_width = 32\n  icon_height = 32\n  item_icon_space = 20\n  item_height = 36\n  item_padding = 5\n  item_spacing = 10\n  selected_item_pixmap_style = \"select_*.png\"\n  scrollbar = true\n  scrollbar_width = 24\n  scrollbar_thumb = \"sb_thumb_*.png\"\n  scrollbar_frame = \"sb_frame_*.png\"\n}\n\n+ progress_bar {\n  id = \"__timeout__\"\n  left = 23%\n  width = 60%\n  top = 80%\n  height = 31\n  show_text = false\n  text = \"\"\n  fg_color = \"#ffff00\"\n  bg_color = \"#31363b\"\n  border_color = \"#31363b\"\n  bar_style = \"progress_bar_*.png\"\n  highlight_style = \"progress_highlight_*.png\"\n}\n\n+ label {\n\ttop = 100%-25\n\tleft = 0\n\twidth = 100%\n\theight = 20\n\ttext = \"@KEYMAP_MIDDLE@\"\n\talign = \"center\"\n\tfont = \"Blender Pro Regular 12\"\n\tcolor = \"#FFFF00\"\n}\n\n"
  },
  {
    "path": "themes/Shodan/theme.txt",
    "content": "desktop-image: \"bgnd_1024x768.png\"\n#desktop-color: \"#000000\"\ntitle-text: \"\"\n#title-color: \"#67AC68\"\n#title-font: \"\"\nterminal-box: \"terminal_*.png\"\nterminal-font: \"Unifont Regular 16\"\n#message-font: \"Unifont Regular 16\"\n#message-color: \"#67AC68\"\n#message-bg-color: \"#000000\"\n+ boot_menu {\n    visible = true\n    left = 10\n    top = 50%-102\n    width = 400\n    height = 204\n    menu_pixmap_style = \"menu_*.png\"\n    scrollbar = true\n    scrollbar_width = 2\n    #scrollbar_frame = \"scr_frame_*.png\"\n    scrollbar_thumb = \"slider_*.png\"\n    item_font = \"Unifont Regular 16\"\n    item_color = \"#67AC68\"\n    selected_item_font = \"Unifont Regular 16\"\n    selected_item_color= \"#00FF00\"\n    #selected_item_pixmap_style = \"select_*.png\"\n    item_height = 20\n    item_padding = 10\n    item_spacing = 0\n    item_icon_space = 0\n    icon_width = 0\n    icon_height = 0\n}\n+ progress_bar {\n    visible = true\n\tid = \"__timeout__\"\n\tleft = 10\n\ttop = 50%+104\n\theight = 30\n\twidth = 400\n\tfont = \"Unifont Regular 16\"\n\ttext_color = \"#00FF00\"\n\tfg_color = \"#000000\"\n\tbg_color = \"#67AC68\"\n\tborder_color = \"#67AC68\"\n\ttext = \"@TIMEOUT_NOTIFICATION_SHORT@\"\n    bar_style = \"progress_border_*.png\"\n    highlight_style = \"progress_bar_*.png\"\n    \n}\n+ label {\n\ttop = 75%\n\tleft = 50%\n\twidth = 100%\n\theight = 25\n\ttext = \"\"\n\talign = \"center\"\n\tfont = \"Unifont Regular 16\"\n\tcolor = \"#FFFFFF\"\n}"
  },
  {
    "path": "themes/Vimix/theme.txt",
    "content": "# GRUB2 gfxmenu Linux theme\n# Designed for any resolution\n\n# Global Property\ntitle-text: \"\"\ndesktop-image: \"background.jpg\"\ndesktop-color: \"#000000\"\nterminal-font: \"Terminus Regular 14\"\nterminal-box: \"terminal_box_*.png\"\nterminal-left: \"0\"\nterminal-top: \"0\"\nterminal-width: \"100%\"\nterminal-height: \"100%\"\nterminal-border: \"0\"\n\n# Show the boot menu\n+ boot_menu {\n  left = 30%\n  top = 30%\n  width = 45%\n  height = 60%\n  item_font = \"Unifont Regular 16\"\n  item_color = \"#cccccc\"\n  selected_item_color = \"#ffffff\"\n  icon_width = 32\n  icon_height = 32\n  item_icon_space = 20\n  item_height = 36\n  item_padding = 5\n  item_spacing = 10\n  selected_item_pixmap_style = \"select_*.png\"\n}\n\n# Show a countdown message using the label component\n+ label {\n  top = 82%\n  left = 32%\n  width = 30%\n  align = \"center\"\n  id = \"__timeout__\"\n  text = \"Booting in %d seconds\"\n  color = \"#cccccc\"\n  font = \"Unifont Regular 16\"\n}\n"
  },
  {
    "path": "themes/fallout/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Andrei Shevchuk\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "themes/fallout/README.md",
    "content": "## Fallout GRUB theme\n\nSupported languages: Chinese (simplified), English, French, German, Italian, Norwegian, Portuguese, Russian, Spanish, Ukrainian\n\n![](https://i.imgur.com/7LUYwTn.gif)\n\n---\n\n### Installation / update\n\n1. **Secure way:**\n    - Download install script:  \n    `wget -P /tmp https://github.com/shvchk/fallout-grub-theme/raw/master/install.sh`\n    - Review install script at `/tmp/install.sh`\n    - Run it: `bash /tmp/install.sh`\n\n2. **Easier, less secure way** — just download and run install script:  \n    `wget -O - https://github.com/shvchk/fallout-grub-theme/raw/master/install.sh | bash`\n\n---\n\n### See also\n\n- [Poly light GRUB theme](https://github.com/shvchk/poly-light)\n- [Poly dark GRUB theme](https://github.com/shvchk/poly-dark)\n"
  },
  {
    "path": "themes/fallout/theme.txt",
    "content": "# Global properties\ntitle-text: \"\"\ndesktop-image: \"background.png\"\ndesktop-color: \"#000000\"\nterminal-font: \"Fixedsys Regular 32\"\nterminal-box: \"terminal_box_*.png\"\nterminal-left: \"0\"\nterminal-top: \"0\"\nterminal-width: \"100%\"\nterminal-height: \"100%\"\nterminal-border: \"0\"\n\n# Boot menu\n+ boot_menu {\n  left = 15%\n  top = 20%\n  width = 70%\n  height = 60%\n  item_font = \"Fixedsys Regular 32\"\n  item_color = \"#67d97a\"\n  selected_item_color = \"#ffffff\"\n  item_height = 48\n  item_spacing = 8\n  item_icon_space = 12\n  item_pixmap_style = \"item_*.png\"\n  selected_item_pixmap_style = \"selected_item_*.png\"\n}\n\n# Countdown message\n+ label {\n  left = 0\n  top = 98%-70\n  width = 100%\n  align = \"center\"\n  id = \"__timeout__\"\n  # DE\n  # text = \"Start in %d Sekunden.\"\n  # EN\n  text = \"Booting in %d seconds\"\n  # ES\n  # text = \"Arranque en %d segundos\"\n  # FR\n  # text = \"Démarrage automatique dans %d secondes\"\n  # IT\n  # text = \"Avvio in %d secondi\"\n  # NO\n  # text = \"Starter om %d sekunder\"\n  # PT\n  # text = \"Arranque automático dentro de %d segundos\"\n  # RU\n  # text = \"Загрузка выбранного пункта через %d сек.\"\n  # UA\n  # text = \"Автоматичне завантаження розпочнеться через %d сек.\"\n  # zh_CN\n  # text = \"在 %d 内启动\"\n  color = \"#67d97a\"\n  font = \"Fixedsys Regular 32\"\n}\n\n# Navigation keys hint \n+ label {\n  left = 0\n  top = 98%-30\n  width = 100%\n  align = \"center\"\n  # DE\n  # text = \"System mit ↑ und ↓ auswählen und mit Enter bestätigen.\"\n  # EN\n  text = \"Use ↑ and ↓ keys to change selection, Enter to confirm\"\n  # ES\n  # text = \"Use las teclas ↑ y ↓ para cambiar la selección, Enter para confirmar\"\n  # FR\n  # text = \"Choisissez le système avec les flèches du clavier (↑ et ↓), puis validez avec la touche Enter (↲)\"\n  # IT\n  # text = \"Usa i tasti ↑ e ↓ per cambiare la selezione, premi Invio ↲ per confermare\"\n  # NO\n  # text = \"Bruk ↑ og ↓ for å endre menyvalg, velg med Enter\"\n  # PT\n  # text = \"Use as teclas ↑ e ↓ para mudar a seleção, e ENTER para confirmar\"\n  # RU\n  # text = \"Используйте клавиши ↑ и ↓ для изменения выбора, Enter для подтверждения\"\n  # UA\n  # text = \"Використовуйте ↑ та ↓ для вибору, Enter для підтвердження\"\n  # zh_CN\n  # text = \"使用 ↑ 和 ↓ 键移动选择条，Enter 键确认\"\n  color = \"#67d97a\"\n  font = \"Fixedsys Regular 32\"\n}\n"
  }
]