From 4af58b1ba401feef28ff814f7546edc4ddd13710 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Fri, 7 Aug 2020 12:50:00 +0200 Subject: [PATCH 01/23] Update package.json --- package.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c16456e..75eb2c0 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,11 @@ "version": "1.0.0", "description": "A modern, secure and privacy-friendly platform to establish your decentralized online identity", "main": "index.js", - "dependencies": {}, + "dependencies": { + "express": "^4.17.1", + "jstransformer-markdown-it": "^2.1.0", + "pug": "^3.0.0" + }, "devDependencies": { "license-check-and-add": "^3.0.4" }, @@ -25,6 +29,6 @@ "decentralized", "identity" ], - "author": "Yarmo Mackenbach ", + "author": "Yarmo Mackenbach (https://yarmo.eu)", "license": "AGPL-3.0-or-later" } From eed18e95b1e651cc448708cacf96974f97243a47 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Fri, 7 Aug 2020 12:55:18 +0200 Subject: [PATCH 02/23] Move assets to static --- {assets => static}/img/avatar_placeholder.png | Bin {assets => static}/img/background.svg | 0 {assets => static}/img/logo.png | Bin {assets => static}/img/logo_96.png | Bin {assets => static}/img/qrcode.png | Bin {assets => static}/img/qrcode_green.png | Bin {assets => static}/openpgp.min.js | 0 {assets => static}/qrcode.min.js | 0 {assets => static}/scripts.js | 0 {assets => static}/styles.css | 0 10 files changed, 0 insertions(+), 0 deletions(-) rename {assets => static}/img/avatar_placeholder.png (100%) rename {assets => static}/img/background.svg (100%) rename {assets => static}/img/logo.png (100%) rename {assets => static}/img/logo_96.png (100%) rename {assets => static}/img/qrcode.png (100%) rename {assets => static}/img/qrcode_green.png (100%) rename {assets => static}/openpgp.min.js (100%) rename {assets => static}/qrcode.min.js (100%) rename {assets => static}/scripts.js (100%) rename {assets => static}/styles.css (100%) diff --git a/assets/img/avatar_placeholder.png b/static/img/avatar_placeholder.png similarity index 100% rename from assets/img/avatar_placeholder.png rename to static/img/avatar_placeholder.png diff --git a/assets/img/background.svg b/static/img/background.svg similarity index 100% rename from assets/img/background.svg rename to static/img/background.svg diff --git a/assets/img/logo.png b/static/img/logo.png similarity index 100% rename from assets/img/logo.png rename to static/img/logo.png diff --git a/assets/img/logo_96.png b/static/img/logo_96.png similarity index 100% rename from assets/img/logo_96.png rename to static/img/logo_96.png diff --git a/assets/img/qrcode.png b/static/img/qrcode.png similarity index 100% rename from assets/img/qrcode.png rename to static/img/qrcode.png diff --git a/assets/img/qrcode_green.png b/static/img/qrcode_green.png similarity index 100% rename from assets/img/qrcode_green.png rename to static/img/qrcode_green.png diff --git a/assets/openpgp.min.js b/static/openpgp.min.js similarity index 100% rename from assets/openpgp.min.js rename to static/openpgp.min.js diff --git a/assets/qrcode.min.js b/static/qrcode.min.js similarity index 100% rename from assets/qrcode.min.js rename to static/qrcode.min.js diff --git a/assets/scripts.js b/static/scripts.js similarity index 100% rename from assets/scripts.js rename to static/scripts.js diff --git a/assets/styles.css b/static/styles.css similarity index 100% rename from assets/styles.css rename to static/styles.css From 27da0ee34f59d588dd5fbd871b14be1c28841f65 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Fri, 7 Aug 2020 12:56:03 +0200 Subject: [PATCH 03/23] Add npm script --- package-lock.json | 697 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 698 insertions(+) diff --git a/package-lock.json b/package-lock.json index 9f678a0..503820e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,26 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, + "@babel/parser": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.2.tgz", + "integrity": "sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw==" + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -16,6 +36,301 @@ "integrity": "sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g==", "dev": true }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz", + "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "assert-never": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", + "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==" + }, + "babel-walk": { + "version": "3.0.0-canary-5", + "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", + "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", + "requires": { + "@babel/types": "^7.9.6" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", + "requires": { + "is-regex": "^1.0.3" + } + }, + "constantinople": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", + "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", + "requires": { + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.1" + } + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-expression": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", + "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", + "requires": { + "acorn": "^7.1.1", + "object-assign": "^4.1.1" + } + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" + }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", + "requires": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "jstransformer-markdown-it": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/jstransformer-markdown-it/-/jstransformer-markdown-it-2.1.0.tgz", + "integrity": "sha1-aewwzkUYvtWZezjwJ2SOjChekvc=", + "requires": { + "markdown-it": "^8.0.0" + } + }, "license-check-and-add": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/license-check-and-add/-/license-check-and-add-3.0.4.tgz", @@ -564,6 +879,388 @@ } } } + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "pug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.0.tgz", + "integrity": "sha512-inmsJyFBSHZaiGLaguoFgJGViX0If6AcfcElimvwj9perqjDpUpw79UIEDZbWFmoGVidh08aoE+e8tVkjVJPCw==", + "requires": { + "pug-code-gen": "^3.0.0", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.0", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.0", + "pug-strip-comments": "^2.0.0" + } + }, + "pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "requires": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "pug-code-gen": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.1.tgz", + "integrity": "sha512-xJIGvmXTQlkJllq6hqxxjRWcay2F9CU69TuAuiVZgHK0afOhG5txrQOcZyaPHBvSWCU/QQOqEp5XCH94rRZpBQ==", + "requires": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.0.0", + "pug-runtime": "^3.0.0", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "pug-error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", + "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==" + }, + "pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "requires": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "pug-lexer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.0.tgz", + "integrity": "sha512-52xMk8nNpuyQ/M2wjZBN5gXQLIylaGkAoTk5Y1pBhVqaopaoj8Z0iVzpbFZAqitL4RHNVDZRnJDsqEYe99Ti0A==", + "requires": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "requires": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "requires": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "requires": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "pug-runtime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.0.tgz", + "integrity": "sha512-GoEPcmQNnaTsePEdVA05bDpY+Op5VLHKayg08AQiqJBWU/yIaywEYv7TetC5dEQS3fzBBoyb2InDcZEg3mPTIA==" + }, + "pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "requires": { + "pug-error": "^2.0.0" + } + }, + "pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "token-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", + "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=" + }, + "with": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", + "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", + "requires": { + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "assert-never": "^1.2.1", + "babel-walk": "3.0.0-canary-5" + } } } } diff --git a/package.json b/package.json index 75eb2c0..4da8811 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "license-check-and-add": "^3.0.4" }, "scripts": { + "main": "node public/index.js", "license:check": "./node_modules/license-check-and-add/dist/src/cli.js check", "license:add": "./node_modules/license-check-and-add/dist/src/cli.js add", "license:remove": "./node_modules/license-check-and-add/dist/src/cli.js remove", From cb077596f0e8c6e90e3cd348e485f9ef3d269f25 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 01:04:28 +0200 Subject: [PATCH 04/23] Rewrite guides in markdown --- guides/contributing.md | 20 +++++ guides/devto.md | 41 ++++++++++ guides/discourse.md | 41 ++++++++++ guides/dns.md | 35 ++++++++ guides/encrypt.md | 27 +++++++ guides/feature-comparison-keybase.md | 41 ++++++++++ guides/github.md | 43 ++++++++++ guides/hackernews.md | 41 ++++++++++ guides/lobsters.md | 39 +++++++++ guides/managing-proofs-deleting.md | 45 +++++++++++ guides/managing-proofs-listing.md | 29 +++++++ guides/mastodon.md | 35 ++++++++ guides/migrating-from-keybase.md | 25 ++++++ guides/openpgp-proofs.md | 35 ++++++++ guides/pixelfed.md | 41 ++++++++++ guides/pleroma.md | 41 ++++++++++ guides/proofs.md | 29 +++++++ guides/reddit.md | 41 ++++++++++ guides/self-hosting-keyoxide.md | 7 ++ guides/service-provider.md | 13 +++ guides/twitter.md | 41 ++++++++++ guides/verify.md | 63 +++++++++++++++ guides/web-key-directory.md | 43 ++++++++++ guides/xmpp.md | 55 +++++++++++++ views/guides/contributing.content.php | 51 ------------ views/guides/contributing.title.php | 30 ------- views/guides/devto.content.php | 58 ------------- views/guides/devto.title.php | 30 ------- views/guides/discourse.content.php | 58 ------------- views/guides/discourse.title.php | 30 ------- views/guides/dns.content.php | 56 ------------- views/guides/dns.title.php | 30 ------- views/guides/encrypt.content.php | 49 ----------- views/guides/encrypt.title.php | 30 ------- .../feature-comparison-keybase.content.php | 62 -------------- .../feature-comparison-keybase.title.php | 30 ------- views/guides/github.content.php | 60 -------------- views/guides/github.title.php | 30 ------- views/guides/hackernews.content.php | 58 ------------- views/guides/hackernews.title.php | 30 ------- views/guides/lobsters.content.php | 56 ------------- views/guides/lobsters.title.php | 30 ------- .../managing-proofs-deleting.content.php | 63 --------------- .../guides/managing-proofs-deleting.title.php | 30 ------- .../managing-proofs-listing.content.php | 52 ------------ .../guides/managing-proofs-listing.title.php | 30 ------- views/guides/mastodon.content.php | 54 ------------- views/guides/mastodon.title.php | 30 ------- .../guides/migrating-from-keybase.content.php | 50 ------------ views/guides/migrating-from-keybase.title.php | 30 ------- views/guides/openpgp-proofs.content.php | 63 --------------- views/guides/openpgp-proofs.title.php | 30 ------- views/guides/pixelfed.content.php | 58 ------------- views/guides/pixelfed.title.php | 30 ------- views/guides/pleroma.content.php | 58 ------------- views/guides/pleroma.title.php | 30 ------- views/guides/proofs.content.php | 50 ------------ views/guides/proofs.title.php | 30 ------- views/guides/reddit.content.php | 58 ------------- views/guides/reddit.title.php | 30 ------- .../guides/self-hosting-keyoxide.content.php | 34 -------- views/guides/self-hosting-keyoxide.title.php | 30 ------- views/guides/service-provider.content.php | 42 ---------- views/guides/service-provider.title.php | 30 ------- views/guides/twitter.content.php | 58 ------------- views/guides/twitter.title.php | 30 ------- views/guides/verify.content.php | 81 ------------------- views/guides/verify.title.php | 30 ------- views/guides/web-key-directory.content.php | 64 --------------- views/guides/web-key-directory.title.php | 30 ------- views/guides/xmpp.content.php | 72 ----------------- views/guides/xmpp.title.php | 30 ------- 72 files changed, 871 insertions(+), 2085 deletions(-) create mode 100644 guides/contributing.md create mode 100644 guides/devto.md create mode 100644 guides/discourse.md create mode 100644 guides/dns.md create mode 100644 guides/encrypt.md create mode 100644 guides/feature-comparison-keybase.md create mode 100644 guides/github.md create mode 100644 guides/hackernews.md create mode 100644 guides/lobsters.md create mode 100644 guides/managing-proofs-deleting.md create mode 100644 guides/managing-proofs-listing.md create mode 100644 guides/mastodon.md create mode 100644 guides/migrating-from-keybase.md create mode 100644 guides/openpgp-proofs.md create mode 100644 guides/pixelfed.md create mode 100644 guides/pleroma.md create mode 100644 guides/proofs.md create mode 100644 guides/reddit.md create mode 100644 guides/self-hosting-keyoxide.md create mode 100644 guides/service-provider.md create mode 100644 guides/twitter.md create mode 100644 guides/verify.md create mode 100644 guides/web-key-directory.md create mode 100644 guides/xmpp.md delete mode 100644 views/guides/contributing.content.php delete mode 100644 views/guides/contributing.title.php delete mode 100644 views/guides/devto.content.php delete mode 100644 views/guides/devto.title.php delete mode 100644 views/guides/discourse.content.php delete mode 100644 views/guides/discourse.title.php delete mode 100644 views/guides/dns.content.php delete mode 100644 views/guides/dns.title.php delete mode 100644 views/guides/encrypt.content.php delete mode 100644 views/guides/encrypt.title.php delete mode 100644 views/guides/feature-comparison-keybase.content.php delete mode 100644 views/guides/feature-comparison-keybase.title.php delete mode 100644 views/guides/github.content.php delete mode 100644 views/guides/github.title.php delete mode 100644 views/guides/hackernews.content.php delete mode 100644 views/guides/hackernews.title.php delete mode 100644 views/guides/lobsters.content.php delete mode 100644 views/guides/lobsters.title.php delete mode 100644 views/guides/managing-proofs-deleting.content.php delete mode 100644 views/guides/managing-proofs-deleting.title.php delete mode 100644 views/guides/managing-proofs-listing.content.php delete mode 100644 views/guides/managing-proofs-listing.title.php delete mode 100644 views/guides/mastodon.content.php delete mode 100644 views/guides/mastodon.title.php delete mode 100644 views/guides/migrating-from-keybase.content.php delete mode 100644 views/guides/migrating-from-keybase.title.php delete mode 100644 views/guides/openpgp-proofs.content.php delete mode 100644 views/guides/openpgp-proofs.title.php delete mode 100644 views/guides/pixelfed.content.php delete mode 100644 views/guides/pixelfed.title.php delete mode 100644 views/guides/pleroma.content.php delete mode 100644 views/guides/pleroma.title.php delete mode 100644 views/guides/proofs.content.php delete mode 100644 views/guides/proofs.title.php delete mode 100644 views/guides/reddit.content.php delete mode 100644 views/guides/reddit.title.php delete mode 100644 views/guides/self-hosting-keyoxide.content.php delete mode 100644 views/guides/self-hosting-keyoxide.title.php delete mode 100644 views/guides/service-provider.content.php delete mode 100644 views/guides/service-provider.title.php delete mode 100644 views/guides/twitter.content.php delete mode 100644 views/guides/twitter.title.php delete mode 100644 views/guides/verify.content.php delete mode 100644 views/guides/verify.title.php delete mode 100644 views/guides/web-key-directory.content.php delete mode 100644 views/guides/web-key-directory.title.php delete mode 100644 views/guides/xmpp.content.php delete mode 100644 views/guides/xmpp.title.php diff --git a/guides/contributing.md b/guides/contributing.md new file mode 100644 index 0000000..dc162da --- /dev/null +++ b/guides/contributing.md @@ -0,0 +1,20 @@ +# Contributing to Keyoxide + +Keyoxide is more than this website. It's a project that aims to make cryptography more accessible to everyone. Keyoxide is part of a larger community of people working hard to develop tools that add privacy and security to our digital online lives. Remember: privacy is not a luxury. + +## As a developer + +As Keyoxide is an open-source project licensed under the permissive [MIT License](https://codeberg.org/keyoxide/web/src/branch/main/LICENSE), everyone is welcome and encouraged to contribute. This can be done in various forms: + +* [Open an issue](https://codeberg.org/keyoxide/web/issues) to request changes, new features or simply get help. +* [Open a PR](https://codeberg.org/keyoxide/web/pulls) to directly integrate your own changes and new features. + +## Not a developer? + +Not a developer? Not a problem? You could: + +* Learn more about the importance of online privacy and security and advocate for it (much needed!) +* Write guides for others and help each other out. +* Start using decentralized OpenPGP identity keys. +* Spread the word about Keyoxide and OpenPGP keys in general. +* Talk to persons you know using siloed or closed-source alternatives to Keyoxide. diff --git a/guides/devto.md b/guides/devto.md new file mode 100644 index 0000000..abc4a09 --- /dev/null +++ b/guides/devto.md @@ -0,0 +1,41 @@ +# Adding a dev.to proof + +Let's add a decentralized dev.to proof to your OpenPGP keys. + +[[toc]] + +## Post a dev.to proof message + +Log in to [dev.to](https://dev.to) and create a new post with the following text (make sure to replace FINGERPRINT and USERNAME): + +``` +This is an OpenPGP proof that connects [my OpenPGP key](https://keyoxide.org/FINGERPRINT) to [this dev.to account](https://dev.to/USERNAME). For details check out https://keyoxide.org/guides/openpgp-proofs + +[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT] +``` + +After posting, copy the link to the post. + +## Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to update with the link to the post copied above): + +`proof@metacode.biz=https://dev.to/USERNAME/POST_TITLE` + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` + +And you're done! Reload your profile page, it should now show a verified dev.to account. diff --git a/guides/discourse.md b/guides/discourse.md new file mode 100644 index 0000000..a6f065a --- /dev/null +++ b/guides/discourse.md @@ -0,0 +1,41 @@ +# Adding a Discourse proof + +Let's add a decentralized Discourse proof to your OpenPGP keys. + +[[toc]] + +## Update the Discourse account + +Log in to the discourse instance website and add the following text to your **About me** (make sure to replace FINGERPRINT): + +``` +This is an OpenPGP proof that connects my OpenPGP key to this Discourse account. For details check out https://keyoxide.org/guides/openpgp-proofs + +[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT] +``` + +After posting, copy the link to your profile page (it should end with your **/u/USERNAME**). + +## Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to replace PROFILE_URL with the link to the profile copied above): + +`proof@metacode.biz=PROFILE_URL` + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` + +And you're done! Reload your profile page, it should now show a verified Discourse account. diff --git a/guides/dns.md b/guides/dns.md new file mode 100644 index 0000000..56f9721 --- /dev/null +++ b/guides/dns.md @@ -0,0 +1,35 @@ +# Adding a DNS proof + +Let's add a decentralized DNS proof to your OpenPGP keys. + +[[toc]] + +## Update DNS records for your website + +Add the following TXT record to the DNS records of the (sub)domain you want to prove control over (make sure to replace FINGERPRINT): + +`openpgp4fpr:FINGERPRINT` + +No specific TTL value is required. + +## Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to replace DOMAIN, don't include https://): + +`proof@metacode.biz=dns:DOMAIN?type=TXT` + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` diff --git a/guides/encrypt.md b/guides/encrypt.md new file mode 100644 index 0000000..7bfe1c9 --- /dev/null +++ b/guides/encrypt.md @@ -0,0 +1,27 @@ +# Encrypting a message + +Let's see how to encrypt a message. + +[[toc]] + +## Obtain a public key for encryption + +The idea is that you use someone's public key to encrypt a message. From then on, the message cannot be decrypted and read by anyone but the person possessing the private keys associated with the public key (they'll have the same fingerprint). + +If you already have a public key (or its fingerprint) you would like to use to encrypt a message, great! If not, you could use the following fingerprint: + +`9f0048ac0b23301e1f77e994909f6bd6f80f485d` + +## Encrypt a message + +Open the [keyoxide.org/encrypt](/encrypt) page and paste the fingerprint in the **Email / key id / fingerprint** field. + +Write a message in the **Message** field. Scroll down and press the **ENCRYPT MESSAGE** button. + +You have successfully encrypted the message! The encrypted message in the **Message** field can safely be sent via unsecured communication channels knowing that only the person possessing the private key associated with that fingerprint can read it. + +## Going further + +You could try using different mechanisms of fetching keys, such as **web key directory** or copy-pasting a plaintext public key. + +If you'd like to receive PGP encrypted messages, you must first learn the fundamentals of PGP and how to generate and handle your own keypair. diff --git a/guides/feature-comparison-keybase.md b/guides/feature-comparison-keybase.md new file mode 100644 index 0000000..df8eadf --- /dev/null +++ b/guides/feature-comparison-keybase.md @@ -0,0 +1,41 @@ +# Feature comparison with Keybase + +Let's see how Keyoxide's features compare to those of Keybase. + +[[toc]] + +## Encrypt and verify + +Both Keyoxide and Keybase allow easy encryption of data and verification of signatures. While Keybase can only perform these actions for their users who uploaded at least a public key to their servers, Keyoxide can do this for any key on the internet, whether it's available through web key directory, dedicated key servers or simply copy-pasting a plaintext key. + +## Decrypt and sign + +Keyoxide cannot decrypt data or sign messages. + +Keybase can do both of those things but this should NOT be considered a feature. It requires one to upload their private key to closed-source servers which is an act in stark contradiction with all safety precautions any owner of a private key should aim to heed. + +## Online identity proofs + +Both Keyoxide and Keybase allow the user to generate proofs of online identity on various platforms. The difference lies in the method of generation and the implications this has on security. + +Keybase generates a signed message to be posted by the to-be-verified account. Since this involves a signature, any signing key can be used. If a signing key gets misappropriated, it becomes easy for a bad actor to create fake identity proofs. + +Keyoxide uses decentralized OpenPGP proofs in which the identity proofs are stored as notations within the keys themselves. This is only possible when you have access to keys with "certification" capability. As these are the most valuable of keys, they should also be handled more securely than signing keys and are therefore less prone to forgery of identity proofs. + +## Social network and additional services + +Keybase provides an additional social network, chat functionality, encrypted drive, encrypted git, XLM crypto wallet and much more. + +Keyoxide has none of that. Just keys and proofs. + +## Openness + +Keyoxide is fully open-source. It consists mainly of a client component which is the browser. The supporting server functions are open-source as well. + +Keybase has open-source clients but closed-source servers. + +## Data safety + +Keyoxide lets the user's devices do almost all of the heavy lifting, meaning no data is ever sent to a server to perform any of the actions. Only exceptions to this rule are a couple of "proxy scripts" for proofs that cannot be verified by a browser. These proxy scripts are open-source as well and inspectable by all. + +Keybase servers are closed-source. One does not know what happens inside that black box. diff --git a/guides/github.md b/guides/github.md new file mode 100644 index 0000000..7840419 --- /dev/null +++ b/guides/github.md @@ -0,0 +1,43 @@ +# Adding a Github proof + +Let's add a decentralized Github proof to your OpenPGP keys. + +[[toc]] + +## Post a Github proof message + +Log in to [github.com](https://github.com) and click on **New gist**. + +Name the file **openpgp.md** and copy the following content into it (make sure to replace FINGERPRINT and USERNAME): + +``` +This is an OpenPGP proof that connects [my OpenPGP key](https://keyoxide.org/FINGERPRINT) to [this Github account](https://github.com/USERNAME). For details check out https://keyoxide.org/guides/openpgp-proofs + +[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT] +``` + +After creating a public gist, copy the link to the gist. + +## Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to update with the link to the post copied above): + +`proof@metacode.biz=https://gist.github.com/USERNAME/12345678912345678912345678912345` + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` + +And you're done! Reload your profile page, it should now show a verified Github account. diff --git a/guides/hackernews.md b/guides/hackernews.md new file mode 100644 index 0000000..097f89a --- /dev/null +++ b/guides/hackernews.md @@ -0,0 +1,41 @@ +# Adding a Hackernews proof + +Let's add a decentralized Hackernews proof to your OpenPGP keys. + +[[toc]] + +## Update the Hackernews account + +Log in to [Hackernews](https://news.ycombinator.com) and click on your **username**. + +Add the following lines to your **about** (make sure to replace FINGERPRINT): + +``` +This is an OpenPGP proof that connects my OpenPGP key to this Hackernews account. For details check out https://keyoxide.org/guides/openpgp-proofs + +[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT] +``` + +## Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to replace USERNAME): + +`proof@metacode.biz=https://news.ycombinator.com/user?id=USERNAME` + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` + +And you're done! Reload your profile page, it should now show a verified Hackernews account. diff --git a/guides/lobsters.md b/guides/lobsters.md new file mode 100644 index 0000000..0f39e56 --- /dev/null +++ b/guides/lobsters.md @@ -0,0 +1,39 @@ +# Adding a Lobste.rs proof + +Let's add a decentralized Lobste.rs proof to your OpenPGP keys. + +[[toc]] + +## Update the Lobste.rs account + +Log in to [Lobste.rs](https://lobste.rs) and append the following text to the **About** section (make sure to replace FINGERPRINT): + +``` +This is an OpenPGP proof that connects my OpenPGP key to this Lobste.rs account. For details check out https://keyoxide.org/guides/openpgp-proofs + +[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT] +``` + +## Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to replace USERNAME): + +`proof@metacode.biz=https://lobste.rs/u/USERNAME` + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` + +And you're done! Reload your profile page, it should now show a verified Lobste.rs account. diff --git a/guides/managing-proofs-deleting.md b/guides/managing-proofs-deleting.md new file mode 100644 index 0000000..a52bdb3 --- /dev/null +++ b/guides/managing-proofs-deleting.md @@ -0,0 +1,45 @@ +# Deleting Proofs using GnuPG + +Over time, you may need to delete proofs. Changing proofs can be achieved by deleting proofs and adding new ones. + +## Delete all proofs + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Launch the notation prompt: + +`notation` + +Enter the 'none' notation to delete all notations: + +`none` + +Save the changes: + +`save` + +## Delete one of your proofs + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Launch the notation prompt: + +`notation` + +Enter the **-** (minus) symbol followed by the proof you want to delete. Make sure you type the proof exactly like it is in your key. + +`-proof@metacode.biz=dns:yourdomain.org?type=TXT` + +_To make it easier to enter the right proof, you could first [list all proofs](managing-proofs-listing) and simply copy the proof (including "proof@metacode.biz=") you want to delete._ + +Save the changes: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` diff --git a/guides/managing-proofs-listing.md b/guides/managing-proofs-listing.md new file mode 100644 index 0000000..ee0d03c --- /dev/null +++ b/guides/managing-proofs-listing.md @@ -0,0 +1,29 @@ +# Listing Proofs using GnuPG + +Let's list the identity proofs stored in our OpenPGP keys. + +## Listing notations in GnuPG + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +List detailed preferences: + +`showpref` + +You should now see your key details, uid, and proofs assigned to your keys: + +``` +[ultimate] (1). Your Name + Cipher: AES256, AES192, AES, 3DES + Digest: SHA512, SHA384, SHA256, SHA1 + Compression: ZLIB, BZIP2, ZIP, Uncompressed + Features: MDC, Keyserver no-modify + Notations: proof@metacode.biz=https://gist.github.com/youruser/somehash + proof@metacode.biz=dns:yourdomain.org?type=TXT +``` + +Exit gpg: + +`quit` diff --git a/guides/mastodon.md b/guides/mastodon.md new file mode 100644 index 0000000..08bbb46 --- /dev/null +++ b/guides/mastodon.md @@ -0,0 +1,35 @@ +# Adding a Mastodon proof + +Let's add a decentralized Mastodon proof to your OpenPGP keys. + +[[toc]] + +## Update the Mastodon account + +Log in to your Mastodon instance and click on **Edit profile**. + +Add a new item under **Profile metadata** with the label **OpenPGP** and your PGP fingerprint as the content. + +## Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to update the link): + +`proof@metacode.biz=https://INSTANCE.ORG/@USERNAME` + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` + +And you're done! Reload your profile page, it should now show a verified Mastodon account. diff --git a/guides/migrating-from-keybase.md b/guides/migrating-from-keybase.md new file mode 100644 index 0000000..eff9f7e --- /dev/null +++ b/guides/migrating-from-keybase.md @@ -0,0 +1,25 @@ +# Migrating from Keybase + +Let's see how easy it is to get a Keyoxide profile when you already have a Keybase account. + +[[toc]] + +## Claim your Keyoxide profile + +Go to the [profile URL generator](/util/profile-url), set Keybase as Source and follow the Keybase specific instructions. Has a profile URL been generated? Congratulations, you now have your very own Keyoxide profile! + +## Actually migrating to Keyoxide + +Unfortunately, you get very little control when using your Keybase key directly. You will need to generate your own PGP keypair (use guides like [this one](https://spin.atomicobject.com/2013/11/24/secure-gpg-keys-guide/) for help) to unlock the full potential of [distributed identity proofs](/guides/proofs). + +Have you generated a keypair and made the public key accessible through [web key directory (WKD)](/guides/web-key-directory) or uploaded it to [keys.openpgp.org](https://keys.openpgp.org/)? Use the [profile URL generator](/util/profile-url) to get your own profile URL and [start adding identity proofs](/guides). + +## Keyoxide as a partial replacement for Keybase + +It's important to moderate expectations and state that [Keyoxide](/) only replaces the subset of Keybase features that are considered the "core" features: message encryption, signature verification and identity proofs. + +Message decryption and signing are **not** supported features: they would require you to upload your secret key to a website which is a big **no-no**. + +Encrypted chat and cloud storage are **not** supported features: there are plenty of dedicated alternative services. + +If you need any of these Keybase-specific supports, [Keyoxide](/) may not be a full Keybase replacement for you but you could still generate a profile and take advantage of **distributed identity proofs**. diff --git a/guides/openpgp-proofs.md b/guides/openpgp-proofs.md new file mode 100644 index 0000000..49dd657 --- /dev/null +++ b/guides/openpgp-proofs.md @@ -0,0 +1,35 @@ +# How OpenPGP identity proofs work + +[[toc]] + +## Decentralized OpenPGP identity proofs + +Decentralized OpenPGP identity proofs are the brainchild of Wiktor who wrote the original guide on [his website](https://metacode.biz/openpgp/proofs) (a suggested read to get first-hand information). + +Unlike proofs provided by for example [Keybase](https://keybase.io), OpenPGP proofs are stored inside the PGP keys themselves instead of being mere signatures. Since this operation requires keys with "certify" capabilities and not simply "sign" capabilities, these OpenPGP proofs could be considered more secure. + +## Example + +* Alice and Bob have been talking for years on service A. Alice already has an account on service B. Bob wants to move to service B as well. A simple decentralized proof confirms that the person who is known as Alice on service A is also known as Alice on service B. Bob can safely move to service B and talk to Alice without having to meet in person to confirm their accounts. +* Alice has received a friend request from Bob29 on service C. Is this the same Bob from service A or not? A simple decentralized proof confirms that the person who is known as Bob on platform A is also known as Bob29 on service C. Turns out 28 Bobs were already using service C. +* Bob has been invited by an account named Alyce to create an account on an unknown server. Is this a legit request? A simple decentralized proof tells Bob that Alice does not have such an account. Bob knows something is up and does not click the link possibly sent by an imposter. + +## What an OpenPGP proof looks like + +Every OpenPGP identity proof is stored in the PGP key as a notation that looks like this: + +`proof@metacode.biz=https://twitter.com/USERNAME/status/1234567891234567891` + +This particular proof is for a Twitter account (read more in the [Twitter guide](/guides/twitter)). Let's analyse the notation: + +* **proof** means the current notation is for an identity proof. +* **@metacode.biz** is the domain of the person who came up with OpenPGP proofs and serves as a namespace for the notation. The domain is included and used for all proofs to comply with the [OpenPGP Message Format standard (RFC 4880)](https://tools.ietf.org/html/rfc4880#section-5.2.3.16). +* **https://twitter.com/USERNAME/status/1234567891234567891** is the value of the notation. It is a link to the piece of online content that contains a pre-defined message which must always include the fingerprint of the PGP key that will hold the proof. + +The proof should always link to a document that can be parsed as JSON to make the verification easy and feasible by the browser. Sometimes however, due to CORS restrictions or API requirements (as is the case for Twitter), no such link is provided by the platform. In these rare exceptional cases, the verification process is delegated to the Keyoxide server which will communicate directly with the platform's servers to get the content of the post. + +## Your turn + +If you'd like to add decentralized OpenPGP identity proofs to your key, go to the [guides](/guides) and find the right one for your platform of choice. You may find the process to be remarkably easy. + +If your platform is not in the list of [guides](/guides), it's not supported yet. See the [contributing guide](/guides/contributing) for more information on how to get that platform supported. diff --git a/guides/pixelfed.md b/guides/pixelfed.md new file mode 100644 index 0000000..c5b3df0 --- /dev/null +++ b/guides/pixelfed.md @@ -0,0 +1,41 @@ +# Adding a Pixelfed proof + +Let's add a decentralized Pixelfed proof to your OpenPGP keys. + +[[toc]] + +## Update the Pixelfed account + +Log in to your Pixelfed instance and add the following lines to your **Bio** (make sure to replace FINGERPRINT): + +``` +This is an OpenPGP proof that connects my OpenPGP key to this Pixelfed account. For details check out https://keyoxide.org/guides/openpgp-proofs + +[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT] +``` + +## Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to update the link): + +`proof@metacode.biz=https://INSTANCE.ORG/users/USERNAME` + +Please note that the **/users/** part of the URL is mandatory for the proof to work. + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` + +And you're done! Reload your profile page, it should now show a verified Fediverse account (Pixelfed is part of the [Fediverse](#https://en.wikipedia.org/wiki/Fediverse)). diff --git a/guides/pleroma.md b/guides/pleroma.md new file mode 100644 index 0000000..27d614d --- /dev/null +++ b/guides/pleroma.md @@ -0,0 +1,41 @@ +# Adding a Pleroma proof + +Let's add a decentralized Pleroma proof to your OpenPGP keys. + +[[toc]] + +## Update the Pleroma account + +Log in to your Pleroma instance and add the following lines to your **Bio** (make sure to replace FINGERPRINT): + +``` +This is an OpenPGP proof that connects my OpenPGP key to this Pleroma account. For details check out https://keyoxide.org/guides/openpgp-proofs + +[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT] +``` + +## Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to update the link): + +`proof@metacode.biz=https://INSTANCE.ORG/users/USERNAME` + +Please note that the **/users/** part of the URL is mandatory for the proof to work. + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` + +And you're done! Reload your profile page, it should now show a verified Fediverse account (Pleroma is part of the [Fediverse](#https://en.wikipedia.org/wiki/Fediverse)). diff --git a/guides/proofs.md b/guides/proofs.md new file mode 100644 index 0000000..8670934 --- /dev/null +++ b/guides/proofs.md @@ -0,0 +1,29 @@ +# Verifying identity proofs + +Let's see how to verify identity proofs. + +[[toc]] + +## Obtain a public key for verification + +The idea is that anyone can add identity proofs of various platforms in their keys. Since this information is kept in the public key, you could take anyone's public key and check whether they indeed have control over the accounts they claim to. + +If you already have a public key (or its fingerprint) with OpenPGP identity proofs you would like to use to verify, great! If not, you could use the following fingerprint: + +`9f0048ac0b23301e1f77e994909f6bd6f80f485d` + +## Verify proofs + +Open the [keyoxide.org/proofs](/proofs) page and paste the fingerprint in the **Email / key id / fingerprint** field. Scroll down and press the **VERIFY PROOFS** button. + +You now see a list of domains and/or accounts on platforms for which the owner of the public key claims to have an control over. + +If the last link on a line says **proof**, the proof could not be verified for any number of reasons but Keyoxide still allows to check the supposed proof and decide for yourself whether you trust the claim. If the + +If the last link on a line says **verified**, the owner of the public key indeed has shown beyond doubt that it has control over the domain or account. + +## Your turn + +If you'd like to add decentralized OpenPGP identity proofs to your key, go to the [guides](/guides) and find the right one for your platform of choice. You may find the process to be remarkably easy. + +If your platform is not in the list of [guides](/guides), it's not supported yet. See the [contributing guide](/guides/contributing) for more information on how to get that platform supported. diff --git a/guides/reddit.md b/guides/reddit.md new file mode 100644 index 0000000..8f4cfb4 --- /dev/null +++ b/guides/reddit.md @@ -0,0 +1,41 @@ +# Adding a Reddit proof + +Let's add a decentralized Reddit proof to your OpenPGP keys. + +[[toc]] + +## Post a Reddit proof message + +Log in to [www.reddit.com](https://www.reddit.com) and create a new post with the following text (make sure to replace FINGERPRINT): + +``` +This is an OpenPGP proof that connects my OpenPGP key to this Reddit account. For details check out https://keyoxide.org/guides/openpgp-proofs + +[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT] +``` + +After posting, copy the link to the post. + +## Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to update with the link to the post copied above): + +`proof@metacode.biz=https://www.reddit.com/user/USERNAME/comments/123123/TITLE/` + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` + +And you're done! Reload your profile page, it should now show a verified Reddit account. diff --git a/guides/self-hosting-keyoxide.md b/guides/self-hosting-keyoxide.md new file mode 100644 index 0000000..b9d168a --- /dev/null +++ b/guides/self-hosting-keyoxide.md @@ -0,0 +1,7 @@ +# Self-hosting Keyoxide + +Though it's not a fully supported use case yet, anyone can take the [source code](https://codeberg.org/keyoxide/web) and put it on their own server. The idea is that [Keyoxide.org](https://keyoxide.org) is not special in itself. After all, all the heavy lifting is done by the browser. So the role of any individual Keyoxide server is to get the tool in the hands of the end user. + +The few supporting roles the server has can easily be performed by any other (PHP) server. + +So if you like the project but perhaps are mistrusting of servers of others, especially when it comes to keypairs, here's the [source code](https://codeberg.org/keyoxide/web) and put it on your own server. Thanks for using the project! diff --git a/guides/service-provider.md b/guides/service-provider.md new file mode 100644 index 0000000..4e22810 --- /dev/null +++ b/guides/service-provider.md @@ -0,0 +1,13 @@ +# Are you a service provider? + +If you have: + +* a website that allows users to create accounts +* a messaging platform +* any other type of service that may require users to prove their online identity + +Then you may be interested in supporting decentralized identity proofs as they allow your users to securely prove their identity across services. Take a look at this [example](guides/service-provider) to find out how two persons can gain more confidence in knowing they are talking to and interacting with the right person in an online world where impersonating is all too easy. + +The internet could be a slightly safer place if your service allowed your users to prove their identity. All the service needs to do is make a JSON file available with basic details about the user and set the correct CORS headers. + +The [documentation](https://github.com/wiktor-k/openpgp-proofs#for-service-providers) on what is precisely required is provided by the original creator of decentralized OpenPGP identity proofs. diff --git a/guides/twitter.md b/guides/twitter.md new file mode 100644 index 0000000..8de40fb --- /dev/null +++ b/guides/twitter.md @@ -0,0 +1,41 @@ +# Adding a Twitter proof + +Let's add a decentralized Twitter proof to your OpenPGP keys. + +[[toc]] + +## Post a Twitter proof message + +Log in to [twitter.com](https://twitter.com) and compose a new tweet with the following text (make sure to replace FINGERPRINT): + +``` +This is an OpenPGP proof that connects my OpenPGP key to this Twitter account. For details check out https://keyoxide.org/guides/openpgp-proofs + +[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT] +``` + +After posting, copy the link to the tweet. + +## Update the PGP key + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to update with the link to the tweet copied above): + +`proof@metacode.biz=https://twitter.com/USERNAME/status/1234567891234567891` + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` + +And you're done! Reload your profile page, it should now show a verified Twitter account. diff --git a/guides/verify.md b/guides/verify.md new file mode 100644 index 0000000..f57b873 --- /dev/null +++ b/guides/verify.md @@ -0,0 +1,63 @@ +# Verifying a signature + +Let's see how to verify an OpenPGP signature. + +[[toc]] + +## Obtain a signature + +If you already have a signature you would like to verify, great! If not, let's use the following signature for the guide: + +``` +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA256 + +I like pineapple. +-----BEGIN PGP SIGNATURE----- + +iQJDBAEBCAAtFiEEog/Pt4tEmnyVrrtlNzZ/SvQIetEFAl70mVUPHHlhcm1vQHlh +cm1vLmV1AAoJEDc2f0r0CHrRQXIP/08uza9zOtmZXv5K+uPGVzDKwkgPgZJEezX7 +6iQ358f1pjSRvYfQ5aB13k2epUHoqCKArMYu1zPqxhvLvvAvp8uOHABnr9NGL3El +u7UUgaeUNHkr0gxCKEq3p81abrrbbWveP8OBP4RyxmaFx13Xcj7mfDluiBHmjVvv +WU09EdH9VPlJ7WfZ+2G2ZZDHuE5XiaeP7ocugTxXXLkp33zwpDX0+ZuCIXM6fQGe +OccSffglFPdNBnfasuuxDWxTQPsEbWGOPJV+CAPmBDeApX+TBF9bovO3hw4Uozk2 +VT7EAy8Hb0SOrUb3UNGxzoKv++5676IxyB4JXX0Tr9O4ZxhO8o9pEEHwirtn/J1+ +MWven4gVlWM/6bMeUqx6ydyNc2nqF5059yfRmwGMlp09x82G4x1bcf6aDZ+5njDG +fS5T2OpXRIkZHJx8BhmZjsxiDR0KV44zwHpt06+96ef3EDWB0BcP6M+a5Rtc33zf +irRmQd2M6RLyXCYtdGIiiAFRuomw802U4F0P4LwVrZdbGA6ObqBv1k8BUFCMbMz8 +Ab4hF7kO4z0Vh3JaKzcHey0pOzdNCPpAHZ51sAoAnFDM4PdMBgQxxVweCMu4KYMZ +FN8sNn42oY/b7gDmwCelVhgD+rvUn/a8+B7CDmCp+wIquyrjrTt00voATcb+ZPMJ +pTXJ/NcM +=rqTX +-----END PGP SIGNATURE----- +``` + +Copy the above signature. + +## Verify the signature + +Open the [keyoxide.org/verify](/verify) page and paste the signature in the corresponding field. Scroll down and press the **VERIFY SIGNATURE** button. + +Keyoxide lets you know the signature was verified and signed by a certain person. + +## Verify the signature against a specific public key + +Sometimes, you want to know if a specific person or public key was used to create a signature. In this case, let's figure out if the message was signed by Yarmo's public key or his friend Wiktor's public key. + +Copy the following fingerprint: + +`653909A2F0E37C106F5FAF546C8857E0D8E8F074` + +Paste it in the **Email / key id / fingerprint** field under **Public Key (3: HKP server)** and press the big button again. It could not be verified. Guess it wasn't Wiktor who signed that message. + +Now, copy the following fingerprint: + +`9f0048ac0b23301e1f77e994909f6bd6f80f485d` + +Paste it in the same field and press the big button again. It did verify! It was Yarmo all along. + +## Going further + +You could try using different mechanisms of fetching keys, such as **web key directory** or copy-pasting a plaintext public key. + +If you'd like to sign messages using PGP, you must first learn the fundamentals of PGP and how to generate and handle your own keypair. diff --git a/guides/web-key-directory.md b/guides/web-key-directory.md new file mode 100644 index 0000000..6c034de --- /dev/null +++ b/guides/web-key-directory.md @@ -0,0 +1,43 @@ +# Uploading keys using web key directory + +[[toc]] + +## Web key directory + +[Web key directory](https://datatracker.ietf.org/doc/draft-koch-openpgp-webkey-service/) or WKD refers to the method of uploading one's public key to their website in a specific location to make it easily accessible by other services supporting WKD. The key will be discoverable using an identifier similar to an email address: **username@domain.org**. + +The benefit of WKD is having full control over the key while still having it widely available. It does however require a domain and some form of file hosting. Luckily, [openpgp.org](https://keys.openpgp.org/about/usage#wkd-as-a-service) have made a WKD-as-a-service. Read more at the end of the guide. + +It exists in two variants: the Direct setup and the Advanced setup. Despite their names, both require roughly the same steps. + +## The Direct setup + +To make your keys available via WKD using the Direct setup, you'll need two paths on your server: + +**https://domain.org/.well-known/openpgpkey/policy**: this is an empty file + +**https://domain.org/.well-known/openpgpkey/hu/LOCALPART**: this is the binary public key (so NOT ASCII armored) + +The LOCALPART above is actually the username hashed using the SHA-1 algorithm and encoded using the Z-Base-32 method. As it's not humanly possible to compute this by ourselves, Keyoxide provides a [small utility to do this for you](/util/wkd). + +So if you wish to make your key available as **jimothy@dm.com**, according to the [small utility](/util/wkd), the URL would become: + +`https://dm.com/.well-known/openpgpkey/hu/n9utc41qty791upt63rm5xtiudabmw6m` + +## The Advanced setup + +While not necessary if the Direct setup works, there is a second setup to make WKD work: the Advanced setup. The paths needed are: + +**https://openpgpkey.domain.org/.well-known/openpgpkey/domain.org/policy**: this is an empty file + +**https://openpgpkey.domain.org/.well-known/openpgpkey/domain.org/hu/LOCALPART**: this is the binary public key (so NOT ASCII armored) + +Indeed, quite similar to the Direct setup, except for the **openpgpkey** subdomain and the additional **domain.org** in the path of the public key. + +The public key for **jimothy@dm.com** would be available at: + +`https://openpgpkey.dm.com/.well-known/openpgpkey/hu/dm.com/n9utc41qty791upt63rm5xtiudabmw6m` + +## WKD-as-a-service + +In case hosting is problem, Openpgp.org has a handy [WKD-as-a-service](https://keys.openpgp.org/about/usage#wkd-as-a-service). diff --git a/guides/xmpp.md b/guides/xmpp.md new file mode 100644 index 0000000..4c29f44 --- /dev/null +++ b/guides/xmpp.md @@ -0,0 +1,55 @@ +# Adding a XMPP proof + +Let's add a decentralized XMPP proof to your OpenPGP keys. + +[[toc]] + +### Add a message to your XMPP vCard + +Using a XMPP client that supports editing the vCard (such as [Dino](https://dino.im/) and [Gajim](https://gajim.org/)), append the following message to the **About** section (make sure to replace FINGERPRINT): + +``` +This is an OpenPGP proof that connects my OpenPGP key to this XMPP account. For details check out https://keyoxide.org/guides/openpgp-proofs + +[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT] +``` + +### Update the PGP key (basic edition) + +First, edit the key (make sure to replace FINGERPRINT): + +`gpg --edit-key FINGERPRINT` + +Add a new notation: + +`notation` + +Enter the notation (make sure to replace XMPP-ID): + +`proof@metacode.biz=xmpp:XMPP-ID` + +The XMPP-ID looks something like an email address: **user@domain.org**. + +Save the key: + +`save` + +Upload the key to WKD or use the following command to upload the key to [keys.openpgp.org](https://keys.openpgp.org) (make sure to replace FINGERPRINT): + +`gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT` + +And you're done! Reload your profile page, it should now show a XMPP account. + +### Update the PGP key (OMEMO edition) + +XMPP communication can be end-to-end encrypted with [OMEMO](https://conversations.im/omemo/). Verifying OMEMO fingerprints is essential to trust your communication and keep it safe from Man-in-the-Middle attacks. + +**Keyoxide** makes the fingerprint verification process easy for all. Add a special identity proof that not only contains your XMPP-ID but also the fingerprints of all your OMEMO keys. + +If your XMPP identity proof is verified, a QR code is shown. Anyone can scan this QR code using XMPP apps like [Conversations](https://conversations.im/) (free on [F-Droid](https://f-droid.org/en/packages/eu.siacs.conversations/)) to not only add you as a contact, but also verify your OMEMO keys with the highest level of trust. + +Making this identity proof yourself can be a tad difficult when using clients like Gajim, but luckily for us, [Conversations](https://conversations.im/) can directly generate the proof by going to **Account details > Share > Share as XMPP URI**. The resulting URI should look something like: + +`xmpp:user@domain.org?omemo-sid-123456789=A1B2C3D4E5F6G7H8I9...` + +To take advantage of the easy and secure XMPP identity proof including OMEMO fingerprints, follow the **basic edition** guide above but replace XMPP-ID with the URI obtained through the **Conversations** app. diff --git a/views/guides/contributing.content.php b/views/guides/contributing.content.php deleted file mode 100644 index 9c4050b..0000000 --- a/views/guides/contributing.content.php +++ /dev/null @@ -1,51 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Keyoxide is more than this website. It's a project that aims to make cryptography more accessible to everyone. Keyoxide is part of a larger community of people working hard to develop tools that add privacy and security to our digital online lives. Remember: privacy is not a luxury.

- -

As a developer

- -

As Keyoxide is an open-source project licensed under the permissive MIT License, everyone is welcome and encouraged to contribute. This can be done in various forms:

- -
    -
  • Open an issue to request changes, new features or simply get help.
  • -
  • Open a PR to directly integrate your own changes and new features.
  • -
- -

Not a developer?

- -

Not a developer? Not a problem? You could:

- -
    -
  • Learn more about the importance of online privacy and security and advocate for it (much needed!)
  • -
  • Write guides for others and help each other out.
  • -
  • Start using decentralized OpenPGP identity keys.
  • -
  • Spread the word about Keyoxide and OpenPGP keys in general.
  • -
  • Talk to persons you know using siloed or closed-source alternatives to Keyoxide.
  • -
diff --git a/views/guides/contributing.title.php b/views/guides/contributing.title.php deleted file mode 100644 index 30c816f..0000000 --- a/views/guides/contributing.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Contributing to Keyoxide diff --git a/views/guides/devto.content.php b/views/guides/devto.content.php deleted file mode 100644 index 924c9b8..0000000 --- a/views/guides/devto.content.php +++ /dev/null @@ -1,58 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized dev.to proof to your OpenPGP keys.

- -

Post a dev.to proof message

- -

Log in to dev.to and create a new post with the following text (make sure to replace FINGERPRINT and USERNAME):

-This is an OpenPGP proof that connects [my OpenPGP key](https://keyoxide.org/FINGERPRINT) to [this dev.to account](https://dev.to/USERNAME). -For details check out https://keyoxide.org/guides/openpgp-proofs -

[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT]
- -

After posting, copy the link to the post.

- -

Update the PGP key

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to update with the link to the post copied above):

-proof@metacode.biz=https://dev.to/USERNAME/POST_TITLE - -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a verified dev.to account.

diff --git a/views/guides/devto.title.php b/views/guides/devto.title.php deleted file mode 100644 index 343cdff..0000000 --- a/views/guides/devto.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a dev.to proof diff --git a/views/guides/discourse.content.php b/views/guides/discourse.content.php deleted file mode 100644 index bcc40c7..0000000 --- a/views/guides/discourse.content.php +++ /dev/null @@ -1,58 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized Discourse proof to your OpenPGP keys.

- -

Update the Discourse account

- -

Log in to the discourse instance website and add the following text to your About me (make sure to replace FINGERPRINT):

-This is an OpenPGP proof that connects my OpenPGP key to this Discourse account. -For details check out https://keyoxide.org/guides/openpgp-proofs -

[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT]
- -

After posting, copy the link to your profile page (it should end with your /u/USERNAME).

- -

Update the PGP key

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to replace PROFILE_URL with the link to the profile copied above):

-proof@metacode.biz=PROFILE_URL - -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a verified Discourse account.

diff --git a/views/guides/discourse.title.php b/views/guides/discourse.title.php deleted file mode 100644 index 37a82ab..0000000 --- a/views/guides/discourse.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a Discourse proof diff --git a/views/guides/dns.content.php b/views/guides/dns.content.php deleted file mode 100644 index 7eaa37e..0000000 --- a/views/guides/dns.content.php +++ /dev/null @@ -1,56 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized DNS proof to your OpenPGP keys.

- -

Update DNS records for your website

- -

Add the following TXT record to the DNS records of the (sub)domain you want to prove control over (make sure to replace FINGERPRINT):

-openpgp4fpr:FINGERPRINT - -

No specific TTL value is required.

- -

Update the PGP key

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to replace DOMAIN, don't include https://):

-proof@metacode.biz=dns:DOMAIN?type=TXT - -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a verified domain.

diff --git a/views/guides/dns.title.php b/views/guides/dns.title.php deleted file mode 100644 index aaad4bf..0000000 --- a/views/guides/dns.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a DNS proof diff --git a/views/guides/encrypt.content.php b/views/guides/encrypt.content.php deleted file mode 100644 index 1b2a62d..0000000 --- a/views/guides/encrypt.content.php +++ /dev/null @@ -1,49 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's see how to encrypt a message.

- -

Obtain a public key for encryption

- -

The idea is that you use someone's public key to encrypt a message. From then on, the message cannot be decrypted and read by anyone but the person possessing the private keys associated with the public key (they'll have the same fingerprint).

- -

If you already have a public key (or its fingerprint) you would like to use to encrypt a message, great! If not, you could use the following fingerprint:

-9f0048ac0b23301e1f77e994909f6bd6f80f485d - -

Encrypt a message

- -

Open the keyoxide.org/encrypt page and paste the fingerprint in the Email / key id / fingerprint field.

-

Write a message in the Message field. Scroll down and press the ENCRYPT MESSAGE button.

-

You have successfully encrypted the message! The encrypted message in the Message field can safely be sent via unsecured communication channels knowing that only the person possessing the private key associated with that fingerprint can read it.

- -

Going further

- -

You could try using different mechanisms of fetching keys, such as web key directory or copy-pasting a plaintext public key.

- -

If you'd like to receive PGP encrypted messages, you must first learn the fundamentals of PGP and how to generate and handle your own keypair.

diff --git a/views/guides/encrypt.title.php b/views/guides/encrypt.title.php deleted file mode 100644 index 737e3d5..0000000 --- a/views/guides/encrypt.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Encrypting a message diff --git a/views/guides/feature-comparison-keybase.content.php b/views/guides/feature-comparison-keybase.content.php deleted file mode 100644 index cfd8590..0000000 --- a/views/guides/feature-comparison-keybase.content.php +++ /dev/null @@ -1,62 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's see how Keyoxide's features compare to those of Keybase.

- -

Encrypt and verify

- -

Both Keyoxide and Keybase allow easy encryption of data and verification of signatures. While Keybase can only perform these actions for their users who uploaded at least a public key to their servers, Keyoxide can do this for any key on the internet, whether it's available through web key directory, dedicated key servers or simply copy-pasting a plaintext key.

- -

Decrypt and sign

- -

Keyoxide cannot decrypt data or sign messages.

-

Keybase can do both of those things but this should NOT be considered a feature. It requires one to upload their private key to closed-source servers which is an act in stark contradiction with all safety precautions any owner of a private key should aim to heed.

- -

Online identity proofs

- -

Both Keyoxide and Keybase allow the user to generate proofs of online identity on various platforms. The difference lies in the method of generation and the implications this has on security.

- -

Keybase generates a signed message to be posted by the to-be-verified account. Since this involves a signature, any signing key can be used. If a signing key gets misappropriated, it becomes easy for a bad actor to create fake identity proofs.

- -

Keyoxide uses decentralized OpenPGP proofs in which the identity proofs are stored as notations within the keys themselves. This is only possible when you have access to keys with "certification" capability. As these are the most valuable of keys, they should also be handled more securely than signing keys and are therefore less prone to forgery of identity proofs.

- -

Social network and additional services

- -

Keybase provides an additional social network, chat functionality, encrypted drive, encrypted git, XLM crypto wallet and much more.

-

Keyoxide has none of that. Just keys and proofs.

- -

Openness

- -

Keyoxide is fully open-source. It consists mainly of a client component which is the browser. The supporting server functions are open-source as well.

-

Keybase has open-source clients but closed-source servers.

- -

Data safety

- -

Keyoxide lets the user's devices do almost all of the heavy lifting, meaning no data is ever sent to a server to perform any of the actions. Only exceptions to this rule are a couple of "proxy scripts" for proofs that cannot be verified by a browser. These proxy scripts are open-source as well and inspectable by all.

-

Keybase servers are closed-source. One does not know what happens inside that black box.

diff --git a/views/guides/feature-comparison-keybase.title.php b/views/guides/feature-comparison-keybase.title.php deleted file mode 100644 index 6abf001..0000000 --- a/views/guides/feature-comparison-keybase.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Feature comparison with Keybase diff --git a/views/guides/github.content.php b/views/guides/github.content.php deleted file mode 100644 index bafcfca..0000000 --- a/views/guides/github.content.php +++ /dev/null @@ -1,60 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized Github proof to your OpenPGP keys.

- -

Post a Github proof message

- -

Log in to github.com and click on New gist.

- -

Name the file openpgp.md and copy the following content into it (make sure to replace FINGERPRINT and USERNAME):

-This is an OpenPGP proof that connects [my OpenPGP key](https://keyoxide.org/FINGERPRINT) to [this Github account](https://github.com/USERNAME). -For details check out https://keyoxide.org/guides/openpgp-proofs -

[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT]
- -

After creating a public gist, copy the link to the gist.

- -

Update the PGP key

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to update with the link to the post copied above):

-proof@metacode.biz=https://gist.github.com/USERNAME/12345678912345678912345678912345 - -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a verified Github account.

diff --git a/views/guides/github.title.php b/views/guides/github.title.php deleted file mode 100644 index b6da803..0000000 --- a/views/guides/github.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a Github proof diff --git a/views/guides/hackernews.content.php b/views/guides/hackernews.content.php deleted file mode 100644 index 5cd12bd..0000000 --- a/views/guides/hackernews.content.php +++ /dev/null @@ -1,58 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized Hackernews proof to your OpenPGP keys.

- -

Update the Hackernews account

- -

Log in to Hackernews and click on your username.

- -

Add the following lines to your about (make sure to replace FINGERPRINT):

-This is an OpenPGP proof that connects my OpenPGP key to this Hackernews account. -For details check out https://keyoxide.org/guides/openpgp-proofs -

[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT]
- -

Update the PGP key

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to replace USERNAME):

-proof@metacode.biz=https://news.ycombinator.com/user?id=USERNAME - -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a verified Hackernews account.

diff --git a/views/guides/hackernews.title.php b/views/guides/hackernews.title.php deleted file mode 100644 index 7839be7..0000000 --- a/views/guides/hackernews.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a Hackernews proof diff --git a/views/guides/lobsters.content.php b/views/guides/lobsters.content.php deleted file mode 100644 index 4701bd6..0000000 --- a/views/guides/lobsters.content.php +++ /dev/null @@ -1,56 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized Lobste.rs proof to your OpenPGP keys.

- -

Update the Lobste.rs account

- -

Log in to Lobste.rs and append the following text to the About section (make sure to replace FINGERPRINT):

-This is an OpenPGP proof that connects my OpenPGP key to this Lobste.rs account. -For details check out https://keyoxide.org/guides/openpgp-proofs -

[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT]
- -

Update the PGP key

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to replace USERNAME):

-proof@metacode.biz=https://lobste.rs/u/USERNAME - -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a verified Lobste.rs account.

diff --git a/views/guides/lobsters.title.php b/views/guides/lobsters.title.php deleted file mode 100644 index 5eef758..0000000 --- a/views/guides/lobsters.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a Lobste.rs proof diff --git a/views/guides/managing-proofs-deleting.content.php b/views/guides/managing-proofs-deleting.content.php deleted file mode 100644 index f397895..0000000 --- a/views/guides/managing-proofs-deleting.content.php +++ /dev/null @@ -1,63 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Over time, you may need to delete proofs. Changing proofs can be achieved by deleting proofs and adding new ones.

- -

Delete all proofs

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Launch the notation prompt:

-notation - -

Enter the 'none' notation to delete all notations:

-none - -

Save the changes:

-save - -

Delete one of your proofs

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Launch the notation prompt:

-notation - -

Enter the - (minus) symbol followed by the proof you want to delete. Make sure you type the proof exactly like it is in your key.

--proof@metacode.biz=dns:yourdomain.org?type=TXT - -

To make it easier to enter the right proof, you could first list all proofs and simply copy the proof (including "proof@metacode.biz=") you want to delete.

- -

Save the changes:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT diff --git a/views/guides/managing-proofs-deleting.title.php b/views/guides/managing-proofs-deleting.title.php deleted file mode 100644 index 19040a5..0000000 --- a/views/guides/managing-proofs-deleting.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Deleting Proofs using GnuPG diff --git a/views/guides/managing-proofs-listing.content.php b/views/guides/managing-proofs-listing.content.php deleted file mode 100644 index 1e5682e..0000000 --- a/views/guides/managing-proofs-listing.content.php +++ /dev/null @@ -1,52 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's list the identity proofs stored in our OpenPGP keys.

- -

Listing notations in GnuPG

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

List detailed preferences:

-showpref - -

You should now see your key details, uid, and proofs assigned to your keys:

- -[ultimate] (1). Your Name - Cipher: AES256, AES192, AES, 3DES - Digest: SHA512, SHA384, SHA256, SHA1 - Compression: ZLIB, BZIP2, ZIP, Uncompressed - Features: MDC, Keyserver no-modify - Notations: proof@metacode.biz=https://gist.github.com/youruser/somehash - proof@metacode.biz=dns:yourdomain.org?type=TXT - - -

Exit gpg:

-quit diff --git a/views/guides/managing-proofs-listing.title.php b/views/guides/managing-proofs-listing.title.php deleted file mode 100644 index a819fe3..0000000 --- a/views/guides/managing-proofs-listing.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Listing Proofs using GnuPG diff --git a/views/guides/mastodon.content.php b/views/guides/mastodon.content.php deleted file mode 100644 index 0b10611..0000000 --- a/views/guides/mastodon.content.php +++ /dev/null @@ -1,54 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized Mastodon proof to your OpenPGP keys.

- -

Update the Mastodon account

- -

Log in to your Mastodon instance and click on Edit profile.

-

Add a new item under Profile metadata with the label OpenPGP and your PGP fingerprint as the content.

- -

Update the PGP key

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to update the link):

-proof@metacode.biz=https://INSTANCE.ORG/@USERNAME - -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a verified Mastodon account.

diff --git a/views/guides/mastodon.title.php b/views/guides/mastodon.title.php deleted file mode 100644 index 8d6e727..0000000 --- a/views/guides/mastodon.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a Mastodon proof diff --git a/views/guides/migrating-from-keybase.content.php b/views/guides/migrating-from-keybase.content.php deleted file mode 100644 index 3ea3763..0000000 --- a/views/guides/migrating-from-keybase.content.php +++ /dev/null @@ -1,50 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's see how easy it is to get a Keyoxide profile when you already have a Keybase account.

- -

Claim your Keyoxide profile

- -

Go to the profile URL generator, set Keybase as Source and follow the Keybase specific instructions. Has a profile URL been generated? Congratulations, you now have your very own Keyoxide profile!

- -

Actually migrating to Keyoxide

- -

Unfortunately, you get very little control when using your Keybase key directly. You will need to generate your own PGP keypair (use guides like this one for help) to unlock the full potential of distributed identity proofs.

- -

Have you generated a keypair and made the public key accessible through web key directory (WKD) or uploaded it to keys.openpgp.org? Use the profile URL generator to get your own profile URL and start adding identity proofs.

- -

Keyoxide as a partial replacement for Keybase

- -

It's important to moderate expectations and state that Keyoxide only replaces the subset of Keybase features that are considered the "core" features: message encryption, signature verification and identity proofs.

- -

Message decryption and signing are not supported features: they would require you to upload your secret key to a website which is a big no-no.

- -

Encrypted chat and cloud storage are not supported features: there are plenty of dedicated alternative services.

- -

If you need any of these Keybase-specific supports, Keyoxide may not be a full Keybase replacement for you but you could still generate a profile and take advantage of distributed identity proofs.

diff --git a/views/guides/migrating-from-keybase.title.php b/views/guides/migrating-from-keybase.title.php deleted file mode 100644 index cccab0f..0000000 --- a/views/guides/migrating-from-keybase.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Migrating from Keybase diff --git a/views/guides/openpgp-proofs.content.php b/views/guides/openpgp-proofs.content.php deleted file mode 100644 index 932f5cc..0000000 --- a/views/guides/openpgp-proofs.content.php +++ /dev/null @@ -1,63 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Decentralized OpenPGP identity proofs

- -

Decentralized OpenPGP identity proofs are the brainchild of Wiktor who wrote the original guide on his website (a suggested read to get first-hand information).

- -

Unlike proofs provided by for example Keybase, OpenPGP proofs are stored inside the PGP keys themselves instead of being mere signatures. Since this operation requires keys with "certify" capabilities and not simply "sign" capabilities, these OpenPGP proofs could be considered more secure.

- -

Example

- -
    -
  • Alice and Bob have been talking for years on service A. Alice already has an account on service B. Bob wants to move to service B as well. A simple decentralized proof confirms that the person who is known as Alice on service A is also known as Alice on service B. Bob can safely move to service B and talk to Alice without having to meet in person to confirm their accounts.
  • -
  • Alice has received a friend request from Bob29 on service C. Is this the same Bob from service A or not? A simple decentralized proof confirms that the person who is known as Bob on platform A is also known as Bob29 on service C. Turns out 28 Bobs were already using service C.
  • -
  • Bob has been invited by an account named Alyce to create an account on an unknown server. Is this a legit request? A simple decentralized proof tells Bob that Alice does not have such an account. Bob knows something is up and does not click the link possibly sent by an imposter.
  • -
- -

What an OpenPGP proof looks like

- -

Every OpenPGP identity proof is stored in the PGP key as a notation that looks like this:

-proof@metacode.biz=https://twitter.com/USERNAME/status/1234567891234567891 - -

This particular proof is for a Twitter account (read more in the Twitter guide). Let's analyse the notation:

- -
    -
  • proof means the current notation is for an identity proof.
  • -
  • @metacode.biz is the domain of the person who came up with OpenPGP proofs and serves as a namespace for the notation. The domain is included and used for all proofs to comply with the OpenPGP Message Format standard (RFC 4880).
  • -
  • https://twitter.com/USERNAME/status/1234567891234567891 is the value of the notation. It is a link to the piece of online content that contains a pre-defined message which must always include the fingerprint of the PGP key that will hold the proof.
  • -
- -

The proof should always link to a document that can be parsed as JSON to make the verification easy and feasible by the browser. Sometimes however, due to CORS restrictions or API requirements (as is the case for Twitter), no such link is provided by the platform. In these rare exceptional cases, the verification process is delegated to the Keyoxide server which will communicate directly with the platform's servers to get the content of the post.

- -

Your turn

- -

If you'd like to add decentralized OpenPGP identity proofs to your key, go to the guides and find the right one for your platform of choice. You may find the process to be remarkably easy.

- -

If your platform is not in the list of guides, it's not supported yet. See the contributing guide for more information on how to get that platform supported.

diff --git a/views/guides/openpgp-proofs.title.php b/views/guides/openpgp-proofs.title.php deleted file mode 100644 index 33c49d6..0000000 --- a/views/guides/openpgp-proofs.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -How OpenPGP identity proofs work diff --git a/views/guides/pixelfed.content.php b/views/guides/pixelfed.content.php deleted file mode 100644 index cce1f78..0000000 --- a/views/guides/pixelfed.content.php +++ /dev/null @@ -1,58 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized Pixelfed proof to your OpenPGP keys.

- -

Update the Pixelfed account

- -

Log in to your Pixelfed instance and add the following lines to your Bio (make sure to replace FINGERPRINT):

-This is an OpenPGP proof that connects my OpenPGP key to this Pixelfed account. -For details check out https://keyoxide.org/guides/openpgp-proofs -

[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT]
- -

Update the PGP key

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to update the link):

-proof@metacode.biz=https://INSTANCE.ORG/users/USERNAME - -

Please note that the /users/ part of the URL is mandatory for the proof to work.

- -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a verified Fediverse account (Pixelfed is part of the Fediverse).

diff --git a/views/guides/pixelfed.title.php b/views/guides/pixelfed.title.php deleted file mode 100644 index 5f9c5a8..0000000 --- a/views/guides/pixelfed.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a Pixelfed proof diff --git a/views/guides/pleroma.content.php b/views/guides/pleroma.content.php deleted file mode 100644 index 86a0e02..0000000 --- a/views/guides/pleroma.content.php +++ /dev/null @@ -1,58 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized Pleroma proof to your OpenPGP keys.

- -

Update the Pleroma account

- -

Log in to your Pleroma instance and add the following lines to your Bio (make sure to replace FINGERPRINT):

-This is an OpenPGP proof that connects my OpenPGP key to this Pleroma account. -For details check out https://keyoxide.org/guides/openpgp-proofs -

[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT]
- -

Update the PGP key

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to update the link):

-proof@metacode.biz=https://INSTANCE.ORG/users/USERNAME - -

Please note that the /users/ part of the URL is mandatory for the proof to work.

- -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a verified Fediverse account (Pleroma is part of the Fediverse).

diff --git a/views/guides/pleroma.title.php b/views/guides/pleroma.title.php deleted file mode 100644 index e43bcfe..0000000 --- a/views/guides/pleroma.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a Pleroma proof diff --git a/views/guides/proofs.content.php b/views/guides/proofs.content.php deleted file mode 100644 index 9ae7faf..0000000 --- a/views/guides/proofs.content.php +++ /dev/null @@ -1,50 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's see how to verify identity proofs.

- -

Obtain a public key for verification

- -

The idea is that anyone can add identity proofs of various platforms in their keys. Since this information is kept in the public key, you could take anyone's public key and check whether they indeed have control over the accounts they claim to.

- -

If you already have a public key (or its fingerprint) with OpenPGP identity proofs you would like to use to verify, great! If not, you could use the following fingerprint:

-9f0048ac0b23301e1f77e994909f6bd6f80f485d - -

Verify proofs

- -

Open the keyoxide.org/proofs page and paste the fingerprint in the Email / key id / fingerprint field. Scroll down and press the VERIFY PROOFS button.

-

You now see a list of domains and/or accounts on platforms for which the owner of the public key claims to have an control over.

-

If the last link on a line says proof, the proof could not be verified for any number of reasons but Keyoxide still allows to check the supposed proof and decide for yourself whether you trust the claim. If the

-

If the last link on a line says verified, the owner of the public key indeed has shown beyond doubt that it has control over the domain or account.

- -

Your turn

- -

If you'd like to add decentralized OpenPGP identity proofs to your key, go to the guides and find the right one for your platform of choice. You may find the process to be remarkably easy.

- -

If your platform is not in the list of guides, it's not supported yet. See the contributing guide for more information on how to get that platform supported.

diff --git a/views/guides/proofs.title.php b/views/guides/proofs.title.php deleted file mode 100644 index 24f9eee..0000000 --- a/views/guides/proofs.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Verifying identity proofs diff --git a/views/guides/reddit.content.php b/views/guides/reddit.content.php deleted file mode 100644 index 241e9db..0000000 --- a/views/guides/reddit.content.php +++ /dev/null @@ -1,58 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized Reddit proof to your OpenPGP keys.

- -

Post a Reddit proof message

- -

Log in to www.reddit.com and create a new post with the following text (make sure to replace FINGERPRINT):

-This is an OpenPGP proof that connects my OpenPGP key to this Reddit account. -For details check out https://keyoxide.org/guides/openpgp-proofs -

[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT]
- -

After posting, copy the link to the post.

- -

Update the PGP key

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to update with the link to the post copied above):

-proof@metacode.biz=https://www.reddit.com/user/USERNAME/comments/123123/TITLE/ - -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a verified Reddit account.

diff --git a/views/guides/reddit.title.php b/views/guides/reddit.title.php deleted file mode 100644 index 8905a41..0000000 --- a/views/guides/reddit.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a Reddit proof diff --git a/views/guides/self-hosting-keyoxide.content.php b/views/guides/self-hosting-keyoxide.content.php deleted file mode 100644 index c648667..0000000 --- a/views/guides/self-hosting-keyoxide.content.php +++ /dev/null @@ -1,34 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Though it's not a fully supported use case yet, anyone can take the source code and put it on their own server. The idea is that Keyoxide.org is not special in itself. After all, all the heavy lifting is done by the browser. So the role of any individual Keyoxide server is to get the tool in the hands of the end user.

- -

The few supporting roles the server has can easily be performed by any other (PHP) server.

- -

So if you like the project but perhaps are mistrusting of servers of others, especially when it comes to keypairs, here's the source code and put it on your own server. Thanks for using the project!

diff --git a/views/guides/self-hosting-keyoxide.title.php b/views/guides/self-hosting-keyoxide.title.php deleted file mode 100644 index 7a68760..0000000 --- a/views/guides/self-hosting-keyoxide.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Self-hosting Keyoxide diff --git a/views/guides/service-provider.content.php b/views/guides/service-provider.content.php deleted file mode 100644 index 4cb2adf..0000000 --- a/views/guides/service-provider.content.php +++ /dev/null @@ -1,42 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

If you have:

- -
    -
  • a website that allows users to create accounts
  • -
  • a messaging platform
  • -
  • any other type of service that may require users to prove their online identity
  • -
- -

Then you may be interested in supporting decentralized identity proofs as they allow your users to securely prove their identity across services. Take a look at this [example](guides/service-provider) to find out how two persons can gain more confidence in knowing they are talking to and interacting with the right person in an online world where impersonating is all too easy.

- -

The internet could be a slightly safer place if your service allowed your users to prove their identity. All the service needs to do is make a JSON file available with basic details about the user and set the correct CORS headers.

- -

The documentation on what is precisely required is provided by the original creator of decentralized OpenPGP identity proofs.

diff --git a/views/guides/service-provider.title.php b/views/guides/service-provider.title.php deleted file mode 100644 index f6dd961..0000000 --- a/views/guides/service-provider.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Are you a service provider? diff --git a/views/guides/twitter.content.php b/views/guides/twitter.content.php deleted file mode 100644 index 85ab198..0000000 --- a/views/guides/twitter.content.php +++ /dev/null @@ -1,58 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized Twitter proof to your OpenPGP keys.

- -

Post a Twitter proof message

- -

Log in to twitter.com and compose a new tweet with the following text (make sure to replace FINGERPRINT):

-This is an OpenPGP proof that connects my OpenPGP key to this Twitter account. -For details check out https://keyoxide.org/guides/openpgp-proofs -

[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT]
- -

After posting, copy the link to the tweet.

- -

Update the PGP key

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to update with the link to the tweet copied above):

-proof@metacode.biz=https://twitter.com/USERNAME/status/1234567891234567891 - -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a verified Twitter account.

diff --git a/views/guides/twitter.title.php b/views/guides/twitter.title.php deleted file mode 100644 index 7dec5fa..0000000 --- a/views/guides/twitter.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a Twitter proof diff --git a/views/guides/verify.content.php b/views/guides/verify.content.php deleted file mode 100644 index 9b67a1f..0000000 --- a/views/guides/verify.content.php +++ /dev/null @@ -1,81 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's see how to verify an OpenPGP signature.

- -

Obtain a signature

- -

If you already have a signature you would like to verify, great! If not, let's use the following signature for the guide:

------BEGIN PGP SIGNED MESSAGE----- -
Hash: SHA256 -
-
I like pineapple. -
-----BEGIN PGP SIGNATURE----- -
-
iQJDBAEBCAAtFiEEog/Pt4tEmnyVrrtlNzZ/SvQIetEFAl70mVUPHHlhcm1vQHlh -cm1vLmV1AAoJEDc2f0r0CHrRQXIP/08uza9zOtmZXv5K+uPGVzDKwkgPgZJEezX7 -6iQ358f1pjSRvYfQ5aB13k2epUHoqCKArMYu1zPqxhvLvvAvp8uOHABnr9NGL3El -u7UUgaeUNHkr0gxCKEq3p81abrrbbWveP8OBP4RyxmaFx13Xcj7mfDluiBHmjVvv -WU09EdH9VPlJ7WfZ+2G2ZZDHuE5XiaeP7ocugTxXXLkp33zwpDX0+ZuCIXM6fQGe -OccSffglFPdNBnfasuuxDWxTQPsEbWGOPJV+CAPmBDeApX+TBF9bovO3hw4Uozk2 -VT7EAy8Hb0SOrUb3UNGxzoKv++5676IxyB4JXX0Tr9O4ZxhO8o9pEEHwirtn/J1+ -MWven4gVlWM/6bMeUqx6ydyNc2nqF5059yfRmwGMlp09x82G4x1bcf6aDZ+5njDG -fS5T2OpXRIkZHJx8BhmZjsxiDR0KV44zwHpt06+96ef3EDWB0BcP6M+a5Rtc33zf -irRmQd2M6RLyXCYtdGIiiAFRuomw802U4F0P4LwVrZdbGA6ObqBv1k8BUFCMbMz8 -Ab4hF7kO4z0Vh3JaKzcHey0pOzdNCPpAHZ51sAoAnFDM4PdMBgQxxVweCMu4KYMZ -FN8sNn42oY/b7gDmwCelVhgD+rvUn/a8+B7CDmCp+wIquyrjrTt00voATcb+ZPMJ -
pTXJ/NcM -
=rqTX -
-----END PGP SIGNATURE----- -
- -

Copy the above signature.

- -

Verify the signature

- -

Open the keyoxide.org/verify page and paste the signature in the corresponding field. Scroll down and press the VERIFY SIGNATURE button.

-

Keyoxide lets you know the signature was verified and signed by a certain person.

- -

Verify the signature against a specific public key

- -

Sometimes, you want to know if a specific person or public key was used to create a signature. In this case, let's figure out if the message was signed by Yarmo's public key or his friend Wiktor's public key.

- -

Copy the following fingerprint:

-653909A2F0E37C106F5FAF546C8857E0D8E8F074 -

Paste it in the Email / key id / fingerprint field under Public Key (3: HKP server) and press the big button again. It could not be verified. Guess it wasn't Wiktor who signed that message.

- -

Now, copy the following fingerprint:

-9f0048ac0b23301e1f77e994909f6bd6f80f485d -

Paste it in the same field and press the big button again. It did verify! It was Yarmo all along.

- -

Going further

- -

You could try using different mechanisms of fetching keys, such as web key directory or copy-pasting a plaintext public key.

- -

If you'd like to sign messages using PGP, you must first learn the fundamentals of PGP and how to generate and handle your own keypair.

diff --git a/views/guides/verify.title.php b/views/guides/verify.title.php deleted file mode 100644 index 0f14f40..0000000 --- a/views/guides/verify.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Verifying a signature diff --git a/views/guides/web-key-directory.content.php b/views/guides/web-key-directory.content.php deleted file mode 100644 index 16b18ef..0000000 --- a/views/guides/web-key-directory.content.php +++ /dev/null @@ -1,64 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Web key directory

- -

Web key directory or WKD refers to the method of uploading one's public key to their website in a specific location to make it easily accessible by other services supporting WKD. The key will be discoverable using an identifier similar to an email address: username@domain.org.

- -

The benefit of WKD is having full control over the key while still having it widely available. It does however require a domain and some form of file hosting. Luckily, openpgp.org have made a WKD-as-a-service. Read more at the end of the guide.

- -

It exists in two variants: the Direct setup and the Advanced setup. Despite their names, both require roughly the same steps.

- -

The Direct setup

- -

To make your keys available via WKD using the Direct setup, you'll need two paths on your server:

- -

https://domain.org/.well-known/openpgpkey/policy: this is an empty file

-

https://domain.org/.well-known/openpgpkey/hu/LOCALPART: this is the binary public key (so NOT ASCII armored)

- -

The LOCALPART above is actually the username hashed using the SHA-1 algorithm and encoded using the Z-Base-32 method. As it's not humanly possible to compute this by ourselves, Keyoxide provides a small utility to do this for you.

- -

So if you wish to make your key available as jimothy@dm.com, according to the small utility, the URL would become:

-https://dm.com/.well-known/openpgpkey/hu/n9utc41qty791upt63rm5xtiudabmw6m - -

The Advanced setup

- -

While not necessary if the Direct setup works, there is a second setup to make WKD work: the Advanced setup. The paths needed are:

- -

https://openpgpkey.domain.org/.well-known/openpgpkey/domain.org/policy: this is an empty file

-

https://openpgpkey.domain.org/.well-known/openpgpkey/domain.org/hu/LOCALPART: this is the binary public key (so NOT ASCII armored)

- -

Indeed, quite similar to the Direct setup, except for the openpgpkey subdomain and the additional domain.org in the path of the public key.

- -

The public key for jimothy@dm.com would be available at:

-https://openpgpkey.dm.com/.well-known/openpgpkey/hu/dm.com/n9utc41qty791upt63rm5xtiudabmw6m - -

WKD-as-a-service

- -

In case hosting is problem, Openpgp.org has a handy WKD-as-a-service.

diff --git a/views/guides/web-key-directory.title.php b/views/guides/web-key-directory.title.php deleted file mode 100644 index b83b792..0000000 --- a/views/guides/web-key-directory.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Uploading keys using web key directory diff --git a/views/guides/xmpp.content.php b/views/guides/xmpp.content.php deleted file mode 100644 index a32a397..0000000 --- a/views/guides/xmpp.content.php +++ /dev/null @@ -1,72 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -

Let's add a decentralized XMPP proof to your OpenPGP keys.

- -

Add a message to your XMPP vCard

- -

Using a XMPP client that supports editing the vCard (such as Dino and Gajim), append the following message to the About section (make sure to replace FINGERPRINT):

-This is an OpenPGP proof that connects my OpenPGP key to this XMPP account. -For details check out https://keyoxide.org/guides/openpgp-proofs -

[Verifying my OpenPGP key: openpgp4fpr:FINGERPRINT]
- -

Update the PGP key (basic edition)

- -

First, edit the key (make sure to replace FINGERPRINT):

-gpg --edit-key FINGERPRINT - -

Add a new notation:

-notation - -

Enter the notation (make sure to replace XMPP-ID):

-proof@metacode.biz=xmpp:XMPP-ID - -

The XMPP-ID looks something like an email address: user@domain.org.

- -

Save the key:

-save - -

Upload the key to WKD or use the following command to upload the key to keys.openpgp.org (make sure to replace FINGERPRINT):

-gpg --keyserver hkps://keys.openpgp.org --send-keys FINGERPRINT - -

And you're done! Reload your profile page, it should now show a XMPP account.

- -

Update the PGP key (OMEMO edition)

- -

XMPP communication can be end-to-end encrypted with OMEMO. Verifying OMEMO fingerprints is essential to trust your communication and keep it safe from Man-in-the-Middle attacks.

- -

Keyoxide makes the fingerprint verification process easy for all. Add a special identity proof that not only contains your XMPP-ID but also the fingerprints of all your OMEMO keys.

- -

If your XMPP identity proof is verified, a QR code is shown. Anyone can scan this QR code using XMPP apps like Conversations (free on F-Droid) to not only add you as a contact, but also verify your OMEMO keys with the highest level of trust.

- -

Making this identity proof yourself can be a tad difficult when using clients like Gajim, but luckily for us, Conversations can directly generate the proof by going to Account details > Share > Share as XMPP URI. The resulting URI should look something like:

- -xmpp:user@domain.org?omemo-sid-123456789=A1B2C3D4E5F6G7H8I9... - -

To take advantage of the easy and secure XMPP identity proof including OMEMO fingerprints, follow the basic edition guide above but replace XMPP-ID with the URI obtained through the Conversations app.

diff --git a/views/guides/xmpp.title.php b/views/guides/xmpp.title.php deleted file mode 100644 index f27dbf7..0000000 --- a/views/guides/xmpp.title.php +++ /dev/null @@ -1,30 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -Adding a XMPP proof From 814d1e3c9aa2f9a88c9afa9f3a333482a97196e7 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 01:04:47 +0200 Subject: [PATCH 05/23] Update package.json --- package-lock.json | 15 +++++++++++++++ package.json | 5 ++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 503820e..93e1aae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -905,6 +905,21 @@ "uc.micro": "^1.0.5" } }, + "markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==" + }, + "markdown-it-table-of-contents": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz", + "integrity": "sha512-TAIHTHPwa9+ltKvKPWulm/beozQU41Ab+FIefRaQV1NRnpzwcV9QOe6wXQS5WLivm5Q/nlo0rl6laGkMDZE7Gw==" + }, + "markdown-it-title": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-title/-/markdown-it-title-3.0.0.tgz", + "integrity": "sha512-iHZptfptAXGJlcboqWxUSWNkJLUyxZ452CobBzkQ7MtwfVhTI77W1LTAy+miQTqo3U+wkDUOFhhXj2XUD0dVWQ==" + }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", diff --git a/package.json b/package.json index 4da8811..744a48f 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,16 @@ "dependencies": { "express": "^4.17.1", "jstransformer-markdown-it": "^2.1.0", + "markdown-it-anchor": "^5.3.0", + "markdown-it-table-of-contents": "^0.4.4", + "markdown-it-title": "^3.0.0", "pug": "^3.0.0" }, "devDependencies": { "license-check-and-add": "^3.0.4" }, "scripts": { - "main": "node public/index.js", + "main": "node index.js", "license:check": "./node_modules/license-check-and-add/dist/src/cli.js check", "license:add": "./node_modules/license-check-and-add/dist/src/cli.js add", "license:remove": "./node_modules/license-check-and-add/dist/src/cli.js remove", From d653d762b3306be486fe23de4a37f9948661553c Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 01:06:08 +0200 Subject: [PATCH 06/23] Convert views to pug --- views/404.php | 35 -------- views/404.pug | 6 ++ views/encrypt.php | 68 -------------- views/encrypt.pug | 14 +++ views/faq.php | 92 ------------------- views/faq.pug | 151 ++++++++++++++++++++++++++++++++ views/guide.php | 36 -------- views/guide.pug | 4 + views/guides.php | 78 ----------------- views/guides.pug | 59 +++++++++++++ views/index.php | 105 ---------------------- views/index.pug | 101 +++++++++++++++++++++ views/partials/key_selector.pug | 24 +++++ views/profile.php | 58 ------------ views/profile.pug | 25 ++++++ views/proofs.php | 63 ------------- views/proofs.pug | 14 +++ views/template.base.php | 70 --------------- views/template.base.pug | 33 +++++++ views/verify.php | 70 --------------- views/verify.pug | 17 ++++ 21 files changed, 448 insertions(+), 675 deletions(-) delete mode 100644 views/404.php create mode 100644 views/404.pug delete mode 100644 views/encrypt.php create mode 100644 views/encrypt.pug delete mode 100644 views/faq.php create mode 100644 views/faq.pug delete mode 100644 views/guide.php create mode 100644 views/guide.pug delete mode 100644 views/guides.php create mode 100644 views/guides.pug delete mode 100644 views/index.php create mode 100644 views/index.pug create mode 100644 views/partials/key_selector.pug delete mode 100644 views/profile.php create mode 100644 views/profile.pug delete mode 100644 views/proofs.php create mode 100644 views/proofs.pug delete mode 100644 views/template.base.php create mode 100644 views/template.base.pug delete mode 100644 views/verify.php create mode 100644 views/verify.pug diff --git a/views/404.php b/views/404.php deleted file mode 100644 index 0dd1c66..0000000 --- a/views/404.php +++ /dev/null @@ -1,35 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - -
-

404

-

The requested page could not be found :(

-
diff --git a/views/404.pug b/views/404.pug new file mode 100644 index 0000000..7de3aa3 --- /dev/null +++ b/views/404.pug @@ -0,0 +1,6 @@ +extends template.base.pug + +block content + .content + h1 404 + p The requested page could not be found :( diff --git a/views/encrypt.php b/views/encrypt.php deleted file mode 100644 index bbd13cb..0000000 --- a/views/encrypt.php +++ /dev/null @@ -1,68 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - -
-

Encrypt

-
-

Recipient

- - -
-
- -
-
- -
-
- - -
-
- -
-
- - -
-
-

Message

- -

- -
-
diff --git a/views/encrypt.pug b/views/encrypt.pug new file mode 100644 index 0000000..cd1b4f6 --- /dev/null +++ b/views/encrypt.pug @@ -0,0 +1,14 @@ +extends template.base.pug + +block content + .content + h1 Encrypt + form#form-encrypt(method='post') + h3 Recipient + label(for='modeSelect') Mode: + include partials/key_selector + + h3 Message + textarea#message(name='message') + p#result + input.bigBtn(type='submit' name='submit' value='ENCRYPT MESSAGE') diff --git a/views/faq.php b/views/faq.php deleted file mode 100644 index c71f2f3..0000000 --- a/views/faq.php +++ /dev/null @@ -1,92 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - -
-

FAQ

-

# What is Keyoxide?

-

Keyoxide is a lightweight and FOSS solution to make basic cryptography operations accessible to regular humans. It is built to be privacy friendly and secure, it can even be self-hosted.

- -

# Why does Keyoxide exist?

-

Keyoxide provides a solution to a modern problem: we humans have developed advanced methods of encrypting data and signing it. Unfortunately, it requires complicated tools that demand a minimal level of understanding cryptography and how keypairs work to leverage these technologies.

-

Sadly, this means that true privacy and secrecy in this modern age of surveillance capitalism is reserved to a subset of the world population.

-

Luckily, there is one thing we can do. Some cryptographic operations are more accessible than others and less prone to leaking private data. By building a service around only those operations, we hope a wider general audience can benefit from modern cryptography.

- -

# What cryptographic operations can Keyoxide handle?

-

Keyoxide can: verify signatures and encrypt messages.
Keyoxide can't: sign messages or decrypt messages.

- -

# Why so few cryptographic operations?

-

Good question. First, what cryptographic operations are generally available? There's encryption and its counterpart, decryption, but also signing and its counterpart, signature verification.

-

Decryption and signing require private keys. Encryption and signature verification only require public keys.

-

If you happen to be in possession of a private key, there is one thing you should know: that key is private! It shouldn't leave your computer and most certainly should never be uploaded to any website!

-

So yes, alternative services may offer more cryptographic operations but at the highest cost of surrendering your private keys to servers you generally shouldn't trust and companies that may be under geopolitical influence.

-

Keyoxide offers a simple solution to the trust issue: we don't want your keys, therefore you don't even need to trust us. Everything that this service offers is possible thanks to publicly available keys.

- -

# How does Keyoxide work without keys?

-

We still need keys, of course, but only the harmless public keys. And yes, we could have built a website where one can make an account and upload public keys, in a similar fashion as alternative services.

-

But why would we? There's already an entire infrastructure out there in the form of websites that host their own keys (plaintext or web key directory) or dedicated "HTTP Key Protocol" or HKP servers, designed specifically for public key hosting. Why reinvent the wheel?

- -

# How is this privacy friendly and secure?

-

You can't make an account on Keyoxide because for basic cryptographic operations, we don't need your data or your keys. By not knowing anything about you or using any trackers, this is as privacy-friendly as it gets.

-

As for secure, Keyoxide does all the cryptographic processing on your device and never sends data to the server. It also doesn't use private keys for any operation (so make sure to never upload those anywhere).

- -

# How can I make an account?

-

Well, you can't and that is the whole point of Keyoxide. We don't want your data or your keys. Uploading your keys and/or data to our servers is never required for any of the operations provided by Keyoxide.

- -

# Can I get a sweet profile page?

-

That, we can help you with! Just append your fingerprint to the domain (like so: https://keyoxide.org/9F0048AC0B23301E1F77E994909F6BD6F80F485D) to generate a profile page.

- -

# Where is the app?

-

There's no app. Why would you want yet another app for what is essentially just a form with a big blue button?

- -

# Where do I put my private key?

-

DON'T! We don't want it!

-

Alternative services may ask you for your private keys so that they can offer additional functionality. Please understand that your private key is yours and ONLY yours. You should never upload it to any online service, in fact it should never leave your computer.

- -

# What is the use if I can't decrypt or sign messages?

-

If you want to be on the receiving end of securely encrypted messages, you should either learn the basics of modern cryptography and know your way around your computer's command line or switch to end-to-end encrypted instant messaging providers.

-

Simply put, if you have private keys, you probably won't be using Keyoxide. You will benefit from using command line tools or GUIs like Kleopatra.

-

Keyoxide is designed for those without extensive knowledge about cryptography and who wish to encrypt messages to, or verify the authenticity of messages coming from the people with that extensive knowledge.

- -

# But other services provide a social network function!

-

It doesn't need to be centralized to have a "social network" function. Keyoxide simply uses the already existing "social network" of websites hosting their own keys and servers dedicated to hosting large amounts of keys.

- -

# PGP must die!

-

Not a question but we get your point. While there are legitimate reasons PGP should cease to exist, it is still widely used and without any clear sign of imminent extinction, it needs proper tooling.

-

It should be noted that while PGP can indeed be harmful when applied to email encryption, there are other legitimate ways of leveraging PGP to encrypt and/or sign messages.

-

That being said, Keyoxide aims to integrate different cryptographic technologies and therefore ease the transition away from PGP.

- -

# What is on the roadmap?

-
    -
  • Support more decentralized proofs
  • -
  • Write more guides
  • -
  • Integrate other encryption programs
  • -
-
diff --git a/views/faq.pug b/views/faq.pug new file mode 100644 index 0000000..5821edd --- /dev/null +++ b/views/faq.pug @@ -0,0 +1,151 @@ +extends template.base.pug + +block content + .content + h1 FAQ + h3#what-is-keyoxide + a(href='#what-is-keyoxide') # + | What is Keyoxide? + p + a(href='/') Keyoxide + | is a lightweight and FOSS solution to make basic cryptography operations accessible to regular humans. It is built to be privacy friendly and secure, it can even be self-hosted. + h3#why-does-keyoxide-exist + a(href='#why-does-keyoxide-exist') # + | Why does Keyoxide exist? + p + a(href='/') Keyoxide + | provides a solution to a modern problem: we humans have developed advanced methods of encrypting data and signing it. Unfortunately, it requires complicated tools that demand a minimal level of understanding cryptography and how keypairs work to leverage these technologies. + p + | Sadly, this means that true privacy and secrecy in this modern age of surveillance capitalism is reserved to a subset of the world population. + p + | Luckily, there is one thing we can do. Some cryptographic operations are more accessible than others and less prone to leaking private data. By building a service around only those operations, we hope a wider general audience can benefit from modern cryptography. + h3#what-cryptographic-operations-can-keyoxide-handle + a(href='#what-cryptographic-operations-can-keyoxide-handle') # + | What cryptographic operations can Keyoxide handle? + p + a(href='/') Keyoxide + | can: + a(href='/verify') verify signatures + | and + a(href='/encrypt') encrypt messages + | . + br + a(href='/') Keyoxide + | can't: sign messages or decrypt messages. + h3#why-so-few-cryptographic-operations + a(href='#why-so-few-cryptographic-operations') # + | Why so few cryptographic operations? + p + | Good question. First, what cryptographic operations are generally available? There's + strong encryption + | and its counterpart, + strong decryption + | , but also + strong signing + | and its counterpart, + strong signature verification + | . + p + strong Decryption + | and + strong signing + | require private keys. + strong Encryption + | and + strong signature verification + | only require public keys. + p + | If you happen to be in possession of a private key, there is one thing you should know: that key is private! It shouldn't leave your computer and most certainly should never be uploaded to any website! + p + | So yes, alternative services may offer more cryptographic operations but at the highest cost of surrendering your private keys to servers you generally shouldn't trust and companies that may be under geopolitical influence. + p + a(href='/') Keyoxide + | offers a simple solution to the trust issue: we don't want your keys, therefore you don't even need to trust us. Everything that this service offers is possible thanks to publicly available keys. + h3#how-does-keyoxide-work-without-keys + a(href='#how-does-keyoxide-work-without-keys') # + | How does Keyoxide work without keys? + p + | We still need keys, of course, but only the harmless public keys. And yes, we could have built a website where one can make an account and upload public keys, in a similar fashion as alternative services. + p + | But why would we? There's already an entire infrastructure out there in the form of websites that host their own keys (plaintext or web key directory) or dedicated "HTTP Key Protocol" or HKP servers, designed specifically for public key hosting. Why reinvent the wheel? + h3#how-is-this-privacy-friendly-and-secure + a(href='#how-is-this-privacy-friendly-and-secure') # + | How is this privacy friendly and secure? + p + | You can't make an account on + a(href='/') Keyoxide + | because for basic cryptographic operations, we don't need your data or your keys. By not knowing anything about you or using any trackers, this is as privacy-friendly as it gets. + p + | As for secure, + a(href='/') Keyoxide + | does all the cryptographic processing on your device and never sends data to the server. It also doesn't use private keys for any operation (so make sure to never upload those anywhere). + h3#how-can-i-make-an-account + a(href='#how-can-i-make-an-account') # + | How can I make an account? + p + | Well, you can't and that is the whole point of + a(href='/') Keyoxide + | . We don't want your data or your keys. Uploading your keys and/or data to our servers is never required for any of the operations provided by + a(href='/') Keyoxide + | . + h3#can-i-get-a-sweet-profile-page + a(href='#can-i-get-a-sweet-profile-page') # + | Can I get a sweet profile page? + p + | That, we can help you with! Just append your fingerprint to the domain (like so: + a(href='https://keyoxide.org/9F0048AC0B23301E1F77E994909F6BD6F80F485D') https://keyoxide.org/9F0048AC0B23301E1F77E994909F6BD6F80F485D + | ) to generate a profile page. + h3#where-is-the-app + a(href='#where-is-the-app') # + | Where is the app? + p + | There's no app. Why would you want yet another app for what is essentially just a form with a big blue button? + h3#where-do-i-put-my-private-key + a(href='#where-do-i-put-my-private-key') # + | Where do I put my private key? + p + strong DON'T + | ! We don't want it! + p + | Alternative services may ask you for your private keys so that they can offer additional functionality. Please understand that your private key is yours and ONLY yours. You should never upload it to any online service, in fact it should never leave your computer. + h3(id="what-is-the-use-if-i-can't-decrypt-or-sign-messages") + a(href="#what-is-the-use-if-i-can't-decrypt-or-sign-messages") # + | What is the use if I can't decrypt or sign messages? + p + | If you want to be on the receiving end of securely encrypted messages, you should either learn the basics of modern cryptography and know your way around your computer's command line or switch to end-to-end encrypted instant messaging providers. + p + | Simply put, if you have private keys, you probably won't be using + a(href='/') Keyoxide + | . You will benefit from using command line tools or GUIs like + a(href='https://www.openpgp.org/software/kleopatra/') Kleopatra + | . + p + a(href='/') Keyoxide + | is designed for those without extensive knowledge about cryptography and who wish to encrypt messages to, or verify the authenticity of messages coming from the people with that extensive knowledge. + h3#but-other-services-provide-a-social-network-function + a(href='#but-other-services-provide-a-social-network-function') # + | But other services provide a social network function! + p + | It doesn't need to be centralized to have a "social network" function. + a(href='/') Keyoxide + | simply uses the already existing "social network" of websites hosting their own keys and servers dedicated to hosting large amounts of keys. + h3#pgp-must-die + a(href='#pgp-must-die') # + | PGP must die! + p + | Not a question but we get your point. While there are + a(href='https://restoreprivacy.com/let-pgp-die/') legitimate reasons PGP should cease to exist + | , it is still widely used and without any clear sign of imminent extinction, it needs proper tooling. + p + | It should be noted that while PGP can indeed be harmful when applied to email encryption, there are other legitimate ways of leveraging PGP to encrypt and/or sign messages. + p + | That being said, + a(href='/') Keyoxide + | aims to integrate different cryptographic technologies and therefore ease the transition away from PGP. + h3#what-is-on-the-roadmap + a(href='#what-is-on-the-roadmap') # + | What is on the roadmap? + ul + li Support more decentralized proofs + li Write more guides + li Integrate other encryption programs diff --git a/views/guide.php b/views/guide.php deleted file mode 100644 index 66dfc0c..0000000 --- a/views/guide.php +++ /dev/null @@ -1,36 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - -
-

insert("guides/$id.title") ?>

-

Back to guides

- insert("guides/$id.content") ?> -
diff --git a/views/guide.pug b/views/guide.pug new file mode 100644 index 0000000..bf01cdc --- /dev/null +++ b/views/guide.pug @@ -0,0 +1,4 @@ +extends template.base.pug + +block content + .content !{ content } diff --git a/views/guides.php b/views/guides.php deleted file mode 100644 index dfbdc4e..0000000 --- a/views/guides.php +++ /dev/null @@ -1,78 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - - diff --git a/views/guides.pug b/views/guides.pug new file mode 100644 index 0000000..26c50d2 --- /dev/null +++ b/views/guides.pug @@ -0,0 +1,59 @@ +extends template.base.pug + +block content + .content + h1 Guides + .guides + .guides__section + h3 Using Keyoxide + a(href='/guides/verify') Verifying a signature + br + a(href='/guides/encrypt') Encrypting a message + br + a(href='/guides/proofs') Verifying identity proofs + br + a(href='/guides/contributing') Contributing to Keyoxide + br + a(href='/guides/self-hosting-keyoxide') Self-hosting Keyoxide + + .guides__section + h3 OpenPGP and identity proofs + a(href='/guides/openpgp-proofs') How OpenPGP identity proofs work + br + a(href='/guides/web-key-directory') Uploading keys using web key directory + + .guides__section + h3 Adding proofs + a(href='/guides/devto') Dev.to + br + a(href='/guides/discourse') Discourse + br + a(href='/guides/dns') Domain / DNS + br + a(href='/guides/github') Github + br + a(href='/guides/hackernews') Hackernews + br + a(href='/guides/lobsters') Lobste.rs + br + a(href='/guides/mastodon') Mastodon + br + a(href='/guides/pleroma') Pleroma + br + a(href='/guides/reddit') Reddit + br + a(href='/guides/twitter') Twitter + br + a(href='/guides/xmpp') XMPP+OMEMO + + .guides__section + h3 Other services + a(href='/guides/feature-comparison-keybase') Feature comparison with Keybase + br + a(href='/guides/migrating-from-keybase') Migrating from Keybase + + .guides__section + h3 Managing proofs in GnuPG + a(href='/guides/managing-proofs-listing') Listing proofs + br + a(href='/guides/managing-proofs-deleting') Deleting proofs diff --git a/views/index.php b/views/index.php deleted file mode 100644 index 26406ac..0000000 --- a/views/index.php +++ /dev/null @@ -1,105 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - -
-

Keyoxide

-

A modern, secure and privacy-friendly platform to establish your decentralized online identity and perform basic cryptographic operations.

- - - -

About

-

Keyoxide allows you to link accounts on various online services and platforms together, prove they belong to you and establish an online identity. This puts you, the internet citizen, in charge when it comes to defining who you are on the internet instead of large corporations.

-

As an example, here's the developer's Keyoxide profile.

-

- Keyoxide is developed by Yarmo Mackenbach. - The MIT-licensed code is hosted on Codeberg. - It uses openpgp.js (version 4.10.7) for all cryptographic operations. -

- -

Features

- -

Decentralized online identity proofs

-
    -
  • You decide which accounts are linked together
  • -
  • You decide where this data is stored
  • -
  • Keyoxide does not hold your identity data on its servers
  • -
  • Keyoxide merely verifies the identity proofs and displays them
  • -
- -

Empowering the internet citizen

-
    -
  • A verified identity proof proves ownership of an account and builds trust
  • -
  • No bad actor can impersonate you as long as your accounts aren't compromised
  • -
  • Your online identity data is safe from greedy internet corporations
  • -
- -

User-centric platform

-
    -
  • Easily encrypt messages and verify signatures from the profile page
  • -
  • Keyoxide generates QR codes that integrate with OpenKeychain
  • -
  • Keyoxide fetches the key wherever the used decides to store it
  • -
  • Keyoxide is self-hostable, meaning you could put it on any server you trust
  • -
- -

Secure and privacy-friendly

-
    -
  • Keyoxide doesn't want your personal data, track you or show you ads
  • -
  • You never give data to Keyoxide, it simply uses the data you have made public
  • -
  • Keyoxide relies on OpenPGP, a widely used public-key cryptography standard (RFC-4880)
  • -
  • Cryptographic operations are performed in-browser by OpenPGP.js, a library maintained by ProtonMail
  • -
- -

Free Open Source Software

- - -
diff --git a/views/index.pug b/views/index.pug new file mode 100644 index 0000000..dffb364 --- /dev/null +++ b/views/index.pug @@ -0,0 +1,101 @@ +extends template.base.pug + +block content + .content + h1 Keyoxide + p + | A modern, secure and privacy-friendly platform to establish your + strong decentralized online identity + | and perform + strong basic cryptographic operations + | . + .flex-column-container + .flex-column + h2 Cryptographic operations + p + a(href='/verify') Verify PGP signature + br + a(href='/encrypt') Encrypt PGP message + br + a(href='/proofs') Verify distributed identity proofs + .flex-column + h2 Utilities + p + a(href='/util/profile-url') Profile URL generator + br + a(href='/util/wkd') Web Key Directory URL generator + br + a(href='/util/qrfp') Fingerprint QR generator + + h2 About + p + strong Keyoxide + | allows you to link accounts on various online services and platforms together, prove they belong to you and establish an online identity. This puts + strong you + | , the internet citizen, in charge when it comes to defining who you are on the internet instead of large corporations. + p + | As an example, here's the + a(href='/9f0048ac0b23301e1f77e994909f6bd6f80f485d') developer's Keyoxide profile + | . + p + strong Keyoxide + | is developed by + a(href='https://yarmo.eu') Yarmo Mackenbach + | . The MIT-licensed code is hosted on + a(href='https://codeberg.org/keyoxide/web') Codeberg + | . It uses + a(href='https://github.com/openpgpjs/openpgpjs') openpgp.js + | (version + a(href='https://github.com/openpgpjs/openpgpjs/releases/tag/v4.10.7') 4.10.7 + | ) for all cryptographic operations. + + h2 Features + + h3 Decentralized online identity proofs + ul + li You decide which accounts are linked together + li You decide where this data is stored + li Keyoxide does not hold your identity data on its servers + li Keyoxide merely verifies the identity proofs and displays them + + h3 Empowering the internet citizen + ul + li A verified identity proof proves ownership of an account and builds trust + li No bad actor can impersonate you as long as your accounts aren't compromised + li Your online identity data is safe from greedy internet corporations + + h3 User-centric platform + ul + li Easily encrypt messages and verify signatures from the profile page + li + | Keyoxide generates QR codes that integrate with + a(href='https://www.openkeychain.org/') OpenKeychain + li Keyoxide fetches the key wherever the used decides to store it + li Keyoxide is self-hostable, meaning you could put it on any server you trust + + h3 Secure and privacy-friendly + ul + li Keyoxide doesn't want your personal data, track you or show you ads + li You never give data to Keyoxide, it simply uses the data you have made public + li + | Keyoxide relies on OpenPGP, a widely used public-key cryptography standard ( + a(href='https://tools.ietf.org/html/rfc4880') RFC-4880 + | ) + li + | Cryptographic operations are performed in-browser by + a(href='https://openpgpjs.org/') OpenPGP.js + | , a library maintained by + a(href='https://protonmail.com/blog/openpgpjs-email-encryption/') ProtonMail + + h3 Free Open Source Software + ul + li + | Keyoxide is licensed under the permissive + a(href='https://codeberg.org/keyoxide/web/src/branch/dev/LICENSE') MIT license + li + | The source code is hosted on + a(href='https://codeberg.org/keyoxide/web') Codeberg.org + li + | Even the + a(href='https://drone.keyoxide.org/keyoxide/web/') CI/CD activity + | is publicly visible diff --git a/views/partials/key_selector.pug b/views/partials/key_selector.pug new file mode 100644 index 0000000..fb7f38c --- /dev/null +++ b/views/partials/key_selector.pug @@ -0,0 +1,24 @@ +select#modeSelect.modeSelect(name='modeSelect') + option(value='auto' selected=(mode == "auto" ? true : false)) Autodetect + option(value='wkd' selected=(mode == "wkd" ? true : false)) Web Key Directory + option(value='hkp' selected=(mode == "hkp" ? true : false)) Keyserver + option(value='plaintext' selected=(mode == "plaintext" ? true : false)) Plaintext + option(value='keybase' selected=(mode == "keybase" ? true : false)) Keybase + +.modesContainer + .modes.modes--auto(class=(mode == "auto" ? "modes--visible" : "")) + input#auto_input(type='text' name='auto_input' placeholder='Email / key id / fingerprint' value=(mode == "auto" ? input : "")) + + .modes.modes--wkd(class=(mode == "wkd" ? "modes--visible" : "")) + input#wkd_input(type='text' name='wkd_input' placeholder='name@domain.org' value=(mode == "wkd" ? input : "")) + + .modes.modes--hkp(class=(mode == "hkp" ? "modes--visible" : "")) + input#hkp_input(type='text' name='hkp_input' placeholder='Email / key id / fingerprint' value=(mode == "hkp" ? input : "")) + input#hkp_server(type='text' name='hkp_server' placeholder='https://keys.openpgp.org/ (default)') + + .modes.modes--plaintext(class=(mode == "plaintext" ? "modes--visible" : "")) + textarea#plaintext_input(name='plaintext_input') + + .modes.modes--keybase(class=(mode == "keybase" ? "modes--visible" : "")) + input#keybase_username(type='text' name='keybase_username' placeholder='username' value=(mode == "keybase" ? username : "")) + input#keybase_fingerprint(type='text' name='keybase_fingerprint' placeholder='fingerprint' value=(mode == "keybase" ? fingerprint : "")) diff --git a/views/profile.php b/views/profile.php deleted file mode 100644 index 338e8c2..0000000 --- a/views/profile.php +++ /dev/null @@ -1,58 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> - - - - - - - Keyoxide - - - -
-
- - -
- -

-
-

Loading keys & verifying proofs…

-
- - -
- - - - diff --git a/views/profile.pug b/views/profile.pug new file mode 100644 index 0000000..ca42316 --- /dev/null +++ b/views/profile.pug @@ -0,0 +1,25 @@ +doctype html +head + meta(charset='utf-8') + meta(name='viewport' content='width=device-width, initial-scale=1') + link(rel='shortcut icon' href='/favicon.svg') + title Keyoxide + link(rel='stylesheet' href='/static/styles.css') + +main.container.container--profile + .content + span#profileUid(style='display: none;') #{uid} + span#profileMode(style='display: none;') #{mode} + #profileHeader + img#profileAvatar(src='/static/img/avatar_placeholder.png' alt='avatar' style='display: none') + p#profileName + #profileData + p Loading keys & verifying proofs… + footer + p + | Page generated by + a(href='/') Keyoxide + | . + +script(src='/static/openpgp.min.js') +script(type='text/javascript' src='/static/scripts.js' charset='utf-8') diff --git a/views/proofs.php b/views/proofs.php deleted file mode 100644 index 2783706..0000000 --- a/views/proofs.php +++ /dev/null @@ -1,63 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - -
-

Proofs

-
-

Public key

- - -
-
- -
-
- -
-
- - -
-
- -
-
-

Result

-

-

- -
-
diff --git a/views/proofs.pug b/views/proofs.pug new file mode 100644 index 0000000..8e22f37 --- /dev/null +++ b/views/proofs.pug @@ -0,0 +1,14 @@ +extends template.base.pug + +block content + .content + h1 Proofs + form#form-proofs(method='post') + h3 Public key + label(for='modeSelect') Mode: + include partials/key_selector + + h3 Result + p#result + p#resultContent + input.bigBtn(type='submit' name='submit' value='VERIFY PROOFS') diff --git a/views/template.base.php b/views/template.base.php deleted file mode 100644 index 37803a6..0000000 --- a/views/template.base.php +++ /dev/null @@ -1,70 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> - - - - - - - - <?=$this->e($title)?>Keyoxide - - - -
-
- -
- -
-
- -
- section('content')?> - - -
- - - - - - diff --git a/views/template.base.pug b/views/template.base.pug new file mode 100644 index 0000000..c6d2ec9 --- /dev/null +++ b/views/template.base.pug @@ -0,0 +1,33 @@ +doctype html +head + meta(charset='utf-8') + meta(name='viewport' content='width=device-width, initial-scale=1') + meta(name='theme-color' content='#fff') + link(rel='shortcut icon' href='/favicon.svg') + title= (title ? title : "Keyoxide") + link(rel='stylesheet' href='/static/styles.css') +header + .container + a.logo(href='/') + img(src='/static/img/logo_96.png' alt='Keyoxide logo') + .spacer + nav + a(href='/') about + a(href='/guides') guides + a(href='/faq') faq + +main.container + block content + + footer + p + a(href='https://codeberg.org/keyoxide') Source code + | - + a(href='https://drone.keyoxide.org/keyoxide/web/') CI/CD + | - + a(href='https://fosstodon.org/@keyoxide') Mastodon + p © 2020 Keyoxide contributors + +script(src='/static/openpgp.min.js') +script(src='/static/qrcode.min.js') +script(type='text/javascript' src='/static/scripts.js' charset='utf-8') diff --git a/views/verify.php b/views/verify.php deleted file mode 100644 index e31afd2..0000000 --- a/views/verify.php +++ /dev/null @@ -1,70 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - -
-

Verify

-
-

Signer

- - -
-
- -
-
- -
-
- - -
-
- -
-
- - -
-
-

Signature

- -

Result

-

-

- -
-
diff --git a/views/verify.pug b/views/verify.pug new file mode 100644 index 0000000..9f81035 --- /dev/null +++ b/views/verify.pug @@ -0,0 +1,17 @@ +extends template.base.pug + +block content + .content + h1 Verify + form#form-verify(method='post') + h3 Signer + label(for='modeSelect') Mode: + include partials/key_selector + + h3 Signature + textarea#signature(name='signature') + + h3 Result + p#result + p#result + input.bigBtn(type='submit' name='submit' value='VERIFY SIGNATURE') From 22e1b565ae5c65ae4628fc5ab8814aae71e298b2 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 01:06:20 +0200 Subject: [PATCH 07/23] Update styles --- static/styles.css | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/static/styles.css b/static/styles.css index 6637598..c8bcbfa 100644 --- a/static/styles.css +++ b/static/styles.css @@ -35,7 +35,7 @@ body { color: #444; font-family: sans-serif; background-color: #9dd3f0; - background-image: url('/assets/img/background.svg'); + background-image: url('/static/img/background.svg'); background-repeat: repeat; background-size: 512px; background-position: -16px -16px; @@ -163,13 +163,17 @@ a.bigBtn { ul { list-style: "- "; } +pre { + white-space: pre-wrap; +} code { display: block; padding: 8px; background-color: #eee; border: solid 1px #ddd; user-select: all; - word-break: break-all; + word-break: break-word; + /* word-break: break-all; */ } textarea { width: 100%; From 1ab13275b66e7f41aa5db26ebafd0f4f15b49878 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 01:06:58 +0200 Subject: [PATCH 08/23] Add index.js and routes --- index.js | 24 ++++++++++++++++++++++++ routes/encrypt.js | 39 +++++++++++++++++++++++++++++++++++++++ routes/main.js | 32 ++++++++++++++++++++++++++++++++ routes/profile.js | 19 +++++++++++++++++++ routes/proofs.js | 39 +++++++++++++++++++++++++++++++++++++++ routes/util.js | 39 +++++++++++++++++++++++++++++++++++++++ routes/verify.js | 39 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 231 insertions(+) create mode 100644 index.js create mode 100644 routes/encrypt.js create mode 100644 routes/main.js create mode 100644 routes/profile.js create mode 100644 routes/proofs.js create mode 100644 routes/util.js create mode 100644 routes/verify.js diff --git a/index.js b/index.js new file mode 100644 index 0000000..90e930e --- /dev/null +++ b/index.js @@ -0,0 +1,24 @@ +const express = require('express'); +const md = require('markdown-it')({typographer: true}); +const fs = require('fs'); +const app = express(); +const port = 3000; +const env = {}; + +md.use(require("markdown-it-anchor")); +md.use(require("markdown-it-table-of-contents"), { "includeLevel": [2, 3], "listType": "ol" }); +md.use(require('markdown-it-title')); + +app.set('view engine', 'pug'); +app.use('/static', express.static('static')); +app.use('/favicon.svg', express.static('favicon.svg')); + +app.use('/', require('./routes/main')); +app.use('/encrypt', require('./routes/encrypt')); +app.use('/verify', require('./routes/verify')); +app.use('/proofs', require('./routes/proofs')); +app.use('/', require('./routes/profile')); + +app.listen(port, () => { + console.log(`Example app listening at http://localhost:${port}`); +}); diff --git a/routes/encrypt.js b/routes/encrypt.js new file mode 100644 index 0000000..e69ee10 --- /dev/null +++ b/routes/encrypt.js @@ -0,0 +1,39 @@ +var router = require('express').Router(); + +router.get('/', function(req, res) { + res.render('encrypt', { mode: "auto" }) +}); + +router.get('/wkd', function(req, res) { + res.render('encrypt', { mode: "wkd" }) +}); +router.get('/wkd/:input', function(req, res) { + res.render('encrypt', { mode: "wkd", input: req.params.input }) +}); + +router.get('/hkp', function(req, res) { + res.render('encrypt', { mode: "hkp" }) +}); +router.get('/hkp/:input', function(req, res) { + res.render('encrypt', { mode: "hkp", input: req.params.input }) +}); + +router.get('/plaintext', function(req, res) { + res.render('encrypt', { mode: "plaintext" }) +}); + +router.get('/keybase', function(req, res) { + res.render('encrypt', { mode: "keybase" }) +}); +router.get('/keybase/:username', function(req, res) { + res.render('encrypt', { mode: "keybase", username: req.params.username }) +}); +router.get('/keybase/:username/:fingerprint', function(req, res) { + res.render('encrypt', { mode: "keybase", username: req.params.username, fingerprint: req.params.fingerprint }) +}); + +router.get('/:input', function(req, res) { + res.render('encrypt', { mode: "auto", input: req.params.input }) +}); + +module.exports = router; diff --git a/routes/main.js b/routes/main.js new file mode 100644 index 0000000..8c9ff06 --- /dev/null +++ b/routes/main.js @@ -0,0 +1,32 @@ +const router = require('express').Router(); +const md = require('markdown-it')({typographer: true}); +const fs = require('fs'); +const env = {}; + +md.use(require("markdown-it-anchor")); +md.use(require("markdown-it-table-of-contents"), { "includeLevel": [2, 3], "listType": "ol" }); +md.use(require('markdown-it-title')); + +router.get('/', (req, res) => { + res.render('index') +}); + +router.get('/faq', (req, res) => { + res.render('faq'); +}); + +router.get('/guides', (req, res) => { + res.render('guides'); +}); + +router.get('/guides/:guideId', (req, res) => { + let data = fs.readFileSync(`./guides/${req.params.guideId}.md`, "utf8", (err, data) => { + if (err) throw err; + return data; + }); + + let content = md.render(data, env); + res.render(`guide`, { title: `${env.title} - Keyoxide`, content: content }) +}); + +module.exports = router; diff --git a/routes/profile.js b/routes/profile.js new file mode 100644 index 0000000..537f5c8 --- /dev/null +++ b/routes/profile.js @@ -0,0 +1,19 @@ +var router = require('express').Router(); + +router.get('/wkd/:input', function(req, res) { + res.render('profile', { mode: "wkd", uid: req.params.input }) +}); + +router.get('/hkp/:input', function(req, res) { + res.render('profile', { mode: "hkp", uid: req.params.input }) +}); + +router.get('/keybase/:username/:fingerprint', function(req, res) { + res.render('profile', { mode: "keybase", uid: `${req.params.username}/${req.params.fingerprint}` }) +}); + +router.get('/:input', function(req, res) { + res.render('profile', { mode: "auto", uid: req.params.input }) +}); + +module.exports = router; diff --git a/routes/proofs.js b/routes/proofs.js new file mode 100644 index 0000000..1d06861 --- /dev/null +++ b/routes/proofs.js @@ -0,0 +1,39 @@ +var router = require('express').Router(); + +router.get('/', function(req, res) { + res.render('proofs', { mode: "auto" }) +}); + +router.get('/wkd', function(req, res) { + res.render('proofs', { mode: "wkd" }) +}); +router.get('/wkd/:input', function(req, res) { + res.render('proofs', { mode: "wkd", input: req.params.input }) +}); + +router.get('/hkp', function(req, res) { + res.render('proofs', { mode: "hkp" }) +}); +router.get('/hkp/:input', function(req, res) { + res.render('proofs', { mode: "hkp", input: req.params.input }) +}); + +router.get('/plaintext', function(req, res) { + res.render('proofs', { mode: "plaintext" }) +}); + +router.get('/keybase', function(req, res) { + res.render('proofs', { mode: "keybase" }) +}); +router.get('/keybase/:username', function(req, res) { + res.render('proofs', { mode: "keybase", username: req.params.username }) +}); +router.get('/keybase/:username/:fingerprint', function(req, res) { + res.render('proofs', { mode: "keybase", username: req.params.username, fingerprint: req.params.fingerprint }) +}); + +router.get('/:input', function(req, res) { + res.render('proofs', { mode: "auto", input: req.params.input }) +}); + +module.exports = router; diff --git a/routes/util.js b/routes/util.js new file mode 100644 index 0000000..e69ee10 --- /dev/null +++ b/routes/util.js @@ -0,0 +1,39 @@ +var router = require('express').Router(); + +router.get('/', function(req, res) { + res.render('encrypt', { mode: "auto" }) +}); + +router.get('/wkd', function(req, res) { + res.render('encrypt', { mode: "wkd" }) +}); +router.get('/wkd/:input', function(req, res) { + res.render('encrypt', { mode: "wkd", input: req.params.input }) +}); + +router.get('/hkp', function(req, res) { + res.render('encrypt', { mode: "hkp" }) +}); +router.get('/hkp/:input', function(req, res) { + res.render('encrypt', { mode: "hkp", input: req.params.input }) +}); + +router.get('/plaintext', function(req, res) { + res.render('encrypt', { mode: "plaintext" }) +}); + +router.get('/keybase', function(req, res) { + res.render('encrypt', { mode: "keybase" }) +}); +router.get('/keybase/:username', function(req, res) { + res.render('encrypt', { mode: "keybase", username: req.params.username }) +}); +router.get('/keybase/:username/:fingerprint', function(req, res) { + res.render('encrypt', { mode: "keybase", username: req.params.username, fingerprint: req.params.fingerprint }) +}); + +router.get('/:input', function(req, res) { + res.render('encrypt', { mode: "auto", input: req.params.input }) +}); + +module.exports = router; diff --git a/routes/verify.js b/routes/verify.js new file mode 100644 index 0000000..d2437c4 --- /dev/null +++ b/routes/verify.js @@ -0,0 +1,39 @@ +var router = require('express').Router(); + +router.get('/', function(req, res) { + res.render('verify', { mode: "auto" }) +}); + +router.get('/wkd', function(req, res) { + res.render('verify', { mode: "wkd" }) +}); +router.get('/wkd/:input', function(req, res) { + res.render('verify', { mode: "wkd", input: req.params.input }) +}); + +router.get('/hkp', function(req, res) { + res.render('verify', { mode: "hkp" }) +}); +router.get('/hkp/:input', function(req, res) { + res.render('verify', { mode: "hkp", input: req.params.input }) +}); + +router.get('/plaintext', function(req, res) { + res.render('verify', { mode: "plaintext" }) +}); + +router.get('/keybase', function(req, res) { + res.render('verify', { mode: "keybase" }) +}); +router.get('/keybase/:username', function(req, res) { + res.render('verify', { mode: "keybase", username: req.params.username }) +}); +router.get('/keybase/:username/:fingerprint', function(req, res) { + res.render('verify', { mode: "keybase", username: req.params.username, fingerprint: req.params.fingerprint }) +}); + +router.get('/:input', function(req, res) { + res.render('verify', { mode: "auto", input: req.params.input }) +}); + +module.exports = router; From 26c6b5fbfa58112935237e35f0543423c0e4ce8d Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 09:20:33 +0200 Subject: [PATCH 09/23] Migrate util pages to pug and add routes --- index.js | 1 + routes/util.js | 50 +++++++++++++++--------------------- views/util/profile-url.php | 52 -------------------------------------- views/util/profile-url.pug | 46 +++++++++++++++++++++++++++++++++ views/util/qr.php | 41 ------------------------------ views/util/qr.pug | 9 +++++++ views/util/qrfp.php | 40 ----------------------------- views/util/qrfp.pug | 15 +++++++++++ views/util/wkd.php | 47 ---------------------------------- views/util/wkd.pug | 21 +++++++++++++++ 10 files changed, 113 insertions(+), 209 deletions(-) delete mode 100644 views/util/profile-url.php create mode 100644 views/util/profile-url.pug delete mode 100644 views/util/qr.php create mode 100644 views/util/qr.pug delete mode 100644 views/util/qrfp.php create mode 100644 views/util/qrfp.pug delete mode 100644 views/util/wkd.php create mode 100644 views/util/wkd.pug diff --git a/index.js b/index.js index 90e930e..02f52f0 100644 --- a/index.js +++ b/index.js @@ -17,6 +17,7 @@ app.use('/', require('./routes/main')); app.use('/encrypt', require('./routes/encrypt')); app.use('/verify', require('./routes/verify')); app.use('/proofs', require('./routes/proofs')); +app.use('/util', require('./routes/util')); app.use('/', require('./routes/profile')); app.listen(port, () => { diff --git a/routes/util.js b/routes/util.js index e69ee10..e11ecd3 100644 --- a/routes/util.js +++ b/routes/util.js @@ -1,39 +1,31 @@ var router = require('express').Router(); -router.get('/', function(req, res) { - res.render('encrypt', { mode: "auto" }) +router.get('/profile-url', function(req, res) { + res.render('util/profile-url') +}); +router.get('/profile-url/:input', function(req, res) { + res.render('util/profile-url', { input: req.params.input }) +}); + +router.get('/qr', function(req, res) { + res.render('util/qr') +}); +router.get('/qr/:input', function(req, res) { + res.render('util/qr', { input: req.params.input }) +}); + +router.get('/qrfp', function(req, res) { + res.render('util/qrfp') +}); +router.get('/qrfp/:input', function(req, res) { + res.render('util/qrfp', { input: req.params.input }) }); router.get('/wkd', function(req, res) { - res.render('encrypt', { mode: "wkd" }) + res.render('util/wkd') }); router.get('/wkd/:input', function(req, res) { - res.render('encrypt', { mode: "wkd", input: req.params.input }) -}); - -router.get('/hkp', function(req, res) { - res.render('encrypt', { mode: "hkp" }) -}); -router.get('/hkp/:input', function(req, res) { - res.render('encrypt', { mode: "hkp", input: req.params.input }) -}); - -router.get('/plaintext', function(req, res) { - res.render('encrypt', { mode: "plaintext" }) -}); - -router.get('/keybase', function(req, res) { - res.render('encrypt', { mode: "keybase" }) -}); -router.get('/keybase/:username', function(req, res) { - res.render('encrypt', { mode: "keybase", username: req.params.username }) -}); -router.get('/keybase/:username/:fingerprint', function(req, res) { - res.render('encrypt', { mode: "keybase", username: req.params.username, fingerprint: req.params.fingerprint }) -}); - -router.get('/:input', function(req, res) { - res.render('encrypt', { mode: "auto", input: req.params.input }) + res.render('util/wkd', { input: req.params.input }) }); module.exports = router; diff --git a/views/util/profile-url.php b/views/util/profile-url.php deleted file mode 100644 index 92f2fd8..0000000 --- a/views/util/profile-url.php +++ /dev/null @@ -1,52 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - -
-

Profile URL

-
-

This tool generates an URL for your Keyoxide profile page.

-

Public key

- - -
- -

Profile URL

- Waiting for input... -

Help

-

When using the Web Key Directory source, the Input looks like username@domain.org.

-

When using the keys.openpgp.org source, the Input is either the fingerprint of your public key, or the main identity's email address.

-

When using the Keybase source, the Input is the URL obtained by going to your Keybase profile page, clicking on the key id of your keypair and copying the URL of the this key link.

-
-
diff --git a/views/util/profile-url.pug b/views/util/profile-url.pug new file mode 100644 index 0000000..fac936c --- /dev/null +++ b/views/util/profile-url.pug @@ -0,0 +1,46 @@ +extends ../template.base.pug + +block content + .content + h1 Profile URL + form#form-util-profile-url(method='post') + p This tool generates an URL for your Keyoxide profile page. + h3 Public key + label(for='source') Source: + select#source.source(name='source') + option(value='wkd') Web Key Directory + option(value='hkp') keys.openpgp.org + option(value='keybase') Keybase + br + input#input(type='text' name='input' placeholder='Input' value='') + h3 Profile URL + code#output Waiting for input... + h3 Help + p + | When using the + strong Web Key Directory + | source, the + strong Input + | looks like + strong username@domain.org + | . + p + | When using the + strong keys.openpgp.org + | source, the + strong Input + | is either the + strong fingerprint + | of your public key, or the main identity's + strong email address + | . + p + | When using the + strong Keybase + | source, the + strong Input + | is the URL obtained by going to your Keybase profile page, clicking on the + strong key id + | of your keypair and copying the URL of the + strong this key + | link. diff --git a/views/util/qr.php b/views/util/qr.php deleted file mode 100644 index d3c1c64..0000000 --- a/views/util/qr.php +++ /dev/null @@ -1,41 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - -
-

QR Code

-
- - - escape($input)?> -
-
- Press this link to directly open the URI -
diff --git a/views/util/qr.pug b/views/util/qr.pug new file mode 100644 index 0000000..b07b2a0 --- /dev/null +++ b/views/util/qr.pug @@ -0,0 +1,9 @@ +extends ../template.base.pug + +block content + .content + h1 QR Code + form#form-util-qr(method='post') + code#input.full-width !{input} + #qrcode + a#qrcode--altLink(href='#') Press this link to directly open the URI diff --git a/views/util/qrfp.php b/views/util/qrfp.php deleted file mode 100644 index 3a1f06e..0000000 --- a/views/util/qrfp.php +++ /dev/null @@ -1,40 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - -
-

QR Code

-
-

This tool generates a QR code containing the fingerprint of your public key (format). This QR code can be scanned by apps like OpenKeyChain.

-

Fingerprint

- -
-
-
diff --git a/views/util/qrfp.pug b/views/util/qrfp.pug new file mode 100644 index 0000000..2ce15e0 --- /dev/null +++ b/views/util/qrfp.pug @@ -0,0 +1,15 @@ +extends ../template.base.pug + +block content + .content + h1 QR Code + form#form-util-qrfp(method='post') + p + | This tool generates a QR code containing the fingerprint of your public key ( + a(href='https://github.com/open-keychain/open-keychain/wiki/QR-Codes') format + | ). This QR code can be scanned by apps like + a(href='https://www.openkeychain.org/') OpenKeyChain + | . + h3 Fingerprint + input#input(type='text' name='input' placeholder='Fingerprint' value=input) + #qrcode diff --git a/views/util/wkd.php b/views/util/wkd.php deleted file mode 100644 index e440282..0000000 --- a/views/util/wkd.php +++ /dev/null @@ -1,47 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -layout('template.base', ['title' => $title]) ?> - -
-

Web Key Directory generator

-
-

This tool computes the part of the WKD URL that corresponds to the username when uploading keys using web key directory.

-

If you enter the entire WKD identifier (username@domain.org), this tool will also generate the complete URLs.

-

Input

- -

Output

-

Local part

- Waiting for input... -

Direct URL

- Waiting for input... -

Advanced URL

- Waiting for input... -
-
diff --git a/views/util/wkd.pug b/views/util/wkd.pug new file mode 100644 index 0000000..275bbd3 --- /dev/null +++ b/views/util/wkd.pug @@ -0,0 +1,21 @@ +extends ../template.base.pug + +block content + .content + h1 Web Key Directory generator + form#form-util-wkd(method='post') + p + | This tool computes the part of the WKD URL that corresponds to the username when + a(href='https://keyoxide.org/guides/web-key-directory') uploading keys using web key directory + | . + p + | If you enter the entire WKD identifier (username@domain.org), this tool will also generate the complete URLs. + h3 Input + input#input(type='text' name='input' placeholder='WKD username or identifier' value=input) + h3 Output + h4 Local part + code#output.full-width Waiting for input... + h4 Direct URL + code#output_url_direct.full-width Waiting for input... + h4 Advanced URL + code#output_url_advanced.full-width Waiting for input... From a3d7db26935fbb9609c07a98818b55e8536bc31b Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 09:41:42 +0200 Subject: [PATCH 10/23] Add openpgp to deps and routes --- index.js | 1 + package-lock.json | 69 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + routes/dep.js | 7 +++++ 4 files changed, 78 insertions(+) create mode 100644 routes/dep.js diff --git a/index.js b/index.js index 02f52f0..a7013d0 100644 --- a/index.js +++ b/index.js @@ -14,6 +14,7 @@ app.use('/static', express.static('static')); app.use('/favicon.svg', express.static('favicon.svg')); app.use('/', require('./routes/main')); +app.use('/dep', require('./routes/dep')); app.use('/encrypt', require('./routes/encrypt')); app.use('/verify', require('./routes/verify')); app.use('/proofs', require('./routes/proofs')); diff --git a/package-lock.json b/package-lock.json index 93e1aae..70599fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,6 +68,17 @@ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, "assert-never": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", @@ -81,6 +92,11 @@ "@babel/types": "^7.9.6" } }, + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -252,6 +268,11 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", @@ -277,6 +298,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -958,6 +984,11 @@ "mime-db": "1.44.0" } }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -968,6 +999,19 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-localstorage": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.1.tgz", + "integrity": "sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ==", + "requires": { + "write-file-atomic": "^1.1.4" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -981,6 +1025,16 @@ "ee-first": "1.1.1" } }, + "openpgp": { + "version": "4.10.7", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-4.10.7.tgz", + "integrity": "sha512-+7EkD/btnvIyGkslB0p3W123u/dajMBcfzMfOIevlZBPvCWLJXGzgNFMM5CYXUNITeBUpxCxwgHeniqr+UfESQ==", + "requires": { + "asn1.js": "^5.0.0", + "node-fetch": "^2.1.2", + "node-localstorage": "~1.3.0" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1207,6 +1261,11 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1276,6 +1335,16 @@ "assert-never": "^1.2.1", "babel-walk": "3.0.0-canary-5" } + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } } } } diff --git a/package.json b/package.json index 744a48f..8af4785 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "markdown-it-anchor": "^5.3.0", "markdown-it-table-of-contents": "^0.4.4", "markdown-it-title": "^3.0.0", + "openpgp": "^4.10.7", "pug": "^3.0.0" }, "devDependencies": { diff --git a/routes/dep.js b/routes/dep.js new file mode 100644 index 0000000..34d5134 --- /dev/null +++ b/routes/dep.js @@ -0,0 +1,7 @@ +var router = require('express').Router(); + +router.get('/openpgp.min.js', function(req, res) { + res.sendFile(`node_modules/openpgp/dist/openpgp.min.js`, { root: `${__dirname}/../` }) +}); + +module.exports = router; From e89389e52317bcd92681ae8ac500607914ebf81d Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 09:43:49 +0200 Subject: [PATCH 11/23] Remove obsolete files --- index.php | 186 ------------------------------------------ static/openpgp.min.js | 2 - 2 files changed, 188 deletions(-) delete mode 100644 index.php delete mode 100644 static/openpgp.min.js diff --git a/index.php b/index.php deleted file mode 100644 index c084c54..0000000 --- a/index.php +++ /dev/null @@ -1,186 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> -map('GET', '/', function() {}, 'index'); -$router->map('GET', '/guides', function() {}, 'guides'); -$router->map('GET', '/guides/[:id]', function() {}, 'guideId'); -$router->map('GET', '/util/qrfp/[:fp]', function() {}, 'util_qrfp'); -$router->map('GET', '/util/qr/[**:uri]', function() {}, 'util_qr'); -$router->map('GET', '/util/[:id]', function() {}, 'util'); -$router->map('GET', '/faq', function() {}, 'faq'); -$router->map('GET', '/verify', function() {}, 'verify'); -$router->map('GET', '/encrypt', function() {}, 'encrypt'); -$router->map('GET', '/proofs', function() {}, 'proofs'); -$router->map('GET', '/verify/hkp/[**:uid]', function() {}, 'verifyHKP'); -$router->map('GET', '/verify/wkd/[**:uid]', function() {}, 'verifyWKD'); -$router->map('GET', '/verify/keybase/[:uid]/[:fp]', function() {}, 'verifyKeybase'); -$router->map('GET', '/verify/[**:uid]', function() {}, 'verifyAUTO'); -$router->map('GET', '/encrypt/hkp/[**:uid]', function() {}, 'encryptHKP'); -$router->map('GET', '/encrypt/wkd/[**:uid]', function() {}, 'encryptWKD'); -$router->map('GET', '/encrypt/keybase/[:uid]/[:fp]', function() {}, 'encryptKeybase'); -$router->map('GET', '/encrypt/[**:uid]', function() {}, 'encryptAUTO'); -$router->map('GET', '/proofs/hkp/[**:uid]', function() {}, 'proofsHKP'); -$router->map('GET', '/proofs/wkd/[**:uid]', function() {}, 'proofsWKD'); -$router->map('GET', '/proofs/[**:uid]', function() {}, 'proofsAUTO'); -$router->map('GET', '/hkp/[**:uid]', function() {}, 'profileHKP'); -$router->map('GET', '/wkd/[**:uid]', function() {}, 'profileWKD'); -$router->map('GET', '/keybase/[:uid]/[:fp]', function() {}, 'profileKeybase'); -$router->map('GET', '/[**:uid]', function() {}, 'profile'); - -// Router matching -$match = $router->match(); - -// Render the appropriate route -if(is_array($match) && is_callable($match['target'])) { - switch ($match['name']) { - case 'index': - echo $templates->render('index'); - break; - - case 'verify': - echo $templates->render('verify', ['title' => 'Verify — ', 'mode' => 'auto']); - break; - - case 'verifyAUTO': - echo $templates->render('verify', ['title' => 'Verify — ', 'mode' => 'auto', 'auto_input' => $match['params']['uid']]); - break; - - case 'verifyHKP': - echo $templates->render('verify', ['title' => 'Verify — ', 'mode' => 'hkp', 'hkp_input' => $match['params']['uid']]); - break; - - case 'verifyWKD': - echo $templates->render('verify', ['title' => 'Verify — ', 'mode' => 'wkd', 'wkd_input' => $match['params']['uid']]); - break; - - case 'verifyKeybase': - echo $templates->render('verify', ['title' => 'Verify — ', 'mode' => 'keybase', 'keybase_username' => htmlspecialchars($match['params']['uid']), 'keybase_fingerprint' => htmlspecialchars($match['params']['fp'])]); - break; - - case 'encrypt': - echo $templates->render('encrypt', ['title' => 'Encrypt — ', 'mode' => 'auto']); - break; - - case 'encryptAUTO': - echo $templates->render('encrypt', ['title' => 'Encrypt — ', 'mode' => 'auto', 'auto_input' => $match['params']['uid']]); - break; - - case 'encryptHKP': - echo $templates->render('encrypt', ['title' => 'Encrypt — ', 'mode' => 'hkp', 'hkp_input' => $match['params']['uid']]); - break; - - case 'encryptWKD': - echo $templates->render('encrypt', ['title' => 'Encrypt — ', 'mode' => 'wkd', 'wkd_input' => $match['params']['uid']]); - break; - - case 'encryptKeybase': - echo $templates->render('encrypt', ['title' => 'Encrypt — ', 'mode' => 'keybase', 'keybase_username' => htmlspecialchars($match['params']['uid']), 'keybase_fingerprint' => htmlspecialchars($match['params']['fp'])]); - break; - - case 'proofs': - echo $templates->render('proofs', ['title' => 'Proofs — ', 'mode' => 'auto']); - break; - - case 'proofsAUTO': - echo $templates->render('proofs', ['title' => 'Proofs — ', 'mode' => 'auto', 'auto_input' => $match['params']['uid']]); - break; - - case 'proofsHKP': - echo $templates->render('proofs', ['title' => 'Proofs — ', 'mode' => 'hkp', 'hkp_input' => $match['params']['uid']]); - break; - - case 'proofsWKD': - echo $templates->render('proofs', ['title' => 'Proofs — ', 'mode' => 'wkd', 'wkd_input' => $match['params']['uid']]); - break; - - case 'profile': - echo $templates->render('profile', ['mode' => 'auto', 'uid' => htmlspecialchars($match['params']['uid'])]); - break; - - case 'profileHKP': - echo $templates->render('profile', ['mode' => 'hkp', 'uid' => htmlspecialchars($match['params']['uid'])]); - break; - - case 'profileWKD': - echo $templates->render('profile', ['mode' => 'wkd', 'uid' => htmlspecialchars($match['params']['uid'])]); - break; - - case 'profileKeybase': - echo $templates->render('profile', ['mode' => 'keybase', 'uid' => htmlspecialchars($match['params']['uid']).'/'.htmlspecialchars($match['params']['fp'])]); - break; - - case 'guides': - echo $templates->render('guides'); - break; - - case 'guideId': - $id = htmlspecialchars($match['params']['id']); - if (file_exists("views/guides/$id.title.php") && file_exists("views/guides/$id.content.php")) { - echo $templates->render('guide', ['id' => $id]); - } else { - echo $templates->render("404"); - } - break; - - case 'util': - $id = htmlspecialchars($match['params']['id']); - echo $templates->render("util/$id"); - break; - - case 'util_qrfp': - $fp = htmlspecialchars($match['params']['fp']); - echo $templates->render("util/qrfp", ['input' => $fp]); - break; - - case 'util_qr': - $uri = htmlspecialchars($match['params']['uri']); - echo $templates->render("util/qr", ['input' => $uri]); - break; - - case 'faq': - echo $templates->render("faq"); - break; - } -} else { - // No route was matched - echo $templates->render("404"); -} diff --git a/static/openpgp.min.js b/static/openpgp.min.js deleted file mode 100644 index 1ed4064..0000000 --- a/static/openpgp.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! OpenPGP.js v4.10.7 - 2020-07-21 - this is LGPL licensed code, see LICENSE/our website https://openpgpjs.org/ for more information. */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).openpgp=e()}}(function(){return function(){return function e(t,r,n){function i(s,o){if(!r[s]){if(!t[s]){var u="function"==typeof require&&require;if(!o&&u)return u(s,!0);if(a)return a(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var f=r[s]={exports:{}};t[s][0].call(f.exports,function(e){return i(t[s][1][e]||e)},f,f.exports,e,t,r,n)}return r[s].exports}for(var a="function"==typeof require&&require,s=0;s`Symbol(${e})`,n="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==e?e:void 0,i=Number.isNaN||function(e){return e!=e};function a(e){return"object"==typeof e&&null!==e||"function"==typeof e}function s(e,t,r){Object.defineProperty(e,t,{value:r,writable:!0,enumerable:!0,configurable:!0})}function o(e){return e.slice()}function u(e,t,r,n,i){new Uint8Array(e).set(new Uint8Array(r,n,i),t)}function c(e){return!1!==function(e){return"number"==typeof e&&(!i(e)&&!(e<0))}(e)&&e!==1/0}function f(e,t,r){if("function"!=typeof e)throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,t,r)}function d(e,t,r,n){const i=e[t];if(void 0!==i){if("function"!=typeof i)throw new TypeError(`${i} is not a method`);switch(r){case 0:return()=>h(i,e,n);case 1:return t=>{const r=[t].concat(n);return h(i,e,r)}}}return()=>Promise.resolve()}function l(e,t,r){const n=e[t];if(void 0!==n)return f(n,e,r)}function h(e,t,r){try{return Promise.resolve(f(e,t,r))}catch(e){return Promise.reject(e)}}function p(e){return e}function y(e){if(e=Number(e),i(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 g(e,t,r){let n,i;const a=new Promise((e,t)=>{n=e,i=t});return void 0===r&&(r=(e=>{throw e})),function(e,t,r){let n=!1;const i=e=>{!1===n&&(n=!0,r(e))};let a=0,s=0;const o=e.length,u=new Array(o);for(const c of e){const e=a;m(c,r=>{u[e]=r,++s===o&&t(u)},i),++a}}(e,e=>{try{const r=t(e);n(r)}catch(e){i(e)}},e=>{try{const t=r(e);n(t)}catch(e){i(e)}}),a}function w(e){}function _(e){e&&e instanceof w.AssertionError&&setTimeout(()=>{throw e},0)}function v(e){const t=e._queue.shift();return e._queueTotalSize-=t.size,e._queueTotalSize<0&&(e._queueTotalSize=0),t.value}function k(e,t,r){if(!c(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 A(e){e._queue=[],e._queueTotalSize=0}w.AssertionError=function(){};const S=r("[[AbortSteps]]"),E=r("[[ErrorSteps]]");class P{constructor(e={},t={}){M(this);const r=t.size;let n=t.highWaterMark;if(void 0!==e.type)throw new RangeError("Invalid type is specified");const i=b(r);void 0===n&&(n=1),function(e,t,r,n){const i=Object.create(H.prototype),a=d(t,"write",1,[i]),s=d(t,"close",0,[]),o=d(t,"abort",1,[]);W(e,i,function(){return l(t,"start",[i])},a,s,o,r,n)}(this,e,n=y(n),i)}get locked(){if(!1===C(this))throw X("locked");return K(this)}abort(e){return!1===C(this)?Promise.reject(X("abort")):!0===K(this)?Promise.reject(new TypeError("Cannot abort a stream that already has a writer")):U(this,e)}getWriter(){if(!1===C(this))throw X("getWriter");return x(this)}}function x(e){return new z(e)}function M(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 C(e){return!!a(e)&&!!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")}function K(e){return void 0!==e._writer}function U(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 n=!1;"erroring"===r&&(n=!0,t=void 0);const i=new Promise((r,i)=>{e._pendingAbortRequest={_promise:void 0,_resolve:r,_reject:i,_reason:t,_wasAlreadyErroring:n}});return e._pendingAbortRequest._promise=i,!1===n&&B(e,t),i}function R(e,t){"writable"!==e._state?j(e):B(e,t)}function B(e,t){const r=e._writableStreamController;e._state="erroring",e._storedError=t;const n=e._writer;void 0!==n&&N(n,t),!1===function(e){return void 0!==e._inFlightWriteRequest||void 0!==e._inFlightCloseRequest}(e)&&!0===r._started&&j(e)}function j(e){e._state="errored",e._writableStreamController[E]();const t=e._storedError;for(const n of e._writeRequests)n._reject(t);if(e._writeRequests=[],void 0===e._pendingAbortRequest)return void I(e);const r=e._pendingAbortRequest;if(e._pendingAbortRequest=void 0,!0===r._wasAlreadyErroring)return r._reject(t),void I(e);e._writableStreamController[S](r._reason).then(()=>{r._resolve(),I(e)},t=>{r._reject(t),I(e)})}function T(e){return void 0!==e._closeRequest||void 0!==e._inFlightCloseRequest}function I(e){void 0!==e._closeRequest&&(e._closeRequest._reject(e._storedError),e._closeRequest=void 0);const t=e._writer;void 0!==t&&ne(t,e._storedError)}function O(e,t){const r=e._writer;void 0!==r&&t!==e._backpressure&&(!0===t?ae(r):ce(r)),e._backpressure=t}class z{constructor(e){if(!1===C(e))throw new TypeError("WritableStreamDefaultWriter can only be constructed with a WritableStream instance");if(!0===K(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===T(e)&&!0===e._backpressure?ae(this):oe(this),te(this);else if("erroring"===t)se(this,e._storedError),te(this);else if("closed"===t)oe(this),function(e){te(e),ie(e)}(this);else{const t=e._storedError;se(this,t),re(this,t)}}get closed(){return!1===D(this)?Promise.reject(Q("closed")):this._closedPromise}get desiredSize(){if(!1===D(this))throw Q("desiredSize");if(void 0===this._ownerWritableStream)throw ee("desiredSize");return function(e){const t=e._ownerWritableStream,r=t._state;return"errored"===r||"erroring"===r?null:"closed"===r?0:Z(t._writableStreamController)}(this)}get ready(){return!1===D(this)?Promise.reject(Q("ready")):this._readyPromise}abort(e){return!1===D(this)?Promise.reject(Q("abort")):void 0===this._ownerWritableStream?Promise.reject(ee("abort")):function(e,t){return U(e._ownerWritableStream,t)}(this,e)}close(){if(!1===D(this))return Promise.reject(Q("close"));const e=this._ownerWritableStream;return void 0===e?Promise.reject(ee("close")):!0===T(e)?Promise.reject(new TypeError("cannot close an already-closing stream")):q(this)}releaseLock(){if(!1===D(this))throw Q("releaseLock");void 0!==this._ownerWritableStream&&F(this)}write(e){return!1===D(this)?Promise.reject(Q("write")):void 0===this._ownerWritableStream?Promise.reject(ee("write to")):L(this,e)}}function D(e){return!!a(e)&&!!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")}function q(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 n=new Promise((e,r)=>{const n={_resolve:e,_reject:r};t._closeRequest=n});return!0===t._backpressure&&"writable"===r&&ce(e),function(e){k(e,"close",0),V(e)}(t._writableStreamController),n}function N(e,t){"pending"===e._readyPromiseState?ue(e,t):function(e,t){se(e,t)}(e,t)}function F(e){const t=e._ownerWritableStream,r=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");N(e,r),function(e,t){"pending"===e._closedPromiseState?ne(e,t):function(e,t){re(e,t)}(e,t)}(e,r),t._writer=void 0,e._ownerWritableStream=void 0}function L(e,t){const r=e._ownerWritableStream,n=r._writableStreamController,i=function(e,t){try{return e._strategySizeAlgorithm(t)}catch(t){return Y(e,t),1}}(n,t);if(r!==e._ownerWritableStream)return Promise.reject(ee("write to"));const a=r._state;if("errored"===a)return Promise.reject(r._storedError);if(!0===T(r)||"closed"===a)return Promise.reject(new TypeError("The stream is closing or closed and cannot be written to"));if("erroring"===a)return Promise.reject(r._storedError);const s=function(e){return new Promise((t,r)=>{const n={_resolve:t,_reject:r};e._writeRequests.push(n)})}(r);return function(e,t,r){const n={chunk:t};try{k(e,n,r)}catch(t){return void Y(e,t)}const i=e._controlledWritableStream;if(!1===T(i)&&"writable"===i._state){O(i,$(e))}V(e)}(n,t,i),s}class H{constructor(){throw new TypeError("WritableStreamDefaultController cannot be constructed explicitly")}error(e){if(!1===function(e){return!!a(e)&&!!Object.prototype.hasOwnProperty.call(e,"_controlledWritableStream")}(this))throw new TypeError("WritableStreamDefaultController.prototype.error can only be used on a WritableStreamDefaultController");"writable"===this._controlledWritableStream._state&&J(this,e)}[S](e){const t=this._abortAlgorithm(e);return G(this),t}[E](){A(this)}}function W(e,t,r,n,i,a,s,o){t._controlledWritableStream=e,e._writableStreamController=t,t._queue=void 0,t._queueTotalSize=void 0,A(t),t._started=!1,t._strategySizeAlgorithm=o,t._strategyHWM=s,t._writeAlgorithm=n,t._closeAlgorithm=i,t._abortAlgorithm=a;const u=$(t);O(e,u);const c=r();Promise.resolve(c).then(()=>{t._started=!0,V(t)},r=>{t._started=!0,R(e,r)}).catch(_)}function G(e){e._writeAlgorithm=void 0,e._closeAlgorithm=void 0,e._abortAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Z(e){return e._strategyHWM-e._queueTotalSize}function V(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 j(t);if(0===e._queue.length)return;const n=function(e){return e._queue[0].value}(e);"close"===n?function(e){const t=e._controlledWritableStream;(function(e){e._inFlightCloseRequest=e._closeRequest,e._closeRequest=void 0})(t),v(e);const r=e._closeAlgorithm();G(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&&ie(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),R(e,t)}(t,e)}).catch(_)}(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(v(e),!1===T(r)&&"writable"===t){const t=$(e);O(r,t)}V(e)},t=>{"writable"===r._state&&G(e),function(e,t){e._inFlightWriteRequest._reject(t),e._inFlightWriteRequest=void 0,R(e,t)}(r,t)}).catch(_)}(e,n.chunk)}function Y(e,t){"writable"===e._controlledWritableStream._state&&J(e,t)}function $(e){return Z(e)<=0}function J(e,t){const r=e._controlledWritableStream;G(e),B(r,t)}function X(e){return new TypeError(`WritableStream.prototype.${e} can only be used on a WritableStream`)}function Q(e){return new TypeError(`WritableStreamDefaultWriter.prototype.${e} can only be used on a WritableStreamDefaultWriter`)}function ee(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function te(e){e._closedPromise=new Promise((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r,e._closedPromiseState="pending"})}function re(e,t){te(e),ne(e,t)}function ne(e,t){e._closedPromise.catch(()=>{}),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="rejected"}function ie(e){e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="resolved"}function ae(e){e._readyPromise=new Promise((t,r)=>{e._readyPromise_resolve=t,e._readyPromise_reject=r}),e._readyPromiseState="pending"}function se(e,t){ae(e),ue(e,t)}function oe(e){ae(e),ce(e)}function ue(e,t){e._readyPromise.catch(()=>{}),e._readyPromise_reject(t),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="rejected"}function ce(e){e._readyPromise_resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="fulfilled"}const fe=Number.isInteger||function(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e},de=r("[[CancelSteps]]"),le=r("[[PullSteps]]");class he{constructor(e={},t={}){be(this);const r=t.size;let n=t.highWaterMark;const i=e.type;if("bytes"===String(i)){if(void 0!==r)throw new RangeError("The strategy for a byte stream cannot have a size function");void 0===n&&(n=0),function(e,t,r){const n=Object.create(Je.prototype),i=d(t,"pull",0,[n]),a=d(t,"cancel",1,[]);let s=t.autoAllocateChunkSize;if(void 0!==s&&(s=Number(s),!1===fe(s)||s<=0))throw new RangeError("autoAllocateChunkSize must be a positive integer");!function(e,t,r,n,i,a,s){t._controlledReadableByteStream=e,t._pullAgain=!1,t._pulling=!1,tt(t),t._queue=t._queueTotalSize=void 0,A(t),t._closeRequested=!1,t._started=!1,t._strategyHWM=y(a),t._pullAlgorithm=n,t._cancelAlgorithm=i,t._autoAllocateChunkSize=s,t._pendingPullIntos=[],e._readableStreamController=t;const o=r();Promise.resolve(o).then(()=>{t._started=!0,et(t)},e=>{ht(t,e)}).catch(_)}(e,n,function(){return l(t,"start",[n])},i,a,r,s)}(this,e,n=y(n))}else{if(void 0!==i)throw new RangeError("Invalid type is specified");{const t=b(r);void 0===n&&(n=1),function(e,t,r,n){const i=Object.create(De.prototype),a=d(t,"pull",0,[i]),s=d(t,"cancel",1,[]);Ye(e,i,function(){return l(t,"start",[i])},a,s,r,n)}(this,e,n=y(n),t)}}}get locked(){if(!1===me(this))throw bt("locked");return ge(this)}cancel(e){return!1===me(this)?Promise.reject(bt("cancel")):!0===ge(this)?Promise.reject(new TypeError("Cannot cancel a stream that already has a reader")):ke(this,e)}getReader({mode:e}={}){if(!1===me(this))throw bt("getReader");if(void 0===e)return pe(this);if("byob"===(e=String(e)))return function(e){return new Re(e)}(this);throw new RangeError("Invalid mode is specified")}pipeThrough({writable:e,readable:t},{preventClose:r,preventAbort:n,preventCancel:i,signal:a}={}){if(!1===me(this))throw bt("pipeThrough");if(!1===C(e))throw new TypeError("writable argument to pipeThrough must be a WritableStream");if(!1===me(t))throw new TypeError("readable argument to pipeThrough must be a ReadableStream");if(r=Boolean(r),n=Boolean(n),i=Boolean(i),void 0!==a&&!yt(a))throw new TypeError("ReadableStream.prototype.pipeThrough's signal option must be an AbortSignal");if(!0===ge(this))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");if(!0===K(e))throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");return we(this,e,r,n,i,a).catch(()=>{}),t}pipeTo(e,{preventClose:t,preventAbort:r,preventCancel:n,signal:i}={}){return!1===me(this)?Promise.reject(bt("pipeTo")):!1===C(e)?Promise.reject(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream")):(t=Boolean(t),r=Boolean(r),n=Boolean(n),void 0===i||yt(i)?!0===ge(this)?Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")):!0===K(e)?Promise.reject(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")):we(this,e,t,r,n,i):Promise.reject(new TypeError("ReadableStream.prototype.pipeTo's signal option must be an AbortSignal")))}tee(){if(!1===me(this))throw bt("tee");const e=function(e,t){const r=pe(e);let n,i,a,s,u,c=!1,f=!1,d=!1;const l=new Promise(e=>{u=e});function h(){return ze(r).then(e=>{const t=e.value;if(!0===e.done&&!1===c&&(!1===f&&He(a._readableStreamController),!1===d&&He(s._readableStreamController),c=!0),!0===c)return;const r=t,n=t;!1===f&&We(a._readableStreamController,r),!1===d&&We(s._readableStreamController,n)})}function p(){}return a=ye(p,h,function(t){if(f=!0,n=t,!0===d){const t=o([n,i]),r=ke(e,t);u(r)}return l}),s=ye(p,h,function(t){if(d=!0,i=t,!0===f){const t=o([n,i]),r=ke(e,t);u(r)}return l}),r._closedPromise.catch(e=>{!0!==c&&(Ge(a._readableStreamController,e),Ge(s._readableStreamController,e),c=!0)}),[a,s]}(this);return o(e)}}function pe(e){return new Ue(e)}function ye(e,t,r,n=1,i=(()=>1)){const a=Object.create(he.prototype);return be(a),Ye(a,Object.create(De.prototype),e,t,r,n,i),a}function be(e){e._state="readable",e._reader=void 0,e._storedError=void 0,e._disturbed=!1}function me(e){return!!a(e)&&!!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")}function ge(e){return void 0!==e._reader}function we(e,t,r,n,i,a){const s=pe(e),o=x(t);let u=!1,c=Promise.resolve();return new Promise((f,d)=>{let l;if(void 0!==a){if(l=(()=>{const r=new DOMException("Aborted","AbortError"),a=[];!1===n&&a.push(()=>"writable"===t._state?U(t,r):Promise.resolve()),!1===i&&a.push(()=>"readable"===e._state?ke(e,r):Promise.resolve()),y(()=>g(a.map(e=>e()),e=>e),!0,r)}),!0===a.aborted)return void l();a.addEventListener("abort",l)}if(p(e,s._closedPromise,e=>{!1===n?y(()=>U(t,e),!0,e):b(!0,e)}),p(t,o._closedPromise,t=>{!1===i?y(()=>ke(e,t),!0,t):b(!0,t)}),function(e,t,r){"closed"===e._state?r():t.then(r).catch(_)}(e,s._closedPromise,()=>{!1===r?y(()=>(function(e){const t=e._ownerWritableStream,r=t._state;return!0===T(t)||"closed"===r?Promise.resolve():"errored"===r?Promise.reject(t._storedError):q(e)})(o)):b()}),!0===T(t)||"closed"===t._state){const t=new TypeError("the destination writable stream closed before all data could be piped to it");!1===i?y(()=>ke(e,t),!0,t):b(!0,t)}function h(){const e=c;return c.then(()=>e!==c?h():void 0)}function p(e,t,r){"errored"===e._state?r(e._storedError):t.catch(r).catch(_)}function y(e,r,n){function i(){e().then(()=>m(r,n),e=>m(!0,e)).catch(_)}!0!==u&&(u=!0,"writable"===t._state&&!1===T(t)?h().then(i):i())}function b(e,r){!0!==u&&(u=!0,"writable"===t._state&&!1===T(t)?h().then(()=>m(e,r)).catch(_):m(e,r))}function m(e,t){F(o),Oe(s),void 0!==a&&a.removeEventListener("abort",l),e?d(t):f(void 0)}new Promise((e,t)=>{!function r(n){n?e():(!0===u?Promise.resolve(!0):o._readyPromise.then(()=>ze(s).then(({value:e,done:t})=>!0===t||(c=L(o,e).catch(()=>{}),!1)))).then(r,t)}(!1)}).catch(e=>{c=Promise.resolve(),_(e)})})}function _e(e,t){return new Promise((r,n)=>{const i={_resolve:r,_reject:n,_forAuthorCode:t};e._reader._readIntoRequests.push(i)})}function ve(e,t){return new Promise((r,n)=>{const i={_resolve:r,_reject:n,_forAuthorCode:t};e._reader._readRequests.push(i)})}function ke(e,t){return e._disturbed=!0,"closed"===e._state?Promise.resolve(void 0):"errored"===e._state?Promise.reject(e._storedError):(Ae(e),e._readableStreamController[de](t).then(()=>void 0))}function Ae(e){e._state="closed";const t=e._reader;if(void 0!==t){if(je(t)){for(const e of t._readRequests){(0,e._resolve)(Se(void 0,!0,e._forAuthorCode))}t._readRequests=[]}kt(t)}}function Se(e,t,r){let n=null;!0===r&&(n=Object.prototype);const i=Object.create(n);return Object.defineProperty(i,"value",{value:e,enumerable:!0,writable:!0,configurable:!0}),Object.defineProperty(i,"done",{value:t,enumerable:!0,writable:!0,configurable:!0}),i}function Ee(e,t){e._state="errored",e._storedError=t;const r=e._reader;if(void 0!==r){if(je(r)){for(const e of r._readRequests)e._reject(t);r._readRequests=[]}else{for(const e of r._readIntoRequests)e._reject(t);r._readIntoRequests=[]}vt(r,t)}}function Pe(e,t,r){const n=e._reader._readRequests.shift();n._resolve(Se(t,r,n._forAuthorCode))}function xe(e){return e._reader._readIntoRequests.length}function Me(e){return e._reader._readRequests.length}function Ce(e){const t=e._reader;return void 0!==t&&!!Be(t)}function Ke(e){const t=e._reader;return void 0!==t&&!!je(t)}class Ue{constructor(e){if(!1===me(e))throw new TypeError("ReadableStreamDefaultReader can only be constructed with a ReadableStream instance");if(!0===ge(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");Te(this,e),this._readRequests=[]}get closed(){return je(this)?this._closedPromise:Promise.reject(gt("closed"))}cancel(e){return je(this)?void 0===this._ownerReadableStream?Promise.reject(mt("cancel")):Ie(this,e):Promise.reject(gt("cancel"))}read(){return je(this)?void 0===this._ownerReadableStream?Promise.reject(mt("read from")):ze(this,!0):Promise.reject(gt("read"))}releaseLock(){if(!je(this))throw gt("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");Oe(this)}}}class Re{constructor(e){if(!me(e))throw new TypeError("ReadableStreamBYOBReader can only be constructed with a ReadableStream instance given a byte source");if(!1===Xe(e._readableStreamController))throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");if(ge(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");Te(this,e),this._readIntoRequests=[]}get closed(){return Be(this)?this._closedPromise:Promise.reject(At("closed"))}cancel(e){return Be(this)?void 0===this._ownerReadableStream?Promise.reject(mt("cancel")):Ie(this,e):Promise.reject(At("cancel"))}read(e){return Be(this)?void 0===this._ownerReadableStream?Promise.reject(mt("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 n=e._ownerReadableStream;return n._disturbed=!0,"errored"===n._state?Promise.reject(n._storedError):function(e,t,r){const n=e._controlledReadableByteStream;let i=1;t.constructor!==DataView&&(i=t.constructor.BYTES_PER_ELEMENT);const a=t.constructor,s={buffer:p(t.buffer),byteOffset:t.byteOffset,byteLength:t.byteLength,bytesFilled:0,elementSize:i,ctor:a,readerType:"byob"};if(e._pendingPullIntos.length>0)return e._pendingPullIntos.push(s),_e(n,r);if("closed"===n._state){const e=new a(s.buffer,s.byteOffset,0);return Promise.resolve(Se(e,!0,r))}if(e._queueTotalSize>0){if(!0===at(e,s)){const t=nt(s);return ot(e),Promise.resolve(Se(t,!1,r))}if(!0===e._closeRequested){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");return ht(e,t),Promise.reject(t)}}e._pendingPullIntos.push(s);const o=_e(n,r);return et(e),o}(n._readableStreamController,t,r)}(this,e,!0)):Promise.reject(new TypeError("view must be an array buffer view")):Promise.reject(At("read"))}releaseLock(){if(!Be(this))throw At("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");Oe(this)}}}function Be(e){return!!a(e)&&!!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")}function je(e){return!!a(e)&&!!Object.prototype.hasOwnProperty.call(e,"_readRequests")}function Te(e,t){e._ownerReadableStream=t,t._reader=e,"readable"===t._state?wt(e):"closed"===t._state?function(e){wt(e),kt(e)}(e):_t(e,t._storedError)}function Ie(e,t){return ke(e._ownerReadableStream,t)}function Oe(e){"readable"===e._ownerReadableStream._state?vt(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):function(e,t){_t(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness"))}(e),e._ownerReadableStream._reader=void 0,e._ownerReadableStream=void 0}function ze(e,t=!1){const r=e._ownerReadableStream;return r._disturbed=!0,"closed"===r._state?Promise.resolve(Se(void 0,!0,t)):"errored"===r._state?Promise.reject(r._storedError):r._readableStreamController[le](t)}class De{constructor(){throw new TypeError}get desiredSize(){if(!1===qe(this))throw St("desiredSize");return Ze(this)}close(){if(!1===qe(this))throw St("close");if(!1===Ve(this))throw new TypeError("The stream is not in a state that permits close");He(this)}enqueue(e){if(!1===qe(this))throw St("enqueue");if(!1===Ve(this))throw new TypeError("The stream is not in a state that permits enqueue");return We(this,e)}error(e){if(!1===qe(this))throw St("error");Ge(this,e)}[de](e){A(this);const t=this._cancelAlgorithm(e);return Le(this),t}[le](e){const t=this._controlledReadableStream;if(this._queue.length>0){const r=v(this);return!0===this._closeRequested&&0===this._queue.length?(Le(this),Ae(t)):Ne(this),Promise.resolve(Se(r,!1,e))}const r=ve(t,e);return Ne(this),r}}function qe(e){return!!a(e)&&!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableStream")}function Ne(e){!1!==Fe(e)&&(!0!==e._pulling?(e._pulling=!0,e._pullAlgorithm().then(()=>{if(e._pulling=!1,!0===e._pullAgain)return e._pullAgain=!1,Ne(e)},t=>{Ge(e,t)}).catch(_)):e._pullAgain=!0)}function Fe(e){const t=e._controlledReadableStream;return!1!==Ve(e)&&!1!==e._started&&(!0===ge(t)&&Me(t)>0||Ze(e)>0)}function Le(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function He(e){const t=e._controlledReadableStream;e._closeRequested=!0,0===e._queue.length&&(Le(e),Ae(t))}function We(e,t){const r=e._controlledReadableStream;if(!0===ge(r)&&Me(r)>0)Pe(r,t,!1);else{let r;try{r=e._strategySizeAlgorithm(t)}catch(t){throw Ge(e,t),t}try{k(e,t,r)}catch(t){throw Ge(e,t),t}}Ne(e)}function Ge(e,t){const r=e._controlledReadableStream;"readable"===r._state&&(A(e),Le(e),Ee(r,t))}function Ze(e){const t=e._controlledReadableStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Ve(e){const t=e._controlledReadableStream._state;return!1===e._closeRequested&&"readable"===t}function Ye(e,t,r,n,i,a,s){t._controlledReadableStream=e,t._queue=void 0,t._queueTotalSize=void 0,A(t),t._started=!1,t._closeRequested=!1,t._pullAgain=!1,t._pulling=!1,t._strategySizeAlgorithm=s,t._strategyHWM=a,t._pullAlgorithm=n,t._cancelAlgorithm=i,e._readableStreamController=t;const o=r();Promise.resolve(o).then(()=>{t._started=!0,Ne(t)},e=>{Ge(t,e)}).catch(_)}class $e{constructor(){throw new TypeError("ReadableStreamBYOBRequest cannot be used directly")}get view(){if(!1===Qe(this))throw Et("view");return this._view}respond(e){if(!1===Qe(this))throw Et("respond");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");this._view.buffer,function(e,t){if(!1===c(t=Number(t)))throw new RangeError("bytesWritten must be a finite");ft(e,t)}(this._associatedReadableByteStreamController,e)}respondWithNewView(e){if(!1===Qe(this))throw Et("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,ft(e,t.byteLength)}(this._associatedReadableByteStreamController,e)}}class Je{constructor(){throw new TypeError("ReadableByteStreamController constructor cannot be used directly")}get byobRequest(){if(!1===Xe(this))throw Pt("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($e.prototype);!function(e,t,r){e._associatedReadableByteStreamController=t,e._view=r}(r,this,t),this._byobRequest=r}return this._byobRequest}get desiredSize(){if(!1===Xe(this))throw Pt("desiredSize");return pt(this)}close(){if(!1===Xe(this))throw Pt("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)e._closeRequested=!0;else{if(e._pendingPullIntos.length>0){if(e._pendingPullIntos[0].bytesFilled>0){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");throw ht(e,t),t}}lt(e),Ae(t)}}(this)}enqueue(e){if(!1===Xe(this))throw Pt("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,n=t.buffer,i=t.byteOffset,a=t.byteLength,s=p(n);if(!0===Ke(r))if(0===Me(r))it(e,s,i,a);else{Pe(r,new Uint8Array(s,i,a),!1)}else!0===Ce(r)?(it(e,s,i,a),ct(e)):it(e,s,i,a);et(e)}(this,e)}error(e){if(!1===Xe(this))throw Pt("error");ht(this,e)}[de](e){this._pendingPullIntos.length>0&&(this._pendingPullIntos[0].bytesFilled=0),A(this);const t=this._cancelAlgorithm(e);return lt(this),t}[le](e){const t=this._controlledReadableByteStream;if(this._queueTotalSize>0){const t=this._queue.shift();let r;this._queueTotalSize-=t.byteLength,ot(this);try{r=new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}catch(e){return Promise.reject(e)}return Promise.resolve(Se(r,!1,e))}const r=this._autoAllocateChunkSize;if(void 0!==r){let t;try{t=new ArrayBuffer(r)}catch(e){return Promise.reject(e)}const n={buffer:t,byteOffset:0,byteLength:r,bytesFilled:0,elementSize:1,ctor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(n)}const n=ve(t,e);return et(this),n}}function Xe(e){return!!a(e)&&!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableByteStream")}function Qe(e){return!!a(e)&&!!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")}function et(e){!1!==function(e){const t=e._controlledReadableByteStream;return"readable"===t._state&&(!0!==e._closeRequested&&(!1!==e._started&&(!0===Ke(t)&&Me(t)>0||(!0===Ce(t)&&xe(t)>0||pt(e)>0))))}(e)&&(!0!==e._pulling?(e._pulling=!0,e._pullAlgorithm().then(()=>{e._pulling=!1,!0===e._pullAgain&&(e._pullAgain=!1,et(e))},t=>{ht(e,t)}).catch(_)):e._pullAgain=!0)}function tt(e){ut(e),e._pendingPullIntos=[]}function rt(e,t){let r=!1;"closed"===e._state&&(r=!0);const n=nt(t);"default"===t.readerType?Pe(e,n,r):function(e,t,r){const n=e._reader._readIntoRequests.shift();n._resolve(Se(t,r,n._forAuthorCode))}(e,n,r)}function nt(e){const t=e.bytesFilled,r=e.elementSize;return new e.ctor(e.buffer,e.byteOffset,t/r)}function it(e,t,r,n){e._queue.push({buffer:t,byteOffset:r,byteLength:n}),e._queueTotalSize+=n}function at(e,t){const r=t.elementSize,n=t.bytesFilled-t.bytesFilled%r,i=Math.min(e._queueTotalSize,t.byteLength-t.bytesFilled),a=t.bytesFilled+i,s=a-a%r;let o=i,c=!1;s>n&&(o=s-t.bytesFilled,c=!0);const f=e._queue;for(;o>0;){const r=f[0],n=Math.min(o,r.byteLength),i=t.byteOffset+t.bytesFilled;u(t.buffer,i,r.buffer,r.byteOffset,n),r.byteLength===n?f.shift():(r.byteOffset+=n,r.byteLength-=n),e._queueTotalSize-=n,st(e,n,t),o-=n}return c}function st(e,t,r){ut(e),r.bytesFilled+=t}function ot(e){0===e._queueTotalSize&&!0===e._closeRequested?(lt(e),Ae(e._controlledReadableByteStream)):et(e)}function ut(e){void 0!==e._byobRequest&&(e._byobRequest._associatedReadableByteStreamController=void 0,e._byobRequest._view=void 0,e._byobRequest=void 0)}function ct(e){for(;e._pendingPullIntos.length>0;){if(0===e._queueTotalSize)return;const t=e._pendingPullIntos[0];!0===at(e,t)&&(dt(e),rt(e._controlledReadableByteStream,t))}}function ft(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=p(t.buffer);const r=e._controlledReadableByteStream;if(!0===Ce(r))for(;xe(r)>0;)rt(r,dt(e))}(e,r)}else!function(e,t,r){if(r.bytesFilled+t>r.byteLength)throw new RangeError("bytesWritten out of range");if(st(e,t,r),r.bytesFilled0){const t=r.byteOffset+r.bytesFilled,i=r.buffer.slice(t-n,t);it(e,i,0,i.byteLength)}r.buffer=p(r.buffer),r.bytesFilled-=n,rt(e._controlledReadableByteStream,r),ct(e)}(e,t,r);et(e)}function dt(e){const t=e._pendingPullIntos.shift();return ut(e),t}function lt(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0}function ht(e,t){const r=e._controlledReadableByteStream;"readable"===r._state&&(tt(e),A(e),lt(e),Ee(r,t))}function pt(e){const t=e._controlledReadableByteStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function yt(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 bt(e){return new TypeError(`ReadableStream.prototype.${e} can only be used on a ReadableStream`)}function mt(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function gt(e){return new TypeError(`ReadableStreamDefaultReader.prototype.${e} can only be used on a ReadableStreamDefaultReader`)}function wt(e){e._closedPromise=new Promise((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r})}function _t(e,t){wt(e),vt(e,t)}function vt(e,t){e._closedPromise.catch(()=>{}),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0}function kt(e){e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0}function At(e){return new TypeError(`ReadableStreamBYOBReader.prototype.${e} can only be used on a ReadableStreamBYOBReader`)}function St(e){return new TypeError(`ReadableStreamDefaultController.prototype.${e} can only be used on a ReadableStreamDefaultController`)}function Et(e){return new TypeError(`ReadableStreamBYOBRequest.prototype.${e} can only be used on a ReadableStreamBYOBRequest`)}function Pt(e){return new TypeError(`ReadableByteStreamController.prototype.${e} can only be used on a ReadableByteStreamController`)}class xt{constructor({highWaterMark:e}){s(this,"highWaterMark",e)}size(e){return e.byteLength}}class Mt{constructor({highWaterMark:e}){s(this,"highWaterMark",e)}size(){return 1}}class Ct{constructor(e={},t={},r={}){const n=t.size;let i=t.highWaterMark;const a=r.size;let s=r.highWaterMark;if(void 0!==e.writableType)throw new RangeError("Invalid writable type specified");const o=b(n);if(void 0===i&&(i=1),i=y(i),void 0!==e.readableType)throw new RangeError("Invalid readable type specified");const u=b(a);let c;void 0===s&&(s=0),s=y(s),function(e,t,r,n,i,a){function s(){return t}e._writable=function(e,t,r,n,i=1,a=(()=>1)){const s=Object.create(P.prototype);return M(s),W(s,Object.create(H.prototype),e,t,r,n,i,a),s}(s,function(t){return function(e,t){const r=e._transformStreamController;if(!0===e._backpressure){return e._backpressureChangePromise.then(()=>{const n=e._writable;if("erroring"===n._state)throw n._storedError;return zt(r,t)})}return zt(r,t)}(e,t)},function(){return function(e){const t=e._readable,r=e._transformStreamController,n=r._flushAlgorithm();return It(r),n.then(()=>{if("errored"===t._state)throw t._storedError;const e=t._readableStreamController;!0===Ve(e)&&He(e)}).catch(r=>{throw Ut(e,r),t._storedError})}(e)},function(t){return function(e,t){return Ut(e,t),Promise.resolve()}(e,t)},r,n),e._readable=ye(s,function(){return function(e){return Bt(e,!1),e._backpressureChangePromise}(e)},function(t){return Rt(e,t),Promise.resolve()},i,a),e._backpressure=void 0,e._backpressureChangePromise=void 0,e._backpressureChangePromise_resolve=void 0,Bt(e,!0),e._transformStreamController=void 0}(this,new Promise(e=>{c=e}),i,o,s,u),function(e,t){const r=Object.create(jt.prototype);let n=e=>{try{return Ot(r,e),Promise.resolve()}catch(e){return Promise.reject(e)}};const i=t.transform;if(void 0!==i){if("function"!=typeof i)throw new TypeError("transform is not a method");n=(e=>h(i,t,[e,r]))}const a=d(t,"flush",0,[r]);!function(e,t,r,n){t._controlledTransformStream=e,e._transformStreamController=t,t._transformAlgorithm=r,t._flushAlgorithm=n}(e,r,n,a)}(this,e);const f=l(e,"start",[this._transformStreamController]);c(f)}get readable(){if(!1===Kt(this))throw qt("readable");return this._readable}get writable(){if(!1===Kt(this))throw qt("writable");return this._writable}}function Kt(e){return!!a(e)&&!!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")}function Ut(e,t){Ge(e._readable._readableStreamController,t),Rt(e,t)}function Rt(e,t){It(e._transformStreamController),Y(e._writable._writableStreamController,t),!0===e._backpressure&&Bt(e,!1)}function Bt(e,t){void 0!==e._backpressureChangePromise&&e._backpressureChangePromise_resolve(),e._backpressureChangePromise=new Promise(t=>{e._backpressureChangePromise_resolve=t}),e._backpressure=t}class jt{constructor(){throw new TypeError("TransformStreamDefaultController instances cannot be created directly")}get desiredSize(){if(!1===Tt(this))throw Dt("desiredSize");return Ze(this._controlledTransformStream._readable._readableStreamController)}enqueue(e){if(!1===Tt(this))throw Dt("enqueue");Ot(this,e)}error(e){if(!1===Tt(this))throw Dt("error");!function(e,t){Ut(e._controlledTransformStream,t)}(this,e)}terminate(){if(!1===Tt(this))throw Dt("terminate");!function(e){const t=e._controlledTransformStream,r=t._readable._readableStreamController;!0===Ve(r)&&He(r),Rt(t,new TypeError("TransformStream terminated"))}(this)}}function Tt(e){return!!a(e)&&!!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")}function It(e){e._transformAlgorithm=void 0,e._flushAlgorithm=void 0}function Ot(e,t){const r=e._controlledTransformStream,n=r._readable._readableStreamController;if(!1===Ve(n))throw new TypeError("Readable side is not in a state that permits enqueue");try{We(n,t)}catch(e){throw Rt(r,e),r._readable._storedError}!0!==Fe(n)!==r._backpressure&&Bt(r,!0)}function zt(e,t){return e._transformAlgorithm(t).catch(t=>{throw Ut(e._controlledTransformStream,t),t})}function Dt(e){return new TypeError(`TransformStreamDefaultController.prototype.${e} can only be used on a TransformStreamDefaultController`)}function qt(e){return new TypeError(`TransformStream.prototype.${e} can only be used on a TransformStream`)}const Nt={ReadableStream:he,WritableStream:P,ByteLengthQueuingStrategy:xt,CountQueuingStrategy:Mt,TransformStream:Ct};void 0!==n&&Object.assign(n,Nt),t.ReadableStream=he,t.WritableStream=P,t.ByteLengthQueuingStrategy=xt,t.CountQueuingStrategy=Mt,t.TransformStream=Ct,Object.defineProperty(t,"__esModule",{value:!0})}("object"==typeof r&&void 0!==t?r:(n=n||self).WebStreamsPolyfill={})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],2:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.AES_asm=function(){var e,t,r=!1;function n(r,n){var i=e[(t[r]+t[n])%255];return 0!==r&&0!==n||(i=0),i}var i,a,s,o,u=!1;function c(){function c(r){var n,i,a;for(i=a=function(r){var n=e[255-t[r]];return 0===r&&(n=0),n}(r),n=0;n<4;n++)a^=i=255&(i<<1|i>>>7);return a^=99}r||function(){e=[],t=[];var n,i,a=1;for(n=0;n<255;n++)e[n]=a,i=128&a,a<<=1,a&=255,128===i&&(a^=27),a^=e[n],t[e[n]]=n;e[255]=e[0],t[0]=0,r=!0}(),i=[],a=[],s=[[],[],[],[]],o=[[],[],[],[]];for(var f=0;f<256;f++){var d=c(f);i[f]=d,a[d]=f,s[0][f]=n(2,d)<<24|d<<16|d<<8|n(3,d),o[0][d]=n(14,f)<<24|n(9,f)<<16|n(13,f)<<8|n(11,f);for(var l=1;l<4;l++)s[l][f]=s[l-1][f]>>>8|s[l-1][f]<<24,o[l][d]=o[l-1][d]>>>8|o[l-1][d]<<24}u=!0}var f=function(e,t){u||c();var r=new Uint32Array(t);r.set(i,512),r.set(a,768);for(var n=0;n<4;n++)r.set(s[n],4096+1024*n>>2),r.set(o[n],8192+1024*n>>2);var f=function(e,t,r){"use asm";var n=0,i=0,a=0,s=0,o=0,u=0,c=0,f=0,d=0,l=0,h=0,p=0,y=0,b=0,m=0,g=0,w=0,_=0,v=0,k=0,A=0;var S=new e.Uint32Array(r),E=new e.Uint8Array(r);function P(e,t,r,o,u,c,f,d){e=e|0;t=t|0;r=r|0;o=o|0;u=u|0;c=c|0;f=f|0;d=d|0;var l=0,h=0,p=0,y=0,b=0,m=0,g=0,w=0;l=r|0x400,h=r|0x800,p=r|0xc00;u=u^S[(e|0)>>2],c=c^S[(e|4)>>2],f=f^S[(e|8)>>2],d=d^S[(e|12)>>2];for(w=16;(w|0)<=o<<4;w=w+16|0){y=S[(r|u>>22&1020)>>2]^S[(l|c>>14&1020)>>2]^S[(h|f>>6&1020)>>2]^S[(p|d<<2&1020)>>2]^S[(e|w|0)>>2],b=S[(r|c>>22&1020)>>2]^S[(l|f>>14&1020)>>2]^S[(h|d>>6&1020)>>2]^S[(p|u<<2&1020)>>2]^S[(e|w|4)>>2],m=S[(r|f>>22&1020)>>2]^S[(l|d>>14&1020)>>2]^S[(h|u>>6&1020)>>2]^S[(p|c<<2&1020)>>2]^S[(e|w|8)>>2],g=S[(r|d>>22&1020)>>2]^S[(l|u>>14&1020)>>2]^S[(h|c>>6&1020)>>2]^S[(p|f<<2&1020)>>2]^S[(e|w|12)>>2];u=y,c=b,f=m,d=g}n=S[(t|u>>22&1020)>>2]<<24^S[(t|c>>14&1020)>>2]<<16^S[(t|f>>6&1020)>>2]<<8^S[(t|d<<2&1020)>>2]^S[(e|w|0)>>2],i=S[(t|c>>22&1020)>>2]<<24^S[(t|f>>14&1020)>>2]<<16^S[(t|d>>6&1020)>>2]<<8^S[(t|u<<2&1020)>>2]^S[(e|w|4)>>2],a=S[(t|f>>22&1020)>>2]<<24^S[(t|d>>14&1020)>>2]<<16^S[(t|u>>6&1020)>>2]<<8^S[(t|c<<2&1020)>>2]^S[(e|w|8)>>2],s=S[(t|d>>22&1020)>>2]<<24^S[(t|u>>14&1020)>>2]<<16^S[(t|c>>6&1020)>>2]<<8^S[(t|f<<2&1020)>>2]^S[(e|w|12)>>2]}function x(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;P(0x0000,0x0800,0x1000,A,e,t,r,n)}function M(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;var a=0;P(0x0400,0x0c00,0x2000,A,e,n,r,t);a=i,i=s,s=a}function C(e,t,r,d){e=e|0;t=t|0;r=r|0;d=d|0;P(0x0000,0x0800,0x1000,A,o^e,u^t,c^r,f^d);o=n,u=i,c=a,f=s}function K(e,t,r,d){e=e|0;t=t|0;r=r|0;d=d|0;var l=0;P(0x0400,0x0c00,0x2000,A,e,d,r,t);l=i,i=s,s=l;n=n^o,i=i^u,a=a^c,s=s^f;o=e,u=t,c=r,f=d}function U(e,t,r,d){e=e|0;t=t|0;r=r|0;d=d|0;P(0x0000,0x0800,0x1000,A,o,u,c,f);o=n=n^e,u=i=i^t,c=a=a^r,f=s=s^d}function R(e,t,r,d){e=e|0;t=t|0;r=r|0;d=d|0;P(0x0000,0x0800,0x1000,A,o,u,c,f);n=n^e,i=i^t,a=a^r,s=s^d;o=e,u=t,c=r,f=d}function B(e,t,r,d){e=e|0;t=t|0;r=r|0;d=d|0;P(0x0000,0x0800,0x1000,A,o,u,c,f);o=n,u=i,c=a,f=s;n=n^e,i=i^t,a=a^r,s=s^d}function j(e,t,r,o){e=e|0;t=t|0;r=r|0;o=o|0;P(0x0000,0x0800,0x1000,A,d,l,h,p);p=~g&p|g&p+1;h=~m&h|m&h+((p|0)==0);l=~b&l|b&l+((h|0)==0);d=~y&d|y&d+((l|0)==0);n=n^e;i=i^t;a=a^r;s=s^o}function T(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;var i=0,a=0,s=0,d=0,l=0,h=0,p=0,y=0,b=0,m=0;e=e^o,t=t^u,r=r^c,n=n^f;i=w|0,a=_|0,s=v|0,d=k|0;for(;(b|0)<128;b=b+1|0){if(i>>>31){l=l^e,h=h^t,p=p^r,y=y^n}i=i<<1|a>>>31,a=a<<1|s>>>31,s=s<<1|d>>>31,d=d<<1;m=n&1;n=n>>>1|r<<31,r=r>>>1|t<<31,t=t>>>1|e<<31,e=e>>>1;if(m)e=e^0xe1000000}o=l,u=h,c=p,f=y}function I(e){e=e|0;A=e}function O(e,t,r,o){e=e|0;t=t|0;r=r|0;o=o|0;n=e,i=t,a=r,s=o}function z(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;o=e,u=t,c=r,f=n}function D(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;d=e,l=t,h=r,p=n}function q(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;y=e,b=t,m=r,g=n}function N(e,t,r,n){e=e|0;t=t|0;r=r|0;n=n|0;p=~g&p|g&n,h=~m&h|m&r,l=~b&l|b&t,d=~y&d|y&e}function F(e){e=e|0;if(e&15)return-1;E[e|0]=n>>>24,E[e|1]=n>>>16&255,E[e|2]=n>>>8&255,E[e|3]=n&255,E[e|4]=i>>>24,E[e|5]=i>>>16&255,E[e|6]=i>>>8&255,E[e|7]=i&255,E[e|8]=a>>>24,E[e|9]=a>>>16&255,E[e|10]=a>>>8&255,E[e|11]=a&255,E[e|12]=s>>>24,E[e|13]=s>>>16&255,E[e|14]=s>>>8&255,E[e|15]=s&255;return 16}function L(e){e=e|0;if(e&15)return-1;E[e|0]=o>>>24,E[e|1]=o>>>16&255,E[e|2]=o>>>8&255,E[e|3]=o&255,E[e|4]=u>>>24,E[e|5]=u>>>16&255,E[e|6]=u>>>8&255,E[e|7]=u&255,E[e|8]=c>>>24,E[e|9]=c>>>16&255,E[e|10]=c>>>8&255,E[e|11]=c&255,E[e|12]=f>>>24,E[e|13]=f>>>16&255,E[e|14]=f>>>8&255,E[e|15]=f&255;return 16}function H(){x(0,0,0,0);w=n,_=i,v=a,k=s}function W(e,t,r){e=e|0;t=t|0;r=r|0;var o=0;if(t&15)return-1;while((r|0)>=16){Z[e&7](E[t|0]<<24|E[t|1]<<16|E[t|2]<<8|E[t|3],E[t|4]<<24|E[t|5]<<16|E[t|6]<<8|E[t|7],E[t|8]<<24|E[t|9]<<16|E[t|10]<<8|E[t|11],E[t|12]<<24|E[t|13]<<16|E[t|14]<<8|E[t|15]);E[t|0]=n>>>24,E[t|1]=n>>>16&255,E[t|2]=n>>>8&255,E[t|3]=n&255,E[t|4]=i>>>24,E[t|5]=i>>>16&255,E[t|6]=i>>>8&255,E[t|7]=i&255,E[t|8]=a>>>24,E[t|9]=a>>>16&255,E[t|10]=a>>>8&255,E[t|11]=a&255,E[t|12]=s>>>24,E[t|13]=s>>>16&255,E[t|14]=s>>>8&255,E[t|15]=s&255;o=o+16|0,t=t+16|0,r=r-16|0}return o|0}function G(e,t,r){e=e|0;t=t|0;r=r|0;var n=0;if(t&15)return-1;while((r|0)>=16){V[e&1](E[t|0]<<24|E[t|1]<<16|E[t|2]<<8|E[t|3],E[t|4]<<24|E[t|5]<<16|E[t|6]<<8|E[t|7],E[t|8]<<24|E[t|9]<<16|E[t|10]<<8|E[t|11],E[t|12]<<24|E[t|13]<<16|E[t|14]<<8|E[t|15]);n=n+16|0,t=t+16|0,r=r-16|0}return n|0}var Z=[x,M,C,K,U,R,B,j];var V=[C,T];return{set_rounds:I,set_state:O,set_iv:z,set_nonce:D,set_mask:q,set_counter:N,get_state:F,get_iv:L,gcm_init:H,cipher:W,mac:G}}({Uint8Array:Uint8Array,Uint32Array:Uint32Array},e,t);return f.set_key=function(e,t,n,a,s,u,c,d,l){var h=r.subarray(0,60),p=r.subarray(256,316);h.set([t,n,a,s,u,c,d,l]);for(var y=e,b=1;y<4*e+28;y++){var m=h[y-1];(y%e==0||8===e&&y%e==4)&&(m=i[m>>>24]<<24^i[m>>>16&255]<<16^i[m>>>8&255]<<8^i[255&m]),y%e==0&&(m=m<<8^m>>>24^b<<24,b=b<<1^(128&b?27:0)),h[y]=h[y-e]^m}for(var g=0;g=y-4?m:o[0][i[m>>>24]]^o[1][i[m>>>16&255]]^o[2][i[m>>>8&255]]^o[3][i[255&m]];f.set_rounds(e+5)},f};return f.ENC={ECB:0,CBC:2,CFB:4,OFB:6,CTR:7},f.DEC={ECB:1,CBC:3,CFB:5,OFB:6,CTR:7},f.MAC={CBC:0,GCM:1},f.HEAP_DATA=16384,f}()},{}],3:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.AES=void 0;var n=e("./aes.asm"),i=e("../other/utils"),a=e("../other/errors"),s=[],o=[],u=function(){function e(e,t,r,n){void 0===r&&(r=!0),this.pos=0,this.len=0,this.mode=n,this.pos=0,this.len=0,this.key=e,this.iv=t,this.padding=r,this.acquire_asm()}return e.prototype.acquire_asm=function(){void 0===this.heap&&void 0===this.asm&&(this.heap=s.pop()||(0,i._heap_init)().subarray(n.AES_asm.HEAP_DATA),this.asm=o.pop()||(0,n.AES_asm)(null,this.heap.buffer),this.reset(this.key,this.iv))},e.prototype.release_asm=function(){s.push(this.heap),o.push(this.asm),this.heap=void 0,this.asm=void 0},e.prototype.reset=function(e,t){var r=e.length;if(16!==r&&24!==r&&32!==r)throw new a.IllegalArgumentError("illegal key size");var n=new DataView(e.buffer,e.byteOffset,e.byteLength);if(this.asm.set_key(r>>2,n.getUint32(0),n.getUint32(4),n.getUint32(8),n.getUint32(12),r>16?n.getUint32(16):0,r>16?n.getUint32(20):0,r>24?n.getUint32(24):0,r>24?n.getUint32(28):0),void 0!==t){if(16!==t.length)throw new a.IllegalArgumentError("illegal iv size");var i=new DataView(t.buffer,t.byteOffset,t.byteLength);this.asm.set_iv(i.getUint32(0),i.getUint32(4),i.getUint32(8),i.getUint32(12))}else this.asm.set_iv(0,0,0,0)},e.prototype.AES_Encrypt_process=function(e){if(!(0,i.is_bytes)(e))throw new TypeError("data isn't of expected type");this.acquire_asm();for(var t=this.asm,r=this.heap,a=n.AES_asm.ENC[this.mode],s=n.AES_asm.HEAP_DATA,o=this.pos,u=this.len,c=0,f=e.length||0,d=0,l=0,h=new Uint8Array(u+f&-16);f>0;)u+=l=(0,i._heap_write)(r,o+u,e,c,f),c+=l,f-=l,(l=t.cipher(a,s+o,u))&&h.set(r.subarray(o,o+l),d),d+=l,l0;)u+=p=(0,i._heap_write)(r,o+u,e,c,f),c+=p,f-=p,(p=t.cipher(a,s+o,u-(f?0:h)))&&y.set(r.subarray(o,o+p),d),d+=p,p0){if(o%16){if(this.hasOwnProperty("padding"))throw new a.IllegalArgumentError("data length must be a multiple of the block size");o+=16-o%16}if(e.cipher(r,i+s,o),this.hasOwnProperty("padding")&&this.padding){var c=t[s+u-1];if(c<1||c>16||c>u)throw new a.SecurityError("bad padding");for(var f=0,d=c;d>1;d--)f|=c^t[s+u-d];if(f)throw new a.SecurityError("bad padding");u-=c}}var l=new Uint8Array(u);return u>0&&l.set(t.subarray(s,s+u)),this.pos=0,this.len=0,this.release_asm(),l},e}();r.AES=u},{"../other/errors":14,"../other/utils":15,"./aes.asm":2}],4:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.AES_CBC=void 0;var n,i=e("./aes"),a=e("../other/utils"),s=(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=function(e){function t(t,r,n){return void 0===n&&(n=!0),e.call(this,t,r,n,"CBC")||this}return s(t,e),t.encrypt=function(e,r,n,i){return void 0===n&&(n=!0),new t(r,i,n).encrypt(e)},t.decrypt=function(e,r,n,i){return void 0===n&&(n=!0),new t(r,i,n).decrypt(e)},t.prototype.encrypt=function(e){var t=this.AES_Encrypt_process(e),r=this.AES_Encrypt_finish();return(0,a.joinBytes)(t,r)},t.prototype.decrypt=function(e){var t=this.AES_Decrypt_process(e),r=this.AES_Decrypt_finish();return(0,a.joinBytes)(t,r)},t}(i.AES);r.AES_CBC=o},{"../other/utils":15,"./aes":3}],5:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.AES_CFB=void 0;var n,i=e("./aes"),a=e("../other/utils"),s=(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=function(e){function t(t,r){var n=e.call(this,t,r,!0,"CFB")||this;return delete n.padding,n}return s(t,e),t.encrypt=function(e,r,n){return new t(r,n).encrypt(e)},t.decrypt=function(e,r,n){return new t(r,n).decrypt(e)},t.prototype.encrypt=function(e){var t=this.AES_Encrypt_process(e),r=this.AES_Encrypt_finish();return(0,a.joinBytes)(t,r)},t.prototype.decrypt=function(e){var t=this.AES_Decrypt_process(e),r=this.AES_Decrypt_finish();return(0,a.joinBytes)(t,r)},t}(i.AES);r.AES_CFB=o},{"../other/utils":15,"./aes":3}],6:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.AES_CTR=void 0;var n,i=e("./aes"),a=e("../other/errors"),s=e("../other/utils"),o=(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),u=function(e){function t(t,r){var n=e.call(this,t,void 0,!1,"CTR")||this;return delete n.padding,n.AES_CTR_set_options(r),n}return o(t,e),t.encrypt=function(e,r,n){return new t(r,n).encrypt(e)},t.decrypt=function(e,r,n){return new t(r,n).encrypt(e)},t.prototype.encrypt=function(e){var t=this.AES_Encrypt_process(e),r=this.AES_Encrypt_finish();return(0,s.joinBytes)(t,r)},t.prototype.decrypt=function(e){var t=this.AES_Encrypt_process(e),r=this.AES_Encrypt_finish();return(0,s.joinBytes)(t,r)},t.prototype.AES_CTR_set_options=function(e,t,r){if(void 0!==r){if(r<8||r>48)throw new a.IllegalArgumentError("illegal counter size");var n=Math.pow(2,r)-1;this.asm.set_mask(0,0,n/4294967296|0,0|n)}else r=48,this.asm.set_mask(0,0,65535,4294967295);if(void 0===e)throw new Error("nonce is required");var i=e.length;if(!i||i>16)throw new a.IllegalArgumentError("illegal nonce size");var s=new DataView(new ArrayBuffer(16));if(new Uint8Array(s.buffer).set(e),this.asm.set_nonce(s.getUint32(0),s.getUint32(4),s.getUint32(8),s.getUint32(12)),void 0!==t){if(t<0||t>=Math.pow(2,r))throw new a.IllegalArgumentError("illegal counter value");this.asm.set_counter(0,0,t/4294967296|0,0|t)}},t}(i.AES);r.AES_CTR=u},{"../other/errors":14,"../other/utils":15,"./aes":3}],7:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.AES_ECB=void 0;var n,i=e("./aes"),a=e("../other/utils"),s=(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=function(e){function t(t,r){return void 0===r&&(r=!1),e.call(this,t,void 0,r,"ECB")||this}return s(t,e),t.encrypt=function(e,r,n){return void 0===n&&(n=!1),new t(r,n).encrypt(e)},t.decrypt=function(e,r,n){return void 0===n&&(n=!1),new t(r,n).decrypt(e)},t.prototype.encrypt=function(e){var t=this.AES_Encrypt_process(e),r=this.AES_Encrypt_finish();return(0,a.joinBytes)(t,r)},t.prototype.decrypt=function(e){var t=this.AES_Decrypt_process(e),r=this.AES_Decrypt_finish();return(0,a.joinBytes)(t,r)},t}(i.AES);r.AES_ECB=o},{"../other/utils":15,"./aes":3}],8:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.AES_GCM=void 0;var n,i=e("../other/errors"),a=e("../other/utils"),s=e("./aes"),o=e("./aes.asm"),u=(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),c=68719476704,f=function(e){function t(t,r,n,a){void 0===a&&(a=16);var s=e.call(this,t,void 0,!1,"CTR")||this;if(s.tagSize=a,s.gamma0=0,s.counter=1,s.asm.gcm_init(),s.tagSize<4||s.tagSize>16)throw new i.IllegalArgumentError("illegal tagSize value");var u=r.length||0,f=new Uint8Array(16);12!==u?(s._gcm_mac_process(r),s.heap[0]=0,s.heap[1]=0,s.heap[2]=0,s.heap[3]=0,s.heap[4]=0,s.heap[5]=0,s.heap[6]=0,s.heap[7]=0,s.heap[8]=0,s.heap[9]=0,s.heap[10]=0,s.heap[11]=u>>>29,s.heap[12]=u>>>21&255,s.heap[13]=u>>>13&255,s.heap[14]=u>>>5&255,s.heap[15]=u<<3&255,s.asm.mac(o.AES_asm.MAC.GCM,o.AES_asm.HEAP_DATA,16),s.asm.get_iv(o.AES_asm.HEAP_DATA),s.asm.set_iv(0,0,0,0),f.set(s.heap.subarray(0,16))):(f.set(r),f[15]=1);var d=new DataView(f.buffer);if(s.gamma0=d.getUint32(12),s.asm.set_nonce(d.getUint32(0),d.getUint32(4),d.getUint32(8),0),s.asm.set_mask(0,0,0,4294967295),void 0!==n){if(n.length>c)throw new i.IllegalArgumentError("illegal adata length");n.length?(s.adata=n,s._gcm_mac_process(n)):s.adata=void 0}else s.adata=void 0;if(s.counter<1||s.counter>4294967295)throw new RangeError("counter must be a positive 32-bit integer");return s.asm.set_counter(0,0,0,s.gamma0+s.counter|0),s}return u(t,e),t.encrypt=function(e,r,n,i,a){return new t(r,n,i,a).encrypt(e)},t.decrypt=function(e,r,n,i,a){return new t(r,n,i,a).decrypt(e)},t.prototype.encrypt=function(e){return this.AES_GCM_encrypt(e)},t.prototype.decrypt=function(e){return this.AES_GCM_decrypt(e)},t.prototype.AES_GCM_Encrypt_process=function(e){var t=0,r=e.length||0,n=this.asm,i=this.heap,s=this.counter,u=this.pos,f=this.len,d=0,l=f+r&-16,h=0;if((s-1<<4)+f+r>c)throw new RangeError("counter overflow");for(var p=new Uint8Array(l);r>0;)f+=h=(0,a._heap_write)(i,u+f,e,t,r),t+=h,r-=h,h=n.cipher(o.AES_asm.ENC.CTR,o.AES_asm.HEAP_DATA+u,f),(h=n.mac(o.AES_asm.MAC.GCM,o.AES_asm.HEAP_DATA+u,h))&&p.set(i.subarray(u,u+h),d),s+=h>>>4,d+=h,h>>29,t[4]=f>>>21,t[5]=f>>>13&255,t[6]=f>>>5&255,t[7]=f<<3&255,t[8]=t[9]=t[10]=0,t[11]=d>>>29,t[12]=d>>>21&255,t[13]=d>>>13&255,t[14]=d>>>5&255,t[15]=d<<3&255,e.mac(o.AES_asm.MAC.GCM,o.AES_asm.HEAP_DATA,16),e.get_iv(o.AES_asm.HEAP_DATA),e.set_counter(0,0,0,this.gamma0),e.cipher(o.AES_asm.ENC.CTR,o.AES_asm.HEAP_DATA,16),u.set(t.subarray(0,n),s),this.counter=1,this.pos=0,this.len=0,u},t.prototype.AES_GCM_Decrypt_process=function(e){var t=0,r=e.length||0,n=this.asm,i=this.heap,s=this.counter,u=this.tagSize,f=this.pos,d=this.len,l=0,h=d+r>u?d+r-u&-16:0,p=d+r-h,y=0;if((s-1<<4)+d+r>c)throw new RangeError("counter overflow");for(var b=new Uint8Array(h);r>p;)d+=y=(0,a._heap_write)(i,f+d,e,t,r-p),t+=y,r-=y,y=n.mac(o.AES_asm.MAC.GCM,o.AES_asm.HEAP_DATA+f,y),(y=n.cipher(o.AES_asm.DEC.CTR,o.AES_asm.HEAP_DATA+f,y))&&b.set(i.subarray(f,f+y),l),s+=y>>>4,l+=y,f=0,d=0;return r>0&&(d+=(0,a._heap_write)(i,0,e,t,r)),this.counter=s,this.pos=f,this.len=d,b},t.prototype.AES_GCM_Decrypt_finish=function(){var e=this.asm,t=this.heap,r=this.tagSize,n=this.adata,a=this.counter,s=this.pos,u=this.len,c=u-r;if(u>>29,t[4]=h>>>21,t[5]=h>>>13&255,t[6]=h>>>5&255,t[7]=h<<3&255,t[8]=t[9]=t[10]=0,t[11]=p>>>29,t[12]=p>>>21&255,t[13]=p>>>13&255,t[14]=p>>>5&255,t[15]=p<<3&255,e.mac(o.AES_asm.MAC.GCM,o.AES_asm.HEAP_DATA,16),e.get_iv(o.AES_asm.HEAP_DATA),e.set_counter(0,0,0,this.gamma0),e.cipher(o.AES_asm.ENC.CTR,o.AES_asm.HEAP_DATA,16);for(var y=0,b=0;b0;){for(n+=s=(0,a._heap_write)(t,0,e,n,i),i-=s;15&s;)t[s++]=0;r.mac(o.AES_asm.MAC.GCM,o.AES_asm.HEAP_DATA,s)}},t}(s.AES);r.AES_GCM=f},{"../other/errors":14,"../other/utils":15,"./aes":3,"./aes.asm":2}],9:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Hash=void 0;var n=e("../other/utils"),i=e("../other/errors"),a=function(){function e(){this.pos=0,this.len=0,this.acquire_asm()}return e.prototype.acquire_asm=function(){void 0===this.heap&&void 0===this.asm&&(this.heap=this.constructor.heap_pool.pop()||(0,n._heap_init)(),this.asm=this.constructor.asm_pool.pop()||this.constructor.asm_function({Uint8Array:Uint8Array},null,this.heap.buffer),this.reset())},e.prototype.release_asm=function(){this.constructor.heap_pool.push(this.heap),this.constructor.asm_pool.push(this.asm),this.heap=void 0,this.asm=void 0},e.prototype.reset=function(){return this.acquire_asm(),this.result=null,this.pos=0,this.len=0,this.asm.reset(),this},e.prototype.process=function(e){if(null!==this.result)throw new i.IllegalStateError("state must be reset before processing new data");this.acquire_asm();for(var t=this.asm,r=this.heap,a=this.pos,s=this.len,o=0,u=e.length,c=0;u>0;)s+=c=(0,n._heap_write)(r,a+s,e,o,u),o+=c,u-=c,a+=c=t.process(a,s),(s-=c)||(a=0);return this.pos=a,this.len=s,this},e.prototype.finish=function(){if(null!==this.result)throw new i.IllegalStateError("state must be reset before processing new data");return 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(),this},e}();r.Hash=a},{"../other/errors":14,"../other/utils":15}],10:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.sha1_asm=function(e,t,r){"use asm";var n=0,i=0,a=0,s=0,o=0,u=0,c=0;var f=0,d=0,l=0,h=0,p=0,y=0,b=0,m=0,g=0,w=0;var _=new e.Uint8Array(r);function v(e,t,r,u,c,f,d,l,h,p,y,b,m,g,w,_){e=e|0;t=t|0;r=r|0;u=u|0;c=c|0;f=f|0;d=d|0;l=l|0;h=h|0;p=p|0;y=y|0;b=b|0;m=m|0;g=g|0;w=w|0;_=_|0;var v=0,k=0,A=0,S=0,E=0,P=0,x=0,M=0,C=0,K=0,U=0,R=0,B=0,j=0,T=0,I=0,O=0,z=0,D=0,q=0,N=0,F=0,L=0,H=0,W=0,G=0,Z=0,V=0,Y=0,$=0,J=0,X=0,Q=0,ee=0,te=0,re=0,ne=0,ie=0,ae=0,se=0,oe=0,ue=0,ce=0,fe=0,de=0,le=0,he=0,pe=0,ye=0,be=0,me=0,ge=0,we=0,_e=0,ve=0,ke=0,Ae=0,Se=0,Ee=0,Pe=0,xe=0,Me=0,Ce=0,Ke=0,Ue=0,Re=0,Be=0,je=0,Te=0,Ie=0,Oe=0;v=n;k=i;A=a;S=s;E=o;x=e+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=t+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=r+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=u+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=c+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=f+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=d+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=l+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=h+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=p+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=y+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=b+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=m+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=g+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=w+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;x=_+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=g^h^r^e;M=P<<1|P>>>31;x=M+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=w^p^u^t;C=P<<1|P>>>31;x=C+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=_^y^c^r;K=P<<1|P>>>31;x=K+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=M^b^f^u;U=P<<1|P>>>31;x=U+(v<<5|v>>>27)+E+(k&A|~k&S)+0x5a827999|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=C^m^d^c;R=P<<1|P>>>31;x=R+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=K^g^l^f;B=P<<1|P>>>31;x=B+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=U^w^h^d;j=P<<1|P>>>31;x=j+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=R^_^p^l;T=P<<1|P>>>31;x=T+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=B^M^y^h;I=P<<1|P>>>31;x=I+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=j^C^b^p;O=P<<1|P>>>31;x=O+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=T^K^m^y;z=P<<1|P>>>31;x=z+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=I^U^g^b;D=P<<1|P>>>31;x=D+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=O^R^w^m;q=P<<1|P>>>31;x=q+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=z^B^_^g;N=P<<1|P>>>31;x=N+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=D^j^M^w;F=P<<1|P>>>31;x=F+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=q^T^C^_;L=P<<1|P>>>31;x=L+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=N^I^K^M;H=P<<1|P>>>31;x=H+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=F^O^U^C;W=P<<1|P>>>31;x=W+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=L^z^R^K;G=P<<1|P>>>31;x=G+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=H^D^B^U;Z=P<<1|P>>>31;x=Z+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=W^q^j^R;V=P<<1|P>>>31;x=V+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=G^N^T^B;Y=P<<1|P>>>31;x=Y+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Z^F^I^j;$=P<<1|P>>>31;x=$+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=V^L^O^T;J=P<<1|P>>>31;x=J+(v<<5|v>>>27)+E+(k^A^S)+0x6ed9eba1|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Y^H^z^I;X=P<<1|P>>>31;x=X+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=$^W^D^O;Q=P<<1|P>>>31;x=Q+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=J^G^q^z;ee=P<<1|P>>>31;x=ee+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=X^Z^N^D;te=P<<1|P>>>31;x=te+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Q^V^F^q;re=P<<1|P>>>31;x=re+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=ee^Y^L^N;ne=P<<1|P>>>31;x=ne+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=te^$^H^F;ie=P<<1|P>>>31;x=ie+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=re^J^W^L;ae=P<<1|P>>>31;x=ae+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=ne^X^G^H;se=P<<1|P>>>31;x=se+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=ie^Q^Z^W;oe=P<<1|P>>>31;x=oe+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=ae^ee^V^G;ue=P<<1|P>>>31;x=ue+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=se^te^Y^Z;ce=P<<1|P>>>31;x=ce+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=oe^re^$^V;fe=P<<1|P>>>31;x=fe+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=ue^ne^J^Y;de=P<<1|P>>>31;x=de+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=ce^ie^X^$;le=P<<1|P>>>31;x=le+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=fe^ae^Q^J;he=P<<1|P>>>31;x=he+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=de^se^ee^X;pe=P<<1|P>>>31;x=pe+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=le^oe^te^Q;ye=P<<1|P>>>31;x=ye+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=he^ue^re^ee;be=P<<1|P>>>31;x=be+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=pe^ce^ne^te;me=P<<1|P>>>31;x=me+(v<<5|v>>>27)+E+(k&A|k&S|A&S)-0x70e44324|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=ye^fe^ie^re;ge=P<<1|P>>>31;x=ge+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=be^de^ae^ne;we=P<<1|P>>>31;x=we+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=me^le^se^ie;_e=P<<1|P>>>31;x=_e+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=ge^he^oe^ae;ve=P<<1|P>>>31;x=ve+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=we^pe^ue^se;ke=P<<1|P>>>31;x=ke+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=_e^ye^ce^oe;Ae=P<<1|P>>>31;x=Ae+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=ve^be^fe^ue;Se=P<<1|P>>>31;x=Se+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=ke^me^de^ce;Ee=P<<1|P>>>31;x=Ee+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Ae^ge^le^fe;Pe=P<<1|P>>>31;x=Pe+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Se^we^he^de;xe=P<<1|P>>>31;x=xe+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Ee^_e^pe^le;Me=P<<1|P>>>31;x=Me+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Pe^ve^ye^he;Ce=P<<1|P>>>31;x=Ce+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=xe^ke^be^pe;Ke=P<<1|P>>>31;x=Ke+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Me^Ae^me^ye;Ue=P<<1|P>>>31;x=Ue+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Ce^Se^ge^be;Re=P<<1|P>>>31;x=Re+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Ke^Ee^we^me;Be=P<<1|P>>>31;x=Be+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Ue^Pe^_e^ge;je=P<<1|P>>>31;x=je+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Re^xe^ve^we;Te=P<<1|P>>>31;x=Te+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=Be^Me^ke^_e;Ie=P<<1|P>>>31;x=Ie+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;P=je^Ce^Ae^ve;Oe=P<<1|P>>>31;x=Oe+(v<<5|v>>>27)+E+(k^A^S)-0x359d3e2a|0;E=S;S=A;A=k<<30|k>>>2;k=v;v=x;n=n+v|0;i=i+k|0;a=a+A|0;s=s+S|0;o=o+E|0}function k(e){e=e|0;v(_[e|0]<<24|_[e|1]<<16|_[e|2]<<8|_[e|3],_[e|4]<<24|_[e|5]<<16|_[e|6]<<8|_[e|7],_[e|8]<<24|_[e|9]<<16|_[e|10]<<8|_[e|11],_[e|12]<<24|_[e|13]<<16|_[e|14]<<8|_[e|15],_[e|16]<<24|_[e|17]<<16|_[e|18]<<8|_[e|19],_[e|20]<<24|_[e|21]<<16|_[e|22]<<8|_[e|23],_[e|24]<<24|_[e|25]<<16|_[e|26]<<8|_[e|27],_[e|28]<<24|_[e|29]<<16|_[e|30]<<8|_[e|31],_[e|32]<<24|_[e|33]<<16|_[e|34]<<8|_[e|35],_[e|36]<<24|_[e|37]<<16|_[e|38]<<8|_[e|39],_[e|40]<<24|_[e|41]<<16|_[e|42]<<8|_[e|43],_[e|44]<<24|_[e|45]<<16|_[e|46]<<8|_[e|47],_[e|48]<<24|_[e|49]<<16|_[e|50]<<8|_[e|51],_[e|52]<<24|_[e|53]<<16|_[e|54]<<8|_[e|55],_[e|56]<<24|_[e|57]<<16|_[e|58]<<8|_[e|59],_[e|60]<<24|_[e|61]<<16|_[e|62]<<8|_[e|63])}function A(e){e=e|0;_[e|0]=n>>>24;_[e|1]=n>>>16&255;_[e|2]=n>>>8&255;_[e|3]=n&255;_[e|4]=i>>>24;_[e|5]=i>>>16&255;_[e|6]=i>>>8&255;_[e|7]=i&255;_[e|8]=a>>>24;_[e|9]=a>>>16&255;_[e|10]=a>>>8&255;_[e|11]=a&255;_[e|12]=s>>>24;_[e|13]=s>>>16&255;_[e|14]=s>>>8&255;_[e|15]=s&255;_[e|16]=o>>>24;_[e|17]=o>>>16&255;_[e|18]=o>>>8&255;_[e|19]=o&255}function S(){n=0x67452301;i=0xefcdab89;a=0x98badcfe;s=0x10325476;o=0xc3d2e1f0;u=c=0}function E(e,t,r,f,d,l,h){e=e|0;t=t|0;r=r|0;f=f|0;d=d|0;l=l|0;h=h|0;n=e;i=t;a=r;s=f;o=d;u=l;c=h}function P(e,t){e=e|0;t=t|0;var r=0;if(e&63)return-1;while((t|0)>=64){k(e);e=e+64|0;t=t-64|0;r=r+64|0}u=u+r|0;if(u>>>0>>0)c=c+1|0;return r|0}function x(e,t,r){e=e|0;t=t|0;r=r|0;var n=0,i=0;if(e&63)return-1;if(~r)if(r&31)return-1;if((t|0)>=64){n=P(e,t)|0;if((n|0)==-1)return-1;e=e+n|0;t=t-n|0}n=n+t|0;u=u+t|0;if(u>>>0>>0)c=c+1|0;_[e|t]=0x80;if((t|0)>=56){for(i=t+1|0;(i|0)<64;i=i+1|0)_[e|i]=0x00;k(e);t=0;_[e|0]=0}for(i=t+1|0;(i|0)<59;i=i+1|0)_[e|i]=0;_[e|56]=c>>>21&255;_[e|57]=c>>>13&255;_[e|58]=c>>>5&255;_[e|59]=c<<3&255|u>>>29;_[e|60]=u>>>21&255;_[e|61]=u>>>13&255;_[e|62]=u>>>5&255;_[e|63]=u<<3&255;k(e);if(~r)A(r);return n|0}function M(){n=f;i=d;a=l;s=h;o=p;u=64;c=0}function C(){n=y;i=b;a=m;s=g;o=w;u=64;c=0}function K(e,t,r,_,k,A,E,P,x,M,C,K,U,R,B,j){e=e|0;t=t|0;r=r|0;_=_|0;k=k|0;A=A|0;E=E|0;P=P|0;x=x|0;M=M|0;C=C|0;K=K|0;U=U|0;R=R|0;B=B|0;j=j|0;S();v(e^0x5c5c5c5c,t^0x5c5c5c5c,r^0x5c5c5c5c,_^0x5c5c5c5c,k^0x5c5c5c5c,A^0x5c5c5c5c,E^0x5c5c5c5c,P^0x5c5c5c5c,x^0x5c5c5c5c,M^0x5c5c5c5c,C^0x5c5c5c5c,K^0x5c5c5c5c,U^0x5c5c5c5c,R^0x5c5c5c5c,B^0x5c5c5c5c,j^0x5c5c5c5c);y=n;b=i;m=a;g=s;w=o;S();v(e^0x36363636,t^0x36363636,r^0x36363636,_^0x36363636,k^0x36363636,A^0x36363636,E^0x36363636,P^0x36363636,x^0x36363636,M^0x36363636,C^0x36363636,K^0x36363636,U^0x36363636,R^0x36363636,B^0x36363636,j^0x36363636);f=n;d=i;l=a;h=s;p=o;u=64;c=0}function U(e,t,r){e=e|0;t=t|0;r=r|0;var u=0,c=0,f=0,d=0,l=0,h=0;if(e&63)return-1;if(~r)if(r&31)return-1;h=x(e,t,-1)|0;u=n,c=i,f=a,d=s,l=o;C();v(u,c,f,d,l,0x80000000,0,0,0,0,0,0,0,0,0,672);if(~r)A(r);return h|0}function R(e,t,r,u,c){e=e|0;t=t|0;r=r|0;u=u|0;c=c|0;var f=0,d=0,l=0,h=0,p=0,y=0,b=0,m=0,g=0,w=0;if(e&63)return-1;if(~c)if(c&31)return-1;_[e+t|0]=r>>>24;_[e+t+1|0]=r>>>16&255;_[e+t+2|0]=r>>>8&255;_[e+t+3|0]=r&255;U(e,t+4|0,-1)|0;f=y=n,d=b=i,l=m=a,h=g=s,p=w=o;u=u-1|0;while((u|0)>0){M();v(y,b,m,g,w,0x80000000,0,0,0,0,0,0,0,0,0,672);y=n,b=i,m=a,g=s,w=o;C();v(y,b,m,g,w,0x80000000,0,0,0,0,0,0,0,0,0,672);y=n,b=i,m=a,g=s,w=o;f=f^n;d=d^i;l=l^a;h=h^s;p=p^o;u=u-1|0}n=f;i=d;a=l;s=h;o=p;if(~c)A(c);return 0}return{reset:S,init:E,process:P,finish:x,hmac_reset:M,hmac_init:K,hmac_finish:U,pbkdf2_generate_block:R}}},{}],11:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Sha1=r._sha1_hash_size=r._sha1_block_size=void 0;var n,i=e("./sha1.asm"),a=e("../hash"),s=(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=r._sha1_block_size=64,u=r._sha1_hash_size=20,c=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.NAME="sha1",t.BLOCK_SIZE=o,t.HASH_SIZE=u,t}return s(t,e),t.bytes=function(e){return(new t).process(e).finish().result},t.NAME="sha1",t.heap_pool=[],t.asm_pool=[],t.asm_function=i.sha1_asm,t}(a.Hash);r.Sha1=c},{"../hash":9,"./sha1.asm":10}],12:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.sha256_asm=function(e,t,r){"use asm";var n=0,i=0,a=0,s=0,o=0,u=0,c=0,f=0,d=0,l=0;var h=0,p=0,y=0,b=0,m=0,g=0,w=0,_=0,v=0,k=0,A=0,S=0,E=0,P=0,x=0,M=0;var C=new e.Uint8Array(r);function K(e,t,r,d,l,h,p,y,b,m,g,w,_,v,k,A){e=e|0;t=t|0;r=r|0;d=d|0;l=l|0;h=h|0;p=p|0;y=y|0;b=b|0;m=m|0;g=g|0;w=w|0;_=_|0;v=v|0;k=k|0;A=A|0;var S=0,E=0,P=0,x=0,M=0,C=0,K=0,U=0;S=n;E=i;P=a;x=s;M=o;C=u;K=c;U=f;U=e+U+(M>>>6^M>>>11^M>>>25^M<<26^M<<21^M<<7)+(K^M&(C^K))+0x428a2f98|0;x=x+U|0;U=U+(S&E^P&(S^E))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;K=t+K+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(C^x&(M^C))+0x71374491|0;P=P+K|0;K=K+(U&S^E&(U^S))+(U>>>2^U>>>13^U>>>22^U<<30^U<<19^U<<10)|0;C=r+C+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(M^P&(x^M))+0xb5c0fbcf|0;E=E+C|0;C=C+(K&U^S&(K^U))+(K>>>2^K>>>13^K>>>22^K<<30^K<<19^K<<10)|0;M=d+M+(E>>>6^E>>>11^E>>>25^E<<26^E<<21^E<<7)+(x^E&(P^x))+0xe9b5dba5|0;S=S+M|0;M=M+(C&K^U&(C^K))+(C>>>2^C>>>13^C>>>22^C<<30^C<<19^C<<10)|0;x=l+x+(S>>>6^S>>>11^S>>>25^S<<26^S<<21^S<<7)+(P^S&(E^P))+0x3956c25b|0;U=U+x|0;x=x+(M&C^K&(M^C))+(M>>>2^M>>>13^M>>>22^M<<30^M<<19^M<<10)|0;P=h+P+(U>>>6^U>>>11^U>>>25^U<<26^U<<21^U<<7)+(E^U&(S^E))+0x59f111f1|0;K=K+P|0;P=P+(x&M^C&(x^M))+(x>>>2^x>>>13^x>>>22^x<<30^x<<19^x<<10)|0;E=p+E+(K>>>6^K>>>11^K>>>25^K<<26^K<<21^K<<7)+(S^K&(U^S))+0x923f82a4|0;C=C+E|0;E=E+(P&x^M&(P^x))+(P>>>2^P>>>13^P>>>22^P<<30^P<<19^P<<10)|0;S=y+S+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(U^C&(K^U))+0xab1c5ed5|0;M=M+S|0;S=S+(E&P^x&(E^P))+(E>>>2^E>>>13^E>>>22^E<<30^E<<19^E<<10)|0;U=b+U+(M>>>6^M>>>11^M>>>25^M<<26^M<<21^M<<7)+(K^M&(C^K))+0xd807aa98|0;x=x+U|0;U=U+(S&E^P&(S^E))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;K=m+K+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(C^x&(M^C))+0x12835b01|0;P=P+K|0;K=K+(U&S^E&(U^S))+(U>>>2^U>>>13^U>>>22^U<<30^U<<19^U<<10)|0;C=g+C+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(M^P&(x^M))+0x243185be|0;E=E+C|0;C=C+(K&U^S&(K^U))+(K>>>2^K>>>13^K>>>22^K<<30^K<<19^K<<10)|0;M=w+M+(E>>>6^E>>>11^E>>>25^E<<26^E<<21^E<<7)+(x^E&(P^x))+0x550c7dc3|0;S=S+M|0;M=M+(C&K^U&(C^K))+(C>>>2^C>>>13^C>>>22^C<<30^C<<19^C<<10)|0;x=_+x+(S>>>6^S>>>11^S>>>25^S<<26^S<<21^S<<7)+(P^S&(E^P))+0x72be5d74|0;U=U+x|0;x=x+(M&C^K&(M^C))+(M>>>2^M>>>13^M>>>22^M<<30^M<<19^M<<10)|0;P=v+P+(U>>>6^U>>>11^U>>>25^U<<26^U<<21^U<<7)+(E^U&(S^E))+0x80deb1fe|0;K=K+P|0;P=P+(x&M^C&(x^M))+(x>>>2^x>>>13^x>>>22^x<<30^x<<19^x<<10)|0;E=k+E+(K>>>6^K>>>11^K>>>25^K<<26^K<<21^K<<7)+(S^K&(U^S))+0x9bdc06a7|0;C=C+E|0;E=E+(P&x^M&(P^x))+(P>>>2^P>>>13^P>>>22^P<<30^P<<19^P<<10)|0;S=A+S+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(U^C&(K^U))+0xc19bf174|0;M=M+S|0;S=S+(E&P^x&(E^P))+(E>>>2^E>>>13^E>>>22^E<<30^E<<19^E<<10)|0;e=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+e+m|0;U=e+U+(M>>>6^M>>>11^M>>>25^M<<26^M<<21^M<<7)+(K^M&(C^K))+0xe49b69c1|0;x=x+U|0;U=U+(S&E^P&(S^E))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;t=(r>>>7^r>>>18^r>>>3^r<<25^r<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+t+g|0;K=t+K+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(C^x&(M^C))+0xefbe4786|0;P=P+K|0;K=K+(U&S^E&(U^S))+(U>>>2^U>>>13^U>>>22^U<<30^U<<19^U<<10)|0;r=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+r+w|0;C=r+C+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(M^P&(x^M))+0x0fc19dc6|0;E=E+C|0;C=C+(K&U^S&(K^U))+(K>>>2^K>>>13^K>>>22^K<<30^K<<19^K<<10)|0;d=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+d+_|0;M=d+M+(E>>>6^E>>>11^E>>>25^E<<26^E<<21^E<<7)+(x^E&(P^x))+0x240ca1cc|0;S=S+M|0;M=M+(C&K^U&(C^K))+(C>>>2^C>>>13^C>>>22^C<<30^C<<19^C<<10)|0;l=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(r>>>17^r>>>19^r>>>10^r<<15^r<<13)+l+v|0;x=l+x+(S>>>6^S>>>11^S>>>25^S<<26^S<<21^S<<7)+(P^S&(E^P))+0x2de92c6f|0;U=U+x|0;x=x+(M&C^K&(M^C))+(M>>>2^M>>>13^M>>>22^M<<30^M<<19^M<<10)|0;h=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+h+k|0;P=h+P+(U>>>6^U>>>11^U>>>25^U<<26^U<<21^U<<7)+(E^U&(S^E))+0x4a7484aa|0;K=K+P|0;P=P+(x&M^C&(x^M))+(x>>>2^x>>>13^x>>>22^x<<30^x<<19^x<<10)|0;p=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+p+A|0;E=p+E+(K>>>6^K>>>11^K>>>25^K<<26^K<<21^K<<7)+(S^K&(U^S))+0x5cb0a9dc|0;C=C+E|0;E=E+(P&x^M&(P^x))+(P>>>2^P>>>13^P>>>22^P<<30^P<<19^P<<10)|0;y=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+y+e|0;S=y+S+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(U^C&(K^U))+0x76f988da|0;M=M+S|0;S=S+(E&P^x&(E^P))+(E>>>2^E>>>13^E>>>22^E<<30^E<<19^E<<10)|0;b=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+b+t|0;U=b+U+(M>>>6^M>>>11^M>>>25^M<<26^M<<21^M<<7)+(K^M&(C^K))+0x983e5152|0;x=x+U|0;U=U+(S&E^P&(S^E))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;m=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+m+r|0;K=m+K+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(C^x&(M^C))+0xa831c66d|0;P=P+K|0;K=K+(U&S^E&(U^S))+(U>>>2^U>>>13^U>>>22^U<<30^U<<19^U<<10)|0;g=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+g+d|0;C=g+C+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(M^P&(x^M))+0xb00327c8|0;E=E+C|0;C=C+(K&U^S&(K^U))+(K>>>2^K>>>13^K>>>22^K<<30^K<<19^K<<10)|0;w=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+w+l|0;M=w+M+(E>>>6^E>>>11^E>>>25^E<<26^E<<21^E<<7)+(x^E&(P^x))+0xbf597fc7|0;S=S+M|0;M=M+(C&K^U&(C^K))+(C>>>2^C>>>13^C>>>22^C<<30^C<<19^C<<10)|0;_=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+_+h|0;x=_+x+(S>>>6^S>>>11^S>>>25^S<<26^S<<21^S<<7)+(P^S&(E^P))+0xc6e00bf3|0;U=U+x|0;x=x+(M&C^K&(M^C))+(M>>>2^M>>>13^M>>>22^M<<30^M<<19^M<<10)|0;v=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+v+p|0;P=v+P+(U>>>6^U>>>11^U>>>25^U<<26^U<<21^U<<7)+(E^U&(S^E))+0xd5a79147|0;K=K+P|0;P=P+(x&M^C&(x^M))+(x>>>2^x>>>13^x>>>22^x<<30^x<<19^x<<10)|0;k=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+k+y|0;E=k+E+(K>>>6^K>>>11^K>>>25^K<<26^K<<21^K<<7)+(S^K&(U^S))+0x06ca6351|0;C=C+E|0;E=E+(P&x^M&(P^x))+(P>>>2^P>>>13^P>>>22^P<<30^P<<19^P<<10)|0;A=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+A+b|0;S=A+S+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(U^C&(K^U))+0x14292967|0;M=M+S|0;S=S+(E&P^x&(E^P))+(E>>>2^E>>>13^E>>>22^E<<30^E<<19^E<<10)|0;e=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+e+m|0;U=e+U+(M>>>6^M>>>11^M>>>25^M<<26^M<<21^M<<7)+(K^M&(C^K))+0x27b70a85|0;x=x+U|0;U=U+(S&E^P&(S^E))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;t=(r>>>7^r>>>18^r>>>3^r<<25^r<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+t+g|0;K=t+K+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(C^x&(M^C))+0x2e1b2138|0;P=P+K|0;K=K+(U&S^E&(U^S))+(U>>>2^U>>>13^U>>>22^U<<30^U<<19^U<<10)|0;r=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+r+w|0;C=r+C+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(M^P&(x^M))+0x4d2c6dfc|0;E=E+C|0;C=C+(K&U^S&(K^U))+(K>>>2^K>>>13^K>>>22^K<<30^K<<19^K<<10)|0;d=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+d+_|0;M=d+M+(E>>>6^E>>>11^E>>>25^E<<26^E<<21^E<<7)+(x^E&(P^x))+0x53380d13|0;S=S+M|0;M=M+(C&K^U&(C^K))+(C>>>2^C>>>13^C>>>22^C<<30^C<<19^C<<10)|0;l=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(r>>>17^r>>>19^r>>>10^r<<15^r<<13)+l+v|0;x=l+x+(S>>>6^S>>>11^S>>>25^S<<26^S<<21^S<<7)+(P^S&(E^P))+0x650a7354|0;U=U+x|0;x=x+(M&C^K&(M^C))+(M>>>2^M>>>13^M>>>22^M<<30^M<<19^M<<10)|0;h=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+h+k|0;P=h+P+(U>>>6^U>>>11^U>>>25^U<<26^U<<21^U<<7)+(E^U&(S^E))+0x766a0abb|0;K=K+P|0;P=P+(x&M^C&(x^M))+(x>>>2^x>>>13^x>>>22^x<<30^x<<19^x<<10)|0;p=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+p+A|0;E=p+E+(K>>>6^K>>>11^K>>>25^K<<26^K<<21^K<<7)+(S^K&(U^S))+0x81c2c92e|0;C=C+E|0;E=E+(P&x^M&(P^x))+(P>>>2^P>>>13^P>>>22^P<<30^P<<19^P<<10)|0;y=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+y+e|0;S=y+S+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(U^C&(K^U))+0x92722c85|0;M=M+S|0;S=S+(E&P^x&(E^P))+(E>>>2^E>>>13^E>>>22^E<<30^E<<19^E<<10)|0;b=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+b+t|0;U=b+U+(M>>>6^M>>>11^M>>>25^M<<26^M<<21^M<<7)+(K^M&(C^K))+0xa2bfe8a1|0;x=x+U|0;U=U+(S&E^P&(S^E))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;m=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+m+r|0;K=m+K+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(C^x&(M^C))+0xa81a664b|0;P=P+K|0;K=K+(U&S^E&(U^S))+(U>>>2^U>>>13^U>>>22^U<<30^U<<19^U<<10)|0;g=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+g+d|0;C=g+C+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(M^P&(x^M))+0xc24b8b70|0;E=E+C|0;C=C+(K&U^S&(K^U))+(K>>>2^K>>>13^K>>>22^K<<30^K<<19^K<<10)|0;w=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+w+l|0;M=w+M+(E>>>6^E>>>11^E>>>25^E<<26^E<<21^E<<7)+(x^E&(P^x))+0xc76c51a3|0;S=S+M|0;M=M+(C&K^U&(C^K))+(C>>>2^C>>>13^C>>>22^C<<30^C<<19^C<<10)|0;_=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+_+h|0;x=_+x+(S>>>6^S>>>11^S>>>25^S<<26^S<<21^S<<7)+(P^S&(E^P))+0xd192e819|0;U=U+x|0;x=x+(M&C^K&(M^C))+(M>>>2^M>>>13^M>>>22^M<<30^M<<19^M<<10)|0;v=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+v+p|0;P=v+P+(U>>>6^U>>>11^U>>>25^U<<26^U<<21^U<<7)+(E^U&(S^E))+0xd6990624|0;K=K+P|0;P=P+(x&M^C&(x^M))+(x>>>2^x>>>13^x>>>22^x<<30^x<<19^x<<10)|0;k=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+k+y|0;E=k+E+(K>>>6^K>>>11^K>>>25^K<<26^K<<21^K<<7)+(S^K&(U^S))+0xf40e3585|0;C=C+E|0;E=E+(P&x^M&(P^x))+(P>>>2^P>>>13^P>>>22^P<<30^P<<19^P<<10)|0;A=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+A+b|0;S=A+S+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(U^C&(K^U))+0x106aa070|0;M=M+S|0;S=S+(E&P^x&(E^P))+(E>>>2^E>>>13^E>>>22^E<<30^E<<19^E<<10)|0;e=(t>>>7^t>>>18^t>>>3^t<<25^t<<14)+(k>>>17^k>>>19^k>>>10^k<<15^k<<13)+e+m|0;U=e+U+(M>>>6^M>>>11^M>>>25^M<<26^M<<21^M<<7)+(K^M&(C^K))+0x19a4c116|0;x=x+U|0;U=U+(S&E^P&(S^E))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;t=(r>>>7^r>>>18^r>>>3^r<<25^r<<14)+(A>>>17^A>>>19^A>>>10^A<<15^A<<13)+t+g|0;K=t+K+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(C^x&(M^C))+0x1e376c08|0;P=P+K|0;K=K+(U&S^E&(U^S))+(U>>>2^U>>>13^U>>>22^U<<30^U<<19^U<<10)|0;r=(d>>>7^d>>>18^d>>>3^d<<25^d<<14)+(e>>>17^e>>>19^e>>>10^e<<15^e<<13)+r+w|0;C=r+C+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(M^P&(x^M))+0x2748774c|0;E=E+C|0;C=C+(K&U^S&(K^U))+(K>>>2^K>>>13^K>>>22^K<<30^K<<19^K<<10)|0;d=(l>>>7^l>>>18^l>>>3^l<<25^l<<14)+(t>>>17^t>>>19^t>>>10^t<<15^t<<13)+d+_|0;M=d+M+(E>>>6^E>>>11^E>>>25^E<<26^E<<21^E<<7)+(x^E&(P^x))+0x34b0bcb5|0;S=S+M|0;M=M+(C&K^U&(C^K))+(C>>>2^C>>>13^C>>>22^C<<30^C<<19^C<<10)|0;l=(h>>>7^h>>>18^h>>>3^h<<25^h<<14)+(r>>>17^r>>>19^r>>>10^r<<15^r<<13)+l+v|0;x=l+x+(S>>>6^S>>>11^S>>>25^S<<26^S<<21^S<<7)+(P^S&(E^P))+0x391c0cb3|0;U=U+x|0;x=x+(M&C^K&(M^C))+(M>>>2^M>>>13^M>>>22^M<<30^M<<19^M<<10)|0;h=(p>>>7^p>>>18^p>>>3^p<<25^p<<14)+(d>>>17^d>>>19^d>>>10^d<<15^d<<13)+h+k|0;P=h+P+(U>>>6^U>>>11^U>>>25^U<<26^U<<21^U<<7)+(E^U&(S^E))+0x4ed8aa4a|0;K=K+P|0;P=P+(x&M^C&(x^M))+(x>>>2^x>>>13^x>>>22^x<<30^x<<19^x<<10)|0;p=(y>>>7^y>>>18^y>>>3^y<<25^y<<14)+(l>>>17^l>>>19^l>>>10^l<<15^l<<13)+p+A|0;E=p+E+(K>>>6^K>>>11^K>>>25^K<<26^K<<21^K<<7)+(S^K&(U^S))+0x5b9cca4f|0;C=C+E|0;E=E+(P&x^M&(P^x))+(P>>>2^P>>>13^P>>>22^P<<30^P<<19^P<<10)|0;y=(b>>>7^b>>>18^b>>>3^b<<25^b<<14)+(h>>>17^h>>>19^h>>>10^h<<15^h<<13)+y+e|0;S=y+S+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(U^C&(K^U))+0x682e6ff3|0;M=M+S|0;S=S+(E&P^x&(E^P))+(E>>>2^E>>>13^E>>>22^E<<30^E<<19^E<<10)|0;b=(m>>>7^m>>>18^m>>>3^m<<25^m<<14)+(p>>>17^p>>>19^p>>>10^p<<15^p<<13)+b+t|0;U=b+U+(M>>>6^M>>>11^M>>>25^M<<26^M<<21^M<<7)+(K^M&(C^K))+0x748f82ee|0;x=x+U|0;U=U+(S&E^P&(S^E))+(S>>>2^S>>>13^S>>>22^S<<30^S<<19^S<<10)|0;m=(g>>>7^g>>>18^g>>>3^g<<25^g<<14)+(y>>>17^y>>>19^y>>>10^y<<15^y<<13)+m+r|0;K=m+K+(x>>>6^x>>>11^x>>>25^x<<26^x<<21^x<<7)+(C^x&(M^C))+0x78a5636f|0;P=P+K|0;K=K+(U&S^E&(U^S))+(U>>>2^U>>>13^U>>>22^U<<30^U<<19^U<<10)|0;g=(w>>>7^w>>>18^w>>>3^w<<25^w<<14)+(b>>>17^b>>>19^b>>>10^b<<15^b<<13)+g+d|0;C=g+C+(P>>>6^P>>>11^P>>>25^P<<26^P<<21^P<<7)+(M^P&(x^M))+0x84c87814|0;E=E+C|0;C=C+(K&U^S&(K^U))+(K>>>2^K>>>13^K>>>22^K<<30^K<<19^K<<10)|0;w=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(m>>>17^m>>>19^m>>>10^m<<15^m<<13)+w+l|0;M=w+M+(E>>>6^E>>>11^E>>>25^E<<26^E<<21^E<<7)+(x^E&(P^x))+0x8cc70208|0;S=S+M|0;M=M+(C&K^U&(C^K))+(C>>>2^C>>>13^C>>>22^C<<30^C<<19^C<<10)|0;_=(v>>>7^v>>>18^v>>>3^v<<25^v<<14)+(g>>>17^g>>>19^g>>>10^g<<15^g<<13)+_+h|0;x=_+x+(S>>>6^S>>>11^S>>>25^S<<26^S<<21^S<<7)+(P^S&(E^P))+0x90befffa|0;U=U+x|0;x=x+(M&C^K&(M^C))+(M>>>2^M>>>13^M>>>22^M<<30^M<<19^M<<10)|0;v=(k>>>7^k>>>18^k>>>3^k<<25^k<<14)+(w>>>17^w>>>19^w>>>10^w<<15^w<<13)+v+p|0;P=v+P+(U>>>6^U>>>11^U>>>25^U<<26^U<<21^U<<7)+(E^U&(S^E))+0xa4506ceb|0;K=K+P|0;P=P+(x&M^C&(x^M))+(x>>>2^x>>>13^x>>>22^x<<30^x<<19^x<<10)|0;k=(A>>>7^A>>>18^A>>>3^A<<25^A<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+k+y|0;E=k+E+(K>>>6^K>>>11^K>>>25^K<<26^K<<21^K<<7)+(S^K&(U^S))+0xbef9a3f7|0;C=C+E|0;E=E+(P&x^M&(P^x))+(P>>>2^P>>>13^P>>>22^P<<30^P<<19^P<<10)|0;A=(e>>>7^e>>>18^e>>>3^e<<25^e<<14)+(v>>>17^v>>>19^v>>>10^v<<15^v<<13)+A+b|0;S=A+S+(C>>>6^C>>>11^C>>>25^C<<26^C<<21^C<<7)+(U^C&(K^U))+0xc67178f2|0;M=M+S|0;S=S+(E&P^x&(E^P))+(E>>>2^E>>>13^E>>>22^E<<30^E<<19^E<<10)|0;n=n+S|0;i=i+E|0;a=a+P|0;s=s+x|0;o=o+M|0;u=u+C|0;c=c+K|0;f=f+U|0}function U(e){e=e|0;K(C[e|0]<<24|C[e|1]<<16|C[e|2]<<8|C[e|3],C[e|4]<<24|C[e|5]<<16|C[e|6]<<8|C[e|7],C[e|8]<<24|C[e|9]<<16|C[e|10]<<8|C[e|11],C[e|12]<<24|C[e|13]<<16|C[e|14]<<8|C[e|15],C[e|16]<<24|C[e|17]<<16|C[e|18]<<8|C[e|19],C[e|20]<<24|C[e|21]<<16|C[e|22]<<8|C[e|23],C[e|24]<<24|C[e|25]<<16|C[e|26]<<8|C[e|27],C[e|28]<<24|C[e|29]<<16|C[e|30]<<8|C[e|31],C[e|32]<<24|C[e|33]<<16|C[e|34]<<8|C[e|35],C[e|36]<<24|C[e|37]<<16|C[e|38]<<8|C[e|39],C[e|40]<<24|C[e|41]<<16|C[e|42]<<8|C[e|43],C[e|44]<<24|C[e|45]<<16|C[e|46]<<8|C[e|47],C[e|48]<<24|C[e|49]<<16|C[e|50]<<8|C[e|51],C[e|52]<<24|C[e|53]<<16|C[e|54]<<8|C[e|55],C[e|56]<<24|C[e|57]<<16|C[e|58]<<8|C[e|59],C[e|60]<<24|C[e|61]<<16|C[e|62]<<8|C[e|63])}function R(e){e=e|0;C[e|0]=n>>>24;C[e|1]=n>>>16&255;C[e|2]=n>>>8&255;C[e|3]=n&255;C[e|4]=i>>>24;C[e|5]=i>>>16&255;C[e|6]=i>>>8&255;C[e|7]=i&255;C[e|8]=a>>>24;C[e|9]=a>>>16&255;C[e|10]=a>>>8&255;C[e|11]=a&255;C[e|12]=s>>>24;C[e|13]=s>>>16&255;C[e|14]=s>>>8&255;C[e|15]=s&255;C[e|16]=o>>>24;C[e|17]=o>>>16&255;C[e|18]=o>>>8&255;C[e|19]=o&255;C[e|20]=u>>>24;C[e|21]=u>>>16&255;C[e|22]=u>>>8&255;C[e|23]=u&255;C[e|24]=c>>>24;C[e|25]=c>>>16&255;C[e|26]=c>>>8&255;C[e|27]=c&255;C[e|28]=f>>>24;C[e|29]=f>>>16&255;C[e|30]=f>>>8&255;C[e|31]=f&255}function B(){n=0x6a09e667;i=0xbb67ae85;a=0x3c6ef372;s=0xa54ff53a;o=0x510e527f;u=0x9b05688c;c=0x1f83d9ab;f=0x5be0cd19;d=l=0}function j(e,t,r,h,p,y,b,m,g,w){e=e|0;t=t|0;r=r|0;h=h|0;p=p|0;y=y|0;b=b|0;m=m|0;g=g|0;w=w|0;n=e;i=t;a=r;s=h;o=p;u=y;c=b;f=m;d=g;l=w}function T(e,t){e=e|0;t=t|0;var r=0;if(e&63)return-1;while((t|0)>=64){U(e);e=e+64|0;t=t-64|0;r=r+64|0}d=d+r|0;if(d>>>0>>0)l=l+1|0;return r|0}function I(e,t,r){e=e|0;t=t|0;r=r|0;var n=0,i=0;if(e&63)return-1;if(~r)if(r&31)return-1;if((t|0)>=64){n=T(e,t)|0;if((n|0)==-1)return-1;e=e+n|0;t=t-n|0}n=n+t|0;d=d+t|0;if(d>>>0>>0)l=l+1|0;C[e|t]=0x80;if((t|0)>=56){for(i=t+1|0;(i|0)<64;i=i+1|0)C[e|i]=0x00;U(e);t=0;C[e|0]=0}for(i=t+1|0;(i|0)<59;i=i+1|0)C[e|i]=0;C[e|56]=l>>>21&255;C[e|57]=l>>>13&255;C[e|58]=l>>>5&255;C[e|59]=l<<3&255|d>>>29;C[e|60]=d>>>21&255;C[e|61]=d>>>13&255;C[e|62]=d>>>5&255;C[e|63]=d<<3&255;U(e);if(~r)R(r);return n|0}function O(){n=h;i=p;a=y;s=b;o=m;u=g;c=w;f=_;d=64;l=0}function z(){n=v;i=k;a=A;s=S;o=E;u=P;c=x;f=M;d=64;l=0}function D(e,t,r,C,U,R,j,T,I,O,z,D,q,N,F,L){e=e|0;t=t|0;r=r|0;C=C|0;U=U|0;R=R|0;j=j|0;T=T|0;I=I|0;O=O|0;z=z|0;D=D|0;q=q|0;N=N|0;F=F|0;L=L|0;B();K(e^0x5c5c5c5c,t^0x5c5c5c5c,r^0x5c5c5c5c,C^0x5c5c5c5c,U^0x5c5c5c5c,R^0x5c5c5c5c,j^0x5c5c5c5c,T^0x5c5c5c5c,I^0x5c5c5c5c,O^0x5c5c5c5c,z^0x5c5c5c5c,D^0x5c5c5c5c,q^0x5c5c5c5c,N^0x5c5c5c5c,F^0x5c5c5c5c,L^0x5c5c5c5c);v=n;k=i;A=a;S=s;E=o;P=u;x=c;M=f;B();K(e^0x36363636,t^0x36363636,r^0x36363636,C^0x36363636,U^0x36363636,R^0x36363636,j^0x36363636,T^0x36363636,I^0x36363636,O^0x36363636,z^0x36363636,D^0x36363636,q^0x36363636,N^0x36363636,F^0x36363636,L^0x36363636);h=n;p=i;y=a;b=s;m=o;g=u;w=c;_=f;d=64;l=0}function q(e,t,r){e=e|0;t=t|0;r=r|0;var d=0,l=0,h=0,p=0,y=0,b=0,m=0,g=0,w=0;if(e&63)return-1;if(~r)if(r&31)return-1;w=I(e,t,-1)|0;d=n,l=i,h=a,p=s,y=o,b=u,m=c,g=f;z();K(d,l,h,p,y,b,m,g,0x80000000,0,0,0,0,0,0,768);if(~r)R(r);return w|0}function N(e,t,r,d,l){e=e|0;t=t|0;r=r|0;d=d|0;l=l|0;var h=0,p=0,y=0,b=0,m=0,g=0,w=0,_=0,v=0,k=0,A=0,S=0,E=0,P=0,x=0,M=0;if(e&63)return-1;if(~l)if(l&31)return-1;C[e+t|0]=r>>>24;C[e+t+1|0]=r>>>16&255;C[e+t+2|0]=r>>>8&255;C[e+t+3|0]=r&255;q(e,t+4|0,-1)|0;h=v=n,p=k=i,y=A=a,b=S=s,m=E=o,g=P=u,w=x=c,_=M=f;d=d-1|0;while((d|0)>0){O();K(v,k,A,S,E,P,x,M,0x80000000,0,0,0,0,0,0,768);v=n,k=i,A=a,S=s,E=o,P=u,x=c,M=f;z();K(v,k,A,S,E,P,x,M,0x80000000,0,0,0,0,0,0,768);v=n,k=i,A=a,S=s,E=o,P=u,x=c,M=f;h=h^n;p=p^i;y=y^a;b=b^s;m=m^o;g=g^u;w=w^c;_=_^f;d=d-1|0}n=h;i=p;a=y;s=b;o=m;u=g;c=w;f=_;if(~l)R(l);return 0}return{reset:B,init:j,process:T,finish:I,hmac_reset:O,hmac_init:D,hmac_finish:q,pbkdf2_generate_block:N}}},{}],13:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Sha256=r._sha256_hash_size=r._sha256_block_size=void 0;var n,i=e("./sha256.asm"),a=e("../hash"),s=(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=r._sha256_block_size=64,u=r._sha256_hash_size=32,c=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.NAME="sha256",t.BLOCK_SIZE=o,t.HASH_SIZE=u,t}return s(t,e),t.bytes=function(e){return(new t).process(e).finish().result},t.NAME="sha256",t.heap_pool=[],t.asm_pool=[],t.asm_function=i.sha256_asm,t}(a.Hash);r.Sha256=c},{"../hash":9,"./sha256.asm":12}],14:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=function(e){function t(){for(var t=[],r=0;r>1),n=0;n>1]=parseInt(e.substr(n,2),16);return r},r.base64_to_bytes=function(e){return a(n(e))},r.bytes_to_string=s,r.bytes_to_hex=function(e){for(var t="",r=0;r>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e+=1},r.is_number=function(e){return"number"==typeof e},r.is_string=function(e){return"string"==typeof e},r.is_buffer=function(e){return e instanceof ArrayBuffer},r.is_bytes=function(e){return e instanceof Uint8Array},r.is_typed_array=function(e){return e instanceof Int8Array||e instanceof Uint8Array||e instanceof Int16Array||e instanceof Uint16Array||e instanceof Int32Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array},r._heap_init=function(e,t){var r=e?e.byteLength:t||65536;if(4095&r||r<=0)throw new Error("heap size must be a positive integer and a multiple of 4096");return e=e||new Uint8Array(new ArrayBuffer(r))},r._heap_write=function(e,t,r,n,i){var a=e.length-t,s=a=r)throw new Error("Malformed string, low surrogate expected at position "+i);s=(55296^s)<<10|65536|56320^e.charCodeAt(i)}else if(!t&&s>>>8)throw new Error("Wide characters are not allowed.");!t||s<=127?n[a++]=s:s<=2047?(n[a++]=192|s>>6,n[a++]=128|63&s):s<=65535?(n[a++]=224|s>>12,n[a++]=128|s>>6&63,n[a++]=128|63&s):(n[a++]=240|s>>18,n[a++]=128|s>>12&63,n[a++]=128|s>>6&63,n[a++]=128|63&s)}return n.subarray(0,a)}function s(e,t){void 0===t&&(t=!1);for(var r=e.length,n=new Array(r),i=0,a=0;i=192&&s<224&&i+1=224&&s<240&&i+2=240&&s<248&&i+3>10,n[a++]=56320|1023&o)}}var u="";for(i=0;i=49&&s<=54?s-49+10:s>=17&&s<=22?s-17+10:15&s}return n}function u(e,t,r,n){for(var i=0,a=Math.min(e.length,r),s=t;s=49?o-49+10:o>=17?o-17+10:o}return i}a.isBN=function(e){return e instanceof a||null!==e&&"object"==typeof e&&e.constructor.wordSize===a.wordSize&&Array.isArray(e.words)},a.max=function(e,t){return e.cmp(t)>0?e:t},a.min=function(e,t){return e.cmp(t)<0?e:t},a.prototype._init=function(e,t,r){if("number"==typeof e)return this._initNumber(e,t,r);if("object"==typeof e)return this._initArray(e,t,r);"hex"===t&&(t=16),n(t===(0|t)&&t>=2&&t<=36);var i=0;"-"===(e=e.toString().replace(/\s+/g,""))[0]&&i++,16===t?this._parseHex(e,i):this._parseBase(e,t,i),"-"===e[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),t,r)},a.prototype._initNumber=function(e,t,r){e<0&&(this.negative=1,e=-e),e<67108864?(this.words=[67108863&e],this.length=1):e<4503599627370496?(this.words=[67108863&e,e/67108864&67108863],this.length=2):(n(e<9007199254740992),this.words=[67108863&e,e/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),t,r)},a.prototype._initArray=function(e,t,r){if(n("number"==typeof e.length),e.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(e.length/3),this.words=new Array(this.length);for(var i=0;i=0;i-=3)s=e[i]|e[i-1]<<8|e[i-2]<<16,this.words[a]|=s<>>26-o&67108863,(o+=24)>=26&&(o-=26,a++);else if("le"===r)for(i=0,a=0;i>>26-o&67108863,(o+=24)>=26&&(o-=26,a++);return this.strip()},a.prototype._parseHex=function(e,t){this.length=Math.ceil((e.length-t)/6),this.words=new Array(this.length);for(var r=0;r=t;r-=6)i=o(e,r,r+6),this.words[n]|=i<>>26-a&4194303,(a+=24)>=26&&(a-=26,n++);r+6!==t&&(i=o(e,t,r+6),this.words[n]|=i<>>26-a&4194303),this.strip()},a.prototype._parseBase=function(e,t,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=t)n++;n--,i=i/t|0;for(var a=e.length-r,s=a%n,o=Math.min(a,a-s)+r,c=0,f=r;f1&&0===this.words[this.length-1];)this.length--;return this._normSign()},a.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},a.prototype.inspect=function(){return(this.red?""};var c=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],f=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],d=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function l(e,t,r){r.negative=t.negative^e.negative;var n=e.length+t.length|0;r.length=n,n=n-1|0;var i=0|e.words[0],a=0|t.words[0],s=i*a,o=67108863&s,u=s/67108864|0;r.words[0]=o;for(var c=1;c>>26,d=67108863&u,l=Math.min(c,t.length-1),h=Math.max(0,c-e.length+1);h<=l;h++){var p=c-h|0;f+=(s=(i=0|e.words[p])*(a=0|t.words[h])+d)/67108864|0,d=67108863&s}r.words[c]=0|d,u=0|f}return 0!==u?r.words[c]=0|u:r.length--,r.strip()}a.prototype.toString=function(e,t){var r;if(t=0|t||1,16===(e=e||10)||"hex"===e){r="";for(var i=0,a=0,s=0;s>>24-i&16777215)||s!==this.length-1?c[6-u.length]+u+r:u+r,(i+=2)>=26&&(i-=26,s--)}for(0!==a&&(r=a.toString(16)+r);r.length%t!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(e===(0|e)&&e>=2&&e<=36){var l=f[e],h=d[e];r="";var p=this.clone();for(p.negative=0;!p.isZero();){var y=p.modn(h).toString(e);r=(p=p.idivn(h)).isZero()?y+r:c[l-y.length]+y+r}for(this.isZero()&&(r="0"+r);r.length%t!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}n(!1,"Base should be between 2 and 36")},a.prototype.toNumber=function(){var e=this.words[0];return 2===this.length?e+=67108864*this.words[1]:3===this.length&&1===this.words[2]?e+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-e:e},a.prototype.toJSON=function(){return this.toString(16)},a.prototype.toBuffer=function(e,t){return n(void 0!==s),this.toArrayLike(s,e,t)},a.prototype.toArray=function(e,t){return this.toArrayLike(Array,e,t)},a.prototype.toArrayLike=function(e,t,r){var i=this.byteLength(),a=r||Math.max(1,i);n(i<=a,"byte array longer than desired length"),n(a>0,"Requested array length <= 0"),this.strip();var s,o,u="le"===t,c=new e(a),f=this.clone();if(u){for(o=0;!f.isZero();o++)s=f.andln(255),f.iushrn(8),c[o]=s;for(;o=4096&&(r+=13,t>>>=13),t>=64&&(r+=7,t>>>=7),t>=8&&(r+=4,t>>>=4),t>=2&&(r+=2,t>>>=2),r+t},a.prototype._zeroBits=function(e){if(0===e)return 26;var t=e,r=0;return 0==(8191&t)&&(r+=13,t>>>=13),0==(127&t)&&(r+=7,t>>>=7),0==(15&t)&&(r+=4,t>>>=4),0==(3&t)&&(r+=2,t>>>=2),0==(1&t)&&r++,r},a.prototype.bitLength=function(){var e=this.words[this.length-1],t=this._countBits(e);return 26*(this.length-1)+t},a.prototype.zeroBits=function(){if(this.isZero())return 0;for(var e=0,t=0;te.length?this.clone().ior(e):e.clone().ior(this)},a.prototype.uor=function(e){return this.length>e.length?this.clone().iuor(e):e.clone().iuor(this)},a.prototype.iuand=function(e){var t;t=this.length>e.length?e:this;for(var r=0;re.length?this.clone().iand(e):e.clone().iand(this)},a.prototype.uand=function(e){return this.length>e.length?this.clone().iuand(e):e.clone().iuand(this)},a.prototype.iuxor=function(e){var t,r;this.length>e.length?(t=this,r=e):(t=e,r=this);for(var n=0;ne.length?this.clone().ixor(e):e.clone().ixor(this)},a.prototype.uxor=function(e){return this.length>e.length?this.clone().iuxor(e):e.clone().iuxor(this)},a.prototype.inotn=function(e){n("number"==typeof e&&e>=0);var t=0|Math.ceil(e/26),r=e%26;this._expand(t),r>0&&t--;for(var i=0;i0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},a.prototype.notn=function(e){return this.clone().inotn(e)},a.prototype.setn=function(e,t){n("number"==typeof e&&e>=0);var r=e/26|0,i=e%26;return this._expand(r+1),this.words[r]=t?this.words[r]|1<e.length?(r=this,n=e):(r=e,n=this);for(var i=0,a=0;a>>26;for(;0!==i&&a>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;ae.length?this.clone().iadd(e):e.clone().iadd(this)},a.prototype.isub=function(e){if(0!==e.negative){e.negative=0;var t=this.iadd(e);return e.negative=1,t._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(e),this.negative=1,this._normSign();var r,n,i=this.cmp(e);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(r=this,n=e):(r=e,n=this);for(var a=0,s=0;s>26,this.words[s]=67108863&t;for(;0!==a&&s>26,this.words[s]=67108863&t;if(0===a&&s>>13,h=0|s[1],p=8191&h,y=h>>>13,b=0|s[2],m=8191&b,g=b>>>13,w=0|s[3],_=8191&w,v=w>>>13,k=0|s[4],A=8191&k,S=k>>>13,E=0|s[5],P=8191&E,x=E>>>13,M=0|s[6],C=8191&M,K=M>>>13,U=0|s[7],R=8191&U,B=U>>>13,j=0|s[8],T=8191&j,I=j>>>13,O=0|s[9],z=8191&O,D=O>>>13,q=0|o[0],N=8191&q,F=q>>>13,L=0|o[1],H=8191&L,W=L>>>13,G=0|o[2],Z=8191&G,V=G>>>13,Y=0|o[3],$=8191&Y,J=Y>>>13,X=0|o[4],Q=8191&X,ee=X>>>13,te=0|o[5],re=8191&te,ne=te>>>13,ie=0|o[6],ae=8191&ie,se=ie>>>13,oe=0|o[7],ue=8191&oe,ce=oe>>>13,fe=0|o[8],de=8191&fe,le=fe>>>13,he=0|o[9],pe=8191&he,ye=he>>>13;r.negative=e.negative^t.negative,r.length=19;var be=(c+(n=Math.imul(d,N))|0)+((8191&(i=(i=Math.imul(d,F))+Math.imul(l,N)|0))<<13)|0;c=((a=Math.imul(l,F))+(i>>>13)|0)+(be>>>26)|0,be&=67108863,n=Math.imul(p,N),i=(i=Math.imul(p,F))+Math.imul(y,N)|0,a=Math.imul(y,F);var me=(c+(n=n+Math.imul(d,H)|0)|0)+((8191&(i=(i=i+Math.imul(d,W)|0)+Math.imul(l,H)|0))<<13)|0;c=((a=a+Math.imul(l,W)|0)+(i>>>13)|0)+(me>>>26)|0,me&=67108863,n=Math.imul(m,N),i=(i=Math.imul(m,F))+Math.imul(g,N)|0,a=Math.imul(g,F),n=n+Math.imul(p,H)|0,i=(i=i+Math.imul(p,W)|0)+Math.imul(y,H)|0,a=a+Math.imul(y,W)|0;var ge=(c+(n=n+Math.imul(d,Z)|0)|0)+((8191&(i=(i=i+Math.imul(d,V)|0)+Math.imul(l,Z)|0))<<13)|0;c=((a=a+Math.imul(l,V)|0)+(i>>>13)|0)+(ge>>>26)|0,ge&=67108863,n=Math.imul(_,N),i=(i=Math.imul(_,F))+Math.imul(v,N)|0,a=Math.imul(v,F),n=n+Math.imul(m,H)|0,i=(i=i+Math.imul(m,W)|0)+Math.imul(g,H)|0,a=a+Math.imul(g,W)|0,n=n+Math.imul(p,Z)|0,i=(i=i+Math.imul(p,V)|0)+Math.imul(y,Z)|0,a=a+Math.imul(y,V)|0;var we=(c+(n=n+Math.imul(d,$)|0)|0)+((8191&(i=(i=i+Math.imul(d,J)|0)+Math.imul(l,$)|0))<<13)|0;c=((a=a+Math.imul(l,J)|0)+(i>>>13)|0)+(we>>>26)|0,we&=67108863,n=Math.imul(A,N),i=(i=Math.imul(A,F))+Math.imul(S,N)|0,a=Math.imul(S,F),n=n+Math.imul(_,H)|0,i=(i=i+Math.imul(_,W)|0)+Math.imul(v,H)|0,a=a+Math.imul(v,W)|0,n=n+Math.imul(m,Z)|0,i=(i=i+Math.imul(m,V)|0)+Math.imul(g,Z)|0,a=a+Math.imul(g,V)|0,n=n+Math.imul(p,$)|0,i=(i=i+Math.imul(p,J)|0)+Math.imul(y,$)|0,a=a+Math.imul(y,J)|0;var _e=(c+(n=n+Math.imul(d,Q)|0)|0)+((8191&(i=(i=i+Math.imul(d,ee)|0)+Math.imul(l,Q)|0))<<13)|0;c=((a=a+Math.imul(l,ee)|0)+(i>>>13)|0)+(_e>>>26)|0,_e&=67108863,n=Math.imul(P,N),i=(i=Math.imul(P,F))+Math.imul(x,N)|0,a=Math.imul(x,F),n=n+Math.imul(A,H)|0,i=(i=i+Math.imul(A,W)|0)+Math.imul(S,H)|0,a=a+Math.imul(S,W)|0,n=n+Math.imul(_,Z)|0,i=(i=i+Math.imul(_,V)|0)+Math.imul(v,Z)|0,a=a+Math.imul(v,V)|0,n=n+Math.imul(m,$)|0,i=(i=i+Math.imul(m,J)|0)+Math.imul(g,$)|0,a=a+Math.imul(g,J)|0,n=n+Math.imul(p,Q)|0,i=(i=i+Math.imul(p,ee)|0)+Math.imul(y,Q)|0,a=a+Math.imul(y,ee)|0;var ve=(c+(n=n+Math.imul(d,re)|0)|0)+((8191&(i=(i=i+Math.imul(d,ne)|0)+Math.imul(l,re)|0))<<13)|0;c=((a=a+Math.imul(l,ne)|0)+(i>>>13)|0)+(ve>>>26)|0,ve&=67108863,n=Math.imul(C,N),i=(i=Math.imul(C,F))+Math.imul(K,N)|0,a=Math.imul(K,F),n=n+Math.imul(P,H)|0,i=(i=i+Math.imul(P,W)|0)+Math.imul(x,H)|0,a=a+Math.imul(x,W)|0,n=n+Math.imul(A,Z)|0,i=(i=i+Math.imul(A,V)|0)+Math.imul(S,Z)|0,a=a+Math.imul(S,V)|0,n=n+Math.imul(_,$)|0,i=(i=i+Math.imul(_,J)|0)+Math.imul(v,$)|0,a=a+Math.imul(v,J)|0,n=n+Math.imul(m,Q)|0,i=(i=i+Math.imul(m,ee)|0)+Math.imul(g,Q)|0,a=a+Math.imul(g,ee)|0,n=n+Math.imul(p,re)|0,i=(i=i+Math.imul(p,ne)|0)+Math.imul(y,re)|0,a=a+Math.imul(y,ne)|0;var ke=(c+(n=n+Math.imul(d,ae)|0)|0)+((8191&(i=(i=i+Math.imul(d,se)|0)+Math.imul(l,ae)|0))<<13)|0;c=((a=a+Math.imul(l,se)|0)+(i>>>13)|0)+(ke>>>26)|0,ke&=67108863,n=Math.imul(R,N),i=(i=Math.imul(R,F))+Math.imul(B,N)|0,a=Math.imul(B,F),n=n+Math.imul(C,H)|0,i=(i=i+Math.imul(C,W)|0)+Math.imul(K,H)|0,a=a+Math.imul(K,W)|0,n=n+Math.imul(P,Z)|0,i=(i=i+Math.imul(P,V)|0)+Math.imul(x,Z)|0,a=a+Math.imul(x,V)|0,n=n+Math.imul(A,$)|0,i=(i=i+Math.imul(A,J)|0)+Math.imul(S,$)|0,a=a+Math.imul(S,J)|0,n=n+Math.imul(_,Q)|0,i=(i=i+Math.imul(_,ee)|0)+Math.imul(v,Q)|0,a=a+Math.imul(v,ee)|0,n=n+Math.imul(m,re)|0,i=(i=i+Math.imul(m,ne)|0)+Math.imul(g,re)|0,a=a+Math.imul(g,ne)|0,n=n+Math.imul(p,ae)|0,i=(i=i+Math.imul(p,se)|0)+Math.imul(y,ae)|0,a=a+Math.imul(y,se)|0;var Ae=(c+(n=n+Math.imul(d,ue)|0)|0)+((8191&(i=(i=i+Math.imul(d,ce)|0)+Math.imul(l,ue)|0))<<13)|0;c=((a=a+Math.imul(l,ce)|0)+(i>>>13)|0)+(Ae>>>26)|0,Ae&=67108863,n=Math.imul(T,N),i=(i=Math.imul(T,F))+Math.imul(I,N)|0,a=Math.imul(I,F),n=n+Math.imul(R,H)|0,i=(i=i+Math.imul(R,W)|0)+Math.imul(B,H)|0,a=a+Math.imul(B,W)|0,n=n+Math.imul(C,Z)|0,i=(i=i+Math.imul(C,V)|0)+Math.imul(K,Z)|0,a=a+Math.imul(K,V)|0,n=n+Math.imul(P,$)|0,i=(i=i+Math.imul(P,J)|0)+Math.imul(x,$)|0,a=a+Math.imul(x,J)|0,n=n+Math.imul(A,Q)|0,i=(i=i+Math.imul(A,ee)|0)+Math.imul(S,Q)|0,a=a+Math.imul(S,ee)|0,n=n+Math.imul(_,re)|0,i=(i=i+Math.imul(_,ne)|0)+Math.imul(v,re)|0,a=a+Math.imul(v,ne)|0,n=n+Math.imul(m,ae)|0,i=(i=i+Math.imul(m,se)|0)+Math.imul(g,ae)|0,a=a+Math.imul(g,se)|0,n=n+Math.imul(p,ue)|0,i=(i=i+Math.imul(p,ce)|0)+Math.imul(y,ue)|0,a=a+Math.imul(y,ce)|0;var Se=(c+(n=n+Math.imul(d,de)|0)|0)+((8191&(i=(i=i+Math.imul(d,le)|0)+Math.imul(l,de)|0))<<13)|0;c=((a=a+Math.imul(l,le)|0)+(i>>>13)|0)+(Se>>>26)|0,Se&=67108863,n=Math.imul(z,N),i=(i=Math.imul(z,F))+Math.imul(D,N)|0,a=Math.imul(D,F),n=n+Math.imul(T,H)|0,i=(i=i+Math.imul(T,W)|0)+Math.imul(I,H)|0,a=a+Math.imul(I,W)|0,n=n+Math.imul(R,Z)|0,i=(i=i+Math.imul(R,V)|0)+Math.imul(B,Z)|0,a=a+Math.imul(B,V)|0,n=n+Math.imul(C,$)|0,i=(i=i+Math.imul(C,J)|0)+Math.imul(K,$)|0,a=a+Math.imul(K,J)|0,n=n+Math.imul(P,Q)|0,i=(i=i+Math.imul(P,ee)|0)+Math.imul(x,Q)|0,a=a+Math.imul(x,ee)|0,n=n+Math.imul(A,re)|0,i=(i=i+Math.imul(A,ne)|0)+Math.imul(S,re)|0,a=a+Math.imul(S,ne)|0,n=n+Math.imul(_,ae)|0,i=(i=i+Math.imul(_,se)|0)+Math.imul(v,ae)|0,a=a+Math.imul(v,se)|0,n=n+Math.imul(m,ue)|0,i=(i=i+Math.imul(m,ce)|0)+Math.imul(g,ue)|0,a=a+Math.imul(g,ce)|0,n=n+Math.imul(p,de)|0,i=(i=i+Math.imul(p,le)|0)+Math.imul(y,de)|0,a=a+Math.imul(y,le)|0;var Ee=(c+(n=n+Math.imul(d,pe)|0)|0)+((8191&(i=(i=i+Math.imul(d,ye)|0)+Math.imul(l,pe)|0))<<13)|0;c=((a=a+Math.imul(l,ye)|0)+(i>>>13)|0)+(Ee>>>26)|0,Ee&=67108863,n=Math.imul(z,H),i=(i=Math.imul(z,W))+Math.imul(D,H)|0,a=Math.imul(D,W),n=n+Math.imul(T,Z)|0,i=(i=i+Math.imul(T,V)|0)+Math.imul(I,Z)|0,a=a+Math.imul(I,V)|0,n=n+Math.imul(R,$)|0,i=(i=i+Math.imul(R,J)|0)+Math.imul(B,$)|0,a=a+Math.imul(B,J)|0,n=n+Math.imul(C,Q)|0,i=(i=i+Math.imul(C,ee)|0)+Math.imul(K,Q)|0,a=a+Math.imul(K,ee)|0,n=n+Math.imul(P,re)|0,i=(i=i+Math.imul(P,ne)|0)+Math.imul(x,re)|0,a=a+Math.imul(x,ne)|0,n=n+Math.imul(A,ae)|0,i=(i=i+Math.imul(A,se)|0)+Math.imul(S,ae)|0,a=a+Math.imul(S,se)|0,n=n+Math.imul(_,ue)|0,i=(i=i+Math.imul(_,ce)|0)+Math.imul(v,ue)|0,a=a+Math.imul(v,ce)|0,n=n+Math.imul(m,de)|0,i=(i=i+Math.imul(m,le)|0)+Math.imul(g,de)|0,a=a+Math.imul(g,le)|0;var Pe=(c+(n=n+Math.imul(p,pe)|0)|0)+((8191&(i=(i=i+Math.imul(p,ye)|0)+Math.imul(y,pe)|0))<<13)|0;c=((a=a+Math.imul(y,ye)|0)+(i>>>13)|0)+(Pe>>>26)|0,Pe&=67108863,n=Math.imul(z,Z),i=(i=Math.imul(z,V))+Math.imul(D,Z)|0,a=Math.imul(D,V),n=n+Math.imul(T,$)|0,i=(i=i+Math.imul(T,J)|0)+Math.imul(I,$)|0,a=a+Math.imul(I,J)|0,n=n+Math.imul(R,Q)|0,i=(i=i+Math.imul(R,ee)|0)+Math.imul(B,Q)|0,a=a+Math.imul(B,ee)|0,n=n+Math.imul(C,re)|0,i=(i=i+Math.imul(C,ne)|0)+Math.imul(K,re)|0,a=a+Math.imul(K,ne)|0,n=n+Math.imul(P,ae)|0,i=(i=i+Math.imul(P,se)|0)+Math.imul(x,ae)|0,a=a+Math.imul(x,se)|0,n=n+Math.imul(A,ue)|0,i=(i=i+Math.imul(A,ce)|0)+Math.imul(S,ue)|0,a=a+Math.imul(S,ce)|0,n=n+Math.imul(_,de)|0,i=(i=i+Math.imul(_,le)|0)+Math.imul(v,de)|0,a=a+Math.imul(v,le)|0;var xe=(c+(n=n+Math.imul(m,pe)|0)|0)+((8191&(i=(i=i+Math.imul(m,ye)|0)+Math.imul(g,pe)|0))<<13)|0;c=((a=a+Math.imul(g,ye)|0)+(i>>>13)|0)+(xe>>>26)|0,xe&=67108863,n=Math.imul(z,$),i=(i=Math.imul(z,J))+Math.imul(D,$)|0,a=Math.imul(D,J),n=n+Math.imul(T,Q)|0,i=(i=i+Math.imul(T,ee)|0)+Math.imul(I,Q)|0,a=a+Math.imul(I,ee)|0,n=n+Math.imul(R,re)|0,i=(i=i+Math.imul(R,ne)|0)+Math.imul(B,re)|0,a=a+Math.imul(B,ne)|0,n=n+Math.imul(C,ae)|0,i=(i=i+Math.imul(C,se)|0)+Math.imul(K,ae)|0,a=a+Math.imul(K,se)|0,n=n+Math.imul(P,ue)|0,i=(i=i+Math.imul(P,ce)|0)+Math.imul(x,ue)|0,a=a+Math.imul(x,ce)|0,n=n+Math.imul(A,de)|0,i=(i=i+Math.imul(A,le)|0)+Math.imul(S,de)|0,a=a+Math.imul(S,le)|0;var Me=(c+(n=n+Math.imul(_,pe)|0)|0)+((8191&(i=(i=i+Math.imul(_,ye)|0)+Math.imul(v,pe)|0))<<13)|0;c=((a=a+Math.imul(v,ye)|0)+(i>>>13)|0)+(Me>>>26)|0,Me&=67108863,n=Math.imul(z,Q),i=(i=Math.imul(z,ee))+Math.imul(D,Q)|0,a=Math.imul(D,ee),n=n+Math.imul(T,re)|0,i=(i=i+Math.imul(T,ne)|0)+Math.imul(I,re)|0,a=a+Math.imul(I,ne)|0,n=n+Math.imul(R,ae)|0,i=(i=i+Math.imul(R,se)|0)+Math.imul(B,ae)|0,a=a+Math.imul(B,se)|0,n=n+Math.imul(C,ue)|0,i=(i=i+Math.imul(C,ce)|0)+Math.imul(K,ue)|0,a=a+Math.imul(K,ce)|0,n=n+Math.imul(P,de)|0,i=(i=i+Math.imul(P,le)|0)+Math.imul(x,de)|0,a=a+Math.imul(x,le)|0;var Ce=(c+(n=n+Math.imul(A,pe)|0)|0)+((8191&(i=(i=i+Math.imul(A,ye)|0)+Math.imul(S,pe)|0))<<13)|0;c=((a=a+Math.imul(S,ye)|0)+(i>>>13)|0)+(Ce>>>26)|0,Ce&=67108863,n=Math.imul(z,re),i=(i=Math.imul(z,ne))+Math.imul(D,re)|0,a=Math.imul(D,ne),n=n+Math.imul(T,ae)|0,i=(i=i+Math.imul(T,se)|0)+Math.imul(I,ae)|0,a=a+Math.imul(I,se)|0,n=n+Math.imul(R,ue)|0,i=(i=i+Math.imul(R,ce)|0)+Math.imul(B,ue)|0,a=a+Math.imul(B,ce)|0,n=n+Math.imul(C,de)|0,i=(i=i+Math.imul(C,le)|0)+Math.imul(K,de)|0,a=a+Math.imul(K,le)|0;var Ke=(c+(n=n+Math.imul(P,pe)|0)|0)+((8191&(i=(i=i+Math.imul(P,ye)|0)+Math.imul(x,pe)|0))<<13)|0;c=((a=a+Math.imul(x,ye)|0)+(i>>>13)|0)+(Ke>>>26)|0,Ke&=67108863,n=Math.imul(z,ae),i=(i=Math.imul(z,se))+Math.imul(D,ae)|0,a=Math.imul(D,se),n=n+Math.imul(T,ue)|0,i=(i=i+Math.imul(T,ce)|0)+Math.imul(I,ue)|0,a=a+Math.imul(I,ce)|0,n=n+Math.imul(R,de)|0,i=(i=i+Math.imul(R,le)|0)+Math.imul(B,de)|0,a=a+Math.imul(B,le)|0;var Ue=(c+(n=n+Math.imul(C,pe)|0)|0)+((8191&(i=(i=i+Math.imul(C,ye)|0)+Math.imul(K,pe)|0))<<13)|0;c=((a=a+Math.imul(K,ye)|0)+(i>>>13)|0)+(Ue>>>26)|0,Ue&=67108863,n=Math.imul(z,ue),i=(i=Math.imul(z,ce))+Math.imul(D,ue)|0,a=Math.imul(D,ce),n=n+Math.imul(T,de)|0,i=(i=i+Math.imul(T,le)|0)+Math.imul(I,de)|0,a=a+Math.imul(I,le)|0;var Re=(c+(n=n+Math.imul(R,pe)|0)|0)+((8191&(i=(i=i+Math.imul(R,ye)|0)+Math.imul(B,pe)|0))<<13)|0;c=((a=a+Math.imul(B,ye)|0)+(i>>>13)|0)+(Re>>>26)|0,Re&=67108863,n=Math.imul(z,de),i=(i=Math.imul(z,le))+Math.imul(D,de)|0,a=Math.imul(D,le);var Be=(c+(n=n+Math.imul(T,pe)|0)|0)+((8191&(i=(i=i+Math.imul(T,ye)|0)+Math.imul(I,pe)|0))<<13)|0;c=((a=a+Math.imul(I,ye)|0)+(i>>>13)|0)+(Be>>>26)|0,Be&=67108863;var je=(c+(n=Math.imul(z,pe))|0)+((8191&(i=(i=Math.imul(z,ye))+Math.imul(D,pe)|0))<<13)|0;return c=((a=Math.imul(D,ye))+(i>>>13)|0)+(je>>>26)|0,je&=67108863,u[0]=be,u[1]=me,u[2]=ge,u[3]=we,u[4]=_e,u[5]=ve,u[6]=ke,u[7]=Ae,u[8]=Se,u[9]=Ee,u[10]=Pe,u[11]=xe,u[12]=Me,u[13]=Ce,u[14]=Ke,u[15]=Ue,u[16]=Re,u[17]=Be,u[18]=je,0!==c&&(u[19]=c,r.length++),r};function p(e,t,r){return(new y).mulp(e,t,r)}function y(e,t){this.x=e,this.y=t}Math.imul||(h=l),a.prototype.mulTo=function(e,t){var r=this.length+e.length;return 10===this.length&&10===e.length?h(this,e,t):r<63?l(this,e,t):r<1024?function(e,t,r){r.negative=t.negative^e.negative,r.length=e.length+t.length;for(var n=0,i=0,a=0;a>>26)|0)>>>26,s&=67108863}r.words[a]=o,n=s,s=i}return 0!==n?r.words[a]=n:r.length--,r.strip()}(this,e,t):p(this,e,t)},y.prototype.makeRBT=function(e){for(var t=new Array(e),r=a.prototype._countBits(e)-1,n=0;n>=1;return n},y.prototype.permute=function(e,t,r,n,i,a){for(var s=0;s>>=1)i++;return 1<>>=13,r[2*s+1]=8191&a,a>>>=13;for(s=2*t;s>=26,t+=i/67108864|0,t+=a>>>26,this.words[r]=67108863&a}return 0!==t&&(this.words[r]=t,this.length++),this},a.prototype.muln=function(e){return this.clone().imuln(e)},a.prototype.sqr=function(){return this.mul(this)},a.prototype.isqr=function(){return this.imul(this.clone())},a.prototype.pow=function(e){var t=function(e){for(var t=new Array(e.bitLength()),r=0;r>>i}return t}(e);if(0===t.length)return new a(1);for(var r=this,n=0;n=0);var t,r=e%26,i=(e-r)/26,a=67108863>>>26-r<<26-r;if(0!==r){var s=0;for(t=0;t>>26-r}s&&(this.words[t]=s,this.length++)}if(0!==i){for(t=this.length-1;t>=0;t--)this.words[t+i]=this.words[t];for(t=0;t=0),i=t?(t-t%26)/26:0;var a=e%26,s=Math.min((e-a)/26,this.length),o=67108863^67108863>>>a<s)for(this.length-=s,c=0;c=0&&(0!==f||c>=i);c--){var d=0|this.words[c];this.words[c]=f<<26-a|d>>>a,f=d&o}return u&&0!==f&&(u.words[u.length++]=f),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},a.prototype.ishrn=function(e,t,r){return n(0===this.negative),this.iushrn(e,t,r)},a.prototype.shln=function(e){return this.clone().ishln(e)},a.prototype.ushln=function(e){return this.clone().iushln(e)},a.prototype.shrn=function(e){return this.clone().ishrn(e)},a.prototype.ushrn=function(e){return this.clone().iushrn(e)},a.prototype.testn=function(e){n("number"==typeof e&&e>=0);var t=e%26,r=(e-t)/26,i=1<=0);var t=e%26,r=(e-t)/26;if(n(0===this.negative,"imaskn works only with positive numbers"),this.length<=r)return this;if(0!==t&&r++,this.length=Math.min(r,this.length),0!==t){var i=67108863^67108863>>>t<=67108864;t++)this.words[t]-=67108864,t===this.length-1?this.words[t+1]=1:this.words[t+1]++;return this.length=Math.max(this.length,t+1),this},a.prototype.isubn=function(e){if(n("number"==typeof e),n(e<67108864),e<0)return this.iaddn(-e);if(0!==this.negative)return this.negative=0,this.iaddn(e),this.negative=1,this;if(this.words[0]-=e,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var t=0;t>26)-(u/67108864|0),this.words[i+r]=67108863&a}for(;i>26,this.words[i+r]=67108863&a;if(0===o)return this.strip();for(n(-1===o),o=0,i=0;i>26,this.words[i]=67108863&a;return this.negative=1,this.strip()},a.prototype._wordDiv=function(e,t){var r=(this.length,e.length),n=this.clone(),i=e,s=0|i.words[i.length-1];0!==(r=26-this._countBits(s))&&(i=i.ushln(r),n.iushln(r),s=0|i.words[i.length-1]);var o,u=n.length-i.length;if("mod"!==t){(o=new a(null)).length=u+1,o.words=new Array(o.length);for(var c=0;c=0;d--){var l=67108864*(0|n.words[i.length+d])+(0|n.words[i.length+d-1]);for(l=Math.min(l/s|0,67108863),n._ishlnsubmul(i,l,d);0!==n.negative;)l--,n.negative=0,n._ishlnsubmul(i,1,d),n.isZero()||(n.negative^=1);o&&(o.words[d]=l)}return o&&o.strip(),n.strip(),"div"!==t&&0!==r&&n.iushrn(r),{div:o||null,mod:n}},a.prototype.divmod=function(e,t,r){return n(!e.isZero()),this.isZero()?{div:new a(0),mod:new a(0)}:0!==this.negative&&0===e.negative?(o=this.neg().divmod(e,t),"mod"!==t&&(i=o.div.neg()),"div"!==t&&(s=o.mod.neg(),r&&0!==s.negative&&s.iadd(e)),{div:i,mod:s}):0===this.negative&&0!==e.negative?(o=this.divmod(e.neg(),t),"mod"!==t&&(i=o.div.neg()),{div:i,mod:o.mod}):0!=(this.negative&e.negative)?(o=this.neg().divmod(e.neg(),t),"div"!==t&&(s=o.mod.neg(),r&&0!==s.negative&&s.isub(e)),{div:o.div,mod:s}):e.length>this.length||this.cmp(e)<0?{div:new a(0),mod:this}:1===e.length?"div"===t?{div:this.divn(e.words[0]),mod:null}:"mod"===t?{div:null,mod:new a(this.modn(e.words[0]))}:{div:this.divn(e.words[0]),mod:new a(this.modn(e.words[0]))}:this._wordDiv(e,t);var i,s,o},a.prototype.div=function(e){return this.divmod(e,"div",!1).div},a.prototype.mod=function(e){return this.divmod(e,"mod",!1).mod},a.prototype.umod=function(e){return this.divmod(e,"mod",!0).mod},a.prototype.divRound=function(e){var t=this.divmod(e);if(t.mod.isZero())return t.div;var r=0!==t.div.negative?t.mod.isub(e):t.mod,n=e.ushrn(1),i=e.andln(1),a=r.cmp(n);return a<0||1===i&&0===a?t.div:0!==t.div.negative?t.div.isubn(1):t.div.iaddn(1)},a.prototype.modn=function(e){n(e<=67108863);for(var t=(1<<26)%e,r=0,i=this.length-1;i>=0;i--)r=(t*r+(0|this.words[i]))%e;return r},a.prototype.idivn=function(e){n(e<=67108863);for(var t=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*t;this.words[r]=i/e|0,t=i%e}return this.strip()},a.prototype.divn=function(e){return this.clone().idivn(e)},a.prototype.egcd=function(e){n(0===e.negative),n(!e.isZero());var t=this,r=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i=new a(1),s=new a(0),o=new a(0),u=new a(1),c=0;t.isEven()&&r.isEven();)t.iushrn(1),r.iushrn(1),++c;for(var f=r.clone(),d=t.clone();!t.isZero();){for(var l=0,h=1;0==(t.words[0]&h)&&l<26;++l,h<<=1);if(l>0)for(t.iushrn(l);l-- >0;)(i.isOdd()||s.isOdd())&&(i.iadd(f),s.isub(d)),i.iushrn(1),s.iushrn(1);for(var p=0,y=1;0==(r.words[0]&y)&&p<26;++p,y<<=1);if(p>0)for(r.iushrn(p);p-- >0;)(o.isOdd()||u.isOdd())&&(o.iadd(f),u.isub(d)),o.iushrn(1),u.iushrn(1);t.cmp(r)>=0?(t.isub(r),i.isub(o),s.isub(u)):(r.isub(t),o.isub(i),u.isub(s))}return{a:o,b:u,gcd:r.iushln(c)}},a.prototype._invmp=function(e){n(0===e.negative),n(!e.isZero());var t=this,r=e.clone();t=0!==t.negative?t.umod(e):t.clone();for(var i,s=new a(1),o=new a(0),u=r.clone();t.cmpn(1)>0&&r.cmpn(1)>0;){for(var c=0,f=1;0==(t.words[0]&f)&&c<26;++c,f<<=1);if(c>0)for(t.iushrn(c);c-- >0;)s.isOdd()&&s.iadd(u),s.iushrn(1);for(var d=0,l=1;0==(r.words[0]&l)&&d<26;++d,l<<=1);if(d>0)for(r.iushrn(d);d-- >0;)o.isOdd()&&o.iadd(u),o.iushrn(1);t.cmp(r)>=0?(t.isub(r),s.isub(o)):(r.isub(t),o.isub(s))}return(i=0===t.cmpn(1)?s:o).cmpn(0)<0&&i.iadd(e),i},a.prototype.gcd=function(e){if(this.isZero())return e.abs();if(e.isZero())return this.abs();var t=this.clone(),r=e.clone();t.negative=0,r.negative=0;for(var n=0;t.isEven()&&r.isEven();n++)t.iushrn(1),r.iushrn(1);for(;;){for(;t.isEven();)t.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=t.cmp(r);if(i<0){var a=t;t=r,r=a}else if(0===i||0===r.cmpn(1))break;t.isub(r)}return r.iushln(n)},a.prototype.invm=function(e){return this.egcd(e).a.umod(e)},a.prototype.isEven=function(){return 0==(1&this.words[0])},a.prototype.isOdd=function(){return 1==(1&this.words[0])},a.prototype.andln=function(e){return this.words[0]&e},a.prototype.bincn=function(e){n("number"==typeof e);var t=e%26,r=(e-t)/26,i=1<>>26,o&=67108863,this.words[s]=o}return 0!==a&&(this.words[s]=a,this.length++),this},a.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},a.prototype.cmpn=function(e){var t,r=e<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)t=1;else{r&&(e=-e),n(e<=67108863,"Number is too big");var i=0|this.words[0];t=i===e?0:ie.length)return 1;if(this.length=0;r--){var n=0|this.words[r],i=0|e.words[r];if(n!==i){ni&&(t=1);break}}return t},a.prototype.gtn=function(e){return 1===this.cmpn(e)},a.prototype.gt=function(e){return 1===this.cmp(e)},a.prototype.gten=function(e){return this.cmpn(e)>=0},a.prototype.gte=function(e){return this.cmp(e)>=0},a.prototype.ltn=function(e){return-1===this.cmpn(e)},a.prototype.lt=function(e){return-1===this.cmp(e)},a.prototype.lten=function(e){return this.cmpn(e)<=0},a.prototype.lte=function(e){return this.cmp(e)<=0},a.prototype.eqn=function(e){return 0===this.cmpn(e)},a.prototype.eq=function(e){return 0===this.cmp(e)},a.red=function(e){return new k(e)},a.prototype.toRed=function(e){return n(!this.red,"Already a number in reduction context"),n(0===this.negative,"red works only with positives"),e.convertTo(this)._forceRed(e)},a.prototype.fromRed=function(){return n(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},a.prototype._forceRed=function(e){return this.red=e,this},a.prototype.forceRed=function(e){return n(!this.red,"Already a number in reduction context"),this._forceRed(e)},a.prototype.redAdd=function(e){return n(this.red,"redAdd works only with red numbers"),this.red.add(this,e)},a.prototype.redIAdd=function(e){return n(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,e)},a.prototype.redSub=function(e){return n(this.red,"redSub works only with red numbers"),this.red.sub(this,e)},a.prototype.redISub=function(e){return n(this.red,"redISub works only with red numbers"),this.red.isub(this,e)},a.prototype.redShl=function(e){return n(this.red,"redShl works only with red numbers"),this.red.shl(this,e)},a.prototype.redMul=function(e){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.mul(this,e)},a.prototype.redIMul=function(e){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,e),this.red.imul(this,e)},a.prototype.redSqr=function(){return n(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},a.prototype.redISqr=function(){return n(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},a.prototype.redSqrt=function(){return n(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},a.prototype.redInvm=function(){return n(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},a.prototype.redNeg=function(){return n(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},a.prototype.redPow=function(e){return n(this.red&&!e.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,e)};var b={k256:null,p224:null,p192:null,p25519:null};function m(e,t){this.name=e,this.p=new a(t,16),this.n=this.p.bitLength(),this.k=new a(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function g(){m.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function w(){m.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function _(){m.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function v(){m.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function k(e){if("string"==typeof e){var t=a._prime(e);this.m=t.p,this.prime=t}else n(e.gtn(1),"modulus must be greater than 1"),this.m=e,this.prime=null}function A(e){k.call(this,e),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new a(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}m.prototype._tmp=function(){var e=new a(null);return e.words=new Array(Math.ceil(this.n/13)),e},m.prototype.ireduce=function(e){var t,r=e;do{this.split(r,this.tmp),t=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(t>this.n);var n=t0?r.isub(this.p):r.strip(),r},m.prototype.split=function(e,t){e.iushrn(this.n,0,t)},m.prototype.imulK=function(e){return e.imul(this.k)},i(g,m),g.prototype.split=function(e,t){for(var r=Math.min(e.length,9),n=0;n>>22,i=a}i>>>=22,e.words[n-10]=i,0===i&&e.length>10?e.length-=10:e.length-=9},g.prototype.imulK=function(e){e.words[e.length]=0,e.words[e.length+1]=0,e.length+=2;for(var t=0,r=0;r>>=26,e.words[r]=i,t=n}return 0!==t&&(e.words[e.length++]=t),e},a._prime=function(e){if(b[e])return b[e];var t;if("k256"===e)t=new g;else if("p224"===e)t=new w;else if("p192"===e)t=new _;else{if("p25519"!==e)throw new Error("Unknown prime "+e);t=new v}return b[e]=t,t},k.prototype._verify1=function(e){n(0===e.negative,"red works only with positives"),n(e.red,"red works only with red numbers")},k.prototype._verify2=function(e,t){n(0==(e.negative|t.negative),"red works only with positives"),n(e.red&&e.red===t.red,"red works only with red numbers")},k.prototype.imod=function(e){return this.prime?this.prime.ireduce(e)._forceRed(this):e.umod(this.m)._forceRed(this)},k.prototype.neg=function(e){return e.isZero()?e.clone():this.m.sub(e)._forceRed(this)},k.prototype.add=function(e,t){this._verify2(e,t);var r=e.add(t);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},k.prototype.iadd=function(e,t){this._verify2(e,t);var r=e.iadd(t);return r.cmp(this.m)>=0&&r.isub(this.m),r},k.prototype.sub=function(e,t){this._verify2(e,t);var r=e.sub(t);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},k.prototype.isub=function(e,t){this._verify2(e,t);var r=e.isub(t);return r.cmpn(0)<0&&r.iadd(this.m),r},k.prototype.shl=function(e,t){return this._verify1(e),this.imod(e.ushln(t))},k.prototype.imul=function(e,t){return this._verify2(e,t),this.imod(e.imul(t))},k.prototype.mul=function(e,t){return this._verify2(e,t),this.imod(e.mul(t))},k.prototype.isqr=function(e){return this.imul(e,e.clone())},k.prototype.sqr=function(e){return this.mul(e,e)},k.prototype.sqrt=function(e){if(e.isZero())return e.clone();var t=this.m.andln(3);if(n(t%2==1),3===t){var r=this.m.add(new a(1)).iushrn(2);return this.pow(e,r)}for(var i=this.m.subn(1),s=0;!i.isZero()&&0===i.andln(1);)s++,i.iushrn(1);n(!i.isZero());var o=new a(1).toRed(this),u=o.redNeg(),c=this.m.subn(1).iushrn(1),f=this.m.bitLength();for(f=new a(2*f*f).toRed(this);0!==this.pow(f,c).cmp(u);)f.redIAdd(u);for(var d=this.pow(f,i),l=this.pow(e,i.addn(1).iushrn(1)),h=this.pow(e,i),p=s;0!==h.cmp(o);){for(var y=h,b=0;0!==y.cmp(o);b++)y=y.redSqr();n(b=0;n--){for(var c=t.words[n],f=u-1;f>=0;f--){var d=c>>f&1;i!==r[0]&&(i=this.sqr(i)),0!==d||0!==s?(s<<=1,s|=d,(4===++o||0===n&&0===f)&&(i=this.mul(i,r[s]),o=0,s=0)):o=0}u=26}return i},k.prototype.convertTo=function(e){var t=e.umod(this.m);return t===e?t.clone():t},k.prototype.convertFrom=function(e){var t=e.clone();return t.red=null,t},a.mont=function(e){return new A(e)},i(A,k),A.prototype.convertTo=function(e){return this.imod(e.ushln(this.shift))},A.prototype.convertFrom=function(e){var t=this.imod(e.mul(this.rinv));return t.red=null,t},A.prototype.imul=function(e,t){if(e.isZero()||t.isZero())return e.words[0]=0,e.length=1,e;var r=e.imul(t),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),a=i;return i.cmp(this.m)>=0?a=i.isub(this.m):i.cmpn(0)<0&&(a=i.iadd(this.m)),a._forceRed(this)},A.prototype.mul=function(e,t){if(e.isZero()||t.isZero())return new a(0)._forceRed(this);var r=e.mul(t),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),s=i;return i.cmp(this.m)>=0?s=i.isub(this.m):i.cmpn(0)<0&&(s=i.iadd(this.m)),s._forceRed(this)},A.prototype.invm=function(e){return this.imod(e._invmp(this.m).mul(this.r2))._forceRed(this)}}(void 0===t||t,this)},{buffer:"buffer"}],17:[function(e,t,r){var n;function i(e){this.rand=e}if(t.exports=function(e){return n||(n=new i(null)),n.generate(e)},t.exports.Rand=i,i.prototype.generate=function(e){return this._rand(e)},i.prototype._rand=function(e){if(this.rand.getBytes)return this.rand.getBytes(e);for(var t=new Uint8Array(e),r=0;r0?this.redN=null:(this._maxwellTrick=!0,this.redN=this.n.toRed(this.red))}function c(e,t){this.curve=e,this.type=t,this.precomputed=null}t.exports=u,u.prototype.point=function(){throw new Error("Not implemented")},u.prototype.validate=function(){throw new Error("Not implemented")},u.prototype._fixedNafMul=function(e,t){o(e.precomputed);var r=e._getDoubles(),n=a(t,1),i=(1<=u;t--)c=(c<<1)+n[t];s.push(c)}for(var f=this.jpoint(null,null,null),d=this.jpoint(null,null,null),l=i;l>0;l--){for(u=0;u=0;c--){for(t=0;c>=0&&0===s[c];c--)t++;if(c>=0&&t++,u=u.dblp(t),c<0)break;var f=s[c];o(0!==f),u="affine"===e.type?f>0?u.mixedAdd(i[f-1>>1]):u.mixedAdd(i[-f-1>>1].neg()):f>0?u.add(i[f-1>>1]):u.add(i[-f-1>>1].neg())}return"affine"===e.type?u.toP():u},u.prototype._wnafMulAdd=function(e,t,r,n,i){for(var o=this._wnafT1,u=this._wnafT2,c=this._wnafT3,f=0,d=0;d=1;d-=2){var h=d-1,p=d;if(1===o[h]&&1===o[p]){var y=[t[h],null,null,t[p]];0===t[h].y.cmp(t[p].y)?(y[1]=t[h].add(t[p]),y[2]=t[h].toJ().mixedAdd(t[p].neg())):0===t[h].y.cmp(t[p].y.redNeg())?(y[1]=t[h].toJ().mixedAdd(t[p]),y[2]=t[h].add(t[p].neg())):(y[1]=t[h].toJ().mixedAdd(t[p]),y[2]=t[h].toJ().mixedAdd(t[p].neg()));var b=[-3,-1,-5,-7,0,7,5,1,3],m=s(r[h],r[p]);f=Math.max(m[0].length,f),c[h]=new Array(f),c[p]=new Array(f);for(var g=0;g=0;d--){for(var A=0;d>=0;){var S=!0;for(g=0;g=0&&A++,v=v.dblp(A),d<0)break;for(g=0;g0?E=u[g][P-1>>1]:P<0&&(E=u[g][-P-1>>1].neg()),v="affine"===E.type?v.mixedAdd(E):v.add(E))}}for(d=0;d=Math.ceil((e.bitLength()+1)/t.step)},c.prototype._getDoubles=function(e,t){if(this.precomputed&&this.precomputed.doubles)return this.precomputed.doubles;for(var r=[this],n=this,i=0;i":""},c.prototype.isInfinity=function(){return 0===this.x.cmpn(0)&&(0===this.y.cmp(this.z)||this.zOne&&0===this.y.cmp(this.curve.c))},c.prototype._extDbl=function(){var e=this.x.redSqr(),t=this.y.redSqr(),r=this.z.redSqr();r=r.redIAdd(r);var n=this.curve._mulA(e),i=this.x.redAdd(this.y).redSqr().redISub(e).redISub(t),a=n.redAdd(t),s=a.redSub(r),o=n.redSub(t),u=i.redMul(s),c=a.redMul(o),f=i.redMul(o),d=s.redMul(a);return this.curve.point(u,c,d,f)},c.prototype._projDbl=function(){var e,t,r,n=this.x.redAdd(this.y).redSqr(),i=this.x.redSqr(),a=this.y.redSqr();if(this.curve.twisted){var s=(c=this.curve._mulA(i)).redAdd(a);if(this.zOne)e=n.redSub(i).redSub(a).redMul(s.redSub(this.curve.two)),t=s.redMul(c.redSub(a)),r=s.redSqr().redSub(s).redSub(s);else{var o=this.z.redSqr(),u=s.redSub(o).redISub(o);e=n.redSub(i).redISub(a).redMul(u),t=s.redMul(c.redSub(a)),r=s.redMul(u)}}else{var c=i.redAdd(a);o=this.curve._mulC(this.z).redSqr(),u=c.redSub(o).redSub(o);e=this.curve._mulC(n.redISub(c)).redMul(u),t=this.curve._mulC(c).redMul(i.redISub(a)),r=c.redMul(u)}return this.curve.point(e,t,r)},c.prototype.dbl=function(){return this.isInfinity()?this:this.curve.extended?this._extDbl():this._projDbl()},c.prototype._extAdd=function(e){var t=this.y.redSub(this.x).redMul(e.y.redSub(e.x)),r=this.y.redAdd(this.x).redMul(e.y.redAdd(e.x)),n=this.t.redMul(this.curve.dd).redMul(e.t),i=this.z.redMul(e.z.redAdd(e.z)),a=r.redSub(t),s=i.redSub(n),o=i.redAdd(n),u=r.redAdd(t),c=a.redMul(s),f=o.redMul(u),d=a.redMul(u),l=s.redMul(o);return this.curve.point(c,f,l,d)},c.prototype._projAdd=function(e){var t,r,n=this.z.redMul(e.z),i=n.redSqr(),a=this.x.redMul(e.x),s=this.y.redMul(e.y),o=this.curve.d.redMul(a).redMul(s),u=i.redSub(o),c=i.redAdd(o),f=this.x.redAdd(this.y).redMul(e.x.redAdd(e.y)).redISub(a).redISub(s),d=n.redMul(u).redMul(f);return this.curve.twisted?(t=n.redMul(c).redMul(s.redSub(this.curve._mulA(a))),r=u.redMul(c)):(t=n.redMul(c).redMul(s.redSub(a)),r=this.curve._mulC(u).redMul(c)),this.curve.point(d,t,r)},c.prototype.add=function(e){return this.isInfinity()?e:e.isInfinity()?this:this.curve.extended?this._extAdd(e):this._projAdd(e)},c.prototype.mul=function(e){return this._hasDoubles(e)?this.curve._fixedNafMul(this,e):this.curve._wnafMul(this,e)},c.prototype.mulAdd=function(e,t,r){return this.curve._wnafMulAdd(1,[this,t],[e,r],2,!1)},c.prototype.jmulAdd=function(e,t,r){return this.curve._wnafMulAdd(1,[this,t],[e,r],2,!0)},c.prototype.normalize=function(){if(this.zOne)return this;var e=this.z.redInvm();return this.x=this.x.redMul(e),this.y=this.y.redMul(e),this.t&&(this.t=this.t.redMul(e)),this.z=this.curve.one,this.zOne=!0,this},c.prototype.neg=function(){return this.curve.point(this.x.redNeg(),this.y,this.z,this.t&&this.t.redNeg())},c.prototype.getX=function(){return this.normalize(),this.x.fromRed()},c.prototype.getY=function(){return this.normalize(),this.y.fromRed()},c.prototype.eq=function(e){return this===e||0===this.getX().cmp(e.getX())&&0===this.getY().cmp(e.getY())},c.prototype.eqXToP=function(e){var t=e.toRed(this.curve.red).redMul(this.z);if(0===this.x.cmp(t))return!0;for(var r=e.clone(),n=this.curve.redN.redMul(this.z);;){if(r.iadd(this.curve.n),r.cmp(this.curve.p)>=0)return!1;if(t.redIAdd(n),0===this.x.cmp(t))return!0}},c.prototype.toP=c.prototype.normalize,c.prototype.mixedAdd=c.prototype.add},{"../utils":32,"./base":19,"bn.js":16,inherits:47}],21:[function(e,t,r){"use strict";var n=r;n.base=e("./base"),n.short=e("./short"),n.mont=e("./mont"),n.edwards=e("./edwards")},{"./base":19,"./edwards":20,"./mont":22,"./short":23}],22:[function(e,t,r){"use strict";var n=e("bn.js"),i=e("inherits"),a=e("./base"),s=e("../utils");function o(e){a.call(this,"mont",e),this.a=new n(e.a,16).toRed(this.red),this.b=new n(e.b,16).toRed(this.red),this.i4=new n(4).toRed(this.red).redInvm(),this.two=new n(2).toRed(this.red),this.a24=this.i4.redMul(this.a.redAdd(this.two))}function u(e,t,r){a.BasePoint.call(this,e,"projective"),null===t&&null===r?(this.x=this.curve.one,this.z=this.curve.zero):(this.x=new n(t,16),this.z=new n(r,16),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)))}i(o,a),t.exports=o,o.prototype.validate=function(e){var t=e.normalize().x,r=t.redSqr(),n=r.redMul(t).redAdd(r.redMul(this.a)).redAdd(t);return 0===n.redSqrt().redSqr().cmp(n)},i(u,a.BasePoint),o.prototype.decodePoint=function(e,t){if(33===(e=s.toArray(e,t)).length&&64===e[0]&&(e=e.slice(1,33).reverse()),32!==e.length)throw new Error("Unknown point compression format");return this.point(e,1)},o.prototype.point=function(e,t){return new u(this,e,t)},o.prototype.pointFromJSON=function(e){return u.fromJSON(this,e)},u.prototype.precompute=function(){},u.prototype._encode=function(e){var t=this.curve.p.byteLength();return e?[64].concat(this.getX().toArray("le",t)):this.getX().toArray("be",t)},u.fromJSON=function(e,t){return new u(e,t[0],t[1]||e.one)},u.prototype.inspect=function(){return this.isInfinity()?"":""},u.prototype.isInfinity=function(){return 0===this.z.cmpn(0)},u.prototype.dbl=function(){var e=this.x.redAdd(this.z).redSqr(),t=this.x.redSub(this.z).redSqr(),r=e.redSub(t),n=e.redMul(t),i=r.redMul(t.redAdd(this.curve.a24.redMul(r)));return this.curve.point(n,i)},u.prototype.add=function(){throw new Error("Not supported on Montgomery curve")},u.prototype.diffAdd=function(e,t){var r=this.x.redAdd(this.z),n=this.x.redSub(this.z),i=e.x.redAdd(e.z),a=e.x.redSub(e.z).redMul(r),s=i.redMul(n),o=t.z.redMul(a.redAdd(s).redSqr()),u=t.x.redMul(a.redISub(s).redSqr());return this.curve.point(o,u)},u.prototype.mul=function(e){for(var t=(e=new n(e,16)).clone(),r=this,i=this.curve.point(null,null),a=[];0!==t.cmpn(0);t.iushrn(1))a.push(t.andln(1));for(var s=a.length-1;s>=0;s--)0===a[s]?(r=r.diffAdd(i,this),i=i.dbl()):(i=r.diffAdd(i,this),r=r.dbl());return i},u.prototype.mulAdd=function(){throw new Error("Not supported on Montgomery curve")},u.prototype.jumlAdd=function(){throw new Error("Not supported on Montgomery curve")},u.prototype.eq=function(e){return 0===this.getX().cmp(e.getX())},u.prototype.normalize=function(){return this.x=this.x.redMul(this.z.redInvm()),this.z=this.curve.one,this},u.prototype.getX=function(){return this.normalize(),this.x.fromRed()}},{"../utils":32,"./base":19,"bn.js":16,inherits:47}],23:[function(e,t,r){"use strict";var n=e("../utils"),i=e("bn.js"),a=e("inherits"),s=e("./base"),o=n.assert;function u(e){s.call(this,"short",e),this.a=new i(e.a,16).toRed(this.red),this.b=new i(e.b,16).toRed(this.red),this.tinv=this.two.redInvm(),this.zeroA=0===this.a.fromRed().cmpn(0),this.threeA=0===this.a.fromRed().sub(this.p).cmpn(-3),this.endo=this._getEndomorphism(e),this._endoWnafT1=new Array(4),this._endoWnafT2=new Array(4)}function c(e,t,r,n){s.BasePoint.call(this,e,"affine"),null===t&&null===r?(this.x=null,this.y=null,this.inf=!0):(this.x=new i(t,16),this.y=new i(r,16),n&&(this.x.forceRed(this.curve.red),this.y.forceRed(this.curve.red)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.inf=!1)}function f(e,t,r,n){s.BasePoint.call(this,e,"jacobian"),null===t&&null===r&&null===n?(this.x=this.curve.one,this.y=this.curve.one,this.z=new i(0)):(this.x=new i(t,16),this.y=new i(r,16),this.z=new i(n,16)),this.x.red||(this.x=this.x.toRed(this.curve.red)),this.y.red||(this.y=this.y.toRed(this.curve.red)),this.z.red||(this.z=this.z.toRed(this.curve.red)),this.zOne=this.z===this.curve.one}a(u,s),t.exports=u,u.prototype._getEndomorphism=function(e){if(this.zeroA&&this.g&&this.n&&1===this.p.modn(3)){var t,r;if(e.beta)t=new i(e.beta,16).toRed(this.red);else{var n=this._getEndoRoots(this.p);t=(t=n[0].cmp(n[1])<0?n[0]:n[1]).toRed(this.red)}if(e.lambda)r=new i(e.lambda,16);else{var a=this._getEndoRoots(this.n);0===this.g.mul(a[0]).x.cmp(this.g.x.redMul(t))?r=a[0]:(r=a[1],o(0===this.g.mul(r).x.cmp(this.g.x.redMul(t))))}return{beta:t,lambda:r,basis:e.basis?e.basis.map(function(e){return{a:new i(e.a,16),b:new i(e.b,16)}}):this._getEndoBasis(r)}}},u.prototype._getEndoRoots=function(e){var t=e===this.p?this.red:i.mont(e),r=new i(2).toRed(t).redInvm(),n=r.redNeg(),a=new i(3).toRed(t).redNeg().redSqrt().redMul(r);return[n.redAdd(a).fromRed(),n.redSub(a).fromRed()]},u.prototype._getEndoBasis=function(e){for(var t,r,n,a,s,o,u,c,f,d=this.n.ushrn(Math.floor(this.n.bitLength()/2)),l=e,h=this.n.clone(),p=new i(1),y=new i(0),b=new i(0),m=new i(1),g=0;0!==l.cmpn(0);){var w=h.div(l);c=h.sub(w.mul(l)),f=b.sub(w.mul(p));var _=m.sub(w.mul(y));if(!n&&c.cmp(d)<0)t=u.neg(),r=p,n=c.neg(),a=f;else if(n&&2==++g)break;u=c,h=l,l=c,b=p,p=f,m=y,y=_}s=c.neg(),o=f;var v=n.sqr().add(a.sqr());return s.sqr().add(o.sqr()).cmp(v)>=0&&(s=t,o=r),n.negative&&(n=n.neg(),a=a.neg()),s.negative&&(s=s.neg(),o=o.neg()),[{a:n,b:a},{a:s,b:o}]},u.prototype._endoSplit=function(e){var t=this.endo.basis,r=t[0],n=t[1],i=n.b.mul(e).divRound(this.n),a=r.b.neg().mul(e).divRound(this.n),s=i.mul(r.a),o=a.mul(n.a),u=i.mul(r.b),c=a.mul(n.b);return{k1:e.sub(s).sub(o),k2:u.add(c).neg()}},u.prototype.pointFromX=function(e,t){(e=new i(e,16)).red||(e=e.toRed(this.red));var r=e.redSqr().redMul(e).redIAdd(e.redMul(this.a)).redIAdd(this.b),n=r.redSqrt();if(0!==n.redSqr().redSub(r).cmp(this.zero))throw new Error("invalid point");var a=n.fromRed().isOdd();return(t&&!a||!t&&a)&&(n=n.redNeg()),this.point(e,n)},u.prototype.validate=function(e){if(e.inf)return!0;var t=e.x,r=e.y,n=this.a.redMul(t),i=t.redSqr().redMul(t).redIAdd(n).redIAdd(this.b);return 0===r.redSqr().redISub(i).cmpn(0)},u.prototype._endoWnafMulAdd=function(e,t,r){for(var n=this._endoWnafT1,i=this._endoWnafT2,a=0;a":""},c.prototype.isInfinity=function(){return this.inf},c.prototype.add=function(e){if(this.inf)return e;if(e.inf)return this;if(this.eq(e))return this.dbl();if(this.neg().eq(e))return this.curve.point(null,null);if(0===this.x.cmp(e.x))return this.curve.point(null,null);var t=this.y.redSub(e.y);0!==t.cmpn(0)&&(t=t.redMul(this.x.redSub(e.x).redInvm()));var r=t.redSqr().redISub(this.x).redISub(e.x),n=t.redMul(this.x.redSub(r)).redISub(this.y);return this.curve.point(r,n)},c.prototype.dbl=function(){if(this.inf)return this;var e=this.y.redAdd(this.y);if(0===e.cmpn(0))return this.curve.point(null,null);var t=this.curve.a,r=this.x.redSqr(),n=e.redInvm(),i=r.redAdd(r).redIAdd(r).redIAdd(t).redMul(n),a=i.redSqr().redISub(this.x.redAdd(this.x)),s=i.redMul(this.x.redSub(a)).redISub(this.y);return this.curve.point(a,s)},c.prototype.getX=function(){return this.x.fromRed()},c.prototype.getY=function(){return this.y.fromRed()},c.prototype.mul=function(e){return e=new i(e,16),this.isInfinity()?this:this._hasDoubles(e)?this.curve._fixedNafMul(this,e):this.curve.endo?this.curve._endoWnafMulAdd([this],[e]):this.curve._wnafMul(this,e)},c.prototype.mulAdd=function(e,t,r){var n=[this,t],i=[e,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i):this.curve._wnafMulAdd(1,n,i,2)},c.prototype.jmulAdd=function(e,t,r){var n=[this,t],i=[e,r];return this.curve.endo?this.curve._endoWnafMulAdd(n,i,!0):this.curve._wnafMulAdd(1,n,i,2,!0)},c.prototype.eq=function(e){return this===e||this.inf===e.inf&&(this.inf||0===this.x.cmp(e.x)&&0===this.y.cmp(e.y))},c.prototype.neg=function(e){if(this.inf)return this;var t=this.curve.point(this.x,this.y.redNeg());if(e&&this.precomputed){var r=this.precomputed,n=function(e){return e.neg()};t.precomputed={naf:r.naf&&{wnd:r.naf.wnd,points:r.naf.points.map(n)},doubles:r.doubles&&{step:r.doubles.step,points:r.doubles.points.map(n)}}}return t},c.prototype.toJ=function(){return this.inf?this.curve.jpoint(null,null,null):this.curve.jpoint(this.x,this.y,this.curve.one)},a(f,s.BasePoint),u.prototype.jpoint=function(e,t,r){return new f(this,e,t,r)},f.prototype.toP=function(){if(this.isInfinity())return this.curve.point(null,null);var e=this.z.redInvm(),t=e.redSqr(),r=this.x.redMul(t),n=this.y.redMul(t).redMul(e);return this.curve.point(r,n)},f.prototype.neg=function(){return this.curve.jpoint(this.x,this.y.redNeg(),this.z)},f.prototype.add=function(e){if(this.isInfinity())return e;if(e.isInfinity())return this;var t=e.z.redSqr(),r=this.z.redSqr(),n=this.x.redMul(t),i=e.x.redMul(r),a=this.y.redMul(t.redMul(e.z)),s=e.y.redMul(r.redMul(this.z)),o=n.redSub(i),u=a.redSub(s);if(0===o.cmpn(0))return 0!==u.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var c=o.redSqr(),f=c.redMul(o),d=n.redMul(c),l=u.redSqr().redIAdd(f).redISub(d).redISub(d),h=u.redMul(d.redISub(l)).redISub(a.redMul(f)),p=this.z.redMul(e.z).redMul(o);return this.curve.jpoint(l,h,p)},f.prototype.mixedAdd=function(e){if(this.isInfinity())return e.toJ();if(e.isInfinity())return this;var t=this.z.redSqr(),r=this.x,n=e.x.redMul(t),i=this.y,a=e.y.redMul(t).redMul(this.z),s=r.redSub(n),o=i.redSub(a);if(0===s.cmpn(0))return 0!==o.cmpn(0)?this.curve.jpoint(null,null,null):this.dbl();var u=s.redSqr(),c=u.redMul(s),f=r.redMul(u),d=o.redSqr().redIAdd(c).redISub(f).redISub(f),l=o.redMul(f.redISub(d)).redISub(i.redMul(c)),h=this.z.redMul(s);return this.curve.jpoint(d,l,h)},f.prototype.dblp=function(e){if(0===e)return this;if(this.isInfinity())return this;if(!e)return this.dbl();if(this.curve.zeroA||this.curve.threeA){for(var t=this,r=0;r=0)return!1;if(r.redIAdd(i),0===this.x.cmp(r))return!0}},f.prototype.inspect=function(){return this.isInfinity()?"":""},f.prototype.isInfinity=function(){return 0===this.z.cmpn(0)}},{"../utils":32,"./base":19,"bn.js":16,inherits:47}],24:[function(e,t,r){"use strict";var n,i=r,a=e("hash.js"),s=e("./curve"),o=e("./utils").assert;function u(e){if("short"===e.type)this.curve=new s.short(e);else if("edwards"===e.type)this.curve=new s.edwards(e);else{if("mont"!==e.type)throw new Error("Unknown curve type.");this.curve=new s.mont(e)}this.g=this.curve.g,this.n=this.curve.n,this.hash=e.hash,o(this.g.validate(),"Invalid curve"),o(this.g.mul(this.n).isInfinity(),"Invalid curve, n*G != O")}function c(e,t){Object.defineProperty(i,e,{configurable:!0,enumerable:!0,get:function(){var r=new u(t);return Object.defineProperty(i,e,{configurable:!0,enumerable:!0,value:r}),r}})}i.PresetCurve=u,c("p192",{type:"short",prime:"p192",p:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff",a:"ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc",b:"64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1",n:"ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831",hash:a.sha256,gRed:!1,g:["188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012","07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811"]}),c("p224",{type:"short",prime:"p224",p:"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001",a:"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe",b:"b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4",n:"ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d",hash:a.sha256,gRed:!1,g:["b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21","bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34"]}),c("p256",{type:"short",prime:null,p:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff",a:"ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc",b:"5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b",n:"ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551",hash:a.sha256,gRed:!1,g:["6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296","4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5"]}),c("p384",{type:"short",prime:null,p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff",a:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc",b:"b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef",n:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973",hash:a.sha384,gRed:!1,g:["aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7","3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f"]}),c("p521",{type:"short",prime:null,p:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff",a:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc",b:"00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00",n:"000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409",hash:a.sha512,gRed:!1,g:["000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66","00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650"]}),c("curve25519",{type:"mont",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"76d06",b:"1",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",cofactor:"8",hash:a.sha256,gRed:!1,g:["9"]}),c("ed25519",{type:"edwards",prime:"p25519",p:"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed",a:"-1",c:"1",d:"52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3",n:"1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed",cofactor:"8",hash:a.sha256,gRed:!1,g:["216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a","6666666666666666666666666666666666666666666666666666666666666658"]}),c("brainpoolP256r1",{type:"short",prime:null,p:"A9FB57DB A1EEA9BC 3E660A90 9D838D72 6E3BF623 D5262028 2013481D 1F6E5377",a:"7D5A0975 FC2C3057 EEF67530 417AFFE7 FB8055C1 26DC5C6C E94A4B44 F330B5D9",b:"26DC5C6C E94A4B44 F330B5D9 BBD77CBF 95841629 5CF7E1CE 6BCCDC18 FF8C07B6",n:"A9FB57DB A1EEA9BC 3E660A90 9D838D71 8C397AA3 B561A6F7 901E0E82 974856A7",hash:a.sha256,gRed:!1,g:["8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262","547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997"]}),c("brainpoolP384r1",{type:"short",prime:null,p:"8CB91E82 A3386D28 0F5D6F7E 50E641DF 152F7109 ED5456B4 12B1DA19 7FB71123ACD3A729 901D1A71 87470013 3107EC53",a:"7BC382C6 3D8C150C 3C72080A CE05AFA0 C2BEA28E 4FB22787 139165EF BA91F90F8AA5814A 503AD4EB 04A8C7DD 22CE2826",b:"04A8C7DD 22CE2826 8B39B554 16F0447C 2FB77DE1 07DCD2A6 2E880EA5 3EEB62D57CB43902 95DBC994 3AB78696 FA504C11",n:"8CB91E82 A3386D28 0F5D6F7E 50E641DF 152F7109 ED5456B3 1F166E6C AC0425A7CF3AB6AF 6B7FC310 3B883202 E9046565",hash:a.sha384,gRed:!1,g:["1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E","8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315"]}),c("brainpoolP512r1",{type:"short",prime:null,p:"AADD9DB8 DBE9C48B 3FD4E6AE 33C9FC07 CB308DB3 B3C9D20E D6639CCA 703308717D4D9B00 9BC66842 AECDA12A E6A380E6 2881FF2F 2D82C685 28AA6056 583A48F3",a:"7830A331 8B603B89 E2327145 AC234CC5 94CBDD8D 3DF91610 A83441CA EA9863BC2DED5D5A A8253AA1 0A2EF1C9 8B9AC8B5 7F1117A7 2BF2C7B9 E7C1AC4D 77FC94CA",b:"3DF91610 A83441CA EA9863BC 2DED5D5A A8253AA1 0A2EF1C9 8B9AC8B5 7F1117A72BF2C7B9 E7C1AC4D 77FC94CA DC083E67 984050B7 5EBAE5DD 2809BD63 8016F723",n:"AADD9DB8 DBE9C48B 3FD4E6AE 33C9FC07 CB308DB3 B3C9D20E D6639CCA 70330870553E5C41 4CA92619 41866119 7FAC1047 1DB1D381 085DDADD B5879682 9CA90069",hash:a.sha512,gRed:!1,g:["81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822","7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892"]});try{n=e("./precomputed/secp256k1")}catch(f){n=void 0}c("secp256k1",{type:"short",prime:"k256",p:"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f",a:"0",b:"7",n:"ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141",h:"1",hash:a.sha256,beta:"7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee",lambda:"5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72",basis:[{a:"3086d221a7d46bcde86c90e49284eb15",b:"-e4437ed6010e88286f547fa90abfe4c3"},{a:"114ca50f7a8e2f3f657c1108d9d44cfd8",b:"3086d221a7d46bcde86c90e49284eb15"}],gRed:!1,g:["79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798","483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8",n]})},{"./curve":21,"./precomputed/secp256k1":31,"./utils":32,"hash.js":34}],25:[function(e,t,r){"use strict";var n=e("bn.js"),i=e("hmac-drbg"),a=e("../utils"),s=e("../curves"),o=e("brorand"),u=a.assert,c=e("./key"),f=e("./signature");function d(e){if(!(this instanceof d))return new d(e);"string"==typeof e&&(u(s.hasOwnProperty(e),"Unknown curve "+e),e=s[e]),e instanceof s.PresetCurve&&(e={curve:e}),this.curve=e.curve.curve,this.n=this.curve.n,this.nh=this.n.ushrn(1),this.g=this.curve.g,this.g=e.curve.g,this.g.precompute(e.curve.n.bitLength()+1),this.hash=e.hash||e.curve.hash}t.exports=d,d.prototype.keyPair=function(e){return new c(this,e)},d.prototype.keyFromPrivate=function(e,t){return c.fromPrivate(this,e,t)},d.prototype.keyFromPublic=function(e,t){return c.fromPublic(this,e,t)},d.prototype.genKeyPair=function(e){e||(e={});var t=new i({hash:this.hash,pers:e.pers,persEnc:e.persEnc||"utf8",entropy:e.entropy||o(this.hash.hmacStrength),entropyEnc:e.entropy&&e.entropyEnc||"utf8",nonce:this.n.toArray()});if("mont"===this.curve.type){var r=new n(t.generate(32));return this.keyFromPrivate(r)}for(var a=this.n.byteLength(),s=this.n.sub(new n(2));;){if(!((r=new n(t.generate(a))).cmp(s)>0))return r.iaddn(1),this.keyFromPrivate(r)}},d.prototype._truncateToN=function(e,t,r){var n=(r=r||8*e.byteLength())-this.n.bitLength();return n>0&&(e=e.ushrn(n)),!t&&e.cmp(this.n)>=0?e.sub(this.n):e},d.prototype.truncateMsg=function(e){var t;return e instanceof Uint8Array?(t=8*e.byteLength,e=this._truncateToN(new n(e,16),!1,t)):"string"==typeof e?(t=4*e.length,e=this._truncateToN(new n(e,16),!1,t)):e=this._truncateToN(new n(e,16)),e},d.prototype.sign=function(e,t,r,a){"object"==typeof r&&(a=r,r=null),a||(a={}),t=this.keyFromPrivate(t,r),e=this.truncateMsg(e);for(var s=this.n.byteLength(),o=t.getPrivate().toArray("be",s),u=e.toArray("be",s),c=new i({hash:this.hash,entropy:o,nonce:u,pers:a.pers,persEnc:a.persEnc||"utf8"}),d=this.n.sub(new n(1)),l=0;;l++){var h=a.k?a.k(l):new n(c.generate(this.n.byteLength()));if(!((h=this._truncateToN(h,!0)).cmpn(1)<=0||h.cmp(d)>=0)){var p=this.g.mul(h);if(!p.isInfinity()){var y=p.getX(),b=y.umod(this.n);if(0!==b.cmpn(0)){var m=h.invm(this.n).mul(b.mul(t.getPrivate()).iadd(e));if(0!==(m=m.umod(this.n)).cmpn(0)){var g=(p.getY().isOdd()?1:0)|(0!==y.cmp(b)?2:0);return a.canonical&&m.cmp(this.nh)>0&&(m=this.n.sub(m),g^=1),new f({r:b,s:m,recoveryParam:g})}}}}}},d.prototype.verify=function(e,t,r,i){return r=this.keyFromPublic(r,i),t=new f(t,"hex"),this._verify(this.truncateMsg(e),t,r)||this._verify(this._truncateToN(new n(e,16)),t,r)},d.prototype._verify=function(e,t,r){var n=t.r,i=t.s;if(n.cmpn(1)<0||n.cmp(this.n)>=0)return!1;if(i.cmpn(1)<0||i.cmp(this.n)>=0)return!1;var a,s=i.invm(this.n),o=s.mul(e).umod(this.n),u=s.mul(n).umod(this.n);return this.curve._maxwellTrick?!(a=this.g.jmulAdd(o,r.getPublic(),u)).isInfinity()&&a.eqXToP(n):!(a=this.g.mulAdd(o,r.getPublic(),u)).isInfinity()&&0===a.getX().umod(this.n).cmp(n)},d.prototype.recoverPubKey=function(e,t,r,i){u((3&r)===r,"The recovery param is more than two bits"),t=new f(t,i);var a=this.n,s=new n(e),o=t.r,c=t.s,d=1&r,l=r>>1;if(o.cmp(this.curve.p.umod(this.curve.n))>=0&&l)throw new Error("Unable to find sencond key candinate");o=l?this.curve.pointFromX(o.add(this.curve.n),d):this.curve.pointFromX(o,d);var h=t.r.invm(a),p=a.sub(s).mul(h).umod(a),y=c.mul(h).umod(a);return this.g.mulAdd(p,o,y)},d.prototype.getKeyRecoveryParam=function(e,t,r,n){if(null!==(t=new f(t,n)).recoveryParam)return t.recoveryParam;for(var i=0;i<4;i++){var a;try{a=this.recoverPubKey(e,t,i)}catch(e){continue}if(a.eq(r))return i}throw new Error("Unable to find valid recovery factor")}},{"../curves":24,"../utils":32,"./key":26,"./signature":27,"bn.js":16,brorand:17,"hmac-drbg":46}],26:[function(e,t,r){"use strict";var n=e("bn.js"),i=e("../utils").assert;function a(e,t){this.ec=e,this.priv=null,this.pub=null,t.priv&&this._importPrivate(t.priv,t.privEnc),t.pub&&this._importPublic(t.pub,t.pubEnc)}t.exports=a,a.fromPublic=function(e,t,r){return t instanceof a?t:new a(e,{pub:t,pubEnc:r})},a.fromPrivate=function(e,t,r){return t instanceof a?t:new a(e,{priv:t,privEnc:r})},a.prototype.validate=function(){var e=this.getPublic();return e.isInfinity()?{result:!1,reason:"Invalid public key"}:e.validate()?e.mul(this.ec.curve.n).isInfinity()?{result:!0,reason:null}:{result:!1,reason:"Public key * N != O"}:{result:!1,reason:"Public key is not a point"}},a.prototype.getPublic=function(e,t){return this.pub||(this.pub=this.ec.g.mul(this.priv)),e?this.pub.encode(e,t):this.pub},a.prototype.getPrivate=function(e){return"hex"===e?this.priv.toString(16,2):this.priv},a.prototype._importPrivate=function(e,t){if(this.priv=new n(e,t||16),"mont"===this.ec.curve.type){var r=this.ec.curve.one,i=r.ushln(252).sub(r).ushln(3);this.priv=this.priv.or(r.ushln(254)),this.priv=this.priv.and(i)}else this.priv=this.priv.umod(this.ec.curve.n)},a.prototype._importPublic=function(e,t){if(e.x||e.y)return"mont"===this.ec.curve.type?i(e.x,"Need x coordinate"):"short"!==this.ec.curve.type&&"edwards"!==this.ec.curve.type||i(e.x&&e.y,"Need both x and y coordinate"),void(this.pub=this.ec.curve.point(e.x,e.y));this.pub=this.ec.curve.decodePoint(e,t)},a.prototype.derive=function(e){return e.mul(this.priv).getX()},a.prototype.sign=function(e,t,r){return this.ec.sign(e,this,t,r)},a.prototype.verify=function(e,t){return this.ec.verify(e,t,this)},a.prototype.inspect=function(){return""}},{"../utils":32,"bn.js":16}],27:[function(e,t,r){"use strict";var n=e("bn.js"),i=e("../utils"),a=i.assert;function s(e,t){if(e instanceof s)return e;this._importDER(e,t)||(a(e.r&&e.s,"Signature without r or s"),this.r=new n(e.r,16),this.s=new n(e.s,16),void 0===e.recoveryParam?this.recoveryParam=null:this.recoveryParam=e.recoveryParam)}function o(){this.place=0}function u(e,t){var r=e[t.place++];if(!(128&r))return r;for(var n=15&r,i=0,a=0,s=t.place;a>>3);for(e.push(128|r);--r;)e.push(t>>>(r<<3)&255);e.push(t)}}t.exports=s,s.prototype._importDER=function(e,t){e=i.toArray(e,t);var r=new o;if(48!==e[r.place++])return!1;if(u(e,r)+r.place!==e.length)return!1;if(2!==e[r.place++])return!1;var a=u(e,r),s=e.slice(r.place,a+r.place);if(r.place+=a,2!==e[r.place++])return!1;var c=u(e,r);if(e.length!==c+r.place)return!1;var f=e.slice(r.place,c+r.place);return 0===s[0]&&128&s[1]&&(s=s.slice(1)),0===f[0]&&128&f[1]&&(f=f.slice(1)),this.r=new n(s),this.s=new n(f),this.recoveryParam=null,!0},s.prototype.toDER=function(e){var t=this.r.toArray(),r=this.s.toArray();for(128&t[0]&&(t=[0].concat(t)),128&r[0]&&(r=[0].concat(r)),t=c(t),r=c(r);!(r[0]||128&r[1]);)r=r.slice(1);var n=[2];f(n,t.length),(n=n.concat(t)).push(2),f(n,r.length);var a=n.concat(r),s=[48];return f(s,a.length),s=s.concat(a),i.encode(s,e)}},{"../utils":32,"bn.js":16}],28:[function(e,t,r){"use strict";var n=e("hash.js"),i=e("hmac-drbg"),a=e("brorand"),s=e("../curves"),o=e("../utils"),u=o.assert,c=o.parseBytes,f=e("./key"),d=e("./signature");function l(e){if(u("ed25519"===e,"only tested with ed25519 so far"),!(this instanceof l))return new l(e);e=s[e].curve;this.curve=e,this.g=e.g,this.g.precompute(e.n.bitLength()+1),this.pointClass=e.point().constructor,this.encodingLength=Math.ceil(e.n.bitLength()/8),this.hash=n.sha512}t.exports=l,l.prototype.sign=function(e,t){e=c(e);var r=this.keyFromSecret(t),n=this.hashInt(r.messagePrefix(),e),i=this.g.mul(n),a=this.encodePoint(i),s=this.hashInt(a,r.pubBytes(),e).mul(r.priv()),o=n.add(s).umod(this.curve.n);return this.makeSignature({R:i,S:o,Rencoded:a})},l.prototype.verify=function(e,t,r){e=c(e),t=this.makeSignature(t);var n=this.keyFromPublic(r),i=this.hashInt(t.Rencoded(),n.pubBytes(),e),a=this.g.mul(t.S());return t.R().add(n.pub().mul(i)).eq(a)},l.prototype.hashInt=function(){for(var e=this.hash(),t=0;t=0;){var a;if(i.isOdd()){var s=i.andln(n-1);a=s>(n>>1)-1?(n>>1)-s:s,i.isubn(a)}else a=0;r.push(a);for(var o=0!==i.cmpn(0)&&0===i.andln(n-1)?t+1:1,u=1;u0||t.cmpn(-i)>0;){var a,s,o,u=e.andln(3)+n&3,c=t.andln(3)+i&3;3===u&&(u=-1),3===c&&(c=-1),a=0==(1&u)?0:3!=(o=e.andln(7)+n&7)&&5!==o||2!==c?u:-u,r[0].push(a),s=0==(1&c)?0:3!=(o=t.andln(7)+i&7)&&5!==o||2!==u?c:-c,r[1].push(s),2*n===a+1&&(n=1-n),2*i===s+1&&(i=1-i),e.iushrn(1),t.iushrn(1)}return r},n.cachedProperty=function(e,t,r){var n="_"+t;e.prototype[t]=function(){return void 0!==this[n]?this[n]:this[n]=r.call(this)}},n.parseBytes=function(e){return"string"==typeof e?n.toArray(e,"hex"):e},n.intFromLE=function(e){return new i(e,"hex","le")}},{"bn.js":16,"minimalistic-assert":48,"minimalistic-crypto-utils":49}],33:[function(e,t,r){"use strict";!function(e){function r(e){function t(){return Ae0&&(t.semantic=" "),t}}function b(e,t){return function(){var n,a,o,c,f;for(c=r(),n=s("star"),o=0,f=void 0===t?0:t;null!==(a=e());)o+=1,u(n,a);return o>=f?n:(i(c),null)}}function m(e){return e.charCodeAt(0)>=128}function g(){return o("cr",f("\r")())}function w(){return o("crlf",d(g,k)())}function _(){return o("dquote",f('"')())}function v(){return o("htab",f("\t")())}function k(){return o("lf",f("\n")())}function A(){return o("sp",f(" ")())}function S(){return o("vchar",c(function(t){var r=t.charCodeAt(0),n=33<=r&&r<=126;return e.rfc6532&&(n=n||m(t)),n}))}function E(){return o("wsp",l(A,v)())}function P(){var e=o("quoted-pair",l(d(f("\\"),l(S,E)),ne)());return null===e?null:(e.semantic=e.semantic[1],e)}function x(){return o("fws",l(ae,d(h(d(b(E),p(w))),b(E,1)))())}function M(){return o("ctext",l(function(){return c(function(t){var r=t.charCodeAt(0),n=33<=r&&r<=39||42<=r&&r<=91||93<=r&&r<=126;return e.rfc6532&&(n=n||m(t)),n})},te)())}function C(){return o("ccontent",l(M,P,K)())}function K(){return o("comment",d(f("("),b(d(h(x),C)),h(x),f(")"))())}function U(){return o("cfws",l(d(b(d(h(x),K),1),h(x)),x)())}function R(){return o("atext",c(function(t){var r="a"<=t&&t<="z"||"A"<=t&&t<="Z"||"0"<=t&&t<="9"||["!","#","$","%","&","'","*","+","-","/","=","?","^","_","`","{","|","}","~"].indexOf(t)>=0;return e.rfc6532&&(r=r||m(t)),r}))}function B(){return o("atom",d(y(h(U)),b(R,1),y(h(U)))())}function j(){var e,t;return null===(e=o("dot-atom-text",b(R,1)()))?e:(null!==(t=b(d(f("."),b(R,1)))())&&u(e,t),e)}function T(){return o("dot-atom",d(p(h(U)),j,p(h(U)))())}function I(){return o("qtext",l(function(){return c(function(t){var r=t.charCodeAt(0),n=33===r||35<=r&&r<=91||93<=r&&r<=126;return e.rfc6532&&(n=n||m(t)),n})},re)())}function O(){return o("qcontent",l(I,P)())}function z(){return o("quoted-string",d(p(h(U)),p(_),b(d(h(y(x)),O)),h(p(x)),p(_),p(h(U)))())}function D(){return o("word",l(B,z)())}function q(){return o("address",l(N,H)())}function N(){return o("mailbox",l(F,Q)())}function F(){return o("name-addr",d(h(W),L)())}function L(){return o("angle-addr",l(d(p(h(U)),f("<"),Q,f(">"),p(h(U))),se)())}function H(){return o("group",d(W,f(":"),h(V),f(";"),p(h(U)))())}function W(){return o("display-name",(null!==(e=o("phrase",l(ie,b(D,1))()))&&(e.semantic=e.semantic.replace(/([ \t]|\r\n)+/g," ").replace(/^\s*/,"").replace(/\s*$/,"")),e));var e}function G(){return o("mailbox-list",l(d(N,b(d(f(","),N))),ce)())}function Z(){return o("address-list",l(d(q,b(d(f(","),q))),fe)())}function V(){return o("group-list",l(G,p(U),de)())}function Y(){return o("local-part",l(le,T,z)())}function $(){return o("dtext",l(function(){return c(function(t){var r=t.charCodeAt(0),n=33<=r&&r<=90||94<=r&&r<=126;return e.rfc6532&&(n=n||m(t)),n})},pe)())}function J(){return o("domain-literal",d(p(h(U)),f("["),b(d(h(x),$)),h(x),f("]"),p(h(U)))())}function X(){return o("domain",(t=l(he,T,J)(),e.rejectTLD&&t&&t.semantic&&t.semantic.indexOf(".")<0?null:(t&&(t.semantic=t.semantic.replace(/\s+/g,"")),t)));var t}function Q(){return o("addr-spec",d(Y,f("@"),X)())}function ee(){return e.strict?null:o("obs-NO-WS-CTL",c(function(e){var t=e.charCodeAt(0);return 1<=t&&t<=8||11===t||12===t||14<=t&&t<=31||127===t}))}function te(){return e.strict?null:o("obs-ctext",ee())}function re(){return e.strict?null:o("obs-qtext",ee())}function ne(){return e.strict?null:o("obs-qp",d(f("\\"),l(f("\0"),ee,k,g))())}function ie(){return e.strict?null:e.atInDisplayName?o("obs-phrase",d(D,b(l(D,f("."),f("@"),y(U))))()):o("obs-phrase",d(D,b(l(D,f("."),y(U))))())}function ae(){return e.strict?null:o("obs-FWS",b(d(p(h(w)),E),1)())}function se(){return e.strict?null:o("obs-angle-addr",d(p(h(U)),f("<"),oe,Q,f(">"),p(h(U)))())}function oe(){return e.strict?null:o("obs-route",d(ue,f(":"))())}function ue(){return e.strict?null:o("obs-domain-list",d(b(l(p(U),f(","))),f("@"),X,b(d(f(","),p(h(U)),h(d(f("@"),X)))))())}function ce(){return e.strict?null:o("obs-mbox-list",d(b(d(p(h(U)),f(","))),N,b(d(f(","),h(d(N,p(U))))))())}function fe(){return e.strict?null:o("obs-addr-list",d(b(d(p(h(U)),f(","))),q,b(d(f(","),h(d(q,p(U))))))())}function de(){return e.strict?null:o("obs-group-list",d(b(d(p(h(U)),f(",")),1),p(h(U)))())}function le(){return e.strict?null:o("obs-local-part",d(D,b(d(f("."),D)))())}function he(){return e.strict?null:o("obs-domain",d(B,b(d(f("."),B)))())}function pe(){return e.strict?null:o("obs-dtext",l(ee,P)())}function ye(e,t){var r,n,i;if(null==t)return null;for(n=[t];n.length>0;){if((i=n.pop()).name===e)return i;for(r=i.children.length-1;r>=0;r-=1)n.push(i.children[r])}return null}function be(e,t){var r,n,i,a,s;if(null==t)return null;for(n=[t],a=[],s={},r=0;r0;)if((i=n.pop()).name in s)a.push(i);else for(r=i.children.length-1;r>=0;r-=1)n.push(i.children[r]);return a}function me(t){var r,n,i,a,s;if(null===t)return null;for(r=[],n=be(["group","mailbox"],t),i=0;i1)return null;return t.addresses&&t.addresses[0]}(s):e.simple?s&&s.addresses:s}function ge(e){var t,r=ye("display-name",e),n=[],i=be(["mailbox"],e);for(t=0;t0;)for((i=n.pop()).name===e&&a.push(i),r=i.children.length-1;r>=0;r-=1)n.push(i.children[r]);return a}("cfws",e),i=be(["comment"],e),a=ye("local-part",r),s=ye("domain",r);return{node:e,parts:{name:t,address:r,local:a,domain:s,comments:n},type:e.name,name:_e(t),address:_e(r),local:_e(a),domain:_e(s),comments:ve(i),groupName:_e(e.groupName)}}function _e(e){return null!=e?e.semantic:null}function ve(e){var t="";if(e)for(var r=0;r=this._delta8){var r=(e=this.pending).length%this._delta8;this.pending=e.slice(e.length-r,e.length),0===this.pending.length&&(this.pending=null),e=n.join32(e,0,e.length-r,this.endian);for(var i=0;i>>24&255,n[i++]=e>>>16&255,n[i++]=e>>>8&255,n[i++]=255&e}else for(n[i++]=255&e,n[i++]=e>>>8&255,n[i++]=e>>>16&255,n[i++]=e>>>24&255,n[i++]=0,n[i++]=0,n[i++]=0,n[i++]=0,a=8;athis.blockSize&&(e=(new this.Hash).update(e).digest()),i(e.length<=this.blockSize);for(var t=e.length;t>>3},r.g1_256=function(e){return n(e,17)^n(e,19)^e>>>10}},{"../utils":45}],45:[function(e,t,r){"use strict";var n=e("minimalistic-assert"),i=e("inherits");function a(e){return(e>>>24|e>>>8&65280|e<<8&16711680|(255&e)<<24)>>>0}function s(e){return 1===e.length?"0"+e:e}function o(e){return 7===e.length?"0"+e:6===e.length?"00"+e:5===e.length?"000"+e:4===e.length?"0000"+e:3===e.length?"00000"+e:2===e.length?"000000"+e:1===e.length?"0000000"+e:e}r.inherits=i,r.toArray=function(e,t){if(Array.isArray(e))return e.slice();if(!e)return[];var r=[];if("string"==typeof e)if(t){if("hex"===t)for((e=e.replace(/[^a-z0-9]+/gi,"")).length%2!=0&&(e="0"+e),n=0;n>8,s=255&i;a?r.push(a,s):r.push(s)}else for(n=0;n>>0}return s},r.split32=function(e,t){for(var r=new Array(4*e.length),n=0,i=0;n>>24,r[i+1]=a>>>16&255,r[i+2]=a>>>8&255,r[i+3]=255&a):(r[i+3]=a>>>24,r[i+2]=a>>>16&255,r[i+1]=a>>>8&255,r[i]=255&a)}return r},r.rotr32=function(e,t){return e>>>t|e<<32-t},r.rotl32=function(e,t){return e<>>32-t},r.sum32=function(e,t){return e+t>>>0},r.sum32_3=function(e,t,r){return e+t+r>>>0},r.sum32_4=function(e,t,r,n){return e+t+r+n>>>0},r.sum32_5=function(e,t,r,n,i){return e+t+r+n+i>>>0},r.sum64=function(e,t,r,n){var i=e[t],a=n+e[t+1]>>>0,s=(a>>0,e[t+1]=a},r.sum64_hi=function(e,t,r,n){return(t+n>>>0>>0},r.sum64_lo=function(e,t,r,n){return t+n>>>0},r.sum64_4_hi=function(e,t,r,n,i,a,s,o){var u=0,c=t;return u+=(c=c+n>>>0)>>0)>>0)>>0},r.sum64_4_lo=function(e,t,r,n,i,a,s,o){return t+n+a+o>>>0},r.sum64_5_hi=function(e,t,r,n,i,a,s,o,u,c){var f=0,d=t;return f+=(d=d+n>>>0)>>0)>>0)>>0)>>0},r.sum64_5_lo=function(e,t,r,n,i,a,s,o,u,c){return t+n+a+o+c>>>0},r.rotr64_hi=function(e,t,r){return(t<<32-r|e>>>r)>>>0},r.rotr64_lo=function(e,t,r){return(e<<32-r|t>>>r)>>>0},r.shr64_hi=function(e,t,r){return e>>>r},r.shr64_lo=function(e,t,r){return(e<<32-r|t>>>r)>>>0}},{inherits:47,"minimalistic-assert":48}],46:[function(e,t,r){"use strict";var n=e("hash.js"),i=e("minimalistic-crypto-utils"),a=e("minimalistic-assert");function s(e){if(!(this instanceof s))return new s(e);this.hash=e.hash,this.predResist=!!e.predResist,this.outLen=this.hash.outSize,this.minEntropy=e.minEntropy||this.hash.hmacStrength,this._reseed=null,this.reseedInterval=null,this.K=null,this.V=null;var t=i.toArray(e.entropy,e.entropyEnc||"hex"),r=i.toArray(e.nonce,e.nonceEnc||"hex"),n=i.toArray(e.pers,e.persEnc||"hex");a(t.length>=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._init(t,r,n)}t.exports=s,s.prototype._init=function(e,t,r){var n=e.concat(t).concat(r);this.K=new Array(this.outLen/8),this.V=new Array(this.outLen/8);for(var i=0;i=this.minEntropy/8,"Not enough entropy. Minimum is: "+this.minEntropy+" bits"),this._update(e.concat(r||[])),this._reseed=1},s.prototype.generate=function(e,t,r,n){if(this._reseed>this.reseedInterval)throw new Error("Reseed is required");"string"!=typeof t&&(n=r,r=t,t=null),r&&(r=i.toArray(r,n||"hex"),this._update(r));for(var a=[];a.length>8,s=255&i;a?r.push(a,s):r.push(s)}return r},n.zero2=i,n.toHex=a,n.encode=function(e,t){return"hex"===t?a(e):e}},{}],50:[function(e,t,r){"use strict";var n={};(0,e("./lib/utils/common").assign)(n,e("./lib/deflate"),e("./lib/inflate"),e("./lib/zlib/constants")),t.exports=n},{"./lib/deflate":51,"./lib/inflate":52,"./lib/utils/common":53,"./lib/zlib/constants":56}],51:[function(e,t,r){"use strict";var n=e("./zlib/deflate"),i=e("./utils/common"),a=e("./utils/strings"),s=e("./zlib/messages"),o=e("./zlib/zstream"),u=Object.prototype.toString,c=0,f=-1,d=0,l=8;function h(e){if(!(this instanceof h))return new h(e);this.options=i.assign({level:f,method:l,chunkSize:16384,windowBits:15,memLevel:8,strategy:d,to:""},e||{});var t=this.options;t.raw&&t.windowBits>0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new o,this.strm.avail_out=0;var r=n.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==c)throw new Error(s[r]);if(t.header&&n.deflateSetHeader(this.strm,t.header),t.dictionary){var p;if(p="string"==typeof t.dictionary?a.string2buf(t.dictionary):"[object ArrayBuffer]"===u.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,(r=n.deflateSetDictionary(this.strm,p))!==c)throw new Error(s[r]);this._dict_set=!0}}function p(e,t){var r=new h(t);if(r.push(e,!0),r.err)throw r.msg||s[r.err];return r.result}h.prototype.push=function(e,t){var r,s,o=this.strm,f=this.options.chunkSize;if(this.ended)return!1;s=t===~~t?t:!0===t?4:0,"string"==typeof e?o.input=a.string2buf(e):"[object ArrayBuffer]"===u.call(e)?o.input=new Uint8Array(e):o.input=e,o.next_in=0,o.avail_in=o.input.length;do{if(0===o.avail_out&&(o.output=new i.Buf8(f),o.next_out=0,o.avail_out=f),1!==(r=n.deflate(o,s))&&r!==c)return this.onEnd(r),this.ended=!0,!1;0!==o.avail_out&&(0!==o.avail_in||4!==s&&2!==s)||("string"===this.options.to?this.onData(a.buf2binstring(i.shrinkBuf(o.output,o.next_out))):this.onData(i.shrinkBuf(o.output,o.next_out)))}while((o.avail_in>0||0===o.avail_out)&&1!==r);return 4===s?(r=n.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===c):2!==s||(this.onEnd(c),o.avail_out=0,!0)},h.prototype.onData=function(e){this.chunks.push(e)},h.prototype.onEnd=function(e){e===c&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=h,r.deflate=p,r.deflateRaw=function(e,t){return(t=t||{}).raw=!0,p(e,t)},r.gzip=function(e,t){return(t=t||{}).gzip=!0,p(e,t)}},{"./utils/common":53,"./utils/strings":54,"./zlib/deflate":58,"./zlib/messages":63,"./zlib/zstream":65}],52:[function(e,t,r){"use strict";var n=e("./zlib/inflate"),i=e("./utils/common"),a=e("./utils/strings"),s=e("./zlib/constants"),o=e("./zlib/messages"),u=e("./zlib/zstream"),c=e("./zlib/gzheader"),f=Object.prototype.toString;function d(e){if(!(this instanceof d))return new d(e);this.options=i.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new u,this.strm.avail_out=0;var r=n.inflateInit2(this.strm,t.windowBits);if(r!==s.Z_OK)throw new Error(o[r]);this.header=new c,n.inflateGetHeader(this.strm,this.header)}function l(e,t){var r=new d(t);if(r.push(e,!0),r.err)throw r.msg||o[r.err];return r.result}d.prototype.push=function(e,t){var r,o,u,c,d,l,h=this.strm,p=this.options.chunkSize,y=this.options.dictionary,b=!1;if(this.ended)return!1;o=t===~~t?t:!0===t?s.Z_FINISH:s.Z_NO_FLUSH,"string"==typeof e?h.input=a.binstring2buf(e):"[object ArrayBuffer]"===f.call(e)?h.input=new Uint8Array(e):h.input=e,h.next_in=0,h.avail_in=h.input.length;do{if(0===h.avail_out&&(h.output=new i.Buf8(p),h.next_out=0,h.avail_out=p),(r=n.inflate(h,s.Z_NO_FLUSH))===s.Z_NEED_DICT&&y&&(l="string"==typeof y?a.string2buf(y):"[object ArrayBuffer]"===f.call(y)?new Uint8Array(y):y,r=n.inflateSetDictionary(this.strm,l)),r===s.Z_BUF_ERROR&&!0===b&&(r=s.Z_OK,b=!1),r!==s.Z_STREAM_END&&r!==s.Z_OK)return this.onEnd(r),this.ended=!0,!1;h.next_out&&(0!==h.avail_out&&r!==s.Z_STREAM_END&&(0!==h.avail_in||o!==s.Z_FINISH&&o!==s.Z_SYNC_FLUSH)||("string"===this.options.to?(u=a.utf8border(h.output,h.next_out),c=h.next_out-u,d=a.buf2string(h.output,u),h.next_out=c,h.avail_out=p-c,c&&i.arraySet(h.output,h.output,u,c,0),this.onData(d)):this.onData(i.shrinkBuf(h.output,h.next_out)))),0===h.avail_in&&0===h.avail_out&&(b=!0)}while((h.avail_in>0||0===h.avail_out)&&r!==s.Z_STREAM_END);return r===s.Z_STREAM_END&&(o=s.Z_FINISH),o===s.Z_FINISH?(r=n.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===s.Z_OK):o!==s.Z_SYNC_FLUSH||(this.onEnd(s.Z_OK),h.avail_out=0,!0)},d.prototype.onData=function(e){this.chunks.push(e)},d.prototype.onEnd=function(e){e===s.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=d,r.inflate=l,r.inflateRaw=function(e,t){return(t=t||{}).raw=!0,l(e,t)},r.ungzip=l},{"./utils/common":53,"./utils/strings":54,"./zlib/constants":56,"./zlib/gzheader":59,"./zlib/inflate":61,"./zlib/messages":63,"./zlib/zstream":65}],53:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;function i(e,t){return Object.prototype.hasOwnProperty.call(e,t)}r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var n in r)i(r,n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var a={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray)e.set(t.subarray(r,r+n),i);else for(var a=0;a=252?6:o>=248?5:o>=240?4:o>=224?3:o>=192?2:1;function u(e,t){if(t<65537&&(e.subarray&&a||!e.subarray&&i))return String.fromCharCode.apply(null,n.shrinkBuf(e,t));for(var r="",s=0;s>>6,t[s++]=128|63&r):r<65536?(t[s++]=224|r>>>12,t[s++]=128|r>>>6&63,t[s++]=128|63&r):(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63,t[s++]=128|r>>>6&63,t[s++]=128|63&r);return t},r.buf2binstring=function(e){return u(e,e.length)},r.binstring2buf=function(e){for(var t=new n.Buf8(e.length),r=0,i=t.length;r4)c[n++]=65533,r+=a-1;else{for(i&=2===a?31:3===a?15:7;a>1&&r1?c[n++]=65533:i<65536?c[n++]=i:(i-=65536,c[n++]=55296|i>>10&1023,c[n++]=56320|1023&i)}return u(c,n)},r.utf8border=function(e,t){var r;for((t=t||e.length)>e.length&&(t=e.length),r=t-1;r>=0&&128==(192&e[r]);)r--;return r<0?t:0===r?t:r+s[e[r]]>t?r:t}},{"./common":53}],55:[function(e,t,r){"use strict";t.exports=function(e,t,r,n){for(var i=65535&e|0,a=e>>>16&65535|0,s=0;0!==r;){r-=s=r>2e3?2e3:r;do{a=a+(i=i+t[n++]|0)|0}while(--s);i%=65521,a%=65521}return i|a<<16|0}},{}],56:[function(e,t,r){"use strict";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],57:[function(e,t,r){"use strict";var n=function(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}();t.exports=function(e,t,r,i){var a=n,s=i+r;e^=-1;for(var o=i;o>>8^a[255&(e^t[o])];return-1^e}},{}],58:[function(e,t,r){"use strict";var n,i=e("../utils/common"),a=e("./trees"),s=e("./adler32"),o=e("./crc32"),u=e("./messages"),c=0,f=1,d=3,l=4,h=5,p=0,y=1,b=-2,m=-3,g=-5,w=-1,_=1,v=2,k=3,A=4,S=0,E=2,P=8,x=9,M=15,C=8,K=286,U=30,R=19,B=2*K+1,j=15,T=3,I=258,O=I+T+1,z=32,D=42,q=69,N=73,F=91,L=103,H=113,W=666,G=1,Z=2,V=3,Y=4,$=3;function J(e,t){return e.msg=u[t],t}function X(e){return(e<<1)-(e>4?9:0)}function Q(e){for(var t=e.length;--t>=0;)e[t]=0}function ee(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(i.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function te(e,t){a._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,ee(e.strm)}function re(e,t){e.pending_buf[e.pending++]=t}function ne(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function ie(e,t){var r,n,i=e.max_chain_length,a=e.strstart,s=e.prev_length,o=e.nice_match,u=e.strstart>e.w_size-O?e.strstart-(e.w_size-O):0,c=e.window,f=e.w_mask,d=e.prev,l=e.strstart+I,h=c[a+s-1],p=c[a+s];e.prev_length>=e.good_match&&(i>>=2),o>e.lookahead&&(o=e.lookahead);do{if(c[(r=t)+s]===p&&c[r+s-1]===h&&c[r]===c[a]&&c[++r]===c[a+1]){a+=2,r++;do{}while(c[++a]===c[++r]&&c[++a]===c[++r]&&c[++a]===c[++r]&&c[++a]===c[++r]&&c[++a]===c[++r]&&c[++a]===c[++r]&&c[++a]===c[++r]&&c[++a]===c[++r]&&as){if(e.match_start=t,s=n,n>=o)break;h=c[a+s-1],p=c[a+s]}}}while((t=d[t&f])>u&&0!=--i);return s<=e.lookahead?s:e.lookahead}function ae(e){var t,r,n,a,u,c,f,d,l,h,p=e.w_size;do{if(a=e.window_size-e.lookahead-e.strstart,e.strstart>=p+(p-O)){i.arraySet(e.window,e.window,p,p,0),e.match_start-=p,e.strstart-=p,e.block_start-=p,t=r=e.hash_size;do{n=e.head[--t],e.head[t]=n>=p?n-p:0}while(--r);t=r=p;do{n=e.prev[--t],e.prev[t]=n>=p?n-p:0}while(--r);a+=p}if(0===e.strm.avail_in)break;if(c=e.strm,f=e.window,d=e.strstart+e.lookahead,l=a,h=void 0,(h=c.avail_in)>l&&(h=l),r=0===h?0:(c.avail_in-=h,i.arraySet(f,c.input,c.next_in,h,d),1===c.state.wrap?c.adler=s(c.adler,f,h,d):2===c.state.wrap&&(c.adler=o(c.adler,f,h,d)),c.next_in+=h,c.total_in+=h,h),e.lookahead+=r,e.lookahead+e.insert>=T)for(u=e.strstart-e.insert,e.ins_h=e.window[u],e.ins_h=(e.ins_h<=T&&(e.ins_h=(e.ins_h<=T)if(n=a._tr_tally(e,e.strstart-e.match_start,e.match_length-T),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=T){e.match_length--;do{e.strstart++,e.ins_h=(e.ins_h<=T&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=T-1)),e.prev_length>=T&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-T,n=a._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-T),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=i&&(e.ins_h=(e.ins_h<15&&(o=2,n-=16),a<1||a>x||r!==P||n<8||n>15||t<0||t>9||s<0||s>A)return J(e,b);8===n&&(n=9);var u=new ce;return e.state=u,u.strm=e,u.wrap=o,u.gzhead=null,u.w_bits=n,u.w_size=1<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(ae(e),0===e.lookahead&&t===c)return G;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,te(e,!1),0===e.strm.avail_out))return G;if(e.strstart-e.block_start>=e.w_size-O&&(te(e,!1),0===e.strm.avail_out))return G}return e.insert=0,t===l?(te(e,!0),0===e.strm.avail_out?V:Y):(e.strstart>e.block_start&&(te(e,!1),e.strm.avail_out),G)}),new ue(4,4,8,4,se),new ue(4,5,16,8,se),new ue(4,6,32,32,se),new ue(4,4,16,16,oe),new ue(8,16,32,32,oe),new ue(8,16,128,128,oe),new ue(8,32,128,256,oe),new ue(32,128,258,1024,oe),new ue(32,258,258,4096,oe)],r.deflateInit=function(e,t){return le(e,t,P,M,C,S)},r.deflateInit2=le,r.deflateReset=de,r.deflateResetKeep=fe,r.deflateSetHeader=function(e,t){return e&&e.state?2!==e.state.wrap?b:(e.state.gzhead=t,p):b},r.deflate=function(e,t){var r,i,s,u;if(!e||!e.state||t>h||t<0)return e?J(e,b):b;if(i=e.state,!e.output||!e.input&&0!==e.avail_in||i.status===W&&t!==l)return J(e,0===e.avail_out?g:b);if(i.strm=e,r=i.last_flush,i.last_flush=t,i.status===D)if(2===i.wrap)e.adler=0,re(i,31),re(i,139),re(i,8),i.gzhead?(re(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),re(i,255&i.gzhead.time),re(i,i.gzhead.time>>8&255),re(i,i.gzhead.time>>16&255),re(i,i.gzhead.time>>24&255),re(i,9===i.level?2:i.strategy>=v||i.level<2?4:0),re(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(re(i,255&i.gzhead.extra.length),re(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(e.adler=o(e.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=q):(re(i,0),re(i,0),re(i,0),re(i,0),re(i,0),re(i,9===i.level?2:i.strategy>=v||i.level<2?4:0),re(i,$),i.status=H);else{var m=P+(i.w_bits-8<<4)<<8;m|=(i.strategy>=v||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(m|=z),m+=31-m%31,i.status=H,ne(i,m),0!==i.strstart&&(ne(i,e.adler>>>16),ne(i,65535&e.adler)),e.adler=1}if(i.status===q)if(i.gzhead.extra){for(s=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>s&&(e.adler=o(e.adler,i.pending_buf,i.pending-s,s)),ee(e),s=i.pending,i.pending!==i.pending_buf_size));)re(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>s&&(e.adler=o(e.adler,i.pending_buf,i.pending-s,s)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=N)}else i.status=N;if(i.status===N)if(i.gzhead.name){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(e.adler=o(e.adler,i.pending_buf,i.pending-s,s)),ee(e),s=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindexs&&(e.adler=o(e.adler,i.pending_buf,i.pending-s,s)),0===u&&(i.gzindex=0,i.status=F)}else i.status=F;if(i.status===F)if(i.gzhead.comment){s=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>s&&(e.adler=o(e.adler,i.pending_buf,i.pending-s,s)),ee(e),s=i.pending,i.pending===i.pending_buf_size)){u=1;break}u=i.gzindexs&&(e.adler=o(e.adler,i.pending_buf,i.pending-s,s)),0===u&&(i.status=L)}else i.status=L;if(i.status===L&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&ee(e),i.pending+2<=i.pending_buf_size&&(re(i,255&e.adler),re(i,e.adler>>8&255),e.adler=0,i.status=H)):i.status=H),0!==i.pending){if(ee(e),0===e.avail_out)return i.last_flush=-1,p}else if(0===e.avail_in&&X(t)<=X(r)&&t!==l)return J(e,g);if(i.status===W&&0!==e.avail_in)return J(e,g);if(0!==e.avail_in||0!==i.lookahead||t!==c&&i.status!==W){var w=i.strategy===v?function(e,t){for(var r;;){if(0===e.lookahead&&(ae(e),0===e.lookahead)){if(t===c)return G;break}if(e.match_length=0,r=a._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(te(e,!1),0===e.strm.avail_out))return G}return e.insert=0,t===l?(te(e,!0),0===e.strm.avail_out?V:Y):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?G:Z}(i,t):i.strategy===k?function(e,t){for(var r,n,i,s,o=e.window;;){if(e.lookahead<=I){if(ae(e),e.lookahead<=I&&t===c)return G;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=T&&e.strstart>0&&(n=o[i=e.strstart-1])===o[++i]&&n===o[++i]&&n===o[++i]){s=e.strstart+I;do{}while(n===o[++i]&&n===o[++i]&&n===o[++i]&&n===o[++i]&&n===o[++i]&&n===o[++i]&&n===o[++i]&&n===o[++i]&&ie.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=T?(r=a._tr_tally(e,1,e.match_length-T),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=a._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(te(e,!1),0===e.strm.avail_out))return G}return e.insert=0,t===l?(te(e,!0),0===e.strm.avail_out?V:Y):e.last_lit&&(te(e,!1),0===e.strm.avail_out)?G:Z}(i,t):n[i.level].func(i,t);if(w!==V&&w!==Y||(i.status=W),w===G||w===V)return 0===e.avail_out&&(i.last_flush=-1),p;if(w===Z&&(t===f?a._tr_align(i):t!==h&&(a._tr_stored_block(i,0,0,!1),t===d&&(Q(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),ee(e),0===e.avail_out))return i.last_flush=-1,p}return t!==l?p:i.wrap<=0?y:(2===i.wrap?(re(i,255&e.adler),re(i,e.adler>>8&255),re(i,e.adler>>16&255),re(i,e.adler>>24&255),re(i,255&e.total_in),re(i,e.total_in>>8&255),re(i,e.total_in>>16&255),re(i,e.total_in>>24&255)):(ne(i,e.adler>>>16),ne(i,65535&e.adler)),ee(e),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?p:y)},r.deflateEnd=function(e){var t;return e&&e.state?(t=e.state.status)!==D&&t!==q&&t!==N&&t!==F&&t!==L&&t!==H&&t!==W?J(e,b):(e.state=null,t===H?J(e,m):p):b},r.deflateSetDictionary=function(e,t){var r,n,a,o,u,c,f,d,l=t.length;if(!e||!e.state)return b;if(2===(o=(r=e.state).wrap)||1===o&&r.status!==D||r.lookahead)return b;for(1===o&&(e.adler=s(e.adler,t,l,0)),r.wrap=0,l>=r.w_size&&(0===o&&(Q(r.head),r.strstart=0,r.block_start=0,r.insert=0),d=new i.Buf8(r.w_size),i.arraySet(d,t,l-r.w_size,r.w_size,0),t=d,l=r.w_size),u=e.avail_in,c=e.next_in,f=e.input,e.avail_in=l,e.next_in=0,e.input=t,ae(r);r.lookahead>=T;){n=r.strstart,a=r.lookahead-(T-1);do{r.ins_h=(r.ins_h<>>=_=w>>>24,p-=_,0===(_=w>>>16&255))P[a++]=65535&w;else{if(!(16&_)){if(0==(64&_)){w=y[(65535&w)+(h&(1<<_)-1)];continue t}if(32&_){r.mode=12;break e}e.msg="invalid literal/length code",r.mode=30;break e}v=65535&w,(_&=15)&&(p<_&&(h+=E[n++]<>>=_,p-=_),p<15&&(h+=E[n++]<>>=_=w>>>24,p-=_,!(16&(_=w>>>16&255))){if(0==(64&_)){w=b[(65535&w)+(h&(1<<_)-1)];continue r}e.msg="invalid distance code",r.mode=30;break e}if(k=65535&w,p<(_&=15)&&(h+=E[n++]<u){e.msg="invalid distance too far back",r.mode=30;break e}if(h>>>=_,p-=_,k>(_=a-s)){if((_=k-_)>f&&r.sane){e.msg="invalid distance too far back",r.mode=30;break e}if(A=0,S=l,0===d){if(A+=c-_,_2;)P[a++]=S[A++],P[a++]=S[A++],P[a++]=S[A++],v-=3;v&&(P[a++]=S[A++],v>1&&(P[a++]=S[A++]))}else{A=a-k;do{P[a++]=P[A++],P[a++]=P[A++],P[a++]=P[A++],v-=3}while(v>2);v&&(P[a++]=P[A++],v>1&&(P[a++]=P[A++]))}break}}break}}while(n>3,h&=(1<<(p-=v<<3))-1,e.next_in=n,e.next_out=a,e.avail_in=n>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function ie(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new n.Buf16(320),this.work=new n.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function ae(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=k,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new n.Buf32(ee),t.distcode=t.distdyn=new n.Buf32(te),t.sane=1,t.back=-1,p):m}function se(e){var t;return e&&e.state?((t=e.state).wsize=0,t.whave=0,t.wnext=0,ae(e)):m}function oe(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?m:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,se(e))):m}function ue(e,t){var r,n;return e?(n=new ie,e.state=n,n.window=null,(r=oe(e,t))!==p&&(e.state=null),r):m}var ce,fe,de=!0;function le(e){if(de){var t;for(ce=new n.Buf32(512),fe=new n.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(o(c,e.lens,0,288,ce,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;o(f,e.lens,0,32,fe,0,e.work,{bits:5}),de=!1}e.lencode=ce,e.lenbits=9,e.distcode=fe,e.distbits=5}function he(e,t,r,i){var a,s=e.state;return null===s.window&&(s.wsize=1<=s.wsize?(n.arraySet(s.window,t,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):((a=s.wsize-s.wnext)>i&&(a=i),n.arraySet(s.window,t,r-i,a,s.wnext),(i-=a)?(n.arraySet(s.window,t,r-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=a,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=a(r.check,xe,2,0),oe=0,ue=0,r.mode=A;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&oe)<<8)+(oe>>8))%31){e.msg="incorrect header check",r.mode=J;break}if((15&oe)!==v){e.msg="unknown compression method",r.mode=J;break}if(ue-=4,ke=8+(15&(oe>>>=4)),0===r.wbits)r.wbits=ke;else if(ke>r.wbits){e.msg="invalid window size",r.mode=J;break}r.dmax=1<>8&1),512&r.flags&&(xe[0]=255&oe,xe[1]=oe>>>8&255,r.check=a(r.check,xe,2,0)),oe=0,ue=0,r.mode=S;case S:for(;ue<32;){if(0===ae)break e;ae--,oe+=ee[re++]<>>8&255,xe[2]=oe>>>16&255,xe[3]=oe>>>24&255,r.check=a(r.check,xe,4,0)),oe=0,ue=0,r.mode=E;case E:for(;ue<16;){if(0===ae)break e;ae--,oe+=ee[re++]<>8),512&r.flags&&(xe[0]=255&oe,xe[1]=oe>>>8&255,r.check=a(r.check,xe,2,0)),oe=0,ue=0,r.mode=P;case P:if(1024&r.flags){for(;ue<16;){if(0===ae)break e;ae--,oe+=ee[re++]<>>8&255,r.check=a(r.check,xe,2,0)),oe=0,ue=0}else r.head&&(r.head.extra=null);r.mode=x;case x:if(1024&r.flags&&((de=r.length)>ae&&(de=ae),de&&(r.head&&(ke=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),n.arraySet(r.head.extra,ee,re,de,ke)),512&r.flags&&(r.check=a(r.check,ee,de,re)),ae-=de,re+=de,r.length-=de),r.length))break e;r.length=0,r.mode=M;case M:if(2048&r.flags){if(0===ae)break e;de=0;do{ke=ee[re+de++],r.head&&ke&&r.length<65536&&(r.head.name+=String.fromCharCode(ke))}while(ke&&de>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=B;break;case U:for(;ue<32;){if(0===ae)break e;ae--,oe+=ee[re++]<>>=7&ue,ue-=7&ue,r.mode=V;break}for(;ue<3;){if(0===ae)break e;ae--,oe+=ee[re++]<>>=1)){case 0:r.mode=T;break;case 1:if(le(r),r.mode=N,t===h){oe>>>=2,ue-=2;break e}break;case 2:r.mode=z;break;case 3:e.msg="invalid block type",r.mode=J}oe>>>=2,ue-=2;break;case T:for(oe>>>=7&ue,ue-=7&ue;ue<32;){if(0===ae)break e;ae--,oe+=ee[re++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=J;break}if(r.length=65535&oe,oe=0,ue=0,r.mode=I,t===h)break e;case I:r.mode=O;case O:if(de=r.length){if(de>ae&&(de=ae),de>se&&(de=se),0===de)break e;n.arraySet(te,ee,re,de,ie),ae-=de,re+=de,se-=de,ie+=de,r.length-=de;break}r.mode=B;break;case z:for(;ue<14;){if(0===ae)break e;ae--,oe+=ee[re++]<>>=5,ue-=5,r.ndist=1+(31&oe),oe>>>=5,ue-=5,r.ncode=4+(15&oe),oe>>>=4,ue-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=J;break}r.have=0,r.mode=D;case D:for(;r.have>>=3,ue-=3}for(;r.have<19;)r.lens[Me[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,Se={bits:r.lenbits},Ae=o(u,r.lens,0,19,r.lencode,0,r.work,Se),r.lenbits=Se.bits,Ae){e.msg="invalid code lengths set",r.mode=J;break}r.have=0,r.mode=q;case q:for(;r.have>>16&255,ge=65535&Pe,!((be=Pe>>>24)<=ue);){if(0===ae)break e;ae--,oe+=ee[re++]<>>=be,ue-=be,r.lens[r.have++]=ge;else{if(16===ge){for(Ee=be+2;ue>>=be,ue-=be,0===r.have){e.msg="invalid bit length repeat",r.mode=J;break}ke=r.lens[r.have-1],de=3+(3&oe),oe>>>=2,ue-=2}else if(17===ge){for(Ee=be+3;ue>>=be)),oe>>>=3,ue-=3}else{for(Ee=be+7;ue>>=be)),oe>>>=7,ue-=7}if(r.have+de>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=J;break}for(;de--;)r.lens[r.have++]=ke}}if(r.mode===J)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=J;break}if(r.lenbits=9,Se={bits:r.lenbits},Ae=o(c,r.lens,0,r.nlen,r.lencode,0,r.work,Se),r.lenbits=Se.bits,Ae){e.msg="invalid literal/lengths set",r.mode=J;break}if(r.distbits=6,r.distcode=r.distdyn,Se={bits:r.distbits},Ae=o(f,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,Se),r.distbits=Se.bits,Ae){e.msg="invalid distances set",r.mode=J;break}if(r.mode=N,t===h)break e;case N:r.mode=F;case F:if(ae>=6&&se>=258){e.next_out=ie,e.avail_out=se,e.next_in=re,e.avail_in=ae,r.hold=oe,r.bits=ue,s(e,fe),ie=e.next_out,te=e.output,se=e.avail_out,re=e.next_in,ee=e.input,ae=e.avail_in,oe=r.hold,ue=r.bits,r.mode===B&&(r.back=-1);break}for(r.back=0;me=(Pe=r.lencode[oe&(1<>>16&255,ge=65535&Pe,!((be=Pe>>>24)<=ue);){if(0===ae)break e;ae--,oe+=ee[re++]<>we)])>>>16&255,ge=65535&Pe,!(we+(be=Pe>>>24)<=ue);){if(0===ae)break e;ae--,oe+=ee[re++]<>>=we,ue-=we,r.back+=we}if(oe>>>=be,ue-=be,r.back+=be,r.length=ge,0===me){r.mode=Z;break}if(32&me){r.back=-1,r.mode=B;break}if(64&me){e.msg="invalid literal/length code",r.mode=J;break}r.extra=15&me,r.mode=L;case L:if(r.extra){for(Ee=r.extra;ue>>=r.extra,ue-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=H;case H:for(;me=(Pe=r.distcode[oe&(1<>>16&255,ge=65535&Pe,!((be=Pe>>>24)<=ue);){if(0===ae)break e;ae--,oe+=ee[re++]<>we)])>>>16&255,ge=65535&Pe,!(we+(be=Pe>>>24)<=ue);){if(0===ae)break e;ae--,oe+=ee[re++]<>>=we,ue-=we,r.back+=we}if(oe>>>=be,ue-=be,r.back+=be,64&me){e.msg="invalid distance code",r.mode=J;break}r.offset=ge,r.extra=15&me,r.mode=W;case W:if(r.extra){for(Ee=r.extra;ue>>=r.extra,ue-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=J;break}r.mode=G;case G:if(0===se)break e;if(de=fe-se,r.offset>de){if((de=r.offset-de)>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=J;break}de>r.wnext?(de-=r.wnext,pe=r.wsize-de):pe=r.wnext-de,de>r.length&&(de=r.length),ye=r.window}else ye=te,pe=ie-r.offset,de=r.length;de>se&&(de=se),se-=de,r.length-=de;do{te[ie++]=ye[pe++]}while(--de);0===r.length&&(r.mode=F);break;case Z:if(0===se)break e;te[ie++]=r.length,se--,r.mode=F;break;case V:if(r.wrap){for(;ue<32;){if(0===ae)break e;ae--,oe|=ee[re++]<=1&&0===T[P];P--);if(x>P&&(x=P),0===P)return c[f++]=20971520,c[f++]=20971520,l.bits=1,0;for(E=1;E0&&(0===e||1!==P))return-1;for(I[1]=0,A=1;A<15;A++)I[A+1]=I[A]+T[A];for(S=0;S852||2===e&&U>592)return 1;for(;;){w=A-C,d[S]g?(_=O[z+d[S]],v=B[j+d[S]]):(_=96,v=0),h=1<>C)+(p-=h)]=w<<24|_<<16|v|0}while(0!==p);for(h=1<>=1;if(0!==h?(R&=h-1,R+=h):R=0,S++,0==--T[A]){if(A===P)break;A=t[r+d[S]]}if(A>x&&(R&b)!==y){for(0===C&&(C=x),m+=E,K=1<<(M=A-C);M+C852||2===e&&U>592)return 1;c[y=R&b]=x<<24|M<<16|m-f|0}}return 0!==R&&(c[m+R]=A-C<<24|64<<16|0),l.bits=x,0}},{"../utils/common":53}],63:[function(e,t,r){"use strict";t.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],64:[function(e,t,r){"use strict";var n=e("../utils/common"),i=4,a=0,s=1,o=2;function u(e){for(var t=e.length;--t>=0;)e[t]=0}var c=0,f=1,d=2,l=29,h=256,p=h+1+l,y=30,b=19,m=2*p+1,g=15,w=16,_=7,v=256,k=16,A=17,S=18,E=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],P=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],x=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],M=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],C=new Array(2*(p+2));u(C);var K=new Array(2*y);u(K);var U=new Array(512);u(U);var R=new Array(256);u(R);var B=new Array(l);u(B);var j,T,I,O=new Array(y);function z(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function D(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function q(e){return e<256?U[e]:U[256+(e>>>7)]}function N(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function F(e,t,r){e.bi_valid>w-r?(e.bi_buf|=t<>w-e.bi_valid,e.bi_valid+=r-w):(e.bi_buf|=t<>>=1,r<<=1}while(--t>0);return r>>>1}function W(e,t,r){var n,i,a=new Array(g+1),s=0;for(n=1;n<=g;n++)a[n]=s=s+r[n-1]<<1;for(i=0;i<=t;i++){var o=e[2*i+1];0!==o&&(e[2*i]=H(a[o]++,o))}}function G(e){var t;for(t=0;t8?N(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function V(e,t,r,n){var i=2*t,a=2*r;return e[i]>1;r>=1;r--)Y(e,a,r);i=u;do{r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],Y(e,a,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,a[2*i]=a[2*r]+a[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,a[2*r+1]=a[2*n+1]=i,e.heap[1]=i++,Y(e,a,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],function(e,t){var r,n,i,a,s,o,u=t.dyn_tree,c=t.max_code,f=t.stat_desc.static_tree,d=t.stat_desc.has_stree,l=t.stat_desc.extra_bits,h=t.stat_desc.extra_base,p=t.stat_desc.max_length,y=0;for(a=0;a<=g;a++)e.bl_count[a]=0;for(u[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;rp&&(a=p,y++),u[2*n+1]=a,n>c||(e.bl_count[a]++,s=0,n>=h&&(s=l[n-h]),o=u[2*n],e.opt_len+=o*(a+s),d&&(e.static_len+=o*(f[2*n+1]+s)));if(0!==y){do{for(a=p-1;0===e.bl_count[a];)a--;e.bl_count[a]--,e.bl_count[a+1]+=2,e.bl_count[p]--,y-=2}while(y>0);for(a=p;0!==a;a--)for(n=e.bl_count[a];0!==n;)(i=e.heap[--r])>c||(u[2*i+1]!==a&&(e.opt_len+=(a-u[2*i+1])*u[2*i],u[2*i+1]=a),n--)}}(e,t),W(a,c,e.bl_count)}function X(e,t,r){var n,i,a=-1,s=t[1],o=0,u=7,c=4;for(0===s&&(u=138,c=3),t[2*(r+1)+1]=65535,n=0;n<=r;n++)i=s,s=t[2*(n+1)+1],++o>=7;n0?(e.strm.data_type===o&&(e.strm.data_type=function(e){var t,r=4093624447;for(t=0;t<=31;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return a;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return s;for(t=32;t=3&&0===e.bl_tree[2*M[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}(e),u=e.opt_len+3+7>>>3,(c=e.static_len+3+7>>>3)<=u&&(u=c)):u=c=r+5,r+4<=u&&-1!==t?te(e,t,r,n):e.strategy===i||c===u?(F(e,(f<<1)+(n?1:0),3),$(e,C,K)):(F(e,(d<<1)+(n?1:0),3),function(e,t,r,n){var i;for(F(e,t-257,5),F(e,r-1,5),F(e,n-4,4),i=0;i>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(R[r]+h+1)]++,e.dyn_dtree[2*q(t)]++),e.last_lit===e.lit_bufsize-1},r._tr_align=function(e){F(e,f<<1,3),L(e,v,C),function(e){16===e.bi_valid?(N(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}(e)}},{"../utils/common":53}],65:[function(e,t,r){"use strict";t.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],66:[function(e,t,r){var n,i,a=t.exports={};function s(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function u(e){if(n===setTimeout)return setTimeout(e,0);if((n===s||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:s}catch(e){n=s}try{i="function"==typeof clearTimeout?clearTimeout:o}catch(e){i=o}}();var c,f=[],d=!1,l=-1;function h(){d&&c&&(d=!1,c.length?f=c.concat(f):l=-1,f.length&&p())}function p(){if(!d){var e=u(h);d=!0;for(var t=f.length;t;){for(c=f,f=[];++l1)for(var r=1;r0;){this._ensureByte();var r=8-this.bitOffset;if(e>=r)t<<=r,t|=n[r]&this.curByte,this.hasByte=!1,this.bitOffset=0,e-=r;else{t<<=e;var i=r-e;t|=(this.curByte&n[e]<>i,this.bitOffset+=e,e=0}}return t},i.prototype.seek=function(e){var t=e%8,r=(e-t)/8;this.bitOffset=t,this.stream.seek(r),this.hasByte=!1},i.prototype.pi=function(){var e,t=new Uint8Array(6);for(e=0;e("00"+e.toString(16)).slice(-2)).join("")}(t)},t.exports=i},{}],68:[function(e,t,r){"use strict";var n;t.exports=(n=new Uint32Array([0,79764919,159529838,222504665,319059676,398814059,445009330,507990021,638119352,583659535,797628118,726387553,890018660,835552979,1015980042,944750013,1276238704,1221641927,1167319070,1095957929,1595256236,1540665371,1452775106,1381403509,1780037320,1859660671,1671105958,1733955601,2031960084,2111593891,1889500026,1952343757,2552477408,2632100695,2443283854,2506133561,2334638140,2414271883,2191915858,2254759653,3190512472,3135915759,3081330742,3009969537,2905550212,2850959411,2762807018,2691435357,3560074640,3505614887,3719321342,3648080713,3342211916,3287746299,3467911202,3396681109,4063920168,4143685023,4223187782,4286162673,3779000052,3858754371,3904687514,3967668269,881225847,809987520,1023691545,969234094,662832811,591600412,771767749,717299826,311336399,374308984,453813921,533576470,25881363,88864420,134795389,214552010,2023205639,2086057648,1897238633,1976864222,1804852699,1867694188,1645340341,1724971778,1587496639,1516133128,1461550545,1406951526,1302016099,1230646740,1142491917,1087903418,2896545431,2825181984,2770861561,2716262478,3215044683,3143675388,3055782693,3001194130,2326604591,2389456536,2200899649,2280525302,2578013683,2640855108,2418763421,2498394922,3769900519,3832873040,3912640137,3992402750,4088425275,4151408268,4197601365,4277358050,3334271071,3263032808,3476998961,3422541446,3585640067,3514407732,3694837229,3640369242,1762451694,1842216281,1619975040,1682949687,2047383090,2127137669,1938468188,2001449195,1325665622,1271206113,1183200824,1111960463,1543535498,1489069629,1434599652,1363369299,622672798,568075817,748617968,677256519,907627842,853037301,1067152940,995781531,51762726,131386257,177728840,240578815,269590778,349224269,429104020,491947555,4046411278,4126034873,4172115296,4234965207,3794477266,3874110821,3953728444,4016571915,3609705398,3555108353,3735388376,3664026991,3290680682,3236090077,3449943556,3378572211,3174993278,3120533705,3032266256,2961025959,2923101090,2868635157,2813903052,2742672763,2604032198,2683796849,2461293480,2524268063,2284983834,2364738477,2175806836,2238787779,1569362073,1498123566,1409854455,1355396672,1317987909,1246755826,1192025387,1137557660,2072149281,2135122070,1912620623,1992383480,1753615357,1816598090,1627664531,1707420964,295390185,358241886,404320391,483945776,43990325,106832002,186451547,266083308,932423249,861060070,1041341759,986742920,613929101,542559546,756411363,701822548,3316196985,3244833742,3425377559,3370778784,3601682597,3530312978,3744426955,3689838204,3819031489,3881883254,3928223919,4007849240,4037393693,4100235434,4180117107,4259748804,2310601993,2373574846,2151335527,2231098320,2596047829,2659030626,2470359227,2550115596,2947551409,2876312838,2788305887,2733848168,3165939309,3094707162,3040238851,2985771188]),function(){var e=4294967295;this.getCRC=function(){return~e>>>0},this.updateCRC=function(t){e=e<<8^n[255&(e>>>24^t)]},this.updateCRCRun=function(t,r){for(;r-- >0;)e=e<<8^n[255&(e>>>24^t)]}})},{}],69:[function(e,t,r){"use strict";var n=e("./bitreader"),i=e("./stream"),a=e("./crc32"),s=function(e,t){var r,n=e[t];for(r=t;r>0;r--)e[r]=e[r-1];return e[0]=n,n},o={OK:0,LAST_BLOCK:-1,NOT_BZIP_DATA:-2,UNEXPECTED_INPUT_EOF:-3,UNEXPECTED_OUTPUT_EOF:-4,DATA_ERROR:-5,OUT_OF_MEMORY:-6,OBSOLETE_INPUT:-7,END_OF_BLOCK:-8},u={};u[o.LAST_BLOCK]="Bad file checksum",u[o.NOT_BZIP_DATA]="Not bzip data",u[o.UNEXPECTED_INPUT_EOF]="Unexpected input EOF",u[o.UNEXPECTED_OUTPUT_EOF]="Unexpected output EOF",u[o.DATA_ERROR]="Data error",u[o.OUT_OF_MEMORY]="Out of memory",u[o.OBSOLETE_INPUT]="Obsolete (pre 0.9.5) bzip format not supported.";var c=function(e,t){var r=u[e]||"unknown error";t&&(r+=": "+t);var n=new TypeError(r);throw n.errorCode=e,n},f=function(e,t){this.writePos=this.writeCurrent=this.writeCount=0,this._start_bunzip(e,t)};f.prototype._init_block=function(){return this._get_next_block()?(this.blockCRC=new a,!0):(this.writeCount=-1,!1)},f.prototype._start_bunzip=function(e,t){var r=new Uint8Array(4);4===e.read(r,0,4)&&"BZh"===String.fromCharCode(r[0],r[1],r[2])||c(o.NOT_BZIP_DATA,"bad magic");var i=r[3]-48;(i<1||i>9)&&c(o.NOT_BZIP_DATA,"level out of range"),this.reader=new n(e),this.dbufSize=1e5*i,this.nextoutput=0,this.outputStream=t,this.streamCRC=0},f.prototype._get_next_block=function(){var e,t,r,n=this.reader,i=n.pi();if("177245385090"===i)return!1;"314159265359"!==i&&c(o.NOT_BZIP_DATA),this.targetBlockCRC=n.read(32)>>>0,this.streamCRC=(this.targetBlockCRC^(this.streamCRC<<1|this.streamCRC>>>31))>>>0,n.read(1)&&c(o.OBSOLETE_INPUT);var a=n.read(24);a>this.dbufSize&&c(o.DATA_ERROR,"initial position out of bounds");var u=n.read(16),f=new Uint8Array(256),d=0;for(e=0;e<16;e++)if(u&1<<15-e){var l=16*e;for(r=n.read(16),t=0;t<16;t++)r&1<<15-t&&(f[d++]=l+t)}var h=n.read(3);(h<2||h>6)&&c(o.DATA_ERROR);var p=n.read(15);0===p&&c(o.DATA_ERROR);var y=new Uint8Array(256);for(e=0;e=h&&c(o.DATA_ERROR);b[e]=s(y,t)}var m,g=d+2,w=[];for(t=0;t20)&&c(o.DATA_ERROR),n.read(1);)n.read(1)?u--:u++;k[e]=u}for(_=v=k[0],e=1;ev?v=k[e]:k[e]<_&&(_=k[e]);m={},w.push(m),m.permute=new Uint16Array(258),m.limit=new Uint32Array(22),m.base=new Uint32Array(21),m.minLen=_,m.maxLen=v;var S=0;for(e=_;e<=v;e++)for(A[e]=m.limit[e]=0,u=0;u=p&&c(o.DATA_ERROR),m=w[b[C++]]),e=m.minLen,t=n.read(e);e>m.maxLen&&c(o.DATA_ERROR),!(t<=m.limit[e]);e++)t=t<<1|n.read(1);((t-=m.base[e])<0||t>=258)&&c(o.DATA_ERROR);var U=m.permute[t];if(0!==U&&1!==U){if(x)for(x=0,M+u>this.dbufSize&&c(o.DATA_ERROR),E[P=f[y[0]]]+=u;u--;)K[M++]=P;if(U>d)break;M>=this.dbufSize&&c(o.DATA_ERROR),E[P=f[P=s(y,e=U-1)]]++,K[M++]=P}else x||(x=1,u=0),u+=0===U?x:2*x,x<<=1}for((a<0||a>=M)&&c(o.DATA_ERROR),t=0,e=0;e<256;e++)r=t+E[e],E[e]=t,t=r;for(e=0;e>=8,j=-1),this.writePos=R,this.writeCurrent=B,this.writeCount=M,this.writeRun=j,!0},f.prototype._read_bunzip=function(e,t){var r,n,i;if(this.writeCount<0)return 0;for(var a=this.dbuf,s=this.writePos,u=this.writeCurrent,f=this.writeCount,d=(this.outputsize,this.writeRun);f;){for(f--,n=u,u=255&(s=a[s]),s>>=8,3==d++?(r=u,i=n,u=-1):(r=1,i=u),this.blockCRC.updateCRCRun(i,r);r--;)this.outputStream.writeByte(i),this.nextoutput++;u!=n&&(d=0)}return this.writeCount=f,this.blockCRC.getCRC()!==this.targetBlockCRC&&c(o.DATA_ERROR,"Bad block CRC (got "+this.blockCRC.getCRC().toString(16)+" expected "+this.targetBlockCRC.toString(16)+")"),this.nextoutput};var d=function(e){if("readByte"in e)return e;var t=new i;return t.pos=0,t.readByte=function(){return e[this.pos++]},t.seek=function(e){this.pos=e},t.eof=function(){return this.pos>=e.length},t},l=function(e){var t=new i,r=!0;if(e)if("number"==typeof e)t.buffer=new Uint8Array(e),r=!1;else{if("writeByte"in e)return e;t.buffer=e,r=!1}else t.buffer=new Uint8Array(16384);return t.pos=0,t.writeByte=function(e){if(r&&this.pos>=this.buffer.length){var t=new Uint8Array(2*this.buffer.length);t.set(this.buffer),this.buffer=t}this.buffer[this.pos++]=e},t.getBuffer=function(){if(this.pos!==this.buffer.length){if(!r)throw new TypeError("outputsize does not match decoded input");var e=new Uint8Array(this.pos);e.set(this.buffer.subarray(0,this.pos)),this.buffer=e}return this.buffer},t._coerced=!0,t};f.Err=o,f.decode=function(e,t,r){for(var n=d(e),i=l(t),a=new f(n,i);!("eof"in n&&n.eof());)if(a._init_block())a._read_bunzip();else{var s=a.reader.read(32)>>>0;if(s!==a.streamCRC&&c(o.DATA_ERROR,"Bad stream CRC (got "+a.streamCRC.toString(16)+" expected "+s.toString(16)+")"),!(r&&"eof"in n)||n.eof())break;a._start_bunzip(n,i)}if("getBuffer"in i)return i.getBuffer()},f.decodeBlock=function(e,t,r){var n=d(e),i=l(r),s=new f(n,i);if(s.reader.seek(t),s._get_next_block()&&(s.blockCRC=new a,s.writeCopies=0,s._read_bunzip()),"getBuffer"in i)return i.getBuffer()},f.table=function(e,t,r){var n=new i;n.delegate=d(e),n.pos=0,n.readByte=function(){return this.pos++,this.delegate.readByte()},n.delegate.eof&&(n.eof=n.delegate.eof.bind(n.delegate));var a=new i;a.pos=0,a.writeByte=function(){this.pos++};for(var s=new f(n,a),o=s.dbufSize;!("eof"in n&&n.eof());){var u=8*n.pos+s.reader.bitOffset;if(s.reader.hasByte&&(u-=8),s._init_block()){var c=a.pos;s._read_bunzip(),t(u,a.pos-c)}else{s.reader.read(32);if(!(r&&"eof"in n)||n.eof())break;s._start_bunzip(n,a),console.assert(s.dbufSize===o,"shouldn't change block size within multistream file")}}},f.Stream=i,t.exports=f},{"./bitreader":67,"./crc32":68,"./stream":70}],70:[function(e,t,r){"use strict";var n=function(){};n.prototype.readByte=function(){throw new Error("abstract method readByte() not implemented")},n.prototype.read=function(e,t,r){for(var n=0;n>6*r)+i];r>0;){var u=t>>6*(r-1);s.push(128|63&u),r-=1}return s}}f.prototype={decode:function(e,t){var r;r="object"==typeof e&&e instanceof ArrayBuffer?new Uint8Array(e):"object"==typeof e&&"buffer"in e&&e.buffer instanceof ArrayBuffer?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(0),t=i(t),this._streaming||(this._decoder=new l({fatal:this._fatal}),this._BOMseen=!1),this._streaming=Boolean(t.stream);for(var n,a=new s(r),u=[];!a.endOfStream()&&(n=this._decoder.handler(a,a.read()))!==o;)null!==n&&(Array.isArray(n)?u.push.apply(u,n):u.push(n));if(!this._streaming){do{if((n=this._decoder.handler(a,a.read()))===o)break;null!==n&&(Array.isArray(n)?u.push.apply(u,n):u.push(n))}while(!a.endOfStream());this._decoder=null}return u.length&&(-1===["utf-8"].indexOf(this.encoding)||this._ignoreBOM||this._BOMseen||(65279===u[0]?(this._BOMseen=!0,u.shift()):this._BOMseen=!0)),function(e){for(var t="",r=0;r>10),56320+(1023&n)))}return t}(u)}},d.prototype={encode:function(e,t){e=e?String(e):"",t=i(t),this._streaming||(this._encoder=new h(this._options)),this._streaming=Boolean(t.stream);for(var r,n=[],a=new s(function(e){for(var t=String(e),r=t.length,n=0,i=[];n57343)i.push(a);else if(56320<=a&&a<=57343)i.push(65533);else if(55296<=a&&a<=56319)if(n===r-1)i.push(65533);else{var s=e.charCodeAt(n+1);if(56320<=s&&s<=57343){var o=1023&a,u=1023&s;i.push(65536+(o<<10)+u),n+=1}else i.push(65533)}n+=1}return i}(e));!a.endOfStream()&&(r=this._encoder.handler(a,a.read()))!==o;)Array.isArray(r)?n.push.apply(n,r):n.push(r);if(!this._streaming){for(;(r=this._encoder.handler(a,a.read()))!==o;)Array.isArray(r)?n.push.apply(n,r):n.push(r);this._encoder=null}return new Uint8Array(n)}},r.TextEncoder=d,r.TextDecoder=f},{}],72:[function(e,t,r){!function(t){"use strict";var r=function(e){var t,r=new Float64Array(16);if(e)for(t=0;t>>8)-1}(e,t,r,n,32)}function p(e,t){var r;for(r=0;r<16;r++)e[r]=0|t[r]}function y(e){var t,r,n=1;for(t=0;t<16;t++)r=e[t]+n+65535,n=Math.floor(r/65536),e[t]=r-65536*n;e[0]+=n-1+37*(n-1)}function b(e,t,r){for(var n,i=~(r-1),a=0;a<16;a++)n=i&(e[a]^t[a]),e[a]^=n,t[a]^=n}function m(e,t){var n,i,a,s=r(),o=r();for(n=0;n<16;n++)o[n]=t[n];for(y(o),y(o),y(o),i=0;i<2;i++){for(s[0]=o[0]-65517,n=1;n<15;n++)s[n]=o[n]-65535-(s[n-1]>>16&1),s[n-1]&=65535;s[15]=o[15]-32767-(s[14]>>16&1),a=s[15]>>16&1,s[14]&=65535,b(o,s,1-a)}for(n=0;n<16;n++)e[2*n]=255&o[n],e[2*n+1]=o[n]>>8}function g(e,t){var r=new Uint8Array(32),n=new Uint8Array(32);return m(r,e),m(n,t),h(r,0,n,0)}function w(e){var t=new Uint8Array(32);return m(t,e),1&t[0]}function _(e,t){var r;for(r=0;r<16;r++)e[r]=t[2*r]+(t[2*r+1]<<8);e[15]&=32767}function v(e,t,r){for(var n=0;n<16;n++)e[n]=t[n]+r[n]}function k(e,t,r){for(var n=0;n<16;n++)e[n]=t[n]-r[n]}function A(e,t,r){var n,i,a=0,s=0,o=0,u=0,c=0,f=0,d=0,l=0,h=0,p=0,y=0,b=0,m=0,g=0,w=0,_=0,v=0,k=0,A=0,S=0,E=0,P=0,x=0,M=0,C=0,K=0,U=0,R=0,B=0,j=0,T=0,I=r[0],O=r[1],z=r[2],D=r[3],q=r[4],N=r[5],F=r[6],L=r[7],H=r[8],W=r[9],G=r[10],Z=r[11],V=r[12],Y=r[13],$=r[14],J=r[15];a+=(n=t[0])*I,s+=n*O,o+=n*z,u+=n*D,c+=n*q,f+=n*N,d+=n*F,l+=n*L,h+=n*H,p+=n*W,y+=n*G,b+=n*Z,m+=n*V,g+=n*Y,w+=n*$,_+=n*J,s+=(n=t[1])*I,o+=n*O,u+=n*z,c+=n*D,f+=n*q,d+=n*N,l+=n*F,h+=n*L,p+=n*H,y+=n*W,b+=n*G,m+=n*Z,g+=n*V,w+=n*Y,_+=n*$,v+=n*J,o+=(n=t[2])*I,u+=n*O,c+=n*z,f+=n*D,d+=n*q,l+=n*N,h+=n*F,p+=n*L,y+=n*H,b+=n*W,m+=n*G,g+=n*Z,w+=n*V,_+=n*Y,v+=n*$,k+=n*J,u+=(n=t[3])*I,c+=n*O,f+=n*z,d+=n*D,l+=n*q,h+=n*N,p+=n*F,y+=n*L,b+=n*H,m+=n*W,g+=n*G,w+=n*Z,_+=n*V,v+=n*Y,k+=n*$,A+=n*J,c+=(n=t[4])*I,f+=n*O,d+=n*z,l+=n*D,h+=n*q,p+=n*N,y+=n*F,b+=n*L,m+=n*H,g+=n*W,w+=n*G,_+=n*Z,v+=n*V,k+=n*Y,A+=n*$,S+=n*J,f+=(n=t[5])*I,d+=n*O,l+=n*z,h+=n*D,p+=n*q,y+=n*N,b+=n*F,m+=n*L,g+=n*H,w+=n*W,_+=n*G,v+=n*Z,k+=n*V,A+=n*Y,S+=n*$,E+=n*J,d+=(n=t[6])*I,l+=n*O,h+=n*z,p+=n*D,y+=n*q,b+=n*N,m+=n*F,g+=n*L,w+=n*H,_+=n*W,v+=n*G,k+=n*Z,A+=n*V,S+=n*Y,E+=n*$,P+=n*J,l+=(n=t[7])*I,h+=n*O,p+=n*z,y+=n*D,b+=n*q,m+=n*N,g+=n*F,w+=n*L,_+=n*H,v+=n*W,k+=n*G,A+=n*Z,S+=n*V,E+=n*Y,P+=n*$,x+=n*J,h+=(n=t[8])*I,p+=n*O,y+=n*z,b+=n*D,m+=n*q,g+=n*N,w+=n*F,_+=n*L,v+=n*H,k+=n*W,A+=n*G,S+=n*Z,E+=n*V,P+=n*Y,x+=n*$,M+=n*J,p+=(n=t[9])*I,y+=n*O,b+=n*z,m+=n*D,g+=n*q,w+=n*N,_+=n*F,v+=n*L,k+=n*H,A+=n*W,S+=n*G,E+=n*Z,P+=n*V,x+=n*Y,M+=n*$,C+=n*J,y+=(n=t[10])*I,b+=n*O,m+=n*z,g+=n*D,w+=n*q,_+=n*N,v+=n*F,k+=n*L,A+=n*H,S+=n*W,E+=n*G,P+=n*Z,x+=n*V,M+=n*Y,C+=n*$,K+=n*J,b+=(n=t[11])*I,m+=n*O,g+=n*z,w+=n*D,_+=n*q,v+=n*N,k+=n*F,A+=n*L,S+=n*H,E+=n*W,P+=n*G,x+=n*Z,M+=n*V,C+=n*Y,K+=n*$,U+=n*J,m+=(n=t[12])*I,g+=n*O,w+=n*z,_+=n*D,v+=n*q,k+=n*N,A+=n*F,S+=n*L,E+=n*H,P+=n*W,x+=n*G,M+=n*Z,C+=n*V,K+=n*Y,U+=n*$,R+=n*J,g+=(n=t[13])*I,w+=n*O,_+=n*z,v+=n*D,k+=n*q,A+=n*N,S+=n*F,E+=n*L,P+=n*H,x+=n*W,M+=n*G,C+=n*Z,K+=n*V,U+=n*Y,R+=n*$,B+=n*J,w+=(n=t[14])*I,_+=n*O,v+=n*z,k+=n*D,A+=n*q,S+=n*N,E+=n*F,P+=n*L,x+=n*H,M+=n*W,C+=n*G,K+=n*Z,U+=n*V,R+=n*Y,B+=n*$,j+=n*J,_+=(n=t[15])*I,s+=38*(k+=n*z),o+=38*(A+=n*D),u+=38*(S+=n*q),c+=38*(E+=n*N),f+=38*(P+=n*F),d+=38*(x+=n*L),l+=38*(M+=n*H),h+=38*(C+=n*W),p+=38*(K+=n*G),y+=38*(U+=n*Z),b+=38*(R+=n*V),m+=38*(B+=n*Y),g+=38*(j+=n*$),w+=38*(T+=n*J),a=(n=(a+=38*(v+=n*O))+(i=1)+65535)-65536*(i=Math.floor(n/65536)),s=(n=s+i+65535)-65536*(i=Math.floor(n/65536)),o=(n=o+i+65535)-65536*(i=Math.floor(n/65536)),u=(n=u+i+65535)-65536*(i=Math.floor(n/65536)),c=(n=c+i+65535)-65536*(i=Math.floor(n/65536)),f=(n=f+i+65535)-65536*(i=Math.floor(n/65536)),d=(n=d+i+65535)-65536*(i=Math.floor(n/65536)),l=(n=l+i+65535)-65536*(i=Math.floor(n/65536)),h=(n=h+i+65535)-65536*(i=Math.floor(n/65536)),p=(n=p+i+65535)-65536*(i=Math.floor(n/65536)),y=(n=y+i+65535)-65536*(i=Math.floor(n/65536)),b=(n=b+i+65535)-65536*(i=Math.floor(n/65536)),m=(n=m+i+65535)-65536*(i=Math.floor(n/65536)),g=(n=g+i+65535)-65536*(i=Math.floor(n/65536)),w=(n=w+i+65535)-65536*(i=Math.floor(n/65536)),_=(n=_+i+65535)-65536*(i=Math.floor(n/65536)),a=(n=(a+=i-1+37*(i-1))+(i=1)+65535)-65536*(i=Math.floor(n/65536)),s=(n=s+i+65535)-65536*(i=Math.floor(n/65536)),o=(n=o+i+65535)-65536*(i=Math.floor(n/65536)),u=(n=u+i+65535)-65536*(i=Math.floor(n/65536)),c=(n=c+i+65535)-65536*(i=Math.floor(n/65536)),f=(n=f+i+65535)-65536*(i=Math.floor(n/65536)),d=(n=d+i+65535)-65536*(i=Math.floor(n/65536)),l=(n=l+i+65535)-65536*(i=Math.floor(n/65536)),h=(n=h+i+65535)-65536*(i=Math.floor(n/65536)),p=(n=p+i+65535)-65536*(i=Math.floor(n/65536)),y=(n=y+i+65535)-65536*(i=Math.floor(n/65536)),b=(n=b+i+65535)-65536*(i=Math.floor(n/65536)),m=(n=m+i+65535)-65536*(i=Math.floor(n/65536)),g=(n=g+i+65535)-65536*(i=Math.floor(n/65536)),w=(n=w+i+65535)-65536*(i=Math.floor(n/65536)),_=(n=_+i+65535)-65536*(i=Math.floor(n/65536)),a+=i-1+37*(i-1),e[0]=a,e[1]=s,e[2]=o,e[3]=u,e[4]=c,e[5]=f,e[6]=d,e[7]=l,e[8]=h,e[9]=p,e[10]=y,e[11]=b,e[12]=m,e[13]=g,e[14]=w,e[15]=_}function S(e,t){A(e,t,t)}function E(e,t){var n,i=r();for(n=0;n<16;n++)i[n]=t[n];for(n=253;n>=0;n--)S(i,i),2!==n&&4!==n&&A(i,i,t);for(n=0;n<16;n++)e[n]=i[n]}function P(e,t,n){var i,a,s=new Uint8Array(32),u=new Float64Array(80),c=r(),f=r(),d=r(),l=r(),h=r(),p=r();for(a=0;a<31;a++)s[a]=t[a];for(s[31]=127&t[31]|64,s[0]&=248,_(u,n),a=0;a<16;a++)f[a]=u[a],l[a]=c[a]=d[a]=0;for(c[0]=l[0]=1,a=254;a>=0;--a)b(c,f,i=s[a>>>3]>>>(7&a)&1),b(d,l,i),v(h,c,d),k(c,c,d),v(d,f,l),k(f,f,l),S(l,h),S(p,c),A(c,d,c),A(d,f,h),v(h,c,d),k(c,c,d),S(f,c),k(d,l,p),A(c,d,o),v(c,c,l),A(d,d,c),A(c,l,p),A(l,f,u),S(f,h),b(c,f,i),b(d,l,i);for(a=0;a<16;a++)u[a+16]=c[a],u[a+32]=d[a],u[a+48]=f[a],u[a+64]=l[a];var y=u.subarray(32),g=u.subarray(16);return E(y,y),A(g,g,y),m(e,g),0}function x(e,t){return P(e,t,i)}function M(e,t){var n=r(),i=r(),a=r(),s=r(),o=r(),u=r(),f=r(),d=r(),l=r();k(n,e[1],e[0]),k(l,t[1],t[0]),A(n,n,l),v(i,e[0],e[1]),v(l,t[0],t[1]),A(i,i,l),A(a,e[3],t[3]),A(a,a,c),A(s,e[2],t[2]),v(s,s,s),k(o,i,n),k(u,s,a),v(f,s,a),v(d,i,n),A(e[0],o,u),A(e[1],d,f),A(e[2],f,u),A(e[3],o,d)}function C(e,t,r){var n;for(n=0;n<4;n++)b(e[n],t[n],r)}function K(e,t){var n=r(),i=r(),a=r();E(a,t[2]),A(n,t[0],a),A(i,t[1],a),m(e,i),e[31]^=w(n)<<7}function U(e,t,r){var n,i;for(p(e[0],a),p(e[1],s),p(e[2],s),p(e[3],a),i=255;i>=0;--i)C(e,t,n=r[i/8|0]>>(7&i)&1),M(t,e),M(e,e),C(e,t,n)}function R(e,t){var n=[r(),r(),r(),r()];p(n[0],f),p(n[1],d),p(n[2],s),A(n[3],f,d),U(e,n,t)}function B(e,i,a){var s,o,u=[r(),r(),r(),r()];for(a||n(i,32),(s=t.hash(i.subarray(0,32)))[0]&=248,s[31]&=127,s[31]|=64,R(u,s),K(e,u),o=0;o<32;o++)i[o+32]=e[o];return 0}var j=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]);function T(e,t){var r,n,i,a;for(n=63;n>=32;--n){for(r=0,i=n-32,a=n-12;i>8,t[i]-=256*r;t[i]+=r,t[n]=0}for(r=0,i=0;i<32;i++)t[i]+=r-(t[31]>>4)*j[i],r=t[i]>>8,t[i]&=255;for(i=0;i<32;i++)t[i]-=r*j[i];for(n=0;n<32;n++)t[n+1]+=t[n]>>8,e[n]=255&t[n]}function I(e){var t,r=new Float64Array(64);for(t=0;t<64;t++)r[t]=e[t];for(t=0;t<64;t++)e[t]=0;T(e,r)}function O(e,t){var n=r(),i=r(),o=r(),c=r(),f=r(),d=r(),h=r();return p(e[2],s),_(e[1],t),S(o,e[1]),A(c,o,u),k(o,o,e[2]),v(c,e[2],c),S(f,c),S(d,f),A(h,d,f),A(n,h,o),A(n,n,c),function(e,t){var n,i=r();for(n=0;n<16;n++)i[n]=t[n];for(n=250;n>=0;n--)S(i,i),1!==n&&A(i,i,t);for(n=0;n<16;n++)e[n]=i[n]}(n,n),A(n,n,o),A(n,n,c),A(n,n,c),A(e[0],n,c),S(i,e[0]),A(i,i,c),g(i,o)&&A(e[0],e[0],l),S(i,e[0]),A(i,i,c),g(i,o)?-1:(w(e[0])===t[31]>>7&&k(e[0],a,e[0]),A(e[3],e[0],e[1]),0)}function z(){for(var e=0;e=0},t.sign.keyPair=function(){var e=new Uint8Array(32),t=new Uint8Array(64);return B(e,t),{publicKey:e,secretKey:t}},t.sign.keyPair.fromSecretKey=function(e){if(z(e),64!==e.length)throw new Error("bad secret key size");for(var t=new Uint8Array(32),r=0;r{t.enqueue(r),e.pause()}),e.on("end",()=>t.close()),e.on("error",e=>t.error(e))},pull(){e.resume()},cancel(t){if(e.pause(),e.cancel)return e.cancel(t)}})};class e extends o{constructor(e,t){super(t),this._webStream=e,this._reader=s.default.getReader(e),this._reading=!1,this._doneReadingPromise=Promise.resolve(),this._cancelling=!1}_read(e){if(this._reading||this._cancelling)return;this._reading=!0;this._doneReadingPromise=(async()=>{try{for(;;){var e=await this._reader.read();const t=e.done,r=e.value;if(t){this.push(null);break}if(!this.push(r)||this._cancelling){this._reading=!1;break}}}catch(t){this.emit("error",t)}})()}async cancel(e){return this._cancelling=!0,await this._doneReadingPromise,this._reader.releaseLock(),this._webStream.cancel(e)}}r.webToNode=c=function(t){return new e(t)}}r.nodeToWeb=u,r.webToNode=c},{"./streams":75,"./util":76,stream:"stream"}],74:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.externalBuffer=r.Reader=void 0;var n,i=e("./streams"),a=(n=i)&&n.__esModule?n:{default:n};const s=new WeakSet,o=Symbol("externalBuffer");function u(e){this.stream=e,e[o]&&(this[o]=e[o].slice());let t=a.default.isStream(e);if("node"===t&&(e=a.default.nodeToWeb(e)),t){const t=e.getReader();return this._read=t.read.bind(t),void(this._releaseLock=(()=>{t.closed.catch(function(){}),t.releaseLock()}))}let r=!1;this._read=(async()=>r||s.has(e)?{value:void 0,done:!0}:(r=!0,{value:e,done:!1})),this._releaseLock=(()=>{if(r)try{s.add(e)}catch(t){}})}u.prototype.read=async function(){if(this[o]&&this[o].length){return{done:!1,value:this[o].shift()}}return this._read()},u.prototype.releaseLock=function(){this[o]&&(this.stream[o]=this[o]),this._releaseLock()},u.prototype.readLine=async function(){let e,t=[];for(;!e;){var r=await this.read();let n=r.done,i=r.value;if(i+="",n)return t.length?a.default.concat(t):void 0;const s=i.indexOf("\n")+1;s&&(e=a.default.concat(t.concat(i.substr(0,s))),t=[]),s!==i.length&&t.push(i.substr(s))}return this.unshift(...t),e},u.prototype.readByte=async function(){var e=await this.read();const t=e.done,r=e.value;if(t)return;const n=r[0];return this.unshift(a.default.slice(r,1)),n},u.prototype.readBytes=async function(e){const t=[];let r=0;for(;;){var n=await this.read();const i=n.done,s=n.value;if(i)return t.length?a.default.concat(t):void 0;if(t.push(s),(r+=s.length)>=e){const r=a.default.concat(t);return this.unshift(a.default.slice(r,e)),a.default.slice(r,0,e)}}},u.prototype.peekBytes=async function(e){const t=await this.readBytes(e);return this.unshift(t),t},u.prototype.unshift=function(...e){this[o]||(this[o]=[]),this[o].unshift(...e.filter(e=>e&&e.length))},u.prototype.readToEnd=async function(e=a.default.concat){const t=[];for(;;){var r=await this.read();const e=r.done,n=r.value;if(e)break;t.push(n)}return e(t)},r.Reader=u,r.externalBuffer=o},{"./streams":75}],75:[function(e,t,r){(function(t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./util"),i=e("./node-conversions"),a=e("./reader");const s=n.isNode&&e("buffer").Buffer;function o(e){let t=(0,n.isStream)(e);return"node"===t?(0,i.nodeToWeb)(e):t?e:new ReadableStream({start(t){t.enqueue(e),t.close()}})}function u(e){return e.some(n.isStream)?c(e):"string"==typeof e[0]?e.join(""):s&&s.isBuffer(e[0])?s.concat(e):(0,n.concatUint8Array)(e)}function c(e){e=e.map(o);const t=p(async function(e){await Promise.all(n.map(t=>_(t,e)))});let r=Promise.resolve();const n=e.map((n,i)=>b(n,(n,a)=>r=r.then(()=>l(n,t.writable,{preventClose:i!==e.length-1}))));return t.readable}function f(e){return new a.Reader(e)}function d(e){const t=e.getWriter(),r=t.releaseLock;return t.releaseLock=(()=>{t.closed.catch(function(){}),r.call(t)}),t}async function l(e,t,r){e=o(e);try{if(e[a.externalBuffer]){const r=d(t);for(let t=0;t{t=e}),t=null)},close:r.close.bind(r),abort:r.error.bind(r)})}}function y(e,t=(()=>void 0),r=(()=>void 0)){if((0,n.isStream)(e))return h(e,{async transform(e,r){try{const i=await t(e);void 0!==i&&r.enqueue(i)}catch(n){r.error(n)}},async flush(e){try{const n=await r();void 0!==n&&e.enqueue(n)}catch(t){e.error(t)}}});const i=t(e),a=r();return void 0!==i&&void 0!==a?u([i,a]):void 0!==i?i:a}function b(e,t){let r;const n=new TransformStream({start(e){r=e}}),i=l(e,n.writable),a=p(async function(){r.error(new Error("Readable side was canceled.")),await i,await new Promise(setTimeout)});return t(n.readable,a.writable),a.readable}function m(e,t){Object.entries(Object.getOwnPropertyDescriptors(ReadableStream.prototype)).forEach(([r,n])=>{"constructor"!==r&&(n.value?n.value=n.value.bind(t):n.get=n.get.bind(t),Object.defineProperty(e,r,n))})}function g(e,t=0,r=1/0){if((0,n.isStream)(e)){if(t>=0&&r>=0){let n=0;return h(e,{transform(e,i){n=t&&i.enqueue(g(e,Math.max(t-n,0),r-n)),n+=e.length):i.terminate()}})}if(t<0&&(r<0||r===1/0)){let n=[];return y(e,e=>{e.length>=-t?n=[e]:n.push(e)},()=>g(u(n),t,r))}if(0===t&&r<0){let n;return y(e,e=>{const i=n?u([n,e]):e;if(i.length>=-r)return n=g(i,r),g(i,t,r);n=i})}return console.warn(`stream.slice(input, ${t}, ${r}) not implemented efficiently.`),v(async()=>g(await w(e),t,r))}return e[a.externalBuffer]&&(e=u(e[a.externalBuffer].concat([e]))),!(0,n.isUint8Array)(e)||s&&s.isBuffer(e)?e.slice(t,r):(r===1/0&&(r=e.length),e.subarray(t,r))}async function w(e,t){return(0,n.isStream)(e)?f(e).readToEnd(t):e}async function _(e,t){if((0,n.isStream)(e)&&e.cancel)return e.cancel(t)}function v(e){return new ReadableStream({pull:async t=>{try{t.enqueue(await e()),t.close()}catch(r){t.error(r)}}})}r.default={isStream:n.isStream,isUint8Array:n.isUint8Array,toStream:o,concatUint8Array:n.concatUint8Array,concatStream:c,concat:u,getReader:f,getWriter:d,pipe:l,transformRaw:h,transform:y,transformPair:b,parse:function(e,t){let r;const n=b(e,(e,i)=>{const a=f(e);a.remainder=(()=>(a.releaseLock(),l(e,i),n)),r=t(a)});return r},clone:function(e){if((0,n.isStream)(e)){const t=function(e){if((0,n.isStream)(e)){const t=o(e).tee();return t[0][a.externalBuffer]=t[1][a.externalBuffer]=e[a.externalBuffer],t}return[g(e),g(e)]}(e);return m(e,t[0]),t[1]}return g(e)},passiveClone:function(e){return(0,n.isStream)(e)?new ReadableStream({start(t){const r=b(e,async(e,r)=>{const n=f(e),i=d(r);try{for(;;){await i.ready;var a=await n.read();const e=a.done,r=a.value;if(e){try{t.close()}catch(s){}return void(await i.close())}try{t.enqueue(r)}catch(s){}await i.write(r)}}catch(s){t.error(s),await i.abort(s)}});m(e,r)}}):g(e)},slice:g,readToEnd:w,cancel:_,fromAsync:v,nodeToWeb:i.nodeToWeb,webToNode:i.webToNode}}).call(this,e("_process"))},{"./node-conversions":73,"./reader":74,"./util":76,_process:66,buffer:"buffer"}],76:[function(e,t,r){(function(t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});const n="object"==typeof t.process&&"object"==typeof t.process.versions,i=n&&e("stream").Readable;function a(e){return Uint8Array.prototype.isPrototypeOf(e)}r.isNode=n,r.isStream=function(e){return ReadableStream.prototype.isPrototypeOf(e)?"web":!(!i||!i.prototype.isPrototypeOf(e))&&"node"},r.isUint8Array=a,r.concatUint8Array=function(e){if(1===e.length)return e[0];let t=0;for(let i=0;it=>e.hashAlgorithm===t;for(let n=0;n=0;--n)for(let e=f-1;e>=0;--e)d[1]=f*n+(e+1),l[0]=u[0]^d[0],l[1]=u[1]^d[1],l[2]=c[2*e],l[3]=c[2*e+1],u=(l=s(r.decrypt(o(l)))).subarray(0,2),c[2*e]=l[2],c[2*e+1]=l[3];if(u[0]===i[0]&&u[1]===i[1])return o(c);throw new Error("Key Data Integrity failed")}}},{"../util":158,"./cipher":86}],81:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("asmcrypto.js/dist_es5/aes/cfb"),i=u(e("web-stream-tools")),a=u(e("./cipher")),s=u(e("../config")),o=u(e("../util"));function u(e){return e&&e.__esModule?e:{default:e}}const c=o.default.getWebCrypto(),f=o.default.getNodeCrypto(),d=o.default.getNodeBuffer(),l=f?f.getCiphers():[],h={idea:l.includes("idea-cfb")?"idea-cfb":void 0,"3des":l.includes("des-ede3-cfb")?"des-ede3-cfb":void 0,tripledes:l.includes("des-ede3-cfb")?"des-ede3-cfb":void 0,cast5:l.includes("cast5-cfb")?"cast5-cfb":void 0,blowfish:l.includes("bf-cfb")?"bf-cfb":void 0,aes128:l.includes("aes-128-cfb")?"aes-128-cfb":void 0,aes192:l.includes("aes-192-cfb")?"aes-192-cfb":void 0,aes256:l.includes("aes-256-cfb")?"aes-256-cfb":void 0};r.default={encrypt:function(e,t,r,u){if(o.default.getNodeCrypto()&&h[e])return function(e,t,r,n){t=d.from(t),n=d.from(n);const a=new f.createCipheriv(h[e],t,n);return i.default.transform(r,e=>new Uint8Array(a.update(d.from(e))))}(e,t,r,u);if("aes"===e.substr(0,3))return function(e,t,r,u){if(o.default.getWebCrypto()&&24!==t.length&&!o.default.isStream(r)&&r.length>=3e3*s.default.min_bytes_for_web_crypto)return async function(e,t,r,n){const i=await c.importKey("raw",t,{name:"AES-CBC"},!1,["encrypt"]),s=a.default[e].blockSize,u=o.default.concatUint8Array([new Uint8Array(s),r]),f=new Uint8Array(await c.encrypt({name:"AES-CBC",iv:n},i,u)).subarray(0,r.length);return function(e,t){for(let r=0;rf.AES_Encrypt_process(e),()=>f.AES_Encrypt_finish())}(e,t,r,u);const l=new a.default[e](t),p=l.blockSize,y=u.slice();let b=new Uint8Array;const m=e=>{e&&(b=o.default.concatUint8Array([b,e]));const t=new Uint8Array(b.length);let r,n=0;for(;e?b.length>=p:b.length;){const e=l.encrypt(y);for(r=0;rnew Uint8Array(a.update(d.from(e))))}(e,t,r,s);if("aes"===e.substr(0,3))return function(e,t,r,a){if(o.default.isStream(r)){const e=new n.AES_CFB(t,a);return i.default.transform(r,t=>e.AES_Decrypt_process(t),()=>e.AES_Decrypt_finish())}return n.AES_CFB.decrypt(r,t,a)}(0,t,r,s);const u=new a.default[e](t),c=u.blockSize;let l=s,p=new Uint8Array;const y=e=>{e&&(p=o.default.concatUint8Array([p,e]));const t=new Uint8Array(p.length);let r,n=0;for(;e?p.length>=c:p.length;){const e=u.encrypt(l);for(l=p,r=0;r>>=8),i=255&(e>>>=8),a=255&(e>>>=8);return t=this.sboxes[0][a]+this.sboxes[1][i],t^=this.sboxes[2][n],t+=this.sboxes[3][r]},n.prototype._encrypt_block=function(e){let t,r=e[0],n=e[1];for(t=0;t>>24-8*t&255,i[t+n]=r[1]>>>24-8*t&255;return i},n.prototype._decrypt_block=function(e){let t,r=e[0],n=e[1];for(t=this.NN+1;t>1;--t){const e=r^=this.parray[t];r=n=this._F(r)^n,n=e}r^=this.parray[1],n^=this.parray[0],e[0]=this._clean(n),e[1]=this._clean(r)},n.prototype.init=function(e){let t,r=0;for(this.parray=[],t=0;t=e.length&&(r=0);this.parray[t]=this.PARRAY[t]^n}for(this.sboxes=[],t=0;t<4;++t)for(this.sboxes[t]=[],r=0;r<256;++r)this.sboxes[t][r]=this.SBOXES[t][r];const n=[0,0];for(t=0;t>>24&255,t[a+1]=u>>>16&255,t[a+2]=u>>>8&255,t[a+3]=255&u,t[a+4]=o>>>24&255,t[a+5]=o>>>16&255,t[a+6]=o>>>8&255,t[a+7]=255&o}return t},this.decrypt=function(e){const t=new Array(e.length);for(let a=0;a>>24&255,t[a+1]=u>>>16&255,t[a+2]=u>>>8&255,t[a+3]=255&u,t[a+4]=o>>>24&255,t[a+5]=o>>16&255,t[a+6]=o>>8&255,t[a+7]=255&o}return t};const e=new Array(4);e[0]=new Array(4),e[0][0]=[4,0,13,15,12,14,8],e[0][1]=[5,2,16,18,17,19,10],e[0][2]=[6,3,23,22,21,20,9],e[0][3]=[7,1,26,25,27,24,11],e[1]=new Array(4),e[1][0]=[0,6,21,23,20,22,16],e[1][1]=[1,4,0,2,1,3,18],e[1][2]=[2,5,7,6,5,4,17],e[1][3]=[3,7,10,9,11,8,19],e[2]=new Array(4),e[2][0]=[4,0,13,15,12,14,8],e[2][1]=[5,2,16,18,17,19,10],e[2][2]=[6,3,23,22,21,20,9],e[2][3]=[7,1,26,25,27,24,11],e[3]=new Array(4),e[3][0]=[0,6,21,23,20,22,16],e[3][1]=[1,4,0,2,1,3,18],e[3][2]=[2,5,7,6,5,4,17],e[3][3]=[3,7,10,9,11,8,19];const t=new Array(4);function r(e,t,r){const n=t+e,i=n<>>32-r;return(a[0][i>>>24]^a[1][i>>>16&255])-a[2][i>>>8&255]+a[3][255&i]}function n(e,t,r){const n=t^e,i=n<>>32-r;return a[0][i>>>24]-a[1][i>>>16&255]+a[2][i>>>8&255]^a[3][255&i]}function i(e,t,r){const n=t-e,i=n<>>32-r;return(a[0][i>>>24]+a[1][i>>>16&255]^a[2][i>>>8&255])-a[3][255&i]}t[0]=new Array(4),t[0][0]=[24,25,23,22,18],t[0][1]=[26,27,21,20,22],t[0][2]=[28,29,19,18,25],t[0][3]=[30,31,17,16,28],t[1]=new Array(4),t[1][0]=[3,2,12,13,8],t[1][1]=[1,0,14,15,13],t[1][2]=[7,6,8,9,3],t[1][3]=[5,4,10,11,7],t[2]=new Array(4),t[2][0]=[19,18,28,29,25],t[2][1]=[17,16,30,31,28],t[2][2]=[23,22,24,25,18],t[2][3]=[21,20,26,27,22],t[3]=new Array(4),t[3][0]=[8,9,7,6,3],t[3][1]=[10,11,5,4,7],t[3][2]=[12,13,3,2,8],t[3][3]=[14,15,1,0,13],this.keySchedule=function(r){const n=new Array(8),i=new Array(32);let s;for(let e=0;e<4;e++)s=4*e,n[e]=r[s]<<24|r[s+1]<<16|r[s+2]<<8|r[s+3];const o=[6,7,4,5];let u,c=0;for(let f=0;f<2;f++)for(let r=0;r<4;r++){for(s=0;s<4;s++){const t=e[r][s];u=n[t[1]],u^=a[4][n[t[2]>>>2]>>>24-8*(3&t[2])&255],u^=a[5][n[t[3]>>>2]>>>24-8*(3&t[3])&255],u^=a[6][n[t[4]>>>2]>>>24-8*(3&t[4])&255],u^=a[7][n[t[5]>>>2]>>>24-8*(3&t[5])&255],u^=a[o[s]][n[t[6]>>>2]>>>24-8*(3&t[6])&255],n[t[0]]=u}for(s=0;s<4;s++){const e=t[r][s];u=a[4][n[e[0]>>>2]>>>24-8*(3&e[0])&255],u^=a[5][n[e[1]>>>2]>>>24-8*(3&e[1])&255],u^=a[6][n[e[2]>>>2]>>>24-8*(3&e[2])&255],u^=a[7][n[e[3]>>>2]>>>24-8*(3&e[3])&255],u^=a[4+s][n[e[4]>>>2]>>>24-8*(3&e[4])&255],i[c]=u,c++}}for(let e=0;e<16;e++)this.masking[e]=i[e],this.rotate[e]=31&i[16+e]};const a=new Array(8);a[0]=[821772500,2678128395,1810681135,1059425402,505495343,2617265619,1610868032,3483355465,3218386727,2294005173,3791863952,2563806837,1852023008,365126098,3269944861,584384398,677919599,3229601881,4280515016,2002735330,1136869587,3744433750,2289869850,2731719981,2714362070,879511577,1639411079,575934255,717107937,2857637483,576097850,2731753936,1725645e3,2810460463,5111599,767152862,2543075244,1251459544,1383482551,3052681127,3089939183,3612463449,1878520045,1510570527,2189125840,2431448366,582008916,3163445557,1265446783,1354458274,3529918736,3202711853,3073581712,3912963487,3029263377,1275016285,4249207360,2905708351,3304509486,1442611557,3585198765,2712415662,2731849581,3248163920,2283946226,208555832,2766454743,1331405426,1447828783,3315356441,3108627284,2957404670,2981538698,3339933917,1669711173,286233437,1465092821,1782121619,3862771680,710211251,980974943,1651941557,430374111,2051154026,704238805,4128970897,3144820574,2857402727,948965521,3333752299,2227686284,718756367,2269778983,2731643755,718440111,2857816721,3616097120,1113355533,2478022182,410092745,1811985197,1944238868,2696854588,1415722873,1682284203,1060277122,1998114690,1503841958,82706478,2315155686,1068173648,845149890,2167947013,1768146376,1993038550,3566826697,3390574031,940016341,3355073782,2328040721,904371731,1205506512,4094660742,2816623006,825647681,85914773,2857843460,1249926541,1417871568,3287612,3211054559,3126306446,1975924523,1353700161,2814456437,2438597621,1800716203,722146342,2873936343,1151126914,4160483941,2877670899,458611604,2866078500,3483680063,770352098,2652916994,3367839148,3940505011,3585973912,3809620402,718646636,2504206814,2914927912,3631288169,2857486607,2860018678,575749918,2857478043,718488780,2069512688,3548183469,453416197,1106044049,3032691430,52586708,3378514636,3459808877,3211506028,1785789304,218356169,3571399134,3759170522,1194783844,1523787992,3007827094,1975193539,2555452411,1341901877,3045838698,3776907964,3217423946,2802510864,2889438986,1057244207,1636348243,3761863214,1462225785,2632663439,481089165,718503062,24497053,3332243209,3344655856,3655024856,3960371065,1195698900,2971415156,3710176158,2115785917,4027663609,3525578417,2524296189,2745972565,3564906415,1372086093,1452307862,2780501478,1476592880,3389271281,18495466,2378148571,901398090,891748256,3279637769,3157290713,2560960102,1447622437,4284372637,216884176,2086908623,1879786977,3588903153,2242455666,2938092967,3559082096,2810645491,758861177,1121993112,215018983,642190776,4169236812,1196255959,2081185372,3508738393,941322904,4124243163,2877523539,1848581667,2205260958,3180453958,2589345134,3694731276,550028657,2519456284,3789985535,2973870856,2093648313,443148163,46942275,2734146937,1117713533,1115362972,1523183689,3717140224,1551984063],a[1]=[522195092,4010518363,1776537470,960447360,4267822970,4005896314,1435016340,1929119313,2913464185,1310552629,3579470798,3724818106,2579771631,1594623892,417127293,2715217907,2696228731,1508390405,3994398868,3925858569,3695444102,4019471449,3129199795,3770928635,3520741761,990456497,4187484609,2783367035,21106139,3840405339,631373633,3783325702,532942976,396095098,3548038825,4267192484,2564721535,2011709262,2039648873,620404603,3776170075,2898526339,3612357925,4159332703,1645490516,223693667,1567101217,3362177881,1029951347,3470931136,3570957959,1550265121,119497089,972513919,907948164,3840628539,1613718692,3594177948,465323573,2659255085,654439692,2575596212,2699288441,3127702412,277098644,624404830,4100943870,2717858591,546110314,2403699828,3655377447,1321679412,4236791657,1045293279,4010672264,895050893,2319792268,494945126,1914543101,2777056443,3894764339,2219737618,311263384,4275257268,3458730721,669096869,3584475730,3835122877,3319158237,3949359204,2005142349,2713102337,2228954793,3769984788,569394103,3855636576,1425027204,108000370,2736431443,3671869269,3043122623,1750473702,2211081108,762237499,3972989403,2798899386,3061857628,2943854345,867476300,964413654,1591880597,1594774276,2179821409,552026980,3026064248,3726140315,2283577634,3110545105,2152310760,582474363,1582640421,1383256631,2043843868,3322775884,1217180674,463797851,2763038571,480777679,2718707717,2289164131,3118346187,214354409,200212307,3810608407,3025414197,2674075964,3997296425,1847405948,1342460550,510035443,4080271814,815934613,833030224,1620250387,1945732119,2703661145,3966000196,1388869545,3456054182,2687178561,2092620194,562037615,1356438536,3409922145,3261847397,1688467115,2150901366,631725691,3840332284,549916902,3455104640,394546491,837744717,2114462948,751520235,2221554606,2415360136,3999097078,2063029875,803036379,2702586305,821456707,3019566164,360699898,4018502092,3511869016,3677355358,2402471449,812317050,49299192,2570164949,3259169295,2816732080,3331213574,3101303564,2156015656,3705598920,3546263921,143268808,3200304480,1638124008,3165189453,3341807610,578956953,2193977524,3638120073,2333881532,807278310,658237817,2969561766,1641658566,11683945,3086995007,148645947,1138423386,4158756760,1981396783,2401016740,3699783584,380097457,2680394679,2803068651,3334260286,441530178,4016580796,1375954390,761952171,891809099,2183123478,157052462,3683840763,1592404427,341349109,2438483839,1417898363,644327628,2233032776,2353769706,2201510100,220455161,1815641738,182899273,2995019788,3627381533,3702638151,2890684138,1052606899,588164016,1681439879,4038439418,2405343923,4229449282,167996282,1336969661,1688053129,2739224926,1543734051,1046297529,1138201970,2121126012,115334942,1819067631,1902159161,1941945968,2206692869,1159982321],a[2]=[2381300288,637164959,3952098751,3893414151,1197506559,916448331,2350892612,2932787856,3199334847,4009478890,3905886544,1373570990,2450425862,4037870920,3778841987,2456817877,286293407,124026297,3001279700,1028597854,3115296800,4208886496,2691114635,2188540206,1430237888,1218109995,3572471700,308166588,570424558,2187009021,2455094765,307733056,1310360322,3135275007,1384269543,2388071438,863238079,2359263624,2801553128,3380786597,2831162807,1470087780,1728663345,4072488799,1090516929,532123132,2389430977,1132193179,2578464191,3051079243,1670234342,1434557849,2711078940,1241591150,3314043432,3435360113,3091448339,1812415473,2198440252,267246943,796911696,3619716990,38830015,1526438404,2806502096,374413614,2943401790,1489179520,1603809326,1920779204,168801282,260042626,2358705581,1563175598,2397674057,1356499128,2217211040,514611088,2037363785,2186468373,4022173083,2792511869,2913485016,1173701892,4200428547,3896427269,1334932762,2455136706,602925377,2835607854,1613172210,41346230,2499634548,2457437618,2188827595,41386358,4172255629,1313404830,2405527007,3801973774,2217704835,873260488,2528884354,2478092616,4012915883,2555359016,2006953883,2463913485,575479328,2218240648,2099895446,660001756,2341502190,3038761536,3888151779,3848713377,3286851934,1022894237,1620365795,3449594689,1551255054,15374395,3570825345,4249311020,4151111129,3181912732,310226346,1133119310,530038928,136043402,2476768958,3107506709,2544909567,1036173560,2367337196,1681395281,1758231547,3641649032,306774401,1575354324,3716085866,1990386196,3114533736,2455606671,1262092282,3124342505,2768229131,4210529083,1833535011,423410938,660763973,2187129978,1639812e3,3508421329,3467445492,310289298,272797111,2188552562,2456863912,310240523,677093832,1013118031,901835429,3892695601,1116285435,3036471170,1337354835,243122523,520626091,277223598,4244441197,4194248841,1766575121,594173102,316590669,742362309,3536858622,4176435350,3838792410,2501204839,1229605004,3115755532,1552908988,2312334149,979407927,3959474601,1148277331,176638793,3614686272,2083809052,40992502,1340822838,2731552767,3535757508,3560899520,1354035053,122129617,7215240,2732932949,3118912700,2718203926,2539075635,3609230695,3725561661,1928887091,2882293555,1988674909,2063640240,2491088897,1459647954,4189817080,2302804382,1113892351,2237858528,1927010603,4002880361,1856122846,1594404395,2944033133,3855189863,3474975698,1643104450,4054590833,3431086530,1730235576,2984608721,3084664418,2131803598,4178205752,267404349,1617849798,1616132681,1462223176,736725533,2327058232,551665188,2945899023,1749386277,2575514597,1611482493,674206544,2201269090,3642560800,728599968,1680547377,2620414464,1388111496,453204106,4156223445,1094905244,2754698257,2201108165,3757000246,2704524545,3922940700,3996465027],a[3]=[2645754912,532081118,2814278639,3530793624,1246723035,1689095255,2236679235,4194438865,2116582143,3859789411,157234593,2045505824,4245003587,1687664561,4083425123,605965023,672431967,1336064205,3376611392,214114848,4258466608,3232053071,489488601,605322005,3998028058,264917351,1912574028,756637694,436560991,202637054,135989450,85393697,2152923392,3896401662,2895836408,2145855233,3535335007,115294817,3147733898,1922296357,3464822751,4117858305,1037454084,2725193275,2127856640,1417604070,1148013728,1827919605,642362335,2929772533,909348033,1346338451,3547799649,297154785,1917849091,4161712827,2883604526,3968694238,1469521537,3780077382,3375584256,1763717519,136166297,4290970789,1295325189,2134727907,2798151366,1566297257,3672928234,2677174161,2672173615,965822077,2780786062,289653839,1133871874,3491843819,35685304,1068898316,418943774,672553190,642281022,2346158704,1954014401,3037126780,4079815205,2030668546,3840588673,672283427,1776201016,359975446,3750173538,555499703,2769985273,1324923,69110472,152125443,3176785106,3822147285,1340634837,798073664,1434183902,15393959,216384236,1303690150,3881221631,3711134124,3960975413,106373927,2578434224,1455997841,1801814300,1578393881,1854262133,3188178946,3258078583,2302670060,1539295533,3505142565,3078625975,2372746020,549938159,3278284284,2620926080,181285381,2865321098,3970029511,68876850,488006234,1728155692,2608167508,836007927,2435231793,919367643,3339422534,3655756360,1457871481,40520939,1380155135,797931188,234455205,2255801827,3990488299,397000196,739833055,3077865373,2871719860,4022553888,772369276,390177364,3853951029,557662966,740064294,1640166671,1699928825,3535942136,622006121,3625353122,68743880,1742502,219489963,1664179233,1577743084,1236991741,410585305,2366487942,823226535,1050371084,3426619607,3586839478,212779912,4147118561,1819446015,1911218849,530248558,3486241071,3252585495,2886188651,3410272728,2342195030,20547779,2982490058,3032363469,3631753222,312714466,1870521650,1493008054,3491686656,615382978,4103671749,2534517445,1932181,2196105170,278426614,6369430,3274544417,2913018367,697336853,2143000447,2946413531,701099306,1558357093,2805003052,3500818408,2321334417,3567135975,216290473,3591032198,23009561,1996984579,3735042806,2024298078,3739440863,569400510,2339758983,3016033873,3097871343,3639523026,3844324983,3256173865,795471839,2951117563,4101031090,4091603803,3603732598,971261452,534414648,428311343,3389027175,2844869880,694888862,1227866773,2456207019,3043454569,2614353370,3749578031,3676663836,459166190,4132644070,1794958188,51825668,2252611902,3084671440,2036672799,3436641603,1099053433,2469121526,3059204941,1323291266,2061838604,1018778475,2233344254,2553501054,334295216,3556750194,1065731521,183467730],a[4]=[2127105028,745436345,2601412319,2788391185,3093987327,500390133,1155374404,389092991,150729210,3891597772,3523549952,1935325696,716645080,946045387,2901812282,1774124410,3869435775,4039581901,3293136918,3438657920,948246080,363898952,3867875531,1286266623,1598556673,68334250,630723836,1104211938,1312863373,613332731,2377784574,1101634306,441780740,3129959883,1917973735,2510624549,3238456535,2544211978,3308894634,1299840618,4076074851,1756332096,3977027158,297047435,3790297736,2265573040,3621810518,1311375015,1667687725,47300608,3299642885,2474112369,201668394,1468347890,576830978,3594690761,3742605952,1958042578,1747032512,3558991340,1408974056,3366841779,682131401,1033214337,1545599232,4265137049,206503691,103024618,2855227313,1337551222,2428998917,2963842932,4015366655,3852247746,2796956967,3865723491,3747938335,247794022,3755824572,702416469,2434691994,397379957,851939612,2314769512,218229120,1380406772,62274761,214451378,3170103466,2276210409,3845813286,28563499,446592073,1693330814,3453727194,29968656,3093872512,220656637,2470637031,77972100,1667708854,1358280214,4064765667,2395616961,325977563,4277240721,4220025399,3605526484,3355147721,811859167,3069544926,3962126810,652502677,3075892249,4132761541,3498924215,1217549313,3250244479,3858715919,3053989961,1538642152,2279026266,2875879137,574252750,3324769229,2651358713,1758150215,141295887,2719868960,3515574750,4093007735,4194485238,1082055363,3417560400,395511885,2966884026,179534037,3646028556,3738688086,1092926436,2496269142,257381841,3772900718,1636087230,1477059743,2499234752,3811018894,2675660129,3285975680,90732309,1684827095,1150307763,1723134115,3237045386,1769919919,1240018934,815675215,750138730,2239792499,1234303040,1995484674,138143821,675421338,1145607174,1936608440,3238603024,2345230278,2105974004,323969391,779555213,3004902369,2861610098,1017501463,2098600890,2628620304,2940611490,2682542546,1171473753,3656571411,3687208071,4091869518,393037935,159126506,1662887367,1147106178,391545844,3452332695,1891500680,3016609650,1851642611,546529401,1167818917,3194020571,2848076033,3953471836,575554290,475796850,4134673196,450035699,2351251534,844027695,1080539133,86184846,1554234488,3692025454,1972511363,2018339607,1491841390,1141460869,1061690759,4244549243,2008416118,2351104703,2868147542,1598468138,722020353,1027143159,212344630,1387219594,1725294528,3745187956,2500153616,458938280,4129215917,1828119673,544571780,3503225445,2297937496,1241802790,267843827,2694610800,1397140384,1558801448,3782667683,1806446719,929573330,2234912681,400817706,616011623,4121520928,3603768725,1761550015,1968522284,4053731006,4192232858,4005120285,872482584,3140537016,3894607381,2287405443,1963876937,3663887957,1584857e3,2975024454,1833426440,4025083860],a[5]=[4143615901,749497569,1285769319,3795025788,2514159847,23610292,3974978748,844452780,3214870880,3751928557,2213566365,1676510905,448177848,3730751033,4086298418,2307502392,871450977,3222878141,4110862042,3831651966,2735270553,1310974780,2043402188,1218528103,2736035353,4274605013,2702448458,3936360550,2693061421,162023535,2827510090,687910808,23484817,3784910947,3371371616,779677500,3503626546,3473927188,4157212626,3500679282,4248902014,2466621104,3899384794,1958663117,925738300,1283408968,3669349440,1840910019,137959847,2679828185,1239142320,1315376211,1547541505,1690155329,739140458,3128809933,3933172616,3876308834,905091803,1548541325,4040461708,3095483362,144808038,451078856,676114313,2861728291,2469707347,993665471,373509091,2599041286,4025009006,4170239449,2149739950,3275793571,3749616649,2794760199,1534877388,572371878,2590613551,1753320020,3467782511,1405125690,4270405205,633333386,3026356924,3475123903,632057672,2846462855,1404951397,3882875879,3915906424,195638627,2385783745,3902872553,1233155085,3355999740,2380578713,2702246304,2144565621,3663341248,3894384975,2502479241,4248018925,3094885567,1594115437,572884632,3385116731,767645374,1331858858,1475698373,3793881790,3532746431,1321687957,619889600,1121017241,3440213920,2070816767,2833025776,1933951238,4095615791,890643334,3874130214,859025556,360630002,925594799,1764062180,3920222280,4078305929,979562269,2810700344,4087740022,1949714515,546639971,1165388173,3069891591,1495988560,922170659,1291546247,2107952832,1813327274,3406010024,3306028637,4241950635,153207855,2313154747,1608695416,1150242611,1967526857,721801357,1220138373,3691287617,3356069787,2112743302,3281662835,1111556101,1778980689,250857638,2298507990,673216130,2846488510,3207751581,3562756981,3008625920,3417367384,2198807050,529510932,3547516680,3426503187,2364944742,102533054,2294910856,1617093527,1204784762,3066581635,1019391227,1069574518,1317995090,1691889997,3661132003,510022745,3238594800,1362108837,1817929911,2184153760,805817662,1953603311,3699844737,120799444,2118332377,207536705,2282301548,4120041617,145305846,2508124933,3086745533,3261524335,1877257368,2977164480,3160454186,2503252186,4221677074,759945014,254147243,2767453419,3801518371,629083197,2471014217,907280572,3900796746,940896768,2751021123,2625262786,3161476951,3661752313,3260732218,1425318020,2977912069,1496677566,3988592072,2140652971,3126511541,3069632175,977771578,1392695845,1698528874,1411812681,1369733098,1343739227,3620887944,1142123638,67414216,3102056737,3088749194,1626167401,2546293654,3941374235,697522451,33404913,143560186,2595682037,994885535,1247667115,3859094837,2699155541,3547024625,4114935275,2968073508,3199963069,2732024527,1237921620,951448369,1898488916,1211705605,2790989240,2233243581,3598044975],a[6]=[2246066201,858518887,1714274303,3485882003,713916271,2879113490,3730835617,539548191,36158695,1298409750,419087104,1358007170,749914897,2989680476,1261868530,2995193822,2690628854,3443622377,3780124940,3796824509,2976433025,4259637129,1551479e3,512490819,1296650241,951993153,2436689437,2460458047,144139966,3136204276,310820559,3068840729,643875328,1969602020,1680088954,2185813161,3283332454,672358534,198762408,896343282,276269502,3014846926,84060815,197145886,376173866,3943890818,3813173521,3545068822,1316698879,1598252827,2633424951,1233235075,859989710,2358460855,3503838400,3409603720,1203513385,1193654839,2792018475,2060853022,207403770,1144516871,3068631394,1121114134,177607304,3785736302,326409831,1929119770,2983279095,4183308101,3474579288,3200513878,3228482096,119610148,1170376745,3378393471,3163473169,951863017,3337026068,3135789130,2907618374,1183797387,2015970143,4045674555,2182986399,2952138740,3928772205,384012900,2454997643,10178499,2879818989,2596892536,111523738,2995089006,451689641,3196290696,235406569,1441906262,3890558523,3013735005,4158569349,1644036924,376726067,1006849064,3664579700,2041234796,1021632941,1374734338,2566452058,371631263,4007144233,490221539,206551450,3140638584,1053219195,1853335209,3412429660,3562156231,735133835,1623211703,3104214392,2738312436,4096837757,3366392578,3110964274,3956598718,3196820781,2038037254,3877786376,2339753847,300912036,3766732888,2372630639,1516443558,4200396704,1574567987,4069441456,4122592016,2699739776,146372218,2748961456,2043888151,35287437,2596680554,655490400,1132482787,110692520,1031794116,2188192751,1324057718,1217253157,919197030,686247489,3261139658,1028237775,3135486431,3059715558,2460921700,986174950,2661811465,4062904701,2752986992,3709736643,367056889,1353824391,731860949,1650113154,1778481506,784341916,357075625,3608602432,1074092588,2480052770,3811426202,92751289,877911070,3600361838,1231880047,480201094,3756190983,3094495953,434011822,87971354,363687820,1717726236,1901380172,3926403882,2481662265,400339184,1490350766,2661455099,1389319756,2558787174,784598401,1983468483,30828846,3550527752,2716276238,3841122214,1765724805,1955612312,1277890269,1333098070,1564029816,2704417615,1026694237,3287671188,1260819201,3349086767,1016692350,1582273796,1073413053,1995943182,694588404,1025494639,3323872702,3551898420,4146854327,453260480,1316140391,1435673405,3038941953,3486689407,1622062951,403978347,817677117,950059133,4246079218,3278066075,1486738320,1417279718,481875527,2549965225,3933690356,760697757,1452955855,3897451437,1177426808,1702951038,4085348628,2447005172,1084371187,3516436277,3068336338,1073369276,1027665953,3284188590,1230553676,1368340146,2226246512,267243139,2274220762,4070734279,2497715176,2423353163,2504755875],a[7]=[3793104909,3151888380,2817252029,895778965,2005530807,3871412763,237245952,86829237,296341424,3851759377,3974600970,2475086196,709006108,1994621201,2972577594,937287164,3734691505,168608556,3189338153,2225080640,3139713551,3033610191,3025041904,77524477,185966941,1208824168,2344345178,1721625922,3354191921,1066374631,1927223579,1971335949,2483503697,1551748602,2881383779,2856329572,3003241482,48746954,1398218158,2050065058,313056748,4255789917,393167848,1912293076,940740642,3465845460,3091687853,2522601570,2197016661,1727764327,364383054,492521376,1291706479,3264136376,1474851438,1685747964,2575719748,1619776915,1814040067,970743798,1561002147,2925768690,2123093554,1880132620,3151188041,697884420,2550985770,2607674513,2659114323,110200136,1489731079,997519150,1378877361,3527870668,478029773,2766872923,1022481122,431258168,1112503832,897933369,2635587303,669726182,3383752315,918222264,163866573,3246985393,3776823163,114105080,1903216136,761148244,3571337562,1690750982,3166750252,1037045171,1888456500,2010454850,642736655,616092351,365016990,1185228132,4174898510,1043824992,2023083429,2241598885,3863320456,3279669087,3674716684,108438443,2132974366,830746235,606445527,4173263986,2204105912,1844756978,2532684181,4245352700,2969441100,3796921661,1335562986,4061524517,2720232303,2679424040,634407289,885462008,3294724487,3933892248,2094100220,339117932,4048830727,3202280980,1458155303,2689246273,1022871705,2464987878,3714515309,353796843,2822958815,4256850100,4052777845,551748367,618185374,3778635579,4020649912,1904685140,3069366075,2670879810,3407193292,2954511620,4058283405,2219449317,3135758300,1120655984,3447565834,1474845562,3577699062,550456716,3466908712,2043752612,881257467,869518812,2005220179,938474677,3305539448,3850417126,1315485940,3318264702,226533026,965733244,321539988,1136104718,804158748,573969341,3708209826,937399083,3290727049,2901666755,1461057207,4013193437,4066861423,3242773476,2421326174,1581322155,3028952165,786071460,3900391652,3918438532,1485433313,4023619836,3708277595,3678951060,953673138,1467089153,1930354364,1533292819,2492563023,1346121658,1685000834,1965281866,3765933717,4190206607,2052792609,3515332758,690371149,3125873887,2180283551,2903598061,3933952357,436236910,289419410,14314871,1242357089,2904507907,1616633776,2666382180,585885352,3471299210,2699507360,1432659641,277164553,3354103607,770115018,2303809295,3741942315,3177781868,2853364978,2269453327,3774259834,987383833,1290892879,225909803,1741533526,890078084,1496906255,1111072499,916028167,243534141,1252605537,2204162171,531204876,290011180,3916834213,102027703,237315147,209093447,1486785922,220223953,2758195998,4175039106,82940208,3127791296,2569425252,518464269,1353887104,3941492737,2377294467,3935040926]}function i(e){this.cast5=new n,this.cast5.setKey(e),this.encrypt=function(e){return this.cast5.encrypt(e)}}Object.defineProperty(r,"__esModule",{value:!0}),i.blockSize=i.prototype.blockSize=8,i.keySize=i.prototype.keySize=16,r.default=i},{}],85:[function(e,t,r){"use strict";function n(e,t,r,n,i,a){const s=[16843776,0,65536,16843780,16842756,66564,4,65536,1024,16843776,16843780,1024,16778244,16842756,16777216,4,1028,16778240,16778240,66560,66560,16842752,16842752,16778244,65540,16777220,16777220,65540,0,1028,66564,16777216,65536,16843780,4,16842752,16843776,16777216,16777216,1024,16842756,65536,66560,16777220,1024,4,16778244,66564,16843780,65540,16842752,16778244,16777220,1028,66564,16843776,1028,16778240,16778240,0,65540,66560,0,16842756],o=[-2146402272,-2147450880,32768,1081376,1048576,32,-2146435040,-2147450848,-2147483616,-2146402272,-2146402304,-2147483648,-2147450880,1048576,32,-2146435040,1081344,1048608,-2147450848,0,-2147483648,32768,1081376,-2146435072,1048608,-2147483616,0,1081344,32800,-2146402304,-2146435072,32800,0,1081376,-2146435040,1048576,-2147450848,-2146435072,-2146402304,32768,-2146435072,-2147450880,32,-2146402272,1081376,32,32768,-2147483648,32800,-2146402304,1048576,-2147483616,1048608,-2147450848,-2147483616,1048608,1081344,0,-2147450880,32800,-2147483648,-2146435040,-2146402272,1081344],u=[520,134349312,0,134348808,134218240,0,131592,134218240,131080,134217736,134217736,131072,134349320,131080,134348800,520,134217728,8,134349312,512,131584,134348800,134348808,131592,134218248,131584,131072,134218248,8,134349320,512,134217728,134349312,134217728,131080,520,131072,134349312,134218240,0,512,131080,134349320,134218240,134217736,512,0,134348808,134218248,131072,134217728,134349320,8,131592,131584,134217736,134348800,134218248,520,134348800,131592,8,134348808,131584],c=[8396801,8321,8321,128,8396928,8388737,8388609,8193,0,8396800,8396800,8396929,129,0,8388736,8388609,1,8192,8388608,8396801,128,8388608,8193,8320,8388737,1,8320,8388736,8192,8396928,8396929,129,8388736,8388609,8396800,8396929,129,0,0,8396800,8320,8388736,8388737,1,8396801,8321,8321,128,8396929,129,1,8192,8388609,8193,8396928,8388737,8193,8320,8388608,8396801,128,8388608,8192,8396928],f=[256,34078976,34078720,1107296512,524288,256,1073741824,34078720,1074266368,524288,33554688,1074266368,1107296512,1107820544,524544,1073741824,33554432,1074266112,1074266112,0,1073742080,1107820800,1107820800,33554688,1107820544,1073742080,0,1107296256,34078976,33554432,1107296256,524544,524288,1107296512,256,33554432,1073741824,34078720,1107296512,1074266368,33554688,1073741824,1107820544,34078976,1074266368,256,33554432,1107820544,1107820800,524544,1107296256,1107820800,34078720,0,1074266112,1107296256,524544,33554688,1073742080,524288,0,1074266112,34078976,1073742080],d=[536870928,541065216,16384,541081616,541065216,16,541081616,4194304,536887296,4210704,4194304,536870928,4194320,536887296,536870912,16400,0,4194320,536887312,16384,4210688,536887312,16,541065232,541065232,0,4210704,541081600,16400,4210688,541081600,536870912,536887296,16,541065232,4210688,541081616,4194304,16400,536870928,4194304,536887296,536870912,16400,536870928,541081616,4210688,541065216,4210704,541081600,0,541065232,16,16384,541065216,4210704,16384,4194320,536887312,0,541081600,536870912,4194320,536887312],l=[2097152,69206018,67110914,0,2048,67110914,2099202,69208064,69208066,2097152,0,67108866,2,67108864,69206018,2050,67110912,2099202,2097154,67110912,67108866,69206016,69208064,2097154,69206016,2048,2050,69208066,2099200,2,67108864,2099200,67108864,2099200,2097152,67110914,67110914,69206018,69206018,2,2097154,67108864,67110912,2097152,69208064,2050,2099202,69208064,2050,67108866,69208066,69206016,2099200,0,2,69208066,0,2099202,69206016,2048,67108866,67110912,2048,2097154],h=[268439616,4096,262144,268701760,268435456,268439616,64,268435456,262208,268697600,268701760,266240,268701696,266304,4096,64,268697600,268435520,268439552,4160,266240,262208,268697664,268701696,4160,0,0,268697664,268435520,268439552,266304,262144,266304,262144,268701696,4096,64,268697664,4096,266304,268439552,64,268435520,268697600,268697664,268435456,262144,268439616,0,268701760,262208,268435520,268697600,268439552,268439616,0,268701760,266240,266240,4160,4160,262208,268435456,268701696];let p,y,b,m,g,w,_,v,k,A,S,E,P,x,M=0,C=t.length;const K=32===e.length?3:9;v=3===K?r?[0,32,2]:[30,-2,-2]:r?[0,32,2,62,30,-2,64,96,2]:[94,62,-2,32,64,2,30,-2,-2],r&&(C=(t=function(e,t){const r=8-e.length%8;let n;if(2===t&&r<8)n=" ".charCodeAt(0);else if(1===t)n=r;else{if(t||!(r<8)){if(8===r)return e;throw new Error("des: invalid padding")}n=0}const i=new Uint8Array(e.length+r);for(let a=0;a>>4^_))<<4,w^=(b=65535&(w>>>16^(_^=b)))<<16,w^=b=858993459&((_^=b)>>>2^w),w^=b=16711935&((_^=b<<2)>>>8^w),w=(w^=(b=1431655765&(w>>>1^(_^=b<<8)))<<1)<<1|w>>>31,_=(_^=b)<<1|_>>>31,y=0;y>>4|_<<28)^e[p+1],b=w,w=_,_=b^(o[m>>>24&63]|c[m>>>16&63]|d[m>>>8&63]|h[63&m]|s[g>>>24&63]|u[g>>>16&63]|f[g>>>8&63]|l[63&g]);b=w,w=_,_=b}_=_>>>1|_<<31,_^=b=1431655765&((w=w>>>1|w<<31)>>>1^_),_^=(b=16711935&(_>>>8^(w^=b<<1)))<<8,_^=(b=858993459&(_>>>2^(w^=b)))<<2,_^=b=65535&((w^=b)>>>16^_),_^=b=252645135&((w^=b<<16)>>>4^_),w^=b<<4,1===n&&(r?(k=w,S=_):(w^=A,_^=E)),U[R++]=w>>>24,U[R++]=w>>>16&255,U[R++]=w>>>8&255,U[R++]=255&w,U[R++]=_>>>24,U[R++]=_>>>16&255,U[R++]=_>>>8&255,U[R++]=255&_}return r||(U=function(e,t){let r,n=null;if(2===t)r=" ".charCodeAt(0);else if(1===t)n=e[e.length-1];else{if(t)throw new Error("des: invalid padding");r=0}if(!n){for(n=1;e[e.length-n]===r;)n++;n--}return e.subarray(0,e.length-n)}(U,a)),U}function i(e){const t=[0,4,536870912,536870916,65536,65540,536936448,536936452,512,516,536871424,536871428,66048,66052,536936960,536936964],r=[0,1,1048576,1048577,67108864,67108865,68157440,68157441,256,257,1048832,1048833,67109120,67109121,68157696,68157697],n=[0,8,2048,2056,16777216,16777224,16779264,16779272,0,8,2048,2056,16777216,16777224,16779264,16779272],i=[0,2097152,134217728,136314880,8192,2105344,134225920,136323072,131072,2228224,134348800,136445952,139264,2236416,134356992,136454144],a=[0,262144,16,262160,0,262144,16,262160,4096,266240,4112,266256,4096,266240,4112,266256],s=[0,1024,32,1056,0,1024,32,1056,33554432,33555456,33554464,33555488,33554432,33555456,33554464,33555488],o=[0,268435456,524288,268959744,2,268435458,524290,268959746,0,268435456,524288,268959744,2,268435458,524290,268959746],u=[0,65536,2048,67584,536870912,536936448,536872960,536938496,131072,196608,133120,198656,537001984,537067520,537004032,537069568],c=[0,262144,0,262144,2,262146,2,262146,33554432,33816576,33554432,33816576,33554434,33816578,33554434,33816578],f=[0,268435456,8,268435464,0,268435456,8,268435464,1024,268436480,1032,268436488,1024,268436480,1032,268436488],d=[0,32,0,32,1048576,1048608,1048576,1048608,8192,8224,8192,8224,1056768,1056800,1056768,1056800],l=[0,16777216,512,16777728,2097152,18874368,2097664,18874880,67108864,83886080,67109376,83886592,69206016,85983232,69206528,85983744],h=[0,4096,134217728,134221824,524288,528384,134742016,134746112,16,4112,134217744,134221840,524304,528400,134742032,134746128],p=[0,4,256,260,0,4,256,260,1,5,257,261,1,5,257,261],y=e.length>8?3:1,b=new Array(32*y),m=[0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0];let g,w,_,v=0,k=0;for(let A=0;A>>4^A))<<4,y^=_=65535&((A^=_)>>>-16^y),y^=(_=858993459&(y>>>2^(A^=_<<-16)))<<2,y^=_=65535&((A^=_)>>>-16^y),y^=(_=1431655765&(y>>>1^(A^=_<<-16)))<<1,y^=_=16711935&((A^=_)>>>8^y),_=(y^=(_=1431655765&(y>>>1^(A^=_<<8)))<<1)<<8|(A^=_)>>>20&240,y=A<<24|A<<8&16711680|A>>>8&65280|A>>>24&240,A=_;for(let e=0;e>>26,A=A<<2|A>>>26):(y=y<<1|y>>>27,A=A<<1|A>>>27),_=65535&((w=u[(A&=-15)>>>28]|c[A>>>24&15]|f[A>>>20&15]|d[A>>>16&15]|l[A>>>12&15]|h[A>>>8&15]|p[A>>>4&15])>>>16^(g=t[(y&=-15)>>>28]|r[y>>>24&15]|n[y>>>20&15]|i[y>>>16&15]|a[y>>>12&15]|s[y>>>8&15]|o[y>>>4&15])),b[k++]=g^_,b[k++]=w^_<<16}return b}function a(e){this.key=[];for(let t=0;t<3;t++)this.key.push(new Uint8Array(e.subarray(8*t,8*t+8)));this.encrypt=function(e){return n(i(this.key[2]),n(i(this.key[1]),n(i(this.key[0]),e,!0,0,null,null),!1,0,null,null),!0,0,null,null)}}Object.defineProperty(r,"__esModule",{value:!0}),a.keySize=a.prototype.keySize=24,a.blockSize=a.prototype.blockSize=8,r.default={DES:function(e){this.key=e,this.encrypt=function(e,t){return n(i(this.key),e,!0,0,null,t)},this.decrypt=function(e,t){return n(i(this.key),e,!1,0,null,t)}},TripleDES:a}},{}],86:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=u(e("./aes")),i=u(e("./des.js")),a=u(e("./cast5")),s=u(e("./twofish")),o=u(e("./blowfish"));function u(e){return e&&e.__esModule?e:{default:e}}r.default={aes128:(0,n.default)(128),aes192:(0,n.default)(192),aes256:(0,n.default)(256),des:i.default.DES,tripledes:i.default.TripleDES,"3des":i.default.TripleDES,cast5:a.default,twofish:s.default,blowfish:o.default,idea:function(){throw new Error("IDEA symmetric-key algorithm not implemented")}}},{"./aes":82,"./blowfish":83,"./cast5":84,"./des.js":85,"./twofish":87}],87:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});const n=4294967295;function i(e,t){return(e<>>32-t)&n}function a(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function s(e,t,r){e.splice(t,4,255&r,r>>>8&255,r>>>16&255,r>>>24&255)}function o(e,t){return e>>>8*t&255}function u(e){this.tf=function(){let e=null,t=null,r=-1,u=[],c=[[],[],[],[]];function f(e){return c[0][o(e,0)]^c[1][o(e,1)]^c[2][o(e,2)]^c[3][o(e,3)]}function d(e){return c[0][o(e,3)]^c[1][o(e,0)]^c[2][o(e,1)]^c[3][o(e,2)]}function l(e,t){let r=f(t[0]),a=d(t[1]);t[2]=i(t[2]^r+a+u[4*e+8]&n,31),t[3]=i(t[3],1)^r+2*a+u[4*e+9]&n,r=f(t[2]),a=d(t[3]),t[0]=i(t[0]^r+a+u[4*e+10]&n,31),t[1]=i(t[1],1)^r+2*a+u[4*e+11]&n}function h(e,t){let r=f(t[0]),a=d(t[1]);t[2]=i(t[2],1)^r+a+u[4*e+10]&n,t[3]=i(t[3]^r+2*a+u[4*e+11]&n,31),r=f(t[2]),a=d(t[3]),t[0]=i(t[0],1)^r+a+u[4*e+8]&n,t[1]=i(t[1]^r+2*a+u[4*e+9]&n,31)}return{name:"twofish",blocksize:16,open:function(t){let r,s,f,d,l;const h=[],p=[],y=[];let b;const m=[];let g,w,_;const v=[[8,1,7,13,6,15,3,2,0,11,5,9,14,12,10,4],[2,8,11,13,15,7,6,14,3,1,9,4,0,10,12,5]],k=[[14,12,11,8,1,2,3,5,15,4,10,6,7,0,9,13],[1,14,2,11,4,12,3,7,6,13,10,5,15,9,0,8]],A=[[11,10,5,14,6,13,9,0,12,8,15,3,2,4,7,1],[4,12,7,5,1,6,9,10,0,14,13,8,2,11,3,15]],S=[[13,7,15,4,1,2,6,14,9,11,3,0,8,5,12,10],[11,9,5,1,12,3,13,14,6,4,7,15,2,0,8,10]],E=[0,8,1,9,2,10,3,11,4,12,5,13,6,14,7,15],P=[0,9,2,11,4,13,6,15,8,1,10,3,12,5,14,7],x=[[],[]],M=[[],[],[],[]];function C(e){return e^e>>2^[0,90,180,238][3&e]}function K(e){return e^e>>1^e>>2^[0,238,180,90][3&e]}function U(e,t){let r,i,a;for(r=0;r<8;r++)i=t>>>24,t=t<<8&n|e>>>24,e=e<<8&n,a=i<<1,128&i&&(a^=333),t^=i^a<<16,a^=i>>>1,1&i&&(a^=166),t^=a<<24|a<<8;return t}function R(e,t){const r=t>>4,n=15&t,i=v[e][r^n],a=k[e][E[n]^P[r]];return S[e][E[a]^P[i]]<<4|A[e][i^a]}function B(e,t){let r=o(e,0),n=o(e,1),i=o(e,2),a=o(e,3);switch(b){case 4:r=x[1][r]^o(t[3],0),n=x[0][n]^o(t[3],1),i=x[0][i]^o(t[3],2),a=x[1][a]^o(t[3],3);case 3:r=x[1][r]^o(t[2],0),n=x[1][n]^o(t[2],1),i=x[0][i]^o(t[2],2),a=x[0][a]^o(t[2],3);case 2:r=x[0][x[0][r]^o(t[1],0)]^o(t[0],0),n=x[0][x[1][n]^o(t[1],1)]^o(t[0],1),i=x[1][x[0][i]^o(t[1],2)]^o(t[0],2),a=x[1][x[1][a]^o(t[1],3)]^o(t[0],3)}return M[0][r]^M[1][n]^M[2][i]^M[3][a]}for(r=(e=(e=t).slice(0,32)).length;16!==r&&24!==r&&32!==r;)e[r++]=0;for(r=0;r>2]=a(e,r);for(r=0;r<256;r++)x[0][r]=R(0,r),x[1][r]=R(1,r);for(r=0;r<256;r++)w=C(g=x[1][r]),_=K(g),M[0][r]=g+(w<<8)+(_<<16)+(_<<24),M[2][r]=w+(_<<8)+(g<<16)+(_<<24),w=C(g=x[0][r]),_=K(g),M[1][r]=_+(_<<8)+(w<<16)+(g<<24),M[3][r]=w+(g<<8)+(_<<16)+(w<<24);for(b=y.length/2,r=0;r=0;t--)h(t,i);s(t,r,i[2]^u[0]),s(t,r+4,i[3]^u[1]),s(t,r+8,i[0]^u[2]),s(t,r+12,i[1]^u[3]),r+=16},finalize:function(){return t}}}(),this.tf.open(Array.from(e),0),this.encrypt=function(e){return this.tf.encrypt(Array.from(e),0)}}u.keySize=u.prototype.keySize=32,u.blockSize=u.prototype.blockSize=16,r.default=u},{}],88:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=e("asmcrypto.js/dist_es5/aes/cbc"),a=e("../util"),s=(n=a)&&n.__esModule?n:{default:n};const o=s.default.getWebCrypto(),u=s.default.getNodeCrypto(),c=s.default.getNodeBuffer(),f=16;function d(e,t){const r=e.length-f;for(let n=0;n{r.update(b.from(e))},()=>new Uint8Array(r.digest()))}}function g(e,t){return async function(r){if(!l.default.isStream(r)&&p&&t&&r.length>=d.default.min_bytes_for_web_crypto)return new Uint8Array(await p.digest(t,r));const n=e();return c.default.transform(r,e=>{n.update(e)},()=>new Uint8Array(n.digest()))}}function w(e,t){return async function(r){if(l.default.isStream(r)){const t=new e;return c.default.transform(r,e=>{t.process(e)},()=>t.finish().result)}return p&&t&&r.length>=d.default.min_bytes_for_web_crypto?new Uint8Array(await p.digest(t,r)):e.bytes(r)}}let _;_=y?{md5:m("md5"),sha1:m("sha1"),sha224:m("sha224"),sha256:m("sha256"),sha384:m("sha384"),sha512:m("sha512"),ripemd:m("ripemd160")}:{md5:f.default,sha1:w(n.Sha1,-1===navigator.userAgent.indexOf("Edge")&&"SHA-1"),sha224:g(a.default),sha256:w(i.Sha256,"SHA-256"),sha384:g(s.default,"SHA-384"),sha512:g(o.default,"SHA-512"),ripemd:g(u.ripemd160)},r.default={md5:_.md5,sha1:_.sha1,sha224:_.sha224,sha256:_.sha256,sha384:_.sha384,sha512:_.sha512,ripemd:_.ripemd,digest:function(e,t){switch(e){case 1:return this.md5(t);case 2:return this.sha1(t);case 3:return this.ripemd(t);case 8:return this.sha256(t);case 9:return this.sha384(t);case 10:return this.sha512(t);case 11:return this.sha224(t);default:throw new Error("Invalid hash function.")}},getHashByteLength:function(e){switch(e){case 1:return 16;case 2:case 3:return 20;case 8:return 32;case 9:return 48;case 10:return 64;case 11:return 28;default:throw new Error("Invalid hash algorithm.")}}}},{"../../config":79,"../../util":158,"./md5":93,"asmcrypto.js/dist_es5/hash/sha1/sha1":11,"asmcrypto.js/dist_es5/hash/sha256/sha256":13,"hash.js/lib/hash/ripemd":37,"hash.js/lib/hash/sha/224":40,"hash.js/lib/hash/sha/384":42,"hash.js/lib/hash/sha/512":43,"web-stream-tools":75}],93:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=e("../../util"),a=(n=i)&&n.__esModule?n:{default:n};function s(e,t){let r=e[0],n=e[1],i=e[2],a=e[3];r=u(r,n,i,a,t[0],7,-680876936),a=u(a,r,n,i,t[1],12,-389564586),i=u(i,a,r,n,t[2],17,606105819),n=u(n,i,a,r,t[3],22,-1044525330),r=u(r,n,i,a,t[4],7,-176418897),a=u(a,r,n,i,t[5],12,1200080426),i=u(i,a,r,n,t[6],17,-1473231341),n=u(n,i,a,r,t[7],22,-45705983),r=u(r,n,i,a,t[8],7,1770035416),a=u(a,r,n,i,t[9],12,-1958414417),i=u(i,a,r,n,t[10],17,-42063),n=u(n,i,a,r,t[11],22,-1990404162),r=u(r,n,i,a,t[12],7,1804603682),a=u(a,r,n,i,t[13],12,-40341101),i=u(i,a,r,n,t[14],17,-1502002290),r=c(r,n=u(n,i,a,r,t[15],22,1236535329),i,a,t[1],5,-165796510),a=c(a,r,n,i,t[6],9,-1069501632),i=c(i,a,r,n,t[11],14,643717713),n=c(n,i,a,r,t[0],20,-373897302),r=c(r,n,i,a,t[5],5,-701558691),a=c(a,r,n,i,t[10],9,38016083),i=c(i,a,r,n,t[15],14,-660478335),n=c(n,i,a,r,t[4],20,-405537848),r=c(r,n,i,a,t[9],5,568446438),a=c(a,r,n,i,t[14],9,-1019803690),i=c(i,a,r,n,t[3],14,-187363961),n=c(n,i,a,r,t[8],20,1163531501),r=c(r,n,i,a,t[13],5,-1444681467),a=c(a,r,n,i,t[2],9,-51403784),i=c(i,a,r,n,t[7],14,1735328473),r=f(r,n=c(n,i,a,r,t[12],20,-1926607734),i,a,t[5],4,-378558),a=f(a,r,n,i,t[8],11,-2022574463),i=f(i,a,r,n,t[11],16,1839030562),n=f(n,i,a,r,t[14],23,-35309556),r=f(r,n,i,a,t[1],4,-1530992060),a=f(a,r,n,i,t[4],11,1272893353),i=f(i,a,r,n,t[7],16,-155497632),n=f(n,i,a,r,t[10],23,-1094730640),r=f(r,n,i,a,t[13],4,681279174),a=f(a,r,n,i,t[0],11,-358537222),i=f(i,a,r,n,t[3],16,-722521979),n=f(n,i,a,r,t[6],23,76029189),r=f(r,n,i,a,t[9],4,-640364487),a=f(a,r,n,i,t[12],11,-421815835),i=f(i,a,r,n,t[15],16,530742520),r=d(r,n=f(n,i,a,r,t[2],23,-995338651),i,a,t[0],6,-198630844),a=d(a,r,n,i,t[7],10,1126891415),i=d(i,a,r,n,t[14],15,-1416354905),n=d(n,i,a,r,t[5],21,-57434055),r=d(r,n,i,a,t[12],6,1700485571),a=d(a,r,n,i,t[3],10,-1894986606),i=d(i,a,r,n,t[10],15,-1051523),n=d(n,i,a,r,t[1],21,-2054922799),r=d(r,n,i,a,t[8],6,1873313359),a=d(a,r,n,i,t[15],10,-30611744),i=d(i,a,r,n,t[6],15,-1560198380),n=d(n,i,a,r,t[13],21,1309151649),r=d(r,n,i,a,t[4],6,-145523070),a=d(a,r,n,i,t[11],10,-1120210379),i=d(i,a,r,n,t[2],15,718787259),n=d(n,i,a,r,t[9],21,-343485551),e[0]=y(r,e[0]),e[1]=y(n,e[1]),e[2]=y(i,e[2]),e[3]=y(a,e[3])}function o(e,t,r,n,i,a){return t=y(y(t,e),y(n,a)),y(t<>>32-i,r)}function u(e,t,r,n,i,a,s){return o(t&r|~t&n,e,t,i,a,s)}function c(e,t,r,n,i,a,s){return o(t&n|r&~n,e,t,i,a,s)}function f(e,t,r,n,i,a,s){return o(t^r^n,e,t,i,a,s)}function d(e,t,r,n,i,a,s){return o(r^(t|~n),e,t,i,a,s)}function l(e){const t=[];let r;for(r=0;r<64;r+=4)t[r>>2]=e.charCodeAt(r)+(e.charCodeAt(r+1)<<8)+(e.charCodeAt(r+2)<<16)+(e.charCodeAt(r+3)<<24);return t}const h="0123456789abcdef".split("");function p(e){let t="",r=0;for(;r<4;r++)t+=h[e>>8*r+4&15]+h[e>>8*r&15];return t}function y(e,t){return e+t&4294967295}r.default=async function(e){const t=function(e){const t=e.length,r=[1732584193,-271733879,-1732584194,271733878];let n;for(n=64;n<=e.length;n+=64)s(r,l(e.substring(n-64,n)));e=e.substring(n-64);const i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(n=0;n>2]|=e.charCodeAt(n)<<(n%4<<3);if(i[n>>2]|=128<<(n%4<<3),n>55)for(s(r,i),n=0;n<16;n++)i[n]=0;return i[14]=8*t,s(r,i),r}(a.default.Uint8Array_to_str(e));return a.default.hex_to_Uint8Array(function(e){for(let t=0;t>3),17+(g>>3)),8-(7&g)).subarray(1),k=new Uint8Array(s),A=new Uint8Array(t.length+u);let S,E=0;for(S=0;St-11)throw new Error("Message too long");const i=await async function(e){let t="";for(;t.length=8&&0===a)return e.substr(n);throw new Error("Decryption error")},u.encode=async function(e,t,r){let n;const s=a.default.Uint8Array_to_str(t);if(s.length!==i.default.getHashByteLength(e))throw new Error("Invalid hash length");let o="";for(n=0;n0){const r=e.charCodeAt(t-1);if(r>=1&&e.substr(t-r)===String.fromCharCode(r).repeat(r))return e.substr(0,t-r)}throw new Error("Invalid padding")}}},{}],98:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=o(e("bn.js")),i=o(e("../random")),a=o(e("../../util")),s=o(e("./prime"));function o(e){return e&&e.__esModule?e:{default:e}}const u=new n.default(1),c=new n.default(0);r.default={sign:async function(e,t,r,a,s,o){let f,d,l,h;const p=new n.default.red(a),y=new n.default.red(s),b=r.toRed(p),m=o.toRed(y),g=new n.default(t.subarray(0,s.byteLength())).toRed(y);for(;f=await i.default.getRandomBN(u,s),d=b.redPow(f).fromRed().toRed(y),0===c.cmp(d)||(h=g.redAdd(m.redMul(d)),l=f.toRed(y).redInvm().redMul(h),0===c.cmp(l)););return{r:d.toArrayLike(Uint8Array,"be",s.byteLength()),s:l.toArrayLike(Uint8Array,"be",s.byteLength())}},verify:async function(e,t,r,i,s,o,u,f){if(c.ucmp(t)>=0||t.ucmp(u)>=0||c.ucmp(r)>=0||r.ucmp(u)>=0)return a.default.print_debug("invalid DSA Signature"),null;const d=new n.default.red(o),l=new n.default.red(u),h=new n.default(i.subarray(0,u.byteLength())),p=r.toRed(l).redInvm();if(0===c.cmp(p))return a.default.print_debug("invalid DSA Signature"),null;const y=h.toRed(l).redMul(p),b=t.toRed(l).redMul(p),m=s.toRed(d).redPow(y.fromRed()),g=f.toRed(d).redPow(b.fromRed());return 0===m.redMul(g).fromRed().mod(u).cmp(t)},validateParams:async function(e,t,r,a,o){e=new n.default(e),t=new n.default(t),r=new n.default(r),a=new n.default(a);const u=new n.default(1);if(r.lte(u)||r.gte(e))return!1;if(!e.sub(u).mod(t).isZero())return!1;const c=new n.default.red(e),f=r.toRed(c);if(!f.redPow(t).eq(u))return!1;const d=t.bitLength();if(d<150||!(await s.default.isProbablePrime(t,null,32)))return!1;o=new n.default(o);const l=await i.default.getRandomBN(new n.default(2).shln(d-1),new n.default(2).shln(d)),h=t.mul(l).add(o);return!!a.eq(f.redPow(h))}}},{"../../util":158,"../random":109,"./prime":107,"bn.js":16}],99:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=a(e("bn.js")),i=a(e("../random"));function a(e){return e&&e.__esModule?e:{default:e}}const s=new n.default(0);r.default={encrypt:async function(e,t,r,a){const o=new n.default.red(t),u=e.toRed(o),c=r.toRed(o),f=a.toRed(o),d=await i.default.getRandomBN(s,t);return{c1:c.redPow(d).fromRed(),c2:f.redPow(d).redMul(u).fromRed()}},decrypt:async function(e,t,r,i){const a=new n.default.red(r),s=e.toRed(a),o=t.toRed(a);return s.redPow(i).redInvm().redMul(o).fromRed()},validateParams:async function(e,t,r,a){e=new n.default(e),t=new n.default(t),r=new n.default(r);const s=new n.default(1);if(t.lte(s)||t.gte(e))return!1;const o=e.subn(1).bitLength();if(o<1023)return!1;const u=new n.default.red(e),c=t.toRed(u);if(!c.redPow(e.subn(1)).eq(s))return!1;let f=t;const d=new n.default(1),l=new n.default(2).shln(17);for(;d.lt(l);){if((f=f.mul(t).mod(e)).eqn(1))return!1;d.iaddn(1)}a=new n.default(a);const h=await i.default.getRandomBN(new n.default(2).shln(o-1),new n.default(2).shln(o)),p=e.subn(1).mul(h).add(a);return!!r.eq(c.redPow(p))}}},{"../random":109,"bn.js":16}],100:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.validateStandardParams=r.privateToJwk=r.rawPublicToJwk=r.jwkToRawPublic=r.getPreferredHashAlgo=r.generate=r.nodeCurves=r.webCurves=r.curves=void 0;var n=f(e("bn.js")),i=f(e("tweetnacl/nacl-fast-light.js")),a=f(e("../../random")),s=f(e("../../../enums")),o=f(e("../../../util")),u=f(e("../../../type/oid")),c=e("./indutnyKey");function f(e){return e&&e.__esModule?e:{default:e}}const d=o.default.getWebCrypto(),l=o.default.getNodeCrypto(),h={p256:"P-256",p384:"P-384",p521:"P-521"},p=l?l.getCurves():[],y=l?{secp256k1:p.includes("secp256k1")?"secp256k1":void 0,p256:p.includes("prime256v1")?"prime256v1":void 0,p384:p.includes("secp384r1")?"secp384r1":void 0,p521:p.includes("secp521r1")?"secp521r1":void 0,ed25519:p.includes("ED25519")?"ED25519":void 0,curve25519:p.includes("X25519")?"X25519":void 0,brainpoolP256r1:p.includes("brainpoolP256r1")?"brainpoolP256r1":void 0,brainpoolP384r1:p.includes("brainpoolP384r1")?"brainpoolP384r1":void 0,brainpoolP512r1:p.includes("brainpoolP512r1")?"brainpoolP512r1":void 0}:{},b={p256:{oid:[6,8,42,134,72,206,61,3,1,7],keyType:s.default.publicKey.ecdsa,hash:s.default.hash.sha256,cipher:s.default.symmetric.aes128,node:y.p256,web:h.p256,payloadSize:32,sharedSize:256},p384:{oid:[6,5,43,129,4,0,34],keyType:s.default.publicKey.ecdsa,hash:s.default.hash.sha384,cipher:s.default.symmetric.aes192,node:y.p384,web:h.p384,payloadSize:48,sharedSize:384},p521:{oid:[6,5,43,129,4,0,35],keyType:s.default.publicKey.ecdsa,hash:s.default.hash.sha512,cipher:s.default.symmetric.aes256,node:y.p521,web:h.p521,payloadSize:66,sharedSize:528},secp256k1:{oid:[6,5,43,129,4,0,10],keyType:s.default.publicKey.ecdsa,hash:s.default.hash.sha256,cipher:s.default.symmetric.aes128,node:y.secp256k1,payloadSize:32},ed25519:{oid:[6,9,43,6,1,4,1,218,71,15,1],keyType:s.default.publicKey.eddsa,hash:s.default.hash.sha512,node:!1,payloadSize:32},curve25519:{oid:[6,10,43,6,1,4,1,151,85,1,5,1],keyType:s.default.publicKey.ecdh,hash:s.default.hash.sha256,cipher:s.default.symmetric.aes128,node:!1,payloadSize:32},brainpoolP256r1:{oid:[6,9,43,36,3,3,2,8,1,1,7],keyType:s.default.publicKey.ecdsa,hash:s.default.hash.sha256,cipher:s.default.symmetric.aes128,node:y.brainpoolP256r1,payloadSize:32},brainpoolP384r1:{oid:[6,9,43,36,3,3,2,8,1,1,11],keyType:s.default.publicKey.ecdsa,hash:s.default.hash.sha384,cipher:s.default.symmetric.aes192,node:y.brainpoolP384r1,payloadSize:48},brainpoolP512r1:{oid:[6,9,43,36,3,3,2,8,1,1,13],keyType:s.default.publicKey.ecdsa,hash:s.default.hash.sha512,cipher:s.default.symmetric.aes256,node:y.brainpoolP512r1,payloadSize:64}};function m(e,t){try{(o.default.isArray(e)||o.default.isUint8Array(e))&&(e=new u.default(e)),e instanceof u.default&&(e=e.getName()),this.name=s.default.write(s.default.curve,e)}catch(r){throw new Error("Not valid curve")}t=t||b[this.name],this.keyType=t.keyType,this.oid=t.oid,this.hash=t.hash,this.cipher=t.cipher,this.node=t.node&&b[this.name],this.web=t.web&&b[this.name],this.payloadSize=t.payloadSize,this.web&&o.default.getWebCrypto()?this.type="web":this.node&&o.default.getNodeCrypto()?this.type="node":"curve25519"===this.name?this.type="curve25519":"ed25519"===this.name&&(this.type="ed25519")}function g(e){const t=o.default.b64_to_Uint8Array(e.x),r=o.default.b64_to_Uint8Array(e.y),n=new Uint8Array(t.length+r.length+1);return n[0]=4,n.set(t,1),n.set(r,t.length+1),n}function w(e,t,r){const n=e,i=r.slice(1,n+1),a=r.slice(n+1,2*n+1);return{kty:"EC",crv:t,x:o.default.Uint8Array_to_b64(i,!0),y:o.default.Uint8Array_to_b64(a,!0),ext:!0}}m.prototype.genKeyPair=async function(){let e;switch(this.type){case"web":try{return await async function(e){const t=await d.generateKey({name:"ECDSA",namedCurve:h[e]},!0,["sign","verify"]),r=await d.exportKey("jwk",t.privateKey);return{publicKey:g(await d.exportKey("jwk",t.publicKey)),privateKey:o.default.b64_to_Uint8Array(r.d,!0)}}(this.name)}catch(r){o.default.print_debug_error("Browser did not support generating ec key "+r.message);break}case"node":return async function(e){const t=l.createECDH(y[e]);return await t.generateKeys(),{publicKey:new Uint8Array(t.getPublicKey()),privateKey:new Uint8Array(t.getPrivateKey())}}(this.name);case"curve25519":{const t=await a.default.getRandomBytes(32);t[0]=127&t[0]|64,t[31]&=248;const r=t.slice().reverse();return e=i.default.box.keyPair.fromSecretKey(r),{publicKey:o.default.concatUint8Array([new Uint8Array([64]),e.publicKey]),privateKey:t}}case"ed25519":{const e=await a.default.getRandomBytes(32),t=i.default.sign.keyPair.fromSeed(e);return{publicKey:o.default.concatUint8Array([new Uint8Array([64]),t.publicKey]),privateKey:e}}}const t=await(0,c.getIndutnyCurve)(this.name);return e=await t.genKeyPair({entropy:o.default.Uint8Array_to_str(await a.default.getRandomBytes(32))}),{publicKey:new Uint8Array(e.getPublic("array",!1)),privateKey:e.getPrivate().toArrayLike(Uint8Array)}},r.default=m,r.curves=b,r.webCurves=h,r.nodeCurves=y,r.generate=async function(e){e=new m(e);const t=await e.genKeyPair();return{oid:e.oid,Q:new n.default(t.publicKey),d:new n.default(t.privateKey),hash:e.hash,cipher:e.cipher}},r.getPreferredHashAlgo=function(e){return b[s.default.write(s.default.curve,e.toHex())].hash},r.jwkToRawPublic=g,r.rawPublicToJwk=w,r.privateToJwk=function(e,t,r,n){const i=w(e,t,r);return i.d=o.default.Uint8Array_to_b64(n,!0),i},r.validateStandardParams=async function(e,t,r,a){const u={p256:!0,p384:!0,p521:!0,secp256k1:!0,curve25519:e===s.default.publicKey.ecdh,brainpoolP256r1:!0,brainpoolP384r1:!0,brainpoolP512r1:!0},f=t.getName();if(!u[f])return!1;if("curve25519"===f){a=a.slice().reverse();const e=i.default.box.keyPair.fromSecretKey(a).publicKey;r=new Uint8Array(r);const t=new Uint8Array([64,...e]);return!!o.default.equalsUint8Array(t,r)}const d=await(0,c.getIndutnyCurve)(f);try{r=(0,c.keyFromPublic)(d,r).getPublic()}catch(l){return!1}return a=new n.default(a),!!(0,c.keyFromPrivate)(d,a).getPublic().eq(r)}},{"../../../enums":113,"../../../type/oid":156,"../../../util":158,"../../random":109,"./indutnyKey":105,"bn.js":16,"tweetnacl/nacl-fast-light.js":72}],101:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],n=!0,i=!1,a=void 0;try{for(var s,o=e[Symbol.iterator]();!(n=(s=o.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(u){i=!0,a=u}finally{try{!n&&o.return&&o.return()}finally{if(i)throw a}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=y(e("bn.js")),a=y(e("tweetnacl/nacl-fast-light.js")),s=e("./curves"),o=y(s),u=y(e("../../aes_kw")),c=y(e("../../cipher")),f=y(e("../../random")),d=y(e("../../hash")),l=y(e("../../../enums")),h=y(e("../../../util")),p=e("./indutnyKey");function y(e){return e&&e.__esModule?e:{default:e}}const b=h.default.getWebCrypto(),m=h.default.getNodeCrypto();function g(e,t,r,n){return h.default.concatUint8Array([t.write(),new Uint8Array([e]),r.write(),h.default.str_to_Uint8Array("Anonymous Sender "),n.subarray(0,20)])}async function w(e,t,r,n,i=!1,a=!1){let s;if(i){for(s=0;s=0&&0===t[s];s--);t=t.subarray(0,s+1)}return(await d.default.digest(e,h.default.concatUint8Array([new Uint8Array([0,0,0,1]),t,n]))).subarray(0,r)}async function _(e,t){switch(e.type){case"curve25519":{const n=await f.default.getRandomBytes(32);var r=await v(e,t,null,n);const i=r.secretKey,s=r.sharedKey;let o=a.default.box.keyPair.fromSecretKey(i).publicKey;return{publicKey:o=h.default.concatUint8Array([new Uint8Array([64]),o]),sharedKey:s}}case"web":if(e.web&&h.default.getWebCrypto())try{return await A(e,t)}catch(n){h.default.print_debug_error(n)}break;case"node":return x(e,t)}return E(e,t)}async function v(e,t,r,n){if(n.length!==e.payloadSize){const t=new Uint8Array(e.payloadSize);t.set(n,e.payloadSize-n.length),n=t}switch(e.type){case"curve25519":{const e=n.slice().reverse();return{secretKey:e,sharedKey:a.default.scalarMult(e,t.subarray(1))}}case"web":if(e.web&&h.default.getWebCrypto())try{return await k(e,t,r,n)}catch(i){h.default.print_debug_error(i)}break;case"node":return P(e,t,n)}return S(e,t,n)}async function k(e,t,r,i){const a=(0,s.privateToJwk)(e.payloadSize,e.web.web,r,i);let o=b.importKey("jwk",a,{name:"ECDH",namedCurve:e.web.web},!0,["deriveKey","deriveBits"]);const u=(0,s.rawPublicToJwk)(e.payloadSize,e.web.web,t);let c=b.importKey("jwk",u,{name:"ECDH",namedCurve:e.web.web},!0,[]);var f=await Promise.all([o,c]),d=n(f,2);o=d[0],c=d[1];let l=b.deriveBits({name:"ECDH",namedCurve:e.web.web,public:c},o,e.web.sharedSize),p=b.exportKey("jwk",o);var y=await Promise.all([l,p]),m=n(y,2);l=m[0],p=m[1];const g=new Uint8Array(l);return{secretKey:h.default.b64_to_Uint8Array(p.d,!0),sharedKey:g}}async function A(e,t){const r=(0,s.rawPublicToJwk)(e.payloadSize,e.web.web,t);let i=b.generateKey({name:"ECDH",namedCurve:e.web.web},!0,["deriveKey","deriveBits"]),a=b.importKey("jwk",r,{name:"ECDH",namedCurve:e.web.web},!1,[]);var o=await Promise.all([i,a]),u=n(o,2);i=u[0],a=u[1];let c=b.deriveBits({name:"ECDH",namedCurve:e.web.web,public:a},i.privateKey,e.web.sharedSize),f=b.exportKey("jwk",i.publicKey);var d=await Promise.all([c,f]),l=n(d,2);c=l[0],f=l[1];const h=new Uint8Array(c);return{publicKey:new Uint8Array((0,s.jwkToRawPublic)(f)),sharedKey:h}}async function S(e,t,r){const n=await(0,p.getIndutnyCurve)(e.name);t=(0,p.keyFromPublic)(n,t),r=(0,p.keyFromPrivate)(n,r);const i=new Uint8Array(r.getPrivate()),a=r.derive(t.getPublic()),s=n.curve.p.byteLength();return{secretKey:i,sharedKey:a.toArrayLike(Uint8Array,"be",s)}}async function E(e,t){const r=await(0,p.getIndutnyCurve)(e.name),n=await e.genKeyPair();t=(0,p.keyFromPublic)(r,t);const i=(0,p.keyFromPrivate)(r,n.privateKey),a=n.publicKey,s=i.derive(t.getPublic()),o=r.curve.p.byteLength();return{publicKey:a,sharedKey:s.toArrayLike(Uint8Array,"be",o)}}async function P(e,t,r){const n=m.createECDH(e.node.node);n.setPrivateKey(r);const i=new Uint8Array(n.computeSecret(t));return{secretKey:new Uint8Array(n.getPrivateKey()),sharedKey:i}}async function x(e,t){const r=m.createECDH(e.node.node);r.generateKeys();const n=new Uint8Array(r.computeSecret(t));return{publicKey:new Uint8Array(r.getPublicKey()),sharedKey:n}}r.default={encrypt:async function(e,t,r,n,i){const a=new o.default(e);var s=await _(a,n);const f=s.publicKey,d=s.sharedKey,h=g(l.default.publicKey.ecdh,e,t,i),p=l.default.read(l.default.symmetric,t.cipher),y=await w(t.hash,d,c.default[p].keySize,h);return{publicKey:f,wrappedKey:u.default.wrap(y,r.toString())}},decrypt:async function(e,t,r,n,a,s,f){const d=new o.default(e),h=(await v(d,r,a,s)).sharedKey,p=g(l.default.publicKey.ecdh,e,t,f),y=l.default.read(l.default.symmetric,t.cipher);let b;for(let o=0;o<3;o++)try{const e=await w(t.hash,h,c.default[y].keySize,p,1===o,2===o);return new i.default(u.default.unwrap(e,n))}catch(m){b=m}throw b},genPublicEphemeralKey:_,genPrivateEphemeralKey:v,buildEcdhParam:g,kdf:w,webPublicEphemeralKey:A,webPrivateEphemeralKey:k,ellipticPublicEphemeralKey:E,ellipticPrivateEphemeralKey:S,nodePublicEphemeralKey:x,nodePrivateEphemeralKey:P,validateParams:async function(e,t,r){return(0,s.validateStandardParams)(l.default.publicKey.ecdh,e,t,r)},parseParams:function(e){if(e.length<3||e.length>4)throw new Error("Unexpected number of parameters");const t=e[0],r=new o.default(t),n={oid:t};return n.Q=e[1].toUint8Array(),n.kdfParams=e[2],4===e.length&&(n.d=e[3].toUint8Array("be",r.payloadSize)),n}}},{"../../../enums":113,"../../../util":158,"../../aes_kw":80,"../../cipher":86,"../../hash":92,"../../random":109,"./curves":100,"./indutnyKey":105,"bn.js":16,"tweetnacl/nacl-fast-light.js":72}],102:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=d(e("bn.js")),i=d(e("../../../enums")),a=d(e("../../../util")),s=d(e("../../random")),o=d(e("../../hash")),u=e("./curves"),c=d(u),f=e("./indutnyKey");function d(e){return e&&e.__esModule?e:{default:e}}const l=a.default.getWebCrypto(),h=a.default.getNodeCrypto();async function p(e,t,r,n,s,o){const f=new c.default(e);if(r&&!a.default.isStream(r)){const e={publicKey:n,privateKey:s};switch(f.type){case"web":try{return await async function(e,t,r,n){const a=e.payloadSize,s=(0,u.privateToJwk)(e.payloadSize,u.webCurves[e.name],n.publicKey,n.privateKey),o=await l.importKey("jwk",s,{name:"ECDSA",namedCurve:u.webCurves[e.name],hash:{name:i.default.read(i.default.webHash,e.hash)}},!1,["sign"]),c=new Uint8Array(await l.sign({name:"ECDSA",namedCurve:u.webCurves[e.name],hash:{name:i.default.read(i.default.webHash,t)}},o,r));return{r:c.slice(0,a),s:c.slice(a,a<<1)}}(f,t,r,e)}catch(d){if("p521"!==f.name&&("DataError"===d.name||"OperationError"===d.name))throw d;a.default.print_debug_error("Browser did not support verifying: "+d.message)}break;case"node":{const n=await async function(e,t,r,n){const a=h.createSign(i.default.read(i.default.hash,t));a.write(r),a.end();const s=_.encode({version:1,parameters:e.oid,privateKey:Array.from(n.privateKey),publicKey:{unused:0,data:Array.from(n.publicKey)}},"pem",{label:"EC PRIVATE KEY"});return w.decode(a.sign(s),"der")}(f,t,r,e);return{r:n.r.toArrayLike(Uint8Array),s:n.s.toArrayLike(Uint8Array)}}}}return b(f,o,s)}async function y(e,t,r,s,o,f){const d=new c.default(e);if(s&&!a.default.isStream(s))switch(d.type){case"web":try{return await async function(e,t,{r:r,s:n},s,o){const c=e.payloadSize,f=(0,u.rawPublicToJwk)(e.payloadSize,u.webCurves[e.name],o),d=await l.importKey("jwk",f,{name:"ECDSA",namedCurve:u.webCurves[e.name],hash:{name:i.default.read(i.default.webHash,e.hash)}},!1,["verify"]),h=a.default.concatUint8Array([new Uint8Array(c-r.length),r,new Uint8Array(c-n.length),n]).buffer;return l.verify({name:"ECDSA",namedCurve:u.webCurves[e.name],hash:{name:i.default.read(i.default.webHash,t)}},d,h,s)}(d,t,r,s,o)}catch(p){if("p521"!==d.name&&("DataError"===p.name||"OperationError"===p.name))throw p;a.default.print_debug_error("Browser did not support verifying: "+p.message)}break;case"node":return async function(e,t,{r:r,s:a},s,o){const u=h.createVerify(i.default.read(i.default.hash,t));u.write(s),u.end();const c=k.encode({algorithm:{algorithm:[1,2,840,10045,2,1],parameters:e.oid},subjectPublicKey:{unused:0,data:Array.from(o)}},"pem",{label:"PUBLIC KEY"}),f=w.encode({r:new n.default(r),s:new n.default(a)},"der");try{return u.verify(c,f)}catch(p){return!1}}(d,t,r,s,o)}return m(d,r,void 0===t?s:f,o)}async function b(e,t,r){const n=await(0,f.getIndutnyCurve)(e.name),i=(0,f.keyFromPrivate)(n,r).sign(t);return{r:i.r.toArrayLike(Uint8Array),s:i.s.toArrayLike(Uint8Array)}}async function m(e,t,r,n){const i=await(0,f.getIndutnyCurve)(e.name);return(0,f.keyFromPublic)(i,n).verify(r,t)}r.default={sign:p,verify:y,ellipticVerify:m,ellipticSign:b,validateParams:async function(e,t,r){const n=new c.default(e);if(n.keyType!==i.default.publicKey.ecdsa)return!1;switch(n.type){case"web":case"node":{const n=await s.default.getRandomBytes(8),u=i.default.hash.sha256,c=await o.default.digest(u,n);try{const i=await p(e,u,n,t,r,c);return await y(e,u,i,n,t,c)}catch(a){return!1}}default:return(0,u.validateStandardParams)(i.default.publicKey.ecdsa,e,t,r)}},parseParams:function(e){if(e.length<2||e.length>3)throw new Error("Unexpected number of parameters");const t=e[0],r=new c.default(t),n={oid:t};return n.Q=e[1].toUint8Array(),3===e.length&&(n.d=e[2].toUint8Array("be",r.payloadSize)),n}};const g=h?e("asn1.js"):void 0,w=h?g.define("ECDSASignature",function(){this.seq().obj(this.key("r").int(),this.key("s").int())}):void 0,_=h?g.define("ECPrivateKey",function(){this.seq().obj(this.key("version").int(),this.key("privateKey").octstr(),this.key("parameters").explicit(0).optional().any(),this.key("publicKey").explicit(1).optional().bitstr())}):void 0,v=h?g.define("AlgorithmIdentifier",function(){this.seq().obj(this.key("algorithm").objid(),this.key("parameters").optional().any())}):void 0,k=h?g.define("SubjectPublicKeyInfo",function(){this.seq().obj(this.key("algorithm").use(v),this.key("subjectPublicKey").bitstr())}):void 0},{"../../../enums":113,"../../../util":158,"../../hash":92,"../../random":109,"./curves":100,"./indutnyKey":105,"asn1.js":"asn1.js","bn.js":16}],103:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=s(e("hash.js/lib/hash/sha/512")),i=s(e("tweetnacl/nacl-fast-light.js")),a=s(e("../../../util"));function s(e){return e&&e.__esModule?e:{default:e}}i.default.hash=(e=>new Uint8Array((0,n.default)().update(e).digest())),r.default={sign:async function(e,t,r,n,s,o){const u=a.default.concatUint8Array([s,n.subarray(1)]),c=i.default.sign.detached(o,u);return{R:c.subarray(0,32),S:c.subarray(32)}},verify:async function(e,t,{R:r,S:n},s,o,u){const c=a.default.concatUint8Array([r,n]);return i.default.sign.detached.verify(u,c,o.subarray(1))},validateParams:async function(e,t,r){if("ed25519"!==e.getName())return!1;const n=i.default.sign.keyPair.fromSeed(r).publicKey,s=new Uint8Array([64,...n]);return a.default.equalsUint8Array(t,s)},parseParams:function(e){if(e.length<2||e.length>3)throw new Error("Unexpected number of parameters");const t={oid:e[0],Q:e[1].toUint8Array("be",33)};return 3===e.length&&(t.seed=e[2].toUint8Array("be",32)),t}}},{"../../../util":158,"hash.js/lib/hash/sha/512":43,"tweetnacl/nacl-fast-light.js":72}],104:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("./curves"),i=u(n),a=u(e("./ecdsa")),s=u(e("./eddsa")),o=u(e("./ecdh"));function u(e){return e&&e.__esModule?e:{default:e}}r.default={Curve:i.default,ecdh:o.default,ecdsa:a.default,eddsa:s.default,generate:n.generate,getPreferredHashAlgo:n.getPreferredHashAlgo}},{"./curves":100,"./ecdh":101,"./ecdsa":102,"./eddsa":103}],105:[function(e,t,r){(function(t){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.keyFromPrivate=function(e,t){return e.keyPair({priv:t})},r.keyFromPublic=function(e,t){const r=e.keyPair({pub:t});if(!0!==r.validate().result)throw new Error("Invalid elliptic public key");return r},r.getIndutnyCurve=async function(r){if(!i.default.use_indutny_elliptic)throw new Error("This curve is only supported in the full build of OpenPGP.js");return new((await function(){if(!i.default.external_indutny_elliptic)return e("elliptic");if(a.default.detectNode())return e(i.default.indutny_elliptic_path);o||(o=async function(){const e=i.default.indutny_elliptic_path,r=i.default.indutny_elliptic_fetch_options,a=(0,n.dl)(e,r).catch(()=>(0,n.dl)(e,r)),s=await a,o=URL.createObjectURL(new Blob([s],{type:"text/javascript"}));if(await(0,n.loadScript)(o),URL.revokeObjectURL(o),!t.openpgp.elliptic)throw new Error("Elliptic library failed to load correctly");return t.openpgp.elliptic}().catch(e=>{throw o=void 0,e}));return o}()).ec)(r)};var n=e("../../../lightweight_helper"),i=s(e("../../../config")),a=s(e("../../../util"));function s(e){return e&&e.__esModule?e:{default:e}}let o}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../../../config":79,"../../../lightweight_helper":125,"../../../util":158,elliptic:18}],106:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=u(e("tweetnacl/nacl-fast-light.js")),i=u(e("./rsa")),a=u(e("./elgamal")),s=u(e("./elliptic")),o=u(e("./dsa"));function u(e){return e&&e.__esModule?e:{default:e}}r.default={rsa:i.default,elgamal:a.default,elliptic:s.default,dsa:o.default,nacl:n.default}},{"./dsa":98,"./elgamal":99,"./elliptic":104,"./rsa":108,"tweetnacl/nacl-fast-light.js":72}],107:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=a(e("bn.js")),i=a(e("../random"));function a(e){return e&&e.__esModule?e:{default:e}}async function s(e,t,r){return!(t&&!e.subn(1).gcd(t).eqn(1))&&(!!u(e)&&(!!o(e)&&!!(await f(e,r))))}function o(e,t){return 0===(t=t||new n.default(2)).toRed(n.default.mont(e)).redPow(e.subn(1)).fromRed().cmpn(1)}function u(e){return c.every(t=>0!==e.modn(t))}r.default={randomProbablePrime:async function(e,t,r){const a=new n.default(1).shln(e-1),o=new n.default(30),u=[1,6,5,4,3,2,1,4,3,2,1,2,1,4,3,2,1,2,1,4,3,2,1,6,5,4,3,2,1,2];let c=await i.default.getRandomBN(a,a.shln(1)),f=c.mod(o).toNumber();do{c.iaddn(u[f]),f=(f+u[f])%u.length,c.bitLength()>e&&(c=c.mod(a.shln(1)).iadd(a),f=c.mod(o).toNumber())}while(!(await s(c,t,r)));return c},isProbablePrime:s,fermat:o,millerRabin:f,divisionTest:u};const c=[7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699,2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909,2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037,3041,3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,3167,3169,3181,3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,3271,3299,3301,3307,3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389,3391,3407,3413,3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517,3527,3529,3533,3539,3541,3547,3557,3559,3571,3581,3583,3593,3607,3613,3617,3623,3631,3637,3643,3659,3671,3673,3677,3691,3697,3701,3709,3719,3727,3733,3739,3761,3767,3769,3779,3793,3797,3803,3821,3823,3833,3847,3851,3853,3863,3877,3881,3889,3907,3911,3917,3919,3923,3929,3931,3943,3947,3967,3989,4001,4003,4007,4013,4019,4021,4027,4049,4051,4057,4073,4079,4091,4093,4099,4111,4127,4129,4133,4139,4153,4157,4159,4177,4201,4211,4217,4219,4229,4231,4241,4243,4253,4259,4261,4271,4273,4283,4289,4297,4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,4421,4423,4441,4447,4451,4457,4463,4481,4483,4493,4507,4513,4517,4519,4523,4547,4549,4561,4567,4583,4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,4663,4673,4679,4691,4703,4721,4723,4729,4733,4751,4759,4783,4787,4789,4793,4799,4801,4813,4817,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933,4937,4943,4951,4957,4967,4969,4973,4987,4993,4999];async function f(e,t,r){const a=e.bitLength(),s=n.default.mont(e),o=new n.default(1).toRed(s);t||(t=Math.max(1,a/48|0));const u=e.subn(1),c=u.toRed(s);let f=0;for(;!u.testn(f);)f++;const d=e.shrn(f);for(;t>0;t--){let e,t=(r?r():await i.default.getRandomBN(new n.default(2),u)).toRed(s).redPow(d);if(!t.eq(o)&&!t.eq(c)){for(e=1;eh.generateKeyPair("rsa",t,(t,n,i)=>{t?r(t):e(b.decode(i,"der"))}));return{n:n.modulus,e:n.publicExponent,d:n.privateExponent,p:n.prime2,q:n.prime1,u:n.coefficient}}let s=await i.default.randomProbablePrime(e-(e>>1),r,40),u=await i.default.randomProbablePrime(e>>1,r,40);if(s.cmp(u)<0){var c=[s,u];u=c[0],s=c[1]}const f=u.subn(1).mul(s.subn(1));return{n:u.mul(s),e:r,d:r.invm(f),p:u,q:s,u:u.invm(s)}},validateParams:async function(e,t,r,i,s,o){if(e=new n.default(e),i=new n.default(i),s=new n.default(s),!i.mul(s).eq(e))return!1;const u=new n.default(1),c=new n.default(2);if(o=new n.default(o),!i.mul(o).umod(s).eq(u))return!1;t=new n.default(t),r=new n.default(r);const f=await a.default.getRandomBN(c,c.shln(e.bitLength()/3)),d=f.mul(r).mul(t);return!(!d.umod(i.sub(u)).eq(f)||!d.umod(s.sub(u)).eq(f))},bnSign:async function(e,t,r,i){t=new n.default(t);const a=new n.default(await u.default.emsa.encode(e,i,t.byteLength()),16);if(r=new n.default(r),t.cmp(a)<=0)throw new Error("Message size cannot exceed modulus size");const s=new n.default.red(t);return a.toRed(s).redPow(r).toArrayLike(Uint8Array,"be",t.byteLength())},webSign:async function(e,t,r,i,a,s,u,c){const f=function(e,t,r,i,a,s){const u=new n.default(i),c=new n.default(a),f=new n.default(r);let d=f.mod(c.subn(1)),l=f.mod(u.subn(1));return l=l.toArrayLike(Uint8Array),d=d.toArrayLike(Uint8Array),{kty:"RSA",n:o.default.Uint8Array_to_b64(e,!0),e:o.default.Uint8Array_to_b64(t,!0),d:o.default.Uint8Array_to_b64(r,!0),p:o.default.Uint8Array_to_b64(a,!0),q:o.default.Uint8Array_to_b64(i,!0),dp:o.default.Uint8Array_to_b64(d,!0),dq:o.default.Uint8Array_to_b64(l,!0),qi:o.default.Uint8Array_to_b64(s,!0),ext:!0}}(r,i,a,s,u,c),d={name:"RSASSA-PKCS1-v1_5",hash:{name:e}},h=await l.importKey("jwk",f,d,!1,["sign"]);return new Uint8Array(await l.sign({name:"RSASSA-PKCS1-v1_5",hash:e},h,t))},nodeSign:async function(e,t,r,i,a,s,o,u){const f=new n.default(s),d=new n.default(o),l=new n.default(a),p=l.mod(d.subn(1)),y=l.mod(f.subn(1)),m=h.createSign(c.default.read(c.default.hash,e));m.write(t),m.end();const g={version:0,modulus:new n.default(r),publicExponent:new n.default(i),privateExponent:new n.default(a),prime1:new n.default(o),prime2:new n.default(s),exponent1:p,exponent2:y,coefficient:new n.default(u)};if(void 0!==h.createPrivateKey){const e=b.encode(g,"der");return new Uint8Array(m.sign({key:e,format:"der",type:"pkcs1"}))}const w=b.encode(g,"pem",{label:"RSA PRIVATE KEY"});return new Uint8Array(m.sign(w))},bnVerify:async function(e,t,r,i,a){if(r=new n.default(r),t=new n.default(t),i=new n.default(i),r.cmp(t)<=0)throw new Error("Signature size cannot exceed modulus size");const s=new n.default.red(r),c=t.toRed(s).redPow(i).toArrayLike(Uint8Array,"be",r.byteLength()),f=await u.default.emsa.encode(e,a,r.byteLength());return o.default.Uint8Array_to_hex(c)===f},webVerify:async function(e,t,r,n,i){const a=function(e,t){return{kty:"RSA",n:o.default.Uint8Array_to_b64(e,!0),e:o.default.Uint8Array_to_b64(t,!0),ext:!0}}(n,i),s=await l.importKey("jwk",a,{name:"RSASSA-PKCS1-v1_5",hash:{name:e}},!1,["verify"]);return l.verify({name:"RSASSA-PKCS1-v1_5",hash:e},s,r,t)},nodeVerify:async function(e,t,r,i,a){const s=h.createVerify(c.default.read(c.default.hash,e));s.write(t),s.end();const o={modulus:new n.default(i),publicExponent:new n.default(a)};let u;if(void 0!==h.createPrivateKey){u={key:m.encode(o,"der"),format:"der",type:"pkcs1"}}else u=m.encode(o,"pem",{label:"RSA PUBLIC KEY"});try{return await s.verify(u,r)}catch(f){return!1}},nodeEncrypt:async function(e,t,r){const i={modulus:new n.default(t),publicExponent:new n.default(r)};let a;if(void 0!==h.createPrivateKey){a={key:m.encode(i,"der"),format:"der",type:"pkcs1",padding:h.constants.RSA_PKCS1_PADDING}}else{a={key:m.encode(i,"pem",{label:"RSA PUBLIC KEY"}),padding:h.constants.RSA_PKCS1_PADDING}}return new Uint8Array(h.publicEncrypt(a,e))},bnEncrypt:async function(e,t,r){if(t=new n.default(t),e=(e=new f.default(await u.default.eme.encode(o.default.Uint8Array_to_str(e),t.byteLength()))).toBN(),r=new n.default(r),t.cmp(e)<=0)throw new Error("Message size cannot exceed modulus size");const i=new n.default.red(t);return e.toRed(i).redPow(r).toArrayLike(Uint8Array,"be",t.byteLength())},nodeDecrypt:function(e,t,r,i,a,s,u){const c=new n.default(a),f=new n.default(s),d=new n.default(i),l=d.mod(f.subn(1)),p=d.mod(c.subn(1)),y={version:0,modulus:new n.default(t),publicExponent:new n.default(r),privateExponent:new n.default(i),prime1:new n.default(s),prime2:new n.default(a),exponent1:l,exponent2:p,coefficient:new n.default(u)};let m;if(void 0!==h.createPrivateKey){m={key:b.encode(y,"der"),format:"der",type:"pkcs1",padding:h.constants.RSA_PKCS1_PADDING}}else{m={key:b.encode(y,"pem",{label:"RSA PRIVATE KEY"}),padding:h.constants.RSA_PKCS1_PADDING}}return o.default.Uint8Array_to_str(h.privateDecrypt(m,e))},bnDecrypt:async function(e,t,r,i,o,c,d){if(e=new n.default(e),t=new n.default(t),r=new n.default(r),i=new n.default(i),o=new n.default(o),c=new n.default(c),d=new n.default(d),t.cmp(e)<=0)throw new Error("Data too large.");const l=i.mod(c.subn(1)),h=i.mod(o.subn(1)),p=new n.default.red(o),y=new n.default.red(c),b=new n.default.red(t);let m,g;s.default.rsa_blinding&&(m=(g=(await a.default.getRandomBN(new n.default(2),t)).toRed(b)).redInvm().redPow(r),e=e.toRed(b).redMul(m).fromRed());const w=e.toRed(p).redPow(h),_=e.toRed(y).redPow(l).redSub(w.fromRed().toRed(y));let v=d.toRed(y).redMul(_).fromRed().mul(o).add(w).toRed(b);return s.default.rsa_blinding&&(v=v.redMul(g)),u.default.eme.decode(new f.default(v).toString())},prime:i.default}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../../config":79,"../../enums":113,"../../type/mpi":155,"../../util":158,"../pkcs1":96,"../random":109,"./prime":107,"asn1.js":"asn1.js","bn.js":16}],109:[function(e,t,r){(function(t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=i(e("bn.js"));function i(e){return e&&e.__esModule?e:{default:e}}const a=i(e("../util")).default.detectNode()&&e("crypto");function s(){this.buffer=null,this.size=null,this.callback=null}r.default={getRandomBytes:async function(e){const r=new Uint8Array(e);if("undefined"!=typeof crypto&&crypto.getRandomValues)crypto.getRandomValues(r);else if(void 0!==t&&"object"==typeof t.msCrypto&&"function"==typeof t.msCrypto.getRandomValues)t.msCrypto.getRandomValues(r);else if(a){const e=a.randomBytes(r.length);r.set(e)}else{if(!this.randomBuffer.buffer)throw new Error("No secure random number generator available.");await this.randomBuffer.get(r)}return r},getRandomBN:async function(e,t){if(t.cmp(e)<=0)throw new Error("Illegal parameter value: max <= min");const r=t.sub(e),i=r.byteLength();return new n.default(await this.getRandomBytes(i+8)).mod(r).add(e)},randomBuffer:new s},s.prototype.init=function(e,t){this.buffer=new Uint8Array(e),this.size=0,this.callback=t},s.prototype.set=function(e){if(!this.buffer)throw new Error("RandomBuffer is not initialized");if(!(e instanceof Uint8Array))throw new Error("Invalid type: buf not an Uint8Array");const t=this.buffer.length-this.size;e.length>t&&(e=e.subarray(0,t)),this.buffer.set(e,this.size),this.size+=e.length},s.prototype.get=async function(e){if(!this.buffer)throw new Error("RandomBuffer is not initialized");if(!(e instanceof Uint8Array))throw new Error("Invalid type: buf not an Uint8Array");if(this.size{const r=h?Math.floor(e.length/4):0,n=new Uint32Array(e.buffer,e.byteOffset,r);for(let i=0;i>24&255]^l[1][t>>16&255]^l[2][t>>8&255]^l[3][t>>0&255];for(let i=4*r;i>8^l[0][255&t^e[i]]},()=>new Uint8Array([t,t>>8,t>>16]))}(e);return i.default.encode(t)}const l=[new Array(255),new Array(255),new Array(255),new Array(255)];for(let b=0;b<=255;b++){let e=b<<16;for(let t=0;t<8;t++)e=e<<1^(0!=(8388608&e)?8801531:0);l[0][b]=(16711680&e)>>16|65280&e|(255&e)<<16}for(let b=0;b<=255;b++)l[1][b]=l[0][b]>>8^l[0][255&l[0][b]];for(let b=0;b<=255;b++)l[2][b]=l[1][b]>>8^l[0][255&l[1][b]];for(let b=0;b<=255;b++)l[3][b]=l[2][b]>>8^l[0][255&l[2][b]];const h=function(){const e=new ArrayBuffer(2);return new DataView(e).setInt16(0,255,!0),255===new Int16Array(e)[0]}();function p(e){for(let t=0;t=0&&n!==e.length-1&&(t=e.slice(0,n),r=e.slice(n+1).substr(0,4)),{body:t,checksum:r}}r.default={encode:function(e,t,r,s,u){let c,l;e===a.default.armor.signed&&(c=t.text,l=t.hash,t=t.data);const h=n.default.passiveClone(t),p=[];switch(e){case a.default.armor.multipart_section:p.push("-----BEGIN PGP MESSAGE, PART "+r+"/"+s+"-----\r\n"),p.push(f(u)),p.push(i.default.encode(t)),p.push("=",d(h)),p.push("-----END PGP MESSAGE, PART "+r+"/"+s+"-----\r\n");break;case a.default.armor.multipart_last:p.push("-----BEGIN PGP MESSAGE, PART "+r+"-----\r\n"),p.push(f(u)),p.push(i.default.encode(t)),p.push("=",d(h)),p.push("-----END PGP MESSAGE, PART "+r+"-----\r\n");break;case a.default.armor.signed:p.push("\r\n-----BEGIN PGP SIGNED MESSAGE-----\r\n"),p.push("Hash: "+l+"\r\n\r\n"),p.push(c.replace(/^-/gm,"- -")),p.push("\r\n-----BEGIN PGP SIGNATURE-----\r\n"),p.push(f(u)),p.push(i.default.encode(t)),p.push("=",d(h)),p.push("-----END PGP SIGNATURE-----\r\n");break;case a.default.armor.message:p.push("-----BEGIN PGP MESSAGE-----\r\n"),p.push(f(u)),p.push(i.default.encode(t)),p.push("=",d(h)),p.push("-----END PGP MESSAGE-----\r\n");break;case a.default.armor.public_key:p.push("-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n"),p.push(f(u)),p.push(i.default.encode(t)),p.push("=",d(h)),p.push("-----END PGP PUBLIC KEY BLOCK-----\r\n");break;case a.default.armor.private_key:p.push("-----BEGIN PGP PRIVATE KEY BLOCK-----\r\n"),p.push(f(u)),p.push(i.default.encode(t)),p.push("=",d(h)),p.push("-----END PGP PRIVATE KEY BLOCK-----\r\n");break;case a.default.armor.signature:p.push("-----BEGIN PGP SIGNATURE-----\r\n"),p.push(f(u)),p.push(i.default.encode(t)),p.push("=",d(h)),p.push("-----END PGP SIGNATURE-----\r\n")}return o.default.concat(p)},decode:function(e){return new Promise(async(t,r)=>{try{const u=/^-----[^-]+-----$/m,f=/^[ \f\r\t\u00a0\u2000-\u200a\u202f\u205f\u3000]*$/;let l;const h=[];let b,m,g,w=h,_=[],v=i.default.decode(n.default.transformPair(e,async(e,i)=>{const a=n.default.getReader(e);try{for(;;){let e=await a.readLine();if(void 0===e)throw new Error("Misformed armored text");if(e=o.default.removeTrailingSpaces(e.replace(/[\r\n]/g,"")),l)if(b)m||2!==l||(u.test(e)?(_=_.join("\r\n"),m=!0,p(w),w=[],b=!1):_.push(e.replace(/^- /,"")));else if(u.test(e)&&r(new Error("Mandatory blank line missing between armor headers and armor data")),f.test(e)){if(p(w),b=!0,m||2!==l){t({text:_,data:v,headers:h,type:l});break}}else w.push(e);else u.test(e)&&(l=c(e))}}catch(k){return void r(k)}const s=n.default.getWriter(i);try{for(;;){await s.ready;var d=await a.read();const e=d.done,t=d.value;if(e)throw new Error("Misformed armored text");const r=t+"";if(-1!==r.indexOf("=")||-1!==r.indexOf("-")){let e=await a.readToEnd();e.length||(e=""),e=r+e;const t=(e=o.default.removeTrailingSpaces(e.replace(/\r/g,""))).split(u);if(1===t.length)throw new Error("Misformed armored text");const n=y(t[0].slice(0,-1));g=n.checksum,await s.write(n.body);break}await s.write(r)}await s.ready,await s.close()}catch(k){await s.abort(k)}}));v=n.default.transformPair(v,async(e,t)=>{const r=n.default.readToEnd(d(n.default.passiveClone(e)));r.catch(()=>{}),await n.default.pipe(e,t,{preventClose:!0});const i=n.default.getWriter(t);try{const e=(await r).replace("\r\n","");if(g!==e&&(g||s.default.checksum_required))throw new Error("Ascii armor integrity check on message failed: '"+g+"' should be '"+e+"'");await i.ready,await i.close()}catch(a){await i.abort(a)}})}catch(a){r(a)}})}}},{"../config":79,"../enums.js":113,"../util":158,"./base64.js":112,"web-stream-tools":75}],112:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=a(e("web-stream-tools")),i=a(e("../util"));function a(e){return e&&e.__esModule?e:{default:e}}const s=i.default.getNodeBuffer();let o,u;s?(o=(e=>s.from(e).toString("base64")),u=(e=>{const t=s.from(e,"base64");return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)})):(o=(e=>btoa(i.default.Uint8Array_to_str(e))),u=(e=>i.default.str_to_Uint8Array(atob(e)))),r.default={encode:function(e){let t=new Uint8Array;return n.default.transform(e,e=>{t=i.default.concatUint8Array([t,e]);const r=[],n=Math.floor(t.length/45),a=45*n,s=o(t.subarray(0,a));for(let t=0;tt.length?o(t)+"\r\n":"")},decode:function(e){let t="";return n.default.transform(e,e=>{t+=e;let r=0;const n=[" ","\t","\r","\n"];for(let s=0;s0&&(i-r)%4!=0;i--)n.includes(t[i])&&r--;const a=u(t.substr(0,i));return t=t.substr(i),a},()=>u(t))}}},{"../util":158,"web-stream-tools":75}],113:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});const n=Symbol("byValue");r.default={curve:{p256:"p256","P-256":"p256",secp256r1:"p256",prime256v1:"p256","1.2.840.10045.3.1.7":"p256","2a8648ce3d030107":"p256","2A8648CE3D030107":"p256",p384:"p384","P-384":"p384",secp384r1:"p384","1.3.132.0.34":"p384","2b81040022":"p384","2B81040022":"p384",p521:"p521","P-521":"p521",secp521r1:"p521","1.3.132.0.35":"p521","2b81040023":"p521","2B81040023":"p521",secp256k1:"secp256k1","1.3.132.0.10":"secp256k1","2b8104000a":"secp256k1","2B8104000A":"secp256k1",ED25519:"ed25519",ed25519:"ed25519",Ed25519:"ed25519","1.3.6.1.4.1.11591.15.1":"ed25519","2b06010401da470f01":"ed25519","2B06010401DA470F01":"ed25519",X25519:"curve25519",cv25519:"curve25519",curve25519:"curve25519",Curve25519:"curve25519","1.3.6.1.4.1.3029.1.5.1":"curve25519","2b060104019755010501":"curve25519","2B060104019755010501":"curve25519",brainpoolP256r1:"brainpoolP256r1","1.3.36.3.3.2.8.1.1.7":"brainpoolP256r1","2b2403030208010107":"brainpoolP256r1","2B2403030208010107":"brainpoolP256r1",brainpoolP384r1:"brainpoolP384r1","1.3.36.3.3.2.8.1.1.11":"brainpoolP384r1","2b240303020801010b":"brainpoolP384r1","2B240303020801010B":"brainpoolP384r1",brainpoolP512r1:"brainpoolP512r1","1.3.36.3.3.2.8.1.1.13":"brainpoolP512r1","2b240303020801010d":"brainpoolP512r1","2B240303020801010D":"brainpoolP512r1"},s2k:{simple:0,salted:1,iterated:3,gnu:101},publicKey:{rsa_encrypt_sign:1,rsa_encrypt:2,rsa_sign:3,elgamal:16,dsa:17,ecdh:18,ecdsa:19,eddsa:22,aedh:23,aedsa:24},symmetric:{plaintext:0,idea:1,"3des":2,tripledes:2,cast5:3,blowfish:4,aes128:7,aes192:8,aes256:9,twofish:10},compression:{uncompressed:0,zip:1,zlib:2,bzip2:3},hash:{md5:1,sha1:2,ripemd:3,sha256:8,sha384:9,sha512:10,sha224:11},webHash:{"SHA-1":2,"SHA-256":8,"SHA-384":9,"SHA-512":10},aead:{eax:1,ocb:2,experimental_gcm:100},packet:{publicKeyEncryptedSessionKey:1,signature:2,symEncryptedSessionKey:3,onePassSignature:4,secretKey:5,publicKey:6,secretSubkey:7,compressed:8,symmetricallyEncrypted:9,marker:10,literal:11,trust:12,userid:13,publicSubkey:14,userAttribute:17,symEncryptedIntegrityProtected:18,modificationDetectionCode:19,symEncryptedAEADProtected:20},literal:{binary:"b".charCodeAt(),text:"t".charCodeAt(),utf8:"u".charCodeAt(),mime:"m".charCodeAt()},signature:{binary:0,text:1,standalone:2,cert_generic:16,cert_persona:17,cert_casual:18,cert_positive:19,cert_revocation:48,subkey_binding:24,key_binding:25,key:31,key_revocation:32,subkey_revocation:40,timestamp:64,third_party:80},signatureSubpacket:{signature_creation_time:2,signature_expiration_time:3,exportable_certification:4,trust_signature:5,regular_expression:6,revocable:7,key_expiration_time:9,placeholder_backwards_compatibility:10,preferred_symmetric_algorithms:11,revocation_key:12,issuer:16,notation_data:20,preferred_hash_algorithms:21,preferred_compression_algorithms:22,key_server_preferences:23,preferred_key_server:24,primary_user_id:25,policy_uri:26,key_flags:27,signers_user_id:28,reason_for_revocation:29,features:30,signature_target:31,embedded_signature:32,issuer_fingerprint:33,preferred_aead_algorithms:34},keyFlags:{certify_keys:1,sign_data:2,encrypt_communication:4,encrypt_storage:8,split_private_key:16,authentication:32,shared_private_key:128},armor:{multipart_section:0,multipart_last:1,signed:2,message:3,public_key:4,private_key:5,signature:6},reasonForRevocation:{no_reason:0,key_superseded:1,key_compromised:2,key_retired:3,userid_invalid:32},features:{modification_detection:1,aead:2,v5_keys:4},write:function(e,t){if("number"==typeof t&&(t=this.read(e,t)),void 0!==e[t])return e[t];throw new Error("Invalid enum value.")},read:function(e,t){if(e[n]||(e[n]=[],Object.entries(e).forEach(([t,r])=>{e[n][r]=t})),void 0!==e[n][t])return e[n][t];throw new Error("Invalid enum value.")}}},{}],114:[function(e,t,r){(function(t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=e("./config"),a=(n=i)&&n.__esModule?n:{default:n};function s(r){this._baseUrl=r||a.default.keyserver,this._fetch="function"==typeof t.fetch?t.fetch:e("node-fetch")}s.prototype.lookup=function(e){let t=this._baseUrl+"/pks/lookup?op=get&options=mr&search=";const r=this._fetch;if(e.keyId)t+="0x"+encodeURIComponent(e.keyId);else{if(!e.query)throw new Error("You must provide a query parameter!");t+=encodeURIComponent(e.query)}return r(t).then(function(e){if(200===e.status)return e.text()}).then(function(e){if(e&&!(e.indexOf("-----END PGP PUBLIC KEY BLOCK-----")<0))return e.trim()})},s.prototype.upload=function(e){const t=this._baseUrl+"/pks/add";return(0,this._fetch)(t,{method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},body:"keytext="+encodeURIComponent(e)})},r.default=s}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./config":79,"node-fetch":"node-fetch"}],115:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.lightweight=r.WKD=r.HKP=r.AsyncProxy=r.Keyring=r.crypto=r.config=r.enums=r.armor=r.stream=r.OID=r.KDFParams=r.ECDHSymmetricKey=r.Keyid=r.S2K=r.MPI=r.packet=r.util=r.cleartext=r.message=r.signature=r.key=r.destroyWorker=r.getWorker=r.initWorker=r.decryptSessionKeys=r.encryptSessionKey=r.decryptKey=r.revokeKey=r.reformatKey=r.generateKey=r.verify=r.sign=r.decrypt=r.encrypt=void 0;var n=e("./openpgp");Object.defineProperty(r,"encrypt",{enumerable:!0,get:function(){return n.encrypt}}),Object.defineProperty(r,"decrypt",{enumerable:!0,get:function(){return n.decrypt}}),Object.defineProperty(r,"sign",{enumerable:!0,get:function(){return n.sign}}),Object.defineProperty(r,"verify",{enumerable:!0,get:function(){return n.verify}}),Object.defineProperty(r,"generateKey",{enumerable:!0,get:function(){return n.generateKey}}),Object.defineProperty(r,"reformatKey",{enumerable:!0,get:function(){return n.reformatKey}}),Object.defineProperty(r,"revokeKey",{enumerable:!0,get:function(){return n.revokeKey}}),Object.defineProperty(r,"decryptKey",{enumerable:!0,get:function(){return n.decryptKey}}),Object.defineProperty(r,"encryptSessionKey",{enumerable:!0,get:function(){return n.encryptSessionKey}}),Object.defineProperty(r,"decryptSessionKeys",{enumerable:!0,get:function(){return n.decryptSessionKeys}}),Object.defineProperty(r,"initWorker",{enumerable:!0,get:function(){return n.initWorker}}),Object.defineProperty(r,"getWorker",{enumerable:!0,get:function(){return n.getWorker}}),Object.defineProperty(r,"destroyWorker",{enumerable:!0,get:function(){return n.destroyWorker}});var i=e("./util");Object.defineProperty(r,"util",{enumerable:!0,get:function(){return M(i).default}});var a=e("./packet");Object.defineProperty(r,"packet",{enumerable:!0,get:function(){return M(a).default}});var s=e("./type/mpi");Object.defineProperty(r,"MPI",{enumerable:!0,get:function(){return M(s).default}});var o=e("./type/s2k");Object.defineProperty(r,"S2K",{enumerable:!0,get:function(){return M(o).default}});var u=e("./type/keyid");Object.defineProperty(r,"Keyid",{enumerable:!0,get:function(){return M(u).default}});var c=e("./type/ecdh_symkey");Object.defineProperty(r,"ECDHSymmetricKey",{enumerable:!0,get:function(){return M(c).default}});var f=e("./type/kdf_params");Object.defineProperty(r,"KDFParams",{enumerable:!0,get:function(){return M(f).default}});var d=e("./type/oid");Object.defineProperty(r,"OID",{enumerable:!0,get:function(){return M(d).default}});var l=e("web-stream-tools");Object.defineProperty(r,"stream",{enumerable:!0,get:function(){return M(l).default}});var h=e("./encoding/armor");Object.defineProperty(r,"armor",{enumerable:!0,get:function(){return M(h).default}});var p=e("./enums");Object.defineProperty(r,"enums",{enumerable:!0,get:function(){return M(p).default}});var y=e("./config/config");Object.defineProperty(r,"config",{enumerable:!0,get:function(){return M(y).default}});var b=e("./crypto");Object.defineProperty(r,"crypto",{enumerable:!0,get:function(){return M(b).default}});var m=e("./keyring");Object.defineProperty(r,"Keyring",{enumerable:!0,get:function(){return M(m).default}});var g=e("./worker/async_proxy");Object.defineProperty(r,"AsyncProxy",{enumerable:!0,get:function(){return M(g).default}});var w=e("./hkp");Object.defineProperty(r,"HKP",{enumerable:!0,get:function(){return M(w).default}});var _=e("./wkd");Object.defineProperty(r,"WKD",{enumerable:!0,get:function(){return M(_).default}});var v=x(n),k=x(e("./key")),A=x(e("./signature")),S=x(e("./message")),E=x(e("./cleartext")),P=x(e("./lightweight_helper"));function x(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function M(e){return e&&e.__esModule?e:{default:e}}r.default=v;r.key=k,r.signature=A,r.message=S,r.cleartext=E,r.lightweight=P},{"./cleartext":77,"./config/config":78,"./crypto":94,"./encoding/armor":111,"./enums":113,"./hkp":114,"./key":118,"./keyring":122,"./lightweight_helper":125,"./message":126,"./openpgp":127,"./packet":131,"./signature":151,"./type/ecdh_symkey":152,"./type/kdf_params":153,"./type/keyid":154,"./type/mpi":155,"./type/oid":156,"./type/s2k":157,"./util":158,"./wkd":159,"./worker/async_proxy":160,"web-stream-tools":75}],116:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.generate=async function(e){e.sign=!0,(e=a.sanitizeKeyOptions(e)).subkeys=e.subkeys.map(function(t,r){return a.sanitizeKeyOptions(e.subkeys[r],e)});let t=[a.generateSecretKey(e)];return t=t.concat(e.subkeys.map(a.generateSecretSubkey)),Promise.all(t).then(t=>d(t[0],t.slice(1),e))},r.reformat=async function(e){e=i(e);try{const t=e.privateKey.getKeys().every(e=>e.isDecrypted());t||await e.privateKey.decrypt()}catch(a){throw new Error("Key not decrypted")}const t=e.privateKey.toPacketlist();let r;const n=[];for(let o=0;o({sign:await e.privateKey.getSigningKey(t.getKeyId(),null).catch(()=>{})&&!(await e.privateKey.getEncryptionKey(t.getKeyId(),null).catch(()=>{}))}))));if(e.subkeys.length!==n.length)throw new Error("Number of subkey options does not match number of subkeys");return e.subkeys=e.subkeys.map(function(t,r){return i(e.subkeys[r],e)}),d(r,n,e);function i(e,t={}){return e.keyExpirationTime=e.keyExpirationTime||t.keyExpirationTime,e.passphrase=o.default.isString(e.passphrase)?e.passphrase:t.passphrase,e.date=e.date||t.date,e}},r.read=l,r.readArmored=async function(e){try{const r=await c.default.decode(e);if(r.type!==s.default.armor.public_key&&r.type!==s.default.armor.private_key)throw new Error("Armored text not of type key");return l(r.data)}catch(t){const e={keys:[],err:[]};return e.err.push(t),e}};var n=f(e("../packet")),i=f(e("./key")),a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(e("./helper")),s=f(e("../enums")),o=f(e("../util")),u=f(e("../config")),c=f(e("../encoding/armor"));function f(e){return e&&e.__esModule?e:{default:e}}async function d(e,t,r){r.passphrase&&await e.encrypt(r.passphrase),await Promise.all(t.map(async function(e,t){const n=r.subkeys[t].passphrase;n&&await e.encrypt(n)}));const o=new n.default.List;o.push(e),await Promise.all(r.userIds.map(async function(t,i){function o(e,t){if(t){const r=e.indexOf(t);r>=1&&e.splice(r,1),0!==r&&e.unshift(t)}return e}const c=new n.default.Userid;c.format(t);const f={};f.userId=c,f.key=e;const d=new n.default.Signature(r.date);return d.signatureType=s.default.signature.cert_generic,d.publicKeyAlgorithm=e.algorithm,d.hashAlgorithm=await a.getPreferredHashAlgo(null,e),d.keyFlags=[s.default.keyFlags.certify_keys|s.default.keyFlags.sign_data],d.preferredSymmetricAlgorithms=o([s.default.symmetric.aes256,s.default.symmetric.aes128,s.default.symmetric.aes192,s.default.symmetric.cast5,s.default.symmetric.tripledes],u.default.encryption_cipher),u.default.aead_protect&&(d.preferredAeadAlgorithms=o([s.default.aead.eax,s.default.aead.ocb],u.default.aead_mode)),d.preferredHashAlgorithms=o([s.default.hash.sha256,s.default.hash.sha512,s.default.hash.sha1],u.default.prefer_hash_algorithm),d.preferredCompressionAlgorithms=o([s.default.compression.zlib,s.default.compression.zip,s.default.compression.uncompressed],u.default.compression),0===i&&(d.isPrimaryUserID=!0),u.default.integrity_protect&&(d.features=[0],d.features[0]|=s.default.features.modification_detection),u.default.aead_protect&&(d.features||(d.features=[0]),d.features[0]|=s.default.features.aead),u.default.v5_keys&&(d.features||(d.features=[0]),d.features[0]|=s.default.features.v5_keys),r.keyExpirationTime>0&&(d.keyExpirationTime=r.keyExpirationTime,d.keyNeverExpires=!1),await d.sign(e,f),{userIdPacket:c,signaturePacket:d}})).then(e=>{e.forEach(({userIdPacket:e,signaturePacket:t})=>{o.push(e),o.push(t)})}),await Promise.all(t.map(async function(t,n){const i=r.subkeys[n];return{secretSubkeyPacket:t,subkeySignaturePacket:await a.createBindingSignature(t,e,i)}})).then(e=>{e.forEach(({secretSubkeyPacket:e,subkeySignaturePacket:t})=>{o.push(e),o.push(t)})});const c={key:e};return o.push(await a.createSignaturePacket(c,null,e,{signatureType:s.default.signature.key_revocation,reasonForRevocationFlag:s.default.reasonForRevocation.no_reason,reasonForRevocationString:""},r.date)),r.passphrase&&e.clearPrivateParams(),await Promise.all(t.map(async function(e,t){r.subkeys[t].passphrase&&e.clearPrivateParams()})),new i.default(o)}async function l(e){const t={keys:[]},r=[];try{const o=new n.default.List;await o.read(e);const u=o.indexOfTag(s.default.packet.publicKey,s.default.packet.secretKey);if(0===u.length)throw new Error("No key packet found");for(let e=0;e=0;a--)try{s&&!(e[a].created>=s.created)||e[a].isExpired(i)||!e[a].verified&&!(await e[a].verify(t,r,n))||(s=e[a])}catch(c){o=c}if(!s)throw u.default.wrapError(`Could not find valid ${a.default.read(a.default.signature,r)} signature in key ${t.getKeyId().toHex()}`.replace("cert_generic ","self-").replace("_"," "),o);return s},r.isDataExpired=function(e,t,r=new Date){const n=u.default.normalizeDate(r);if(null!==n){const i=l(e,t);return!(e.created<=n&&n<=i)||t&&t.isExpired(r)}return!1},r.createBindingSignature=async function(e,t,r){const n={};n.key=t,n.bind=e;const s=new i.default.Signature(r.date);s.signatureType=a.default.signature.subkey_binding,s.publicKeyAlgorithm=t.algorithm,s.hashAlgorithm=await f(null,e),r.sign?(s.keyFlags=[a.default.keyFlags.sign_data],s.embeddedSignature=await d(n,null,e,{signatureType:a.default.signature.key_binding},r.date)):s.keyFlags=[a.default.keyFlags.encrypt_communication|a.default.keyFlags.encrypt_storage];r.keyExpirationTime>0&&(s.keyExpirationTime=r.keyExpirationTime,s.keyNeverExpires=!1);return await s.sign(t,n),s},r.getPreferredHashAlgo=f,r.getPreferredAlgo=async function(e,t,r=new Date,n=[]){const i="symmetric"===e?"preferredSymmetricAlgorithms":"preferredAeadAlgorithms",s="symmetric"===e?a.default.symmetric.aes128:a.default.aead.eax,o={};await Promise.all(t.map(async function(e,t){const a=await e.getPrimaryUser(r,n[t]);if(!a.selfCertification[i])return s;a.selfCertification[i].forEach(function(e,t){const r=o[e]||(o[e]={prio:0,count:0,algo:e});r.prio+=64>>t,r.count++})}));let u={prio:0,algo:s};return Object.values(o).forEach(({prio:r,count:n,algo:i})=>{try{i!==a.default[e].plaintext&&i!==a.default[e].idea&&a.default.read(a.default[e],i)&&n===t.length&&r>u.prio&&(u=o[i])}catch(s){}}),u.algo},r.createSignaturePacket=d,r.mergeSignatures=async function(e,t,r,n){(e=e[r])&&(t[r].length?await Promise.all(e.map(async function(e){e.isExpired()||n&&!(await n(e))||t[r].some(function(t){return u.default.equalsUint8Array(t.signature,e.signature)})||t[r].push(e)})):t[r]=e)},r.isDataRevoked=async function(e,t,r,n,i,a,o=new Date){a=a||e;const c=u.default.normalizeDate(o),f=[];if(await Promise.all(n.map(async function(e){try{i&&!e.issuerKeyId.equals(i.issuerKeyId)||s.default.revocations_expire&&e.isExpired(c)||!e.verified&&!(await e.verify(a,t,r))||f.push(e.issuerKeyId)}catch(n){}})),i)return i.revoked=!!f.some(e=>e.equals(i.issuerKeyId))||(i.revoked||!1),i.revoked;return f.length>0},r.getExpirationTime=l,r.isAeadSupported=async function(e,t=new Date,r=[]){let n=!0;return await Promise.all(e.map(async function(e,i){const s=await e.getPrimaryUser(t,r[i]);s.selfCertification.features&&s.selfCertification.features[0]&a.default.features.aead||(n=!1)})),n},r.sanitizeKeyOptions=function(e,t={}){if(e.curve=e.curve||t.curve,e.rsaBits=e.rsaBits||t.rsaBits,e.keyExpirationTime=void 0!==e.keyExpirationTime?e.keyExpirationTime:t.keyExpirationTime,e.passphrase=u.default.isString(e.passphrase)?e.passphrase:t.passphrase,e.date=e.date||t.date,e.sign=e.sign||!1,e.curve){try{e.curve=a.default.write(a.default.curve,e.curve)}catch(r){throw new Error("Not valid curve.")}e.curve!==a.default.curve.ed25519&&e.curve!==a.default.curve.curve25519||(e.curve=e.sign?a.default.curve.ed25519:a.default.curve.curve25519),e.sign?e.algorithm=e.curve===a.default.curve.ed25519?a.default.publicKey.eddsa:a.default.publicKey.ecdsa:e.algorithm=a.default.publicKey.ecdh}else{if(!e.rsaBits)throw new Error("Unrecognized key type");e.algorithm=a.default.publicKey.rsa_encrypt_sign}return e},r.isValidSigningKeyPacket=function(e,t){if(!t.verified||!1!==t.revoked)throw new Error("Signature not verified");return e.algorithm!==a.default.read(a.default.publicKey,a.default.publicKey.rsa_encrypt)&&e.algorithm!==a.default.read(a.default.publicKey,a.default.publicKey.elgamal)&&e.algorithm!==a.default.read(a.default.publicKey,a.default.publicKey.ecdh)&&(!t.keyFlags||0!=(t.keyFlags[0]&a.default.keyFlags.sign_data))},r.isValidEncryptionKeyPacket=function(e,t){if(!t.verified||!1!==t.revoked)throw new Error("Signature not verified");return e.algorithm!==a.default.read(a.default.publicKey,a.default.publicKey.dsa)&&e.algorithm!==a.default.read(a.default.publicKey,a.default.publicKey.rsa_sign)&&e.algorithm!==a.default.read(a.default.publicKey,a.default.publicKey.ecdsa)&&e.algorithm!==a.default.read(a.default.publicKey,a.default.publicKey.eddsa)&&(!t.keyFlags||0!=(t.keyFlags[0]&a.default.keyFlags.encrypt_communication)||0!=(t.keyFlags[0]&a.default.keyFlags.encrypt_storage))};var i=c(e("../packet")),a=c(e("../enums")),s=c(e("../config")),o=c(e("../crypto")),u=c(e("../util"));function c(e){return e&&e.__esModule?e:{default:e}}async function f(e,t,r=new Date,a={}){let u=s.default.prefer_hash_algorithm,c=u;if(e){const t=await e.getPrimaryUser(r,a);if(t.selfCertification.preferredHashAlgorithms)c=n(t.selfCertification.preferredHashAlgorithms,1)[0],u=o.default.hash.getHashByteLength(u)<=o.default.hash.getHashByteLength(c)?c:u}switch(Object.getPrototypeOf(t)){case i.default.SecretKey.prototype:case i.default.PublicKey.prototype:case i.default.SecretSubkey.prototype:case i.default.PublicSubkey.prototype:switch(t.algorithm){case"ecdh":case"ecdsa":case"eddsa":c=o.default.publicKey.elliptic.getPreferredHashAlgo(t.params[0])}}return o.default.hash.getHashByteLength(u)<=o.default.hash.getHashByteLength(c)?c:u}async function d(e,t,r,n,a,s,o=!1,u=!1){if(!r.isDecrypted())throw new Error("Private key is not decrypted.");const c=new i.default.Signature(a);return Object.assign(c,n),c.publicKeyAlgorithm=r.algorithm,c.hashAlgorithm=await f(t,r,a,s),await c.sign(r,e,o,u),c}function l(e,t){let r;return!1===t.keyNeverExpires&&(r=e.created.getTime()+1e3*t.keyExpirationTime),r?new Date(r):1/0}},{"../config":79,"../crypto":94,"../enums":113,"../packet":131,"../util":158}],118:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Key=r.createSignaturePacket=r.getPreferredHashAlgo=r.isAeadSupported=r.getPreferredAlgo=r.reformat=r.read=r.generate=r.readArmored=void 0;var n,i=e("./factory"),a=e("./helper"),s=e("./key.js"),o=(n=s)&&n.__esModule?n:{default:n};r.readArmored=i.readArmored,r.generate=i.generate,r.read=i.read,r.reformat=i.reformat,r.getPreferredAlgo=a.getPreferredAlgo,r.isAeadSupported=a.isAeadSupported,r.getPreferredHashAlgo=a.getPreferredHashAlgo,r.createSignaturePacket=a.createSignaturePacket,r.Key=o.default},{"./factory":116,"./helper":117,"./key.js":119}],119:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=d;var n=f(e("../encoding/armor")),i=f(e("../packet")),a=f(e("../enums")),s=f(e("../util")),o=f(e("./user")),u=f(e("./subkey")),c=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(e("./helper"));function f(e){return e&&e.__esModule?e:{default:e}}function d(e){if(!(this instanceof d))return new d(e);if(this.keyPacket=null,this.revocationSignatures=[],this.directSignatures=[],this.users=[],this.subKeys=[],this.packetlist2structure(e),!this.keyPacket||!this.users.length)throw new Error("Invalid key: need at least key and user ID packet")}Object.defineProperty(d.prototype,"primaryKey",{get(){return this.keyPacket},configurable:!0,enumerable:!0}),d.prototype.packetlist2structure=function(e){let t,r,n;for(let i=0;ie.concat(t.toPacketlist())),this.subKeys.map(t=>e.concat(t.toPacketlist())),e},d.prototype.getSubkeys=function(e=null){const t=[];return this.subKeys.forEach(r=>{e&&!r.getKeyId().equals(e,!0)||t.push(r)}),t},d.prototype.getKeys=function(e=null){const t=[];return e&&!this.getKeyId().equals(e,!0)||t.push(this),t.concat(this.getSubkeys(e))},d.prototype.getKeyIds=function(){return this.getKeys().map(e=>e.getKeyId())},d.prototype.getUserIds=function(){return this.users.map(e=>e.userId?e.userId.userid:null).filter(e=>null!==e)},d.prototype.isPublic=function(){return this.keyPacket.tag===a.default.packet.publicKey},d.prototype.isPrivate=function(){return this.keyPacket.tag===a.default.packet.secretKey},d.prototype.toPublic=function(){const e=new i.default.List,t=this.toPacketlist();let r,n,s;for(let o=0;ot.keyPacket.created-e.keyPacket.created);let o;for(let s=0;st.keyPacket.created-e.keyPacket.created);let o;for(let s=0;s!0===e)},d.prototype.validate=async function(){if(!this.isPrivate())throw new Error("Cannot validate a public key");let e;if(this.keyPacket.isDummy()){const t=await this.getSigningKey(null,null);t&&!t.keyPacket.isDummy()&&(e=t.keyPacket)}else e=this.primaryKey;if(e)return e.validate();{const e=this.getKeys();if(e.map(e=>e.keyPacket.isDummy()).every(Boolean))throw new Error("Cannot validate an all-gnu-dummy key");return Promise.all(e.map(async e=>e.keyPacket.validate()))}},d.prototype.clearPrivateParams=function(){if(!this.isPrivate())throw new Error("Can't clear private parameters of a public key");this.getKeys().forEach(({keyPacket:e})=>{e.isDecrypted()&&e.clearPrivateParams()})},d.prototype.isRevoked=async function(e,t,r=new Date){return c.isDataRevoked(this.keyPacket,a.default.signature.key_revocation,{key:this.keyPacket},this.revocationSignatures,e,t,r)},d.prototype.verifyPrimaryKey=async function(e=new Date,t={}){const r=this.keyPacket;if(await this.isRevoked(null,null,e))throw new Error("Primary key is revoked");if(!this.users.some(e=>e.userId&&e.selfCertifications.length))throw new Error("No self-certifications");const n=(await this.getPrimaryUser(e,t)).selfCertification;if(c.isDataExpired(r,n,e))throw new Error("Primary key is expired")},d.prototype.getExpirationTime=async function(e,t,r){const n=(await this.getPrimaryUser(null,r)).selfCertification,i=c.getExpirationTime(this.keyPacket,n),a=n.getExpirationTime();let s=i{})||await this.getEncryptionKey(t,null,r).catch(()=>{});if(!e)return null;const n=await e.getExpirationTime(this.keyPacket);n{})||await this.getSigningKey(t,null,r).catch(()=>{});if(!e)return null;const n=await e.getExpirationTime(this.keyPacket);ne.subKeys.some(e=>t.hasSameFingerprintAs(e)))))throw new Error("Cannot update public key with private key if subkey mismatch");this.keyPacket=e.keyPacket}await c.mergeSignatures(e,this,"revocationSignatures",t=>c.isDataRevoked(this.keyPacket,a.default.signature.key_revocation,this,[t],null,e.keyPacket)),await c.mergeSignatures(e,this,"directSignatures"),await Promise.all(e.users.map(async e=>{let t=!1;await Promise.all(this.users.map(async r=>{(e.userId&&r.userId&&e.userId.userid===r.userId.userid||e.userAttribute&&e.userAttribute.equals(r.userAttribute))&&(await r.update(e,this.keyPacket),t=!0)})),t||this.users.push(e)})),await Promise.all(e.subKeys.map(async e=>{let t=!1;await Promise.all(this.subKeys.map(async r=>{r.hasSameFingerprintAs(e)&&(await r.update(e,this.keyPacket),t=!0)})),t||this.subKeys.push(e)}))},d.prototype.revoke=async function({flag:e=a.default.reasonForRevocation.no_reason,string:t=""}={},r=new Date){if(this.isPublic())throw new Error("Need private key for revoking");const n={key:this.keyPacket},i=new d(this.toPacketlist());return i.revocationSignatures.push(await c.createSignaturePacket(n,null,this.keyPacket,{signatureType:a.default.signature.key_revocation,reasonForRevocationFlag:a.default.write(a.default.reasonForRevocation,e),reasonForRevocationString:t},r)),i},d.prototype.getRevocationCertificate=async function(e=new Date){const t={key:this.keyPacket},r=await c.getLatestValidSignature(this.revocationSignatures,this.keyPacket,a.default.signature.key_revocation,t,e),s=new i.default.List;return s.push(r),n.default.encode(a.default.armor.public_key,s.write(),null,null,"This is a revocation certificate")},d.prototype.applyRevocationCertificate=async function(e){const t=await n.default.decode(e),r=new i.default.List;await r.read(t.data);const o=r.findPacket(a.default.packet.signature);if(!o||o.signatureType!==a.default.signature.key_revocation)throw new Error("Could not find revocation signature packet");if(!o.issuerKeyId.equals(this.getKeyId()))throw new Error("Revocation signature does not match key");if(o.isExpired())throw new Error("Revocation signature is expired");try{await o.verify(this.keyPacket,a.default.signature.key_revocation,{key:this.keyPacket})}catch(c){throw s.default.wrapError("Could not verify revocation signature",c)}const u=new d(this.toPacketlist());return u.revocationSignatures.push(o),u},d.prototype.signPrimaryUser=async function(e,t,r){var n=await this.getPrimaryUser(t,r);const i=n.index,a=n.user,s=await a.sign(this.keyPacket,e),o=new d(this.toPacketlist());return o.users[i]=s,o},d.prototype.signAllUsers=async function(e){const t=this,r=new d(this.toPacketlist());return r.users=await Promise.all(this.users.map(function(r){return r.sign(t.keyPacket,e)})),r},d.prototype.verifyPrimaryUser=async function(e,t,r){const n=this.keyPacket;const i=(await this.getPrimaryUser(t,r)).user;return e?await i.verifyAllCertifications(n,e):[{keyid:n.keyid,valid:await i.verify(n).catch(()=>!1)}]},d.prototype.verifyAllUsers=async function(e){const t=[],r=this.keyPacket;return await Promise.all(this.users.map(async function(n){(e?await n.verifyAllCertifications(r,e):[{keyid:r.keyid,valid:await n.verify(r).catch(()=>!1)}]).forEach(e=>{t.push({userid:n.userId.userid,keyid:e.keyid,valid:e.valid})})})),t},d.prototype.addSubkey=async function(e={}){if(!this.isPrivate())throw new Error("Cannot add a subkey to a public key");if(e.passphrase)throw new Error("Subkey could not be encrypted here, please encrypt whole key");if(s.default.getWebCryptoAll()&&e.rsaBits<2048)throw new Error("When using webCrypto rsaBits should be 2048 or 4096, found: "+e.rsaBits);const t=this.primaryKey;if(!t.isDecrypted())throw new Error("Key is not decrypted");const r=t.getAlgorithmInfo();e=c.sanitizeKeyOptions(e,r);const n=await c.generateSecretSubkey(e),i=await c.createBindingSignature(n,t,e),a=this.toPacketlist();return a.push(n),a.push(i),new d(a)},["getKeyId","getFingerprint","getAlgorithmInfo","getCreationTime","isDecrypted","hasSameFingerprintAs"].forEach(e=>{d.prototype[e]=u.default.prototype[e]})},{"../encoding/armor":111,"../enums":113,"../packet":131,"../util":158,"./helper":117,"./subkey":120,"./user":121}],120:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=o;var n=s(e("../enums")),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(e("./helper")),a=s(e("../packet"));function s(e){return e&&e.__esModule?e:{default:e}}function o(e){if(!(this instanceof o))return new o(e);this.keyPacket=e,this.bindingSignatures=[],this.revocationSignatures=[]}o.prototype.toPacketlist=function(){const e=new a.default.List;return e.push(this.keyPacket),e.concat(this.revocationSignatures),e.concat(this.bindingSignatures),e},o.prototype.isRevoked=async function(e,t,r,a=new Date){return i.isDataRevoked(e,n.default.signature.subkey_revocation,{key:e,bind:this.keyPacket},this.revocationSignatures,t,r,a)},o.prototype.verify=async function(e,t=new Date){const r={key:e,bind:this.keyPacket},a=await i.getLatestValidSignature(this.bindingSignatures,e,n.default.signature.subkey_binding,r,t);if(a.revoked||await this.isRevoked(e,a,null,t))throw new Error("Subkey is revoked");if(i.isDataExpired(this.keyPacket,a,t))throw new Error("Subkey is expired")},o.prototype.getExpirationTime=async function(e,t=new Date){const r={key:e,bind:this.keyPacket};let a;try{a=await i.getLatestValidSignature(this.bindingSignatures,e,n.default.signature.subkey_binding,r,t)}catch(u){return null}const s=i.getExpirationTime(this.keyPacket,a),o=a.getExpirationTime();return sr.bindingSignatures[t].created&&(r.bindingSignatures[t]=e),!1;try{return e.verified||await e.verify(t,n.default.signature.subkey_binding,a)}catch(i){return!1}}),await i.mergeSignatures(e,this,"revocationSignatures",function(e){return i.isDataRevoked(t,n.default.signature.subkey_revocation,a,[e])})},o.prototype.revoke=async function(e,{flag:t=n.default.reasonForRevocation.no_reason,string:r=""}={},a=new Date){const s={key:e,bind:this.keyPacket},u=new o(this.keyPacket);return u.revocationSignatures.push(await i.createSignaturePacket(s,null,e,{signatureType:n.default.signature.subkey_revocation,reasonForRevocationFlag:n.default.write(n.default.reasonForRevocation,t),reasonForRevocationString:r},a)),await u.update(this,e),u},["getKeyId","getFingerprint","getAlgorithmInfo","getCreationTime","isDecrypted"].forEach(e=>{o.prototype[e]=function(){return this.keyPacket[e]()}}),o.prototype.hasSameFingerprintAs=function(e){return this.keyPacket.hasSameFingerprintAs(e.keyPacket||e)}},{"../enums":113,"../packet":131,"./helper":117}],121:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default=u;var n=o(e("../enums")),i=o(e("../util")),a=o(e("../packet")),s=e("./helper");function o(e){return e&&e.__esModule?e:{default:e}}function u(e){if(!(this instanceof u))return new u(e);this.userId=e.tag===n.default.packet.userid?e:null,this.userAttribute=e.tag===n.default.packet.userAttribute?e:null,this.selfCertifications=[],this.otherCertifications=[],this.revocationSignatures=[]}u.prototype.toPacketlist=function(){const e=new a.default.List;return e.push(this.userId||this.userAttribute),e.concat(this.revocationSignatures),e.concat(this.selfCertifications),e.concat(this.otherCertifications),e},u.prototype.sign=async function(e,t){const r={userId:this.userId,userAttribute:this.userAttribute,key:e},i=new u(r.userId||r.userAttribute);return i.otherCertifications=await Promise.all(t.map(async function(t){if(t.isPublic())throw new Error("Need private key for signing");if(t.hasSameFingerprintAs(e))throw new Error("Not implemented for self signing");const i=await t.getSigningKey();return(0,s.createSignaturePacket)(r,t,i.keyPacket,{signatureType:n.default.signature.cert_generic,keyFlags:[n.default.keyFlags.certify_keys|n.default.keyFlags.sign_data]})})),await i.update(this,e),i},u.prototype.isRevoked=async function(e,t,r,i=new Date){return(0,s.isDataRevoked)(e,n.default.signature.cert_revocation,{key:e,userId:this.userId,userAttribute:this.userAttribute},this.revocationSignatures,t,r,i)},u.prototype.verifyCertificate=async function(e,t,r,a=new Date){const s=this,o=t.issuerKeyId,u={userId:this.userId,userAttribute:this.userAttribute,key:e};return(await Promise.all(r.map(async function(r){if(!r.getKeyIds().some(e=>e.equals(o)))return null;const c=await r.getSigningKey(o,a);if(t.revoked||await s.isRevoked(e,t,c.keyPacket,a))throw new Error("User certificate is revoked");try{t.verified||await t.verify(c.keyPacket,n.default.signature.cert_generic,u)}catch(f){throw i.default.wrapError("User certificate is invalid",f)}if(t.isExpired(a))throw new Error("User certificate is expired");return!0}))).find(e=>null!==e)||null},u.prototype.verifyAllCertifications=async function(e,t,r=new Date){const n=this,i=this.selfCertifications.concat(this.otherCertifications);return Promise.all(i.map(async function(i){return{keyid:i.issuerKeyId,valid:await n.verifyCertificate(e,i,t,r).catch(()=>!1)}}))},u.prototype.verify=async function(e,t=new Date){if(!this.selfCertifications.length)throw new Error("No self-certifications");const r=this,a={userId:this.userId,userAttribute:this.userAttribute,key:e};let s;for(let u=this.selfCertifications.length-1;u>=0;u--)try{const c=this.selfCertifications[u];if(c.revoked||await r.isRevoked(e,c,void 0,t))throw new Error("Self-certification is revoked");try{c.verified||await c.verify(e,n.default.signature.cert_generic,a)}catch(o){throw i.default.wrapError("Self-certification is invalid",o)}if(c.isExpired(t))throw new Error("Self-certification is expired");return!0}catch(o){s=o}throw s},u.prototype.update=async function(e,t){const r={userId:this.userId,userAttribute:this.userAttribute,key:t};await(0,s.mergeSignatures)(e,this,"selfCertifications",async function(e){try{return e.verified||e.verify(t,n.default.signature.cert_generic,r)}catch(i){return!1}}),await(0,s.mergeSignatures)(e,this,"otherCertifications"),await(0,s.mergeSignatures)(e,this,"revocationSignatures",function(e){return(0,s.isDataRevoked)(t,n.default.signature.cert_revocation,r,[e])})}},{"../enums":113,"../packet":131,"../util":158,"./helper":117}],122:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=a(e("./keyring.js")),i=a(e("./localstore.js"));function a(e){return e&&e.__esModule?e:{default:e}}n.default.localstore=i.default,r.default=n.default},{"./keyring.js":123,"./localstore.js":124}],123:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=e("../key"),a=e("./localstore"),s=(n=a)&&n.__esModule?n:{default:n};function o(e){this.storeHandler=e||new s.default}function u(e){this.keys=e}function c(e,t){const r=(e=e.toLowerCase()).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=new RegExp("<"+r+">"),i=t.getUserIds();for(let a=0;an.default.readToEnd(e.armor())));e.setItem(t,JSON.stringify(i))}else e.removeItem(t)}u.prototype.publicKeysItem="public-keys",u.prototype.privateKeysItem="private-keys",u.prototype.loadPublic=async function(){return c(this.storage,this.publicKeysItem)},u.prototype.loadPrivate=async function(){return c(this.storage,this.privateKeysItem)},u.prototype.storePublic=async function(e){await f(this.storage,this.publicKeysItem,e)},u.prototype.storePrivate=async function(e){await f(this.storage,this.privateKeysItem,e)},r.default=u}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../config":79,"../key":118,"../util":158,"node-localstorage":"node-localstorage","web-stream-tools":75}],125:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.loadScript=(e=>"undefined"!=typeof importScripts?importScripts(e):new Promise((t,r)=>{const n=document.createElement("script");n.src=e,n.onload=(()=>t()),n.onerror=(e=>r(new Error(e.message))),document.head.appendChild(n)})),r.dl=async function(e,t){return(await fetch(e,t)).arrayBuffer()}},{}],126:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Message=p,r.encryptSessionKey=y,r.createSignaturePackets=b,r.createVerificationObjects=m,r.readArmored=async function(e){const t=c.default.isStream(e);"node"===t&&(e=n.default.nodeToWeb(e));return g((await i.default.decode(e)).data,t)},r.read=g,r.fromText=function(e,t,r=new Date,i="utf8"){const a=c.default.isStream(e);"node"===a&&(e=n.default.nodeToWeb(e));const s=new f.default.Literal(r);s.setText(e,i),void 0!==t&&s.setFilename(t);const o=new f.default.List;o.push(s);const u=new p(o);return u.fromStream=a,u},r.fromBinary=function(e,t,r=new Date,i="binary"){const a=c.default.isStream(e);if(!c.default.isUint8Array(e)&&!a)throw new Error("Data must be in the form of a Uint8Array or Stream");"node"===a&&(e=n.default.nodeToWeb(e));const s=new f.default.Literal(r);s.setBytes(e,i),void 0!==t&&s.setFilename(t);const o=new f.default.List;o.push(s);const u=new p(o);return u.fromStream=a,u};var n=h(e("web-stream-tools")),i=h(e("./encoding/armor")),a=h(e("./type/keyid")),s=h(e("./config")),o=h(e("./crypto")),u=h(e("./enums")),c=h(e("./util")),f=h(e("./packet")),d=e("./signature"),l=e("./key");function h(e){return e&&e.__esModule?e:{default:e}}function p(e){if(!(this instanceof p))return new p(e);this.packets=e||new f.default.List}async function y(e,t,r,n,i,o=!1,u=new Date,c=[]){const d=new f.default.List;if(n){const r=await Promise.all(n.map(async function(r){const n=await r.getEncryptionKey(void 0,u,c),i=new f.default.PublicKeyEncryptedSessionKey;return i.publicKeyId=o?a.default.wildcard():n.getKeyId(),i.publicKeyAlgorithm=n.keyPacket.algorithm,i.sessionKey=e,i.sessionKeyAlgorithm=t,await i.encrypt(n.keyPacket),delete i.sessionKey,i}));d.concat(r)}if(i){const n=async function(e,t){try{return await e.decrypt(t),1}catch(r){return 0}},a=(e,t)=>e+t,o=async function e(t,r,o,u){const c=new f.default.SymEncryptedSessionKey;if(c.sessionKey=t,c.sessionKeyAlgorithm=r,o&&(c.aeadAlgorithm=o),await c.encrypt(u),s.default.password_collision_check){if(1!==(await Promise.all(i.map(e=>n(c,e)))).reduce(a))return e(t,r,u)}return delete c.sessionKey,c},u=await Promise.all(i.map(n=>o(e,t,r,n)));d.concat(u)}return new p(d)}async function b(e,t,r=null,n=new Date,i=[],a=!1,s=!1){const o=new f.default.List,c=null===e.text?u.default.signature.binary:u.default.signature.text;if(await Promise.all(t.map(async(t,r)=>{const o=i[r];if(t.isPublic())throw new Error("Need private key for signing");const u=await t.getSigningKey(void 0,n,o);return(0,l.createSignaturePacket)(e,t,u.keyPacket,{signatureType:c},n,o,a,s)})).then(e=>{e.forEach(e=>o.push(e))}),r){const e=r.packets.filterByTag(u.default.packet.signature);o.concat(e)}return o}async function m(e,t,r,n=new Date,i=!1,a=!1){return Promise.all(e.filter(function(e){return["text","binary"].includes(u.default.read(u.default.signature,e.signatureType))}).map(async function(e){return async function(e,t,r,n=new Date,i=!1,a=!1){let s=null,o=null;await Promise.all(r.map(async function(t){try{o=await t.getSigningKey(e.issuerKeyId,null),s=t}catch(r){}}));const u=e.correspondingSig||e,c={keyid:e.issuerKeyId,verified:(async()=>{if(!o)return null;const r=await e.verify(o.keyPacket,e.signatureType,t[0],i,a),c=await u;if(c.isExpired(n)||!(c.created>=o.getCreationTime()&&c.created{const e=await u,t=new f.default.List;return t.push(e),new d.Signature(t)})()};return c.signature.catch(()=>{}),c.verified.catch(()=>{}),c}(e,t,r,n,i,a)}))}async function g(e,t=c.default.isStream(e)){"node"===c.default.isStream(e)&&(e=n.default.nodeToWeb(e));const r=new f.default.List;await r.read(e,t);const i=new p(r);return i.fromStream=t,i}p.prototype.getEncryptionKeyIds=function(){const e=[];return this.packets.filterByTag(u.default.packet.publicKeyEncryptedSessionKey).forEach(function(t){e.push(t.publicKeyId)}),e},p.prototype.getSigningKeyIds=function(){const e=[],t=this.unwrapCompressed();if(t.packets.filterByTag(u.default.packet.onePassSignature).forEach(function(t){e.push(t.issuerKeyId)}),!e.length){t.packets.filterByTag(u.default.packet.signature).forEach(function(t){e.push(t.issuerKeyId)})}return e},p.prototype.decrypt=async function(e,t,r,i){const a=r||await this.decryptSessionKeys(e,t),s=this.packets.filterByTag(u.default.packet.symmetricallyEncrypted,u.default.packet.symEncryptedIntegrityProtected,u.default.packet.symEncryptedAEADProtected);if(0===s.length)return this;const o=s[0];let d=null;const l=Promise.all(a.map(async e=>{if(!e||!c.default.isUint8Array(e.data)||!c.default.isString(e.algorithm))throw new Error("Invalid session key for decryption.");try{await o.decrypt(e.algorithm,e.data,i)}catch(t){c.default.print_debug_error(t),d=t}}));if(n.default.cancel(o.encrypted),o.encrypted=null,await l,!o.packets||!o.packets.length)throw d||new Error("Decryption failed.");const h=new p(o.packets);return o.packets=new f.default.List,h},p.prototype.decryptSessionKeys=async function(e,t){let r,i=[];if(t){const e=this.packets.filterByTag(u.default.packet.symEncryptedSessionKey);if(!e)throw new Error("No symmetrically encrypted session key packet found.");await Promise.all(t.map(async function(t,r){let n;r?(n=new f.default.List,await n.read(e.write())):n=e,await Promise.all(n.map(async function(e){try{await e.decrypt(t),i.push(e)}catch(r){c.default.print_debug_error(r)}}))}))}else{if(!e)throw new Error("No key or password specified.");{const t=this.packets.filterByTag(u.default.packet.publicKeyEncryptedSessionKey);if(!t)throw new Error("No public key encrypted session key packet found.");await Promise.all(t.map(async function(t){await Promise.all(e.map(async function(e){let n=[u.default.symmetric.aes256,u.default.symmetric.aes128,u.default.symmetric.tripledes,u.default.symmetric.cast5];try{const t=await e.getPrimaryUser();t.selfCertification.preferredSymmetricAlgorithms&&(n=n.concat(t.selfCertification.preferredSymmetricAlgorithms))}catch(s){}const a=(await e.getDecryptionKeys(t.publicKeyId,null)).map(e=>e.keyPacket);await Promise.all(a.map(async function(e){if(e){if(!e.isDecrypted())throw new Error("Private key is not decrypted.");try{if(await t.decrypt(e),!n.includes(u.default.write(u.default.symmetric,t.sessionKeyAlgorithm)))throw new Error("A non-preferred symmetric algorithm was used.");i.push(t)}catch(a){c.default.print_debug_error(a),r=a}}}))})),n.default.cancel(t.encrypted),t.encrypted=null}))}}if(i.length){if(i.length>1){const e={};i=i.filter(function(t){const r=t.sessionKeyAlgorithm+c.default.Uint8Array_to_str(t.sessionKey);return!e.hasOwnProperty(r)&&(e[r]=!0,!0)})}return i.map(e=>({data:e.sessionKey,algorithm:e.sessionKeyAlgorithm}))}throw r||new Error("Session key decryption failed.")},p.prototype.getLiteralData=function(){const e=this.unwrapCompressed().packets.findPacket(u.default.packet.literal);return e&&e.getBytes()||null},p.prototype.getFilename=function(){const e=this.unwrapCompressed().packets.findPacket(u.default.packet.literal);return e&&e.getFilename()||null},p.prototype.getText=function(){const e=this.unwrapCompressed().packets.findPacket(u.default.packet.literal);return e?e.getText():null},p.prototype.encrypt=async function(e,t,r,n=!1,i=new Date,a=[],d){let h,p,b;if(r){if(!c.default.isUint8Array(r.data)||!c.default.isString(r.algorithm))throw new Error("Invalid session key for encryption.");h=r.algorithm,p=r.aeadAlgorithm,r=r.data}else if(e&&e.length)h=u.default.read(u.default.symmetric,await(0,l.getPreferredAlgo)("symmetric",e,i,a)),s.default.aead_protect&&await(0,l.isAeadSupported)(e,i,a)&&(p=u.default.read(u.default.aead,await(0,l.getPreferredAlgo)("aead",e,i,a)));else{if(!t||!t.length)throw new Error("No keys, passwords, or session key provided.");h=u.default.read(u.default.symmetric,s.default.encryption_cipher),p=u.default.read(u.default.aead,s.default.aead_mode)}r||(r=await o.default.generateSessionKey(h));const m=await y(r,h,p,e,t,n,i,a);return s.default.aead_protect&&p?(b=new f.default.SymEncryptedAEADProtected).aeadAlgorithm=p:b=s.default.integrity_protect?new f.default.SymEncryptedIntegrityProtected:new f.default.SymmetricallyEncrypted,b.packets=this.packets,await b.encrypt(h,r,d),m.packets.push(b),b.packets=new f.default.List,{message:m,sessionKey:{data:r,algorithm:h,aeadAlgorithm:p}}},p.prototype.sign=async function(e=[],t=null,r=new Date,n=[],i=!1){const a=new f.default.List,s=this.packets.findPacket(u.default.packet.literal);if(!s)throw new Error("No literal data packet to sign.");let o,c;const d=null===s.text?u.default.signature.binary:u.default.signature.text;if(t)for(o=(c=t.packets.filterByTag(u.default.packet.signature)).length-1;o>=0;o--){const t=c[o],r=new f.default.OnePassSignature;r.signatureType=t.signatureType,r.hashAlgorithm=t.hashAlgorithm,r.publicKeyAlgorithm=t.publicKeyAlgorithm,r.issuerKeyId=t.issuerKeyId,e.length||0!==o||(r.flags=1),a.push(r)}return await Promise.all(Array.from(e).reverse().map(async function(t,i){if(t.isPublic())throw new Error("Need private key for signing");const a=await t.getSigningKey(void 0,r,n),s=new f.default.OnePassSignature;return s.signatureType=d,s.hashAlgorithm=await(0,l.getPreferredHashAlgo)(t,a.keyPacket,r,n),s.publicKeyAlgorithm=a.keyPacket.algorithm,s.issuerKeyId=a.getKeyId(),i===e.length-1&&(s.flags=1),s})).then(e=>{e.forEach(e=>a.push(e))}),a.push(s),a.concat(await b(s,e,t,r,n,!1,i)),new p(a)},p.prototype.compress=function(e){if(e===u.default.compression.uncompressed)return this;const t=new f.default.Compressed;t.packets=this.packets,t.algorithm=u.default.read(u.default.compression,e);const r=new f.default.List;return r.push(t),new p(r)},p.prototype.signDetached=async function(e=[],t=null,r=new Date,n=[],i=!1){const a=this.packets.findPacket(u.default.packet.literal);if(!a)throw new Error("No literal data packet to sign.");return new d.Signature(await b(a,e,t,r,n,!0,i))},p.prototype.verify=async function(e,t=new Date,r){const i=this.unwrapCompressed(),a=i.packets.filterByTag(u.default.packet.literal);if(1!==a.length)throw new Error("Can only verify message with one literal data packet.");r||i.packets.concat(await n.default.readToEnd(i.packets.stream,e=>e));const s=i.packets.filterByTag(u.default.packet.onePassSignature).reverse(),o=i.packets.filterByTag(u.default.packet.signature);return r&&s.length&&!o.length&&i.packets.stream?(await Promise.all(s.map(async e=>{e.correspondingSig=new Promise((t,r)=>{e.correspondingSigResolve=t,e.correspondingSigReject=r}),e.signatureData=n.default.fromAsync(async()=>(await e.correspondingSig).signatureData),e.hashed=n.default.readToEnd(await e.hash(e.signatureType,a[0],void 0,!1,r)),e.hashed.catch(()=>{})})),i.packets.stream=n.default.transformPair(i.packets.stream,async(e,t)=>{const r=n.default.getReader(e),i=n.default.getWriter(t);try{for(let e=0;e{e.correspondingSigReject(a)}),await i.abort(a)}}),m(s,a,e,t,!1,r)):m(o,a,e,t,!1,r)},p.prototype.verifyDetached=function(e,t,r=new Date){const n=this.unwrapCompressed().packets.filterByTag(u.default.packet.literal);if(1!==n.length)throw new Error("Can only verify message with one literal data packet.");return m(e.packets,n,t,r,!0)},p.prototype.unwrapCompressed=function(){const e=this.packets.filterByTag(u.default.packet.compressed);return e.length?new p(e[0].packets):this},p.prototype.appendSignature=async function(e){await this.packets.read(c.default.isUint8Array(e)?e:(await i.default.decode(e)).data)},p.prototype.armor=function(){return i.default.encode(u.default.armor.message,this.packets.write())}},{"./config":79,"./crypto":94,"./encoding/armor":111,"./enums":113,"./key":118,"./packet":131,"./signature":151,"./type/keyid":154,"./util":158,"web-stream-tools":75}],127:[function(e,t,r){(function(t){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.initWorker=async function({path:e="openpgp.worker.min.js",n:r=1,workers:n=[]}={}){if(n.length||void 0!==t&&t.Worker&&t.MessageChannel){const t=new f.default({path:e,n:r,workers:n,config:o.default}),i=await t.loaded();if(i)return l=t,!0}return!1},r.getWorker=function(){return l},r.destroyWorker=async function(){const e=l;l=void 0,e&&(await e.clearKeyCache(),e.terminate())},r.generateKey=function({userIds:e=[],passphrase:t="",numBits:r=2048,rsaBits:n=r,keyExpirationTime:i=0,curve:a="",date:o=new Date,subkeys:u=[{}]}){const f={userIds:e=y(e),passphrase:t,rsaBits:n,keyExpirationTime:i,curve:a,date:o,subkeys:u};if(c.default.getWebCryptoAll()&&n<2048)throw new Error("rsaBits should be 2048 or 4096, found: "+n);if(!c.default.getWebCryptoAll()&&l)return l.delegate("generateKey",f);return(0,s.generate)(f).then(async e=>{const t=await e.getRevocationCertificate(o);return e.revocationSignatures=[],m({key:e,privateKeyArmored:e.armor(),publicKeyArmored:e.toPublic().armor(),revocationCertificate:t})}).catch(_.bind(null,"Error generating keypair"))},r.reformatKey=function({privateKey:e,userIds:t=[],passphrase:r="",keyExpirationTime:n=0,date:i}){t=y(t);const a={privateKey:e,userIds:t,passphrase:r,keyExpirationTime:n,date:i};if(l)return l.delegate("reformatKey",a);return(0,s.reformat)(a).then(async e=>{const t=await e.getRevocationCertificate(i);return e.revocationSignatures=[],m({key:e,privateKeyArmored:e.armor(),publicKeyArmored:e.toPublic().armor(),revocationCertificate:t})}).catch(_.bind(null,"Error reformatting keypair"))},r.revokeKey=function({key:e,revocationCertificate:t,reasonForRevocation:r}={}){const n={key:e,revocationCertificate:t,reasonForRevocation:r};if(!c.default.getWebCryptoAll()&&l)return l.delegate("revokeKey",n);return Promise.resolve().then(()=>t?e.applyRevocationCertificate(t):e.revoke(r)).then(async e=>{if(await m(e),e.isPrivate()){const t=e.toPublic();return{privateKey:e,privateKeyArmored:e.armor(),publicKey:t,publicKeyArmored:t.armor()}}return{publicKey:e,publicKeyArmored:e.armor()}}).catch(_.bind(null,"Error revoking key"))},r.decryptKey=function({privateKey:e,passphrase:t}){if(l)return l.delegate("decryptKey",{privateKey:e,passphrase:t});return Promise.resolve().then(async function(){return await e.decrypt(t),{key:e}}).catch(_.bind(null,"Error decrypting private key"))},r.encryptKey=function({privateKey:e,passphrase:t}){if(l)return l.delegate("encryptKey",{privateKey:e,passphrase:t});return Promise.resolve().then(async function(){return await e.encrypt(t),{key:e}}).catch(_.bind(null,"Error decrypting private key"))},r.encrypt=function({message:e,publicKeys:t,privateKeys:r,passwords:n,sessionKey:i,compression:a=o.default.compression,armor:s=!0,streaming:u=e&&e.fromStream,detached:c=!1,signature:f=null,returnSessionKey:d=!1,wildcard:p=!1,date:b=new Date,fromUserIds:g=[],toUserIds:w=[]}){if(h(e),t=y(t),r=y(r),n=y(n),g=y(g),w=y(w),!v()&&l)return l.delegate("encrypt",{message:e,publicKeys:t,privateKeys:r,passwords:n,sessionKey:i,compression:a,armor:s,streaming:u,detached:c,signature:f,returnSessionKey:d,wildcard:p,date:b,fromUserIds:g,toUserIds:w});const k={};return Promise.resolve().then(async function(){if(r||(r=[]),r.length||f)if(c){const t=await e.signDetached(r,f,b,g,e.fromStream);k.signature=s?t.armor():t}else e=await e.sign(r,f,b,g,e.fromStream);return(e=e.compress(a)).encrypt(t,n,i,p,b,w,u)}).then(async e=>(s?k.data=e.message.armor():k.message=e.message,d&&(k.sessionKey=e.sessionKey),m(k,u,s?["signature","data"]:[]))).catch(_.bind(null,"Error encrypting message"))},r.decrypt=function({message:e,privateKeys:t,passwords:r,sessionKeys:n,publicKeys:i,format:a="utf8",streaming:s=e&&e.fromStream,signature:o=null,date:u=new Date}){if(h(e),i=y(i),t=y(t),r=y(r),n=y(n),!v()&&l)return l.delegate("decrypt",{message:e,privateKeys:t,passwords:r,sessionKeys:n,publicKeys:i,format:a,streaming:s,signature:o,date:u});return e.decrypt(t,r,n,s).then(async function(t){i||(i=[]);const r={};return r.signatures=o?await t.verifyDetached(o,i,u,s):await t.verify(i,u,s),r.data="binary"===a?t.getLiteralData():t.getText(),r.filename=t.getFilename(),s&&g(r,e),r.data=await b(r.data,s),s||await w(r.signatures),r}).catch(_.bind(null,"Error decrypting message"))},r.sign=function({message:e,privateKeys:t,armor:r=!0,streaming:i=e&&e.fromStream,detached:a=!1,date:s=new Date,fromUserIds:o=[]}){if(p(e),t=y(t),o=y(o),l)return l.delegate("sign",{message:e,privateKeys:t,armor:r,streaming:i,detached:a,date:s,fromUserIds:o});const u={};return Promise.resolve().then(async function(){if(a){const i=await e.signDetached(t,void 0,s,o,e.fromStream);u.signature=r?i.armor():i,e.packets&&(u.signature=n.default.transformPair(e.packets.write(),async(e,t)=>{await Promise.all([n.default.pipe(u.signature,t),n.default.readToEnd(e).catch(()=>{})])}))}else e=await e.sign(t,void 0,s,o,e.fromStream),r?u.data=e.armor():u.message=e;return m(u,i,r?["signature","data"]:[])}).catch(_.bind(null,"Error signing cleartext message"))},r.verify=function({message:e,publicKeys:t,streaming:r=e&&e.fromStream,signature:n=null,date:i=new Date}){if(p(e),t=y(t),l)return l.delegate("verify",{message:e,publicKeys:t,streaming:r,signature:n,date:i});return Promise.resolve().then(async function(){const s={};return s.signatures=n?await e.verifyDetached(n,t,i,r):await e.verify(t,i,r),s.data=e instanceof a.CleartextMessage?e.getText():e.getLiteralData(),r&&g(s,e),s.data=await b(s.data,r),r||await w(s.signatures),s}).catch(_.bind(null,"Error verifying cleartext signed message"))},r.encryptSessionKey=function({data:e,algorithm:t,aeadAlgorithm:r,publicKeys:n,passwords:a,wildcard:s=!1,date:o=new Date,toUserIds:u=[]}){if(function(e,t){if(!c.default.isUint8Array(e))throw new Error("Parameter ["+(t||"data")+"] must be of type Uint8Array")}(e),function(e,t){if(!c.default.isString(e))throw new Error("Parameter ["+(t||"data")+"] must be of type String")}(t,"algorithm"),n=y(n),a=y(a),u=y(u),l)return l.delegate("encryptSessionKey",{data:e,algorithm:t,aeadAlgorithm:r,publicKeys:n,passwords:a,wildcard:s,date:o,toUserIds:u});return Promise.resolve().then(async function(){return{message:await i.encryptSessionKey(e,t,r,n,a,s,o,u)}}).catch(_.bind(null,"Error encrypting session key"))},r.decryptSessionKeys=function({message:e,privateKeys:t,passwords:r}){if(h(e),t=y(t),r=y(r),l)return l.delegate("decryptSessionKeys",{message:e,privateKeys:t,passwords:r});return Promise.resolve().then(async function(){return e.decryptSessionKeys(t,r)}).catch(_.bind(null,"Error decrypting session keys"))};var n=d(e("web-stream-tools")),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(e("./message")),a=e("./cleartext"),s=e("./key"),o=d(e("./config/config")),u=d(e("./enums"));e("./polyfills");var c=d(e("./util")),f=d(e("./worker/async_proxy"));function d(e){return e&&e.__esModule?e:{default:e}}let l;function h(e){if(!(e instanceof i.Message))throw new Error("Parameter [message] needs to be of type Message")}function p(e){if(!(e instanceof a.CleartextMessage||e instanceof i.Message))throw new Error("Parameter [message] needs to be of type Message or CleartextMessage")}function y(e){return e&&!c.default.isArray(e)&&(e=[e]),e}async function b(e,t){return!t&&c.default.isStream(e)?n.default.readToEnd(e):(t&&!c.default.isStream(e)&&(e=new ReadableStream({start(t){t.enqueue(e),t.close()}})),"node"===t&&(e=n.default.webToNode(e)),e)}async function m(e,t,r=[]){return Object.prototype.isPrototypeOf(e)&&!Uint8Array.prototype.isPrototypeOf(e)&&await Promise.all(Object.entries(e).map(async([n,i])=>{c.default.isStream(i)||r.includes(n)?e[n]=await b(i,t):await m(e[n],t)})),e}function g(e,t){e.data=n.default.transformPair(t.packets.stream,async(t,r)=>{await n.default.pipe(e.data,r)})}async function w(e){await Promise.all(e.map(async e=>{e.signature=await e.signature;try{e.valid=await e.verified}catch(t){e.valid=!1,e.error=t,c.default.print_debug_error(t)}}))}function _(e,t){c.default.print_debug_error(t);try{t.message=e+": "+t.message}catch(r){}throw t}function v(){return o.default.aead_protect&&(o.default.aead_mode===u.default.aead.eax||o.default.aead_mode===u.default.aead.experimental_gcm)&&c.default.getWebCrypto()}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./cleartext":77,"./config/config":78,"./enums":113,"./key":118,"./message":126,"./polyfills":150,"./util":158,"./worker/async_proxy":160,"web-stream-tools":75}],128:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.Trust=r.Signature=r.SecretSubkey=r.Userid=r.SecretKey=r.OnePassSignature=r.UserAttribute=r.PublicSubkey=r.Marker=r.SymmetricallyEncrypted=r.PublicKey=r.Literal=r.SymEncryptedSessionKey=r.PublicKeyEncryptedSessionKey=r.SymEncryptedAEADProtected=r.SymEncryptedIntegrityProtected=r.Compressed=void 0;var n=e("./compressed.js");Object.defineProperty(r,"Compressed",{enumerable:!0,get:function(){return k(n).default}});var i=e("./sym_encrypted_integrity_protected.js");Object.defineProperty(r,"SymEncryptedIntegrityProtected",{enumerable:!0,get:function(){return k(i).default}});var a=e("./sym_encrypted_aead_protected.js");Object.defineProperty(r,"SymEncryptedAEADProtected",{enumerable:!0,get:function(){return k(a).default}});var s=e("./public_key_encrypted_session_key.js");Object.defineProperty(r,"PublicKeyEncryptedSessionKey",{enumerable:!0,get:function(){return k(s).default}});var o=e("./sym_encrypted_session_key.js");Object.defineProperty(r,"SymEncryptedSessionKey",{enumerable:!0,get:function(){return k(o).default}});var u=e("./literal.js");Object.defineProperty(r,"Literal",{enumerable:!0,get:function(){return k(u).default}});var c=e("./public_key.js");Object.defineProperty(r,"PublicKey",{enumerable:!0,get:function(){return k(c).default}});var f=e("./symmetrically_encrypted.js");Object.defineProperty(r,"SymmetricallyEncrypted",{enumerable:!0,get:function(){return k(f).default}});var d=e("./marker.js");Object.defineProperty(r,"Marker",{enumerable:!0,get:function(){return k(d).default}});var l=e("./public_subkey.js");Object.defineProperty(r,"PublicSubkey",{enumerable:!0,get:function(){return k(l).default}});var h=e("./user_attribute.js");Object.defineProperty(r,"UserAttribute",{enumerable:!0,get:function(){return k(h).default}});var p=e("./one_pass_signature.js");Object.defineProperty(r,"OnePassSignature",{enumerable:!0,get:function(){return k(p).default}});var y=e("./secret_key.js");Object.defineProperty(r,"SecretKey",{enumerable:!0,get:function(){return k(y).default}});var b=e("./userid.js");Object.defineProperty(r,"Userid",{enumerable:!0,get:function(){return k(b).default}});var m=e("./secret_subkey.js");Object.defineProperty(r,"SecretSubkey",{enumerable:!0,get:function(){return k(m).default}});var g=e("./signature.js");Object.defineProperty(r,"Signature",{enumerable:!0,get:function(){return k(g).default}});var w=e("./trust.js");Object.defineProperty(r,"Trust",{enumerable:!0,get:function(){return k(w).default}}),r.newPacketFromTag=A,r.fromStructuredClone=function(e){const t=A(_.default.read(_.default.packet,e.tag));Object.assign(t,e),t.postCloneTypeFix&&t.postCloneTypeFix();return t};var _=k(e("../enums.js")),v=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(e("./all_packets.js"));function k(e){return e&&e.__esModule?e:{default:e}}function A(e){return new(v[function(e){return e.substr(0,1).toUpperCase()+e.substr(1)}(e)])}},{"../enums.js":113,"./all_packets.js":128,"./compressed.js":130,"./literal.js":132,"./marker.js":133,"./one_pass_signature.js":134,"./public_key.js":137,"./public_key_encrypted_session_key.js":138,"./public_subkey.js":139,"./secret_key.js":140,"./secret_subkey.js":141,"./signature.js":142,"./sym_encrypted_aead_protected.js":143,"./sym_encrypted_integrity_protected.js":144,"./sym_encrypted_session_key.js":145,"./symmetrically_encrypted.js":146,"./trust.js":147,"./user_attribute.js":148,"./userid.js":149}],129:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.clonePackets=function(e){e.publicKeys&&(e.publicKeys=e.publicKeys.map(e=>e.toPacketlist()));e.privateKeys&&(e.privateKeys=e.privateKeys.map(e=>e.toPacketlist()));e.publicKey&&(e.publicKey=e.publicKey.toPacketlist());e.privateKey&&(e.privateKey=e.privateKey.toPacketlist());e.key&&(e.key=e.key.toPacketlist());e.message&&(e.message instanceof a.Message?e.message={packets:e.message.packets,fromStream:e.message.fromStream}:e.message instanceof s.CleartextMessage&&(e.message={text:e.message.text,signature:e.message.signature.packets}));e.signature&&e.signature instanceof o.Signature&&(e.signature=e.signature.packets);e.signatures&&e.signatures.forEach(l);return e},r.parseClonedPackets=function(e){e.publicKeys&&(e.publicKeys=e.publicKeys.map(h));e.privateKeys&&(e.privateKeys=e.privateKeys.map(h));e.publicKey&&(e.publicKey=h(e.publicKey));e.privateKey&&(e.privateKey=h(e.privateKey));e.key&&(e.key=h(e.key));e.message&&e.message.signature?e.message=function(e){const t=u.default.fromStructuredClone(e.signature);return new s.CleartextMessage(e.text,new o.Signature(t))}(e.message):e.message&&(e.message=function(e){const t=u.default.fromStructuredClone(e.packets),r=new a.Message(t);return r.fromStream=e.fromStream,r}(e.message));e.signatures&&(e.signatures=e.signatures.map(p));e.signature&&(e.signature=function(e){if(f.default.isString(e)||f.default.isStream(e))return e;const t=u.default.fromStructuredClone(e);return new o.Signature(t)}(e.signature));return e};var n=d(e("web-stream-tools")),i=e("../key"),a=e("../message"),s=e("../cleartext"),o=e("../signature"),u=d(e("./packetlist")),c=d(e("../type/keyid")),f=d(e("../util"));function d(e){return e&&e.__esModule?e:{default:e}}function l(e){const t=e.verified;if(e.verified=n.default.fromAsync(()=>t),e.signature instanceof Promise){const r=e.signature;e.signature=n.default.fromAsync(async()=>{const e=(await r).packets;try{await t}catch(n){}return e&&e[0]&&(delete e[0].signature,delete e[0].hashed),e})}else e.signature=e.signature.packets;return e.error&&(e.error=e.error.message),e}function h(e){const t=u.default.fromStructuredClone(e);return new i.Key(t)}function p(e){return e.keyid=c.default.fromClone(e.keyid),f.default.isStream(e.signature)?(e.signature=n.default.readToEnd(e.signature,([e])=>new o.Signature(u.default.fromStructuredClone(e))),e.signature.catch(()=>{})):e.signature=new o.Signature(u.default.fromStructuredClone(e.signature)),e.verified=n.default.readToEnd(e.verified,([e])=>e),e.verified.catch(()=>{}),e.error&&(e.error=new Error(e.error)),e}},{"../cleartext":77,"../key":118,"../message":126,"../signature":151,"../type/keyid":154,"../util":158,"./packetlist":136,"web-stream-tools":75}],130:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=c(e("pako")),i=c(e("seek-bzip")),a=c(e("web-stream-tools")),s=c(e("../config")),o=c(e("../enums")),u=c(e("../util"));function c(e){return e&&e.__esModule?e:{default:e}}function f(){this.tag=o.default.packet.compressed,this.packets=null,this.algorithm="zip",this.compressed=null}f.prototype.read=async function(e,t){await a.default.parse(e,async e=>{this.algorithm=o.default.read(o.default.compression,await e.readByte()),this.compressed=e.remainder(),await this.decompress(t)})},f.prototype.write=function(){return null===this.compressed&&this.compress(),u.default.concat([new Uint8Array([o.default.write(o.default.compression,this.algorithm)]),this.compressed])},f.prototype.decompress=async function(e){if(!m[this.algorithm])throw new Error(this.algorithm+" decompression not supported");await this.packets.read(m[this.algorithm](this.compressed),e)},f.prototype.compress=function(){if(!b[this.algorithm])throw new Error(this.algorithm+" compression not supported");this.compressed=b[this.algorithm](this.packets.write())},r.default=f;const d=u.default.getNodeZlib();function l(e){return e}function h(e,t={}){return function(r){return a.default.nodeToWeb(a.default.webToNode(r).pipe(e(t)))}}function p(e,t={}){return function(r){const i=new e(t);return a.default.transform(r,e=>{if(e.length)return i.push(e,n.default.Z_SYNC_FLUSH),i.result},()=>{if(e===n.default.Deflate)return i.push([],n.default.Z_FINISH),i.result})}}function y(e){return function(t){return a.default.fromAsync(async()=>e(await a.default.readToEnd(t)))}}let b,m;d?(b={zip:h(d.createDeflateRaw,{level:s.default.deflate_level}),zlib:h(d.createDeflate,{level:s.default.deflate_level})},m={uncompressed:l,zip:h(d.createInflateRaw),zlib:h(d.createInflate),bzip2:y(i.default.decode)}):(b={zip:p(n.default.Deflate,{raw:!0,level:s.default.deflate_level}),zlib:p(n.default.Deflate,{level:s.default.deflate_level})},m={uncompressed:l,zip:p(n.default.Inflate,{raw:!0}),zlib:p(n.default.Inflate),bzip2:y(i.default.decode)})},{"../config":79,"../enums":113,"../util":158,pako:50,"seek-bzip":69,"web-stream-tools":75}],131:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=o(e("./all_packets")),a=o(e("./clone")),s=e("./packetlist");function o(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}const u={List:((n=s)&&n.__esModule?n:{default:n}).default,clone:a};Object.assign(u,i),r.default=u},{"./all_packets":128,"./clone":129,"./packetlist":136}],132:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=s(e("web-stream-tools")),i=s(e("../enums")),a=s(e("../util"));function s(e){return e&&e.__esModule?e:{default:e}}function o(e=new Date){this.tag=i.default.packet.literal,this.format="utf8",this.date=a.default.normalizeDate(e),this.text=null,this.data=null,this.filename="msg.txt"}o.prototype.setText=function(e,t="utf8"){this.format=t,this.text=e,this.data=null},o.prototype.getText=function(e=!1){return(null===this.text||a.default.isStream(this.text))&&(this.text=a.default.decode_utf8(a.default.nativeEOL(this.getBytes(e)))),this.text},o.prototype.setBytes=function(e,t){this.format=t,this.data=e,this.text=null},o.prototype.getBytes=function(e=!1){return null===this.data&&(this.data=a.default.canonicalizeEOL(a.default.encode_utf8(this.text))),e?n.default.passiveClone(this.data):this.data},o.prototype.setFilename=function(e){this.filename=e},o.prototype.getFilename=function(){return this.filename},o.prototype.read=async function(e){await n.default.parse(e,async e=>{const t=i.default.read(i.default.literal,await e.readByte()),r=await e.readByte();this.filename=a.default.decode_utf8(await e.readBytes(r)),this.date=a.default.readDate(await e.readBytes(4));const n=e.remainder();this.setBytes(n,t)})},o.prototype.writeHeader=function(){const e=a.default.encode_utf8(this.filename),t=new Uint8Array([e.length]),r=new Uint8Array([i.default.write(i.default.literal,this.format)]),n=a.default.writeDate(this.date);return a.default.concatUint8Array([r,t,e,n])},o.prototype.write=function(){const e=this.writeHeader(),t=this.getBytes();return a.default.concat([e,t])},r.default=o},{"../enums":113,"../util":158,"web-stream-tools":75}],133:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=e("../enums"),a=(n=i)&&n.__esModule?n:{default:n};function s(){this.tag=a.default.packet.marker}s.prototype.read=function(e){return 80===e[0]&&71===e[1]&&80===e[2]},r.default=s},{"../enums":113}],134:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=u(e("web-stream-tools")),i=u(e("./signature")),a=u(e("../type/keyid")),s=u(e("../enums")),o=u(e("../util"));function u(e){return e&&e.__esModule?e:{default:e}}function c(){this.tag=s.default.packet.onePassSignature,this.version=null,this.signatureType=null,this.hashAlgorithm=null,this.publicKeyAlgorithm=null,this.issuerKeyId=null,this.flags=null}c.prototype.read=function(e){let t=0;return this.version=e[t++],this.signatureType=e[t++],this.hashAlgorithm=e[t++],this.publicKeyAlgorithm=e[t++],this.issuerKeyId=new a.default,this.issuerKeyId.read(e.subarray(t,t+8)),t+=8,this.flags=e[t++],this},c.prototype.write=function(){const e=new Uint8Array([3,s.default.write(s.default.signature,this.signatureType),s.default.write(s.default.hash,this.hashAlgorithm),s.default.write(s.default.publicKey,this.publicKeyAlgorithm)]),t=new Uint8Array([this.flags]);return o.default.concatUint8Array([e,this.issuerKeyId.write(),t])},c.prototype.postCloneTypeFix=function(){this.issuerKeyId=a.default.fromClone(this.issuerKeyId)},c.prototype.hash=i.default.prototype.hash,c.prototype.toHash=i.default.prototype.toHash,c.prototype.toSign=i.default.prototype.toSign,c.prototype.calculateTrailer=function(...e){return n.default.fromAsync(async()=>i.default.prototype.calculateTrailer.apply(await this.correspondingSig,e))},c.prototype.verify=async function(){const e=await this.correspondingSig;if(!e||e.tag!==s.default.packet.signature)throw new Error("Corresponding signature packet missing");if(e.signatureType!==this.signatureType||e.hashAlgorithm!==this.hashAlgorithm||e.publicKeyAlgorithm!==this.publicKeyAlgorithm||!e.issuerKeyId.equals(this.issuerKeyId))throw new Error("Corresponding signature packet does not match one-pass signature packet");return e.hashed=this.hashed,e.verify.apply(e,arguments)},r.default=c},{"../enums":113,"../type/keyid":154,"../util":158,"./signature":142,"web-stream-tools":75}],135:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],n=!0,i=!1,a=void 0;try{for(var s,o=e[Symbol.iterator]();!(n=(s=o.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(u){i=!0,a=u}finally{try{!n&&o.return&&o.return()}finally{if(i)throw a}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=o(e("web-stream-tools")),a=o(e("../enums")),s=o(e("../util"));function o(e){return e&&e.__esModule?e:{default:e}}r.default={readSimpleLength:function(e){let t,r=0;const i=e[0];i<192?(r=n(e,1)[0],t=1):i<255?(r=(e[0]-192<<8)+e[1]+192,t=2):255===i&&(r=s.default.readNumber(e.subarray(1,5)),t=5);return{len:r,offset:t}},writeSimpleLength:function(e){return e<192?new Uint8Array([e]):e>191&&e<8384?new Uint8Array([192+(e-192>>8),e-192&255]):s.default.concatUint8Array([new Uint8Array([255]),s.default.writeNumber(e,4)])},writePartialLength:function(e){if(e<0||e>30)throw new Error("Partial Length power must be between 1 and 30");return new Uint8Array([224+e])},writeTag:function(e){return new Uint8Array([192|e])},writeHeader:function(e,t){return s.default.concatUint8Array([this.writeTag(e),this.writeSimpleLength(t)])},supportsStreaming:function(e){return[a.default.packet.literal,a.default.packet.compressed,a.default.packet.symmetricallyEncrypted,a.default.packet.symEncryptedIntegrityProtected,a.default.packet.symEncryptedAEADProtected].includes(e)},read:async function(e,t,r){const n=i.default.getReader(e);let a,o;try{const e=await n.peekBytes(2);if(!e||e.length<2||0==(128&e[0]))throw new Error("Error during parsing. This message / key probably does not conform to a valid OpenPGP format.");const f=await n.readByte();let d,l,h=-1,p=-1;p=0,0!=(64&f)&&(p=1),p?h=63&f:(h=(63&f)>>2,l=3&f);const y=this.supportsStreaming(h);let b,m=null;if(t&&y){const e=new TransformStream;a=i.default.getWriter(e.writable),o=r({tag:h,packet:m=e.readable})}else m=[];do{if(p){const e=await n.readByte();if(b=!1,e<192)d=e;else if(e>=192&&e<224)d=(e-192<<8)+await n.readByte()+192;else if(e>223&&e<255){if(d=1<<(31&e),b=!0,!y)throw new TypeError("This packet type does not support partial lengths.")}else d=await n.readByte()<<24|await n.readByte()<<16|await n.readByte()<<8|await n.readByte()}else switch(l){case 0:d=await n.readByte();break;case 1:d=await n.readByte()<<8|await n.readByte();break;case 2:d=await n.readByte()<<24|await n.readByte()<<16|await n.readByte()<<8|await n.readByte();break;default:d=1/0}if(d>0){let e=0;for(;;){a&&await a.ready;var u=await n.read();const t=u.done,r=u.value;if(t){if(d===1/0)break;throw new Error("Unexpected end of packet")}const i=d===1/0?r:r.subarray(0,d-e);if(a?await a.write(i):m.push(i),(e+=r.length)>=d){n.unshift(r.subarray(d-e+r.length));break}}}}while(b);const g=await n.peekBytes(y?1/0:2);return a?(await a.ready,await a.close()):(m=s.default.concatUint8Array(m),await r({tag:h,packet:m})),!g||!g.length}catch(c){if(a)return await a.abort(c),!0;throw c}finally{a&&await o,n.releaseLock()}}}},{"../enums":113,"../util":158,"web-stream-tools":75}],136:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=c(e("web-stream-tools")),i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(e("./all_packets")),a=c(e("./packet")),s=c(e("../config")),o=c(e("../enums")),u=c(e("../util"));function c(e){return e&&e.__esModule?e:{default:e}}function f(){this.length=0}f.prototype=[],f.prototype.read=async function(e,t){this.stream=n.default.transformPair(e,async(e,r)=>{const c=n.default.getWriter(r);try{for(;;){if(await c.ready,await a.default.read(e,t,async e=>{try{const n=o.default.read(o.default.packet,e.tag),d=i.newPacketFromTag(n);d.packets=new f,d.fromStream=u.default.isStream(e.packet),await d.read(e.packet,t),await c.write(d)}catch(r){s.default.tolerant&&!a.default.supportsStreaming(e.tag)||await c.abort(r),u.default.print_debug_error(r)}}))return await c.ready,void(await c.close())}}catch(d){await c.abort(d)}});const r=n.default.getReader(this.stream);for(;;){var c=await r.read();const e=c.done,t=c.value;if(e?this.stream=null:this.push(t),e||a.default.supportsStreaming(t.tag))break}r.releaseLock()},f.prototype.write=function(){const e=[];for(let t=0;t{if(i.push(e),(s+=e.length)>=o){const e=Math.min(Math.log(s)/Math.LN2|0,30),t=2**e,r=u.default.concat([a.default.writePartialLength(e)].concat(i));return i=[r.subarray(1+t)],s=i[0].length,r.subarray(0,1+t)}},()=>u.default.concat([a.default.writeSimpleLength(s)].concat(i))))}else{if(u.default.isStream(r)){let i=0;e.push(n.default.transform(n.default.clone(r),e=>{i+=e.length},()=>a.default.writeHeader(this[t].tag,i)))}else e.push(a.default.writeHeader(this[t].tag,r.length));e.push(r)}}return u.default.concat(e)},f.prototype.push=function(e){e&&(e.packets=e.packets||new f,this[this.length]=e,this.length++)},f.prototype.filterByTag=function(...e){const t=new f,r=e=>t=>e===t;for(let n=0;nt.tag===e)},f.prototype.indexOfTag=function(...e){const t=[],r=this,n=e=>t=>e===t;for(let i=0;ii.fromStructuredClone(e))),t},r.default=f},{"../config":79,"../enums":113,"../util":158,"./all_packets":128,"./packet":135,"web-stream-tools":75}],137:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=e("asmcrypto.js/dist_es5/hash/sha1/sha1"),i=e("asmcrypto.js/dist_es5/hash/sha256/sha256"),a=d(e("../type/keyid")),s=d(e("../type/mpi")),o=d(e("../config")),u=d(e("../crypto")),c=d(e("../enums")),f=d(e("../util"));function d(e){return e&&e.__esModule?e:{default:e}}function l(e=new Date){this.tag=c.default.packet.publicKey,this.version=o.default.v5_keys?5:4,this.created=f.default.normalizeDate(e),this.algorithm=null,this.params=[],this.expirationTimeV3=0,this.fingerprint=null,this.keyid=null}l.prototype.read=function(e){let t=0;if(this.version=e[t++],4===this.version||5===this.version){this.created=f.default.readDate(e.subarray(t,t+4)),t+=4,this.algorithm=c.default.read(c.default.publicKey,e[t++]);const r=c.default.write(c.default.publicKey,this.algorithm);5===this.version&&(t+=4);const n=u.default.getPubKeyParamTypes(r);this.params=u.default.constructParams(n);for(let i=0;ie.length)throw new Error("Error reading MPI @:"+t);return t}throw new Error("Version "+this.version+" of the key packet is unsupported.")},l.prototype.readPublicKey=l.prototype.read,l.prototype.write=function(){const e=[];e.push(new Uint8Array([this.version])),e.push(f.default.writeDate(this.created));const t=c.default.write(c.default.publicKey,this.algorithm);e.push(new Uint8Array([t]));const r=u.default.getPubKeyParamTypes(t).length,n=f.default.concatUint8Array(this.params.slice(0,r).map(e=>e.write()));return 5===this.version&&e.push(f.default.writeNumber(n.length,4)),e.push(n),f.default.concatUint8Array(e)},l.prototype.writePublicKey=l.prototype.write,l.prototype.writeForHash=function(e){const t=this.writePublicKey();return 5===e?f.default.concatUint8Array([new Uint8Array([154]),f.default.writeNumber(t.length,4),t]):f.default.concatUint8Array([new Uint8Array([153]),f.default.writeNumber(t.length,2),t])},l.prototype.isDecrypted=function(){return null},l.prototype.getCreationTime=function(){return this.created},l.prototype.getKeyId=function(){return this.keyid?this.keyid:(this.keyid=new a.default,5===this.version?this.keyid.read(f.default.hex_to_Uint8Array(this.getFingerprint()).subarray(0,8)):4===this.version&&this.keyid.read(f.default.hex_to_Uint8Array(this.getFingerprint()).subarray(12,20)),this.keyid)},l.prototype.getFingerprintBytes=function(){if(this.fingerprint)return this.fingerprint;const e=this.writeForHash(this.version);return 5===this.version?this.fingerprint=i.Sha256.bytes(e):4===this.version&&(this.fingerprint=n.Sha1.bytes(e)),this.fingerprint},l.prototype.getFingerprint=function(){return f.default.Uint8Array_to_hex(this.getFingerprintBytes())},l.prototype.hasSameFingerprintAs=function(e){return this.version===e.version&&f.default.equalsUint8Array(this.writePublicKey(),e.writePublicKey())},l.prototype.getAlgorithmInfo=function(){const e={};return e.algorithm=this.algorithm,this.params[0]instanceof s.default?(e.rsaBits=8*this.params[0].byteLength(),e.bits=e.rsaBits):e.curve=this.params[0].getName(),e},l.prototype.postCloneTypeFix=function(){const e=c.default.write(c.default.publicKey,this.algorithm),t=u.default.getPubKeyParamTypes(e);for(let r=0;re.length)throw new Error("Error reading param @:"+a);return i}function l(e,t){const r=[],n=o.default.write(o.default.publicKey,t);for(let i=s.default.getPubKeyParamTypes(n).length;i{e.data.fill(0)}),this.params.length=t,this.isEncrypted=!0},f.prototype.postCloneTypeFix=function(){const e=o.default.write(o.default.publicKey,this.algorithm),t=[].concat(s.default.getPubKeyParamTypes(e),s.default.getPrivKeyParamTypes(e));for(let r=0;ro.default.signature.sign(s,f,p,l,await n.default.readToEnd(h));return i?this.signature=n.default.fromAsync(y):(this.signature=await y(),this.verified=!0),!0},l.prototype.write_hashed_sub_packets=function(){const e=u.default.signatureSubpacket,t=[];let r;null!==this.created&&t.push(h(e.signature_creation_time,c.default.writeDate(this.created))),null!==this.signatureExpirationTime&&t.push(h(e.signature_expiration_time,c.default.writeNumber(this.signatureExpirationTime,4))),null!==this.exportable&&t.push(h(e.exportable_certification,new Uint8Array([this.exportable?1:0]))),null!==this.trustLevel&&(r=new Uint8Array([this.trustLevel,this.trustAmount]),t.push(h(e.trust_signature,r))),null!==this.regularExpression&&t.push(h(e.regular_expression,this.regularExpression)),null!==this.revocable&&t.push(h(e.revocable,new Uint8Array([this.revocable?1:0]))),null!==this.keyExpirationTime&&t.push(h(e.key_expiration_time,c.default.writeNumber(this.keyExpirationTime,4))),null!==this.preferredSymmetricAlgorithms&&(r=c.default.str_to_Uint8Array(c.default.Uint8Array_to_str(this.preferredSymmetricAlgorithms)),t.push(h(e.preferred_symmetric_algorithms,r))),null!==this.revocationKeyClass&&(r=new Uint8Array([this.revocationKeyClass,this.revocationKeyAlgorithm]),r=c.default.concat([r,this.revocationKeyFingerprint]),t.push(h(e.revocation_key,r))),this.notations.forEach(([n,i])=>{(r=[new Uint8Array([128,0,0,0])]).push(c.default.writeNumber(n.length,2)),r.push(c.default.writeNumber(i.length,2)),r.push(c.default.str_to_Uint8Array(n+i)),r=c.default.concat(r),t.push(h(e.notation_data,r))}),null!==this.preferredHashAlgorithms&&(r=c.default.str_to_Uint8Array(c.default.Uint8Array_to_str(this.preferredHashAlgorithms)),t.push(h(e.preferred_hash_algorithms,r))),null!==this.preferredCompressionAlgorithms&&(r=c.default.str_to_Uint8Array(c.default.Uint8Array_to_str(this.preferredCompressionAlgorithms)),t.push(h(e.preferred_compression_algorithms,r))),null!==this.keyServerPreferences&&(r=c.default.str_to_Uint8Array(c.default.Uint8Array_to_str(this.keyServerPreferences)),t.push(h(e.key_server_preferences,r))),null!==this.preferredKeyServer&&t.push(h(e.preferred_key_server,c.default.str_to_Uint8Array(this.preferredKeyServer))),null!==this.isPrimaryUserID&&t.push(h(e.primary_user_id,new Uint8Array([this.isPrimaryUserID?1:0]))),null!==this.policyURI&&t.push(h(e.policy_uri,c.default.str_to_Uint8Array(this.policyURI))),null!==this.keyFlags&&(r=c.default.str_to_Uint8Array(c.default.Uint8Array_to_str(this.keyFlags)),t.push(h(e.key_flags,r))),null!==this.signersUserId&&t.push(h(e.signers_user_id,c.default.str_to_Uint8Array(this.signersUserId))),null!==this.reasonForRevocationFlag&&(r=c.default.str_to_Uint8Array(String.fromCharCode(this.reasonForRevocationFlag)+this.reasonForRevocationString),t.push(h(e.reason_for_revocation,r))),null!==this.features&&(r=c.default.str_to_Uint8Array(c.default.Uint8Array_to_str(this.features)),t.push(h(e.features,r))),null!==this.signatureTargetPublicKeyAlgorithm&&((r=[new Uint8Array([this.signatureTargetPublicKeyAlgorithm,this.signatureTargetHashAlgorithm])]).push(c.default.str_to_Uint8Array(this.signatureTargetHash)),r=c.default.concat(r),t.push(h(e.signature_target,r))),null!==this.preferredAeadAlgorithms&&(r=c.default.str_to_Uint8Array(c.default.Uint8Array_to_str(this.preferredAeadAlgorithms)),t.push(h(e.preferred_aead_algorithms,r)));const n=c.default.concat(t),i=c.default.writeNumber(n.length,2);return c.default.concat([i,n])},l.prototype.write_unhashed_sub_packets=function(){const e=u.default.signatureSubpacket,t=[];let r;this.issuerKeyId.isNull()||5===this.issuerKeyVersion||t.push(h(e.issuer,this.issuerKeyId.write())),null!==this.embeddedSignature&&t.push(h(e.embedded_signature,this.embeddedSignature.write())),null!==this.issuerFingerprint&&(r=[new Uint8Array([this.issuerKeyVersion]),this.issuerFingerprint],r=c.default.concat(r),t.push(h(e.issuer_fingerprint,r))),this.unhashedSubpackets.forEach(e=>{t.push(i.default.writeSimpleLength(e.length)),t.push(e)});const n=c.default.concat(t),a=c.default.writeNumber(n.length,2);return c.default.concat([a,n])},l.prototype.read_sub_packet=function(e,t=!0){let r=0;const n=(e,t)=>{this[e]=[];for(let r=0;r{r+=e.length},()=>{const n=[];return 5!==this.version||this.signatureType!==u.default.signature.binary&&this.signatureType!==u.default.signature.text||(t?n.push(new Uint8Array(6)):n.push(e.writeHeader())),n.push(new Uint8Array([this.version,255])),5===this.version&&n.push(new Uint8Array(4)),n.push(c.default.writeNumber(r,4)),c.default.concat(n)})},l.prototype.toHash=function(e,t,r=!1){const n=this.toSign(e,t);return c.default.concat([n,this.signatureData,this.calculateTrailer(t,r)])},l.prototype.hash=async function(e,t,r,i=!1,a=!0){const s=u.default.write(u.default.hash,this.hashAlgorithm);return r||(r=this.toHash(e,t,i)),!a&&c.default.isStream(r)?n.default.fromAsync(async()=>this.hash(e,t,await n.default.readToEnd(r),i)):o.default.hash.digest(s,r)},l.prototype.verify=async function(e,t,r,i=!1,a=!1){const c=u.default.write(u.default.publicKey,this.publicKeyAlgorithm),d=u.default.write(u.default.hash,this.hashAlgorithm);if(c!==u.default.write(u.default.publicKey,e.algorithm))throw new Error("Public key algorithm used to sign signature does not match issuer key algorithm.");let l,h;if(this.hashed?h=await this.hashed:(l=this.toHash(t,r,i),a||(l=await n.default.readToEnd(l)),h=await this.hash(t,r,l)),h=await n.default.readToEnd(h),this.signedHashValue[0]!==h[0]||this.signedHashValue[1]!==h[1])throw new Error("Message digest did not match");let p=0;c>0&&c<4?p=1:c!==u.default.publicKey.dsa&&c!==u.default.publicKey.ecdsa&&c!==u.default.publicKey.eddsa||(p=2);const y=c===u.default.publicKey.eddsa?"le":"be",b=[];let m=0;this.signature=await n.default.readToEnd(this.signature);for(let n=0;n{if(await e.readByte()!==c)throw new Error("Invalid packet version.");this.cipherAlgo=await e.readByte(),this.aeadAlgo=await e.readByte(),this.chunkSizeByte=await e.readByte();const t=a.default[s.default.read(s.default.aead,this.aeadAlgo)];this.iv=await e.readBytes(t.ivLength),this.encrypted=e.remainder()})},f.prototype.write=function(){return o.default.concat([new Uint8Array([this.version,this.cipherAlgo,this.aeadAlgo,this.chunkSizeByte]),this.iv,this.encrypted])},f.prototype.decrypt=async function(e,t,r){return await this.packets.read(await this.crypt("decrypt",t,n.default.clone(this.encrypted),r),r),!0},f.prototype.encrypt=async function(e,t,r){this.cipherAlgo=s.default.write(s.default.symmetric,e),this.aeadAlgo=s.default.write(s.default.aead,this.aeadAlgorithm);const n=a.default[s.default.read(s.default.aead,this.aeadAlgo)];this.iv=await a.default.random.getRandomBytes(n.ivLength),this.chunkSizeByte=i.default.aead_chunk_size_byte;const o=this.packets.write();this.encrypted=await this.crypt("encrypt",t,o,r)},f.prototype.crypt=async function(e,t,r,i){const u=s.default.read(s.default.symmetric,this.cipherAlgo),c=a.default[s.default.read(s.default.aead,this.aeadAlgo)],f=await c(u,t),d="decrypt"===e?c.tagLength:0,l="encrypt"===e?c.tagLength:0,h=2**(this.chunkSizeByte+6)+d,p=new ArrayBuffer(21),y=new Uint8Array(p,0,13),b=new Uint8Array(p),m=new DataView(p),g=new Uint8Array(p,5,8);y.set([192|this.tag,this.version,this.cipherAlgo,this.aeadAlgo,this.chunkSizeByte],0);let w=0,_=Promise.resolve(),v=0,k=0;const A=this.iv;return n.default.transformPair(r,async(t,r)=>{const a=n.default.getReader(t),s=new TransformStream({},{highWaterMark:i?o.default.getHardwareConcurrency()*2**(this.chunkSizeByte+6):1/0,size:e=>e.length});n.default.pipe(s.readable,r);const u=n.default.getWriter(s.writable);try{for(;;){let t=await a.readBytes(h+d)||new Uint8Array;const r=t.subarray(t.length-d);let n,i;if(t=t.subarray(0,t.length-d),!w||t.length?(a.unshift(r),n=f[e](t,c.getNonce(A,g),y),k+=t.length-d+l):(m.setInt32(17,v),n=f[e](r,c.getNonce(A,g),b),k+=l,i=!0),v+=t.length-d,_=_.then(()=>n).then(async e=>{await u.ready,await u.write(e),k-=e.length}).catch(e=>u.abort(e)),(i||k>u.desiredSize)&&await _,i){await u.close();break}m.setInt32(9,++w)}}catch(p){await u.abort(p)}})}},{"../config":79,"../crypto":94,"../enums":113,"../util":158,"web-stream-tools":75}],144:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=u(e("web-stream-tools")),i=u(e("../config")),a=u(e("../crypto")),s=u(e("../enums")),o=u(e("../util"));function u(e){return e&&e.__esModule?e:{default:e}}const c=1;function f(){this.tag=s.default.packet.symEncryptedIntegrityProtected,this.version=c,this.encrypted=null,this.modification=!1,this.packets=null}f.prototype.read=async function(e){await n.default.parse(e,async e=>{if(await e.readByte()!==c)throw new Error("Invalid packet version.");this.encrypted=e.remainder()})},f.prototype.write=function(){return o.default.concat([new Uint8Array([c]),this.encrypted])},f.prototype.encrypt=async function(e,t,r){let i=this.packets.write();r||(i=await n.default.readToEnd(i));const s=await a.default.getPrefixRandom(e),u=new Uint8Array([211,20]),c=o.default.concat([s,i,u]),f=await a.default.hash.sha1(n.default.passiveClone(c)),d=o.default.concat([c,f]);return this.encrypted=await a.default.cfb.encrypt(e,t,d,new Uint8Array(a.default.cipher[e].blockSize)),!0},f.prototype.decrypt=async function(e,t,r){let s=n.default.clone(this.encrypted);r||(s=await n.default.readToEnd(s));const u=await a.default.cfb.decrypt(e,t,s,new Uint8Array(a.default.cipher[e].blockSize)),c=n.default.slice(n.default.passiveClone(u),-20),f=n.default.slice(u,0,-20),d=Promise.all([n.default.readToEnd(await a.default.hash.sha1(n.default.passiveClone(f))),n.default.readToEnd(c)]).then(([e,t])=>{if(!o.default.equalsUint8Array(e,t))throw new Error("Modification detected.");return new Uint8Array}),l=n.default.slice(f,a.default.cipher[e].blockSize+2);let h=n.default.slice(l,0,-2);return h=n.default.concat([h,n.default.fromAsync(()=>d)]),o.default.isStream(s)&&i.default.allow_unauthenticated_stream||(h=await n.default.readToEnd(h)),await this.packets.read(h,r),!0},r.default=f},{"../config":79,"../crypto":94,"../enums":113,"../util":158,"web-stream-tools":75}],145:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=u(e("../type/s2k")),i=u(e("../config")),a=u(e("../crypto")),s=u(e("../enums")),o=u(e("../util"));function u(e){return e&&e.__esModule?e:{default:e}}function c(){this.tag=s.default.packet.symEncryptedSessionKey,this.version=i.default.aead_protect?5:4,this.sessionKey=null,this.sessionKeyEncryptionAlgorithm=null,this.sessionKeyAlgorithm="aes256",this.aeadAlgorithm=s.default.read(s.default.aead,i.default.aead_mode),this.encrypted=null,this.s2k=null,this.iv=null}c.prototype.read=function(e){let t=0;this.version=e[t++];const r=s.default.read(s.default.symmetric,e[t++]);if(5===this.version&&(this.aeadAlgorithm=s.default.read(s.default.aead,e[t++])),this.s2k=new n.default,t+=this.s2k.read(e.subarray(t,e.length)),5===this.version){const r=a.default[this.aeadAlgorithm];this.iv=e.subarray(t,t+=r.ivLength)}5===this.version||t=1){const t=e[0];if(e.length>=1+t)return this.data=e.subarray(1,1+t),1+this.data.length}throw new Error("Invalid symmetric key")},s.prototype.write=function(){return a.default.concatUint8Array([new Uint8Array([this.data.length]),this.data])},s.fromClone=function(e){return new s(e.data)},r.default=s},{"../util":158}],153:[function(e,t,r){"use strict";function n(e){if(e){const t=e.hash,r=e.cipher;this.hash=t,this.cipher=r}else this.hash=null,this.cipher=null}Object.defineProperty(r,"__esModule",{value:!0}),n.prototype.read=function(e){if(e.length<4||3!==e[0]||1!==e[1])throw new Error("Cannot read KDFParams");return this.hash=e[2],this.cipher=e[3],4},n.prototype.write=function(){return new Uint8Array([3,1,this.hash,this.cipher])},n.fromClone=function(e){return new n({hash:e.hash,cipher:e.cipher})},r.default=n},{}],154:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=e("../util.js"),a=(n=i)&&n.__esModule?n:{default:n};function s(){this.bytes=""}s.prototype.read=function(e){this.bytes=a.default.Uint8Array_to_str(e.subarray(0,8))},s.prototype.write=function(){return a.default.str_to_Uint8Array(this.bytes)},s.prototype.toHex=function(){return a.default.str_to_hex(this.bytes)},s.prototype.equals=function(e,t=!1){return t&&(e.isWildcard()||this.isWildcard())||this.bytes===e.bytes},s.prototype.isNull=function(){return""===this.bytes},s.prototype.isWildcard=function(){return/^0+$/.test(this.toHex())},s.mapToHex=function(e){return e.toHex()},s.fromClone=function(e){const t=new s;return t.bytes=e.bytes,t},s.fromId=function(e){const t=new s;return t.read(a.default.hex_to_Uint8Array(e)),t},s.wildcard=function(){const e=new s;return e.read(new Uint8Array(8)),e},r.default=s},{"../util.js":158}],155:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=a(e("bn.js")),i=a(e("../util"));function a(e){return e&&e.__esModule?e:{default:e}}function s(e){e instanceof s?this.data=e.data:n.default.isBN(e)?this.fromBN(e):i.default.isUint8Array(e)?this.fromUint8Array(e):i.default.isString(e)?this.fromString(e):this.data=null}s.prototype.read=function(e,t="be"){i.default.isString(e)&&(e=i.default.str_to_Uint8Array(e));const r=(e[0]<<8|e[1])+7>>>3,n=e.subarray(2,2+r);return this.fromUint8Array(n,t),2+r},s.prototype.write=function(e,t){return i.default.Uint8Array_to_MPI(this.toUint8Array(e,t))},s.prototype.bitLength=function(){return 8*(this.data.length-1)+i.default.nbits(this.data[0])},s.prototype.byteLength=function(){return this.data.length},s.prototype.toUint8Array=function(e,t){e=e||"be",t=t||this.data.length;const r=new Uint8Array(t),n="le"===e?0:t-this.data.length;return r.set(this.data,n),"le"===e&&r.reverse(),r},s.prototype.fromUint8Array=function(e,t="be"){this.data=new Uint8Array(e.length),this.data.set(e),"le"===t&&this.data.reverse()},s.prototype.toString=function(){return i.default.Uint8Array_to_str(this.toUint8Array())},s.prototype.fromString=function(e,t="be"){this.fromUint8Array(i.default.str_to_Uint8Array(e),t)},s.prototype.toBN=function(){return new n.default(this.toUint8Array())},s.prototype.fromBN=function(e){this.data=e.toArrayLike(Uint8Array)},s.fromClone=function(e){return new s(e.data)},r.default=s},{"../util":158,"bn.js":16}],156:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=a(e("../util")),i=a(e("../enums"));function a(e){return e&&e.__esModule?e:{default:e}}function s(e){if(e instanceof s)this.oid=e.oid;else if(n.default.isArray(e)||n.default.isUint8Array(e)){if(6===(e=new Uint8Array(e))[0]){if(e[1]!==e.length-2)throw new Error("Length mismatch in DER encoded oid");e=e.subarray(2)}this.oid=e}else this.oid=""}s.prototype.read=function(e){if(e.length>=1){const t=e[0];if(e.length>=1+t)return this.oid=e.subarray(1,1+t),1+this.oid.length}throw new Error("Invalid oid")},s.prototype.write=function(){return n.default.concatUint8Array([new Uint8Array([this.oid.length]),this.oid])},s.prototype.toHex=function(){return n.default.Uint8Array_to_hex(this.oid)},s.prototype.getName=function(){const e=this.toHex();if(i.default.curve[e])return i.default.write(i.default.curve,e);throw new Error("Unknown curve object identifier.")},s.fromClone=function(e){return new s(e.oid)},r.default=s},{"../enums":113,"../util":158}],157:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=o(e("../config")),i=o(e("../crypto")),a=o(e("../enums.js")),s=o(e("../util.js"));function o(e){return e&&e.__esModule?e:{default:e}}function u(){this.algorithm="sha256",this.type="iterated",this.c=n.default.s2k_iteration_count_byte,this.salt=null}u.prototype.get_count=function(){return 16+(15&this.c)<<6+(this.c>>4)},u.prototype.read=function(e){let t=0;switch(this.type=a.default.read(a.default.s2k,e[t++]),this.algorithm=e[t++],"gnu"!==this.type&&(this.algorithm=a.default.read(a.default.hash,this.algorithm)),this.type){case"simple":break;case"salted":this.salt=e.subarray(t,t+8),t+=8;break;case"iterated":this.salt=e.subarray(t,t+8),t+=8,this.c=e[t++];break;case"gnu":if("GNU"!==s.default.Uint8Array_to_str(e.subarray(t,t+3)))throw new Error("Unknown s2k type.");if(t+=3,1001!==1e3+e[t++])throw new Error("Unknown s2k gnu protection mode.");this.type="gnu-dummy";break;default:throw new Error("Unknown s2k type.")}return t},u.prototype.write=function(){if("gnu-dummy"===this.type)return new Uint8Array([101,0,...s.default.str_to_Uint8Array("GNU"),1]);const e=[new Uint8Array([a.default.write(a.default.s2k,this.type),a.default.write(a.default.hash,this.algorithm)])];switch(this.type){case"simple":break;case"salted":e.push(this.salt);break;case"iterated":e.push(this.salt),e.push(new Uint8Array([this.c]));break;case"gnu":throw new Error("GNU s2k type not supported.");default:throw new Error("Unknown s2k type.")}return s.default.concatUint8Array(e)},u.prototype.produce_key=async function(e,t){e=s.default.encode_utf8(e);const r=a.default.write(a.default.hash,this.algorithm),n=[];let o=0,u=0;for(;o{if(s.default.isStream(a))if(a.locked)e[n]=null;else{const r=i.default.transformPair(a,async a=>{const o=i.default.getReader(a);var u=new MessageChannel;const c=u.port1,f=u.port2;c.onmessage=async function({data:{action:e}}){if("read"===e)try{const e=await o.read();c.postMessage(e,s.default.getTransferables(e))}catch(t){c.postMessage({error:t.message})}else"cancel"===e&&(await r.cancel(),c.postMessage())},e[n]=f,t.push(f)})}else{if("[object MessagePort]"===Object.prototype.toString.call(a))throw new Error("Can't transfer the same stream twice.");s.default.collectTransferables(a,t,r)}}))},restoreStreams:function(e){return Object.prototype.isPrototypeOf(e)&&!Uint8Array.prototype.isPrototypeOf(e)&&Object.entries(e).forEach(([t,r])=>{"[object MessagePort]"!==Object.prototype.toString.call(r)?s.default.restoreStreams(r):e[t]=new ReadableStream({pull:e=>new Promise(t=>{r.onmessage=(r=>{var n=r.data;const i=n.done,a=n.value,s=n.error;s?e.error(new Error(s)):i?e.close():e.enqueue(a),t()}),r.postMessage({action:"read"})}),cancel:()=>new Promise(e=>{r.onmessage=e,r.postMessage({action:"cancel"})})},{highWaterMark:0})}),e},readNumber:function(e){let t=0;for(let r=0;r>8*(t-n-1)&255;return r},readDate:function(e){const t=s.default.readNumber(e);return new Date(1e3*t)},writeDate:function(e){const t=Math.floor(e.getTime()/1e3);return s.default.writeNumber(t,4)},normalizeDate:function(e=Date.now()){return null===e||e===1/0?e:new Date(1e3*Math.floor(+e/1e3))},str_to_hex:function(e){if(null===e)return"";const t=[],r=e.length;let n,i=0;for(;i>8,255&t]);return s.default.concatUint8Array([r,e])},b64_to_Uint8Array:function(e){return o.default.decode(e.replace(/-/g,"+").replace(/_/g,"/"))},Uint8Array_to_b64:function(e,t){let r=o.default.encode(e).replace(/[\r\n]/g,"");return t&&(r=r.replace(/[+]/g,"-").replace(/[/]/g,"_").replace(/[=]/g,"")),r},hex_to_Uint8Array:function(e){const t=new Uint8Array(e.length>>1);for(let r=0;r>1;r++)t[r]=parseInt(e.substr(r<<1,2),16);return t},Uint8Array_to_hex:function(e){const t=[],r=e.length;let n,i=0;for(;i{if(!s.default.isString(e))throw new Error("str_to_Uint8Array: Data must be in the form of a string");const t=new Uint8Array(e.length);for(let r=0;rr("",!0))},decode_utf8:function(e){const t=new TextDecoder("utf-8");function r(e,r=!1){return t.decode(e,{stream:!r})}return i.default.transform(e,r,()=>r(new Uint8Array,!0))},concat:i.default.concat,concatUint8Array:i.default.concatUint8Array,equalsUint8Array:function(e,t){if(!s.default.isUint8Array(e)||!s.default.isUint8Array(t))throw new Error("Data must be in the form of a Uint8Array");if(e.length!==t.length)return!1;for(let r=0;r{console.log(e+": ",t)})},nbits:function(e){let t=1,r=e>>>16;return 0!==r&&(e=r,t+=16),0!==(r=e>>8)&&(e=r,t+=8),0!==(r=e>>4)&&(e=r,t+=4),0!==(r=e>>2)&&(e=r,t+=2),0!==(r=e>>1)&&(e=r,t+=1),t},double:function(e){const t=new Uint8Array(e.length),r=e.length-1;for(let n=0;n>7;return t[r]=e[r]<<1^135*(e[0]>>7),t},shiftRight:function(e,t){if(t)for(let r=e.length-1;r>=0;r--)e[r]>>=t,r>0&&(e[r]|=e[r-1]<<8-t);return e},getWebCrypto:function(){if(a.default.use_native)return void 0!==t&&t.crypto&&t.crypto.subtle},getWebCryptoAll:function(){if(a.default.use_native&&void 0!==t){if(t.crypto)return t.crypto.subtle||t.crypto.webkitSubtle;if(t.msCrypto)return t.msCrypto.subtle}},detectNode:function(){return"object"==typeof t.process&&"object"==typeof t.process.versions},nodeRequire:function(t){if(s.default.detectNode())return e(t)},getNodeCrypto:function(){if(a.default.use_native)return s.default.nodeRequire("crypto")},getNodeZlib:function(){if(a.default.use_native)return s.default.nodeRequire("zlib")},getNodeBuffer:function(){return(s.default.nodeRequire("buffer")||{}).Buffer},getNodeStream:function(){return(s.default.nodeRequire("stream")||{}).Readable},getHardwareConcurrency:function(){if(s.default.detectNode()){return s.default.nodeRequire("os").cpus().length}return navigator.hardwareConcurrency||1},isEmailAddress:function(e){if(!s.default.isString(e))return!1;return/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+([a-zA-Z]{2,}|xn--[a-zA-Z\-0-9]+)))$/.test(e)},formatUserId:function(e){if(e.name&&!s.default.isString(e.name)||e.email&&!s.default.isEmailAddress(e.email)||e.comment&&!s.default.isString(e.comment))throw new Error("Invalid user id format");const t=[];return e.name&&t.push(e.name),e.comment&&t.push(`(${e.comment})`),e.email&&t.push(`<${e.email}>`),t.join(" ")},parseUserId:function(e){if(e.length>a.default.max_userid_length)throw new Error("User id string is too long");try{var t=n.default.parseOneAddress({input:e,atInDisplayName:!0});return{name:t.name,email:t.address,comment:t.comments.replace(/^\(|\)$/g,"")}}catch(r){throw new Error("Invalid user id format")}},canonicalizeEOL:function(e){let t=!1;return i.default.transform(e,e=>{let r;t&&(e=s.default.concatUint8Array([new Uint8Array([13]),e])),13===e[e.length-1]?(t=!0,e=e.subarray(0,-1)):t=!1;const n=[];for(let t=0;r=e.indexOf(10,t)+1;t=r)13!==e[r-2]&&n.push(r);if(!n.length)return e;const i=new Uint8Array(e.length+n.length);let a=0;for(let t=0;tt?new Uint8Array([13]):void 0)},nativeEOL:function(e){let t=!1;return i.default.transform(e,e=>{let r;13===(e=t&&10!==e[0]?s.default.concatUint8Array([new Uint8Array([13]),e]):new Uint8Array(e))[e.length-1]?(t=!0,e=e.subarray(0,-1)):t=!1;let n=0;for(let t=0;t!==e.length;t=r){(r=e.indexOf(13,t)+1)||(r=e.length);const i=r-(10===e[r]?1:0);t&&e.copyWithin(n,t,i),n+=i-t}return e.subarray(0,n)},()=>t?new Uint8Array([13]):void 0)},removeTrailingSpaces:function(e){return e.split("\n").map(e=>{let t=e.length-1;for(;t>=0&&(" "===e[t]||"\t"===e[t]);t--);return e.substr(0,t+1)}).join("\n")},encodeZBase32:function(e){if(0===e.length)return"";let t=e[0],r=1,n=8,i="";for(;n>0||r>(n-=5)]}return i},wrapError:function(e,t){if(!t)return new Error(e);try{t.message=e+": "+t.message}catch(r){}return t}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./config":79,"./encoding/base64":112,"./util":158,"email-addresses":33,"web-stream-tools":75}],159:[function(e,t,r){(function(t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var r=[],n=!0,i=!1,a=void 0;try{for(var s,o=e[Symbol.iterator]();!(n=(s=o.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(u){i=!0,a=u}finally{try{!n&&o.return&&o.return()}finally{if(i)throw a}}return r}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=o(e("./util")),a=o(e("./crypto")),s=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(e("./key"));function o(e){return e&&e.__esModule?e:{default:e}}function u(){this._fetch=void 0!==t?t.fetch:e("node-fetch")}u.prototype.lookup=async function(e){const t=this._fetch;if(!e.email)throw new Error("You must provide an email parameter!");if(!i.default.isEmailAddress(e.email))throw new Error("Invalid e-mail address.");var r=/(.*)@(.*)/.exec(e.email),o=n(r,3);const u=o[1],c=o[2],f=i.default.encodeZBase32(await a.default.hash.sha1(i.default.str_to_Uint8Array(u.toLowerCase()))),d=`https://openpgpkey.${c}/.well-known/openpgpkey/${c}/hu/${f}`,l=`https://${c}/.well-known/openpgpkey/hu/${f}`;let h;try{if(200!==(h=await t(d)).status)throw new Error("Advanced WKD lookup failed: "+h.statusText)}catch(y){if(i.default.print_debug_error(y),200!==(h=await t(l)).status)throw new Error("Direct WKD lookup failed: "+h.statusText)}const p=new Uint8Array(await h.arrayBuffer());return e.rawBytes?p:s.read(p)},r.default=u}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./crypto":94,"./key":118,"./util":158,"node-fetch":"node-fetch"}],160:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=o(e("../util.js")),i=o(e("../config")),a=o(e("../crypto")),s=o(e("../packet"));function o(e){return e&&e.__esModule?e:{default:e}}function u({path:e="openpgp.worker.min.js",n:t=1,workers:r=[],config:n}={}){const i=e=>t=>{const r=t.data;switch(r.event){case"loaded":this.workers[e].loadedResolve(!0);break;case"method-return":if(r.err){const e=new Error(r.err);e.workerStack=r.stack,this.tasks[r.id].reject(e)}else this.tasks[r.id].resolve(r.data);delete this.tasks[r.id],this.workers[e].requests--;break;case"request-seed":this.seedRandom(e,r.amount);break;default:throw new Error("Unknown Worker Event.")}};if(r.length)this.workers=r;else for(this.workers=[];this.workers.length{e.loadedPromise=new Promise(t=>{e.loadedResolve=t}),e.requests=0,e.onmessage=i(a++),e.onerror=(t=>(e.loadedResolve(!1),console.error("Unhandled error in openpgp worker: "+t.message+" ("+t.filename+":"+t.lineno+")"),!1)),n&&e.postMessage({event:"configure",config:n})}),this.tasks={},this.currentID=0}u.prototype.loaded=async function(){return(await Promise.all(this.workers.map(e=>e.loadedPromise))).every(Boolean)},u.prototype.getID=function(){return this.currentID++},u.prototype.seedRandom=async function(e,t){const r=await a.default.random.getRandomBytes(t);this.workers[e].postMessage({event:"seed-random",buf:r},n.default.getTransferables(r,!0))},u.prototype.clearKeyCache=async function(){await Promise.all(this.workers.map(e=>new Promise((t,r)=>{const n=this.getID();e.postMessage({id:n,event:"clear-key-cache"}),this.tasks[n]={resolve:t,reject:r}})))},u.prototype.terminate=function(){this.workers.forEach(e=>{e.terminate()})},u.prototype.delegate=function(e,t){const r=this.getID(),a=this.workers.map(e=>e.requests),o=Math.min(...a);let u=0;for(;u{this.workers[u].postMessage({id:r,event:e,options:s.default.clone.clonePackets(t)},n.default.getTransferables(t,i.default.zero_copy)),this.workers[u].requests++,this.tasks[r]={resolve:t=>a(s.default.clone.parseClonedPackets(n.default.restoreStreams(t),e)),reject:o}})},r.default=u},{"../config":79,"../crypto":94,"../packet":131,"../util.js":158}]},{},[115])(115)}); \ No newline at end of file From aa9fa90229eac71cc32a661ec5a4b46d7fc00838 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 13:40:11 +0200 Subject: [PATCH 12/23] Improve routes --- routes/dep.js | 2 +- routes/encrypt.js | 2 +- routes/profile.js | 2 +- routes/proofs.js | 2 +- routes/util.js | 2 +- routes/verify.js | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/routes/dep.js b/routes/dep.js index 34d5134..2331708 100644 --- a/routes/dep.js +++ b/routes/dep.js @@ -1,4 +1,4 @@ -var router = require('express').Router(); +const router = require('express').Router(); router.get('/openpgp.min.js', function(req, res) { res.sendFile(`node_modules/openpgp/dist/openpgp.min.js`, { root: `${__dirname}/../` }) diff --git a/routes/encrypt.js b/routes/encrypt.js index e69ee10..c67bb86 100644 --- a/routes/encrypt.js +++ b/routes/encrypt.js @@ -1,4 +1,4 @@ -var router = require('express').Router(); +const router = require('express').Router(); router.get('/', function(req, res) { res.render('encrypt', { mode: "auto" }) diff --git a/routes/profile.js b/routes/profile.js index 537f5c8..978a59d 100644 --- a/routes/profile.js +++ b/routes/profile.js @@ -1,4 +1,4 @@ -var router = require('express').Router(); +const router = require('express').Router(); router.get('/wkd/:input', function(req, res) { res.render('profile', { mode: "wkd", uid: req.params.input }) diff --git a/routes/proofs.js b/routes/proofs.js index 1d06861..1e1a509 100644 --- a/routes/proofs.js +++ b/routes/proofs.js @@ -1,4 +1,4 @@ -var router = require('express').Router(); +const router = require('express').Router(); router.get('/', function(req, res) { res.render('proofs', { mode: "auto" }) diff --git a/routes/util.js b/routes/util.js index e11ecd3..57d13f2 100644 --- a/routes/util.js +++ b/routes/util.js @@ -1,4 +1,4 @@ -var router = require('express').Router(); +const router = require('express').Router(); router.get('/profile-url', function(req, res) { res.render('util/profile-url') diff --git a/routes/verify.js b/routes/verify.js index d2437c4..d5d4654 100644 --- a/routes/verify.js +++ b/routes/verify.js @@ -1,4 +1,4 @@ -var router = require('express').Router(); +const router = require('express').Router(); router.get('/', function(req, res) { res.render('verify', { mode: "auto" }) From ab9e5151ef17ae1fe18385a5279f6194f5fefd52 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 21:34:54 +0200 Subject: [PATCH 13/23] Update env template --- template.env | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 template.env diff --git a/template.env b/template.env new file mode 100644 index 0000000..be682de --- /dev/null +++ b/template.env @@ -0,0 +1,4 @@ +# Twitter API bearer code +# Documentation: https://developer.twitter.com/en/docs/basics/authentication/oauth-2-0 +# Expected format: "XXXXXXXXXXXXXXXXXXXXX" +#TWITTER_API_AUTH= From 3275f2a63696e44d7b07bd846886f28119dbc18c Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 21:35:53 +0200 Subject: [PATCH 14/23] Update package.json --- package-lock.json | 44 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 +++ 2 files changed, 47 insertions(+) diff --git a/package-lock.json b/package-lock.json index 70599fb..92bf195 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,6 +92,16 @@ "@babel/types": "^7.9.6" } }, + "bent": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.9.tgz", + "integrity": "sha512-CyuIXgoO6UWJaoMtPHkq6JlzNRjCGQqZQeYuO4W5MxY+P0sO1jM3CMYLf16eoga2ozyhVPzXVUxkPw9rz5VNgA==", + "requires": { + "bytesish": "^0.4.1", + "caseless": "~0.12.0", + "is-stream": "^2.0.0" + } + }, "bn.js": { "version": "4.11.9", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", @@ -119,6 +129,16 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, + "bytesish": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.2.tgz", + "integrity": "sha512-ym4cXhq28K7uhYZUEOl17LuqsqKSphDsZcfAKmEa/HcCsCqHMQXOiFuWx1OnbktJux/qKK1W9Xt9uU5kLIKypQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "character-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", @@ -182,6 +202,11 @@ "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -244,6 +269,15 @@ "vary": "~1.1.2" } }, + "express-validator": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.6.1.tgz", + "integrity": "sha512-+MrZKJ3eGYXkNF9p9Zf7MS7NkPJFg9MDYATU5c80Cf4F62JdLBIjWxy6481tRC0y1NnC9cgOw8FuN364bWaGhA==", + "requires": { + "lodash": "^4.17.19", + "validator": "^13.1.1" + } + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -335,6 +369,11 @@ "has-symbols": "^1.0.1" } }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, "js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -1315,6 +1354,11 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "validator": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.1.1.tgz", + "integrity": "sha512-8GfPiwzzRoWTg7OV1zva1KvrSemuMkv07MA9TTl91hfhe+wKrsrgVN4H2QSFd/U/FhiU3iWPYVgvbsOGwhyFWw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index 8af4785..21097ee 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,10 @@ "description": "A modern, secure and privacy-friendly platform to establish your decentralized online identity", "main": "index.js", "dependencies": { + "bent": "^7.3.9", + "dotenv": "^8.2.0", "express": "^4.17.1", + "express-validator": "^6.6.1", "jstransformer-markdown-it": "^2.1.0", "markdown-it-anchor": "^5.3.0", "markdown-it-table-of-contents": "^0.4.4", From 0f9c9a9f0149a35fbda13f91538f78444cc4f577 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 21:37:06 +0200 Subject: [PATCH 15/23] Ignore .env --- .gitignore | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index bd4a047..836a7d3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,27 +1,27 @@ # Copyright (C) 2020 Yarmo Mackenbach -# +# # This program is free software: you can redistribute it and/or modify it under # the terms of the GNU Affero General Public License as published by the Free # Software Foundation, either version 3 of the License, or (at your option) # any later version. -# +# # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more # details. -# +# # You should have received a copy of the GNU Affero General Public License along # with this program. If not, see . -# +# # Also add information on how to contact you by electronic and paper mail. -# +# # If your software can interact with users remotely through a computer network, # you should also make sure that it provides a way for users to get its source. # For example, if your program is a web application, its interface could display # a "Source" link that leads users to an archive of the code. There are many # ways you could offer source, and different solutions will be better for different # programs; see section 13 for the specific requirements. -# +# # You should also get your employer (if you work as a programmer) or school, # if any, to sign a "copyright disclaimer" for the program, if necessary. For # more information on this, and how to apply and follow the GNU AGPL, see . @@ -29,3 +29,4 @@ vendor node_modules server/secrets.php .editorconfig +.env From 3f3d26167745a1cf94fd2c1257ba82bee83f44b9 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 21:39:04 +0200 Subject: [PATCH 16/23] Add server scripts --- index.js | 1 + routes/server.js | 59 +++++++++++++++++ server/proofVerification.js | 127 ++++++++++++++++++++++++++++++++++++ 3 files changed, 187 insertions(+) create mode 100644 routes/server.js create mode 100644 server/proofVerification.js diff --git a/index.js b/index.js index a7013d0..b713e84 100644 --- a/index.js +++ b/index.js @@ -15,6 +15,7 @@ app.use('/favicon.svg', express.static('favicon.svg')); app.use('/', require('./routes/main')); app.use('/dep', require('./routes/dep')); +app.use('/server', require('./routes/server')); app.use('/encrypt', require('./routes/encrypt')); app.use('/verify', require('./routes/verify')); app.use('/proofs', require('./routes/proofs')); diff --git a/routes/server.js b/routes/server.js new file mode 100644 index 0000000..2269a6b --- /dev/null +++ b/routes/server.js @@ -0,0 +1,59 @@ +const router = require('express').Router(); +const { check, query, validationResult } = require('express-validator'); +const proofVerification = require('../server/proofVerification'); + +router.get('/verify/proxy', [ + query('url').isURL().exists(), + query('fingerprint').isHexadecimal().exists(), + query('checkClaim').escape(), + query('checkClaimFormat').escape(), + query('checkRelation').escape().exists(), + query('checkPath').escape().exists() +], async function(req, res) { + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(400).json({ success: false, errors: errors.array() }); + } + + let params = { + url: req.query.url, + fingerprint: req.query.fingerprint, + checkClaim: req.query.checkClaim ? req.query.checkClaim : null, + checkClaimFormat: req.query.checkClaimFormat ? req.query.checkClaimFormat : "uri", + checkRelation: req.query.checkRelation, + checkPath: req.query.checkPath.split(',') + } + + try { + const proofResult = await proofVerification.Proxy(params); + res.status(200).send(proofResult); + } catch (e) { + console.log(e); + res.status(400).send({ success: false, errors: e }); + } +}); + +router.get('/verify/twitter', [ + query('tweetId').isInt().exists(), + query('fingerprint').isHexadecimal().exists() +], async function(req, res) { + const errors = validationResult(req); + if (!errors.isEmpty()) { + return res.status(400).json({ success: false, errors: errors.array() }); + } + + let params = { + tweetId: req.query.tweetId, + fingerprint: req.query.fingerprint + } + + try { + const proofResult = await proofVerification.Twitter(params); + res.status(200).send(proofResult); + } catch (e) { + console.log(e); + res.status(400).send({ success: false, errors: e }); + } +}); + +module.exports = router; diff --git a/server/proofVerification.js b/server/proofVerification.js new file mode 100644 index 0000000..981aa5b --- /dev/null +++ b/server/proofVerification.js @@ -0,0 +1,127 @@ +const bent = require('bent'); +const getJSON = bent('json'); +require('dotenv').config(); + +const Proxy = async (params) => { + let res = { + success: false, + errors: [], + isVerified: false, + params: params + } + + if (!res.params.checkClaim) { + switch (res.params.checkClaimFormat) { + default: + case "uri": + res.params.checkClaim = `openpgp4fpr:${res.params.fingerprint}`; + break; + case "message": + res.params.checkClaim = `[Verifying my OpenPGP key: openpgp4fpr:${res.params.fingerprint}]`; + break; + case "fingerprint": + res.params.checkClaim = res.params.fingerprint; + break; + } + } + + const obj = await getJSON(res.params.url); + res.isVerified = VerifyJsonProof(obj, res.params.checkPath, res.params.checkClaim, res.params.checkRelation); + + return res; +}; + +const Twitter = async (params) => { + let res = { + success: false, + errors: [], + isVerified: false, + params: params + } + + let twitter_api_auth = process.env.TWITTER_API_AUTH; + if (!twitter_api_auth) { + res.errors.push("No Twitter API auth token provided"); + return res; + } + + let proofUrl = `https://api.twitter.com/labs/2/tweets/${res.params.tweetId}?tweet.fields=author_id,created_at,id,source,text`; + let re = new RegExp(`[Verifying my OpenPGP key: openpgp4fpr:${res.params.fingerprint}]`, "gi"); + + const get = bent('GET', 'json', {'Content-Type': 'application/json', 'Authorization': `Bearer ${twitter_api_auth}`}); + const obj = await get(proofUrl); + res.isVerified = re.test(obj.data.text); + + return res; +}; + +const VerifyJsonProof = (data, checkPath, checkClaim, checkRelation) => { + let isVerified = false; + + if (!data) { + return isVerified; + } + + if (checkPath.length == 0) { + switch (checkRelation) { + default: + case 'contains': + let re = new RegExp(checkClaim, "gi"); + return re.test(data); + break; + case 'eq': + return data == checkClaim; + break; + case 'oneOf': + return data.includes(checkClaim); + break; + } + } + + if (Array.isArray(data)) { + data.forEach((item, i) => { + isVerified = isVerified || VerifyJsonProof(item, checkPath, checkClaim, checkRelation); + }); + } else if (Array.isArray(data[checkPath[0]])) { + data[checkPath[0]].forEach((item, i) => { + isVerified = isVerified || VerifyJsonProof(item, checkPath.slice(1), checkClaim, checkRelation); + }); + } else { + isVerified = isVerified || VerifyJsonProof(data[checkPath[0]], checkPath.slice(1), checkClaim, checkRelation); + } + + return isVerified; +} + +exports.Proxy = Proxy; +exports.Twitter = Twitter; + +// include 'secrets.php'; +// +// $fingerprint = urlencode($_GET["fp"]); +// $tweetId = urlencode($_GET["id"]); +// +// $check = "\[Verifying my OpenPGP key: openpgp4fpr:$fingerprint\]"; +// +// $response = array(); +// $response["verified"] = false; +// $response["fingerprint"] = $fingerprint; +// $response["tweetId"] = $tweetId; +// $response["text"] = $data["data"]["text"]; +// +// if (!is_null($twitter_api_auth)) { +// $ch = curl_init(); +// curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', $twitter_api_auth)); +// curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); +// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +// curl_setopt($ch, CURLOPT_URL, "https://api.twitter.com/labs/2/tweets/$tweetId?tweet.fields=author_id,created_at,id,source,text"); +// $result = curl_exec($ch); +// curl_close($ch); +// $data = json_decode($result, true); +// +// if (preg_match("/{$check}/i", $data["data"]["text"])) { +// $response["verified"] = true; +// } +// } +// +// echo json_encode($response); From 40dd4e503bf7b2e6e7b2135a5637c55c3cfd4b93 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 21:40:22 +0200 Subject: [PATCH 17/23] Update proxy calls --- static/scripts.js | 85 ++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/static/scripts.js b/static/scripts.js index 1219c34..7296b0c 100644 --- a/static/scripts.js +++ b/static/scripts.js @@ -461,19 +461,16 @@ async function verifyProof(url, fingerprint) { match = url.match(/https:\/\/twitter\.com\/(.*)\/status\/(.*)/); output.display = `@${match[1]}`; output.url = `https://twitter.com/${match[1]}`; - output.proofUrlFetch = `/server/verifyTweet.php?id=${match[2]}&fp=${fingerprint}`; + output.proofUrlFetch = `/server/verify/twitter +?tweetId=${encodeURIComponent(match[2])} +&fingerprint=${fingerprint}`; try { - response = await fetch(output.proofUrlFetch, { - headers: { - Accept: 'application/json' - }, - credentials: 'omit' - }); + response = await fetch(output.proofUrlFetch); if (!response.ok) { throw new Error('Response failed: ' + response.status); } json = await response.json(); - output.isVerified = json.verified; + output.isVerified = json.isVerified; } catch (e) { } finally { return output; @@ -484,7 +481,8 @@ async function verifyProof(url, fingerprint) { output.type = "hackernews"; match = url.match(/https:\/\/news.ycombinator.com\/user\?id=(.*)/); output.display = match[1]; - output.proofUrlFetch = `https://hacker-news.firebaseio.com/v0/user/${match[1]}.json`; + output.proofUrl = `https://hacker-news.firebaseio.com/v0/user/${match[1]}.json`; + output.proofUrlFetch = output.proofUrl; try { response = await fetch(output.proofUrlFetch, { headers: { @@ -504,14 +502,14 @@ async function verifyProof(url, fingerprint) { } if (!output.isVerified) { - output.proofUrlFetch = `/server/verifyHackerNews.php?user=${match[1]}&fp=${fingerprint}`; + output.proofUrlFetch = `/server/verify/proxy +?url=${encodeURIComponent(output.proofUrl)} +&fingerprint=${fingerprint} +&checkRelation=contains +&checkPath=about +&checkClaimFormat=message`; try { - response = await fetch(output.proofUrlFetch, { - headers: { - Accept: 'application/json' - }, - credentials: 'omit' - }); + response = await fetch(output.proofUrlFetch); if (!response.ok) { throw new Error('Response failed: ' + response.status); } @@ -550,19 +548,20 @@ async function verifyProof(url, fingerprint) { match = url.match(/https:\/\/(?:www\.)?reddit\.com\/user\/(.*)\/comments\/(.*)\/(.*)\//); output.display = match[1]; output.url = `https://www.reddit.com/user/${match[1]}`; - output.proofUrlFetch = `/server/verifyReddit.php?user=${match[1]}&comment=${match[2]}&fp=${fingerprint}`; + output.proofUrl = `https://www.reddit.com/user/${match[1]}/comments/${match[2]}.json`; + output.proofUrlFetch = `/server/verify/proxy +?url=${encodeURIComponent(output.proofUrl)} +&fingerprint=${fingerprint} +&checkRelation=contains +&checkPath=data,children,data,selftext +&checkClaimFormat=message`; try { - response = await fetch(output.proofUrlFetch, { - headers: { - Accept: 'application/json' - }, - credentials: 'omit' - }); + response = await fetch(output.proofUrlFetch); if (!response.ok) { throw new Error('Response failed: ' + response.status); } json = await response.json(); - output.isVerified = json.verified; + output.isVerified = json.isVerified; } catch (e) { } finally { return output; @@ -600,19 +599,20 @@ async function verifyProof(url, fingerprint) { output.type = "lobsters"; match = url.match(/https:\/\/lobste.rs\/u\/(.*)/); output.display = match[1]; - output.proofUrlFetch = `/server/verifyLobsters.php?user=${match[1]}&fp=${fingerprint}`; + output.proofUrl = `https://lobste.rs/u/${match[1]}.json`; + output.proofUrlFetch = `/server/verify/proxy +?url=${encodeURIComponent(output.proofUrl)} +&fingerprint=${fingerprint} +&checkRelation=contains +&checkPath=about +&checkClaimFormat=message`; try { - response = await fetch(output.proofUrlFetch, { - headers: { - Accept: 'application/json' - }, - credentials: 'omit' - }); + response = await fetch(output.proofUrlFetch); if (!response.ok) { throw new Error('Response failed: ' + response.status); } json = await response.json(); - output.isVerified = json.verified; + output.isVerified = json.isVerified; } catch (e) { } finally { return output; @@ -661,22 +661,23 @@ async function verifyProof(url, fingerprint) { // Discourse try { match = url.match(/https:\/\/(.*)\/u\/(.*)/); - output.proofUrlFetch = `/server/verifyDiscourse.php?url=${url}&fp=${fingerprint}`; + output.proofUrl = `${url}.json`; + output.proofUrlFetch = `/server/verify/proxy +?url=${encodeURIComponent(output.proofUrl)} +&fingerprint=${fingerprint} +&checkRelation=contains +&checkPath=user,bio_raw +&checkClaimFormat=message`; try { - response = await fetch(output.proofUrlFetch, { - headers: { - Accept: 'application/json' - }, - credentials: 'omit' - }); + response = await fetch(output.proofUrlFetch); if (!response.ok) { throw new Error('Response failed: ' + response.status); } json = await response.json(); - if (json.isDiscourse) { + if (json.isVerified) { output.type = "discourse"; - output.display = `${json.user}@${match[1]}`; - output.isVerified = json.verified; + output.display = `${match[2]}@${match[1]}`; + output.isVerified = json.isVerified; return output; } } catch (e) { From d5534a04dc9834ebb1290c8bc11abba5938ea242 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 21:40:58 +0200 Subject: [PATCH 18/23] Update links to openpgp --- views/profile.pug | 2 +- views/template.base.pug | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/views/profile.pug b/views/profile.pug index ca42316..ab70a5c 100644 --- a/views/profile.pug +++ b/views/profile.pug @@ -21,5 +21,5 @@ main.container.container--profile a(href='/') Keyoxide | . -script(src='/static/openpgp.min.js') +script(src='/dep/openpgp.min.js') script(type='text/javascript' src='/static/scripts.js' charset='utf-8') diff --git a/views/template.base.pug b/views/template.base.pug index c6d2ec9..5fba115 100644 --- a/views/template.base.pug +++ b/views/template.base.pug @@ -28,6 +28,6 @@ main.container a(href='https://fosstodon.org/@keyoxide') Mastodon p © 2020 Keyoxide contributors -script(src='/static/openpgp.min.js') +script(src='/dep/openpgp.min.js') script(src='/static/qrcode.min.js') script(type='text/javascript' src='/static/scripts.js' charset='utf-8') From fcafcc9599e96c02bdb7e464d89a15234753cdb8 Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 21:42:53 +0200 Subject: [PATCH 19/23] Remove PHP server files --- server/functions.php | 41 ----------------------- server/secrets.template.php | 37 --------------------- server/verifyDiscourse.php | 62 ----------------------------------- server/verifyHackerNews.php | 57 -------------------------------- server/verifyLobsters.php | 58 --------------------------------- server/verifyReddit.php | 65 ------------------------------------- server/verifyTweet.php | 62 ----------------------------------- 7 files changed, 382 deletions(-) delete mode 100644 server/functions.php delete mode 100644 server/secrets.template.php delete mode 100644 server/verifyDiscourse.php delete mode 100644 server/verifyHackerNews.php delete mode 100644 server/verifyLobsters.php delete mode 100644 server/verifyReddit.php delete mode 100644 server/verifyTweet.php diff --git a/server/functions.php b/server/functions.php deleted file mode 100644 index 76c80e2..0000000 --- a/server/functions.php +++ /dev/null @@ -1,41 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> - diff --git a/server/secrets.template.php b/server/secrets.template.php deleted file mode 100644 index 762dd5a..0000000 --- a/server/secrets.template.php +++ /dev/null @@ -1,37 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> - diff --git a/server/verifyDiscourse.php b/server/verifyDiscourse.php deleted file mode 100644 index b9912d5..0000000 --- a/server/verifyDiscourse.php +++ /dev/null @@ -1,62 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> - diff --git a/server/verifyHackerNews.php b/server/verifyHackerNews.php deleted file mode 100644 index 45b4528..0000000 --- a/server/verifyHackerNews.php +++ /dev/null @@ -1,57 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> - diff --git a/server/verifyLobsters.php b/server/verifyLobsters.php deleted file mode 100644 index 620277a..0000000 --- a/server/verifyLobsters.php +++ /dev/null @@ -1,58 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> - diff --git a/server/verifyReddit.php b/server/verifyReddit.php deleted file mode 100644 index 7d8bec1..0000000 --- a/server/verifyReddit.php +++ /dev/null @@ -1,65 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> - diff --git a/server/verifyTweet.php b/server/verifyTweet.php deleted file mode 100644 index 3f283ca..0000000 --- a/server/verifyTweet.php +++ /dev/null @@ -1,62 +0,0 @@ -. -// -// Also add information on how to contact you by electronic and paper mail. -// -// If your software can interact with users remotely through a computer network, -// you should also make sure that it provides a way for users to get its source. -// For example, if your program is a web application, its interface could display -// a "Source" link that leads users to an archive of the code. There are many -// ways you could offer source, and different solutions will be better for different -// programs; see section 13 for the specific requirements. -// -// You should also get your employer (if you work as a programmer) or school, -// if any, to sign a "copyright disclaimer" for the program, if necessary. For -// more information on this, and how to apply and follow the GNU AGPL, see . -?> - From d84d8b401954c94e123528bcb60f0ce68db8fd3d Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 21:45:59 +0200 Subject: [PATCH 20/23] Update licenseignore --- .licenseignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.licenseignore b/.licenseignore index 86db673..2e12108 100644 --- a/.licenseignore +++ b/.licenseignore @@ -31,9 +31,11 @@ **/*.md **/*.png **/*.svg +**/*.env \.drone\.yml composer.json composer.lock package.json -package-lock.json \ No newline at end of file +package-lock.json +\.editorconfig From b58801e4910d627bf831ba1f5cdeef6cbe4240fd Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 21:47:07 +0200 Subject: [PATCH 21/23] Update licenseignore --- .licenseignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.licenseignore b/.licenseignore index 2e12108..7483fbe 100644 --- a/.licenseignore +++ b/.licenseignore @@ -32,6 +32,7 @@ **/*.png **/*.svg **/*.env +**/*.pug \.drone\.yml composer.json From c100288fd2cc9f9d479a1210d7646f20688f6b1c Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 21:50:50 +0200 Subject: [PATCH 22/23] Fix wrong id --- views/verify.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/verify.pug b/views/verify.pug index 9f81035..7db1a6f 100644 --- a/views/verify.pug +++ b/views/verify.pug @@ -13,5 +13,5 @@ block content h3 Result p#result - p#result + p#resultContent input.bigBtn(type='submit' name='submit' value='VERIFY SIGNATURE') From 90d868ab33da9d252caf15732ed4d7206d29372e Mon Sep 17 00:00:00 2001 From: Yarmo Mackenbach Date: Sat, 8 Aug 2020 21:51:21 +0200 Subject: [PATCH 23/23] Add AGPL header to JS files --- index.js | 29 +++++++++++++++++++++++++++++ routes/dep.js | 29 +++++++++++++++++++++++++++++ routes/encrypt.js | 29 +++++++++++++++++++++++++++++ routes/main.js | 29 +++++++++++++++++++++++++++++ routes/profile.js | 29 +++++++++++++++++++++++++++++ routes/proofs.js | 29 +++++++++++++++++++++++++++++ routes/server.js | 29 +++++++++++++++++++++++++++++ routes/util.js | 29 +++++++++++++++++++++++++++++ routes/verify.js | 29 +++++++++++++++++++++++++++++ server/proofVerification.js | 29 +++++++++++++++++++++++++++++ 10 files changed, 290 insertions(+) diff --git a/index.js b/index.js index b713e84..1af2f62 100644 --- a/index.js +++ b/index.js @@ -1,3 +1,32 @@ +/* +Copyright (C) 2020 Yarmo Mackenbach + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +details. + +You should have received a copy of the GNU Affero General Public License along +with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display +a "Source" link that leads users to an archive of the code. There are many +ways you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU AGPL, see . +*/ const express = require('express'); const md = require('markdown-it')({typographer: true}); const fs = require('fs'); diff --git a/routes/dep.js b/routes/dep.js index 2331708..2724284 100644 --- a/routes/dep.js +++ b/routes/dep.js @@ -1,3 +1,32 @@ +/* +Copyright (C) 2020 Yarmo Mackenbach + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +details. + +You should have received a copy of the GNU Affero General Public License along +with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display +a "Source" link that leads users to an archive of the code. There are many +ways you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU AGPL, see . +*/ const router = require('express').Router(); router.get('/openpgp.min.js', function(req, res) { diff --git a/routes/encrypt.js b/routes/encrypt.js index c67bb86..a6e9b8b 100644 --- a/routes/encrypt.js +++ b/routes/encrypt.js @@ -1,3 +1,32 @@ +/* +Copyright (C) 2020 Yarmo Mackenbach + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +details. + +You should have received a copy of the GNU Affero General Public License along +with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display +a "Source" link that leads users to an archive of the code. There are many +ways you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU AGPL, see . +*/ const router = require('express').Router(); router.get('/', function(req, res) { diff --git a/routes/main.js b/routes/main.js index 8c9ff06..62f5f49 100644 --- a/routes/main.js +++ b/routes/main.js @@ -1,3 +1,32 @@ +/* +Copyright (C) 2020 Yarmo Mackenbach + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +details. + +You should have received a copy of the GNU Affero General Public License along +with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display +a "Source" link that leads users to an archive of the code. There are many +ways you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU AGPL, see . +*/ const router = require('express').Router(); const md = require('markdown-it')({typographer: true}); const fs = require('fs'); diff --git a/routes/profile.js b/routes/profile.js index 978a59d..ab50bb3 100644 --- a/routes/profile.js +++ b/routes/profile.js @@ -1,3 +1,32 @@ +/* +Copyright (C) 2020 Yarmo Mackenbach + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +details. + +You should have received a copy of the GNU Affero General Public License along +with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display +a "Source" link that leads users to an archive of the code. There are many +ways you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU AGPL, see . +*/ const router = require('express').Router(); router.get('/wkd/:input', function(req, res) { diff --git a/routes/proofs.js b/routes/proofs.js index 1e1a509..de3ae01 100644 --- a/routes/proofs.js +++ b/routes/proofs.js @@ -1,3 +1,32 @@ +/* +Copyright (C) 2020 Yarmo Mackenbach + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +details. + +You should have received a copy of the GNU Affero General Public License along +with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display +a "Source" link that leads users to an archive of the code. There are many +ways you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU AGPL, see . +*/ const router = require('express').Router(); router.get('/', function(req, res) { diff --git a/routes/server.js b/routes/server.js index 2269a6b..c360820 100644 --- a/routes/server.js +++ b/routes/server.js @@ -1,3 +1,32 @@ +/* +Copyright (C) 2020 Yarmo Mackenbach + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +details. + +You should have received a copy of the GNU Affero General Public License along +with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display +a "Source" link that leads users to an archive of the code. There are many +ways you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU AGPL, see . +*/ const router = require('express').Router(); const { check, query, validationResult } = require('express-validator'); const proofVerification = require('../server/proofVerification'); diff --git a/routes/util.js b/routes/util.js index 57d13f2..3c15270 100644 --- a/routes/util.js +++ b/routes/util.js @@ -1,3 +1,32 @@ +/* +Copyright (C) 2020 Yarmo Mackenbach + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +details. + +You should have received a copy of the GNU Affero General Public License along +with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display +a "Source" link that leads users to an archive of the code. There are many +ways you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU AGPL, see . +*/ const router = require('express').Router(); router.get('/profile-url', function(req, res) { diff --git a/routes/verify.js b/routes/verify.js index d5d4654..adc2ddf 100644 --- a/routes/verify.js +++ b/routes/verify.js @@ -1,3 +1,32 @@ +/* +Copyright (C) 2020 Yarmo Mackenbach + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +details. + +You should have received a copy of the GNU Affero General Public License along +with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display +a "Source" link that leads users to an archive of the code. There are many +ways you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU AGPL, see . +*/ const router = require('express').Router(); router.get('/', function(req, res) { diff --git a/server/proofVerification.js b/server/proofVerification.js index 981aa5b..cf035fb 100644 --- a/server/proofVerification.js +++ b/server/proofVerification.js @@ -1,3 +1,32 @@ +/* +Copyright (C) 2020 Yarmo Mackenbach + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +details. + +You should have received a copy of the GNU Affero General Public License along +with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer network, +you should also make sure that it provides a way for users to get its source. +For example, if your program is a web application, its interface could display +a "Source" link that leads users to an archive of the code. There are many +ways you could offer source, and different solutions will be better for different +programs; see section 13 for the specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. For +more information on this, and how to apply and follow the GNU AGPL, see . +*/ const bent = require('bent'); const getJSON = bent('json'); require('dotenv').config();