altaire-siren 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +77 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +39 -0
  7. data/Rakefile +2 -0
  8. data/altaire-siren.gemspec +32 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/docs/docs/commands/crypto.md +25 -0
  12. data/docs/docs/commands/song.md +59 -0
  13. data/docs/docs/index.md +0 -0
  14. data/docs/mkdocs.yml +20 -0
  15. data/docs/serve.sh +1 -0
  16. data/docs/site/404.html +313 -0
  17. data/docs/site/assets/fonts/font-awesome.css +4 -0
  18. data/docs/site/assets/fonts/material-icons.css +13 -0
  19. data/docs/site/assets/fonts/specimen/FontAwesome.ttf +0 -0
  20. data/docs/site/assets/fonts/specimen/FontAwesome.woff +0 -0
  21. data/docs/site/assets/fonts/specimen/FontAwesome.woff2 +0 -0
  22. data/docs/site/assets/fonts/specimen/MaterialIcons-Regular.ttf +0 -0
  23. data/docs/site/assets/fonts/specimen/MaterialIcons-Regular.woff +0 -0
  24. data/docs/site/assets/fonts/specimen/MaterialIcons-Regular.woff2 +0 -0
  25. data/docs/site/assets/images/favicon.png +0 -0
  26. data/docs/site/assets/images/icons/bitbucket.1b09e088.svg +1 -0
  27. data/docs/site/assets/images/icons/github.f0b8504a.svg +1 -0
  28. data/docs/site/assets/images/icons/gitlab.6dd19c00.svg +1 -0
  29. data/docs/site/assets/javascripts/application.c648116f.js +6 -0
  30. data/docs/site/assets/javascripts/lunr/lunr.da.js +1 -0
  31. data/docs/site/assets/javascripts/lunr/lunr.de.js +1 -0
  32. data/docs/site/assets/javascripts/lunr/lunr.du.js +1 -0
  33. data/docs/site/assets/javascripts/lunr/lunr.es.js +1 -0
  34. data/docs/site/assets/javascripts/lunr/lunr.fi.js +1 -0
  35. data/docs/site/assets/javascripts/lunr/lunr.fr.js +1 -0
  36. data/docs/site/assets/javascripts/lunr/lunr.hu.js +1 -0
  37. data/docs/site/assets/javascripts/lunr/lunr.it.js +1 -0
  38. data/docs/site/assets/javascripts/lunr/lunr.ja.js +1 -0
  39. data/docs/site/assets/javascripts/lunr/lunr.jp.js +1 -0
  40. data/docs/site/assets/javascripts/lunr/lunr.multi.js +1 -0
  41. data/docs/site/assets/javascripts/lunr/lunr.nl.js +1 -0
  42. data/docs/site/assets/javascripts/lunr/lunr.no.js +1 -0
  43. data/docs/site/assets/javascripts/lunr/lunr.pt.js +1 -0
  44. data/docs/site/assets/javascripts/lunr/lunr.ro.js +1 -0
  45. data/docs/site/assets/javascripts/lunr/lunr.ru.js +1 -0
  46. data/docs/site/assets/javascripts/lunr/lunr.stemmer.support.js +1 -0
  47. data/docs/site/assets/javascripts/lunr/lunr.sv.js +1 -0
  48. data/docs/site/assets/javascripts/lunr/lunr.th.js +1 -0
  49. data/docs/site/assets/javascripts/lunr/lunr.tr.js +1 -0
  50. data/docs/site/assets/javascripts/lunr/tinyseg.js +1 -0
  51. data/docs/site/assets/javascripts/lunr/wordcut.js +1 -0
  52. data/docs/site/assets/javascripts/modernizr.74668098.js +1 -0
  53. data/docs/site/assets/stylesheets/application-palette.a8b3c06d.css +1 -0
  54. data/docs/site/assets/stylesheets/application.30686662.css +1 -0
  55. data/docs/site/commands/crypto/index.html +470 -0
  56. data/docs/site/commands/song/index.html +474 -0
  57. data/docs/site/index.html +348 -0
  58. data/docs/site/search/search_index.json +1 -0
  59. data/docs/site/sitemap.xml +18 -0
  60. data/docs/site/sitemap.xml.gz +0 -0
  61. data/exe/siren +5 -0
  62. data/lib/siren.rb +9 -0
  63. data/lib/siren/cli.rb +83 -0
  64. data/lib/siren/crypto.rb +17 -0
  65. data/lib/siren/song.rb +214 -0
  66. data/lib/siren/stack.rb +25 -0
  67. data/lib/siren/version.rb +3 -0
  68. data/public.jwk +1 -0
  69. metadata +210 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2c2c8b0c8610868e3400d37267b62e46e46a8151cc9bfc71ec606d2de5b5c9b4
4
+ data.tar.gz: a40f94a53642d50b7e07e956fd785d796826ad4107fb653ddadc439e99aa09b9
5
+ SHA512:
6
+ metadata.gz: '086793744a02fba270cf0441ac85cc406383898d9c1488b07129a15eedbb551b80d8fb142da7ab5beb31f8a57be1118ca0b4d80be30aba7c912a87d62aaaa53d'
7
+ data.tar.gz: de3aaea9db9eb23c1a26257f49cea1ec0638a8c2e0b6f15fa67311046083df194826f7a953cbdd3a6244db2cdb20444ab7a56600eb3c32c98ca881370c8ee5ce
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ /data/songs/*.yaml
10
+ /private.jwk
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in stack.gemspec
4
+ gemspec
@@ -0,0 +1,77 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ altaire-siren (0.1.0)
5
+ clamp (= 1.3.1)
6
+ jose (= 1.1.3)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ aruba (0.14.12)
12
+ childprocess (>= 0.6.3, < 4.0.0)
13
+ contracts (~> 0.9)
14
+ cucumber (>= 1.3.19)
15
+ ffi (~> 1.9)
16
+ rspec-expectations (>= 2.99)
17
+ thor (~> 0.19)
18
+ backports (3.15.0)
19
+ builder (3.2.3)
20
+ childprocess (3.0.0)
21
+ clamp (1.3.1)
22
+ concurrent-ruby (1.1.5)
23
+ contracts (0.16.0)
24
+ cucumber (3.1.2)
25
+ builder (>= 2.1.2)
26
+ cucumber-core (~> 3.2.0)
27
+ cucumber-expressions (~> 6.0.1)
28
+ cucumber-wire (~> 0.0.1)
29
+ diff-lcs (~> 1.3)
30
+ gherkin (~> 5.1.0)
31
+ multi_json (>= 1.7.5, < 2.0)
32
+ multi_test (>= 0.1.2)
33
+ cucumber-core (3.2.1)
34
+ backports (>= 3.8.0)
35
+ cucumber-tag_expressions (~> 1.1.0)
36
+ gherkin (~> 5.0)
37
+ cucumber-expressions (6.0.1)
38
+ cucumber-tag_expressions (1.1.1)
39
+ cucumber-wire (0.0.1)
40
+ diff-lcs (1.3)
41
+ ffi (1.11.1)
42
+ gherkin (5.1.0)
43
+ hamster (3.0.0)
44
+ concurrent-ruby (~> 1.0)
45
+ jose (1.1.3)
46
+ hamster
47
+ multi_json (1.14.1)
48
+ multi_test (0.1.2)
49
+ rake (10.5.0)
50
+ rspec (3.9.0)
51
+ rspec-core (~> 3.9.0)
52
+ rspec-expectations (~> 3.9.0)
53
+ rspec-mocks (~> 3.9.0)
54
+ rspec-core (3.9.0)
55
+ rspec-support (~> 3.9.0)
56
+ rspec-expectations (3.9.0)
57
+ diff-lcs (>= 1.2.0, < 2.0)
58
+ rspec-support (~> 3.9.0)
59
+ rspec-mocks (3.9.0)
60
+ diff-lcs (>= 1.2.0, < 2.0)
61
+ rspec-support (~> 3.9.0)
62
+ rspec-support (3.9.0)
63
+ thor (0.20.3)
64
+
65
+ PLATFORMS
66
+ ruby
67
+
68
+ DEPENDENCIES
69
+ altaire-siren!
70
+ aruba
71
+ bundler (~> 2.0)
72
+ cucumber
73
+ rake (~> 10.0)
74
+ rspec (~> 3.2)
75
+
76
+ BUNDLED WITH
77
+ 2.0.2
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 Nathan Baum
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,39 @@
1
+ # Stack
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/stack`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'stack'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install stack
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/stack.
36
+
37
+ ## License
38
+
39
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
@@ -0,0 +1,32 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "siren/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "altaire-siren"
7
+ spec.version = Siren::VERSION
8
+ spec.authors = ["Nathan Baum"]
9
+ spec.email = ["nathan@altaire.com"]
10
+
11
+ spec.summary = %q{Kubernetes controller and client utility}
12
+ spec.homepage = "http://docs.altaire.xyz/siren"
13
+ spec.license = "MIT"
14
+
15
+ spec.metadata["homepage_uri"] = spec.homepage
16
+
17
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
18
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_dependency "jose", "1.1.3"
25
+ spec.add_dependency "clamp", "1.3.1"
26
+
27
+ spec.add_development_dependency "bundler", "~> 2.0"
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "rspec", "~> 3.2"
30
+ spec.add_development_dependency "cucumber"
31
+ spec.add_development_dependency "aruba"
32
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "stack"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,25 @@
1
+ # Crypto
2
+
3
+ ## encrypt
4
+
5
+ ```bash
6
+ siren crypto encrypt [--pubkey=public.jwk] WORDS...
7
+ ```
8
+
9
+ Encrypt the words using the public key. The resulting output can only be decrypted using the corresponding private key.
10
+
11
+ ## decrypt
12
+
13
+ ```bash
14
+ siren crypto decrypt [--privkey=private.jwk] CIPHERTEXT
15
+ ```
16
+
17
+ Decrypt the encrypted data using the private key. This can only decrypt data that was encrypted using the corresponding public key.
18
+
19
+ ## genkeys
20
+
21
+ ```bash
22
+ siren crypto genkeys [--force] [--privkey=private.jwk] [--pubkey=public.jwk]
23
+ ```
24
+
25
+ Generates a pair of encryption keys. Usually, you'll want to use the already-created encryption keys. This command should only need to be used if it's necessary to replace those keys.
@@ -0,0 +1,59 @@
1
+ # Song
2
+
3
+ ## convert
4
+
5
+ ```bash
6
+ siren song convert FILE
7
+ ```
8
+
9
+ Convert a song to a set of Kubernetes resource descriptions.
10
+
11
+ Until Kubernetes is fully integrated into the CLI, you could deploy a song on a Kubernetes cluster using the command:
12
+
13
+ ```bash
14
+ siren song convert FILE | kubectl apply -f -
15
+ ```
16
+
17
+ and remove it with
18
+
19
+ ```bash
20
+ siren song convert FILE | kubectl delete -f -
21
+ ```
22
+
23
+ Or, you can save the resources to a file to edit or inspect them before deployment.
24
+
25
+ ## File format
26
+
27
+ ```yaml
28
+ # Choff for Kubernetes.
29
+ apiVersion: siren.altaire.xyz/v1
30
+ kind: Song
31
+ metadata:
32
+ # A name is required.
33
+ name: builder
34
+ spec:
35
+ # Global environmental variables which apply to all services.
36
+ env:
37
+ name: value
38
+ service:
39
+ - # As you can imagine, the image to run.
40
+ image: altaire/builder-live
41
+ # Optionally, the command to run in the image.
42
+ command: command-name
43
+ # Optionally, name this service.
44
+ # If there are multiple services, you _must_ name them.
45
+ name: service-name
46
+ # Environmental variables which apply to all services.
47
+ # These override the global variables, if there are any.
48
+ env:
49
+ name: value
50
+ # Publish the service one or more domains
51
+ publish:
52
+ - # The port the service is listening on.
53
+ port: 8081
54
+ # Domain name to use.
55
+ domain: builder.k9.altaire.xyz
56
+ # Use built-in Altaire auth.
57
+ auth: true
58
+ - ...
59
+ ```
File without changes
@@ -0,0 +1,20 @@
1
+ site_name: Siren
2
+ theme:
3
+ name: material
4
+ palette:
5
+ primary: 'red'
6
+ accent: 'black'
7
+ feature:
8
+ tabs: true
9
+
10
+ markdown_extensions:
11
+ - smarty
12
+ - admonition
13
+ - wikilinks
14
+ - toc:
15
+ permalink: True
16
+ toc_depth: 2-2
17
+ - codehilite:
18
+ guess_lang: false
19
+
20
+ extra_css: []
@@ -0,0 +1 @@
1
+ mkdocs serve
@@ -0,0 +1,313 @@
1
+
2
+
3
+
4
+
5
+ <!doctype html>
6
+ <html lang="en" class="no-js">
7
+ <head>
8
+
9
+ <meta charset="utf-8">
10
+ <meta name="viewport" content="width=device-width,initial-scale=1">
11
+ <meta http-equiv="x-ua-compatible" content="ie=edge">
12
+
13
+
14
+
15
+
16
+ <meta name="lang:clipboard.copy" content="Copy to clipboard">
17
+
18
+ <meta name="lang:clipboard.copied" content="Copied to clipboard">
19
+
20
+ <meta name="lang:search.language" content="en">
21
+
22
+ <meta name="lang:search.pipeline.stopwords" content="True">
23
+
24
+ <meta name="lang:search.pipeline.trimmer" content="True">
25
+
26
+ <meta name="lang:search.result.none" content="No matching documents">
27
+
28
+ <meta name="lang:search.result.one" content="1 matching document">
29
+
30
+ <meta name="lang:search.result.other" content="# matching documents">
31
+
32
+ <meta name="lang:search.tokenizer" content="[\s\-]+">
33
+
34
+ <link rel="shortcut icon" href="/assets/images/favicon.png">
35
+ <meta name="generator" content="mkdocs-1.0.4, mkdocs-material-4.4.2">
36
+
37
+
38
+
39
+ <title>Siren</title>
40
+
41
+
42
+
43
+ <link rel="stylesheet" href="/assets/stylesheets/application.30686662.css">
44
+
45
+ <link rel="stylesheet" href="/assets/stylesheets/application-palette.a8b3c06d.css">
46
+
47
+
48
+
49
+
50
+ <meta name="theme-color" content="#ef5350">
51
+
52
+
53
+
54
+ <script src="/assets/javascripts/modernizr.74668098.js"></script>
55
+
56
+
57
+
58
+ <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
59
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono&display=fallback">
60
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
61
+
62
+
63
+ <link rel="stylesheet" href="/assets/fonts/material-icons.css">
64
+
65
+
66
+
67
+
68
+
69
+
70
+ </head>
71
+
72
+
73
+
74
+ <body dir="ltr" data-md-color-primary="red" data-md-color-accent="black">
75
+
76
+ <svg class="md-svg">
77
+ <defs>
78
+
79
+
80
+ </defs>
81
+ </svg>
82
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
83
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
84
+ <label class="md-overlay" data-md-component="overlay" for="__drawer"></label>
85
+
86
+
87
+ <header class="md-header" data-md-component="header">
88
+ <nav class="md-header-nav md-grid">
89
+ <div class="md-flex">
90
+ <div class="md-flex__cell md-flex__cell--shrink">
91
+ <a href="/." title="Siren" class="md-header-nav__button md-logo">
92
+
93
+ <i class="md-icon"></i>
94
+
95
+ </a>
96
+ </div>
97
+ <div class="md-flex__cell md-flex__cell--shrink">
98
+ <label class="md-icon md-icon--menu md-header-nav__button" for="__drawer"></label>
99
+ </div>
100
+ <div class="md-flex__cell md-flex__cell--stretch">
101
+ <div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
102
+
103
+ <span class="md-header-nav__topic">
104
+ Siren
105
+ </span>
106
+ <span class="md-header-nav__topic">
107
+
108
+
109
+
110
+ </span>
111
+
112
+ </div>
113
+ </div>
114
+ <div class="md-flex__cell md-flex__cell--shrink">
115
+
116
+ <label class="md-icon md-icon--search md-header-nav__button" for="__search"></label>
117
+
118
+ <div class="md-search" data-md-component="search" role="dialog">
119
+ <label class="md-search__overlay" for="__search"></label>
120
+ <div class="md-search__inner" role="search">
121
+ <form class="md-search__form" name="search">
122
+ <input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
123
+ <label class="md-icon md-search__icon" for="__search"></label>
124
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
125
+ &#xE5CD;
126
+ </button>
127
+ </form>
128
+ <div class="md-search__output">
129
+ <div class="md-search__scrollwrap" data-md-scrollfix>
130
+ <div class="md-search-result" data-md-component="result">
131
+ <div class="md-search-result__meta">
132
+ Type to start searching
133
+ </div>
134
+ <ol class="md-search-result__list"></ol>
135
+ </div>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ </div>
140
+
141
+ </div>
142
+
143
+ </div>
144
+ </nav>
145
+ </header>
146
+
147
+ <div class="md-container">
148
+
149
+
150
+
151
+
152
+
153
+
154
+ <nav class="md-tabs" data-md-component="tabs">
155
+ <div class="md-tabs__inner md-grid">
156
+ <ul class="md-tabs__list">
157
+
158
+
159
+ <li class="md-tabs__item">
160
+
161
+ <a href="/." class="md-tabs__link md-tabs__link--active">
162
+ Home
163
+ </a>
164
+
165
+ </li>
166
+
167
+
168
+
169
+
170
+
171
+ <li class="md-tabs__item">
172
+
173
+ <a href="/commands/crypto/" class="md-tabs__link">
174
+ Commands
175
+ </a>
176
+
177
+ </li>
178
+
179
+
180
+
181
+ </ul>
182
+ </div>
183
+ </nav>
184
+
185
+ <main class="md-main" role="main">
186
+ <div class="md-main__inner md-grid" data-md-component="container">
187
+
188
+
189
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
190
+ <div class="md-sidebar__scrollwrap">
191
+ <div class="md-sidebar__inner">
192
+ <nav class="md-nav md-nav--primary" data-md-level="0">
193
+ <label class="md-nav__title md-nav__title--site" for="__drawer">
194
+ <a href="/." title="Siren" class="md-nav__button md-logo">
195
+
196
+ <i class="md-icon"></i>
197
+
198
+ </a>
199
+ Siren
200
+ </label>
201
+
202
+ <ul class="md-nav__list" data-md-scrollfix>
203
+
204
+
205
+
206
+
207
+
208
+
209
+ <li class="md-nav__item">
210
+ <a href="/." title="Home" class="md-nav__link">
211
+ Home
212
+ </a>
213
+ </li>
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+ <li class="md-nav__item md-nav__item--nested">
222
+
223
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
224
+
225
+ <label class="md-nav__link" for="nav-2">
226
+ Commands
227
+ </label>
228
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
229
+ <label class="md-nav__title" for="nav-2">
230
+ Commands
231
+ </label>
232
+ <ul class="md-nav__list" data-md-scrollfix>
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+ <li class="md-nav__item">
241
+ <a href="/commands/crypto/" title="Crypto" class="md-nav__link">
242
+ Crypto
243
+ </a>
244
+ </li>
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+ <li class="md-nav__item">
253
+ <a href="/commands/song/" title="Song" class="md-nav__link">
254
+ Song
255
+ </a>
256
+ </li>
257
+
258
+
259
+ </ul>
260
+ </nav>
261
+ </li>
262
+
263
+
264
+ </ul>
265
+ </nav>
266
+ </div>
267
+ </div>
268
+ </div>
269
+
270
+
271
+
272
+ <div class="md-content">
273
+ <article class="md-content__inner md-typeset">
274
+
275
+ <h1>404 - Not found</h1>
276
+
277
+
278
+
279
+
280
+
281
+
282
+ </article>
283
+ </div>
284
+ </div>
285
+ </main>
286
+
287
+
288
+ <footer class="md-footer">
289
+
290
+ <div class="md-footer-meta md-typeset">
291
+ <div class="md-footer-meta__inner md-grid">
292
+ <div class="md-footer-copyright">
293
+
294
+ powered by
295
+ <a href="https://www.mkdocs.org">MkDocs</a>
296
+ and
297
+ <a href="https://squidfunk.github.io/mkdocs-material/">
298
+ Material for MkDocs</a>
299
+ </div>
300
+
301
+ </div>
302
+ </div>
303
+ </footer>
304
+
305
+ </div>
306
+
307
+ <script src="/assets/javascripts/application.c648116f.js"></script>
308
+
309
+ <script>app.initialize({version:"1.0.4",url:{base:"/"}})</script>
310
+
311
+
312
+ </body>
313
+ </html>