uhhh

Amolith created

Change summary

Gemfile                                                                        |    2 
Gemfile.lock                                                                   |    7 
_config.yml                                                                    |    3 
_includes/externals/styling.html                                               |   12 
_includes/header.html                                                          |   22 
_includes/page/explore.html                                                    |    4 
_includes/page/footer.html                                                     |    6 
_layouts/blog.html                                                             |    1 
_layouts/default.html                                                          |    2 
_layouts/home.html                                                             |    8 
_layouts/page.html                                                             |    3 
_posts/2018-12-14-forecasting-with-a-command.md                                |    2 
_posts/2019-02-05-dns-and-root-certificates-what-you-need-to-know.md           |   14 
_posts/2019-06-03-excluding-your-site-from-the-wayback-machine-keybase-only.md |    2 
_sass/_default.scss                                                            |    5 
about.html                                                                     |    2 
amolith.txt                                                                    |  421 
contact.html                                                                   |   25 
contact2.html                                                                  |   78 
css/main.scss                                                                  |    2 
friends.html                                                                   |   23 
img.py                                                                         |    4 
me.html                                                                        |    8 
openpgp.js                                                                     | 3308 
package-lock.json                                                              |    3 
privacy-policy.md                                                              |   35 
protocol-handler.js                                                            |    0 
scripts.js                                                                     |  537 
verification.txt                                                               |    4 
29 files changed, 4,284 insertions(+), 259 deletions(-)

Detailed changes

Gemfile 🔗

@@ -1,3 +1,5 @@
 source "https://rubygems.org"
 
 gem 'jekyll-compose', group: [:jekyll_plugins]
+
+gem 'jekyll-target-blank'

Gemfile.lock 🔗

@@ -31,6 +31,9 @@ GEM
       jekyll (~> 3.0)
     jekyll-sass-converter (1.5.2)
       sass (~> 3.4)
+    jekyll-target-blank (1.1.1)
+      jekyll (~> 3.0)
+      nokogiri (~> 1.8.2)
     jekyll-watch (2.1.2)
       listen (~> 3.0)
     kramdown (1.17.0)
@@ -40,6 +43,9 @@ GEM
       rb-inotify (~> 0.9, >= 0.9.7)
       ruby_dep (~> 1.2)
     mercenary (0.3.6)
+    mini_portile2 (2.3.0)
+    nokogiri (1.8.5)
+      mini_portile2 (~> 2.3.0)
     pathutil (0.16.2)
       forwardable-extended (~> 2.6)
     public_suffix (3.0.3)
@@ -59,6 +65,7 @@ PLATFORMS
 
 DEPENDENCIES
   jekyll-compose
+  jekyll-target-blank
 
 BUNDLED WITH
    2.0.1

_config.yml 🔗

@@ -30,3 +30,6 @@ livereload: true
 
 jekyll_compose:
     auto_open: true
+
+plugins:
+    - jekyll-target-blank

_includes/externals/styling.html 🔗

@@ -5,12 +5,12 @@
 <link rel="stylesheet" href="{{ site.baseurl }}/assets/vendor/highlight/styles/solarized_dark.css">{% endif %}
 <link rel="stylesheet" href="{{ "/assets/vendor/font-awesome/css/fork-awesome.min.css" | prepend: site.baseurl }}">
 
-<link rel="apple-touch-icon" sizes="180x180" href="favicons/apple-touch-icon.png?v=wAXex2OGrl">
-<link rel="icon" type="image/png" sizes="32x32" href="favicons/favicon-32x32.png?v=wAXex2OGrl">
-<link rel="icon" type="image/png" sizes="16x16" href="favicons/favicon-16x16.png?v=wAXex2OGrl">
-<link rel="manifest" href="favicons/site.webmanifest?v=wAXex2OGrl">
-<link rel="mask-icon" href="favicons/safari-pinned-tab.svg?v=wAXex2OGrl" color="#5bbad5">
-<link rel="shortcut icon" href="favicons/favicon.ico?v=wAXex2OGrl">
+<link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png?v=wAXex2OGrl">
+<link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png?v=wAXex2OGrl">
+<link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png?v=wAXex2OGrl">
+<link rel="manifest" href="/favicons/site.webmanifest?v=wAXex2OGrl">
+<link rel="mask-icon" href="/favicons/safari-pinned-tab.svg?v=wAXex2OGrl" color="#5bbad5">
+<link rel="shortcut icon" href="/favicons/favicon.ico?v=wAXex2OGrl">
 <meta name="msapplication-TileColor" content="#494848">
 <meta name="msapplication-config" content="favicons/browserconfig.xml?v=wAXex2OGrl">
 <meta name="theme-color" content="#ffffff">

_includes/header.html 🔗

@@ -5,30 +5,24 @@
             <li class="menu-entry"><a href="{{ '/about' | prepend: site.baseurl }}">About</a></li>
             <li class="menu-entry"><a href="{{ '/contact' | prepend: site.baseurl }}">Contact</a></li>
             <li class="menu-entry"><a href="{{ '/blog' | prepend: site.baseurl }}">Blog</a></li>
-            <li class="menu-entry"><a href="{{ '/friends' | prepend: site.baseurl }}">Friends</a></li>
+            <li class="menu-entry"><a href="{{ '/privacy' | prepend: site.baseurl }}">Privacy</a></li>
         </ul>
     </div>
-    <ul class="social-links">
-        <a href="/feed.xml" title="The RSS feed for my blog" class="social-linkes-entry" target="_blank">
+    <div class="social-links">
+        <a href="/feed.xml" title="The RSS feed for my blog" aria-label="Subscribe to the RSS feed for my blog" class="social-linkes-entry" target="_blank">
             <i class="fa fa-rss-square"></i>
         </a>
-        <a href="/me/" title="About Amolith" class="social-links-entry">
+        <a href="/me/" title="About Amolith" aria-label="Read more about me" class="social-links-entry">
             <i class="fa fa-info-circle"></i>
         </a>
-        {% if site.author.mastodon %}
-        <a rel="me" title="Mastodon, a decentralised social network" href="https://masto.nixnet.xyz/@{{ site.author.mastodon }}" class="social-links-entry" target="_blank">
+        <a rel="me" rel="noreferrer" title="Mastodon, a decentralised social network" aria-label="Visit my Mastodon profile" href="https://masto.nixnet.xyz/@{{ site.author.mastodon }}" class="social-links-entry" target="_blank">
             <i class="fa fa-mastodon"></i>
         </a>
-        {% endif %}
-        {% if site.author.telegram %}
-        <a href="https://t.me/{{ site.author.telegram }}" title="Message me on Telegram"class="social-links-entry" target="_blank">
+        <a href="https://t.me/{{ site.author.telegram }}" rel="noreferrer" title="Message me on Telegram" aria-label="Message me on Telegram" class="social-links-entry" target="_blank">
             <i class="fa fa-telegram"></i>
         </a>
-        {% endif %}
-        {% if site.author.email %}
-        <a href="mailto:{{ site.author.email }}" title="Send me a GPG-encrypted email" class="social-links-entry" target="_blank">
+        <a href="mailto:{{ site.author.email }}" title="Send me a GPG-encrypted email" aria-label="Send me a GPG-encrypted email" class="social-links-entry" target="_blank">
             <i class="fa fa-envelope"></i>
         </a>
-        {% endif %}
-    </ul>
+    </div>
 </header>

_includes/page/explore.html 🔗

@@ -7,7 +7,7 @@
         {% endfor %}
         <li class="categories-item"><a href="{{ '/' | prepend: site.baseurl }}">All</a></li>
     </ul>
-    <div class="explore-label">Website source available <a href="https://git.nixnet.xyz/Amolith/NixNet">here</a></div>
-    <div class="explore-label">All content is licensed under <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank">CC-BY 4.0</a></div>
+    <div class="explore-label">Website source available on <a href="https://git.nixnet.xyz/Amolith/NixNet" rel="noreferrer">Gitea</a></div>
+    <div class="explore-label">All content is licensed under <a href="https://creativecommons.org/licenses/by/4.0/" rel="noreferrer" target="_blank">CC-BY 4.0</a></div>
     <div class="explore-label"><i>(unless otherwise stated)</i></div>
 </div>

_includes/page/footer.html 🔗

@@ -1,8 +1,8 @@
 <div class="explore">
     <div class="explore-divider">*****</div>
-    <div class="explore-label">Website source available on <a href="https://git.nixnet.xyz/NixNet/nixnet">Gitea</a></div>
-    <div class="explore-label">Made with ❤️ and <a href="https://jekyllrb.com/" target="_blank">Jekyll</a> by  <a href="https://nixnet.xyz/me/" target="_blank">Amolith</a></div>
-    <div class="explore-label">All content is licensed under <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank">CC-BY 4.0</a></div>
+    <div class="explore-label">Website source available on <a href="https://git.nixnet.xyz/NixNet/nixnet" rel="noreferrer">Gitea</a></div>
+    <div class="explore-label">Made with ❤️ and <a href="https://jekyllrb.com/" rel="noreferrer" target="_blank">Jekyll</a> by  <a href="https://nixnet.xyz/me/" target="_blank">Amolith</a></div>
+    <div class="explore-label">All content is licensed under <a href="https://creativecommons.org/licenses/by/4.0/" rel="noreferrer" target="_blank">CC-BY 4.0</a></div>
     <div class="explore-label"><i>(unless otherwise stated)</i></div>
     <div class="explore-label"><a href="http://l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion/">l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion</a></div>
 </div>

_layouts/blog.html 🔗

@@ -1,5 +1,6 @@
 ---
 layout: default
+description: Amolith's blog on various tech-related topics
 ---
 {% include page/title.html %}
 

_layouts/default.html 🔗

@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<html class="" lang="en-US">
+<html lang="en">
     <head>
         {% include meta_tags/base.html %}
         {% include meta_tags/sharing.html %}

_layouts/home.html 🔗

@@ -0,0 +1,8 @@
+---
+layout: default
+---
+{% include page/title.html %}
+
+{{ content }}
+
+{% include page/footer.html %}

_layouts/page.html 🔗

@@ -2,7 +2,8 @@
 layout: default
 ---
 {% include page/title.html %}
-
+<div class="content">
 {{ content }}
+</div>
 
 {% include page/footer.html %}

_posts/2018-12-14-forecasting-with-a-command.md 🔗

@@ -21,4 +21,4 @@ A great way to make this faster and simpler is to put an alias in your shell's `
 echo "alias weather='curl sky.webionite.com/f/location'" >> ~/.bashrc
 ```
 If you ever forget how to use the tool, just run `curl sky.webionite.com` and you'll be given instructions.
-![](/assets/weather.png)
+![screenshot of the output of the command. it shows two rows of four boxes with ascii art depicting rain, overcast clouds, and the sun obscured by clouds. it shows the temperature and the time of day. everything is coloured and looks very attractive.](/assets/weather.png)

_posts/2019-02-05-dns-and-root-certificates-what-you-need-to-know.md 🔗

@@ -6,8 +6,8 @@ description: Protecting yourself from malicious third parties leveraging DNS and
 cover: /assets/posts/privacy.png
 date: 2019-02-05 10:53 -0500
 ---
-<center><h4>This post was mirrored from <a href="https://t.me/PrivacyToday">Privacy Today</a> on Telegram.</h4></center>
-<center><h4><a href="https://t.me/PrivacyToday">t.me/PrivacyToday</a></h4></center>
+<center><h4>This post was mirrored from <a rel="noreferrer" href="https://t.me/PrivacyToday">Privacy Today</a> on Telegram.</h4></center>
+<center><h4><a rel="noreferrer" href="https://t.me/PrivacyToday">t.me/PrivacyToday</a></h4></center>
 <br/>
 
 Due to recent events we felt compelled to write an impromptu article on this matter. It's intended for all audiences so it will be kept simple - technical details may be posted later.
@@ -72,7 +72,7 @@ This site will look absolutely fine to you; it has https in the URL and, if you
 
 It now receives all the communication you intended to send to the original. This bypasses the checks created to avoid it. You won't receive error messages, your browser won't complain.
 
-All your data is compromised! 
+All your data is compromised!
 
 ## 4. Conclusion
 
@@ -85,7 +85,7 @@ All your data is compromised!
 
 **Do not ever install a 3rd party root certificate!** There are very few exceptions why you would want to do so and none of them are applicable to general end users.
 
-Do not fall for clever marketing that ensures "ad blocking", "military grade security", or something similar. There are methods of using DNS resolvers on their own to enhance your privacy but installing a 3rd party root certificate never makes sense. You are opening yourself up to extreme abuse. 
+Do not fall for clever marketing that ensures "ad blocking", "military grade security", or something similar. There are methods of using DNS resolvers on their own to enhance your privacy but installing a 3rd party root certificate never makes sense. You are opening yourself up to extreme abuse.
 
 ## 5. Seeing It Live
 
@@ -111,8 +111,8 @@ Here is the link: [https-interception.info.tm](http://https-interception.info.tm
 
 ## 6. Further Information
 
-If you are interested in more technical details, let us know. If there is enough interest, we might write a more in-depth article but, for now, the important part is sharing the basics so you can make an informed decision and not fall for marketing and straight up fraud. Feel free to suggest other topics that are important to you. 
+If you are interested in more technical details, let us know. If there is enough interest, we might write a more in-depth article but, for now, the important part is sharing the basics so you can make an informed decision and not fall for marketing and straight up fraud. Feel free to suggest other topics that are important to you.
 <br/>
 <br/>
-<center><p>For more information/feedback/corrections, join <a href="https://t.me/PrivacyToday">Privacy Today</a> on Telegram.</p></center>
-<center><p>This post is licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a> and was mirrored with permission.</p></center>
+<center><p>For more information/feedback/corrections, join <a rel="noreferrer" href="https://t.me/PrivacyToday">Privacy Today</a> on Telegram.</p></center>
+<center><p>This post is licensed under <a rel="noreferrer" href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a> and was mirrored with permission.</p></center>

_posts/2019-06-03-excluding-your-site-from-the-wayback-machine-keybase-only.md 🔗

@@ -16,7 +16,7 @@ If that's all you intend to do, this should be sufficient and there's no need to
 # For domains you *don't* own
 There are a few things I used that worked in harmony to verify my other accounts. [Keybase](https://keybase.io/) was the most useful for this purpose. It is a proprietary service but I deem the level of proof it facilitates worth compromising for.
 
-The other tool I used was [GPG](https://gnupg.org/). For the sake of keeping it simple, *this* guide will just deal with GPG from within Keybase. I ***really*** recommend actually learning to use GPG on its own; it's wonderful for protecting your privacy and verifying your identity in a multitude of situations. The next post will be on using GPG *outside* of Keybase for this so [stay tuned](nixnet.xyz/feed.xml).
+The other tool I used was [GPG](https://gnupg.org/). For the sake of keeping it simple, *this* guide will just deal with GPG from within Keybase. I ***really*** recommend actually learning to use GPG on its own; it's wonderful for protecting your privacy and verifying your identity in a multitude of situations. The next post will be on using GPG *outside* of Keybase for this so [stay tuned](/feed.xml).
 
 ## Generating your key
 After creating your Keybase account, click "add a PGP key", "I need a public key", then enter the requisite information. You should use whatever name is associated with the account you'll be emailing Archive.org from as well as that address. Wait a bit while it generates the key . . .

_sass/_default.scss 🔗

@@ -1,6 +1,7 @@
 ;
 @font-face {
     font-family: 'Open Sans';
+    font-display: auto;
     font-style: normal;
     font-weight: 300;
     src: url('assets/fonts/open-sans-v15-latin-300.eot'); /* IE9 Compat Modes */
@@ -13,6 +14,7 @@
 }
 @font-face {
     font-family: 'Open Sans';
+    font-display: auto;
     font-style: italic;
     font-weight: 300;
     src: url('/assets/fonts/open-sans-v15-latin-300italic.eot'); /* IE9 Compat Modes */
@@ -25,6 +27,7 @@
 }
 @font-face {
     font-family: 'Inconsolata';
+    font-display: auto;
     font-style: normal;
     font-weight: 400;
     src: url('/assets/fonts/inconsolata-v16-latin-regular.eot'); /* IE9 Compat Modes */
@@ -37,6 +40,7 @@
 }
 @font-face {
     font-family: 'Inconsolata';
+    font-display: auto;
     font-style: normal;
     font-weight: 700;
     src: url('/assets/fonts/inconsolata-v16-latin-700.eot'); /* IE9 Compat Modes */
@@ -49,6 +53,7 @@
 }
 @font-face {
     font-family: 'Overpass';
+    font-display: auto;
     font-style: normal;
     font-weight: 400;
     src: url('/assets/fonts/overpass-v2-latin-regular.eot'); /* IE9 Compat Modes */

about.html 🔗

@@ -1,5 +1,5 @@
 ---
-layout: page
+layout: home
 title: About
 subtitle: 'A little bit about NixNet.xyz and some financial information'
 description: A little bit about NixNet.xyz and some financial information
@@ -14,28 +14,25 @@ permalink: /about/
         <center>
         <h1>Finance</h1>
         </center>

amolith.txt 🔗

@@ -71,184 +71,245 @@ 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
-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
-=YfBo
+VTxxovbOsVPAwbsx381A2i3U/W859gIYna3gHokDfgQTAQgBaAIbAwULCQgHAwUV
+CgkICwQWAgEAWxSAAAAAABIAQHByb29mQG1ldGFjb2RlLmJpemh0dHBzOi8vZ2lz
+dC5naXRodWIuY29tL0Ftb2xpdGgvZDMwMTZkN2E1MzI5NDRhZjhhN2RkYzA5ODk4
+ZDUzMGMyFIAAAAAAEgAXcHJvb2ZAbWV0YWNvZGUuYml6ZG5zOm5peG5ldC54eXo/
+dHlwZT1UWFQ8FIAAAAAAEgAhcHJvb2ZAbWV0YWNvZGUuYml6aHR0cHM6Ly9tYXN0
+by5uaXhuZXQueHl6L0BhbW9saXRoZBSAAAAAABIASXByb29mQG1ldGFjb2RlLmJp
+emh0dHBzOi8vd3d3LnJlZGRpdC5jb20vdXNlci9BbW9saXRoL2NvbW1lbnRzL2J4
+enJvei9ncGdfa2V5X3ZlcmlmaWNhdGlvbi8WIQR13TLKG/7qauQNgjxR/UCTbbAG
+WwUCXQXUOQUJBrcyfgAKCRBR/UCTbbAGWzezEAC07EO0+OfUkZj1ev1YbxEcC7kL
+J9WnDa1sFe7x2EpH9Z8SyUkBDXW8YktrBPg4fWls3AVSyfe7U5/TtA5M6WcRt4UR
+YbHAS8FFS20BPRWK6FoSexSy1dtkOBXMT3hn9X0RQoDDTB3w9/bAjq8r4zMvb1+n
+H1UGJh3g5tYAjyCXfbSz30bfZlkbhc57tMiPWG3RyOiiyhUEfXkMnlNK5ugj1RLQ
+qFxKWo8B6y0MJOxSNaFrGwJbbJtkN6f3AavzIFPwyhemKfT/rEDGvigWr7G7CfAr
+1pqurTY+RTlUUhQYG1VLb05yc0D1AXRjFcZWiRw6D2BxNi5MuEwbWnYhNmSom6H/
+FSThxn/hxAgQpapjXkC8jqy6/gTpqRigvdlICGzlpmKix61Cb0laV+7+P81kr8x9
+wfjZWNwVIlTZ/BuOAYGJstxKvkAiEG3qUF8oh36vM5xGnzfK/Ewz/JJHoes0SkX6
+XIxEwuJP8qAUus18snN599tXmtgYLU51QqUrJh+MC8+tlkWHj+x9VQMAV5jlAioq
+d2aZPJg+cC2P+a9BB15c6j5Kyx3cYRJwHzKcr2G/nbvfGAL3ECr1CuC0My4ae9Rl
+9OMzOkV9J/QIDZPBFNfZTjWCMDyCLG92F318GJ+vi2EquX+Qc6Z2aS3/5BITPX61
+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
+NDRhZjhhN2RkYzA5ODk4ZDUzMGMyFIAAAAAAEgAXcHJvb2ZAbWV0YWNvZGUuYml6
+ZG5zOm5peG5ldC54eXo/dHlwZT1UWFQ8FIAAAAAAEgAhcHJvb2ZAbWV0YWNvZGUu
+Yml6aHR0cHM6Ly9tYXN0by5uaXhuZXQueHl6L0BhbW9saXRoZBSAAAAAABIASXBy
+b29mQG1ldGFjb2RlLmJpemh0dHBzOi8vd3d3LnJlZGRpdC5jb20vdXNlci9BbW9s
+aXRoL2NvbW1lbnRzL2J4enJvei9ncGdfa2V5X3ZlcmlmaWNhdGlvbi8ACgkQUf1A
+k22wBluVXA/+KMdsHcfNZEFRDXoCYxEA24PPqLcaObz7ounUBYdjuljpdi+prPWs
+FT7AR214mC5UbOUtfCHrZ5bbkMD+Si6UDKoyiu8joZa6GKr5ddTkbdo0QJxQHCT+
+cZAqLY097UCXKhHjwD71hma4FuWKBCNh6ix3XDP5vZ5rRVajZMTADFZP044mRH4O
+Q+aW0vBhYaWgXa0BAnNhBw70lz/oHdM1zi8XqiB4pNBsmdHd3GbH7tIwCqbXw9gi
+s/dFGeWIERdCLrxR+45akWJm+uSUlFbipGX/zBG/5oJYjPXnRU973n0mX5MWFd3a
+vLJskoWyVBvrlKNKJqf6tU59umo2ocwEkKLtZJ0V3YG5lWF6dPA1svmpKvA/ufnc
+T83PiJgZGBR+yTwGsoH3fMbsvAo1uS76+ZWo3ulYgMWEDuI4kI/rLxqd9Ya0e/tG
+JVVuPtUWdx1+eebBSWTJU98KB+QKeaO52vIkUPsPFx8y029Dvx4TD7wK9jbzKJZB
+uPDIQSQXaqH3LsbvsGIG3bkTlECIQlTZhFHg1M5SJENRzp2Z4GfLkv2KONQAPEkJ
+BKcHKZYXZbK8hetpy74O+Jj2c8MSPUrrbI5iC8NwhcwF2gfkow8H/rAQhuEt2xRK
+9zO9ISkOukLccyczlEb7hP1NKIoVSzJrN+E55PIMxjSr1jQXQ4SMRJi5Ag0EW/I8
+OwEQALsWpBxmWOrcNOJjlAlqVW+JZS2MebKFnN0vC2sBzs0UyZcLGZCSMd3GxQM7
+rIMbkcsmqF4lFs/gU2CEHALhJzCGvOsKHCiOevO/qwQy4bicMur8DwSD+N3ZA7sj
+g5x9MiTJmYkmPUC9qKvq0ZVCK38fyD39MdtTCe+UYclOkXzc3dGHmwLzDYmmXpbj
+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
+OHc=
+=nOej
 -----END PGP PUBLIC KEY BLOCK-----

contact.html 🔗

@@ -1,5 +1,5 @@
 ---
-layout: page
+layout: home
 title: Contact
 subtitle: Where to find me
 description: Various ways to contact me
@@ -12,27 +12,27 @@ These are some of my more public accounts; feel free to contact me at any of the
 <div class="flex-wrapper">
     <div class="flex-cards">
         <div class="contact-card">
-            <a title="Email" href="mailto:{{ site.author.email }}" target="_blank">
-                <h1><i class="fa fa-envelope"></i></h1>
-                <p>Email</p>
+            <a title="Jabber/XMPP" ref="me" href="xmpp:amolith@nixnet.xyz" target="_blank">
+                <h1><i class="fa fa-xmpp"></i></h1>
+                <p>Jabber/XMPP</p>
             </a>
         </div>
         <div class="contact-card">
-            <a title="Telegram" href="https://t.me/amolith/" target="_blank">
-                <h1><i class="fa fa-telegram"></i></h1>
-                <p>Telegram</p>
+            <a title="Email" href="mailto:{{ site.author.email }}" target="_blank">
+                <h1><i class="fa fa-envelope"></i></h1>
+                <p>Email</p>
             </a>
         </div>
         <div class="contact-card">
-            <a title="Mastodon" rel="me" href="https://masto.nixnet.xyz/@amolith" target="_blank">
+            <a title="Mastodon" rel="me" rel="noreferrer" href="https://masto.nixnet.xyz/@amolith" target="_blank">
                 <h1><i class="fa fa-mastodon"></i></h1>
                 <p>Mastodon</p>
             </a>
         </div>
         <div class="contact-card">
-            <a title="Keybase" ref="me" href="https://keybase.io/amolith" target="_blank">
-                <h1><i class="fa fa-keybase"></i></h1>
-                <p>Keybase</p>
+            <a title="Telegram" rel="noreferrer" href="https://t.me/amolith/" target="_blank">
+                <h1><i class="fa fa-telegram"></i></h1>
+                <p>Telegram</p>
             </a>
         </div>
     </div>
@@ -40,9 +40,10 @@ These are some of my more public accounts; feel free to contact me at any of the
 <br/>
 <br/>
 <hr/>
+<br/>
 <div class="content">
     <p class="center">
-    I also have <a href="https://briarproject.org/" target="_blank">Briar</a> if we meet IRL and I'm on <a href="https://wire.com/en/" target="_blank">Wire</a> as <code>@amolith</code>. I can be found on my XMPP server at <code>amolith@nixnet.xyz</code> as well.
+    I also have <a href="https://briarproject.org/" rel="noreferrer" target="_blank">Briar</a> if we meet IRL and I'm on <a href="https://wire.com/en/" rel="noreferrer" target="_blank">Wire</a> as <code>@amolith</code>.
     </p>
     <p class="center">
     Despite the many ways to contact me, email and XMPP are and always will be my most preferrered methods (as well as the most reliable). If you email me, please be sure to encrypt it with my <a title="Plaintext GPG key" href="/amolith.txt" type="text/plain" target="_blank">GPG key</a>. If you message me over XMPP, please make sure it's with a client that has OMEMO encryption.

contact2.html 🔗

@@ -0,0 +1,78 @@
+---
+layout: page
+title: Contact
+subtitle: Where to find me
+description: Various ways to contact me
+cover: /assets/pages/contact.png
+permalink: /contact2/
+---
+<style>
+    .props { list-style-type: none; margin-left: 0; padding-left: 0; }
+    i { padding-right: 5px; }
+    .proof { font-size: small; margin-left: 10px; color: #73a6ff }
+    .verification { font-size: small; margin-left: 5px; cursor: pointer }
+    summary { cursor: pointer }
+    .verified { color: green }
+    .verified::before { content: "✅"; margin-right: 5px; }
+    .avatar { width: 148px; height: 148px; border-radius: 74px;
+      display: block;
+      margin-left: auto;
+      margin-right: auto;
+    }
+    h2 { text-align: center; line-height: 1.5 }
+    .wrapper { margin: 40px 0; }
+    .wrapper > div { margin: 20px; }
+    textarea { width: 100%; height: 200px; }
+    .note { font-size: small }
+    @media (min-width: 600px) {
+      .wrapper {
+        display: flex;
+        width: 100%;
+      }
+      .wrapper .bio {
+        width: 35%;
+      }
+    }
+</style>
+<script>
+var System = {
+    _deps: Object.create(null),
+    register(name, deps, callback) {
+        const exports = Object.create(null);
+        const result = callback((name, value) => exports[name] = value);
+        for (let i = 0; i < deps.length; i++) {
+            result.setters[i](this._deps[deps[i]]);
+        }
+        result.execute();
+        this._deps[name] = exports;
+    }
+};
+</script>
+<style>
+    img { vertical-align: top }
+</style>
+<script src="/openpgp.js"></script>
+<script src="/scripts.js"></script>
+<body>
+    <header>
+      <div class="col cont">
+        <div class="left">
+            <a href="index.html">OpenPGP</a>
+        </div>
+        <div class="links">
+          <a href="../@wiktor.html">Contact</a>
+        </div>
+      </div>
+    </header>
+    <main>
+      <div class="col">
+        <section id="content">
+    <div id=result>Loading key...</div>
+
+    </section>
+    <section class="note">
+      <p>Note: contents of this page are generated purely from the OpenPGP key in your browser.
+      If you want to add social proofs to your key see <a href="proofs.html">OpenPGP Proofs</a> page.</p>
+      <p>If you want to adjust the keyserver used or the key being displayed just edit this HTML page.</p>
+    </section>
+    </div>

css/main.scss 🔗

@@ -8,7 +8,7 @@ sitemap:
 /* =Colors */
 $dorian: #323234;
 $iron: #ffffff;
-$cloudy: #828282;
+$cloudy: #9d9d9d;
 
 @import
     "mixins",

friends.html 🔗

@@ -1,23 +0,0 @@
----
-layout: page
-title: Friends of NixNet
-subtitle: A list of some like-minded people and their websites
-description: A list of some like-minded people and their websites
-cover: /assets/pages/friends.png 
-permalink: /friends/
----
-<div class="content">
-    <h2>People</h2>
-    <ul>
-        <li><a href="https://lushka.al/">Anxhelo Lushka</a> - graphic designer, frontend developer, computer engineering student and heavy open source user/advocate. Has an interesting blog.</li>
-        <li><a href="http://lukesmith.xyz/">Luke Smith</a> - makes technology videos on YouTube, is the Luke of <a href="https://larbs.xyz/">Luke&#39;s Auto-Rice Bootstrapping Scripts (LARBS)</a>, and does a podcast called <em>Not Related</em> on &quot;Big-Braned&quot; topics</li>
-    </ul>
-    <h2>Organisations</h2>
-    <ul>
-        <li><a href="https://libreho.st/">LibreHo.st</a> - a network of average people who host FLOSS services available for anyone to use</li>
-        <li><a href="https://lelux.fi/">Lelux.fi</a> - really cool guy who hosts some services like I do</li>
-        <li><a href="https://snopyta.org/">Snopyta.org</a> - Snopyta provides online services based on freedom, privacy and decentralization. Part of LibreHosters.</li>
-        <li><a href="https://libredesigners.org/">LibreDesigners.org</a> - a website for learning how to create art, interfaces, websites, etc. with free/libre and open source software (Portuguese-only right now)</li>
-        <li><a href="https://cygonetwork.com">CYGONetwork.com</a> - alternative to Facebook. Better features, better community, and enhanced privacy/security</li>
-    </ul>
-</div>

img.py 🔗

@@ -1,5 +1,5 @@
 ---
-layout: page
+layout: home
 title: "NixNet"
 subtitle: "Freedom served with a slice of liberty"
 description: "A network of websites and services hosted by Amolith available for anyone to use free of charge."
@@ -11,7 +11,7 @@ priority: 0.9
     <p>I host a variety of services that are available for anyone to use free of charge. Below is a list with descriptions of each.
     <br />
     <br />
-    <a href="https://git.nixnet.xyz/NixNet" target="_blank"><button class="donate"><i class="fa fa-cogs"></i> Technical Info</button></a>
+    <a href="https://git.nixnet.xyz/NixNet" rel="noreferrer" target="_blank"><button class="donate"><i class="fa fa-cogs"></i> Technical Info</button></a>
     </p>
 </center>
 <!--

me.html 🔗

@@ -6,13 +6,13 @@ description: A bit about NixNet's admin, Amolith
 cover: /assets/pages/me.png
 permalink: /me/
 ---
-<p>I am an 18 year old student who lives in the Southern US. This is my last year in high school and I’m planning to graduate with my high school diploma, an Associate’s Degree in Arts, a second in Sciences, and a third in Fine Arts, Music.</p>
+<p>I am an 19 year old student who lives in the Southern US. This is my last year in high school and I’m planning to graduate with my high school diploma, an Associate’s Degree in Arts, a second in Sciences, and a third in Fine Arts, Music.</p>
 <center><h1>Experience with Linux, abbrv.</h1></center>
-<center><h2>Where it all started</h2></center>
+<h2>Where it all started</h2>
 <p>I got started with GNU/Linux nearly two years ago and it was amazing. The only computer I had at the time was an Acer C710 Chromebook that I got at the beginning of 8th grade. I had this for three years before I grew tired of how limited it was. A friend told me about this thing called Linux and how I should look into seeing if I could get it on my Chromebook. He brought a USB stick to school that he said was “bootable”. I had no idea what this was but I trusted him. We turned off my Chromebook and turned it back on and he tried pressing a bunch of keys. This didn’t do anything. He was really confused and told me I’d have to do my own research on how to install Linux. I did and, eventually, I discovered a few tutorials I could follow. I combined a couple different ones, messed with the motherboard, enabled dev mode, flashed a new BIOS, and got vanilla Ubuntu installed.</p>
-<center><h2>Distro hopping</h2></center>
+<h2>Distro hopping</h2>
 <p>I had a very bad experience with this because the Acer C710 has a 1.1 GHz dual-core processor, 2 GB of RAM, and 16 GB of storage (SSD). I didn’t give up though and started distro hopping, looking for the most lightweight distro I could find. This eventually led me to GalliumOS, a distro built for Chromebooks. It ran well enough but I had heard of this thing called Arch that was supposed to be the ultimate. I knew I couldn’t install vanilla Arch so I went with ArcoLinuxD (ArchMergeD, at the time) and it was a great experience. That’s what’s still on my Chromebook.</p>
-<center><h2>“Real” computer</h2></center>
+<h2>“Real” computer</h2>
 <p>Last March, a friend’s father got me a brand new laptop that actually works. I left Windows on it for three days then wiped it. I went with ArchLabs and loved it . . . until I tried to play some Steam games. Apparently there was a font issue with some of ArchLabs’ s fonts. No one was able to help so I just went for Arch. I installed Xubuntu (I like lightweight distros on powerful machines) on half the drive and worked on Arch for the other half. I tried and failed in two days the first time and succeeded in 15 minutes the next time. It took all the next day to get it set up. I’m actually still on that same installation and haven't had anything break so far.</p>
 
 <center><h1>That brings us to . . . now</h1>

openpgp.js 🔗

@@ -0,0 +1,42864 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.openpgp = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+(function (global){
+"use strict";
+
+!function (e, t) {
+  "object" == typeof exports && "undefined" != typeof module ? t(exports) : "function" == typeof define && define.amd ? define(["exports"], t) : t((e = e || self).WebStreamsPolyfill = {});
+}(undefined, function (e) {
+  "use strict";
+  const t = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? Symbol : e => `Symbol(${e})`;const r = "undefined" != typeof self ? self : "undefined" != typeof window ? window : "undefined" != typeof global ? global : void 0,
+        o = Number.isNaN || function (e) {
+    return e != e;
+  };function n(e) {
+    return "object" == typeof e && null !== e || "function" == typeof e;
+  }function i(e, t, r) {
+    Object.defineProperty(e, t, { value: r, writable: !0, enumerable: !0, configurable: !0 });
+  }function a(e) {
+    return e.slice();
+  }function s(e, t, r, o, n) {
+    new Uint8Array(e).set(new Uint8Array(r, o, n), t);
+  }function l(e) {
+    return !1 !== function (e) {
+      if ("number" != typeof e) return !1;if (o(e)) return !1;if (e < 0) return !1;return !0;
+    }(e) && e !== 1 / 0;
+  }function c(e, t, r) {
+    if ("function" != typeof e) throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e, t, r);
+  }function u(e, t, r, o) {
+    const n = e[t];if (void 0 !== n) {
+      if ("function" != typeof n) throw new TypeError(`${n} is not a method`);switch (r) {case 0:
+          return () => f(n, e, o);case 1:
+          return t => {
+            const r = [t].concat(o);return f(n, e, r);
+          };}
+    }return () => Promise.resolve();
+  }function d(e, t, r) {
+    const o = e[t];if (void 0 !== o) return c(o, e, r);
+  }function f(e, t, r) {
+    try {
+      return Promise.resolve(c(e, t, r));
+    } catch (e) {
+      return Promise.reject(e);
+    }
+  }function _(e) {
+    return e;
+  }function h(e) {
+    if (e = Number(e), o(e) || e < 0) throw new RangeError("highWaterMark property of a queuing strategy must be non-negative and non-NaN");return e;
+  }function b(e) {
+    if (void 0 === e) return () => 1;if ("function" != typeof e) throw new TypeError("size property of a queuing strategy must be a function");return t => e(t);
+  }function m(e, t, r) {
+    return Promise.prototype.then.call(e, t, r);
+  }function y(e, t, r) {
+    let o, n;const i = new Promise((e, t) => {
+      o = e, n = t;
+    });void 0 === r && (r = e => {
+      throw e;
+    });return function (e, t, r) {
+      let o = !1;const n = e => {
+        !1 === o && (o = !0, r(e));
+      };let i = 0,
+          a = 0;const s = e.length,
+            l = new Array(s);for (const r of e) {
+        const e = i;m(r, r => {
+          l[e] = r, ++a === s && t(l);
+        }, n), ++i;
+      }
+    }(e, e => {
+      try {
+        const r = t(e);o(r);
+      } catch (e) {
+        n(e);
+      }
+    }, e => {
+      try {
+        const t = r(e);o(t);
+      } catch (e) {
+        n(e);
+      }
+    }), i;
+  }function p(e) {}function w(e) {
+    e && e instanceof p.AssertionError && setTimeout(() => {
+      throw e;
+    }, 0);
+  }function g(e) {
+    const t = e._queue.shift();return e._queueTotalSize -= t.size, e._queueTotalSize < 0 && (e._queueTotalSize = 0), t.value;
+  }function S(e, t, r) {
+    if (!l(r = Number(r))) throw new RangeError("Size must be a finite, non-NaN, non-negative number.");e._queue.push({ value: t, size: r }), e._queueTotalSize += r;
+  }function v(e) {
+    e._queue = [], e._queueTotalSize = 0;
+  }p.AssertionError = function () {};const R = t("[[AbortSteps]]"),
+        P = t("[[ErrorSteps]]");class WritableStream {
+    constructor(e = {}, t = {}) {
+      q(this);const r = t.size;let o = t.highWaterMark;if (void 0 !== e.type) throw new RangeError("Invalid type is specified");const n = b(r);void 0 === o && (o = 1), function (e, t, r, o) {
+        const n = Object.create(WritableStreamDefaultController.prototype);const i = u(t, "write", 1, [n]),
+              a = u(t, "close", 0, []),
+              s = u(t, "abort", 1, []);$(e, n, function () {
+          return d(t, "start", [n]);
+        }, i, a, s, r, o);
+      }(this, e, o = h(o), n);
+    }get locked() {
+      if (!1 === E(this)) throw G("locked");return C(this);
+    }abort(e) {
+      return !1 === E(this) ? Promise.reject(G("abort")) : !0 === C(this) ? Promise.reject(new TypeError("Cannot abort a stream that already has a writer")) : j(this, e);
+    }getWriter() {
+      if (!1 === E(this)) throw G("getWriter");return T(this);
+    }
+  }function T(e) {
+    return new WritableStreamDefaultWriter(e);
+  }function q(e) {
+    e._state = "writable", e._storedError = void 0, e._writer = void 0, e._writableStreamController = void 0, e._writeRequests = [], e._inFlightWriteRequest = void 0, e._closeRequest = void 0, e._inFlightCloseRequest = void 0, e._pendingAbortRequest = void 0, e._backpressure = !1;
+  }function E(e) {
+    return !!n(e) && !!Object.prototype.hasOwnProperty.call(e, "_writableStreamController");
+  }function C(e) {
+    return void 0 !== e._writer;
+  }function j(e, t) {
+    const r = e._state;if ("closed" === r || "errored" === r) return Promise.resolve(void 0);if (void 0 !== e._pendingAbortRequest) return e._pendingAbortRequest._promise;let o = !1;"erroring" === r && (o = !0, t = void 0);const n = new Promise((r, n) => {
+      e._pendingAbortRequest = { _promise: void 0, _resolve: r, _reject: n, _reason: t, _wasAlreadyErroring: o };
+    });return e._pendingAbortRequest._promise = n, !1 === o && W(e, t), n;
+  }function A(e, t) {
+    "writable" !== e._state ? B(e) : W(e, t);
+  }function W(e, t) {
+    const r = e._writableStreamController;e._state = "erroring", e._storedError = t;const o = e._writer;void 0 !== o && D(o, t), !1 === function (e) {
+      if (void 0 === e._inFlightWriteRequest && void 0 === e._inFlightCloseRequest) return !1;return !0;
+    }(e) && !0 === r._started && B(e);
+  }function B(e) {
+    e._state = "errored", e._writableStreamController[P]();const t = e._storedError;for (const r of e._writeRequests) r._reject(t);if (e._writeRequests = [], void 0 === e._pendingAbortRequest) return void z(e);const r = e._pendingAbortRequest;if (e._pendingAbortRequest = void 0, !0 === r._wasAlreadyErroring) return r._reject(t), void z(e);e._writableStreamController[R](r._reason).then(() => {
+      r._resolve(), z(e);
+    }, t => {
+      r._reject(t), z(e);
+    });
+  }function O(e) {
+    return void 0 !== e._closeRequest || void 0 !== e._inFlightCloseRequest;
+  }function z(e) {
+    void 0 !== e._closeRequest && (e._closeRequest._reject(e._storedError), e._closeRequest = void 0);const t = e._writer;void 0 !== t && ee(t, e._storedError);
+  }function k(e, t) {
+    const r = e._writer;void 0 !== r && t !== e._backpressure && (!0 === t ? function (e) {
+      re(e);
+    }(r) : ae(r)), e._backpressure = t;
+  }class WritableStreamDefaultWriter {
+    constructor(e) {
+      if (!1 === E(e)) throw new TypeError("WritableStreamDefaultWriter can only be constructed with a WritableStream instance");if (!0 === C(e)) throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream = e, e._writer = this;const t = e._state;if ("writable" === t) !1 === O(e) && !0 === e._backpressure ? re(this) : ne(this), X(this);else if ("erroring" === t) oe(this, e._storedError), X(this);else if ("closed" === t) ne(this), function (e) {
+        X(e), te(e);
+      }(this);else {
+        const t = e._storedError;oe(this, t), Z(this, t);
+      }
+    }get closed() {
+      return !1 === F(this) ? Promise.reject(J("closed")) : this._closedPromise;
+    }get desiredSize() {
+      if (!1 === F(this)) throw J("desiredSize");if (void 0 === this._ownerWritableStream) throw K("desiredSize");return function (e) {
+        const t = e._ownerWritableStream,
+              r = t._state;if ("errored" === r || "erroring" === r) return null;if ("closed" === r) return 0;return Q(t._writableStreamController);
+      }(this);
+    }get ready() {
+      return !1 === F(this) ? Promise.reject(J("ready")) : this._readyPromise;
+    }abort(e) {
+      return !1 === F(this) ? Promise.reject(J("abort")) : void 0 === this._ownerWritableStream ? Promise.reject(K("abort")) : function (e, t) {
+        return j(e._ownerWritableStream, t);
+      }(this, e);
+    }close() {
+      if (!1 === F(this)) return Promise.reject(J("close"));const e = this._ownerWritableStream;return void 0 === e ? Promise.reject(K("close")) : !0 === O(e) ? Promise.reject(new TypeError("cannot close an already-closing stream")) : L(this);
+    }releaseLock() {
+      if (!1 === F(this)) throw J("releaseLock");void 0 !== this._ownerWritableStream && M(this);
+    }write(e) {
+      return !1 === F(this) ? Promise.reject(J("write")) : void 0 === this._ownerWritableStream ? Promise.reject(K("write to")) : Y(this, e);
+    }
+  }function F(e) {
+    return !!n(e) && !!Object.prototype.hasOwnProperty.call(e, "_ownerWritableStream");
+  }function L(e) {
+    const t = e._ownerWritableStream,
+          r = t._state;if ("closed" === r || "errored" === r) return Promise.reject(new TypeError(`The stream (in ${r} state) is not in the writable state and cannot be closed`));const o = new Promise((e, r) => {
+      const o = { _resolve: e, _reject: r };t._closeRequest = o;
+    });return !0 === t._backpressure && "writable" === r && ae(e), function (e) {
+      S(e, "close", 0), x(e);
+    }(t._writableStreamController), o;
+  }function I(e, t) {
+    "pending" === e._closedPromiseState ? ee(e, t) : function (e, t) {
+      Z(e, t);
+    }(e, t);
+  }function D(e, t) {
+    "pending" === e._readyPromiseState ? ie(e, t) : function (e, t) {
+      oe(e, t);
+    }(e, t);
+  }function M(e) {
+    const t = e._ownerWritableStream,
+          r = new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");D(e, r), I(e, r), t._writer = void 0, e._ownerWritableStream = void 0;
+  }function Y(e, t) {
+    const r = e._ownerWritableStream,
+          o = r._writableStreamController,
+          n = function (e, t) {
+      try {
+        return e._strategySizeAlgorithm(t);
+      } catch (t) {
+        return H(e, t), 1;
+      }
+    }(o, t);if (r !== e._ownerWritableStream) return Promise.reject(K("write to"));const i = r._state;if ("errored" === i) return Promise.reject(r._storedError);if (!0 === O(r) || "closed" === i) return Promise.reject(new TypeError("The stream is closing or closed and cannot be written to"));if ("erroring" === i) return Promise.reject(r._storedError);const a = function (e) {
+      return new Promise((t, r) => {
+        const o = { _resolve: t, _reject: r };e._writeRequests.push(o);
+      });
+    }(r);return function (e, t, r) {
+      const o = { chunk: t };try {
+        S(e, o, r);
+      } catch (t) {
+        return void H(e, t);
+      }const n = e._controlledWritableStream;if (!1 === O(n) && "writable" === n._state) {
+        const t = U(e);k(n, t);
+      }x(e);
+    }(o, t, n), a;
+  }class WritableStreamDefaultController {
+    constructor() {
+      throw new TypeError("WritableStreamDefaultController cannot be constructed explicitly");
+    }error(e) {
+      if (!1 === function (e) {
+        if (!n(e)) return !1;if (!Object.prototype.hasOwnProperty.call(e, "_controlledWritableStream")) return !1;return !0;
+      }(this)) throw new TypeError("WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController");"writable" === this._controlledWritableStream._state && V(this, e);
+    }[R](e) {
+      const t = this._abortAlgorithm(e);return N(this), t;
+    }[P]() {
+      v(this);
+    }
+  }function $(e, t, r, o, n, i, a, s) {
+    t._controlledWritableStream = e, e._writableStreamController = t, t._queue = void 0, t._queueTotalSize = void 0, v(t), t._started = !1, t._strategySizeAlgorithm = s, t._strategyHWM = a, t._writeAlgorithm = o, t._closeAlgorithm = n, t._abortAlgorithm = i;const l = U(t);k(e, l);const c = r();Promise.resolve(c).then(() => {
+      t._started = !0, x(t);
+    }, r => {
+      t._started = !0, A(e, r);
+    }).catch(w);
+  }function N(e) {
+    e._writeAlgorithm = void 0, e._closeAlgorithm = void 0, e._abortAlgorithm = void 0, e._strategySizeAlgorithm = void 0;
+  }function Q(e) {
+    return e._strategyHWM - e._queueTotalSize;
+  }function x(e) {
+    const t = e._controlledWritableStream;if (!1 === e._started) return;if (void 0 !== t._inFlightWriteRequest) return;const r = t._state;if ("closed" === r || "errored" === r) return;if ("erroring" === r) return void B(t);if (0 === e._queue.length) return;const o = function (e) {
+      return e._queue[0].value;
+    }(e);"close" === o ? function (e) {
+      const t = e._controlledWritableStream;(function (e) {
+        e._inFlightCloseRequest = e._closeRequest, e._closeRequest = void 0;
+      })(t), g(e);const r = e._closeAlgorithm();N(e), r.then(() => {
+        !function (e) {
+          e._inFlightCloseRequest._resolve(void 0), e._inFlightCloseRequest = void 0, "erroring" === e._state && (e._storedError = void 0, void 0 !== e._pendingAbortRequest && (e._pendingAbortRequest._resolve(), e._pendingAbortRequest = void 0)), e._state = "closed";const t = e._writer;void 0 !== t && te(t);
+        }(t);
+      }, e => {
+        !function (e, t) {
+          e._inFlightCloseRequest._reject(t), e._inFlightCloseRequest = void 0, void 0 !== e._pendingAbortRequest && (e._pendingAbortRequest._reject(t), e._pendingAbortRequest = void 0), A(e, t);
+        }(t, e);
+      }).catch(w);
+    }(e) : function (e, t) {
+      const r = e._controlledWritableStream;(function (e) {
+        e._inFlightWriteRequest = e._writeRequests.shift();
+      })(r), e._writeAlgorithm(t).then(() => {
+        !function (e) {
+          e._inFlightWriteRequest._resolve(void 0), e._inFlightWriteRequest = void 0;
+        }(r);const t = r._state;if (g(e), !1 === O(r) && "writable" === t) {
+          const t = U(e);k(r, t);
+        }x(e);
+      }, t => {
+        "writable" === r._state && N(e), function (e, t) {
+          e._inFlightWriteRequest._reject(t), e._inFlightWriteRequest = void 0, A(e, t);
+        }(r, t);
+      }).catch(w);
+    }(e, o.chunk);
+  }function H(e, t) {
+    "writable" === e._controlledWritableStream._state && V(e, t);
+  }function U(e) {
+    return Q(e) <= 0;
+  }function V(e, t) {
+    const r = e._controlledWritableStream;N(e), W(r, t);
+  }function G(e) {
+    return new TypeError(`WritableStream.prototype.${e} can only be used on a WritableStream`);
+  }function J(e) {
+    return new TypeError(`WritableStreamDefaultWriter.prototype.${e} can only be used on a WritableStreamDefaultWriter`);
+  }function K(e) {
+    return new TypeError("Cannot " + e + " a stream using a released writer");
+  }function X(e) {
+    e._closedPromise = new Promise((t, r) => {
+      e._closedPromise_resolve = t, e._closedPromise_reject = r, e._closedPromiseState = "pending";
+    });
+  }function Z(e, t) {
+    X(e), ee(e, t);
+  }function ee(e, t) {
+    e._closedPromise.catch(() => {}), e._closedPromise_reject(t), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0, e._closedPromiseState = "rejected";
+  }function te(e) {
+    e._closedPromise_resolve(void 0), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0, e._closedPromiseState = "resolved";
+  }function re(e) {
+    e._readyPromise = new Promise((t, r) => {
+      e._readyPromise_resolve = t, e._readyPromise_reject = r;
+    }), e._readyPromiseState = "pending";
+  }function oe(e, t) {
+    re(e), ie(e, t);
+  }function ne(e) {
+    re(e), ae(e);
+  }function ie(e, t) {
+    e._readyPromise.catch(() => {}), e._readyPromise_reject(t), e._readyPromise_resolve = void 0, e._readyPromise_reject = void 0, e._readyPromiseState = "rejected";
+  }function ae(e) {
+    e._readyPromise_resolve(void 0), e._readyPromise_resolve = void 0, e._readyPromise_reject = void 0, e._readyPromiseState = "fulfilled";
+  }const se = Number.isInteger || function (e) {
+    return "number" == typeof e && isFinite(e) && Math.floor(e) === e;
+  },
+        le = t("[[CancelSteps]]"),
+        ce = t("[[PullSteps]]");class ReadableStream {
+    constructor(e = {}, t = {}) {
+      fe(this);const r = t.size;let o = t.highWaterMark;const n = e.type;if ("bytes" === String(n)) {
+        if (void 0 !== r) throw new RangeError("The strategy for a byte stream cannot have a size function");void 0 === o && (o = 0), function (e, t, r) {
+          const o = Object.create(ReadableByteStreamController.prototype);const n = u(t, "pull", 0, [o]),
+                i = u(t, "cancel", 1, []);let a = t.autoAllocateChunkSize;if (void 0 !== a && (a = Number(a), !1 === se(a) || a <= 0)) throw new RangeError("autoAllocateChunkSize must be a positive integer");!function (e, t, r, o, n, i, a) {
+            t._controlledReadableByteStream = e, t._pullAgain = !1, t._pulling = !1, He(t), t._queue = t._queueTotalSize = void 0, v(t), t._closeRequested = !1, t._started = !1, t._strategyHWM = h(i), t._pullAlgorithm = o, t._cancelAlgorithm = n, t._autoAllocateChunkSize = a, t._pendingPullIntos = [], e._readableStreamController = t;const s = r();Promise.resolve(s).then(() => {
+              t._started = !0, xe(t);
+            }, e => {
+              nt(t, e);
+            }).catch(w);
+          }(e, o, function () {
+            return d(t, "start", [o]);
+          }, n, i, r, a);
+        }(this, e, o = h(o));
+      } else {
+        if (void 0 !== n) throw new RangeError("Invalid type is specified");{
+          const t = b(r);void 0 === o && (o = 1), function (e, t, r, o) {
+            const n = Object.create(ReadableStreamDefaultController.prototype);const i = u(t, "pull", 0, [n]),
+                  a = u(t, "cancel", 1, []);$e(e, n, function () {
+              return d(t, "start", [n]);
+            }, i, a, r, o);
+          }(this, e, o = h(o), t);
+        }
+      }
+    }get locked() {
+      if (!1 === _e(this)) throw st("locked");return he(this);
+    }cancel(e) {
+      return !1 === _e(this) ? Promise.reject(st("cancel")) : !0 === he(this) ? Promise.reject(new TypeError("Cannot cancel a stream that already has a reader")) : pe(this, e);
+    }getReader({ mode: e } = {}) {
+      if (!1 === _e(this)) throw st("getReader");if (void 0 === e) return ue(this);if ("byob" === (e = String(e))) return function (e) {
+        return new ReadableStreamBYOBReader(e);
+      }(this);throw new RangeError("Invalid mode is specified");
+    }pipeThrough({ writable: e, readable: t }, { preventClose: r, preventAbort: o, preventCancel: n, signal: i } = {}) {
+      if (!1 === _e(this)) throw st("pipeThrough");if (!1 === E(e)) throw new TypeError("writable argument to pipeThrough must be a WritableStream");if (!1 === _e(t)) throw new TypeError("readable argument to pipeThrough must be a ReadableStream");if (r = Boolean(r), o = Boolean(o), n = Boolean(n), void 0 !== i && !at(i)) throw new TypeError("ReadableStream.prototype.pipeThrough's signal option must be an AbortSignal");if (!0 === he(this)) throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");if (!0 === C(e)) throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");return be(this, e, r, o, n, i).catch(() => {}), t;
+    }pipeTo(e, { preventClose: t, preventAbort: r, preventCancel: o, signal: n } = {}) {
+      return !1 === _e(this) ? Promise.reject(st("pipeTo")) : !1 === E(e) ? Promise.reject(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream")) : (t = Boolean(t), r = Boolean(r), o = Boolean(o), void 0 === n || at(n) ? !0 === he(this) ? Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")) : !0 === C(e) ? Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")) : be(this, e, t, r, o, n) : Promise.reject(new TypeError("ReadableStream.prototype.pipeTo's signal option must be an AbortSignal")));
+    }tee() {
+      if (!1 === _e(this)) throw st("tee");const e = function (e, t) {
+        const r = ue(e);let o,
+            n,
+            i,
+            s,
+            l,
+            c = !1,
+            u = !1,
+            d = !1;const f = new Promise(e => {
+          l = e;
+        });function _() {
+          return Be(r).then(e => {
+            const t = e.value,
+                  r = e.done;if (!0 === r && !1 === c && (!1 === u && Le(i._readableStreamController), !1 === d && Le(s._readableStreamController), c = !0), !0 === c) return;const o = t,
+                  n = t;!1 === u && Ie(i._readableStreamController, o), !1 === d && Ie(s._readableStreamController, n);
+          });
+        }function h() {}return i = de(h, _, function (t) {
+          if (u = !0, o = t, !0 === d) {
+            const t = a([o, n]),
+                  r = pe(e, t);l(r);
+          }return f;
+        }), s = de(h, _, function (t) {
+          if (d = !0, n = t, !0 === u) {
+            const t = a([o, n]),
+                  r = pe(e, t);l(r);
+          }return f;
+        }), r._closedPromise.catch(e => {
+          !0 !== c && (De(i._readableStreamController, e), De(s._readableStreamController, e), c = !0);
+        }), [i, s];
+      }(this);return a(e);
+    }
+  }function ue(e) {
+    return new ReadableStreamDefaultReader(e);
+  }function de(e, t, r, o = 1, n = () => 1) {
+    const i = Object.create(ReadableStream.prototype);return fe(i), $e(i, Object.create(ReadableStreamDefaultController.prototype), e, t, r, o, n), i;
+  }function fe(e) {
+    e._state = "readable", e._reader = void 0, e._storedError = void 0, e._disturbed = !1;
+  }function _e(e) {
+    return !!n(e) && !!Object.prototype.hasOwnProperty.call(e, "_readableStreamController");
+  }function he(e) {
+    return void 0 !== e._reader;
+  }function be(e, t, r, o, n, i) {
+    const a = ue(e),
+          s = T(t);let l = !1,
+        c = Promise.resolve();return new Promise((u, d) => {
+      let f;if (void 0 !== i) {
+        if (f = () => {
+          const r = new DOMException("Aborted", "AbortError"),
+                i = [];!1 === o && i.push(() => "writable" === t._state ? j(t, r) : Promise.resolve()), !1 === n && i.push(() => "readable" === e._state ? pe(e, r) : Promise.resolve()), b(() => y(i.map(e => e()), e => e), !0, r);
+        }, !0 === i.aborted) return void f();i.addEventListener("abort", f);
+      }if (h(e, a._closedPromise, e => {
+        !1 === o ? b(() => j(t, e), !0, e) : m(!0, e);
+      }), h(t, s._closedPromise, t => {
+        !1 === n ? b(() => pe(e, t), !0, t) : m(!0, t);
+      }), function (e, t, r) {
+        "closed" === e._state ? r() : t.then(r).catch(w);
+      }(e, a._closedPromise, () => {
+        !1 === r ? b(() => function (e) {
+          const t = e._ownerWritableStream,
+                r = t._state;return !0 === O(t) || "closed" === r ? Promise.resolve() : "errored" === r ? Promise.reject(t._storedError) : L(e);
+        }(s)) : m();
+      }), !0 === O(t) || "closed" === t._state) {
+        const t = new TypeError("the destination writable stream closed before all data could be piped to it");!1 === n ? b(() => pe(e, t), !0, t) : m(!0, t);
+      }function _() {
+        const e = c;return c.then(() => e !== c ? _() : void 0);
+      }function h(e, t, r) {
+        "errored" === e._state ? r(e._storedError) : t.catch(r).catch(w);
+      }function b(e, r, o) {
+        function n() {
+          e().then(() => p(r, o), e => p(!0, e)).catch(w);
+        }!0 !== l && (l = !0, "writable" === t._state && !1 === O(t) ? _().then(n) : n());
+      }function m(e, r) {
+        !0 !== l && (l = !0, "writable" === t._state && !1 === O(t) ? _().then(() => p(e, r)).catch(w) : p(e, r));
+      }function p(e, t) {
+        M(s), We(a), void 0 !== i && i.removeEventListener("abort", f), e ? d(t) : u(void 0);
+      }new Promise((e, t) => {
+        !function r(o) {
+          o ? e() : (!0 === l ? Promise.resolve(!0) : s._readyPromise.then(() => Be(a).then(({ value: e, done: t }) => !0 === t || (c = Y(s, e).catch(() => {}), !1)))).then(r, t);
+        }(!1);
+      }).catch(e => {
+        c = Promise.resolve(), w(e);
+      });
+    });
+  }function me(e, t) {
+    return new Promise((r, o) => {
+      const n = { _resolve: r, _reject: o, _forAuthorCode: t };e._reader._readIntoRequests.push(n);
+    });
+  }function ye(e, t) {
+    return new Promise((r, o) => {
+      const n = { _resolve: r, _reject: o, _forAuthorCode: t };e._reader._readRequests.push(n);
+    });
+  }function pe(e, t) {
+    if (e._disturbed = !0, "closed" === e._state) return Promise.resolve(void 0);if ("errored" === e._state) return Promise.reject(e._storedError);return we(e), e._readableStreamController[le](t).then(() => void 0);
+  }function we(e) {
+    e._state = "closed";const t = e._reader;if (void 0 !== t) {
+      if (Ce(t)) {
+        for (const _ref of t._readRequests) {
+          const e = _ref._resolve;
+          const r = _ref._forAuthorCode;
+          e(ge(void 0, !0, r));
+        }t._readRequests = [];
+      }_t(t);
+    }
+  }function ge(e, t, r) {
+    let o = null;!0 === r && (o = Object.prototype);const n = Object.create(o);return Object.defineProperty(n, "value", { value: e, enumerable: !0, writable: !0, configurable: !0 }), Object.defineProperty(n, "done", { value: t, enumerable: !0, writable: !0, configurable: !0 }), n;
+  }function Se(e, t) {
+    e._state = "errored", e._storedError = t;const r = e._reader;if (void 0 !== r) {
+      if (Ce(r)) {
+        for (const e of r._readRequests) e._reject(t);r._readRequests = [];
+      } else {
+        for (const e of r._readIntoRequests) e._reject(t);r._readIntoRequests = [];
+      }ft(r, t);
+    }
+  }function ve(e, t, r) {
+    const o = e._reader._readRequests.shift();o._resolve(ge(t, r, o._forAuthorCode));
+  }function Re(e) {
+    return e._reader._readIntoRequests.length;
+  }function Pe(e) {
+    return e._reader._readRequests.length;
+  }function Te(e) {
+    const t = e._reader;return void 0 !== t && !!Ee(t);
+  }function qe(e) {
+    const t = e._reader;return void 0 !== t && !!Ce(t);
+  }class ReadableStreamDefaultReader {
+    constructor(e) {
+      if (!1 === _e(e)) throw new TypeError("ReadableStreamDefaultReader can only be constructed with a ReadableStream instance");if (!0 === he(e)) throw new TypeError("This stream has already been locked for exclusive reading by another reader");je(this, e), this._readRequests = [];
+    }get closed() {
+      return Ce(this) ? this._closedPromise : Promise.reject(ct("closed"));
+    }cancel(e) {
+      return Ce(this) ? void 0 === this._ownerReadableStream ? Promise.reject(lt("cancel")) : Ae(this, e) : Promise.reject(ct("cancel"));
+    }read() {
+      return Ce(this) ? void 0 === this._ownerReadableStream ? Promise.reject(lt("read from")) : Be(this, !0) : Promise.reject(ct("read"));
+    }releaseLock() {
+      if (!Ce(this)) throw ct("releaseLock");if (void 0 !== this._ownerReadableStream) {
+        if (this._readRequests.length > 0) throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");We(this);
+      }
+    }
+  }class ReadableStreamBYOBReader {
+    constructor(e) {
+      if (!_e(e)) throw new TypeError("ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a byte source");if (!1 === Ne(e._readableStreamController)) throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");if (he(e)) throw new TypeError("This stream has already been locked for exclusive reading by another reader");je(this, e), this._readIntoRequests = [];
+    }get closed() {
+      return Ee(this) ? this._closedPromise : Promise.reject(ht("closed"));
+    }cancel(e) {
+      return Ee(this) ? void 0 === this._ownerReadableStream ? Promise.reject(lt("cancel")) : Ae(this, e) : Promise.reject(ht("cancel"));
+    }read(e) {
+      return Ee(this) ? void 0 === this._ownerReadableStream ? Promise.reject(lt("read from")) : ArrayBuffer.isView(e) ? (e.buffer, 0 === e.byteLength ? Promise.reject(new TypeError("view must have non-zero byteLength")) : function (e, t, r = !1) {
+        const o = e._ownerReadableStream;if (o._disturbed = !0, "errored" === o._state) return Promise.reject(o._storedError);return function (e, t, r) {
+          const o = e._controlledReadableByteStream;let n = 1;t.constructor !== DataView && (n = t.constructor.BYTES_PER_ELEMENT);const i = t.constructor,
+                a = { buffer: _(t.buffer), byteOffset: t.byteOffset, byteLength: t.byteLength, bytesFilled: 0, elementSize: n, ctor: i, readerType: "byob" };if (e._pendingPullIntos.length > 0) return e._pendingPullIntos.push(a), me(o, r);if ("closed" === o._state) {
+            const e = new i(a.buffer, a.byteOffset, 0);return Promise.resolve(ge(e, !0, r));
+          }if (e._queueTotalSize > 0) {
+            if (!0 === Je(e, a)) {
+              const t = Ve(a);return Xe(e), Promise.resolve(ge(t, !1, r));
+            }if (!0 === e._closeRequested) {
+              const t = new TypeError("Insufficient bytes to fill elements in the given buffer");return nt(e, t), Promise.reject(t);
+            }
+          }e._pendingPullIntos.push(a);const s = me(o, r);return xe(e), s;
+        }(o._readableStreamController, t, r);
+      }(this, e, !0)) : Promise.reject(new TypeError("view must be an array buffer view")) : Promise.reject(ht("read"));
+    }releaseLock() {
+      if (!Ee(this)) throw ht("releaseLock");if (void 0 !== this._ownerReadableStream) {
+        if (this._readIntoRequests.length > 0) throw new TypeError("Tried to release a reader lock when that reader has pending read() calls un-settled");We(this);
+      }
+    }
+  }function Ee(e) {
+    return !!n(e) && !!Object.prototype.hasOwnProperty.call(e, "_readIntoRequests");
+  }function Ce(e) {
+    return !!n(e) && !!Object.prototype.hasOwnProperty.call(e, "_readRequests");
+  }function je(e, t) {
+    e._ownerReadableStream = t, t._reader = e, "readable" === t._state ? ut(e) : "closed" === t._state ? function (e) {
+      ut(e), _t(e);
+    }(e) : dt(e, t._storedError);
+  }function Ae(e, t) {
+    return pe(e._ownerReadableStream, t);
+  }function We(e) {
+    "readable" === e._ownerReadableStream._state ? ft(e, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")) : function (e, t) {
+      dt(e, t);
+    }(e, new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")), e._ownerReadableStream._reader = void 0, e._ownerReadableStream = void 0;
+  }function Be(e, t = !1) {
+    const r = e._ownerReadableStream;return r._disturbed = !0, "closed" === r._state ? Promise.resolve(ge(void 0, !0, t)) : "errored" === r._state ? Promise.reject(r._storedError) : r._readableStreamController[ce](t);
+  }class ReadableStreamDefaultController {
+    constructor() {
+      throw new TypeError();
+    }get desiredSize() {
+      if (!1 === Oe(this)) throw bt("desiredSize");return Me(this);
+    }close() {
+      if (!1 === Oe(this)) throw bt("close");if (!1 === Ye(this)) throw new TypeError("The stream is not in a state that permits close");Le(this);
+    }enqueue(e) {
+      if (!1 === Oe(this)) throw bt("enqueue");if (!1 === Ye(this)) throw new TypeError("The stream is not in a state that permits enqueue");return Ie(this, e);
+    }error(e) {
+      if (!1 === Oe(this)) throw bt("error");De(this, e);
+    }[le](e) {
+      v(this);const t = this._cancelAlgorithm(e);return Fe(this), t;
+    }[ce](e) {
+      const t = this._controlledReadableStream;if (this._queue.length > 0) {
+        const r = g(this);return !0 === this._closeRequested && 0 === this._queue.length ? (Fe(this), we(t)) : ze(this), Promise.resolve(ge(r, !1, e));
+      }const r = ye(t, e);return ze(this), r;
+    }
+  }function Oe(e) {
+    return !!n(e) && !!Object.prototype.hasOwnProperty.call(e, "_controlledReadableStream");
+  }function ze(e) {
+    !1 !== ke(e) && (!0 !== e._pulling ? (e._pulling = !0, e._pullAlgorithm().then(() => {
+      if (e._pulling = !1, !0 === e._pullAgain) return e._pullAgain = !1, ze(e);
+    }, t => {
+      De(e, t);
+    }).catch(w)) : e._pullAgain = !0);
+  }function ke(e) {
+    const t = e._controlledReadableStream;return !1 !== Ye(e) && !1 !== e._started && (!0 === he(t) && Pe(t) > 0 || Me(e) > 0);
+  }function Fe(e) {
+    e._pullAlgorithm = void 0, e._cancelAlgorithm = void 0, e._strategySizeAlgorithm = void 0;
+  }function Le(e) {
+    const t = e._controlledReadableStream;e._closeRequested = !0, 0 === e._queue.length && (Fe(e), we(t));
+  }function Ie(e, t) {
+    const r = e._controlledReadableStream;if (!0 === he(r) && Pe(r) > 0) ve(r, t, !1);else {
+      let r;try {
+        r = e._strategySizeAlgorithm(t);
+      } catch (t) {
+        throw De(e, t), t;
+      }try {
+        S(e, t, r);
+      } catch (t) {
+        throw De(e, t), t;
+      }
+    }ze(e);
+  }function De(e, t) {
+    const r = e._controlledReadableStream;"readable" === r._state && (v(e), Fe(e), Se(r, t));
+  }function Me(e) {
+    const t = e._controlledReadableStream._state;return "errored" === t ? null : "closed" === t ? 0 : e._strategyHWM - e._queueTotalSize;
+  }function Ye(e) {
+    const t = e._controlledReadableStream._state;return !1 === e._closeRequested && "readable" === t;
+  }function $e(e, t, r, o, n, i, a) {
+    t._controlledReadableStream = e, t._queue = void 0, t._queueTotalSize = void 0, v(t), t._started = !1, t._closeRequested = !1, t._pullAgain = !1, t._pulling = !1, t._strategySizeAlgorithm = a, t._strategyHWM = i, t._pullAlgorithm = o, t._cancelAlgorithm = n, e._readableStreamController = t;const s = r();Promise.resolve(s).then(() => {
+      t._started = !0, ze(t);
+    }, e => {
+      De(t, e);
+    }).catch(w);
+  }class ReadableStreamBYOBRequest {
+    constructor() {
+      throw new TypeError("ReadableStreamBYOBRequest cannot be used directly");
+    }get view() {
+      if (!1 === Qe(this)) throw mt("view");return this._view;
+    }respond(e) {
+      if (!1 === Qe(this)) throw mt("respond");if (void 0 === this._associatedReadableByteStreamController) throw new TypeError("This BYOB request has been invalidated");this._view.buffer, function (e, t) {
+        if (!1 === l(t = Number(t))) throw new RangeError("bytesWritten must be a finite");tt(e, t);
+      }(this._associatedReadableByteStreamController, e);
+    }respondWithNewView(e) {
+      if (!1 === Qe(this)) throw mt("respond");if (void 0 === this._associatedReadableByteStreamController) throw new TypeError("This BYOB request has been invalidated");if (!ArrayBuffer.isView(e)) throw new TypeError("You can only respond with array buffer views");e.buffer, function (e, t) {
+        const r = e._pendingPullIntos[0];if (r.byteOffset + r.bytesFilled !== t.byteOffset) throw new RangeError("The region specified by view does not match byobRequest");if (r.byteLength !== t.byteLength) throw new RangeError("The buffer of view has different capacity than byobRequest");r.buffer = t.buffer, tt(e, t.byteLength);
+      }(this._associatedReadableByteStreamController, e);
+    }
+  }class ReadableByteStreamController {
+    constructor() {
+      throw new TypeError("ReadableByteStreamController constructor cannot be used directly");
+    }get byobRequest() {
+      if (!1 === Ne(this)) throw yt("byobRequest");if (void 0 === this._byobRequest && this._pendingPullIntos.length > 0) {
+        const e = this._pendingPullIntos[0],
+              t = new Uint8Array(e.buffer, e.byteOffset + e.bytesFilled, e.byteLength - e.bytesFilled),
+              r = Object.create(ReadableStreamBYOBRequest.prototype);!function (e, t, r) {
+          e._associatedReadableByteStreamController = t, e._view = r;
+        }(r, this, t), this._byobRequest = r;
+      }return this._byobRequest;
+    }get desiredSize() {
+      if (!1 === Ne(this)) throw yt("desiredSize");return it(this);
+    }close() {
+      if (!1 === Ne(this)) throw yt("close");if (!0 === this._closeRequested) throw new TypeError("The stream has already been closed; do not close it again!");const e = this._controlledReadableByteStream._state;if ("readable" !== e) throw new TypeError(`The stream (in ${e} state) is not in the readable state and cannot be closed`);!function (e) {
+        const t = e._controlledReadableByteStream;if (e._queueTotalSize > 0) return void (e._closeRequested = !0);if (e._pendingPullIntos.length > 0) {
+          const t = e._pendingPullIntos[0];if (t.bytesFilled > 0) {
+            const t = new TypeError("Insufficient bytes to fill elements in the given buffer");throw nt(e, t), t;
+          }
+        }ot(e), we(t);
+      }(this);
+    }enqueue(e) {
+      if (!1 === Ne(this)) throw yt("enqueue");if (!0 === this._closeRequested) throw new TypeError("stream is closed or draining");const t = this._controlledReadableByteStream._state;if ("readable" !== t) throw new TypeError(`The stream (in ${t} state) is not in the readable state and cannot be enqueued to`);if (!ArrayBuffer.isView(e)) throw new TypeError("You can only enqueue array buffer views when using a ReadableByteStreamController");e.buffer, function (e, t) {
+        const r = e._controlledReadableByteStream,
+              o = t.buffer,
+              n = t.byteOffset,
+              i = t.byteLength,
+              a = _(o);if (!0 === qe(r)) {
+          if (0 === Pe(r)) Ge(e, a, n, i);else {
+            const e = new Uint8Array(a, n, i);ve(r, e, !1);
+          }
+        } else !0 === Te(r) ? (Ge(e, a, n, i), et(e)) : Ge(e, a, n, i);xe(e);
+      }(this, e);
+    }error(e) {
+      if (!1 === Ne(this)) throw yt("error");nt(this, e);
+    }[le](e) {
+      if (this._pendingPullIntos.length > 0) {
+        this._pendingPullIntos[0].bytesFilled = 0;
+      }v(this);const t = this._cancelAlgorithm(e);return ot(this), t;
+    }[ce](e) {
+      const t = this._controlledReadableByteStream;if (this._queueTotalSize > 0) {
+        const t = this._queue.shift();let r;this._queueTotalSize -= t.byteLength, Xe(this);try {
+          r = new Uint8Array(t.buffer, t.byteOffset, t.byteLength);
+        } catch (e) {
+          return Promise.reject(e);
+        }return Promise.resolve(ge(r, !1, e));
+      }const r = this._autoAllocateChunkSize;if (void 0 !== r) {
+        let e;try {
+          e = new ArrayBuffer(r);
+        } catch (e) {
+          return Promise.reject(e);
+        }const t = { buffer: e, byteOffset: 0, byteLength: r, bytesFilled: 0, elementSize: 1, ctor: Uint8Array, readerType: "default" };this._pendingPullIntos.push(t);
+      }const o = ye(t, e);return xe(this), o;
+    }
+  }function Ne(e) {
+    return !!n(e) && !!Object.prototype.hasOwnProperty.call(e, "_controlledReadableByteStream");
+  }function Qe(e) {
+    return !!n(e) && !!Object.prototype.hasOwnProperty.call(e, "_associatedReadableByteStreamController");
+  }function xe(e) {
+    !1 !== function (e) {
+      const t = e._controlledReadableByteStream;if ("readable" !== t._state) return !1;if (!0 === e._closeRequested) return !1;if (!1 === e._started) return !1;if (!0 === qe(t) && Pe(t) > 0) return !0;if (!0 === Te(t) && Re(t) > 0) return !0;if (it(e) > 0) return !0;return !1;
+    }(e) && (!0 !== e._pulling ? (e._pulling = !0, e._pullAlgorithm().then(() => {
+      e._pulling = !1, !0 === e._pullAgain && (e._pullAgain = !1, xe(e));
+    }, t => {
+      nt(e, t);
+    }).catch(w)) : e._pullAgain = !0);
+  }function He(e) {
+    Ze(e), e._pendingPullIntos = [];
+  }function Ue(e, t) {
+    let r = !1;"closed" === e._state && (r = !0);const o = Ve(t);"default" === t.readerType ? ve(e, o, r) : function (e, t, r) {
+      const o = e._reader._readIntoRequests.shift();o._resolve(ge(t, r, o._forAuthorCode));
+    }(e, o, r);
+  }function Ve(e) {
+    const t = e.bytesFilled,
+          r = e.elementSize;return new e.ctor(e.buffer, e.byteOffset, t / r);
+  }function Ge(e, t, r, o) {
+    e._queue.push({ buffer: t, byteOffset: r, byteLength: o }), e._queueTotalSize += o;
+  }function Je(e, t) {
+    const r = t.elementSize,
+          o = t.bytesFilled - t.bytesFilled % r,
+          n = Math.min(e._queueTotalSize, t.byteLength - t.bytesFilled),
+          i = t.bytesFilled + n,
+          a = i - i % r;let l = n,
+        c = !1;a > o && (l = a - t.bytesFilled, c = !0);const u = e._queue;for (; l > 0;) {
+      const r = u[0],
+            o = Math.min(l, r.byteLength),
+            n = t.byteOffset + t.bytesFilled;s(t.buffer, n, r.buffer, r.byteOffset, o), r.byteLength === o ? u.shift() : (r.byteOffset += o, r.byteLength -= o), e._queueTotalSize -= o, Ke(e, o, t), l -= o;
+    }return c;
+  }function Ke(e, t, r) {
+    Ze(e), r.bytesFilled += t;
+  }function Xe(e) {
+    0 === e._queueTotalSize && !0 === e._closeRequested ? (ot(e), we(e._controlledReadableByteStream)) : xe(e);
+  }function Ze(e) {
+    void 0 !== e._byobRequest && (e._byobRequest._associatedReadableByteStreamController = void 0, e._byobRequest._view = void 0, e._byobRequest = void 0);
+  }function et(e) {
+    for (; e._pendingPullIntos.length > 0;) {
+      if (0 === e._queueTotalSize) return;const t = e._pendingPullIntos[0];!0 === Je(e, t) && (rt(e), Ue(e._controlledReadableByteStream, t));
+    }
+  }function tt(e, t) {
+    const r = e._pendingPullIntos[0];if ("closed" === e._controlledReadableByteStream._state) {
+      if (0 !== t) throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream");!function (e, t) {
+        t.buffer = _(t.buffer);const r = e._controlledReadableByteStream;if (!0 === Te(r)) for (; Re(r) > 0;) Ue(r, rt(e));
+      }(e, r);
+    } else !function (e, t, r) {
+      if (r.bytesFilled + t > r.byteLength) throw new RangeError("bytesWritten out of range");if (Ke(e, t, r), r.bytesFilled < r.elementSize) return;rt(e);const o = r.bytesFilled % r.elementSize;if (o > 0) {
+        const t = r.byteOffset + r.bytesFilled,
+              n = r.buffer.slice(t - o, t);Ge(e, n, 0, n.byteLength);
+      }r.buffer = _(r.buffer), r.bytesFilled -= o, Ue(e._controlledReadableByteStream, r), et(e);
+    }(e, t, r);xe(e);
+  }function rt(e) {
+    const t = e._pendingPullIntos.shift();return Ze(e), t;
+  }function ot(e) {
+    e._pullAlgorithm = void 0, e._cancelAlgorithm = void 0;
+  }function nt(e, t) {
+    const r = e._controlledReadableByteStream;"readable" === r._state && (He(e), v(e), ot(e), Se(r, t));
+  }function it(e) {
+    const t = e._controlledReadableByteStream._state;return "errored" === t ? null : "closed" === t ? 0 : e._strategyHWM - e._queueTotalSize;
+  }function at(e) {
+    if ("object" != typeof e || null === e) return !1;const t = Object.getOwnPropertyDescriptor(AbortSignal.prototype, "aborted").get;try {
+      return t.call(e), !0;
+    } catch (e) {
+      return !1;
+    }
+  }function st(e) {
+    return new TypeError(`ReadableStream.prototype.${e} can only be used on a ReadableStream`);
+  }function lt(e) {
+    return new TypeError("Cannot " + e + " a stream using a released reader");
+  }function ct(e) {
+    return new TypeError(`ReadableStreamDefaultReader.prototype.${e} can only be used on a ReadableStreamDefaultReader`);
+  }function ut(e) {
+    e._closedPromise = new Promise((t, r) => {
+      e._closedPromise_resolve = t, e._closedPromise_reject = r;
+    });
+  }function dt(e, t) {
+    ut(e), ft(e, t);
+  }function ft(e, t) {
+    e._closedPromise.catch(() => {}), e._closedPromise_reject(t), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0;
+  }function _t(e) {
+    e._closedPromise_resolve(void 0), e._closedPromise_resolve = void 0, e._closedPromise_reject = void 0;
+  }function ht(e) {
+    return new TypeError(`ReadableStreamBYOBReader.prototype.${e} can only be used on a ReadableStreamBYOBReader`);
+  }function bt(e) {
+    return new TypeError(`ReadableStreamDefaultController.prototype.${e} can only be used on a ReadableStreamDefaultController`);
+  }function mt(e) {
+    return new TypeError(`ReadableStreamBYOBRequest.prototype.${e} can only be used on a ReadableStreamBYOBRequest`);
+  }function yt(e) {
+    return new TypeError(`ReadableByteStreamController.prototype.${e} can only be used on a ReadableByteStreamController`);
+  }class ByteLengthQueuingStrategy {
+    constructor({ highWaterMark: e }) {
+      i(this, "highWaterMark", e);
+    }size(e) {
+      return e.byteLength;
+    }
+  }class CountQueuingStrategy {
+    constructor({ highWaterMark: e }) {
+      i(this, "highWaterMark", e);
+    }size() {
+      return 1;
+    }
+  }class TransformStream {
+    constructor(e = {}, t = {}, r = {}) {
+      const o = t.size;let n = t.highWaterMark;const i = r.size;let a = r.highWaterMark;if (void 0 !== e.writableType) throw new RangeError("Invalid writable type specified");const s = b(o);if (void 0 === n && (n = 1), n = h(n), void 0 !== e.readableType) throw new RangeError("Invalid readable type specified");const l = b(i);let c;void 0 === a && (a = 0), a = h(a), function (e, t, r, o, n, i) {
+        function a() {
+          return t;
+        }e._writable = function (e, t, r, o, n = 1, i = () => 1) {
+          const a = Object.create(WritableStream.prototype);return q(a), $(a, Object.create(WritableStreamDefaultController.prototype), e, t, r, o, n, i), a;
+        }(a, function (t) {
+          return function (e, t) {
+            const r = e._transformStreamController;if (!0 === e._backpressure) {
+              const o = e._backpressureChangePromise;return o.then(() => {
+                const o = e._writable,
+                      n = o._state;if ("erroring" === n) throw o._storedError;return Tt(r, t);
+              });
+            }return Tt(r, t);
+          }(e, t);
+        }, function () {
+          return function (e) {
+            const t = e._readable,
+                  r = e._transformStreamController,
+                  o = r._flushAlgorithm();return Rt(r), o.then(() => {
+              if ("errored" === t._state) throw t._storedError;const e = t._readableStreamController;!0 === Ye(e) && Le(e);
+            }).catch(r => {
+              throw wt(e, r), t._storedError;
+            });
+          }(e);
+        }, function (t) {
+          return function (e, t) {
+            return wt(e, t), Promise.resolve();
+          }(e, t);
+        }, r, o), e._readable = de(a, function () {
+          return function (e) {
+            return St(e, !1), e._backpressureChangePromise;
+          }(e);
+        }, function (t) {
+          return gt(e, t), Promise.resolve();
+        }, n, i), e._backpressure = void 0, e._backpressureChangePromise = void 0, e._backpressureChangePromise_resolve = void 0, St(e, !0), e._transformStreamController = void 0;
+      }(this, new Promise(e => {
+        c = e;
+      }), n, s, a, l), function (e, t) {
+        const r = Object.create(TransformStreamDefaultController.prototype);let o = e => {
+          try {
+            return Pt(r, e), Promise.resolve();
+          } catch (e) {
+            return Promise.reject(e);
+          }
+        };const n = t.transform;if (void 0 !== n) {
+          if ("function" != typeof n) throw new TypeError("transform is not a method");o = e => f(n, t, [e, r]);
+        }const i = u(t, "flush", 0, [r]);!function (e, t, r, o) {
+          t._controlledTransformStream = e, e._transformStreamController = t, t._transformAlgorithm = r, t._flushAlgorithm = o;
+        }(e, r, o, i);
+      }(this, e);const _ = d(e, "start", [this._transformStreamController]);c(_);
+    }get readable() {
+      if (!1 === pt(this)) throw Et("readable");return this._readable;
+    }get writable() {
+      if (!1 === pt(this)) throw Et("writable");return this._writable;
+    }
+  }function pt(e) {
+    return !!n(e) && !!Object.prototype.hasOwnProperty.call(e, "_transformStreamController");
+  }function wt(e, t) {
+    De(e._readable._readableStreamController, t), gt(e, t);
+  }function gt(e, t) {
+    Rt(e._transformStreamController), H(e._writable._writableStreamController, t), !0 === e._backpressure && St(e, !1);
+  }function St(e, t) {
+    void 0 !== e._backpressureChangePromise && e._backpressureChangePromise_resolve(), e._backpressureChangePromise = new Promise(t => {
+      e._backpressureChangePromise_resolve = t;
+    }), e._backpressure = t;
+  }class TransformStreamDefaultController {
+    constructor() {
+      throw new TypeError("TransformStreamDefaultController instances cannot be created directly");
+    }get desiredSize() {
+      if (!1 === vt(this)) throw qt("desiredSize");return Me(this._controlledTransformStream._readable._readableStreamController);
+    }enqueue(e) {
+      if (!1 === vt(this)) throw qt("enqueue");Pt(this, e);
+    }error(e) {
+      if (!1 === vt(this)) throw qt("error");!function (e, t) {
+        wt(e._controlledTransformStream, t);
+      }(this, e);
+    }terminate() {
+      if (!1 === vt(this)) throw qt("terminate");!function (e) {
+        const t = e._controlledTransformStream,
+              r = t._readable._readableStreamController;!0 === Ye(r) && Le(r);const o = new TypeError("TransformStream terminated");gt(t, o);
+      }(this);
+    }
+  }function vt(e) {
+    return !!n(e) && !!Object.prototype.hasOwnProperty.call(e, "_controlledTransformStream");
+  }function Rt(e) {
+    e._transformAlgorithm = void 0, e._flushAlgorithm = void 0;
+  }function Pt(e, t) {
+    const r = e._controlledTransformStream,
+          o = r._readable._readableStreamController;if (!1 === Ye(o)) throw new TypeError("Readable side is not in a state that permits enqueue");try {
+      Ie(o, t);
+    } catch (e) {
+      throw gt(r, e), r._readable._storedError;
+    }(function (e) {
+      return !0 !== ke(e);
+    })(o) !== r._backpressure && St(r, !0);
+  }function Tt(e, t) {
+    return e._transformAlgorithm(t).catch(t => {
+      throw wt(e._controlledTransformStream, t), t;
+    });
+  }function qt(e) {
+    return new TypeError(`TransformStreamDefaultController.prototype.${e} can only be used on a TransformStreamDefaultController`);
+  }function Et(e) {
+    return new TypeError(`TransformStream.prototype.${e} can only be used on a TransformStream`);
+  }const Ct = { ReadableStream: ReadableStream, WritableStream: WritableStream, ByteLengthQueuingStrategy: ByteLengthQueuingStrategy, CountQueuingStrategy: CountQueuingStrategy, TransformStream: TransformStream };void 0 !== r && Object.assign(r, Ct), e.ReadableStream = ReadableStream, e.WritableStream = WritableStream, e.ByteLengthQueuingStrategy = ByteLengthQueuingStrategy, e.CountQueuingStrategy = CountQueuingStrategy, e.TransformStream = TransformStream, Object.defineProperty(e, "__esModule", { value: !0 });
+});
+
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],2:[function(require,module,exports){
+'use strict';
+
+const ea_lib = require('email-addresses');
+
+exports.parse = function parse(line, startAt) {
+    if (!line) throw 'Nothing to parse';
+
+    line = line.trim();
+
+    const addr = ea_lib({
+        input: line,
+        rfc6532: true, // unicode
+        partial: false, // return failed parses
+        simple: false, // simple AST
+        strict: false, // turn off obs- features in the rfc
+        rejectTLD: false, // domains require a "."
+        startAt: startAt || null
+    });
+
+    if (!addr) throw 'No results';
+
+    // console.log("Parsed to: ", require('util').inspect(addr, {depth: 10, colors: true}));
+
+    return addr.addresses.map(map_addresses);
+};
+
+function map_addresses(adr) {
+    if (adr.type === 'group') {
+        return new Group(adr.name, adr.addresses.map(map_addresses));
+    }
+    let comments;
+    if (adr.parts.comments) {
+        comments = adr.parts.comments.map(function (c) {
+            return c.tokens.trim();
+        }).join(' ').trim();
+        // if (comments.length) {
+        //     comments = '(' + comments + ')';
+        // }
+    }
+    let l = adr.local;
+    if (!adr.name && /:/.test(l)) l = '"' + l + '"';
+    return new Address(adr.name, l + '@' + adr.domain, comments);
+}
+
+exports.parseFrom = function (line) {
+    return exports.parse(line, 'from');
+};
+
+exports.parseSender = function (line) {
+    return exports.parse(line, 'sender');
+};
+
+exports.parseReplyTo = function (line) {
+    return exports.parse(line, 'reply-to');
+};
+
+class Group {
+    constructor(display_name, addresses) {
+        this.phrase = display_name;
+        this.addresses = addresses;
+    }
+
+    format() {
+        return this.phrase + ":" + this.addresses.map(function (a) {
+            return a.format();
+        }).join(',');
+    }
+
+    name() {
+        let phrase = this.phrase;
+
+        if (!(phrase && phrase.length)) {
+            phrase = this.comment;
+        }
+
+        const name = _extract_name(phrase);
+        return name;
+    }
+}
+
+class Address {
+    constructor(phrase, address, comment) {
+        this.phrase = phrase || '';
+        this.address = address || '';
+        this.comment = comment || '';
+    }
+
+    host() {
+        const match = /.*@(.*)$/.exec(this.address);
+        if (!match) return null;
+        return match[1];
+    }
+
+    user() {
+        const match = /^(.*)@/.exec(this.address);
+        if (!match) return null;
+        return match[1];
+    }
+
+    format() {
+        const phrase = this.phrase;
+        const email = this.address;
+        let comment = this.comment;
+
+        const addr = [];
+        const atext = new RegExp('^[\\-\\w !#$%&\'*+/=?^`{|}~]+$');
+
+        if (phrase && phrase.length) {
+            addr.push(atext.test(phrase.trim()) ? phrase : _quote_no_esc(phrase) ? phrase : '"' + phrase + '"');
+
+            if (email && email.length) {
+                addr.push("<" + email + ">");
+            }
+        } else if (email && email.length) {
+            addr.push(email);
+        }
+
+        if (comment && /\S/.test(comment)) {
+            comment = comment.replace(/^\s*\(?/, '(').replace(/\)?\s*$/, ')');
+        }
+
+        if (comment && comment.length) {
+            addr.push(comment);
+        }
+
+        return addr.join(' ');
+    }
+
+    name() {
+        let phrase = this.phrase;
+        const addr = this.address;
+
+        if (!(phrase && phrase.length)) {
+            phrase = this.comment;
+        }
+
+        let name = _extract_name(phrase);
+
+        // first.last@domain address
+        if (name === '') {
+            const match = /([^%.@_]+([._][^%.@_]+)+)[@%]/.exec(addr);
+            if (match) {
+                name = match[1].replace(/[._]+/g, ' ');
+                name = _extract_name(name);
+            }
+        }
+
+        if (name === '' && /\/g=/i.test(addr)) {
+            // X400 style address
+            let match = /\/g=([^/]*)/i.exec(addr);
+            const f = match[1];
+            match = /\/s=([^/]*)/i.exec(addr);
+            const l = match[1];
+            name = _extract_name(f + " " + l);
+        }
+
+        return name;
+    }
+}
+
+exports.Address = Address;
+
+// This is because JS regexps have no equivalent of
+// zero-width negative look-behind assertion for: /(?<!\\)"/
+function _quote_no_esc(str) {
+    if (/^"/.test(str)) return true;
+    let match;
+    while (match = /^[\s\S]*?([\s\S])"/.exec(str)) {
+        if (match[1] !== '\\') {
+            return true;
+        }
+        str = str.substr(match[0].length);
+    }
+    return false;
+}
+
+exports.isAllLower = function (string) {
+    return string === string.toLowerCase();
+};
+
+exports.isAllUpper = function (string) {
+    return string === string.toUpperCase();
+};
+
+exports.nameCase = function (string) {
+
+    return string.toLowerCase().replace(/\b(\w+)/g, function (_, d1) {
+        // Set the case of the name to first char upper rest lower
+        return d1.charAt(0).toUpperCase() + d1.slice(1);
+    }).replace(/\bMc(\w)/gi, function (_, d1) {
+        // Scottish names such as 'McLeod'
+        return 'Mc' + d1.toUpperCase();
+    }).replace(/\bo'(\w)/gi, function (_, d1) {
+        // Irish names such as 'O'Malley, O'Reilly'
+        return 'O\'' + d1.toUpperCase();
+    }).replace(/\b(x*(ix)?v*(iv)?i*)\b/ig, function (_, d1) {
+        // Roman numerals, eg 'Level III Support'
+        return d1.toUpperCase();
+    });
+};
+
+// given a comment, attempt to extract a person's name
+function _extract_name(name) {
+    // Using encodings, too hard. See Mail::Message::Field::Full.
+    if (/=?.*?\?=/.test(name)) return '';
+
+    // trim whitespace
+    name = name.trim();
+    name = name.replace(/\s+/, ' ');
+
+    // Disregard numeric names (e.g. 123456.1234@compuserve.com)
+    if (/^[\d ]+$/.test(name)) return '';
+
+    name = name.replace(/^\((.*)\)$/, '$1') // remove outermost parenthesis
+    .replace(/^"(.*)"$/, '$1') // remove outer quotation marks
+    .replace(/\(.*?\)/g, '') // remove minimal embedded comments
+    .replace(/\\/g, '') // remove all escapes
+    .replace(/^"(.*)"$/, '$1') // remove internal quotation marks
+    .replace(/^([^\s]+) ?, ?(.*)$/, '$2 $1') // reverse "Last, First M." if applicable
+    .replace(/,.*/, '');
+
+    // Change casing only when the name contains only upper or only
+    // lower cased characters.
+    if (exports.isAllUpper(name) || exports.isAllLower(name)) {
+        // console.log("Changing case of: " + name);
+        name = exports.nameCase(name);
+        // console.log("Now: " + name);
+    }
+
+    // some cleanup
+    name = name.replace(/\[[^\]]*\]/g, '').replace(/(^[\s'"]+|[\s'"]+$)/g, '').replace(/\s{2,}/g, ' ');
+
+    return name;
+}
+
+},{"email-addresses":34}],3:[function(require,module,exports){
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+/**
+ * @file {@link http://asmjs.org Asm.js} implementation of the {@link https://en.wikipedia.org/wiki/Advanced_Encryption_Standard Advanced Encryption Standard}.
+ * @author Artem S Vybornov <vybornov@gmail.com>
+ * @license MIT
+ */
+var AES_asm = exports.AES_asm = function () {
+  "use strict";
+
+  /**
+   * Galois Field stuff init flag
+   */
+
+  var ginit_done = false;
+
+  /**
+   * Galois Field exponentiation and logarithm tables for 3 (the generator)
+   */
+  var gexp3, glog3;
+
+  /**
+   * Init Galois Field tables
+   */
+  function ginit() {
+    gexp3 = [], glog3 = [];
+
+    var a = 1,
+        c,
+        d;
+    for (c = 0; c < 255; c++) {
+      gexp3[c] = a;
+
+      // Multiply by three
+      d = a & 0x80, a <<= 1, a &= 255;
+      if (d === 0x80) a ^= 0x1b;
+      a ^= gexp3[c];
+
+      // Set the log table value
+      glog3[gexp3[c]] = c;
+    }
+    gexp3[255] = gexp3[0];
+    glog3[0] = 0;
+
+    ginit_done = true;
+  }
+
+  /**
+   * Galois Field multiplication
+   * @param {number} a
+   * @param {number} b
+   * @return {number}
+   */
+  function gmul(a, b) {
+    var c = gexp3[(glog3[a] + glog3[b]) % 255];
+    if (a === 0 || b === 0) c = 0;
+    return c;
+  }
+
+  /**
+   * Galois Field reciprocal
+   * @param {number} a
+   * @return {number}
+   */
+  function ginv(a) {
+    var i = gexp3[255 - glog3[a]];
+    if (a === 0) i = 0;
+    return i;
+  }
+
+  /**
+   * AES stuff init flag
+   */
+  var aes_init_done = false;
+
+  /**
+   * Encryption, Decryption, S-Box and KeyTransform tables
+   *
+   * @type {number[]}
+   */
+  var aes_sbox;
+
+  /**
+   * @type {number[]}
+   */
+  var aes_sinv;
+
+  /**
+   * @type {number[][]}
+   */
+  var aes_enc;
+
+  /**
+   * @type {number[][]}
+   */
+  var aes_dec;
+
+  /**
+   * Init AES tables
+   */
+  function aes_init() {
+    if (!ginit_done) ginit();
+
+    // Calculates AES S-Box value
+    function _s(a) {
+      var c, s, x;
+      s = x = ginv(a);
+      for (c = 0; c < 4; c++) {
+        s = (s << 1 | s >>> 7) & 255;
+        x ^= s;
+      }
+      x ^= 99;
+      return x;
+    }
+
+    // Tables
+    aes_sbox = [], aes_sinv = [], aes_enc = [[], [], [], []], aes_dec = [[], [], [], []];
+
+    for (var i = 0; i < 256; i++) {
+      var s = _s(i);
+
+      // S-Box and its inverse
+      aes_sbox[i] = s;
+      aes_sinv[s] = i;
+
+      // Ecryption and Decryption tables
+      aes_enc[0][i] = gmul(2, s) << 24 | s << 16 | s << 8 | gmul(3, s);
+      aes_dec[0][s] = gmul(14, i) << 24 | gmul(9, i) << 16 | gmul(13, i) << 8 | gmul(11, i);
+      // Rotate tables
+      for (var t = 1; t < 4; t++) {
+        aes_enc[t][i] = aes_enc[t - 1][i] >>> 8 | aes_enc[t - 1][i] << 24;
+        aes_dec[t][s] = aes_dec[t - 1][s] >>> 8 | aes_dec[t - 1][s] << 24;
+      }
+    }
+
+    aes_init_done = true;
+  }
+
+  /**
+   * Asm.js module constructor.
+   *
+   * <p>
+   * Heap buffer layout by offset:
+   * <pre>
+   * 0x0000   encryption key schedule
+   * 0x0400   decryption key schedule
+   * 0x0800   sbox
+   * 0x0c00   inv sbox
+   * 0x1000   encryption tables
+   * 0x2000   decryption tables
+   * 0x3000   reserved (future GCM multiplication lookup table)
+   * 0x4000   data
+   * </pre>
+   * Don't touch anything before <code>0x400</code>.
+   * </p>
+   *
+   * @alias AES_asm
+   * @class
+   * @param foreign - <i>ignored</i>
+   * @param buffer - heap buffer to link with
+   */
+  var wrapper = function wrapper(foreign, buffer) {
+    // Init AES stuff for the first time
+    if (!aes_init_done) aes_init();
+
+    // Fill up AES tables
+    var heap = new Uint32Array(buffer);
+    heap.set(aes_sbox, 0x0800 >> 2);
+    heap.set(aes_sinv, 0x0c00 >> 2);
+    for (var i = 0; i < 4; i++) {
+      heap.set(aes_enc[i], 0x1000 + 0x400 * i >> 2);
+      heap.set(aes_dec[i], 0x2000 + 0x400 * i >> 2);
+    }
+
+    /**
+     * Calculate AES key schedules.
+     * @instance
+     * @memberof AES_asm
+     * @param {number} ks - key size, 4/6/8 (for 128/192/256-bit key correspondingly)
+     * @param {number} k0 - key vector components
+     * @param {number} k1 - key vector components
+     * @param {number} k2 - key vector components
+     * @param {number} k3 - key vector components
+     * @param {number} k4 - key vector components
+     * @param {number} k5 - key vector components
+     * @param {number} k6 - key vector components
+     * @param {number} k7 - key vector components
+     */
+    function set_key(ks, k0, k1, k2, k3, k4, k5, k6, k7) {
+      var ekeys = heap.subarray(0x000, 60),
+          dkeys = heap.subarray(0x100, 0x100 + 60);
+
+      // Encryption key schedule
+      ekeys.set([k0, k1, k2, k3, k4, k5, k6, k7]);
+      for (var i = ks, rcon = 1; i < 4 * ks + 28; i++) {
+        var k = ekeys[i - 1];
+        if (i % ks === 0 || ks === 8 && i % ks === 4) {
+          k = aes_sbox[k >>> 24] << 24 ^ aes_sbox[k >>> 16 & 255] << 16 ^ aes_sbox[k >>> 8 & 255] << 8 ^ aes_sbox[k & 255];
+        }
+        if (i % ks === 0) {
+          k = k << 8 ^ k >>> 24 ^ rcon << 24;
+          rcon = rcon << 1 ^ (rcon & 0x80 ? 0x1b : 0);
+        }
+        ekeys[i] = ekeys[i - ks] ^ k;
+      }
+
+      // Decryption key schedule
+      for (var j = 0; j < i; j += 4) {
+        for (var jj = 0; jj < 4; jj++) {
+          var k = ekeys[i - (4 + j) + (4 - jj) % 4];
+          if (j < 4 || j >= i - 4) {
+            dkeys[j + jj] = k;
+          } else {
+            dkeys[j + jj] = aes_dec[0][aes_sbox[k >>> 24]] ^ aes_dec[1][aes_sbox[k >>> 16 & 255]] ^ aes_dec[2][aes_sbox[k >>> 8 & 255]] ^ aes_dec[3][aes_sbox[k & 255]];
+          }
+        }
+      }
+
+      // Set rounds number
+      asm.set_rounds(ks + 5);
+    }
+
+    // create library object with necessary properties
+    var stdlib = { Uint8Array: Uint8Array, Uint32Array: Uint32Array };
+
+    var asm = function (stdlib, foreign, buffer) {
+      "use asm";
+
+      var S0 = 0,
+          S1 = 0,
+          S2 = 0,
+          S3 = 0,
+          I0 = 0,
+          I1 = 0,
+          I2 = 0,
+          I3 = 0,
+          N0 = 0,
+          N1 = 0,
+          N2 = 0,
+          N3 = 0,
+          M0 = 0,
+          M1 = 0,
+          M2 = 0,
+          M3 = 0,
+          H0 = 0,
+          H1 = 0,
+          H2 = 0,
+          H3 = 0,
+          R = 0;
+
+      var HEAP = new stdlib.Uint32Array(buffer),
+          DATA = new stdlib.Uint8Array(buffer);
+
+      /**
+       * AES core
+       * @param {number} k - precomputed key schedule offset
+       * @param {number} s - precomputed sbox table offset
+       * @param {number} t - precomputed round table offset
+       * @param {number} r - number of inner rounds to perform
+       * @param {number} x0 - 128-bit input block vector
+       * @param {number} x1 - 128-bit input block vector
+       * @param {number} x2 - 128-bit input block vector
+       * @param {number} x3 - 128-bit input block vector
+       */
+      function _core(k, s, t, r, x0, x1, x2, x3) {
+        k = k | 0;
+        s = s | 0;
+        t = t | 0;
+        r = r | 0;
+        x0 = x0 | 0;
+        x1 = x1 | 0;
+        x2 = x2 | 0;
+        x3 = x3 | 0;
+
+        var t1 = 0,
+            t2 = 0,
+            t3 = 0,
+            y0 = 0,
+            y1 = 0,
+            y2 = 0,
+            y3 = 0,
+            i = 0;
+
+        t1 = t | 0x400, t2 = t | 0x800, t3 = t | 0xc00;
+
+        // round 0
+        x0 = x0 ^ HEAP[(k | 0) >> 2], x1 = x1 ^ HEAP[(k | 4) >> 2], x2 = x2 ^ HEAP[(k | 8) >> 2], x3 = x3 ^ HEAP[(k | 12) >> 2];
+
+        // round 1..r
+        for (i = 16; (i | 0) <= r << 4; i = i + 16 | 0) {
+          y0 = HEAP[(t | x0 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x1 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x2 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x3 << 2 & 1020) >> 2] ^ HEAP[(k | i | 0) >> 2], y1 = HEAP[(t | x1 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x2 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x3 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x0 << 2 & 1020) >> 2] ^ HEAP[(k | i | 4) >> 2], y2 = HEAP[(t | x2 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x3 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x0 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x1 << 2 & 1020) >> 2] ^ HEAP[(k | i | 8) >> 2], y3 = HEAP[(t | x3 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x0 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x1 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x2 << 2 & 1020) >> 2] ^ HEAP[(k | i | 12) >> 2];
+          x0 = y0, x1 = y1, x2 = y2, x3 = y3;
+        }
+
+        // final round
+        S0 = HEAP[(s | x0 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x1 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x2 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x3 << 2 & 1020) >> 2] ^ HEAP[(k | i | 0) >> 2], S1 = HEAP[(s | x1 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x2 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x3 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x0 << 2 & 1020) >> 2] ^ HEAP[(k | i | 4) >> 2], S2 = HEAP[(s | x2 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x3 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x0 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x1 << 2 & 1020) >> 2] ^ HEAP[(k | i | 8) >> 2], S3 = HEAP[(s | x3 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x0 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x1 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x2 << 2 & 1020) >> 2] ^ HEAP[(k | i | 12) >> 2];
+      }
+
+      /**
+       * ECB mode encryption
+       * @param {number} x0 - 128-bit input block vector
+       * @param {number} x1 - 128-bit input block vector
+       * @param {number} x2 - 128-bit input block vector
+       * @param {number} x3 - 128-bit input block vector
+       */
+      function _ecb_enc(x0, x1, x2, x3) {
+        x0 = x0 | 0;
+        x1 = x1 | 0;
+        x2 = x2 | 0;
+        x3 = x3 | 0;
+
+        _core(0x0000, 0x0800, 0x1000, R, x0, x1, x2, x3);
+      }
+
+      /**
+       * ECB mode decryption
+       * @param {number} x0 - 128-bit input block vector
+       * @param {number} x1 - 128-bit input block vector
+       * @param {number} x2 - 128-bit input block vector
+       * @param {number} x3 - 128-bit input block vector
+       */
+      function _ecb_dec(x0, x1, x2, x3) {
+        x0 = x0 | 0;
+        x1 = x1 | 0;
+        x2 = x2 | 0;
+        x3 = x3 | 0;
+
+        var t = 0;
+
+        _core(0x0400, 0x0c00, 0x2000, R, x0, x3, x2, x1);
+
+        t = S1, S1 = S3, S3 = t;
+      }
+
+      /**
+       * CBC mode encryption
+       * @param {number} x0 - 128-bit input block vector
+       * @param {number} x1 - 128-bit input block vector
+       * @param {number} x2 - 128-bit input block vector
+       * @param {number} x3 - 128-bit input block vector
+       */
+      function _cbc_enc(x0, x1, x2, x3) {
+        x0 = x0 | 0;
+        x1 = x1 | 0;
+        x2 = x2 | 0;
+        x3 = x3 | 0;
+
+        _core(0x0000, 0x0800, 0x1000, R, I0 ^ x0, I1 ^ x1, I2 ^ x2, I3 ^ x3);
+
+        I0 = S0, I1 = S1, I2 = S2, I3 = S3;
+      }
+
+      /**
+       * CBC mode decryption
+       * @param {number} x0 - 128-bit input block vector
+       * @param {number} x1 - 128-bit input block vector
+       * @param {number} x2 - 128-bit input block vector
+       * @param {number} x3 - 128-bit input block vector
+       */
+      function _cbc_dec(x0, x1, x2, x3) {
+        x0 = x0 | 0;
+        x1 = x1 | 0;
+        x2 = x2 | 0;
+        x3 = x3 | 0;
+
+        var t = 0;
+
+        _core(0x0400, 0x0c00, 0x2000, R, x0, x3, x2, x1);
+
+        t = S1, S1 = S3, S3 = t;
+
+        S0 = S0 ^ I0, S1 = S1 ^ I1, S2 = S2 ^ I2, S3 = S3 ^ I3;
+
+        I0 = x0, I1 = x1, I2 = x2, I3 = x3;
+      }
+
+      /**
+       * CFB mode encryption
+       * @param {number} x0 - 128-bit input block vector
+       * @param {number} x1 - 128-bit input block vector
+       * @param {number} x2 - 128-bit input block vector
+       * @param {number} x3 - 128-bit input block vector
+       */
+      function _cfb_enc(x0, x1, x2, x3) {
+        x0 = x0 | 0;
+        x1 = x1 | 0;
+        x2 = x2 | 0;
+        x3 = x3 | 0;
+
+        _core(0x0000, 0x0800, 0x1000, R, I0, I1, I2, I3);
+
+        I0 = S0 = S0 ^ x0, I1 = S1 = S1 ^ x1, I2 = S2 = S2 ^ x2, I3 = S3 = S3 ^ x3;
+      }
+
+      /**
+       * CFB mode decryption
+       * @param {number} x0 - 128-bit input block vector
+       * @param {number} x1 - 128-bit input block vector
+       * @param {number} x2 - 128-bit input block vector
+       * @param {number} x3 - 128-bit input block vector
+       */
+      function _cfb_dec(x0, x1, x2, x3) {
+        x0 = x0 | 0;
+        x1 = x1 | 0;
+        x2 = x2 | 0;
+        x3 = x3 | 0;
+
+        _core(0x0000, 0x0800, 0x1000, R, I0, I1, I2, I3);
+
+        S0 = S0 ^ x0, S1 = S1 ^ x1, S2 = S2 ^ x2, S3 = S3 ^ x3;
+
+        I0 = x0, I1 = x1, I2 = x2, I3 = x3;
+      }
+
+      /**
+       * OFB mode encryption / decryption
+       * @param {number} x0 - 128-bit input block vector
+       * @param {number} x1 - 128-bit input block vector
+       * @param {number} x2 - 128-bit input block vector
+       * @param {number} x3 - 128-bit input block vector
+       */
+      function _ofb(x0, x1, x2, x3) {
+        x0 = x0 | 0;
+        x1 = x1 | 0;
+        x2 = x2 | 0;
+        x3 = x3 | 0;
+
+        _core(0x0000, 0x0800, 0x1000, R, I0, I1, I2, I3);
+
+        I0 = S0, I1 = S1, I2 = S2, I3 = S3;
+
+        S0 = S0 ^ x0, S1 = S1 ^ x1, S2 = S2 ^ x2, S3 = S3 ^ x3;
+      }
+
+      /**
+       * CTR mode encryption / decryption
+       * @param {number} x0 - 128-bit input block vector
+       * @param {number} x1 - 128-bit input block vector
+       * @param {number} x2 - 128-bit input block vector
+       * @param {number} x3 - 128-bit input block vector
+       */
+      function _ctr(x0, x1, x2, x3) {
+        x0 = x0 | 0;
+        x1 = x1 | 0;
+        x2 = x2 | 0;
+        x3 = x3 | 0;
+
+        _core(0x0000, 0x0800, 0x1000, R, N0, N1, N2, N3);
+
+        N3 = ~M3 & N3 | M3 & N3 + 1;
+        N2 = ~M2 & N2 | M2 & N2 + ((N3 | 0) == 0);
+        N1 = ~M1 & N1 | M1 & N1 + ((N2 | 0) == 0);
+        N0 = ~M0 & N0 | M0 & N0 + ((N1 | 0) == 0);
+
+        S0 = S0 ^ x0;
+        S1 = S1 ^ x1;
+        S2 = S2 ^ x2;
+        S3 = S3 ^ x3;
+      }
+
+      /**
+       * GCM mode MAC calculation
+       * @param {number} x0 - 128-bit input block vector
+       * @param {number} x1 - 128-bit input block vector
+       * @param {number} x2 - 128-bit input block vector
+       * @param {number} x3 - 128-bit input block vector
+       */
+      function _gcm_mac(x0, x1, x2, x3) {
+        x0 = x0 | 0;
+        x1 = x1 | 0;
+        x2 = x2 | 0;
+        x3 = x3 | 0;
+
+        var y0 = 0,
+            y1 = 0,
+            y2 = 0,
+            y3 = 0,
+            z0 = 0,
+            z1 = 0,
+            z2 = 0,
+            z3 = 0,
+            i = 0,
+            c = 0;
+
+        x0 = x0 ^ I0, x1 = x1 ^ I1, x2 = x2 ^ I2, x3 = x3 ^ I3;
+
+        y0 = H0 | 0, y1 = H1 | 0, y2 = H2 | 0, y3 = H3 | 0;
+
+        for (; (i | 0) < 128; i = i + 1 | 0) {
+          if (y0 >>> 31) {
+            z0 = z0 ^ x0, z1 = z1 ^ x1, z2 = z2 ^ x2, z3 = z3 ^ x3;
+          }
+
+          y0 = y0 << 1 | y1 >>> 31, y1 = y1 << 1 | y2 >>> 31, y2 = y2 << 1 | y3 >>> 31, y3 = y3 << 1;
+
+          c = x3 & 1;
+
+          x3 = x3 >>> 1 | x2 << 31, x2 = x2 >>> 1 | x1 << 31, x1 = x1 >>> 1 | x0 << 31, x0 = x0 >>> 1;
+
+          if (c) x0 = x0 ^ 0xe1000000;
+        }
+
+        I0 = z0, I1 = z1, I2 = z2, I3 = z3;
+      }
+
+      /**
+       * Set the internal rounds number.
+       * @instance
+       * @memberof AES_asm
+       * @param {number} r - number if inner AES rounds
+       */
+      function set_rounds(r) {
+        r = r | 0;
+        R = r;
+      }
+
+      /**
+       * Populate the internal state of the module.
+       * @instance
+       * @memberof AES_asm
+       * @param {number} s0 - state vector
+       * @param {number} s1 - state vector
+       * @param {number} s2 - state vector
+       * @param {number} s3 - state vector
+       */
+      function set_state(s0, s1, s2, s3) {
+        s0 = s0 | 0;
+        s1 = s1 | 0;
+        s2 = s2 | 0;
+        s3 = s3 | 0;
+
+        S0 = s0, S1 = s1, S2 = s2, S3 = s3;
+      }
+
+      /**
+       * Populate the internal iv of the module.
+       * @instance
+       * @memberof AES_asm
+       * @param {number} i0 - iv vector
+       * @param {number} i1 - iv vector
+       * @param {number} i2 - iv vector
+       * @param {number} i3 - iv vector
+       */
+      function set_iv(i0, i1, i2, i3) {
+        i0 = i0 | 0;
+        i1 = i1 | 0;
+        i2 = i2 | 0;
+        i3 = i3 | 0;
+
+        I0 = i0, I1 = i1, I2 = i2, I3 = i3;
+      }
+
+      /**
+       * Set nonce for CTR-family modes.
+       * @instance
+       * @memberof AES_asm
+       * @param {number} n0 - nonce vector
+       * @param {number} n1 - nonce vector
+       * @param {number} n2 - nonce vector
+       * @param {number} n3 - nonce vector
+       */
+      function set_nonce(n0, n1, n2, n3) {
+        n0 = n0 | 0;
+        n1 = n1 | 0;
+        n2 = n2 | 0;
+        n3 = n3 | 0;
+
+        N0 = n0, N1 = n1, N2 = n2, N3 = n3;
+      }
+
+      /**
+       * Set counter mask for CTR-family modes.
+       * @instance
+       * @memberof AES_asm
+       * @param {number} m0 - counter mask vector
+       * @param {number} m1 - counter mask vector
+       * @param {number} m2 - counter mask vector
+       * @param {number} m3 - counter mask vector
+       */
+      function set_mask(m0, m1, m2, m3) {
+        m0 = m0 | 0;
+        m1 = m1 | 0;
+        m2 = m2 | 0;
+        m3 = m3 | 0;
+
+        M0 = m0, M1 = m1, M2 = m2, M3 = m3;
+      }
+
+      /**
+       * Set counter for CTR-family modes.
+       * @instance
+       * @memberof AES_asm
+       * @param {number} c0 - counter vector
+       * @param {number} c1 - counter vector
+       * @param {number} c2 - counter vector
+       * @param {number} c3 - counter vector
+       */
+      function set_counter(c0, c1, c2, c3) {
+        c0 = c0 | 0;
+        c1 = c1 | 0;
+        c2 = c2 | 0;
+        c3 = c3 | 0;
+
+        N3 = ~M3 & N3 | M3 & c3, N2 = ~M2 & N2 | M2 & c2, N1 = ~M1 & N1 | M1 & c1, N0 = ~M0 & N0 | M0 & c0;
+      }
+
+      /**
+       * Store the internal state vector into the heap.
+       * @instance
+       * @memberof AES_asm
+       * @param {number} pos - offset where to put the data
+       * @return {number} The number of bytes have been written into the heap, always 16.
+       */
+      function get_state(pos) {
+        pos = pos | 0;
+
+        if (pos & 15) return -1;
+
+        DATA[pos | 0] = S0 >>> 24, DATA[pos | 1] = S0 >>> 16 & 255, DATA[pos | 2] = S0 >>> 8 & 255, DATA[pos | 3] = S0 & 255, DATA[pos | 4] = S1 >>> 24, DATA[pos | 5] = S1 >>> 16 & 255, DATA[pos | 6] = S1 >>> 8 & 255, DATA[pos | 7] = S1 & 255, DATA[pos | 8] = S2 >>> 24, DATA[pos | 9] = S2 >>> 16 & 255, DATA[pos | 10] = S2 >>> 8 & 255, DATA[pos | 11] = S2 & 255, DATA[pos | 12] = S3 >>> 24, DATA[pos | 13] = S3 >>> 16 & 255, DATA[pos | 14] = S3 >>> 8 & 255, DATA[pos | 15] = S3 & 255;
+
+        return 16;
+      }
+
+      /**
+       * Store the internal iv vector into the heap.
+       * @instance
+       * @memberof AES_asm
+       * @param {number} pos - offset where to put the data
+       * @return {number} The number of bytes have been written into the heap, always 16.
+       */
+      function get_iv(pos) {
+        pos = pos | 0;
+
+        if (pos & 15) return -1;
+
+        DATA[pos | 0] = I0 >>> 24, DATA[pos | 1] = I0 >>> 16 & 255, DATA[pos | 2] = I0 >>> 8 & 255, DATA[pos | 3] = I0 & 255, DATA[pos | 4] = I1 >>> 24, DATA[pos | 5] = I1 >>> 16 & 255, DATA[pos | 6] = I1 >>> 8 & 255, DATA[pos | 7] = I1 & 255, DATA[pos | 8] = I2 >>> 24, DATA[pos | 9] = I2 >>> 16 & 255, DATA[pos | 10] = I2 >>> 8 & 255, DATA[pos | 11] = I2 & 255, DATA[pos | 12] = I3 >>> 24, DATA[pos | 13] = I3 >>> 16 & 255, DATA[pos | 14] = I3 >>> 8 & 255, DATA[pos | 15] = I3 & 255;
+
+        return 16;
+      }
+
+      /**
+       * GCM initialization.
+       * @instance
+       * @memberof AES_asm
+       */
+      function gcm_init() {
+        _ecb_enc(0, 0, 0, 0);
+        H0 = S0, H1 = S1, H2 = S2, H3 = S3;
+      }
+
+      /**
+       * Perform ciphering operation on the supplied data.
+       * @instance
+       * @memberof AES_asm
+       * @param {number} mode - block cipher mode (see {@link AES_asm} mode constants)
+       * @param {number} pos - offset of the data being processed
+       * @param {number} len - length of the data being processed
+       * @return {number} Actual amount of data have been processed.
+       */
+      function cipher(mode, pos, len) {
+        mode = mode | 0;
+        pos = pos | 0;
+        len = len | 0;
+
+        var ret = 0;
+
+        if (pos & 15) return -1;
+
+        while ((len | 0) >= 16) {
+          _cipher_modes[mode & 7](DATA[pos | 0] << 24 | DATA[pos | 1] << 16 | DATA[pos | 2] << 8 | DATA[pos | 3], DATA[pos | 4] << 24 | DATA[pos | 5] << 16 | DATA[pos | 6] << 8 | DATA[pos | 7], DATA[pos | 8] << 24 | DATA[pos | 9] << 16 | DATA[pos | 10] << 8 | DATA[pos | 11], DATA[pos | 12] << 24 | DATA[pos | 13] << 16 | DATA[pos | 14] << 8 | DATA[pos | 15]);
+
+          DATA[pos | 0] = S0 >>> 24, DATA[pos | 1] = S0 >>> 16 & 255, DATA[pos | 2] = S0 >>> 8 & 255, DATA[pos | 3] = S0 & 255, DATA[pos | 4] = S1 >>> 24, DATA[pos | 5] = S1 >>> 16 & 255, DATA[pos | 6] = S1 >>> 8 & 255, DATA[pos | 7] = S1 & 255, DATA[pos | 8] = S2 >>> 24, DATA[pos | 9] = S2 >>> 16 & 255, DATA[pos | 10] = S2 >>> 8 & 255, DATA[pos | 11] = S2 & 255, DATA[pos | 12] = S3 >>> 24, DATA[pos | 13] = S3 >>> 16 & 255, DATA[pos | 14] = S3 >>> 8 & 255, DATA[pos | 15] = S3 & 255;
+
+          ret = ret + 16 | 0, pos = pos + 16 | 0, len = len - 16 | 0;
+        }
+
+        return ret | 0;
+      }
+
+      /**
+       * Calculates MAC of the supplied data.
+       * @instance
+       * @memberof AES_asm
+       * @param {number} mode - block cipher mode (see {@link AES_asm} mode constants)
+       * @param {number} pos - offset of the data being processed
+       * @param {number} len - length of the data being processed
+       * @return {number} Actual amount of data have been processed.
+       */
+      function mac(mode, pos, len) {
+        mode = mode | 0;
+        pos = pos | 0;
+        len = len | 0;
+
+        var ret = 0;
+
+        if (pos & 15) return -1;
+
+        while ((len | 0) >= 16) {
+          _mac_modes[mode & 1](DATA[pos | 0] << 24 | DATA[pos | 1] << 16 | DATA[pos | 2] << 8 | DATA[pos | 3], DATA[pos | 4] << 24 | DATA[pos | 5] << 16 | DATA[pos | 6] << 8 | DATA[pos | 7], DATA[pos | 8] << 24 | DATA[pos | 9] << 16 | DATA[pos | 10] << 8 | DATA[pos | 11], DATA[pos | 12] << 24 | DATA[pos | 13] << 16 | DATA[pos | 14] << 8 | DATA[pos | 15]);
+
+          ret = ret + 16 | 0, pos = pos + 16 | 0, len = len - 16 | 0;
+        }
+
+        return ret | 0;
+      }
+
+      /**
+       * AES cipher modes table (virual methods)
+       */
+      var _cipher_modes = [_ecb_enc, _ecb_dec, _cbc_enc, _cbc_dec, _cfb_enc, _cfb_dec, _ofb, _ctr];
+
+      /**
+       * AES MAC modes table (virual methods)
+       */
+      var _mac_modes = [_cbc_enc, _gcm_mac];
+
+      /**
+       * Asm.js module exports
+       */
+      return {
+        set_rounds: set_rounds,
+        set_state: set_state,
+        set_iv: set_iv,
+        set_nonce: set_nonce,
+        set_mask: set_mask,
+        set_counter: set_counter,
+        get_state: get_state,
+        get_iv: get_iv,
+        gcm_init: gcm_init,
+        cipher: cipher,
+        mac: mac
+      };
+    }(stdlib, foreign, buffer);
+
+    asm.set_key = set_key;
+
+    return asm;
+  };
+
+  /**
+   * AES enciphering mode constants
+   * @enum {number}
+   * @const
+   */
+  wrapper.ENC = {
+    ECB: 0,
+    CBC: 2,
+    CFB: 4,
+    OFB: 6,
+    CTR: 7
+  },
+
+  /**
+   * AES deciphering mode constants
+   * @enum {number}
+   * @const
+   */
+  wrapper.DEC = {
+    ECB: 1,
+    CBC: 3,
+    CFB: 5,
+    OFB: 6,
+    CTR: 7
+  },
+
+  /**
+   * AES MAC mode constants
+   * @enum {number}
+   * @const
+   */
+  wrapper.MAC = {
+    CBC: 0,
+    GCM: 1
+  };
+
+  /**
+   * Heap data offset
+   * @type {number}
+   * @const
+   */
+  wrapper.HEAP_DATA = 0x4000;
+
+  return wrapper;
+}();
+
+},{}],4:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+    value: true
+});
+exports.AES = undefined;
+
+var _aes = require('./aes.asm');
+
+var _utils = require('../other/utils');
+
+var _errors = require('../other/errors');
+
+var heap_pool = [];
+var asm_pool = [];
+var AES = /** @class */function () {
+    function AES(key, iv, padding, mode) {
+        if (padding === void 0) {
+            padding = true;
+        }
+        this.pos = 0;
+        this.len = 0;
+        this.mode = mode;
+        // The AES object state
+        this.pos = 0;
+        this.len = 0;
+        this.key = key;
+        this.iv = iv;
+        this.padding = padding;
+        // The AES "worker"
+        this.acquire_asm();
+    }
+    AES.prototype.acquire_asm = function () {
+        if (this.heap === undefined && this.asm === undefined) {
+            this.heap = heap_pool.pop() || (0, _utils._heap_init)().subarray(_aes.AES_asm.HEAP_DATA);
+            this.asm = asm_pool.pop() || (0, _aes.AES_asm)(null, this.heap.buffer);
+            this.reset(this.key, this.iv);
+        }
+    };
+    AES.prototype.release_asm = function () {
+        heap_pool.push(this.heap);
+        ;
+        asm_pool.push(this.asm);
+        this.heap = undefined;
+        this.asm = undefined;
+    };
+    AES.prototype.reset = function (key, iv) {
+        // Key
+        var keylen = key.length;
+        if (keylen !== 16 && keylen !== 24 && keylen !== 32) throw new _errors.IllegalArgumentError('illegal key size');
+        var keyview = new DataView(key.buffer, key.byteOffset, key.byteLength);
+        this.asm.set_key(keylen >> 2, keyview.getUint32(0), keyview.getUint32(4), keyview.getUint32(8), keyview.getUint32(12), keylen > 16 ? keyview.getUint32(16) : 0, keylen > 16 ? keyview.getUint32(20) : 0, keylen > 24 ? keyview.getUint32(24) : 0, keylen > 24 ? keyview.getUint32(28) : 0);
+        // IV
+        if (iv !== undefined) {
+            if (iv.length !== 16) throw new _errors.IllegalArgumentError('illegal iv size');
+            var ivview = new DataView(iv.buffer, iv.byteOffset, iv.byteLength);
+            this.asm.set_iv(ivview.getUint32(0), ivview.getUint32(4), ivview.getUint32(8), ivview.getUint32(12));
+        } else {
+            this.asm.set_iv(0, 0, 0, 0);
+        }
+    };
+    AES.prototype.AES_Encrypt_process = function (data) {
+        if (!(0, _utils.is_bytes)(data)) throw new TypeError("data isn't of expected type");
+        this.acquire_asm();
+        var asm = this.asm;
+        var heap = this.heap;
+        var amode = _aes.AES_asm.ENC[this.mode];
+        var hpos = _aes.AES_asm.HEAP_DATA;
+        var pos = this.pos;
+        var len = this.len;
+        var dpos = 0;
+        var dlen = data.length || 0;
+        var rpos = 0;
+        var rlen = len + dlen & -16;
+        var wlen = 0;
+        var result = new Uint8Array(rlen);
+        while (dlen > 0) {
+            wlen = (0, _utils._heap_write)(heap, pos + len, data, dpos, dlen);
+            len += wlen;
+            dpos += wlen;
+            dlen -= wlen;
+            wlen = asm.cipher(amode, hpos + pos, len);
+            if (wlen) result.set(heap.subarray(pos, pos + wlen), rpos);
+            rpos += wlen;
+            if (wlen < len) {
+                pos += wlen;
+                len -= wlen;
+            } else {
+                pos = 0;
+                len = 0;
+            }
+        }
+        this.pos = pos;
+        this.len = len;
+        return result;
+    };
+    AES.prototype.AES_Encrypt_finish = function () {
+        this.acquire_asm();
+        var asm = this.asm;
+        var heap = this.heap;
+        var amode = _aes.AES_asm.ENC[this.mode];
+        var hpos = _aes.AES_asm.HEAP_DATA;
+        var pos = this.pos;
+        var len = this.len;
+        var plen = 16 - len % 16;
+        var rlen = len;
+        if (this.hasOwnProperty('padding')) {
+            if (this.padding) {
+                for (var p = 0; p < plen; ++p) {
+                    heap[pos + len + p] = plen;
+                }
+                len += plen;
+                rlen = len;
+            } else if (len % 16) {
+                throw new _errors.IllegalArgumentError('data length must be a multiple of the block size');
+            }
+        } else {
+            len += plen;
+        }
+        var result = new Uint8Array(rlen);
+        if (len) asm.cipher(amode, hpos + pos, len);
+        if (rlen) result.set(heap.subarray(pos, pos + rlen));
+        this.pos = 0;
+        this.len = 0;
+        this.release_asm();
+        return result;
+    };
+    AES.prototype.AES_Decrypt_process = function (data) {
+        if (!(0, _utils.is_bytes)(data)) throw new TypeError("data isn't of expected type");
+        this.acquire_asm();
+        var asm = this.asm;
+        var heap = this.heap;
+        var amode = _aes.AES_asm.DEC[this.mode];
+        var hpos = _aes.AES_asm.HEAP_DATA;
+        var pos = this.pos;
+        var len = this.len;
+        var dpos = 0;
+        var dlen = data.length || 0;
+        var rpos = 0;
+        var rlen = len + dlen & -16;
+        var plen = 0;
+        var wlen = 0;
+        if (this.padding) {
+            plen = len + dlen - rlen || 16;
+            rlen -= plen;
+        }
+        var result = new Uint8Array(rlen);
+        while (dlen > 0) {
+            wlen = (0, _utils._heap_write)(heap, pos + len, data, dpos, dlen);
+            len += wlen;
+            dpos += wlen;
+            dlen -= wlen;
+            wlen = asm.cipher(amode, hpos + pos, len - (!dlen ? plen : 0));
+            if (wlen) result.set(heap.subarray(pos, pos + wlen), rpos);
+            rpos += wlen;
+            if (wlen < len) {
+                pos += wlen;
+                len -= wlen;
+            } else {
+                pos = 0;
+                len = 0;
+            }
+        }
+        this.pos = pos;
+        this.len = len;
+        return result;
+    };
+    AES.prototype.AES_Decrypt_finish = function () {
+        this.acquire_asm();
+        var asm = this.asm;
+        var heap = this.heap;
+        var amode = _aes.AES_asm.DEC[this.mode];
+        var hpos = _aes.AES_asm.HEAP_DATA;
+        var pos = this.pos;
+        var len = this.len;
+        var rlen = len;
+        if (len > 0) {
+            if (len % 16) {
+                if (this.hasOwnProperty('padding')) {
+                    throw new _errors.IllegalArgumentError('data length must be a multiple of the block size');
+                } else {
+                    len += 16 - len % 16;
+                }
+            }
+            asm.cipher(amode, hpos + pos, len);
+            if (this.hasOwnProperty('padding') && this.padding) {
+                var pad = heap[pos + rlen - 1];
+                if (pad < 1 || pad > 16 || pad > rlen) throw new _errors.SecurityError('bad padding');
+                var pcheck = 0;
+                for (var i = pad; i > 1; i--) pcheck |= pad ^ heap[pos + rlen - i];
+                if (pcheck) throw new _errors.SecurityError('bad padding');
+                rlen -= pad;
+            }
+        }
+        var result = new Uint8Array(rlen);
+        if (rlen > 0) {
+            result.set(heap.subarray(pos, pos + rlen));
+        }
+        this.pos = 0;
+        this.len = 0;
+        this.release_asm();
+        return result;
+    };
+    return AES;
+}();
+exports.AES = AES;
+
+},{"../other/errors":15,"../other/utils":16,"./aes.asm":3}],5:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+    value: true
+});
+exports.AES_CBC = undefined;
+
+var _aes = require('./aes');
+
+var _utils = require('../other/utils');
+
+var __extends = undefined && undefined.__extends || function () {
+    var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (d, b) {
+        d.__proto__ = b;
+    } || function (d, b) {
+        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() {
+            this.constructor = d;
+        }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+}();
+
+var AES_CBC = /** @class */function (_super) {
+    __extends(AES_CBC, _super);
+    function AES_CBC(key, iv, padding) {
+        if (padding === void 0) {
+            padding = true;
+        }
+        return _super.call(this, key, iv, padding, 'CBC') || this;
+    }
+    AES_CBC.encrypt = function (data, key, padding, iv) {
+        if (padding === void 0) {
+            padding = true;
+        }
+        return new AES_CBC(key, iv, padding).encrypt(data);
+    };
+    AES_CBC.decrypt = function (data, key, padding, iv) {
+        if (padding === void 0) {
+            padding = true;
+        }
+        return new AES_CBC(key, iv, padding).decrypt(data);
+    };
+    AES_CBC.prototype.encrypt = function (data) {
+        var r1 = this.AES_Encrypt_process(data);
+        var r2 = this.AES_Encrypt_finish();
+        return (0, _utils.joinBytes)(r1, r2);
+    };
+    AES_CBC.prototype.decrypt = function (data) {
+        var r1 = this.AES_Decrypt_process(data);
+        var r2 = this.AES_Decrypt_finish();
+        return (0, _utils.joinBytes)(r1, r2);
+    };
+    return AES_CBC;
+}(_aes.AES);
+exports.AES_CBC = AES_CBC;
+
+},{"../other/utils":16,"./aes":4}],6:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+    value: true
+});
+exports.AES_CFB = undefined;
+
+var _aes = require('./aes');
+
+var _utils = require('../other/utils');
+
+var __extends = undefined && undefined.__extends || function () {
+    var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (d, b) {
+        d.__proto__ = b;
+    } || function (d, b) {
+        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() {
+            this.constructor = d;
+        }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+}();
+
+var AES_CFB = /** @class */function (_super) {
+    __extends(AES_CFB, _super);
+    function AES_CFB(key, iv) {
+        var _this = _super.call(this, key, iv, true, 'CFB') || this;
+        delete _this.padding;
+        return _this;
+    }
+    AES_CFB.encrypt = function (data, key, iv) {
+        return new AES_CFB(key, iv).encrypt(data);
+    };
+    AES_CFB.decrypt = function (data, key, iv) {
+        return new AES_CFB(key, iv).decrypt(data);
+    };
+    AES_CFB.prototype.encrypt = function (data) {
+        var r1 = this.AES_Encrypt_process(data);
+        var r2 = this.AES_Encrypt_finish();
+        return (0, _utils.joinBytes)(r1, r2);
+    };
+    AES_CFB.prototype.decrypt = function (data) {
+        var r1 = this.AES_Decrypt_process(data);
+        var r2 = this.AES_Decrypt_finish();
+        return (0, _utils.joinBytes)(r1, r2);
+    };
+    return AES_CFB;
+}(_aes.AES);
+exports.AES_CFB = AES_CFB;
+
+},{"../other/utils":16,"./aes":4}],7:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+    value: true
+});
+exports.AES_CTR = undefined;
+
+var _aes = require('./aes');
+
+var _errors = require('../other/errors');
+
+var _utils = require('../other/utils');
+
+var __extends = undefined && undefined.__extends || function () {
+    var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (d, b) {
+        d.__proto__ = b;
+    } || function (d, b) {
+        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() {
+            this.constructor = d;
+        }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+}();
+
+var AES_CTR = /** @class */function (_super) {
+    __extends(AES_CTR, _super);
+    function AES_CTR(key, nonce) {
+        var _this = _super.call(this, key, undefined, false, 'CTR') || this;
+        delete _this.padding;
+        _this.AES_CTR_set_options(nonce);
+        return _this;
+    }
+    AES_CTR.encrypt = function (data, key, nonce) {
+        return new AES_CTR(key, nonce).encrypt(data);
+    };
+    AES_CTR.decrypt = function (data, key, nonce) {
+        return new AES_CTR(key, nonce).encrypt(data);
+    };
+    AES_CTR.prototype.encrypt = function (data) {
+        var r1 = this.AES_Encrypt_process(data);
+        var r2 = this.AES_Encrypt_finish();
+        return (0, _utils.joinBytes)(r1, r2);
+    };
+    AES_CTR.prototype.decrypt = function (data) {
+        var r1 = this.AES_Encrypt_process(data);
+        var r2 = this.AES_Encrypt_finish();
+        return (0, _utils.joinBytes)(r1, r2);
+    };
+    AES_CTR.prototype.AES_CTR_set_options = function (nonce, counter, size) {
+        if (size !== undefined) {
+            if (size < 8 || size > 48) throw new _errors.IllegalArgumentError('illegal counter size');
+            var mask = Math.pow(2, size) - 1;
+            this.asm.set_mask(0, 0, mask / 0x100000000 | 0, mask | 0);
+        } else {
+            size = 48;
+            this.asm.set_mask(0, 0, 0xffff, 0xffffffff);
+        }
+        if (nonce !== undefined) {
+            var len = nonce.length;
+            if (!len || len > 16) throw new _errors.IllegalArgumentError('illegal nonce size');
+            var view = new DataView(new ArrayBuffer(16));
+            new Uint8Array(view.buffer).set(nonce);
+            this.asm.set_nonce(view.getUint32(0), view.getUint32(4), view.getUint32(8), view.getUint32(12));
+        } else {
+            throw new Error('nonce is required');
+        }
+        if (counter !== undefined) {
+            if (counter < 0 || counter >= Math.pow(2, size)) throw new _errors.IllegalArgumentError('illegal counter value');
+            this.asm.set_counter(0, 0, counter / 0x100000000 | 0, counter | 0);
+        }
+    };
+    return AES_CTR;
+}(_aes.AES);
+exports.AES_CTR = AES_CTR;
+
+},{"../other/errors":15,"../other/utils":16,"./aes":4}],8:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+    value: true
+});
+exports.AES_ECB = undefined;
+
+var _aes = require('./aes');
+
+var _utils = require('../other/utils');
+
+var __extends = undefined && undefined.__extends || function () {
+    var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (d, b) {
+        d.__proto__ = b;
+    } || function (d, b) {
+        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() {
+            this.constructor = d;
+        }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+}();
+
+var AES_ECB = /** @class */function (_super) {
+    __extends(AES_ECB, _super);
+    function AES_ECB(key, padding) {
+        if (padding === void 0) {
+            padding = false;
+        }
+        return _super.call(this, key, undefined, padding, 'ECB') || this;
+    }
+    AES_ECB.encrypt = function (data, key, padding) {
+        if (padding === void 0) {
+            padding = false;
+        }
+        return new AES_ECB(key, padding).encrypt(data);
+    };
+    AES_ECB.decrypt = function (data, key, padding) {
+        if (padding === void 0) {
+            padding = false;
+        }
+        return new AES_ECB(key, padding).decrypt(data);
+    };
+    AES_ECB.prototype.encrypt = function (data) {
+        var r1 = this.AES_Encrypt_process(data);
+        var r2 = this.AES_Encrypt_finish();
+        return (0, _utils.joinBytes)(r1, r2);
+    };
+    AES_ECB.prototype.decrypt = function (data) {
+        var r1 = this.AES_Decrypt_process(data);
+        var r2 = this.AES_Decrypt_finish();
+        return (0, _utils.joinBytes)(r1, r2);
+    };
+    return AES_ECB;
+}(_aes.AES);
+exports.AES_ECB = AES_ECB;
+
+},{"../other/utils":16,"./aes":4}],9:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+    value: true
+});
+exports.AES_GCM = undefined;
+
+var _errors = require('../other/errors');
+
+var _utils = require('../other/utils');
+
+var _aes = require('./aes');
+
+var _aes2 = require('./aes.asm');
+
+var __extends = undefined && undefined.__extends || function () {
+    var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (d, b) {
+        d.__proto__ = b;
+    } || function (d, b) {
+        for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+    };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() {
+            this.constructor = d;
+        }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+}();
+
+var _AES_GCM_data_maxLength = 68719476704; // 2^36 - 2^5
+var AES_GCM = /** @class */function (_super) {
+    __extends(AES_GCM, _super);
+    function AES_GCM(key, nonce, adata, tagSize) {
+        if (tagSize === void 0) {
+            tagSize = 16;
+        }
+        var _this = _super.call(this, key, undefined, false, 'CTR') || this;
+        _this.tagSize = tagSize;
+        _this.gamma0 = 0;
+        _this.counter = 1;
+        // Init GCM
+        _this.asm.gcm_init();
+        // Tag size
+        if (_this.tagSize < 4 || _this.tagSize > 16) throw new _errors.IllegalArgumentError('illegal tagSize value');
+        // Nonce
+        var noncelen = nonce.length || 0;
+        var noncebuf = new Uint8Array(16);
+        if (noncelen !== 12) {
+            _this._gcm_mac_process(nonce);
+            _this.heap[0] = 0;
+            _this.heap[1] = 0;
+            _this.heap[2] = 0;
+            _this.heap[3] = 0;
+            _this.heap[4] = 0;
+            _this.heap[5] = 0;
+            _this.heap[6] = 0;
+            _this.heap[7] = 0;
+            _this.heap[8] = 0;
+            _this.heap[9] = 0;
+            _this.heap[10] = 0;
+            _this.heap[11] = noncelen >>> 29;
+            _this.heap[12] = noncelen >>> 21 & 255;
+            _this.heap[13] = noncelen >>> 13 & 255;
+            _this.heap[14] = noncelen >>> 5 & 255;
+            _this.heap[15] = noncelen << 3 & 255;
+            _this.asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA, 16);
+            _this.asm.get_iv(_aes2.AES_asm.HEAP_DATA);
+            _this.asm.set_iv(0, 0, 0, 0);
+            noncebuf.set(_this.heap.subarray(0, 16));
+        } else {
+            noncebuf.set(nonce);
+            noncebuf[15] = 1;
+        }
+        var nonceview = new DataView(noncebuf.buffer);
+        _this.gamma0 = nonceview.getUint32(12);
+        _this.asm.set_nonce(nonceview.getUint32(0), nonceview.getUint32(4), nonceview.getUint32(8), 0);
+        _this.asm.set_mask(0, 0, 0, 0xffffffff);
+        // Associated data
+        if (adata !== undefined) {
+            if (adata.length > _AES_GCM_data_maxLength) throw new _errors.IllegalArgumentError('illegal adata length');
+            if (adata.length) {
+                _this.adata = adata;
+                _this._gcm_mac_process(adata);
+            } else {
+                _this.adata = undefined;
+            }
+        } else {
+            _this.adata = undefined;
+        }
+        // Counter
+        if (_this.counter < 1 || _this.counter > 0xffffffff) throw new RangeError('counter must be a positive 32-bit integer');
+        _this.asm.set_counter(0, 0, 0, _this.gamma0 + _this.counter | 0);
+        return _this;
+    }
+    AES_GCM.encrypt = function (cleartext, key, nonce, adata, tagsize) {
+        return new AES_GCM(key, nonce, adata, tagsize).encrypt(cleartext);
+    };
+    AES_GCM.decrypt = function (ciphertext, key, nonce, adata, tagsize) {
+        return new AES_GCM(key, nonce, adata, tagsize).decrypt(ciphertext);
+    };
+    AES_GCM.prototype.encrypt = function (data) {
+        return this.AES_GCM_encrypt(data);
+    };
+    AES_GCM.prototype.decrypt = function (data) {
+        return this.AES_GCM_decrypt(data);
+    };
+    AES_GCM.prototype.AES_GCM_Encrypt_process = function (data) {
+        var dpos = 0;
+        var dlen = data.length || 0;
+        var asm = this.asm;
+        var heap = this.heap;
+        var counter = this.counter;
+        var pos = this.pos;
+        var len = this.len;
+        var rpos = 0;
+        var rlen = len + dlen & -16;
+        var wlen = 0;
+        if ((counter - 1 << 4) + len + dlen > _AES_GCM_data_maxLength) throw new RangeError('counter overflow');
+        var result = new Uint8Array(rlen);
+        while (dlen > 0) {
+            wlen = (0, _utils._heap_write)(heap, pos + len, data, dpos, dlen);
+            len += wlen;
+            dpos += wlen;
+            dlen -= wlen;
+            wlen = asm.cipher(_aes2.AES_asm.ENC.CTR, _aes2.AES_asm.HEAP_DATA + pos, len);
+            wlen = asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA + pos, wlen);
+            if (wlen) result.set(heap.subarray(pos, pos + wlen), rpos);
+            counter += wlen >>> 4;
+            rpos += wlen;
+            if (wlen < len) {
+                pos += wlen;
+                len -= wlen;
+            } else {
+                pos = 0;
+                len = 0;
+            }
+        }
+        this.counter = counter;
+        this.pos = pos;
+        this.len = len;
+        return result;
+    };
+    AES_GCM.prototype.AES_GCM_Encrypt_finish = function () {
+        var asm = this.asm;
+        var heap = this.heap;
+        var counter = this.counter;
+        var tagSize = this.tagSize;
+        var adata = this.adata;
+        var pos = this.pos;
+        var len = this.len;
+        var result = new Uint8Array(len + tagSize);
+        asm.cipher(_aes2.AES_asm.ENC.CTR, _aes2.AES_asm.HEAP_DATA + pos, len + 15 & -16);
+        if (len) result.set(heap.subarray(pos, pos + len));
+        var i = len;
+        for (; i & 15; i++) heap[pos + i] = 0;
+        asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA + pos, i);
+        var alen = adata !== undefined ? adata.length : 0;
+        var clen = (counter - 1 << 4) + len;
+        heap[0] = 0;
+        heap[1] = 0;
+        heap[2] = 0;
+        heap[3] = alen >>> 29;
+        heap[4] = alen >>> 21;
+        heap[5] = alen >>> 13 & 255;
+        heap[6] = alen >>> 5 & 255;
+        heap[7] = alen << 3 & 255;
+        heap[8] = heap[9] = heap[10] = 0;
+        heap[11] = clen >>> 29;
+        heap[12] = clen >>> 21 & 255;
+        heap[13] = clen >>> 13 & 255;
+        heap[14] = clen >>> 5 & 255;
+        heap[15] = clen << 3 & 255;
+        asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA, 16);
+        asm.get_iv(_aes2.AES_asm.HEAP_DATA);
+        asm.set_counter(0, 0, 0, this.gamma0);
+        asm.cipher(_aes2.AES_asm.ENC.CTR, _aes2.AES_asm.HEAP_DATA, 16);
+        result.set(heap.subarray(0, tagSize), len);
+        this.counter = 1;
+        this.pos = 0;
+        this.len = 0;
+        return result;
+    };
+    AES_GCM.prototype.AES_GCM_Decrypt_process = function (data) {
+        var dpos = 0;
+        var dlen = data.length || 0;
+        var asm = this.asm;
+        var heap = this.heap;
+        var counter = this.counter;
+        var tagSize = this.tagSize;
+        var pos = this.pos;
+        var len = this.len;
+        var rpos = 0;
+        var rlen = len + dlen > tagSize ? len + dlen - tagSize & -16 : 0;
+        var tlen = len + dlen - rlen;
+        var wlen = 0;
+        if ((counter - 1 << 4) + len + dlen > _AES_GCM_data_maxLength) throw new RangeError('counter overflow');
+        var result = new Uint8Array(rlen);
+        while (dlen > tlen) {
+            wlen = (0, _utils._heap_write)(heap, pos + len, data, dpos, dlen - tlen);
+            len += wlen;
+            dpos += wlen;
+            dlen -= wlen;
+            wlen = asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA + pos, wlen);
+            wlen = asm.cipher(_aes2.AES_asm.DEC.CTR, _aes2.AES_asm.HEAP_DATA + pos, wlen);
+            if (wlen) result.set(heap.subarray(pos, pos + wlen), rpos);
+            counter += wlen >>> 4;
+            rpos += wlen;
+            pos = 0;
+            len = 0;
+        }
+        if (dlen > 0) {
+            len += (0, _utils._heap_write)(heap, 0, data, dpos, dlen);
+        }
+        this.counter = counter;
+        this.pos = pos;
+        this.len = len;
+        return result;
+    };
+    AES_GCM.prototype.AES_GCM_Decrypt_finish = function () {
+        var asm = this.asm;
+        var heap = this.heap;
+        var tagSize = this.tagSize;
+        var adata = this.adata;
+        var counter = this.counter;
+        var pos = this.pos;
+        var len = this.len;
+        var rlen = len - tagSize;
+        if (len < tagSize) throw new _errors.IllegalStateError('authentication tag not found');
+        var result = new Uint8Array(rlen);
+        var atag = new Uint8Array(heap.subarray(pos + rlen, pos + len));
+        var i = rlen;
+        for (; i & 15; i++) heap[pos + i] = 0;
+        asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA + pos, i);
+        asm.cipher(_aes2.AES_asm.DEC.CTR, _aes2.AES_asm.HEAP_DATA + pos, i);
+        if (rlen) result.set(heap.subarray(pos, pos + rlen));
+        var alen = adata !== undefined ? adata.length : 0;
+        var clen = (counter - 1 << 4) + len - tagSize;
+        heap[0] = 0;
+        heap[1] = 0;
+        heap[2] = 0;
+        heap[3] = alen >>> 29;
+        heap[4] = alen >>> 21;
+        heap[5] = alen >>> 13 & 255;
+        heap[6] = alen >>> 5 & 255;
+        heap[7] = alen << 3 & 255;
+        heap[8] = heap[9] = heap[10] = 0;
+        heap[11] = clen >>> 29;
+        heap[12] = clen >>> 21 & 255;
+        heap[13] = clen >>> 13 & 255;
+        heap[14] = clen >>> 5 & 255;
+        heap[15] = clen << 3 & 255;
+        asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA, 16);
+        asm.get_iv(_aes2.AES_asm.HEAP_DATA);
+        asm.set_counter(0, 0, 0, this.gamma0);
+        asm.cipher(_aes2.AES_asm.ENC.CTR, _aes2.AES_asm.HEAP_DATA, 16);
+        var acheck = 0;
+        for (var i_1 = 0; i_1 < tagSize; ++i_1) acheck |= atag[i_1] ^ heap[i_1];
+        if (acheck) throw new _errors.SecurityError('data integrity check failed');
+        this.counter = 1;
+        this.pos = 0;
+        this.len = 0;
+        return result;
+    };
+    AES_GCM.prototype.AES_GCM_decrypt = function (data) {
+        var result1 = this.AES_GCM_Decrypt_process(data);
+        var result2 = this.AES_GCM_Decrypt_finish();
+        var result = new Uint8Array(result1.length + result2.length);
+        if (result1.length) result.set(result1);
+        if (result2.length) result.set(result2, result1.length);
+        return result;
+    };
+    AES_GCM.prototype.AES_GCM_encrypt = function (data) {
+        var result1 = this.AES_GCM_Encrypt_process(data);
+        var result2 = this.AES_GCM_Encrypt_finish();
+        var result = new Uint8Array(result1.length + result2.length);
+        if (result1.length) result.set(result1);
+        if (result2.length) result.set(result2, result1.length);
+        return result;
+    };
+    AES_GCM.prototype._gcm_mac_process = function (data) {
+        var heap = this.heap;
+        var asm = this.asm;
+        var dpos = 0;
+        var dlen = data.length || 0;
+        var wlen = 0;
+        while (dlen > 0) {
+            wlen = (0, _utils._heap_write)(heap, 0, data, dpos, dlen);
+            dpos += wlen;
+            dlen -= wlen;
+            while (wlen & 15) heap[wlen++] = 0;
+            asm.mac(_aes2.AES_asm.MAC.GCM, _aes2.AES_asm.HEAP_DATA, wlen);
+        }
+    };
+    return AES_GCM;
+}(_aes.AES);
+exports.AES_GCM = AES_GCM;
+
+},{"../other/errors":15,"../other/utils":16,"./aes":4,"./aes.asm":3}],10:[function(require,module,exports){
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+    value: true
+});
+exports.Hash = undefined;
+
+var _utils = require('../other/utils');
+
+var _errors = require('../other/errors');
+
+var Hash = /** @class */function () {
+    function Hash() {
+        this.pos = 0;
+        this.len = 0;
+        this.acquire_asm();
+    }
+    Hash.prototype.acquire_asm = function () {
+        if (this.heap === undefined && this.asm === undefined) {
+            this.heap = this.constructor.heap_pool.pop() || (0, _utils._heap_init)();
+            this.asm = this.constructor.asm_pool.pop() || this.constructor.asm_function({ Uint8Array: Uint8Array }, null, this.heap.buffer);
+            this.reset();
+        }
+    };
+    Hash.prototype.release_asm = function () {
+        this.constructor.heap_pool.push(this.heap);
+        ;
+        this.constructor.asm_pool.push(this.asm);
+        this.heap = undefined;
+        this.asm = undefined;
+    };
+    Hash.prototype.reset = function () {
+        this.acquire_asm();
+        this.result = null;
+        this.pos = 0;
+        this.len = 0;
+        this.asm.reset();
+        return this;
+    };
+    Hash.prototype.process = function (data) {
+        if (this.result !== null) throw new _errors.IllegalStateError('state must be reset before processing new data');
+        this.acquire_asm();
+        var asm = this.asm;
+        var heap = this.heap;
+        var hpos = this.pos;
+        var hlen = this.len;
+        var dpos = 0;
+        var dlen = data.length;
+        var wlen = 0;
+        while (dlen > 0) {
+            wlen = (0, _utils._heap_write)(heap, hpos + hlen, data, dpos, dlen);
+            hlen += wlen;
+            dpos += wlen;
+            dlen -= wlen;
+            wlen = asm.process(hpos, hlen);
+            hpos += wlen;
+            hlen -= wlen;
+            if (!hlen) hpos = 0;
+        }
+        this.pos = hpos;
+        this.len = hlen;
+        return this;
+    };
+    Hash.prototype.finish = function () {
+        if (this.result !== null) throw new _errors.IllegalStateError('state must be reset before processing new data');
+        this.acquire_asm();
+        this.asm.finish(this.pos, this.len, 0);
+        this.result = new Uint8Array(this.HASH_SIZE);
+        this.result.set(this.heap.subarray(0, this.HASH_SIZE));
+        this.pos = 0;
+        this.len = 0;
+        this.release_asm();
+        return this;
+    };
+    return Hash;
+}();
+exports.Hash = Hash;
+
+},{"../other/errors":15,"../other/utils":16}],11:[function(require,module,exports){
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+    value: true
+});
+exports.sha1_asm = sha1_asm;
+function sha1_asm(stdlib, foreign, buffer) {
+    "use asm";
+
+    // SHA256 state
+
+    var H0 = 0,
+        H1 = 0,
+        H2 = 0,
+        H3 = 0,
+        H4 = 0,
+        TOTAL0 = 0,
+        TOTAL1 = 0;
+
+    // HMAC state
+    var I0 = 0,
+        I1 = 0,
+        I2 = 0,
+        I3 = 0,
+        I4 = 0,
+        O0 = 0,
+        O1 = 0,
+        O2 = 0,
+        O3 = 0,
+        O4 = 0;
+
+    // I/O buffer
+    var HEAP = new stdlib.Uint8Array(buffer);
+
+    function _core(w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15) {
+        w0 = w0 | 0;
+        w1 = w1 | 0;
+        w2 = w2 | 0;
+        w3 = w3 | 0;
+        w4 = w4 | 0;
+        w5 = w5 | 0;
+        w6 = w6 | 0;
+        w7 = w7 | 0;
+        w8 = w8 | 0;
+        w9 = w9 | 0;
+        w10 = w10 | 0;
+        w11 = w11 | 0;
+        w12 = w12 | 0;
+        w13 = w13 | 0;
+        w14 = w14 | 0;
+        w15 = w15 | 0;
+
+        var a = 0,
+            b = 0,
+            c = 0,
+            d = 0,
+            e = 0,
+            n = 0,
+            t = 0,
+            w16 = 0,
+            w17 = 0,
+            w18 = 0,
+            w19 = 0,
+            w20 = 0,
+            w21 = 0,
+            w22 = 0,
+            w23 = 0,
+            w24 = 0,
+            w25 = 0,
+            w26 = 0,
+            w27 = 0,
+            w28 = 0,
+            w29 = 0,
+            w30 = 0,
+            w31 = 0,
+            w32 = 0,
+            w33 = 0,
+            w34 = 0,
+            w35 = 0,
+            w36 = 0,
+            w37 = 0,
+            w38 = 0,
+            w39 = 0,
+            w40 = 0,
+            w41 = 0,
+            w42 = 0,
+            w43 = 0,
+            w44 = 0,
+            w45 = 0,
+            w46 = 0,
+            w47 = 0,
+            w48 = 0,
+            w49 = 0,
+            w50 = 0,
+            w51 = 0,
+            w52 = 0,
+            w53 = 0,
+            w54 = 0,
+            w55 = 0,
+            w56 = 0,
+            w57 = 0,
+            w58 = 0,
+            w59 = 0,
+            w60 = 0,
+            w61 = 0,
+            w62 = 0,
+            w63 = 0,
+            w64 = 0,
+            w65 = 0,
+            w66 = 0,
+            w67 = 0,
+            w68 = 0,
+            w69 = 0,
+            w70 = 0,
+            w71 = 0,
+            w72 = 0,
+            w73 = 0,
+            w74 = 0,
+            w75 = 0,
+            w76 = 0,
+            w77 = 0,
+            w78 = 0,
+            w79 = 0;
+
+        a = H0;
+        b = H1;
+        c = H2;
+        d = H3;
+        e = H4;
+
+        // 0
+        t = w0 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 1
+        t = w1 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 2
+        t = w2 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 3
+        t = w3 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 4
+        t = w4 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 5
+        t = w5 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 6
+        t = w6 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 7
+        t = w7 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 8
+        t = w8 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 9
+        t = w9 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 10
+        t = w10 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 11
+        t = w11 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 12
+        t = w12 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 13
+        t = w13 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 14
+        t = w14 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 15
+        t = w15 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 16
+        n = w13 ^ w8 ^ w2 ^ w0;
+        w16 = n << 1 | n >>> 31;
+        t = w16 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 17
+        n = w14 ^ w9 ^ w3 ^ w1;
+        w17 = n << 1 | n >>> 31;
+        t = w17 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 18
+        n = w15 ^ w10 ^ w4 ^ w2;
+        w18 = n << 1 | n >>> 31;
+        t = w18 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 19
+        n = w16 ^ w11 ^ w5 ^ w3;
+        w19 = n << 1 | n >>> 31;
+        t = w19 + (a << 5 | a >>> 27) + e + (b & c | ~b & d) + 0x5a827999 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 20
+        n = w17 ^ w12 ^ w6 ^ w4;
+        w20 = n << 1 | n >>> 31;
+        t = w20 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 21
+        n = w18 ^ w13 ^ w7 ^ w5;
+        w21 = n << 1 | n >>> 31;
+        t = w21 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 22
+        n = w19 ^ w14 ^ w8 ^ w6;
+        w22 = n << 1 | n >>> 31;
+        t = w22 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 23
+        n = w20 ^ w15 ^ w9 ^ w7;
+        w23 = n << 1 | n >>> 31;
+        t = w23 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 24
+        n = w21 ^ w16 ^ w10 ^ w8;
+        w24 = n << 1 | n >>> 31;
+        t = w24 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 25
+        n = w22 ^ w17 ^ w11 ^ w9;
+        w25 = n << 1 | n >>> 31;
+        t = w25 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 26
+        n = w23 ^ w18 ^ w12 ^ w10;
+        w26 = n << 1 | n >>> 31;
+        t = w26 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 27
+        n = w24 ^ w19 ^ w13 ^ w11;
+        w27 = n << 1 | n >>> 31;
+        t = w27 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 28
+        n = w25 ^ w20 ^ w14 ^ w12;
+        w28 = n << 1 | n >>> 31;
+        t = w28 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 29
+        n = w26 ^ w21 ^ w15 ^ w13;
+        w29 = n << 1 | n >>> 31;
+        t = w29 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 30
+        n = w27 ^ w22 ^ w16 ^ w14;
+        w30 = n << 1 | n >>> 31;
+        t = w30 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 31
+        n = w28 ^ w23 ^ w17 ^ w15;
+        w31 = n << 1 | n >>> 31;
+        t = w31 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 32
+        n = w29 ^ w24 ^ w18 ^ w16;
+        w32 = n << 1 | n >>> 31;
+        t = w32 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 33
+        n = w30 ^ w25 ^ w19 ^ w17;
+        w33 = n << 1 | n >>> 31;
+        t = w33 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 34
+        n = w31 ^ w26 ^ w20 ^ w18;
+        w34 = n << 1 | n >>> 31;
+        t = w34 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 35
+        n = w32 ^ w27 ^ w21 ^ w19;
+        w35 = n << 1 | n >>> 31;
+        t = w35 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 36
+        n = w33 ^ w28 ^ w22 ^ w20;
+        w36 = n << 1 | n >>> 31;
+        t = w36 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 37
+        n = w34 ^ w29 ^ w23 ^ w21;
+        w37 = n << 1 | n >>> 31;
+        t = w37 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 38
+        n = w35 ^ w30 ^ w24 ^ w22;
+        w38 = n << 1 | n >>> 31;
+        t = w38 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 39
+        n = w36 ^ w31 ^ w25 ^ w23;
+        w39 = n << 1 | n >>> 31;
+        t = w39 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) + 0x6ed9eba1 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 40
+        n = w37 ^ w32 ^ w26 ^ w24;
+        w40 = n << 1 | n >>> 31;
+        t = w40 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 41
+        n = w38 ^ w33 ^ w27 ^ w25;
+        w41 = n << 1 | n >>> 31;
+        t = w41 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 42
+        n = w39 ^ w34 ^ w28 ^ w26;
+        w42 = n << 1 | n >>> 31;
+        t = w42 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 43
+        n = w40 ^ w35 ^ w29 ^ w27;
+        w43 = n << 1 | n >>> 31;
+        t = w43 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 44
+        n = w41 ^ w36 ^ w30 ^ w28;
+        w44 = n << 1 | n >>> 31;
+        t = w44 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 45
+        n = w42 ^ w37 ^ w31 ^ w29;
+        w45 = n << 1 | n >>> 31;
+        t = w45 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 46
+        n = w43 ^ w38 ^ w32 ^ w30;
+        w46 = n << 1 | n >>> 31;
+        t = w46 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 47
+        n = w44 ^ w39 ^ w33 ^ w31;
+        w47 = n << 1 | n >>> 31;
+        t = w47 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 48
+        n = w45 ^ w40 ^ w34 ^ w32;
+        w48 = n << 1 | n >>> 31;
+        t = w48 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 49
+        n = w46 ^ w41 ^ w35 ^ w33;
+        w49 = n << 1 | n >>> 31;
+        t = w49 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 50
+        n = w47 ^ w42 ^ w36 ^ w34;
+        w50 = n << 1 | n >>> 31;
+        t = w50 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 51
+        n = w48 ^ w43 ^ w37 ^ w35;
+        w51 = n << 1 | n >>> 31;
+        t = w51 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 52
+        n = w49 ^ w44 ^ w38 ^ w36;
+        w52 = n << 1 | n >>> 31;
+        t = w52 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 53
+        n = w50 ^ w45 ^ w39 ^ w37;
+        w53 = n << 1 | n >>> 31;
+        t = w53 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 54
+        n = w51 ^ w46 ^ w40 ^ w38;
+        w54 = n << 1 | n >>> 31;
+        t = w54 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 55
+        n = w52 ^ w47 ^ w41 ^ w39;
+        w55 = n << 1 | n >>> 31;
+        t = w55 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 56
+        n = w53 ^ w48 ^ w42 ^ w40;
+        w56 = n << 1 | n >>> 31;
+        t = w56 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 57
+        n = w54 ^ w49 ^ w43 ^ w41;
+        w57 = n << 1 | n >>> 31;
+        t = w57 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 58
+        n = w55 ^ w50 ^ w44 ^ w42;
+        w58 = n << 1 | n >>> 31;
+        t = w58 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 59
+        n = w56 ^ w51 ^ w45 ^ w43;
+        w59 = n << 1 | n >>> 31;
+        t = w59 + (a << 5 | a >>> 27) + e + (b & c | b & d | c & d) - 0x70e44324 | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 60
+        n = w57 ^ w52 ^ w46 ^ w44;
+        w60 = n << 1 | n >>> 31;
+        t = w60 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 61
+        n = w58 ^ w53 ^ w47 ^ w45;
+        w61 = n << 1 | n >>> 31;
+        t = w61 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 62
+        n = w59 ^ w54 ^ w48 ^ w46;
+        w62 = n << 1 | n >>> 31;
+        t = w62 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 63
+        n = w60 ^ w55 ^ w49 ^ w47;
+        w63 = n << 1 | n >>> 31;
+        t = w63 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 64
+        n = w61 ^ w56 ^ w50 ^ w48;
+        w64 = n << 1 | n >>> 31;
+        t = w64 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 65
+        n = w62 ^ w57 ^ w51 ^ w49;
+        w65 = n << 1 | n >>> 31;
+        t = w65 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 66
+        n = w63 ^ w58 ^ w52 ^ w50;
+        w66 = n << 1 | n >>> 31;
+        t = w66 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 67
+        n = w64 ^ w59 ^ w53 ^ w51;
+        w67 = n << 1 | n >>> 31;
+        t = w67 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 68
+        n = w65 ^ w60 ^ w54 ^ w52;
+        w68 = n << 1 | n >>> 31;
+        t = w68 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 69
+        n = w66 ^ w61 ^ w55 ^ w53;
+        w69 = n << 1 | n >>> 31;
+        t = w69 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 70
+        n = w67 ^ w62 ^ w56 ^ w54;
+        w70 = n << 1 | n >>> 31;
+        t = w70 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 71
+        n = w68 ^ w63 ^ w57 ^ w55;
+        w71 = n << 1 | n >>> 31;
+        t = w71 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 72
+        n = w69 ^ w64 ^ w58 ^ w56;
+        w72 = n << 1 | n >>> 31;
+        t = w72 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 73
+        n = w70 ^ w65 ^ w59 ^ w57;
+        w73 = n << 1 | n >>> 31;
+        t = w73 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 74
+        n = w71 ^ w66 ^ w60 ^ w58;
+        w74 = n << 1 | n >>> 31;
+        t = w74 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 75
+        n = w72 ^ w67 ^ w61 ^ w59;
+        w75 = n << 1 | n >>> 31;
+        t = w75 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 76
+        n = w73 ^ w68 ^ w62 ^ w60;
+        w76 = n << 1 | n >>> 31;
+        t = w76 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 77
+        n = w74 ^ w69 ^ w63 ^ w61;
+        w77 = n << 1 | n >>> 31;
+        t = w77 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 78
+        n = w75 ^ w70 ^ w64 ^ w62;
+        w78 = n << 1 | n >>> 31;
+        t = w78 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        // 79
+        n = w76 ^ w71 ^ w65 ^ w63;
+        w79 = n << 1 | n >>> 31;
+        t = w79 + (a << 5 | a >>> 27) + e + (b ^ c ^ d) - 0x359d3e2a | 0;
+        e = d;d = c;c = b << 30 | b >>> 2;b = a;a = t;
+
+        H0 = H0 + a | 0;
+        H1 = H1 + b | 0;
+        H2 = H2 + c | 0;
+        H3 = H3 + d | 0;
+        H4 = H4 + e | 0;
+    }
+
+    function _core_heap(offset) {
+        offset = offset | 0;
+

privacy-policy.md 🔗

@@ -0,0 +1,35 @@
+---
+layout: page
+title: Privacy Policy
+description: I encourage you to read the whole document. It's not particularly long or difficult to understand.
+subtitle: What's being done with your data?
+permalink: /privacy/
+cover: /assets/posts/privacy.png
+---
+# Privacy Policy
+This will hopefully be the briefest "legal" document you've ever read as well as the most readable. If you need additional information [let me know](/contact) and I'll add it.
+
+## IP Address
+Some applications (Gitea, Mastodon, Mumble, XMPP) collect your IP when you register. At the moment, that information is kept indefinitely. However, I'm working on either completely disabling it or setting something up that will periodically delete stored IP addresses. When I do, this document will be updated accordingly.
+
+If you don't want me to have that information to begin with, just use [Tor Browser](https://www.torproject.org/).
+
+## Email Address
+When you register for a service using an email address, that is obviously collected. You can control whether it's a real one or not. Even though I can see them for services like Gitea and Mastodon, I don't care and won't send you unsolicited mail.
+
+**Note:** whatever address you use for git is visible in commits.
+
+## Browser Fingerprint
+Your web browser communicates uniquely identifying information to all websites it visits by allowing the site to know details about your operating system, browser information, plugins installed, fonts installed, screen resolution, and [much more](https://panopticlick.eff.org/). I don't care about that either and, if some services do collect that for their own use (I'm 99% sure none of them do), I'm not going to look at it ¯\\_(ツ)\_/¯
+
+## Usage and storage of collected information
+**For most services:** Whatever data is collected is stored on one server in Germany and won't be shared with any third parties whatsoever.
+
+**For Nextcloud:** Whatever data is collected is stored on one server in my living room and won't be shared with any third parties either. User's files are encrypted at rest so no one can hack into my server and steal them. I do have the encryption key so I *could* decrypt and view your files. I'm not going to bother with that though because I don't have any interest in looking at your personal stuff. That's your business and I won't invade your privacy.
+
+
+# Exceptions
+I do live in the US; one server is here and the other is in Germany. If, for whatever reason, I'm compelled by law enforcement to give up your email, IP address, or any other information, I will. *I don't want to*. As such, I do whatever I can to make sure *I don't have that information*. If I don't have it, I can't share it.
+
+# Recommendations
+To mitigate invasions of privacy like this, use a throwaway email address for registration, such as one from [cock.li](https://cock.li/), or [ProtonMail](https://protonmail.com/), provide a [fake name](https://fakena.me/fake-name/), and use the service from behind [Tor](https://www.torproject.org/) or a VPN. Rather than a VPN, however, I *strongly* recommend using Tor across all devices. They have an [Android version](https://www.torproject.org/download/#android) now and there's another browser for iOS that they recommend called [Onion Browser](https://apps.apple.com/us/app/onion-browser/id519296448). I don't use iOS so I can't say whether or not it's any good, just that the Tor Project recommends it below the Android section.

scripts.js 🔗

@@ -0,0 +1,537 @@
+System.register("local", [], function (exports_1, context_1) {
+    "use strict";
+    var __moduleName = context_1 && context_1.id;
+    function createElement(name, attributes, ...children) {
+        return {
+            name,
+            attributes: attributes || {},
+            children: Array.prototype.concat(...(children || []))
+        };
+    }
+    exports_1("createElement", createElement);
+    return {
+        setters: [],
+        execute: function () {
+        }
+    };
+});
+System.register("renderer", [], function (exports_2, context_2) {
+    "use strict";
+    var __moduleName = context_2 && context_2.id;
+    function render(element) {
+        if (element == null)
+            return '';
+        if (typeof element !== "object")
+            element = String(element);
+        if (typeof element === "string")
+            return element.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+        //if (element instanceof Raw) return element.html;
+        console.assert(!!element.attributes, 'Element attributes must be defined:\n' + JSON.stringify(element));
+        const elementAttributes = element.attributes;
+        let attributes = Object.keys(elementAttributes).filter(key => {
+            const value = elementAttributes[key];
+            return value != null;
+        }).map(key => {
+            const value = elementAttributes[key];
+            if (value === true) {
+                return key;
+            }
+            return `${key}="${String(value).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;')}"`;
+        }).join(' ');
+        if (attributes.length > 0) {
+            attributes = ' ' + attributes;
+        }
+        const children = element.children.length > 0 ? `>${element.children.map(child => render(child)).join('')}` : '>';
+        return `<${element.name}${attributes}${children}</${element.name}>`;
+    }
+    exports_2("render", render);
+    return {
+        setters: [],
+        execute: function () {
+        }
+    };
+});
+/*
+    Copyright 2019 Wiktor Kwapisiewicz
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       https://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+System.register("openpgp-key", ["local", "renderer"], function (exports_3, context_3) {
+    "use strict";
+    var local, renderer, proofs, dateFormat;
+    var __moduleName = context_3 && context_3.id;
+    function getLatestSignature(signatures, date = new Date()) {
+        let signature = signatures[0];
+        for (let i = 1; i < signatures.length; i++) {
+            if (signatures[i].created >= signature.created &&
+                (signatures[i].created <= date || date === null)) {
+                signature = signatures[i];
+            }
+        }
+        return signature;
+    }
+    function getVerifier(proofUrl, fingerprint) {
+        for (const proof of proofs) {
+            const matches = proofUrl.match(proof.matcher);
+            if (!matches)
+                continue;
+            const bound = Object.entries(proof.variables).map(([key, value]) => [key, matches[value || 0]]).reduce((previous, current) => { previous[current[0]] = current[1]; return previous; }, { FINGERPRINT: fingerprint });
+            const profile = proof.profile.replace(/\{([A-Z]+)\}/g, (_, name) => bound[name]);
+            const proofJson = proof.proof.replace(/\{([A-Z]+)\}/g, (_, name) => bound[name]);
+            const username = proof.username.replace(/\{([A-Z]+)\}/g, (_, name) => bound[name]);
+            return {
+                profile,
+                proofUrl,
+                proofJson,
+                username,
+                service: proof.service,
+                checks: (proof.checks || []).map((check) => ({
+                    relation: check.relation,
+                    proof: check.proof,
+                    claim: check.claim.replace(/\{([A-Z]+)\}/g, (_, name) => bound[name])
+                }))
+            };
+        }
+        return null;
+    }
+    async function verify(proofJson, checks) {
+        const response = await fetch(proofJson, {
+            headers: {
+                Accept: 'application/json'
+            },
+            credentials: 'omit'
+        });
+        if (!response.ok) {
+            throw new Error('Response failed: ' + response.status);
+        }
+        const json = await response.json();
+        for (const check of checks) {
+            const proofValue = check.proof.reduce((previous, current) => {
+                if (current == null || previous == null)
+                    return null;
+                if (Array.isArray(previous) && typeof current === 'string') {
+                    return previous.map(value => value[current]);
+                }
+                return previous[current];
+            }, json);
+            const claimValue = check.claim;
+            if (check.relation === 'eq') {
+                if (proofValue !== claimValue) {
+                    throw new Error(`Proof value ${proofValue} !== claim value ${claimValue}`);
+                }
+            }
+            else if (check.relation === 'contains') {
+                if (!proofValue || proofValue.indexOf(claimValue) === -1) {
+                    throw new Error(`Proof value ${proofValue} does not contain claim value ${claimValue}`);
+                }
+            }
+            else if (check.relation === 'oneOf') {
+                if (!proofValue || proofValue.indexOf(claimValue) === -1) {
+                    throw new Error(`Proof value ${proofValue} does not contain claim value ${claimValue}`);
+                }
+            }
+        }
+    }
+    function serviceToClassName(service) {
+        if (service === 'github') {
+            return 'fab fa-github';
+        }
+        else if (service === 'reddit') {
+            return 'fab fa-reddit';
+        }
+        else if (service === 'hackernews') {
+            return 'fab fa-hacker-news';
+        }
+        else if (service === 'mastodon') {
+            return 'fab fa-mastodon';
+        }
+        else if (service === 'dns') {
+            return 'fas fa-globe';
+        }
+        else {
+            return '';
+        }
+    }
+    async function lookupKey(query) {
+        const result = document.getElementById('result');
+        result.innerHTML = renderer.render(local.createElement("span", null,
+            "Looking up ",
+            query,
+            "..."));
+        let keys, keyUrl;
+        const keyLink = document.querySelector('[rel="pgpkey"]');
+        if (!keyLink) {
+            const keyserver = document.querySelector('meta[name="keyserver"]').content;
+            keyUrl = `https://${keyserver}/pks/lookup?op=get&options=mr&search=${query}`;
+            const response = await fetch(keyUrl);
+            const key = await response.text();
+            keys = (await openpgp.key.readArmored(key)).keys;
+        }
+        else {
+            keyUrl = keyLink.href;
+            const response = await fetch(keyUrl);
+            const key = await response.arrayBuffer();
+            keys = (await openpgp.key.read(new Uint8Array(key))).keys;
+        }
+        if (keys.length > 0) {
+            loadKeys(keyUrl, keys).catch(e => {
+                result.innerHTML = renderer.render(local.createElement("span", null,
+                    "Could not display this key: ",
+                    String(e)));
+            });
+        }
+        else {
+            result.innerHTML = renderer.render(local.createElement("span", null,
+                query,
+                ": not found"));
+        }
+    }
+    async function loadKeys(keyUrl, _keys) {
+        const key = _keys[0];
+        window.key = key;
+        const primaryUser = await key.getPrimaryUser();
+        for (var i = key.users.length - 1; i >= 0; i--) {
+            try {
+                if (await key.users[i].verify(key.primaryKey) === openpgp.enums.keyStatus.valid) {
+                    continue;
+                }
+            }
+            catch (e) {
+                console.error('User verification error:', e);
+            }
+            //key.users.splice(i, 1);
+        }
+        for (const user of key.users) {
+            user.revoked = await user.isRevoked();
+        }
+        const lastPrimarySig = primaryUser.selfCertification;
+        const keys = [{
+                fingerprint: key.primaryKey.getFingerprint(),
+                status: await key.verifyPrimaryKey(),
+                keyFlags: lastPrimarySig.keyFlags,
+                created: key.primaryKey.created,
+                algorithmInfo: key.primaryKey.getAlgorithmInfo(),
+                expirationTime: lastPrimarySig.getExpirationTime()
+            }];
+        //console.log(lastPrimarySig);
+        const proofs = (lastPrimarySig.notations || [])
+            .filter((notation) => notation[0] === 'proof@metacode.biz' && typeof notation[1] === 'string')
+            .map((notation) => notation[1])
+            .map((proofUrl) => getVerifier(proofUrl, key.primaryKey.getFingerprint()))
+            .filter((verifier) => !!verifier);
+        /*
+        proofs.push(getVerifier('https://www.reddit.com/user/wiktor-k/comments/bo5oih/test/', key.primaryKey.getFingerprint()));
+        proofs.push(getVerifier('https://news.ycombinator.com/user?id=wiktor-k', key.primaryKey.getFingerprint()));
+        proofs.push(getVerifier('https://gist.github.com/wiktor-k/389d589dd19250e1f9a42bc3d5d40c16', key.primaryKey.getFingerprint()));
+        proofs.push(getVerifier('https://metacode.biz/@wiktor', key.primaryKey.getFingerprint()));
+        proofs.push(getVerifier('dns:metacode.biz?type=TXT', key.primaryKey.getFingerprint()));
+        */
+        for (const subKey of key.subKeys) {
+            const lastSig = getLatestSignature(subKey.bindingSignatures);
+            let reasonForRevocation;
+            if (subKey.revocationSignatures.length > 0) {
+                reasonForRevocation = subKey.revocationSignatures[subKey.revocationSignatures.length - 1].reasonForRevocationString;
+            }
+            keys.push({
+                fingerprint: subKey.keyPacket.getFingerprint(),
+                status: await subKey.verify(key.primaryKey),
+                reasonForRevocation,
+                keyFlags: lastSig.keyFlags,
+                created: lastSig.created,
+                algorithmInfo: subKey.keyPacket.getAlgorithmInfo(),
+                expirationTime: await subKey.getExpirationTime()
+            });
+        }
+        //key.users.splice(primaryUser.index, 1);
+        const profileHash = await openpgp.crypto.hash.md5(openpgp.util.str_to_Uint8Array(primaryUser.user.userId.email)).then((u) => openpgp.util.str_to_hex(openpgp.util.Uint8Array_to_str(u)));
+        const now = new Date();
+        // there is index property on primaryUser
+        document.title = primaryUser.user.userId.name + ' - OpenPGP key';
+        const info = local.createElement("div", null,
+            local.createElement("div", { class: "wrapper" },
+                local.createElement("div", { class: "bio" },
+                    local.createElement("img", { class: "avatar", src: "https://seccdn.libravatar.org/avatar/" + profileHash + "?s=148&d=" + encodeURIComponent("https://www.gravatar.com/avatar/" + profileHash + "?s=148&d=mm") }),
+                    local.createElement("h2", null, primaryUser.user.userId.name)),
+                local.createElement("div", null,
+                    local.createElement("ul", { class: "props" },
+                        local.createElement("li", { title: key.primaryKey.getFingerprint() },
+                            local.createElement("a", { href: keyUrl, target: "_blank", rel: "nofollow noopener" },
+                                "\uD83D\uDD11\u00A0",
+                                local.createElement("code", null, key.primaryKey.getFingerprint()))),
+                        key.users.filter((user) => !user.revoked && user.userId).map((user) => user.userId.email).filter((email) => !!email).map((email) => local.createElement("li", null,
+                            local.createElement("a", { href: "mailto:" + email },
+                                "\uD83D\uDCE7 ",
+                                email
+                            //formatAttribute(user.userAttribute)
+                            ))),
+                        proofs.filter((proof) => !!proof).map((proof) => local.createElement("li", null,
+                            local.createElement("a", { rel: "me noopener nofollow", target: "_blank", href: proof.profile },
+                                local.createElement("i", { class: serviceToClassName(proof.service) }),
+                                proof.username),
+                            local.createElement("a", { rel: "noopener nofollow", target: "_blank", href: proof.proofUrl, class: "proof", "data-proof-json": proof.proofJson, "data-checks": JSON.stringify(proof.checks) },
+                                local.createElement("i", { class: "fas fa-certificate" }),
+                                "proof")))))),
+            local.createElement("details", null,
+                local.createElement("summary", null, "\uD83D\uDD12 Encrypt"),
+                local.createElement("textarea", { placeholder: "Message to encrypt...", id: "message" }),
+                local.createElement("input", { type: "button", value: "Encrypt", id: "encrypt" }),
+                ' ',
+                local.createElement("input", { type: "button", id: "send", "data-recipient": primaryUser.user.userId.email, value: "Send to " + primaryUser.user.userId.email })),
+            local.createElement("details", null,
+                local.createElement("summary", null, "\uD83D\uDD8B Verify"),
+                local.createElement("textarea", { placeholder: "Clearsigned message to verify...", id: "signed" }),
+                local.createElement("input", { type: "button", value: "Verify", id: "verify" })),
+            local.createElement("details", null,
+                local.createElement("summary", null, "\uD83D\uDD11 Key details"),
+                local.createElement("p", null, "Subkeys:"),
+                local.createElement("ul", null, keys.map((subKey) => local.createElement("li", null,
+                    local.createElement("div", null,
+                        getStatus(subKey.status, subKey.reasonForRevocation),
+                        " ",
+                        getIcon(subKey.keyFlags),
+                        " ",
+                        local.createElement("code", null, subKey.fingerprint.substring(24).match(/.{4}/g).join(" ")),
+                        " ",
+                        formatAlgorithm(subKey.algorithmInfo.algorithm),
+                        " (",
+                        subKey.algorithmInfo.bits,
+                        ")"),
+                    local.createElement("div", null,
+                        "created: ",
+                        formatDate(subKey.created),
+                        ", expire",
+                        now > subKey.expirationTime ? "d" : "s",
+                        ": ",
+                        formatDate(subKey.expirationTime)))))));
+        document.getElementById('result').innerHTML = renderer.render(info);
+        checkProofs();
+    }
+    async function checkProofs() {
+        const proofs = document.querySelectorAll('[data-checks]');
+        for (const proofLink of proofs) {
+            const checks = JSON.parse(proofLink.dataset.checks || '');
+            const url = proofLink.dataset.proofJson || '';
+            try {
+                await verify(url, checks);
+                proofLink.textContent = 'verified proof';
+                proofLink.classList.add('verified');
+            }
+            catch (e) {
+                console.error('Could not verify proof: ' + e);
+            }
+        }
+    }
+    async function verifyProof(e) {
+        const target = e.target;
+        if (target.id === 'encrypt') {
+            const text = document.getElementById('message');
+            openpgp.encrypt({
+                message: openpgp.message.fromText(text.value),
+                publicKeys: [window.key],
+                armor: true
+            }).then((cipherText) => {
+                text.value = cipherText.data;
+            }, (e) => alert(e));
+        }
+        else if (target.id === 'send') {
+            location.href = "mailto:" + target.dataset.recipient + "?subject=Encrypted%20message&body=" + encodeURIComponent(document.getElementById('message').value);
+        }
+        else if (target.id === 'verify') {
+            const text = document.getElementById('signed');
+            const message = await openpgp.cleartext.readArmored(text.value);
+            const verified = await openpgp.verify({
+                message,
+                publicKeys: [window.key]
+            });
+            console.log(verified);
+            alert('The signature is ' + (verified.signatures[0].valid ? '✅ correct.' : '❌ incorrect.'));
+        }
+    }
+    function formatAttribute(userAttribute) {
+        if (userAttribute.attributes[0][0] === String.fromCharCode(1)) {
+            return local.createElement("img", { src: "data:image/jpeg;base64," + btoa(userAttribute.attributes[0].substring(17)) });
+        }
+        if (userAttribute.attributes[0][0] === 'e') {
+            const url = userAttribute.attributes[0].substring(userAttribute.attributes[0].indexOf('@') + 1);
+            return local.createElement("a", { href: url, rel: "noopener nofollow" }, url);
+        }
+        return 'unknown attribute';
+    }
+    function formatAlgorithm(name) {
+        if (name === 'rsa_encrypt_sign')
+            return "RSA";
+        return name;
+    }
+    function formatDate(date) {
+        if (date === Infinity)
+            return "never";
+        if (typeof date === 'number')
+            return 'x';
+        return dateFormat.format(date);
+    }
+    function getStatus(status, details) {
+        if (status === openpgp.enums.keyStatus.invalid) {
+            return local.createElement("span", { title: "Invalid key" }, "\u274C");
+        }
+        if (status === openpgp.enums.keyStatus.expired) {
+            return local.createElement("span", { title: "Key expired" }, "\u23F0");
+        }
+        if (status === openpgp.enums.keyStatus.revoked) {
+            return local.createElement("span", { title: "Key revoked: " + details }, "\u274C");
+        }
+        if (status === openpgp.enums.keyStatus.valid) {
+            return local.createElement("span", { title: "Valid key" }, "\u2705");
+        }
+        if (status === openpgp.enums.keyStatus.no_self_cert) {
+            return local.createElement("span", { title: "Key not certified" }, "\u274C");
+        }
+        return "unknown:" + status;
+    }
+    function getIcon(keyFlags) {
+        if (!keyFlags || !keyFlags[0]) {
+            return "";
+        }
+        let flags = [];
+        if ((keyFlags[0] & openpgp.enums.keyFlags.certify_keys) !== 0) {
+            flags.push(local.createElement("span", { title: "Certyfing key" }, "\uD83C\uDFF5\uFE0F"));
+        }
+        if ((keyFlags[0] & openpgp.enums.keyFlags.sign_data) !== 0) {
+            flags.push(local.createElement("span", { title: 'Signing key' }, "\uD83D\uDD8B"));
+        }
+        if (((keyFlags[0] & openpgp.enums.keyFlags.encrypt_communication) !== 0) ||
+            ((keyFlags[0] & openpgp.enums.keyFlags.encrypt_storage) !== 0)) {
+            flags.push(local.createElement("span", { title: 'Encryption key' }, "\uD83D\uDD12"));
+        }
+        if ((keyFlags[0] & openpgp.enums.keyFlags.authentication) !== 0) {
+            flags.push(local.createElement("span", { title: 'Authentication key' }, "\uD83D\uDCB3"));
+        }
+        return flags;
+    }
+    return {
+        setters: [
+            function (local_1) {
+                local = local_1;
+            },
+            function (renderer_1) {
+                renderer = renderer_1;
+            }
+        ],
+        execute: function () {
+            openpgp.config.show_version = false;
+            openpgp.config.show_comment = false;
+            proofs = [
+                {
+                    matcher: /^https:\/\/gist\.github\.com\/([A-Za-z0-9_-]+)\/([0-9a-f]+)$/,
+                    variables: {
+                        USERNAME: 1,
+                        PROOFID: 2
+                    },
+                    profile: 'https://github.com/{USERNAME}',
+                    proof: 'https://api.github.com/gists/{PROOFID}',
+                    username: '{USERNAME}',
+                    service: 'github',
+                    checks: [{
+                            relation: 'eq',
+                            proof: ['owner', 'login'],
+                            claim: '{USERNAME}'
+                        }, {
+                            relation: 'eq',
+                            proof: ['owner', 'html_url'],
+                            claim: 'https://github.com/{USERNAME}'
+                        }, {
+                            relation: 'contains',
+                            proof: ['files', 'openpgp.md', 'content'],
+                            claim: '[Verifying my OpenPGP key: openpgp4fpr:{FINGERPRINT}]'
+                        }]
+                },
+                {
+                    matcher: /^https:\/\/news\.ycombinator\.com\/user\?id=([A-Za-z0-9-]+)$/,
+                    variables: {
+                        USERNAME: 1,
+                        PROFILE: 0
+                    },
+                    profile: '{PROFILE}',
+                    proof: 'https://hacker-news.firebaseio.com/v0/user/{USERNAME}.json',
+                    username: '{USERNAME}',
+                    service: 'hackernews',
+                    checks: [{
+                            relation: 'contains',
+                            proof: ['about'],
+                            claim: '[Verifying my OpenPGP key: openpgp4fpr:{FINGERPRINT}]'
+                        }]
+                },
+                {
+                    matcher: /^https:\/\/www\.reddit\.com\/user\/([^/]+)\/comments\/([^/]+)\/([^/]+\/)?$/,
+                    variables: {
+                        USERNAME: 1,
+                        PROOF: 2
+                    },
+                    profile: 'https://www.reddit.com/user/{USERNAME}',
+                    proof: 'https://www.reddit.com/user/{USERNAME}/comments/{PROOF}.json',
+                    username: '{USERNAME}',
+                    service: 'reddit',
+                    checks: [{
+                            relation: 'contains',
+                            proof: [0, 'data', 'children', 0, 'data', 'selftext'],
+                            claim: 'Verifying my OpenPGP key: openpgp4fpr:{FINGERPRINT}'
+                        }, {
+                            relation: 'eq',
+                            proof: [0, 'data', 'children', 0, 'data', 'author'],
+                            claim: '{USERNAME}'
+                        }]
+                },
+                {
+                    matcher: /^https:\/\/([^/]+)\/@([A-Za-z0-9_-]+)$/,
+                    variables: {
+                        INSTANCE: 1,
+                        USERNAME: 2,
+                        PROFILE: 0
+                    },
+                    profile: '{PROFILE}',
+                    proof: '{PROFILE}',
+                    username: '@{USERNAME}@{INSTANCE}',
+                    service: 'mastodon',
+                    checks: [{
+                            relation: 'oneOf',
+                            proof: ['attachment', 'value'],
+                            claim: '{FINGERPRINT}'
+                        }]
+                },
+                {
+                    matcher: /^dns:([^?]+)\?type=TXT$/,
+                    variables: {
+                        DOMAIN: 1
+                    },
+                    profile: 'https://{DOMAIN}',
+                    proof: 'https://dns.google.com/resolve?name={DOMAIN}&type=TXT',
+                    username: '{DOMAIN}',
+                    service: 'dns',
+                    checks: [{
+                            relation: 'oneOf',
+                            proof: ['Answer', 'data'],
+                            claim: '\"openpgp4fpr:{FINGERPRINT}\"'
+                        }]
+                }
+            ];
+            window.onload = window.onhashchange = function () {
+                lookupKey(location.hash.substring(1));
+            };
+            ;
+            document.addEventListener('click', verifyProof);
+            dateFormat = new Intl.DateTimeFormat(undefined, {
+                year: 'numeric', month: 'numeric', day: 'numeric',
+                hour: 'numeric', minute: 'numeric', second: 'numeric',
+            });
+        }
+    };
+});

verification.txt 🔗

@@ -0,0 +1,4 @@
+This file claims ownership of the OpenPGP key with long id 0x51fd40936db0065b.
+
+Token for proof:
+[Verifying my OpenPGP key: openpgp4fpr:75dd32ca1bfeea6ae40d823c51fd40936db0065b]