diff --git a/index.d.ts b/index.d.ts
index e4f818b..87842f3 100644
--- a/index.d.ts
+++ b/index.d.ts
@@ -1,2 +1,2 @@
-import { MetaMaskInpageProvider } from '@metamask/inpage-provider';
+import { MetaMaskInpageProvider } from '@metamask/providers';
export default function createMetaMaskProvider(): MetaMaskInpageProvider;
diff --git a/index.js b/index.js
index 6224dee..d9fbf05 100644
--- a/index.js
+++ b/index.js
@@ -1,4 +1,4 @@
-const { MetaMaskInpageProvider } = require('@metamask/inpage-provider')
+const { MetaMaskInpageProvider } = require('@metamask/providers')
const PortStream = require('extension-port-stream').default
const { detect } = require('detect-browser')
const browser = detect()
diff --git a/package-lock.json b/package-lock.json
index b94efac..10dd891 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
"version": "4.0.1",
"license": "MIT",
"dependencies": {
- "@metamask/inpage-provider": "^8.0.3",
+ "@metamask/providers": "^16.1.0",
"detect-browser": "^5.3.0",
"extension-port-stream": "^3.0.0"
},
@@ -34,6 +34,53 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@ethereumjs/common": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-3.2.0.tgz",
+ "integrity": "sha512-pksvzI0VyLgmuEF2FA/JR/4/y6hcPq8OUail3/AvycBaW1d5VSauOZzqGvJ3RTmR4MU35lWE8KseKOsEhrFRBA==",
+ "dependencies": {
+ "@ethereumjs/util": "^8.1.0",
+ "crc-32": "^1.2.0"
+ }
+ },
+ "node_modules/@ethereumjs/rlp": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz",
+ "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==",
+ "bin": {
+ "rlp": "bin/rlp"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@ethereumjs/tx": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-4.2.0.tgz",
+ "integrity": "sha512-1nc6VO4jtFd172BbSnTnDQVr9IYBFl1y4xPzZdtkrkKIncBCkdbgfdRV+MiTkJYAtTxvV12GRZLqBFT1PNK6Yw==",
+ "dependencies": {
+ "@ethereumjs/common": "^3.2.0",
+ "@ethereumjs/rlp": "^4.0.1",
+ "@ethereumjs/util": "^8.1.0",
+ "ethereum-cryptography": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@ethereumjs/util": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz",
+ "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==",
+ "dependencies": {
+ "@ethereumjs/rlp": "^4.0.1",
+ "ethereum-cryptography": "^2.0.0",
+ "micro-ftch": "^0.3.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@metamask/ethjs": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/@metamask/ethjs/-/ethjs-0.6.0.tgz",
@@ -209,20 +256,44 @@
"integrity": "sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg==",
"dev": true
},
- "node_modules/@metamask/inpage-provider": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/@metamask/inpage-provider/-/inpage-provider-8.0.3.tgz",
- "integrity": "sha512-pj9tGNoS1edohuRJzxOuILRqRrQTdgu5mJwMwa9wuOZIMQLFZtr3g2T6vayPBwoNkE1FzLhs/osUqaVQDRfDvQ==",
- "deprecated": "Package renamed to @metamask/providers",
+ "node_modules/@metamask/json-rpc-engine": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@metamask/json-rpc-engine/-/json-rpc-engine-8.0.2.tgz",
+ "integrity": "sha512-IoQPmql8q7ABLruW7i4EYVHWUbF74yrp63bRuXV5Zf9BQwcn5H9Ww1eLtROYvI1bUXwOiHZ6qT5CWTrDc/t/AA==",
"dependencies": {
- "@metamask/object-multiplex": "^1.1.0",
- "@metamask/safe-event-emitter": "^2.0.0",
- "eth-rpc-errors": "^4.0.2",
- "fast-deep-equal": "^2.0.1",
- "is-stream": "^2.0.0",
- "json-rpc-engine": "^6.1.0",
- "json-rpc-middleware-stream": "^3.0.0",
- "pump": "^3.0.0"
+ "@metamask/rpc-errors": "^6.2.1",
+ "@metamask/safe-event-emitter": "^3.0.0",
+ "@metamask/utils": "^8.3.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@metamask/json-rpc-middleware-stream": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@metamask/json-rpc-middleware-stream/-/json-rpc-middleware-stream-7.0.1.tgz",
+ "integrity": "sha512-hsveICXi/56do/mxgwE4IApWwOfZ204iWtSiCcLayEDCLS96X/tqnW1xXvNTrk1l4PtSUHajsyHBY67I89bTIA==",
+ "dependencies": {
+ "@metamask/json-rpc-engine": "^8.0.1",
+ "@metamask/safe-event-emitter": "^3.0.0",
+ "@metamask/utils": "^8.3.0",
+ "readable-stream": "^3.6.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@metamask/json-rpc-middleware-stream/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
"node_modules/@metamask/number-to-bn": {
@@ -239,20 +310,164 @@
"npm": ">=6"
}
},
- "node_modules/@metamask/object-multiplex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@metamask/object-multiplex/-/object-multiplex-1.1.0.tgz",
- "integrity": "sha512-ImDw5+NdO5qnzmK/rpSlPmQMQm6HIC6wAHdR9nBaDK8TpeuRik5H8DCUcoNrxSeUAk1iHwchZ03lpZu6mZfrdw==",
+ "node_modules/@metamask/providers": {
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/@metamask/providers/-/providers-16.1.0.tgz",
+ "integrity": "sha512-znVCvux30+3SaUwcUGaSf+pUckzT5ukPRpcBmy+muBLC0yaWnBcvDqGfcsw6CBIenUdFrVoAFa8B6jsuCY/a+g==",
+ "dependencies": {
+ "@metamask/json-rpc-engine": "^8.0.1",
+ "@metamask/json-rpc-middleware-stream": "^7.0.1",
+ "@metamask/object-multiplex": "^2.0.0",
+ "@metamask/rpc-errors": "^6.2.1",
+ "@metamask/safe-event-emitter": "^3.1.1",
+ "@metamask/utils": "^8.3.0",
+ "detect-browser": "^5.2.0",
+ "extension-port-stream": "^3.0.0",
+ "fast-deep-equal": "^3.1.3",
+ "is-stream": "^2.0.0",
+ "readable-stream": "^3.6.2",
+ "webextension-polyfill": "^0.10.0"
+ },
+ "engines": {
+ "node": "^18.18 || >=20"
+ }
+ },
+ "node_modules/@metamask/providers/node_modules/@metamask/object-multiplex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@metamask/object-multiplex/-/object-multiplex-2.0.0.tgz",
+ "integrity": "sha512-+ItrieVZie3j2LfYE0QkdW3dsEMfMEp419IGx1zyeLqjRZ14iQUPRO0H6CGgfAAoC0x6k2PfCAGRwJUA9BMrqA==",
"dependencies": {
- "end-of-stream": "^1.4.4",
"once": "^1.4.0",
- "readable-stream": "^2.3.3"
+ "readable-stream": "^3.6.2"
+ },
+ "engines": {
+ "node": "^16.20 || ^18.16 || >=20"
+ }
+ },
+ "node_modules/@metamask/providers/node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/@metamask/providers/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@metamask/rpc-errors": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@metamask/rpc-errors/-/rpc-errors-6.2.1.tgz",
+ "integrity": "sha512-VTgWkjWLzb0nupkFl1duQi9Mk8TGT9rsdnQg6DeRrYEFxtFOh0IF8nAwxM/4GWqDl6uIB06lqUBgUrAVWl62Bw==",
+ "dependencies": {
+ "@metamask/utils": "^8.3.0",
+ "fast-safe-stringify": "^2.0.6"
+ },
+ "engines": {
+ "node": ">=16.0.0"
}
},
"node_modules/@metamask/safe-event-emitter": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz",
- "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q=="
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-3.1.1.tgz",
+ "integrity": "sha512-ihb3B0T/wJm1eUuArYP4lCTSEoZsClHhuWyfo/kMX3m/odpqNcPfsz5O2A3NT7dXCAgWPGDQGPqygCpgeniKMw==",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@metamask/utils": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/@metamask/utils/-/utils-8.4.0.tgz",
+ "integrity": "sha512-dbIc3C7alOe0agCuBHM1h71UaEaEqOk2W8rAtEn8QGz4haH2Qq7MoK6i7v2guzvkJVVh79c+QCzIqphC3KvrJg==",
+ "dependencies": {
+ "@ethereumjs/tx": "^4.2.0",
+ "@noble/hashes": "^1.3.1",
+ "@scure/base": "^1.1.3",
+ "@types/debug": "^4.1.7",
+ "debug": "^4.3.4",
+ "pony-cause": "^2.1.10",
+ "semver": "^7.5.4",
+ "superstruct": "^1.0.3",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/@noble/curves": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz",
+ "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==",
+ "dependencies": {
+ "@noble/hashes": "1.3.3"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@noble/hashes": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz",
+ "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/base": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz",
+ "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==",
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip32": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz",
+ "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==",
+ "dependencies": {
+ "@noble/curves": "~1.3.0",
+ "@noble/hashes": "~1.3.2",
+ "@scure/base": "~1.1.4"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@scure/bip39": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz",
+ "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==",
+ "dependencies": {
+ "@noble/hashes": "~1.3.2",
+ "@scure/base": "~1.1.4"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "0.7.34",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
+ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
},
"node_modules/abort-controller": {
"version": "3.0.0",
@@ -703,7 +918,19 @@
"node_modules/core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "node_modules/crc-32": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+ "bin": {
+ "crc32": "bin/crc32.njs"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
},
"node_modules/create-ecdh": {
"version": "4.0.4",
@@ -776,6 +1003,22 @@
"integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==",
"dev": true
},
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
"node_modules/define-data-property": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
@@ -929,14 +1172,6 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dependencies": {
- "once": "^1.4.0"
- }
- },
"node_modules/es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
@@ -958,12 +1193,15 @@
"node": ">= 0.4"
}
},
- "node_modules/eth-rpc-errors": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.2.tgz",
- "integrity": "sha512-n+Re6Gu8XGyfFy1it0AwbD1x0MUzspQs0D5UiPs1fFPCr6WAwZM+vbIhXheBFrpgosqN9bs5PqlB4Q61U/QytQ==",
+ "node_modules/ethereum-cryptography": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz",
+ "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==",
"dependencies": {
- "fast-safe-stringify": "^2.0.6"
+ "@noble/curves": "1.3.0",
+ "@noble/hashes": "1.3.3",
+ "@scure/bip32": "1.3.3",
+ "@scure/bip39": "1.2.2"
}
},
"node_modules/ethjs-abi": {
@@ -1096,11 +1334,6 @@
"safe-buffer": "~5.2.0"
}
},
- "node_modules/fast-deep-equal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
- },
"node_modules/fast-safe-stringify": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
@@ -1480,7 +1713,8 @@
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
},
"node_modules/js-sha3": {
"version": "0.5.5",
@@ -1488,27 +1722,6 @@
"integrity": "sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA==",
"dev": true
},
- "node_modules/json-rpc-engine": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz",
- "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==",
- "dependencies": {
- "@metamask/safe-event-emitter": "^2.0.0",
- "eth-rpc-errors": "^4.0.2"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/json-rpc-middleware-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-rpc-middleware-stream/-/json-rpc-middleware-stream-3.0.0.tgz",
- "integrity": "sha512-JmZmlehE0xF3swwORpLHny/GvW3MZxCsb2uFNBrn8TOqMqivzCfz232NSDLLOtIQlrPlgyEjiYpyzyOPFOzClw==",
- "dependencies": {
- "@metamask/safe-event-emitter": "^2.0.0",
- "readable-stream": "^2.3.3"
- }
- },
"node_modules/jsonparse": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
@@ -1561,6 +1774,11 @@
"safe-buffer": "^5.1.2"
}
},
+ "node_modules/micro-ftch": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz",
+ "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg=="
+ },
"node_modules/miller-rabin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
@@ -1648,6 +1866,11 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
"node_modules/number-to-bn": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz",
@@ -1816,6 +2039,14 @@
"node": ">=0.12"
}
},
+ "node_modules/pony-cause": {
+ "version": "2.1.11",
+ "resolved": "https://registry.npmjs.org/pony-cause/-/pony-cause-2.1.11.tgz",
+ "integrity": "sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/possible-typed-array-names": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
@@ -1836,7 +2067,8 @@
"node_modules/process-nextick-args": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+ "dev": true
},
"node_modules/promise-to-callback": {
"version": "1.0.0",
@@ -1871,15 +2103,6 @@
"integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
"dev": true
},
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
"node_modules/punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
@@ -1942,6 +2165,7 @@
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
@@ -1990,6 +2214,17 @@
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
+ "node_modules/semver": {
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/set-function-length": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
@@ -2206,6 +2441,14 @@
"minimist": "^1.1.0"
}
},
+ "node_modules/superstruct": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz",
+ "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
@@ -2320,6 +2563,18 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/vm-browserify": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
@@ -2327,9 +2582,9 @@
"dev": true
},
"node_modules/webextension-polyfill": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.12.0.tgz",
- "integrity": "sha512-97TBmpoWJEE+3nFBQ4VocyCdLKfw54rFaJ6EVQYLBCXqCIpLSZkwGgASpv4oPt9gdKCJ80RJlcmNzNn008Ag6Q=="
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.10.0.tgz",
+ "integrity": "sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g=="
},
"node_modules/which-typed-array": {
"version": "1.1.15",
diff --git a/package.json b/package.json
index 884308b..20b432d 100644
--- a/package.json
+++ b/package.json
@@ -27,7 +27,7 @@
"npm": ">=9"
},
"dependencies": {
- "@metamask/inpage-provider": "^8.0.3",
+ "@metamask/providers": "^16.1.0",
"detect-browser": "^5.3.0",
"extension-port-stream": "^3.0.0"
},
diff --git a/sample-extension/bundle.js b/sample-extension/bundle.js
index 5f6a20d..621ee6b 100644
--- a/sample-extension/bundle.js
+++ b/sample-extension/bundle.js
@@ -5,7 +5,7 @@ module.exports={
}
},{}],2:[function(require,module,exports){
-const { MetaMaskInpageProvider } = require('@metamask/inpage-provider')
+const { MetaMaskInpageProvider } = require('@metamask/providers')
const PortStream = require('extension-port-stream').default
const { detect } = require('detect-browser')
const browser = detect()
@@ -37,7 +37,7 @@ function getMetaMaskId () {
}
-},{"./config.json":1,"@metamask/inpage-provider":23,"detect-browser":40,"extension-port-stream":52}],3:[function(require,module,exports){
+},{"./config.json":1,"@metamask/providers":62,"detect-browser":123,"extension-port-stream":129}],3:[function(require,module,exports){
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
@@ -528,7 +528,7 @@ function getCallableMethodsFromABI(contractABI) {
return (json.type === 'function' || json.type === 'event') && json.name.length > 0;
});
}
-},{"./has-tx-object":9,"@babel/runtime/helpers/asyncToGenerator":3,"@babel/runtime/helpers/interopRequireDefault":4,"@babel/runtime/regenerator":7,"@metamask/ethjs-filter":12,"@metamask/ethjs-util":18,"ethjs-abi":47,"js-sha3":11,"promise-to-callback":102}],9:[function(require,module,exports){
+},{"./has-tx-object":9,"@babel/runtime/helpers/asyncToGenerator":3,"@babel/runtime/helpers/interopRequireDefault":4,"@babel/runtime/regenerator":7,"@metamask/ethjs-filter":12,"@metamask/ethjs-util":18,"ethjs-abi":124,"js-sha3":11,"promise-to-callback":169}],9:[function(require,module,exports){
"use strict";
var txObjectProperties = ['from', 'to', 'data', 'value', 'gasPrice', 'gas'];
@@ -622,7 +622,7 @@ function getConstructorFromABI(contractABI) {
return json.type === 'constructor';
})[0];
}
-},{"./contract":8,"./has-tx-object":9,"@metamask/ethjs-filter":12,"@metamask/ethjs-util":18,"ethjs-abi":47,"js-sha3":11}],11:[function(require,module,exports){
+},{"./contract":8,"./has-tx-object":9,"@metamask/ethjs-filter":12,"@metamask/ethjs-util":18,"ethjs-abi":124,"js-sha3":11}],11:[function(require,module,exports){
(function (process,global){(function (){
/**
* [js-sha3]{@link https://github.com/emn178/js-sha3}
@@ -1288,7 +1288,7 @@ function getConstructorFromABI(contractABI) {
})();
}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"_process":101}],12:[function(require,module,exports){
+},{"_process":168}],12:[function(require,module,exports){
"use strict";
function constructFilter(filterName, query) {
@@ -1689,7 +1689,7 @@ module.exports = {
formatInputs: formatInputs,
formatOutputs: formatOutputs
};
-},{"@metamask/ethjs-util":18,"@metamask/number-to-bn":29,"ethjs-schema":50,"strip-hex-prefix":116}],14:[function(require,module,exports){
+},{"@metamask/ethjs-util":18,"@metamask/number-to-bn":48,"ethjs-schema":127,"strip-hex-prefix":218}],14:[function(require,module,exports){
"use strict";
/**
@@ -1790,7 +1790,7 @@ HttpProvider.prototype.sendAsync = function (payload, callback) {
}
};
module.exports = HttpProvider;
-},{"xhr2":120}],15:[function(require,module,exports){
+},{"xhr2":223}],15:[function(require,module,exports){
"use strict";
var format = require('@metamask/ethjs-format');
@@ -1890,7 +1890,7 @@ function generateFnFor(rpcMethodName, methodObject) {
}
};
}
-},{"@metamask/ethjs-format":13,"@metamask/ethjs-rpc":16,"promise-to-callback":102}],16:[function(require,module,exports){
+},{"@metamask/ethjs-format":13,"@metamask/ethjs-rpc":16,"promise-to-callback":169}],16:[function(require,module,exports){
"use strict";
var promiseToCallback = require('promise-to-callback');
@@ -1973,7 +1973,7 @@ function createPayload(data, id) {
params: []
}, data);
}
-},{"promise-to-callback":102}],17:[function(require,module,exports){
+},{"promise-to-callback":169}],17:[function(require,module,exports){
"use strict";
/*
@@ -2161,7 +2161,7 @@ module.exports = {
fromWei: fromWei,
toWei: toWei
};
-},{"@metamask/number-to-bn":29,"bn.js":36}],18:[function(require,module,exports){
+},{"@metamask/number-to-bn":48,"bn.js":118}],18:[function(require,module,exports){
(function (Buffer){(function (){
"use strict";
@@ -2369,7 +2369,7 @@ module.exports = {
isHexString: isHexString
};
}).call(this)}).call(this,require("buffer").Buffer)
-},{"buffer":38,"is-hex-prefixed":83,"strip-hex-prefix":116}],19:[function(require,module,exports){
+},{"buffer":120,"is-hex-prefixed":158,"strip-hex-prefix":218}],19:[function(require,module,exports){
(function (Buffer){(function (){
"use strict";
@@ -2436,7 +2436,7 @@ Eth.fromUtf8 = utils.fromUtf8;
Eth.toUtf8 = utils.toUtf8;
Eth.HttpProvider = HttpProvider;
}).call(this)}).call(this,require("buffer").Buffer)
-},{"./lib/getTransactionSuccess.js":20,"@metamask/ethjs-contract":10,"@metamask/ethjs-filter":12,"@metamask/ethjs-provider-http":14,"@metamask/ethjs-query":15,"@metamask/ethjs-unit":17,"@metamask/ethjs-util":18,"@metamask/number-to-bn":29,"bn.js":36,"buffer":38,"ethjs-abi":47,"js-sha3":21}],20:[function(require,module,exports){
+},{"./lib/getTransactionSuccess.js":20,"@metamask/ethjs-contract":10,"@metamask/ethjs-filter":12,"@metamask/ethjs-provider-http":14,"@metamask/ethjs-query":15,"@metamask/ethjs-unit":17,"@metamask/ethjs-util":18,"@metamask/number-to-bn":48,"bn.js":118,"buffer":120,"ethjs-abi":124,"js-sha3":21}],20:[function(require,module,exports){
"use strict";
module.exports = function (eth) {
@@ -2476,23249 +2476,30084 @@ module.exports = function (eth) {
};
},{}],21:[function(require,module,exports){
arguments[4][11][0].apply(exports,arguments)
-},{"_process":101,"dup":11}],22:[function(require,module,exports){
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const pump_1 = __importDefault(require("pump"));
-const json_rpc_engine_1 = require("json-rpc-engine");
-const json_rpc_middleware_stream_1 = require("json-rpc-middleware-stream");
-const object_multiplex_1 = __importDefault(require("@metamask/object-multiplex"));
-const safe_event_emitter_1 = __importDefault(require("@metamask/safe-event-emitter"));
-const fast_deep_equal_1 = __importDefault(require("fast-deep-equal"));
-const eth_rpc_errors_1 = require("eth-rpc-errors");
-const is_stream_1 = require("is-stream");
-const messages_1 = __importDefault(require("./messages"));
-const siteMetadata_1 = __importDefault(require("./siteMetadata"));
-const utils_1 = require("./utils");
-class MetaMaskInpageProvider extends safe_event_emitter_1.default {
- /**
- * @param connectionStream - A Node.js duplex stream
- * @param options - An options bag
- * @param options.jsonRpcStreamName - The name of the internal JSON-RPC stream.
- * Default: metamask-provider
- * @param options.logger - The logging API to use. Default: console
- * @param options.maxEventListeners - The maximum number of event
- * listeners. Default: 100
- * @param options.shouldSendMetadata - Whether the provider should
- * send page metadata. Default: true
- */
- constructor(connectionStream, { jsonRpcStreamName = 'metamask-provider', logger = console, maxEventListeners = 100, shouldSendMetadata = true, } = {}) {
- if (!is_stream_1.duplex(connectionStream)) {
- throw new Error(messages_1.default.errors.invalidDuplexStream());
- }
- if (typeof maxEventListeners !== 'number' ||
- typeof shouldSendMetadata !== 'boolean') {
- throw new Error(messages_1.default.errors.invalidOptions(maxEventListeners, shouldSendMetadata));
- }
- validateLoggerObject(logger);
- super();
- this._log = logger;
- this.isMetaMask = true;
- this.setMaxListeners(maxEventListeners);
- // private state
- this._state = {
- sentWarnings: {
- // methods
- enable: false,
- experimentalMethods: false,
- send: false,
- // events
- events: {
- close: false,
- data: false,
- networkChanged: false,
- notification: false,
- },
- },
- accounts: null,
- isConnected: false,
- isUnlocked: false,
- initialized: false,
- isPermanentlyDisconnected: false,
- };
- this._metamask = this._getExperimentalApi();
- // public state
- this.selectedAddress = null;
- this.networkVersion = null;
- this.chainId = null;
- // bind functions (to prevent consumers from making unbound calls)
- this._handleAccountsChanged = this._handleAccountsChanged.bind(this);
- this._handleConnect = this._handleConnect.bind(this);
- this._handleChainChanged = this._handleChainChanged.bind(this);
- this._handleDisconnect = this._handleDisconnect.bind(this);
- this._handleStreamDisconnect = this._handleStreamDisconnect.bind(this);
- this._handleUnlockStateChanged = this._handleUnlockStateChanged.bind(this);
- this._sendSync = this._sendSync.bind(this);
- this._rpcRequest = this._rpcRequest.bind(this);
- this._warnOfDeprecation = this._warnOfDeprecation.bind(this);
- this.enable = this.enable.bind(this);
- this.request = this.request.bind(this);
- this.send = this.send.bind(this);
- this.sendAsync = this.sendAsync.bind(this);
- // setup connectionStream multiplexing
- const mux = new object_multiplex_1.default();
- pump_1.default(connectionStream, mux, connectionStream, this._handleStreamDisconnect.bind(this, 'MetaMask'));
- // ignore phishing warning message (handled elsewhere)
- mux.ignoreStream('phishing');
- // setup own event listeners
- // EIP-1193 connect
- this.on('connect', () => {
- this._state.isConnected = true;
- });
- // setup RPC connection
- const jsonRpcConnection = json_rpc_middleware_stream_1.createStreamMiddleware();
- pump_1.default(jsonRpcConnection.stream, mux.createStream(jsonRpcStreamName), jsonRpcConnection.stream, this._handleStreamDisconnect.bind(this, 'MetaMask RpcProvider'));
- // handle RPC requests via dapp-side rpc engine
- const rpcEngine = new json_rpc_engine_1.JsonRpcEngine();
- rpcEngine.push(json_rpc_engine_1.createIdRemapMiddleware());
- rpcEngine.push(utils_1.createErrorMiddleware(this._log));
- rpcEngine.push(jsonRpcConnection.middleware);
- this._rpcEngine = rpcEngine;
- this._initializeState();
- // handle JSON-RPC notifications
- jsonRpcConnection.events.on('notification', (payload) => {
- const { method, params } = payload;
- if (method === 'metamask_accountsChanged') {
- this._handleAccountsChanged(params);
- }
- else if (method === 'metamask_unlockStateChanged') {
- this._handleUnlockStateChanged(params);
- }
- else if (method === 'metamask_chainChanged') {
- this._handleChainChanged(params);
- }
- else if (utils_1.EMITTED_NOTIFICATIONS.includes(method)) {
- // deprecated
- // emitted here because that was the original order
- this.emit('data', payload);
- this.emit('message', {
- type: method,
- data: params,
- });
- // deprecated
- this.emit('notification', payload.params.result);
- }
- else if (method === 'METAMASK_STREAM_FAILURE') {
- connectionStream.destroy(new Error(messages_1.default.errors.permanentlyDisconnected()));
- }
- });
- // miscellanea
- // send website metadata
- if (shouldSendMetadata) {
- if (document.readyState === 'complete') {
- siteMetadata_1.default(this._rpcEngine, this._log);
- }
- else {
- const domContentLoadedHandler = () => {
- siteMetadata_1.default(this._rpcEngine, this._log);
- window.removeEventListener('DOMContentLoaded', domContentLoadedHandler);
- };
- window.addEventListener('DOMContentLoaded', domContentLoadedHandler);
- }
- }
- }
- //====================
- // Public Methods
- //====================
- /**
- * Returns whether the provider can process RPC requests.
- */
- isConnected() {
- return this._state.isConnected;
- }
- /**
- * Submits an RPC request for the given method, with the given params.
- * Resolves with the result of the method call, or rejects on error.
- *
- * @param args - The RPC request arguments.
- * @param args.method - The RPC method name.
- * @param args.params - The parameters for the RPC method.
- * @returns A Promise that resolves with the result of the RPC method,
- * or rejects if an error is encountered.
- */
- async request(args) {
- if (!args || typeof args !== 'object' || Array.isArray(args)) {
- throw eth_rpc_errors_1.ethErrors.rpc.invalidRequest({
- message: messages_1.default.errors.invalidRequestArgs(),
- data: args,
- });
- }
- const { method, params } = args;
- if (typeof method !== 'string' || method.length === 0) {
- throw eth_rpc_errors_1.ethErrors.rpc.invalidRequest({
- message: messages_1.default.errors.invalidRequestMethod(),
- data: args,
- });
- }
- if (params !== undefined && !Array.isArray(params) &&
- (typeof params !== 'object' || params === null)) {
- throw eth_rpc_errors_1.ethErrors.rpc.invalidRequest({
- message: messages_1.default.errors.invalidRequestParams(),
- data: args,
- });
- }
- return new Promise((resolve, reject) => {
- this._rpcRequest({ method, params }, utils_1.getRpcPromiseCallback(resolve, reject));
- });
- }
- /**
- * Submits an RPC request per the given JSON-RPC request object.
- *
- * @param payload - The RPC request object.
- * @param cb - The callback function.
- */
- sendAsync(payload, callback) {
- this._rpcRequest(payload, callback);
- }
- /**
- * We override the following event methods so that we can warn consumers
- * about deprecated events:
- * addListener, on, once, prependListener, prependOnceListener
- */
- addListener(eventName, listener) {
- this._warnOfDeprecation(eventName);
- return super.addListener(eventName, listener);
- }
- on(eventName, listener) {
- this._warnOfDeprecation(eventName);
- return super.on(eventName, listener);
- }
- once(eventName, listener) {
- this._warnOfDeprecation(eventName);
- return super.once(eventName, listener);
- }
- prependListener(eventName, listener) {
- this._warnOfDeprecation(eventName);
- return super.prependListener(eventName, listener);
- }
- prependOnceListener(eventName, listener) {
- this._warnOfDeprecation(eventName);
- return super.prependOnceListener(eventName, listener);
- }
- //====================
- // Private Methods
- //====================
- /**
- * Constructor helper.
- * Populates initial state by calling 'metamask_getProviderState' and emits
- * necessary events.
- */
- async _initializeState() {
- try {
- const { accounts, chainId, isUnlocked, networkVersion, } = await this.request({
- method: 'metamask_getProviderState',
- });
- // indicate that we've connected, for EIP-1193 compliance
- this.emit('connect', { chainId });
- this._handleChainChanged({ chainId, networkVersion });
- this._handleUnlockStateChanged({ accounts, isUnlocked });
- this._handleAccountsChanged(accounts);
- }
- catch (error) {
- this._log.error('MetaMask: Failed to get initial state. Please report this bug.', error);
- }
- finally {
- this._state.initialized = true;
- this.emit('_initialized');
- }
- }
- /**
- * Internal RPC method. Forwards requests to background via the RPC engine.
- * Also remap ids inbound and outbound.
- *
- * @param payload - The RPC request object.
- * @param callback - The consumer's callback.
- */
- _rpcRequest(payload, callback) {
- let cb = callback;
- if (!Array.isArray(payload)) {
- if (!payload.jsonrpc) {
- payload.jsonrpc = '2.0';
- }
- if (payload.method === 'eth_accounts' ||
- payload.method === 'eth_requestAccounts') {
- // handle accounts changing
- cb = (err, res) => {
- this._handleAccountsChanged(res.result || [], payload.method === 'eth_accounts');
- callback(err, res);
- };
- }
- return this._rpcEngine.handle(payload, cb);
- }
- return this._rpcEngine.handle(payload, cb);
- }
+},{"_process":168,"dup":11}],22:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+
+
+
+var _chunkZ4BLTVTBjs = require('./chunk-Z4BLTVTB.js');
+
+// src/JsonRpcEngine.ts
+var _rpcerrors = require('@metamask/rpc-errors');
+var _safeeventemitter = require('@metamask/safe-event-emitter'); var _safeeventemitter2 = _interopRequireDefault(_safeeventemitter);
+
+
+
+
+var _utils = require('@metamask/utils');
+var DESTROYED_ERROR_MESSAGE = "This engine is destroyed and can no longer be used.";
+var _isDestroyed, _middleware, _notificationHandler, _assertIsNotDestroyed, assertIsNotDestroyed_fn, _handleBatch, handleBatch_fn, _handle, handle_fn, _processRequest, processRequest_fn, _runAllMiddleware, runAllMiddleware_fn, _runMiddleware, runMiddleware_fn, _runReturnHandlers, runReturnHandlers_fn, _checkForCompletion, checkForCompletion_fn;
+var _JsonRpcEngine = class _JsonRpcEngine extends _safeeventemitter2.default {
+ /**
+ * Constructs a {@link JsonRpcEngine} instance.
+ *
+ * @param options - Options bag.
+ * @param options.notificationHandler - A function for handling JSON-RPC
+ * notifications. A JSON-RPC notification is defined as a JSON-RPC request
+ * without an `id` property. If this option is _not_ provided, notifications
+ * will be treated the same as requests. If this option _is_ provided,
+ * notifications will be passed to the handler function without touching
+ * the engine's middleware stack. This function should not throw or reject.
+ */
+ constructor({ notificationHandler } = {}) {
+ super();
/**
- * When the provider becomes connected, updates internal state and emits
- * required events. Idempotent.
- *
- * @param chainId - The ID of the newly connected chain.
- * @emits MetaMaskInpageProvider#connect
+ * Throws an error if this engine is destroyed.
*/
- _handleConnect(chainId) {
- if (!this._state.isConnected) {
- this._state.isConnected = true;
- this.emit('connect', { chainId });
- this._log.debug(messages_1.default.info.connected(chainId));
- }
- }
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _assertIsNotDestroyed);
/**
- * When the provider becomes disconnected, updates internal state and emits
- * required events. Idempotent with respect to the isRecoverable parameter.
- *
- * Error codes per the CloseEvent status codes as required by EIP-1193:
- * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes
+ * Handles a batch of JSON-RPC requests, either in `async` or callback
+ * fashion.
*
- * @param isRecoverable - Whether the disconnection is recoverable.
- * @param errorMessage - A custom error message.
- * @emits MetaMaskInpageProvider#disconnect
+ * @param requests - The request objects to process.
+ * @param callback - The completion callback.
+ * @returns The array of responses, or nothing if a callback was specified.
*/
- _handleDisconnect(isRecoverable, errorMessage) {
- if (this._state.isConnected ||
- (!this._state.isPermanentlyDisconnected && !isRecoverable)) {
- this._state.isConnected = false;
- let error;
- if (isRecoverable) {
- error = new eth_rpc_errors_1.EthereumRpcError(1013, // Try again later
- errorMessage || messages_1.default.errors.disconnected());
- this._log.debug(error);
- }
- else {
- error = new eth_rpc_errors_1.EthereumRpcError(1011, // Internal error
- errorMessage || messages_1.default.errors.permanentlyDisconnected());
- this._log.error(error);
- this.chainId = null;
- this.networkVersion = null;
- this._state.accounts = null;
- this.selectedAddress = null;
- this._state.isUnlocked = false;
- this._state.isPermanentlyDisconnected = true;
- }
- this.emit('disconnect', error);
- this.emit('close', error); // deprecated
- }
- }
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _handleBatch);
/**
- * Called when connection is lost to critical streams.
+ * Ensures that the request / notification object is valid, processes it, and
+ * passes any error and response object to the given callback.
*
- * @emits MetamaskInpageProvider#disconnect
- */
- _handleStreamDisconnect(streamName, error) {
- utils_1.logStreamDisconnectWarning(this._log, streamName, error, this);
- this._handleDisconnect(false, error ? error.message : undefined);
- }
- /**
- * Upon receipt of a new chainId and networkVersion, emits corresponding
- * events and sets relevant public state.
- * Does nothing if neither the chainId nor the networkVersion are different
- * from existing values.
+ * Does not reject.
*
- * @emits MetamaskInpageProvider#chainChanged
- * @param networkInfo - An object with network info.
- * @param networkInfo.chainId - The latest chain ID.
- * @param networkInfo.networkVersion - The latest network ID.
+ * @param callerReq - The request object from the caller.
+ * @param callback - The callback function.
+ * @returns Nothing.
*/
- _handleChainChanged({ chainId, networkVersion, } = {}) {
- if (!chainId || typeof chainId !== 'string' || !chainId.startsWith('0x') ||
- !networkVersion || typeof networkVersion !== 'string') {
- this._log.error('MetaMask: Received invalid network parameters. Please report this bug.', { chainId, networkVersion });
- return;
- }
- if (networkVersion === 'loading') {
- this._handleDisconnect(true);
- }
- else {
- this._handleConnect(chainId);
- if (chainId !== this.chainId) {
- this.chainId = chainId;
- if (this._state.initialized) {
- this.emit('chainChanged', this.chainId);
- }
- }
- if (networkVersion !== this.networkVersion) {
- this.networkVersion = networkVersion;
- if (this._state.initialized) {
- this.emit('networkChanged', this.networkVersion);
- }
- }
- }
- }
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _handle);
/**
- * Called when accounts may have changed. Diffs the new accounts value with
- * the current one, updates all state as necessary, and emits the
- * accountsChanged event.
- *
- * @param accounts - The new accounts value.
- * @param isEthAccounts - Whether the accounts value was returned by
- * a call to eth_accounts.
+ * Indicating whether this engine is destroyed or not.
*/
- _handleAccountsChanged(accounts, isEthAccounts = false) {
- let _accounts = accounts;
- if (!Array.isArray(accounts)) {
- this._log.error('MetaMask: Received invalid accounts parameter. Please report this bug.', accounts);
- _accounts = [];
- }
- for (const account of accounts) {
- if (typeof account !== 'string') {
- this._log.error('MetaMask: Received non-string account. Please report this bug.', accounts);
- _accounts = [];
- break;
- }
- }
- // emit accountsChanged if anything about the accounts array has changed
- if (!fast_deep_equal_1.default(this._state.accounts, _accounts)) {
- // we should always have the correct accounts even before eth_accounts
- // returns
- if (isEthAccounts && this._state.accounts !== null) {
- this._log.error(`MetaMask: 'eth_accounts' unexpectedly updated accounts. Please report this bug.`, _accounts);
- }
- this._state.accounts = _accounts;
- // handle selectedAddress
- if (this.selectedAddress !== _accounts[0]) {
- this.selectedAddress = _accounts[0] || null;
- }
- // finally, after all state has been updated, emit the event
- if (this._state.initialized) {
- this.emit('accountsChanged', _accounts);
- }
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _isDestroyed, false);
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _middleware, void 0);
+ _chunkZ4BLTVTBjs.__privateAdd.call(void 0, this, _notificationHandler, void 0);
+ _chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _middleware, []);
+ _chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _notificationHandler, notificationHandler);
+ }
+ /**
+ * Calls the `destroy()` function of any middleware with that property, clears
+ * the middleware array, and marks this engine as destroyed. A destroyed
+ * engine cannot be used.
+ */
+ destroy() {
+ _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _middleware).forEach(
+ (middleware) => {
+ if (
+ // `in` walks the prototype chain, which is probably the desired
+ // behavior here.
+ "destroy" in middleware && typeof middleware.destroy === "function"
+ ) {
+ middleware.destroy();
}
+ }
+ );
+ _chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _middleware, []);
+ _chunkZ4BLTVTBjs.__privateSet.call(void 0, this, _isDestroyed, true);
+ }
+ /**
+ * Add a middleware function to the engine's middleware stack.
+ *
+ * @param middleware - The middleware function to add.
+ */
+ push(middleware) {
+ _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _assertIsNotDestroyed, assertIsNotDestroyed_fn).call(this);
+ _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _middleware).push(middleware);
+ }
+ handle(req, callback) {
+ _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _assertIsNotDestroyed, assertIsNotDestroyed_fn).call(this);
+ if (callback && typeof callback !== "function") {
+ throw new Error('"callback" must be a function if provided.');
+ }
+ if (Array.isArray(req)) {
+ if (callback) {
+ return _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _handleBatch, handleBatch_fn).call(
+ this,
+ req,
+ // This assertion is safe because of the runtime checks validating that `req` is an array and `callback` is defined.
+ // There is only one overload signature that satisfies both conditions, and its `callback` type is the one that's being asserted.
+ callback
+ );
+ }
+ return _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _handleBatch, handleBatch_fn).call(this, req);
}
- /**
- * Upon receipt of a new isUnlocked state, sets relevant public state.
- * Calls the accounts changed handler with the received accounts, or an empty
- * array.
- *
- * Does nothing if the received value is equal to the existing value.
- * There are no lock/unlock events.
- *
- * @param opts - Options bag.
- * @param opts.accounts - The exposed accounts, if any.
- * @param opts.isUnlocked - The latest isUnlocked value.
- */
- _handleUnlockStateChanged({ accounts, isUnlocked, } = {}) {
- if (typeof isUnlocked !== 'boolean') {
- this._log.error('MetaMask: Received invalid isUnlocked parameter. Please report this bug.');
- return;
+ if (callback) {
+ return _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _handle, handle_fn).call(this, req, callback);
+ }
+ return this._promiseHandle(req);
+ }
+ /**
+ * Returns this engine as a middleware function that can be pushed to other
+ * engines.
+ *
+ * @returns This engine as a middleware function.
+ */
+ asMiddleware() {
+ _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _assertIsNotDestroyed, assertIsNotDestroyed_fn).call(this);
+ return async (req, res, next, end) => {
+ var _a, _b;
+ try {
+ const [middlewareError, isComplete, returnHandlers] = await _chunkZ4BLTVTBjs.__privateMethod.call(void 0, _a = _JsonRpcEngine, _runAllMiddleware, runAllMiddleware_fn).call(_a, req, res, _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _middleware));
+ if (isComplete) {
+ await _chunkZ4BLTVTBjs.__privateMethod.call(void 0, _b = _JsonRpcEngine, _runReturnHandlers, runReturnHandlers_fn).call(_b, returnHandlers);
+ return end(middlewareError);
}
- if (isUnlocked !== this._state.isUnlocked) {
- this._state.isUnlocked = isUnlocked;
- this._handleAccountsChanged(accounts || []);
+ return next(async (handlerCallback) => {
+ var _a2;
+ try {
+ await _chunkZ4BLTVTBjs.__privateMethod.call(void 0, _a2 = _JsonRpcEngine, _runReturnHandlers, runReturnHandlers_fn).call(_a2, returnHandlers);
+ } catch (error) {
+ return handlerCallback(error);
+ }
+ return handlerCallback();
+ });
+ } catch (error) {
+ return end(error);
+ }
+ };
+ }
+ /**
+ * A promise-wrapped _handle.
+ *
+ * @param request - The JSON-RPC request.
+ * @returns The JSON-RPC response.
+ */
+ // This function is used in tests, so we cannot easily change it to use the
+ // hash syntax.
+ // eslint-disable-next-line no-restricted-syntax
+ async _promiseHandle(request) {
+ return new Promise((resolve, reject) => {
+ _chunkZ4BLTVTBjs.__privateMethod.call(void 0, this, _handle, handle_fn).call(this, request, (error, res) => {
+ if (error && res === void 0) {
+ reject(error);
+ } else {
+ resolve(res);
}
- }
- /**
- * Warns of deprecation for the given event, if applicable.
- */
- _warnOfDeprecation(eventName) {
- if (this._state.sentWarnings.events[eventName] === false) {
- this._log.warn(messages_1.default.warnings.events[eventName]);
- this._state.sentWarnings.events[eventName] = true;
+ }).catch(reject);
+ });
+ }
+};
+_isDestroyed = new WeakMap();
+_middleware = new WeakMap();
+_notificationHandler = new WeakMap();
+_assertIsNotDestroyed = new WeakSet();
+assertIsNotDestroyed_fn = function() {
+ if (_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _isDestroyed)) {
+ throw new Error(DESTROYED_ERROR_MESSAGE);
+ }
+};
+_handleBatch = new WeakSet();
+handleBatch_fn = async function(requests, callback) {
+ try {
+ if (requests.length === 0) {
+ const response = [
+ {
+ id: null,
+ jsonrpc: "2.0",
+ error: new (0, _rpcerrors.JsonRpcError)(
+ _rpcerrors.errorCodes.rpc.invalidRequest,
+ "Request batch must contain plain objects. Received an empty array"
+ )
}
+ ];
+ if (callback) {
+ return callback(null, response);
+ }
+ return response;
+ }
+ const responses = (await Promise.all(
+ // 1. Begin executing each request in the order received
+ requests.map(this._promiseHandle.bind(this))
+ )).filter(
+ // Filter out any notification responses.
+ (response) => response !== void 0
+ );
+ if (callback) {
+ return callback(null, responses);
}
- /**
- * Constructor helper.
- * Gets experimental _metamask API as Proxy, so that we can warn consumers
- * about its experiment nature.
- */
- _getExperimentalApi() {
- return new Proxy({
- /**
- * Determines if MetaMask is unlocked by the user.
- *
- * @returns Promise resolving to true if MetaMask is currently unlocked
- */
- isUnlocked: async () => {
- if (!this._state.initialized) {
- await new Promise((resolve) => {
- this.on('_initialized', () => resolve());
- });
- }
- return this._state.isUnlocked;
- },
- /**
- * Make a batch RPC request.
- */
- requestBatch: async (requests) => {
- if (!Array.isArray(requests)) {
- throw eth_rpc_errors_1.ethErrors.rpc.invalidRequest({
- message: 'Batch requests must be made with an array of request objects.',
- data: requests,
- });
- }
- return new Promise((resolve, reject) => {
- this._rpcRequest(requests, utils_1.getRpcPromiseCallback(resolve, reject));
- });
- },
- }, {
- get: (obj, prop, ...args) => {
- if (!this._state.sentWarnings.experimentalMethods) {
- this._log.warn(messages_1.default.warnings.experimentalMethods);
- this._state.sentWarnings.experimentalMethods = true;
- }
- return Reflect.get(obj, prop, ...args);
- },
- });
+ return responses;
+ } catch (error) {
+ if (callback) {
+ return callback(error);
}
- //====================
- // Deprecated Methods
- //====================
- /**
- * Equivalent to: ethereum.request('eth_requestAccounts')
- *
- * @deprecated Use request({ method: 'eth_requestAccounts' }) instead.
- * @returns A promise that resolves to an array of addresses.
- */
- enable() {
- if (!this._state.sentWarnings.enable) {
- this._log.warn(messages_1.default.warnings.enableDeprecation);
- this._state.sentWarnings.enable = true;
- }
- return new Promise((resolve, reject) => {
- try {
- this._rpcRequest({ method: 'eth_requestAccounts', params: [] }, utils_1.getRpcPromiseCallback(resolve, reject));
- }
- catch (error) {
- reject(error);
- }
- });
+ throw error;
+ }
+};
+_handle = new WeakSet();
+handle_fn = async function(callerReq, callback) {
+ var _a;
+ if (!callerReq || Array.isArray(callerReq) || typeof callerReq !== "object") {
+ const error2 = new (0, _rpcerrors.JsonRpcError)(
+ _rpcerrors.errorCodes.rpc.invalidRequest,
+ `Requests must be plain objects. Received: ${typeof callerReq}`,
+ { request: callerReq }
+ );
+ return callback(error2, { id: null, jsonrpc: "2.0", error: error2 });
+ }
+ if (typeof callerReq.method !== "string") {
+ const error2 = new (0, _rpcerrors.JsonRpcError)(
+ _rpcerrors.errorCodes.rpc.invalidRequest,
+ `Must specify a string method. Received: ${typeof callerReq.method}`,
+ { request: callerReq }
+ );
+ if (_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _notificationHandler) && !_utils.isJsonRpcRequest.call(void 0, callerReq)) {
+ return callback(null);
+ }
+ return callback(error2, {
+ // Typecast: This could be a notification, but we want to access the
+ // `id` even if it doesn't exist.
+ id: callerReq.id ?? null,
+ jsonrpc: "2.0",
+ error: error2
+ });
+ } else if (_chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _notificationHandler) && _utils.isJsonRpcNotification.call(void 0, callerReq) && !_utils.isJsonRpcRequest.call(void 0, callerReq)) {
+ try {
+ await _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _notificationHandler).call(this, callerReq);
+ } catch (error2) {
+ return callback(error2);
}
- send(methodOrPayload, callbackOrArgs) {
- if (!this._state.sentWarnings.send) {
- this._log.warn(messages_1.default.warnings.sendDeprecation);
- this._state.sentWarnings.send = true;
- }
- if (typeof methodOrPayload === 'string' &&
- (!callbackOrArgs || Array.isArray(callbackOrArgs))) {
- return new Promise((resolve, reject) => {
- try {
- this._rpcRequest({ method: methodOrPayload, params: callbackOrArgs }, utils_1.getRpcPromiseCallback(resolve, reject, false));
- }
- catch (error) {
- reject(error);
- }
- });
- }
- else if (methodOrPayload &&
- typeof methodOrPayload === 'object' &&
- typeof callbackOrArgs === 'function') {
- return this._rpcRequest(methodOrPayload, callbackOrArgs);
- }
- return this._sendSync(methodOrPayload);
+ return callback(null);
+ }
+ let error = null;
+ const req = { ...callerReq };
+ const res = {
+ id: req.id,
+ jsonrpc: req.jsonrpc
+ };
+ try {
+ await _chunkZ4BLTVTBjs.__privateMethod.call(void 0, _a = _JsonRpcEngine, _processRequest, processRequest_fn).call(_a, req, res, _chunkZ4BLTVTBjs.__privateGet.call(void 0, this, _middleware));
+ } catch (_error) {
+ error = _error;
+ }
+ if (error) {
+ delete res.result;
+ if (!res.error) {
+ res.error = _rpcerrors.serializeError.call(void 0, error);
}
- /**
- * Internal backwards compatibility method, used in send.
- *
- * @deprecated
- */
- _sendSync(payload) {
- let result;
- switch (payload.method) {
- case 'eth_accounts':
- result = this.selectedAddress ? [this.selectedAddress] : [];
- break;
- case 'eth_coinbase':
- result = this.selectedAddress || null;
- break;
- case 'eth_uninstallFilter':
- this._rpcRequest(payload, utils_1.NOOP);
- result = true;
- break;
- case 'net_version':
- result = this.networkVersion || null;
- break;
- default:
- throw new Error(messages_1.default.errors.unsupportedSync(payload.method));
- }
- return {
- id: payload.id,
- jsonrpc: payload.jsonrpc,
- result,
- };
+ }
+ return callback(error, res);
+};
+_processRequest = new WeakSet();
+processRequest_fn = async function(req, res, middlewares) {
+ var _a, _b, _c;
+ const [error, isComplete, returnHandlers] = await _chunkZ4BLTVTBjs.__privateMethod.call(void 0, _a = _JsonRpcEngine, _runAllMiddleware, runAllMiddleware_fn).call(_a, req, res, middlewares);
+ _chunkZ4BLTVTBjs.__privateMethod.call(void 0, _b = _JsonRpcEngine, _checkForCompletion, checkForCompletion_fn).call(_b, req, res, isComplete);
+ await _chunkZ4BLTVTBjs.__privateMethod.call(void 0, _c = _JsonRpcEngine, _runReturnHandlers, runReturnHandlers_fn).call(_c, returnHandlers);
+ if (error) {
+ throw error;
+ }
+};
+_runAllMiddleware = new WeakSet();
+runAllMiddleware_fn = async function(req, res, middlewares) {
+ var _a;
+ const returnHandlers = [];
+ let error = null;
+ let isComplete = false;
+ for (const middleware of middlewares) {
+ [error, isComplete] = await _chunkZ4BLTVTBjs.__privateMethod.call(void 0, _a = _JsonRpcEngine, _runMiddleware, runMiddleware_fn).call(_a, req, res, middleware, returnHandlers);
+ if (isComplete) {
+ break;
}
-}
-exports.default = MetaMaskInpageProvider;
-function validateLoggerObject(logger) {
- if (logger !== console) {
- if (typeof logger === 'object') {
- const methodKeys = ['log', 'warn', 'error', 'debug', 'info', 'trace'];
- for (const key of methodKeys) {
- if (typeof logger[key] !== 'function') {
- throw new Error(messages_1.default.errors.invalidLoggerMethod(key));
- }
- }
- return;
+ }
+ return [error, isComplete, returnHandlers.reverse()];
+};
+_runMiddleware = new WeakSet();
+runMiddleware_fn = async function(request, response, middleware, returnHandlers) {
+ return new Promise((resolve) => {
+ const end = (error) => {
+ const parsedError = error || response.error;
+ if (parsedError) {
+ response.error = _rpcerrors.serializeError.call(void 0, parsedError);
+ }
+ resolve([parsedError, true]);
+ };
+ const next = (returnHandler) => {
+ if (response.error) {
+ end(response.error);
+ } else {
+ if (returnHandler) {
+ if (typeof returnHandler !== "function") {
+ end(
+ new (0, _rpcerrors.JsonRpcError)(
+ _rpcerrors.errorCodes.rpc.internal,
+ `JsonRpcEngine: "next" return handlers must be functions. Received "${typeof returnHandler}" for request:
+${jsonify(
+ request
+ )}`,
+ { request }
+ )
+ );
+ }
+ returnHandlers.push(returnHandler);
}
- throw new Error(messages_1.default.errors.invalidLoggerObject());
+ resolve([null, false]);
+ }
+ };
+ try {
+ middleware(request, response, next, end);
+ } catch (error) {
+ end(error);
}
-}
-
-},{"./messages":25,"./siteMetadata":27,"./utils":28,"@metamask/object-multiplex":32,"@metamask/safe-event-emitter":33,"eth-rpc-errors":45,"fast-deep-equal":77,"is-stream":84,"json-rpc-engine":92,"json-rpc-middleware-stream":96,"pump":103}],23:[function(require,module,exports){
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
+ });
};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.shimWeb3 = exports.setGlobalProvider = exports.MetaMaskInpageProvider = exports.initializeProvider = void 0;
-const MetaMaskInpageProvider_1 = __importDefault(require("./MetaMaskInpageProvider"));
-exports.MetaMaskInpageProvider = MetaMaskInpageProvider_1.default;
-const initializeProvider_1 = require("./initializeProvider");
-Object.defineProperty(exports, "initializeProvider", { enumerable: true, get: function () { return initializeProvider_1.initializeProvider; } });
-Object.defineProperty(exports, "setGlobalProvider", { enumerable: true, get: function () { return initializeProvider_1.setGlobalProvider; } });
-const shimWeb3_1 = __importDefault(require("./shimWeb3"));
-exports.shimWeb3 = shimWeb3_1.default;
-
-},{"./MetaMaskInpageProvider":22,"./initializeProvider":24,"./shimWeb3":26}],24:[function(require,module,exports){
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
+_runReturnHandlers = new WeakSet();
+runReturnHandlers_fn = async function(handlers) {
+ for (const handler of handlers) {
+ await new Promise((resolve, reject) => {
+ handler((error) => error ? reject(error) : resolve());
+ });
+ }
+};
+_checkForCompletion = new WeakSet();
+checkForCompletion_fn = function(request, response, isComplete) {
+ if (!_utils.hasProperty.call(void 0, response, "result") && !_utils.hasProperty.call(void 0, response, "error")) {
+ throw new (0, _rpcerrors.JsonRpcError)(
+ _rpcerrors.errorCodes.rpc.internal,
+ `JsonRpcEngine: Response has no error or result for request:
+${jsonify(
+ request
+ )}`,
+ { request }
+ );
+ }
+ if (!isComplete) {
+ throw new (0, _rpcerrors.JsonRpcError)(
+ _rpcerrors.errorCodes.rpc.internal,
+ `JsonRpcEngine: Nothing ended request:
+${jsonify(request)}`,
+ { request }
+ );
+ }
};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.setGlobalProvider = exports.initializeProvider = void 0;
-const MetaMaskInpageProvider_1 = __importDefault(require("./MetaMaskInpageProvider"));
-const shimWeb3_1 = __importDefault(require("./shimWeb3"));
/**
- * Initializes a MetaMaskInpageProvider and (optionally) assigns it as window.ethereum.
+ * For the given request and response, runs all middleware and their return
+ * handlers, if any, and ensures that internal request processing semantics
+ * are satisfied.
*
- * @param options - An options bag.
- * @param options.connectionStream - A Node.js stream.
- * @param options.jsonRpcStreamName - The name of the internal JSON-RPC stream.
- * @param options.maxEventListeners - The maximum number of event listeners.
- * @param options.shouldSendMetadata - Whether the provider should send page metadata.
- * @param options.shouldSetOnWindow - Whether the provider should be set as window.ethereum.
- * @param options.shouldShimWeb3 - Whether a window.web3 shim should be injected.
- * @returns The initialized provider (whether set or not).
+ * @param req - The request object.
+ * @param res - The response object.
+ * @param middlewares - The stack of middleware functions.
*/
-function initializeProvider({ connectionStream, jsonRpcStreamName, logger = console, maxEventListeners = 100, shouldSendMetadata = true, shouldSetOnWindow = true, shouldShimWeb3 = false, }) {
- let provider = new MetaMaskInpageProvider_1.default(connectionStream, {
- jsonRpcStreamName,
- logger,
- maxEventListeners,
- shouldSendMetadata,
- });
- provider = new Proxy(provider, {
- // some common libraries, e.g. web3@1.x, mess with our API
- deleteProperty: () => true,
- });
- if (shouldSetOnWindow) {
- setGlobalProvider(provider);
- }
- if (shouldShimWeb3) {
- shimWeb3_1.default(provider, logger);
- }
- return provider;
-}
-exports.initializeProvider = initializeProvider;
+_chunkZ4BLTVTBjs.__privateAdd.call(void 0, _JsonRpcEngine, _processRequest);
/**
- * Sets the given provider instance as window.ethereum and dispatches the
- * 'ethereum#initialized' event on window.
+ * Serially executes the given stack of middleware.
*
- * @param providerInstance - The provider instance.
+ * @param req - The request object.
+ * @param res - The response object.
+ * @param middlewares - The stack of middleware functions to execute.
+ * @returns An array of any error encountered during middleware execution,
+ * a boolean indicating whether the request was completed, and an array of
+ * middleware-defined return handlers.
*/
-function setGlobalProvider(providerInstance) {
- window.ethereum = providerInstance;
- window.dispatchEvent(new Event('ethereum#initialized'));
-}
-exports.setGlobalProvider = setGlobalProvider;
-
-},{"./MetaMaskInpageProvider":22,"./shimWeb3":26}],25:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const messages = {
- errors: {
- disconnected: () => 'MetaMask: Disconnected from chain. Attempting to connect.',
- permanentlyDisconnected: () => 'MetaMask: Disconnected from MetaMask background. Page reload required.',
- sendSiteMetadata: () => `MetaMask: Failed to send site metadata. This is an internal error, please report this bug.`,
- unsupportedSync: (method) => `MetaMask: The MetaMask Ethereum provider does not support synchronous methods like ${method} without a callback parameter.`,
- invalidDuplexStream: () => 'Must provide a Node.js-style duplex stream.',
- invalidOptions: (maxEventListeners, shouldSendMetadata) => `Invalid options. Received: { maxEventListeners: ${maxEventListeners}, shouldSendMetadata: ${shouldSendMetadata} }`,
- invalidRequestArgs: () => `Expected a single, non-array, object argument.`,
- invalidRequestMethod: () => `'args.method' must be a non-empty string.`,
- invalidRequestParams: () => `'args.params' must be an object or array if provided.`,
- invalidLoggerObject: () => `'args.logger' must be an object if provided.`,
- invalidLoggerMethod: (method) => `'args.logger' must include required method '${method}'.`,
- },
- info: {
- connected: (chainId) => `MetaMask: Connected to chain with ID "${chainId}".`,
- },
- warnings: {
- // deprecated methods
- enableDeprecation: `MetaMask: 'ethereum.enable()' is deprecated and may be removed in the future. Please use the 'eth_requestAccounts' RPC method instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1102`,
- sendDeprecation: `MetaMask: 'ethereum.send(...)' is deprecated and may be removed in the future. Please use 'ethereum.sendAsync(...)' or 'ethereum.request(...)' instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1193`,
- // deprecated events
- events: {
- close: `MetaMask: The event 'close' is deprecated and may be removed in the future. Please use 'disconnect' instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1193#disconnect`,
- data: `MetaMask: The event 'data' is deprecated and will be removed in the future. Use 'message' instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1193#message`,
- networkChanged: `MetaMask: The event 'networkChanged' is deprecated and may be removed in the future. Use 'chainChanged' instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1193#chainchanged`,
- notification: `MetaMask: The event 'notification' is deprecated and may be removed in the future. Use 'message' instead.\nFor more information, see: https://eips.ethereum.org/EIPS/eip-1193#message`,
- },
- // misc
- experimentalMethods: `MetaMask: 'ethereum._metamask' exposes non-standard, experimental methods. They may be removed or changed without warning.`,
- },
-};
-exports.default = messages;
-
-},{}],26:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
+_chunkZ4BLTVTBjs.__privateAdd.call(void 0, _JsonRpcEngine, _runAllMiddleware);
/**
- * If no existing window.web3 is found, this function injects a web3 "shim" to
- * not break dapps that rely on window.web3.currentProvider.
+ * Runs an individual middleware function.
*
- * @param provider - The provider to set as window.web3.currentProvider.
- * @param log - The logging API to use.
+ * @param request - The request object.
+ * @param response - The response object.
+ * @param middleware - The middleware function to execute.
+ * @param returnHandlers - The return handlers array for the current request.
+ * @returns An array of any error encountered during middleware exection,
+ * and a boolean indicating whether the request should end.
*/
-function shimWeb3(provider, log = console) {
- let loggedCurrentProvider = false;
- let loggedMissingProperty = false;
- if (!window.web3) {
- const SHIM_IDENTIFIER = '__isMetaMaskShim__';
- let web3Shim = { currentProvider: provider };
- Object.defineProperty(web3Shim, SHIM_IDENTIFIER, {
- value: true,
- enumerable: true,
- configurable: false,
- writable: false,
- });
- web3Shim = new Proxy(web3Shim, {
- get: (target, property, ...args) => {
- if (property === 'currentProvider' && !loggedCurrentProvider) {
- loggedCurrentProvider = true;
- log.warn('You are accessing the MetaMask window.web3.currentProvider shim. This property is deprecated; use window.ethereum instead. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3');
- }
- else if (property !== SHIM_IDENTIFIER && !loggedMissingProperty) {
- loggedMissingProperty = true;
- log.error(`MetaMask no longer injects web3. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3`);
- provider.request({ method: 'metamask_logWeb3ShimUsage' })
- .catch((error) => {
- log.debug('MetaMask: Failed to log web3 shim usage.', error);
- });
- }
- return Reflect.get(target, property, ...args);
- },
- set: (...args) => {
- log.warn('You are accessing the MetaMask window.web3 shim. This object is deprecated; use window.ethereum instead. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3');
- return Reflect.set(...args);
- },
- });
- Object.defineProperty(window, 'web3', {
- value: web3Shim,
- enumerable: false,
- configurable: true,
- writable: true,
- });
- }
-}
-exports.default = shimWeb3;
-
-},{}],27:[function(require,module,exports){
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const messages_1 = __importDefault(require("./messages"));
-const utils_1 = require("./utils");
+_chunkZ4BLTVTBjs.__privateAdd.call(void 0, _JsonRpcEngine, _runMiddleware);
/**
- * Sends site metadata over an RPC request.
+ * Serially executes array of return handlers. The request and response are
+ * assumed to be in their scope.
*
- * @param engine - The JSON RPC Engine to send metadata over.
- * @param log - The logging API to use.
+ * @param handlers - The return handlers to execute.
*/
-async function sendSiteMetadata(engine, log) {
- try {
- const domainMetadata = await getSiteMetadata();
- // call engine.handle directly to avoid normal RPC request handling
- engine.handle({
- jsonrpc: '2.0',
- id: 1,
- method: 'metamask_sendDomainMetadata',
- params: domainMetadata,
- }, utils_1.NOOP);
- }
- catch (error) {
- log.error({
- message: messages_1.default.errors.sendSiteMetadata(),
- originalError: error,
- });
- }
-}
-exports.default = sendSiteMetadata;
+_chunkZ4BLTVTBjs.__privateAdd.call(void 0, _JsonRpcEngine, _runReturnHandlers);
/**
- * Gets site metadata and returns it
+ * Throws an error if the response has neither a result nor an error, or if
+ * the "isComplete" flag is falsy.
*
+ * @param request - The request object.
+ * @param response - The response object.
+ * @param isComplete - Boolean from {@link JsonRpcEngine.#runAllMiddleware}
+ * indicating whether a middleware ended the request.
*/
-async function getSiteMetadata() {
- return {
- name: getSiteName(window),
- icon: await getSiteIcon(window),
- };
+_chunkZ4BLTVTBjs.__privateAdd.call(void 0, _JsonRpcEngine, _checkForCompletion);
+var JsonRpcEngine = _JsonRpcEngine;
+function jsonify(request) {
+ return JSON.stringify(request, null, 2);
}
-/**
- * Extracts a name for the site from the DOM
- */
-function getSiteName(windowObject) {
- const { document } = windowObject;
- const siteName = document.querySelector('head > meta[property="og:site_name"]');
- if (siteName) {
- return siteName.content;
- }
- const metaTitle = document.querySelector('head > meta[name="title"]');
- if (metaTitle) {
- return metaTitle.content;
- }
- if (document.title && document.title.length > 0) {
- return document.title;
+
+
+
+exports.JsonRpcEngine = JsonRpcEngine;
+
+},{"./chunk-Z4BLTVTB.js":27,"@metamask/rpc-errors":86,"@metamask/safe-event-emitter":87,"@metamask/utils":109}],23:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/createScaffoldMiddleware.ts
+function createScaffoldMiddleware(handlers) {
+ return (req, res, next, end) => {
+ const handler = handlers[req.method];
+ if (handler === void 0) {
+ return next();
}
- return window.location.hostname;
-}
-/**
- * Extracts an icon for the site from the DOM
- * @returns an icon URL
- */
-async function getSiteIcon(windowObject) {
- const { document } = windowObject;
- const icons = document.querySelectorAll('head > link[rel~="icon"]');
- for (const icon of icons) {
- if (icon && await imgExists(icon.href)) {
- return icon.href;
- }
+ if (typeof handler === "function") {
+ return handler(req, res, next, end);
}
- return null;
+ res.result = handler;
+ return end();
+ };
}
-/**
- * Returns whether the given image URL exists
- * @param url - the url of the image
- * @returns Whether the image exists.
- */
-function imgExists(url) {
- return new Promise((resolve, reject) => {
- try {
- const img = document.createElement('img');
- img.onload = () => resolve(true);
- img.onerror = () => resolve(false);
- img.src = url;
- }
- catch (e) {
- reject(e);
- }
+
+
+
+exports.createScaffoldMiddleware = createScaffoldMiddleware;
+
+},{}],24:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+var _chunkXDGWQHNYjs = require('./chunk-XDGWQHNY.js');
+
+// src/idRemapMiddleware.ts
+function createIdRemapMiddleware() {
+ return (request, response, next, _end) => {
+ const originalId = request.id;
+ const newId = _chunkXDGWQHNYjs.getUniqueId.call(void 0, );
+ request.id = newId;
+ response.id = newId;
+ next((done) => {
+ request.id = originalId;
+ response.id = originalId;
+ done();
});
+ };
}
-},{"./messages":25,"./utils":28}],28:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EMITTED_NOTIFICATIONS = exports.NOOP = exports.logStreamDisconnectWarning = exports.getRpcPromiseCallback = exports.createErrorMiddleware = void 0;
-const eth_rpc_errors_1 = require("eth-rpc-errors");
-// utility functions
-/**
- * json-rpc-engine middleware that logs RPC errors and and validates req.method.
- *
- * @param log - The logging API to use.
- * @returns json-rpc-engine middleware function
- */
-function createErrorMiddleware(log) {
- return (req, res, next) => {
- // json-rpc-engine will terminate the request when it notices this error
- if (typeof req.method !== 'string' || !req.method) {
- res.error = eth_rpc_errors_1.ethErrors.rpc.invalidRequest({
- message: `The request 'method' must be a non-empty string.`,
- data: req,
- });
- }
- next((done) => {
- const { error } = res;
- if (!error) {
- return done();
- }
- log.error(`MetaMask - RPC Error: ${error.message}`, error);
- return done();
- });
- };
-}
-exports.createErrorMiddleware = createErrorMiddleware;
-// resolve response.result or response, reject errors
-const getRpcPromiseCallback = (resolve, reject, unwrapResult = true) => (error, response) => {
- if (error || response.error) {
- reject(error || response.error);
- }
- else {
- !unwrapResult || Array.isArray(response)
- ? resolve(response)
- : resolve(response.result);
- }
-};
-exports.getRpcPromiseCallback = getRpcPromiseCallback;
-/**
- * Logs a stream disconnection error. Emits an 'error' if given an
- * EventEmitter that has listeners for the 'error' event.
- *
- * @param log - The logging API to use.
- * @param remoteLabel - The label of the disconnected stream.
- * @param error - The associated error to log.
- * @param emitter - The logging API to use.
- */
-function logStreamDisconnectWarning(log, remoteLabel, error, emitter) {
- let warningMsg = `MetaMask: Lost connection to "${remoteLabel}".`;
- if (error === null || error === void 0 ? void 0 : error.stack) {
- warningMsg += `\n${error.stack}`;
- }
- log.warn(warningMsg);
- if (emitter && emitter.listenerCount('error') > 0) {
- emitter.emit('error', warningMsg);
- }
-}
-exports.logStreamDisconnectWarning = logStreamDisconnectWarning;
-const NOOP = () => undefined;
-exports.NOOP = NOOP;
-// constants
-exports.EMITTED_NOTIFICATIONS = [
- 'eth_subscription',
-];
-},{"eth-rpc-errors":45}],29:[function(require,module,exports){
-var BN = require('bn.js');
-var stripHexPrefix = require('strip-hex-prefix');
-/**
- * Returns a BN object, converts a number value to a BN
- * @param {String|Number|Object} `arg` input a string number, hex string number, number, BigNumber or BN object
- * @return {Object} `output` BN object of the number
- * @throws if the argument is not an array, object that isn't a bignumber, not a string number or number
- */
-module.exports = function numberToBN(arg) {
- if (typeof arg === 'string' || typeof arg === 'number') {
- var multiplier = new BN(1); // eslint-disable-line
- var formattedString = String(arg).toLowerCase().trim();
- var isHexPrefixed = formattedString.substr(0, 2) === '0x' || formattedString.substr(0, 3) === '-0x';
- var stringArg = stripHexPrefix(formattedString); // eslint-disable-line
- if (stringArg.substr(0, 1) === '-') {
- stringArg = stripHexPrefix(stringArg.slice(1));
- multiplier = new BN(-1, 10);
- }
- stringArg = stringArg === '' ? '0' : stringArg;
+exports.createIdRemapMiddleware = createIdRemapMiddleware;
- if ((!stringArg.match(/^-?[0-9]+$/) && stringArg.match(/^[0-9A-Fa-f]+$/))
- || stringArg.match(/^[a-fA-F]+$/)
- || (isHexPrefixed === true && stringArg.match(/^[0-9A-Fa-f]+$/))) {
- return new BN(stringArg, 16).mul(multiplier);
- }
+},{"./chunk-XDGWQHNY.js":26}],25:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
- if ((stringArg.match(/^-?[0-9]+$/) || stringArg === '') && isHexPrefixed === false) {
- return new BN(stringArg, 10).mul(multiplier);
- }
- } else if (typeof arg === 'object' && arg.toString && (!arg.pop && !arg.push)) {
- if (arg.toString(10).match(/^-?[0-9]+$/) && (arg.mul || arg.dividedToIntegerBy)) {
- return new BN(arg.toString(10), 10);
- }
- }
+var _chunk2LXAFMJDjs = require('./chunk-2LXAFMJD.js');
- throw new Error('[number-to-bn] while converting number ' + JSON.stringify(arg) + ' to BN.js instance, error: invalid number value. Value must be an integer, hex string, BN or BigNumber instance. Note, decimals are not supported.');
+// src/mergeMiddleware.ts
+function mergeMiddleware(middlewareStack) {
+ const engine = new (0, _chunk2LXAFMJDjs.JsonRpcEngine)();
+ middlewareStack.forEach((middleware) => engine.push(middleware));
+ return engine.asMiddleware();
}
-},{"bn.js":36,"strip-hex-prefix":116}],30:[function(require,module,exports){
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
+
+
+exports.mergeMiddleware = mergeMiddleware;
+
+},{"./chunk-2LXAFMJD.js":22}],26:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/getUniqueId.ts
+var MAX = 4294967295;
+var idCounter = Math.floor(Math.random() * MAX);
+function getUniqueId() {
+ idCounter = (idCounter + 1) % MAX;
+ return idCounter;
+}
+
+
+
+exports.getUniqueId = getUniqueId;
+
+},{}],27:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});var __accessCheck = (obj, member, msg) => {
+ if (!member.has(obj))
+ throw TypeError("Cannot " + msg);
};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ObjectMultiplex = void 0;
-const readable_stream_1 = require("readable-stream");
-const end_of_stream_1 = __importDefault(require("end-of-stream"));
-const once_1 = __importDefault(require("once"));
-const Substream_1 = require("./Substream");
-const IGNORE_SUBSTREAM = Symbol('IGNORE_SUBSTREAM');
-class ObjectMultiplex extends readable_stream_1.Duplex {
- constructor(opts = {}) {
- super(Object.assign(Object.assign({}, opts), { objectMode: true }));
- this._substreams = {};
- }
- createStream(name) {
- // validate name
- if (!name) {
- throw new Error('ObjectMultiplex - name must not be empty');
- }
- if (this._substreams[name]) {
- throw new Error(`ObjectMultiplex - Substream for name "${name}" already exists`);
- }
- // create substream
- const substream = new Substream_1.Substream({ parent: this, name });
- this._substreams[name] = substream;
- // listen for parent stream to end
- anyStreamEnd(this, (_error) => {
- return substream.destroy(_error || undefined);
- });
- return substream;
- }
- // ignore streams (dont display orphaned data warning)
- ignoreStream(name) {
- // validate name
- if (!name) {
- throw new Error('ObjectMultiplex - name must not be empty');
- }
- if (this._substreams[name]) {
- throw new Error(`ObjectMultiplex - Substream for name "${name}" already exists`);
- }
- // set
- this._substreams[name] = IGNORE_SUBSTREAM;
- }
- _read() {
- return undefined;
- }
- _write(chunk, _encoding, callback) {
- const { name, data } = chunk;
- if (!name) {
- console.warn(`ObjectMultiplex - malformed chunk without name "${chunk}"`);
- return callback();
- }
- // get corresponding substream
- const substream = this._substreams[name];
- if (!substream) {
- console.warn(`ObjectMultiplex - orphaned data for stream "${name}"`);
- return callback();
- }
- // push data into substream
- if (substream !== IGNORE_SUBSTREAM) {
- substream.push(data);
- }
- return callback();
+var __privateGet = (obj, member, getter) => {
+ __accessCheck(obj, member, "read from private field");
+ return getter ? getter.call(obj) : member.get(obj);
+};
+var __privateAdd = (obj, member, value) => {
+ if (member.has(obj))
+ throw TypeError("Cannot add the same private member more than once");
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
+};
+var __privateSet = (obj, member, value, setter) => {
+ __accessCheck(obj, member, "write to private field");
+ setter ? setter.call(obj, value) : member.set(obj, value);
+ return value;
+};
+var __privateMethod = (obj, member, method) => {
+ __accessCheck(obj, member, "access private method");
+ return method;
+};
+
+
+
+
+
+
+exports.__privateGet = __privateGet; exports.__privateAdd = __privateAdd; exports.__privateSet = __privateSet; exports.__privateMethod = __privateMethod;
+
+},{}],28:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/createAsyncMiddleware.ts
+function createAsyncMiddleware(asyncMiddleware) {
+ return async (request, response, next, end) => {
+ let resolveNextPromise;
+ const nextPromise = new Promise((resolve) => {
+ resolveNextPromise = resolve;
+ });
+ let returnHandlerCallback = null;
+ let nextWasCalled = false;
+ const asyncNext = async () => {
+ nextWasCalled = true;
+ next((runReturnHandlersCallback) => {
+ returnHandlerCallback = runReturnHandlersCallback;
+ resolveNextPromise();
+ });
+ return nextPromise;
+ };
+ try {
+ await asyncMiddleware(request, response, asyncNext);
+ if (nextWasCalled) {
+ await nextPromise;
+ returnHandlerCallback(null);
+ } else {
+ end(null);
+ }
+ } catch (error) {
+ if (returnHandlerCallback) {
+ returnHandlerCallback(error);
+ } else {
+ end(error);
+ }
}
-}
-exports.ObjectMultiplex = ObjectMultiplex;
-// util
-function anyStreamEnd(stream, _cb) {
- const cb = once_1.default(_cb);
- end_of_stream_1.default(stream, { readable: false }, cb);
- end_of_stream_1.default(stream, { writable: false }, cb);
+ };
}
-},{"./Substream":31,"end-of-stream":41,"once":99,"readable-stream":112}],31:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.Substream = void 0;
-const readable_stream_1 = require("readable-stream");
-class Substream extends readable_stream_1.Duplex {
- constructor({ parent, name }) {
- super({ objectMode: true });
- this._parent = parent;
- this._name = name;
+
+
+exports.createAsyncMiddleware = createAsyncMiddleware;
+
+},{}],29:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+var _chunkZYXL5TCSjs = require('./chunk-ZYXL5TCS.js');
+
+
+var _chunk3AC2MINDjs = require('./chunk-3AC2MIND.js');
+
+
+var _chunkPBQXMZM5js = require('./chunk-PBQXMZM5.js');
+
+
+var _chunkXDGWQHNYjs = require('./chunk-XDGWQHNY.js');
+
+
+var _chunkVK4MHWJVjs = require('./chunk-VK4MHWJV.js');
+
+
+var _chunk2LXAFMJDjs = require('./chunk-2LXAFMJD.js');
+require('./chunk-Z4BLTVTB.js');
+
+
+
+
+
+
+
+exports.JsonRpcEngine = _chunk2LXAFMJDjs.JsonRpcEngine; exports.createAsyncMiddleware = _chunkZYXL5TCSjs.createAsyncMiddleware; exports.createIdRemapMiddleware = _chunkPBQXMZM5js.createIdRemapMiddleware; exports.createScaffoldMiddleware = _chunk3AC2MINDjs.createScaffoldMiddleware; exports.getUniqueId = _chunkXDGWQHNYjs.getUniqueId; exports.mergeMiddleware = _chunkVK4MHWJVjs.mergeMiddleware;
+
+},{"./chunk-2LXAFMJD.js":22,"./chunk-3AC2MIND.js":23,"./chunk-PBQXMZM5.js":24,"./chunk-VK4MHWJV.js":25,"./chunk-XDGWQHNY.js":26,"./chunk-Z4BLTVTB.js":27,"./chunk-ZYXL5TCS.js":28}],30:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/createStreamMiddleware.ts
+var _safeeventemitter = require('@metamask/safe-event-emitter'); var _safeeventemitter2 = _interopRequireDefault(_safeeventemitter);
+var _readablestream = require('readable-stream');
+function createStreamMiddleware(options = {}) {
+ const idMap = {};
+ const stream = new (0, _readablestream.Duplex)({
+ objectMode: true,
+ read: () => void 0,
+ write: processMessage
+ });
+ const events = new (0, _safeeventemitter2.default)();
+ const middleware = (req, res, next, end) => {
+ idMap[req.id] = { req, res, next, end };
+ sendToStream(req);
+ };
+ return { events, middleware, stream };
+ function sendToStream(req) {
+ stream.push(req);
+ }
+ function processMessage(res, _encoding, streamWriteCallback) {
+ let errorObj = null;
+ try {
+ const isNotification = !res.id;
+ if (isNotification) {
+ processNotification(res);
+ } else {
+ processResponse(res);
+ }
+ } catch (_err) {
+ errorObj = _err;
}
- /**
- * Explicitly sets read operations to a no-op.
- */
- _read() {
- return undefined;
+ streamWriteCallback(errorObj);
+ }
+ function processResponse(res) {
+ const { id: responseId } = res;
+ if (responseId === null) {
+ return;
}
- /**
- * Called when data should be written to this writable stream.
- *
- * @param chunk - Arbitrary object to write
- * @param encoding - Encoding to use when writing payload
- * @param callback - Called when writing is complete or an error occurs
- */
- _write(chunk, _encoding, callback) {
- this._parent.push({
- name: this._name,
- data: chunk,
- });
- callback();
+ const context = idMap[responseId];
+ if (!context) {
+ console.warn(`StreamMiddleware - Unknown response id "${responseId}"`);
+ return;
+ }
+ delete idMap[responseId];
+ Object.assign(context.res, res);
+ setTimeout(context.end);
+ }
+ function processNotification(notif) {
+ if (options?.retryOnMessage && notif.method === options.retryOnMessage) {
+ retryStuckRequests();
}
+ events.emit("notification", notif);
+ }
+ function retryStuckRequests() {
+ Object.values(idMap).forEach(({ req, retryCount = 0 }) => {
+ if (!req.id) {
+ return;
+ }
+ if (retryCount >= 3) {
+ throw new Error(
+ `StreamMiddleware - Retry limit exceeded for request id "${req.id}"`
+ );
+ }
+ const idMapObject = idMap[req.id];
+ if (idMapObject) {
+ idMapObject.retryCount = retryCount + 1;
+ }
+ sendToStream(req);
+ });
+ }
}
-exports.Substream = Substream;
-},{"readable-stream":112}],32:[function(require,module,exports){
-"use strict";
-const ObjectMultiplex_1 = require("./ObjectMultiplex");
-module.exports = ObjectMultiplex_1.ObjectMultiplex;
-
-},{"./ObjectMultiplex":30}],33:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const events_1 = require("events");
-function safeApply(handler, context, args) {
- try {
- Reflect.apply(handler, context, args);
- }
- catch (err) {
- // Throw error after timeout so as not to interrupt the stack
- setTimeout(() => {
- throw err;
- });
- }
-}
-function arrayClone(arr) {
- const n = arr.length;
- const copy = new Array(n);
- for (let i = 0; i < n; i += 1) {
- copy[i] = arr[i];
- }
- return copy;
-}
-class SafeEventEmitter extends events_1.EventEmitter {
- emit(type, ...args) {
- let doError = type === 'error';
- const events = this._events;
- if (events !== undefined) {
- doError = doError && events.error === undefined;
- }
- else if (!doError) {
- return false;
- }
- // If there is no 'error' event listener then throw.
- if (doError) {
- let er;
- if (args.length > 0) {
- [er] = args;
- }
- if (er instanceof Error) {
- // Note: The comments on the `throw` lines are intentional, they show
- // up in Node's output if this results in an unhandled exception.
- throw er; // Unhandled 'error' event
- }
- // At least give some kind of context to the user
- const err = new Error(`Unhandled error.${er ? ` (${er.message})` : ''}`);
- err.context = er;
- throw err; // Unhandled 'error' event
- }
- const handler = events[type];
- if (handler === undefined) {
- return false;
- }
- if (typeof handler === 'function') {
- safeApply(handler, this, args);
- }
- else {
- const len = handler.length;
- const listeners = arrayClone(handler);
- for (let i = 0; i < len; i += 1) {
- safeApply(listeners[i], this, args);
- }
- }
- return true;
- }
-}
-exports.default = SafeEventEmitter;
-},{"events":51}],34:[function(require,module,exports){
-/*globals self, window */
-"use strict"
-/*eslint-disable @mysticatea/prettier */
-const { AbortController, AbortSignal } =
- typeof self !== "undefined" ? self :
- typeof window !== "undefined" ? window :
- /* otherwise */ undefined
-/*eslint-enable @mysticatea/prettier */
+exports.createStreamMiddleware = createStreamMiddleware;
-module.exports = AbortController
-module.exports.AbortSignal = AbortSignal
-module.exports.default = AbortController
+},{"@metamask/safe-event-emitter":87,"readable-stream":47}],31:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/createEngineStream.ts
+var _readablestream = require('readable-stream');
+function createEngineStream(opts) {
+ if (!opts?.engine) {
+ throw new Error("Missing engine parameter!");
+ }
+ const { engine } = opts;
+ const stream = new (0, _readablestream.Duplex)({ objectMode: true, read: () => void 0, write });
+ if (engine.on) {
+ engine.on("notification", (message) => {
+ stream.push(message);
+ });
+ }
+ return stream;
+ function write(req, _encoding, streamWriteCallback) {
+ engine.handle(req, (_err, res) => {
+ stream.push(res);
+ });
+ streamWriteCallback();
+ }
+}
-},{}],35:[function(require,module,exports){
-'use strict'
-exports.byteLength = byteLength
-exports.toByteArray = toByteArray
-exports.fromByteArray = fromByteArray
-var lookup = []
-var revLookup = []
-var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
+exports.createEngineStream = createEngineStream;
-var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
-for (var i = 0, len = code.length; i < len; ++i) {
- lookup[i] = code[i]
- revLookup[code.charCodeAt(i)] = i
-}
+},{"readable-stream":47}],32:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
-// Support decoding URL-safe base64 strings, as Node.js does.
-// See: https://en.wikipedia.org/wiki/Base64#URL_applications
-revLookup['-'.charCodeAt(0)] = 62
-revLookup['_'.charCodeAt(0)] = 63
+var _chunkIDTAZSDCjs = require('./chunk-IDTAZSDC.js');
-function getLens (b64) {
- var len = b64.length
- if (len % 4 > 0) {
- throw new Error('Invalid string. Length must be a multiple of 4')
- }
+var _chunk3SFZPJR3js = require('./chunk-3SFZPJR3.js');
- // Trim off extra bytes after placeholder bytes are found
- // See: https://github.com/beatgammit/base64-js/issues/42
- var validLen = b64.indexOf('=')
- if (validLen === -1) validLen = len
- var placeHoldersLen = validLen === len
- ? 0
- : 4 - (validLen % 4)
- return [validLen, placeHoldersLen]
-}
+exports.createEngineStream = _chunkIDTAZSDCjs.createEngineStream; exports.createStreamMiddleware = _chunk3SFZPJR3js.createStreamMiddleware;
-// base64 is 4/3 + up to two characters of the original data
-function byteLength (b64) {
- var lens = getLens(b64)
- var validLen = lens[0]
- var placeHoldersLen = lens[1]
- return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
-}
+},{"./chunk-3SFZPJR3.js":30,"./chunk-IDTAZSDC.js":31}],33:[function(require,module,exports){
+'use strict';
-function _byteLength (b64, validLen, placeHoldersLen) {
- return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
-}
+function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
-function toByteArray (b64) {
- var tmp
- var lens = getLens(b64)
- var validLen = lens[0]
- var placeHoldersLen = lens[1]
+var codes = {};
- var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
+function createErrorType(code, message, Base) {
+ if (!Base) {
+ Base = Error;
+ }
- var curByte = 0
+ function getMessage(arg1, arg2, arg3) {
+ if (typeof message === 'string') {
+ return message;
+ } else {
+ return message(arg1, arg2, arg3);
+ }
+ }
- // if there are placeholders, only get up to the last complete 4 chars
- var len = placeHoldersLen > 0
- ? validLen - 4
- : validLen
+ var NodeError =
+ /*#__PURE__*/
+ function (_Base) {
+ _inheritsLoose(NodeError, _Base);
- var i
- for (i = 0; i < len; i += 4) {
- tmp =
- (revLookup[b64.charCodeAt(i)] << 18) |
- (revLookup[b64.charCodeAt(i + 1)] << 12) |
- (revLookup[b64.charCodeAt(i + 2)] << 6) |
- revLookup[b64.charCodeAt(i + 3)]
- arr[curByte++] = (tmp >> 16) & 0xFF
- arr[curByte++] = (tmp >> 8) & 0xFF
- arr[curByte++] = tmp & 0xFF
- }
+ function NodeError(arg1, arg2, arg3) {
+ return _Base.call(this, getMessage(arg1, arg2, arg3)) || this;
+ }
- if (placeHoldersLen === 2) {
- tmp =
- (revLookup[b64.charCodeAt(i)] << 2) |
- (revLookup[b64.charCodeAt(i + 1)] >> 4)
- arr[curByte++] = tmp & 0xFF
- }
+ return NodeError;
+ }(Base);
- if (placeHoldersLen === 1) {
- tmp =
- (revLookup[b64.charCodeAt(i)] << 10) |
- (revLookup[b64.charCodeAt(i + 1)] << 4) |
- (revLookup[b64.charCodeAt(i + 2)] >> 2)
- arr[curByte++] = (tmp >> 8) & 0xFF
- arr[curByte++] = tmp & 0xFF
- }
+ NodeError.prototype.name = Base.name;
+ NodeError.prototype.code = code;
+ codes[code] = NodeError;
+} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js
- return arr
-}
-function tripletToBase64 (num) {
- return lookup[num >> 18 & 0x3F] +
- lookup[num >> 12 & 0x3F] +
- lookup[num >> 6 & 0x3F] +
- lookup[num & 0x3F]
-}
+function oneOf(expected, thing) {
+ if (Array.isArray(expected)) {
+ var len = expected.length;
+ expected = expected.map(function (i) {
+ return String(i);
+ });
-function encodeChunk (uint8, start, end) {
- var tmp
- var output = []
- for (var i = start; i < end; i += 3) {
- tmp =
- ((uint8[i] << 16) & 0xFF0000) +
- ((uint8[i + 1] << 8) & 0xFF00) +
- (uint8[i + 2] & 0xFF)
- output.push(tripletToBase64(tmp))
+ if (len > 2) {
+ return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1];
+ } else if (len === 2) {
+ return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]);
+ } else {
+ return "of ".concat(thing, " ").concat(expected[0]);
+ }
+ } else {
+ return "of ".concat(thing, " ").concat(String(expected));
}
- return output.join('')
-}
+} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
-function fromByteArray (uint8) {
- var tmp
- var len = uint8.length
- var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
- var parts = []
- var maxChunkLength = 16383 // must be multiple of 3
- // go through the array every three bytes, we'll deal with trailing stuff later
- for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
- parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
- }
+function startsWith(str, search, pos) {
+ return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
+} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
- // pad the end with zeros, but make sure to not forget the extra bytes
- if (extraBytes === 1) {
- tmp = uint8[len - 1]
- parts.push(
- lookup[tmp >> 2] +
- lookup[(tmp << 4) & 0x3F] +
- '=='
- )
- } else if (extraBytes === 2) {
- tmp = (uint8[len - 2] << 8) + uint8[len - 1]
- parts.push(
- lookup[tmp >> 10] +
- lookup[(tmp >> 4) & 0x3F] +
- lookup[(tmp << 2) & 0x3F] +
- '='
- )
+
+function endsWith(str, search, this_len) {
+ if (this_len === undefined || this_len > str.length) {
+ this_len = str.length;
}
- return parts.join('')
-}
+ return str.substring(this_len - search.length, this_len) === search;
+} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
-},{}],36:[function(require,module,exports){
-(function (module, exports) {
- 'use strict';
- // Utils
- function assert (val, msg) {
- if (!val) throw new Error(msg || 'Assertion failed');
+function includes(str, search, start) {
+ if (typeof start !== 'number') {
+ start = 0;
}
- // Could use `inherits` module, but don't want to move from single file
- // architecture yet.
- function inherits (ctor, superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function () {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor();
- ctor.prototype.constructor = ctor;
+ if (start + search.length > str.length) {
+ return false;
+ } else {
+ return str.indexOf(search, start) !== -1;
}
+}
- // BN
+createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {
+ return 'The value "' + value + '" is invalid for option "' + name + '"';
+}, TypeError);
+createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {
+ // determiner: 'must be' or 'must not be'
+ var determiner;
- function BN (number, base, endian) {
- if (BN.isBN(number)) {
- return number;
- }
+ if (typeof expected === 'string' && startsWith(expected, 'not ')) {
+ determiner = 'must not be';
+ expected = expected.replace(/^not /, '');
+ } else {
+ determiner = 'must be';
+ }
- this.negative = 0;
- this.words = null;
- this.length = 0;
+ var msg;
- // Reduction context
- this.red = null;
+ if (endsWith(name, ' argument')) {
+ // For cases like 'first argument'
+ msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
+ } else {
+ var type = includes(name, '.') ? 'property' : 'argument';
+ msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type'));
+ }
- if (number !== null) {
- if (base === 'le' || base === 'be') {
- endian = base;
- base = 10;
- }
+ msg += ". Received type ".concat(typeof actual);
+ return msg;
+}, TypeError);
+createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');
+createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {
+ return 'The ' + name + ' method is not implemented';
+});
+createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');
+createErrorType('ERR_STREAM_DESTROYED', function (name) {
+ return 'Cannot call ' + name + ' after a stream was destroyed';
+});
+createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');
+createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');
+createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');
+createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);
+createErrorType('ERR_UNKNOWN_ENCODING', function (arg) {
+ return 'Unknown encoding: ' + arg;
+}, TypeError);
+createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');
+module.exports.codes = codes;
+
+},{}],34:[function(require,module,exports){
+(function (process){(function (){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
- this._init(number || 0, base || 10, endian || 'be');
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+
+'use strict';
+
+/**/
+var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ return keys;
+};
+/**/
+
+module.exports = Duplex;
+var Readable = require('./_stream_readable');
+var Writable = require('./_stream_writable');
+require('inherits')(Duplex, Readable);
+{
+ // Allow the keys array to be GC'ed.
+ var keys = objectKeys(Writable.prototype);
+ for (var v = 0; v < keys.length; v++) {
+ var method = keys[v];
+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+ }
+}
+function Duplex(options) {
+ if (!(this instanceof Duplex)) return new Duplex(options);
+ Readable.call(this, options);
+ Writable.call(this, options);
+ this.allowHalfOpen = true;
+ if (options) {
+ if (options.readable === false) this.readable = false;
+ if (options.writable === false) this.writable = false;
+ if (options.allowHalfOpen === false) {
+ this.allowHalfOpen = false;
+ this.once('end', onend);
}
}
- if (typeof module === 'object') {
- module.exports = BN;
- } else {
- exports.BN = BN;
+}
+Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState.highWaterMark;
+ }
+});
+Object.defineProperty(Duplex.prototype, 'writableBuffer', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState && this._writableState.getBuffer();
}
+});
+Object.defineProperty(Duplex.prototype, 'writableLength', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState.length;
+ }
+});
- BN.BN = BN;
- BN.wordSize = 26;
+// the no-half-open enforcer
+function onend() {
+ // If the writable side ended, then we're ok.
+ if (this._writableState.ended) return;
- var Buffer;
- try {
- if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {
- Buffer = window.Buffer;
- } else {
- Buffer = require('buffer').Buffer;
+ // no more data can be written.
+ // But allow more writes to happen in this tick.
+ process.nextTick(onEndNT, this);
+}
+function onEndNT(self) {
+ self.end();
+}
+Object.defineProperty(Duplex.prototype, 'destroyed', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ if (this._readableState === undefined || this._writableState === undefined) {
+ return false;
}
- } catch (e) {
- }
-
- BN.isBN = function isBN (num) {
- if (num instanceof BN) {
- return true;
+ return this._readableState.destroyed && this._writableState.destroyed;
+ },
+ set: function set(value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (this._readableState === undefined || this._writableState === undefined) {
+ return;
}
- return num !== null && typeof num === 'object' &&
- num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
- };
-
- BN.max = function max (left, right) {
- if (left.cmp(right) > 0) return left;
- return right;
- };
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._readableState.destroyed = value;
+ this._writableState.destroyed = value;
+ }
+});
+}).call(this)}).call(this,require('_process'))
+},{"./_stream_readable":36,"./_stream_writable":38,"_process":168,"inherits":156}],35:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
- BN.min = function min (left, right) {
- if (left.cmp(right) < 0) return left;
- return right;
- };
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
- BN.prototype._init = function init (number, base, endian) {
- if (typeof number === 'number') {
- return this._initNumber(number, base, endian);
- }
+'use strict';
- if (typeof number === 'object') {
- return this._initArray(number, base, endian);
- }
+module.exports = PassThrough;
+var Transform = require('./_stream_transform');
+require('inherits')(PassThrough, Transform);
+function PassThrough(options) {
+ if (!(this instanceof PassThrough)) return new PassThrough(options);
+ Transform.call(this, options);
+}
+PassThrough.prototype._transform = function (chunk, encoding, cb) {
+ cb(null, chunk);
+};
+},{"./_stream_transform":37,"inherits":156}],36:[function(require,module,exports){
+(function (process,global){(function (){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
- if (base === 'hex') {
- base = 16;
- }
- assert(base === (base | 0) && base >= 2 && base <= 36);
+'use strict';
- number = number.toString().replace(/\s+/g, '');
- var start = 0;
- if (number[0] === '-') {
- start++;
- this.negative = 1;
- }
+module.exports = Readable;
- if (start < number.length) {
- if (base === 16) {
- this._parseHex(number, start, endian);
- } else {
- this._parseBase(number, base, start);
- if (endian === 'le') {
- this._initArray(this.toArray(), base, endian);
- }
- }
- }
- };
+/**/
+var Duplex;
+/**/
- BN.prototype._initNumber = function _initNumber (number, base, endian) {
- if (number < 0) {
- this.negative = 1;
- number = -number;
- }
- if (number < 0x4000000) {
- this.words = [number & 0x3ffffff];
- this.length = 1;
- } else if (number < 0x10000000000000) {
- this.words = [
- number & 0x3ffffff,
- (number / 0x4000000) & 0x3ffffff
- ];
- this.length = 2;
- } else {
- assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)
- this.words = [
- number & 0x3ffffff,
- (number / 0x4000000) & 0x3ffffff,
- 1
- ];
- this.length = 3;
- }
+Readable.ReadableState = ReadableState;
- if (endian !== 'le') return;
+/**/
+var EE = require('events').EventEmitter;
+var EElistenerCount = function EElistenerCount(emitter, type) {
+ return emitter.listeners(type).length;
+};
+/**/
- // Reverse the bytes
- this._initArray(this.toArray(), base, endian);
- };
+/**/
+var Stream = require('./internal/streams/stream');
+/**/
- BN.prototype._initArray = function _initArray (number, base, endian) {
- // Perhaps a Uint8Array
- assert(typeof number.length === 'number');
- if (number.length <= 0) {
- this.words = [0];
- this.length = 1;
- return this;
- }
-
- this.length = Math.ceil(number.length / 3);
- this.words = new Array(this.length);
- for (var i = 0; i < this.length; i++) {
- this.words[i] = 0;
- }
+var Buffer = require('buffer').Buffer;
+var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
+function _uint8ArrayToBuffer(chunk) {
+ return Buffer.from(chunk);
+}
+function _isUint8Array(obj) {
+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
- var j, w;
- var off = 0;
- if (endian === 'be') {
- for (i = number.length - 1, j = 0; i >= 0; i -= 3) {
- w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);
- this.words[j] |= (w << off) & 0x3ffffff;
- this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- } else if (endian === 'le') {
- for (i = 0, j = 0; i < number.length; i += 3) {
- w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);
- this.words[j] |= (w << off) & 0x3ffffff;
- this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- }
- return this._strip();
- };
+/**/
+var debugUtil = require('util');
+var debug;
+if (debugUtil && debugUtil.debuglog) {
+ debug = debugUtil.debuglog('stream');
+} else {
+ debug = function debug() {};
+}
+/**/
- function parseHex4Bits (string, index) {
- var c = string.charCodeAt(index);
- // '0' - '9'
- if (c >= 48 && c <= 57) {
- return c - 48;
- // 'A' - 'F'
- } else if (c >= 65 && c <= 70) {
- return c - 55;
- // 'a' - 'f'
- } else if (c >= 97 && c <= 102) {
- return c - 87;
- } else {
- assert(false, 'Invalid character in ' + string);
- }
- }
+var BufferList = require('./internal/streams/buffer_list');
+var destroyImpl = require('./internal/streams/destroy');
+var _require = require('./internal/streams/state'),
+ getHighWaterMark = _require.getHighWaterMark;
+var _require$codes = require('../errors').codes,
+ ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
+ ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,
+ ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+ ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT;
+
+// Lazy loaded to improve the startup performance.
+var StringDecoder;
+var createReadableStreamAsyncIterator;
+var from;
+require('inherits')(Readable, Stream);
+var errorOrDestroy = destroyImpl.errorOrDestroy;
+var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
+function prependListener(emitter, event, fn) {
+ // Sadly this is not cacheable as some libraries bundle their own
+ // event emitter implementation with them.
+ if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
- function parseHexByte (string, lowerBound, index) {
- var r = parseHex4Bits(string, index);
- if (index - 1 >= lowerBound) {
- r |= parseHex4Bits(string, index - 1) << 4;
- }
- return r;
- }
+ // This is a hack to make sure that our error handler is attached before any
+ // userland ones. NEVER DO THIS. This is here only because this code needs
+ // to continue to work with older versions of Node.js that do not include
+ // the prependListener() method. The goal is to eventually remove this hack.
+ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+}
+function ReadableState(options, stream, isDuplex) {
+ Duplex = Duplex || require('./_stream_duplex');
+ options = options || {};
- BN.prototype._parseHex = function _parseHex (number, start, endian) {
- // Create possibly bigger array to ensure that it fits the number
- this.length = Math.ceil((number.length - start) / 6);
- this.words = new Array(this.length);
- for (var i = 0; i < this.length; i++) {
- this.words[i] = 0;
- }
+ // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream.
+ // These options can be provided separately as readableXXX and writableXXX.
+ if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;
- // 24-bits chunks
- var off = 0;
- var j = 0;
+ // object stream flag. Used to make read(n) ignore n and to
+ // make all the buffer merging and length checks go away
+ this.objectMode = !!options.objectMode;
+ if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
- var w;
- if (endian === 'be') {
- for (i = number.length - 1; i >= start; i -= 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 0x3ffffff;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- } else {
- var parseLength = number.length - start;
- for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {
- w = parseHexByte(number, start, i) << off;
- this.words[j] |= w & 0x3ffffff;
- if (off >= 18) {
- off -= 18;
- j += 1;
- this.words[j] |= w >>> 26;
- } else {
- off += 8;
- }
- }
- }
+ // the point at which it stops calling _read() to fill the buffer
+ // Note: 0 is a valid value, means "don't call _read preemptively ever"
+ this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex);
- this._strip();
- };
+ // A linked list is used to store data chunks instead of an array because the
+ // linked list can remove elements from the beginning faster than
+ // array.shift()
+ this.buffer = new BufferList();
+ this.length = 0;
+ this.pipes = null;
+ this.pipesCount = 0;
+ this.flowing = null;
+ this.ended = false;
+ this.endEmitted = false;
+ this.reading = false;
- function parseBase (str, start, end, mul) {
- var r = 0;
- var b = 0;
- var len = Math.min(str.length, end);
- for (var i = start; i < len; i++) {
- var c = str.charCodeAt(i) - 48;
+ // a flag to be able to tell if the event 'readable'/'data' is emitted
+ // immediately, or on a later tick. We set this to true at first, because
+ // any actions that shouldn't happen until "later" should generally also
+ // not happen before the first read call.
+ this.sync = true;
- r *= mul;
+ // whenever we return null, then we set a flag to say
+ // that we're awaiting a 'readable' event emission.
+ this.needReadable = false;
+ this.emittedReadable = false;
+ this.readableListening = false;
+ this.resumeScheduled = false;
+ this.paused = true;
- // 'a'
- if (c >= 49) {
- b = c - 49 + 0xa;
+ // Should close be emitted on destroy. Defaults to true.
+ this.emitClose = options.emitClose !== false;
- // 'A'
- } else if (c >= 17) {
- b = c - 17 + 0xa;
+ // Should .destroy() be called after 'end' (and potentially 'finish')
+ this.autoDestroy = !!options.autoDestroy;
- // '0' - '9'
- } else {
- b = c;
- }
- assert(c >= 0 && b < mul, 'Invalid character');
- r += b;
- }
- return r;
- }
+ // has it been destroyed
+ this.destroyed = false;
- BN.prototype._parseBase = function _parseBase (number, base, start) {
- // Initialize as zero
- this.words = [0];
- this.length = 1;
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
- // Find length of limb in base
- for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {
- limbLen++;
- }
- limbLen--;
- limbPow = (limbPow / base) | 0;
+ // the number of writers that are awaiting a drain event in .pipe()s
+ this.awaitDrain = 0;
- var total = number.length - start;
- var mod = total % limbLen;
- var end = Math.min(total, total - mod) + start;
+ // if true, a maybeReadMore has been scheduled
+ this.readingMore = false;
+ this.decoder = null;
+ this.encoding = null;
+ if (options.encoding) {
+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+ this.decoder = new StringDecoder(options.encoding);
+ this.encoding = options.encoding;
+ }
+}
+function Readable(options) {
+ Duplex = Duplex || require('./_stream_duplex');
+ if (!(this instanceof Readable)) return new Readable(options);
- var word = 0;
- for (var i = start; i < end; i += limbLen) {
- word = parseBase(number, i, i + limbLen, base);
+ // Checking for a Stream.Duplex instance is faster here instead of inside
+ // the ReadableState constructor, at least with V8 6.5
+ var isDuplex = this instanceof Duplex;
+ this._readableState = new ReadableState(options, this, isDuplex);
- this.imuln(limbPow);
- if (this.words[0] + word < 0x4000000) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
+ // legacy
+ this.readable = true;
+ if (options) {
+ if (typeof options.read === 'function') this._read = options.read;
+ if (typeof options.destroy === 'function') this._destroy = options.destroy;
+ }
+ Stream.call(this);
+}
+Object.defineProperty(Readable.prototype, 'destroyed', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ if (this._readableState === undefined) {
+ return false;
+ }
+ return this._readableState.destroyed;
+ },
+ set: function set(value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (!this._readableState) {
+ return;
}
- if (mod !== 0) {
- var pow = 1;
- word = parseBase(number, i, number.length, base);
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._readableState.destroyed = value;
+ }
+});
+Readable.prototype.destroy = destroyImpl.destroy;
+Readable.prototype._undestroy = destroyImpl.undestroy;
+Readable.prototype._destroy = function (err, cb) {
+ cb(err);
+};
- for (i = 0; i < mod; i++) {
- pow *= base;
+// Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+Readable.prototype.push = function (chunk, encoding) {
+ var state = this._readableState;
+ var skipChunkCheck;
+ if (!state.objectMode) {
+ if (typeof chunk === 'string') {
+ encoding = encoding || state.defaultEncoding;
+ if (encoding !== state.encoding) {
+ chunk = Buffer.from(chunk, encoding);
+ encoding = '';
}
+ skipChunkCheck = true;
+ }
+ } else {
+ skipChunkCheck = true;
+ }
+ return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
+};
- this.imuln(pow);
- if (this.words[0] + word < 0x4000000) {
- this.words[0] += word;
+// Unshift should *always* be something directly out of read()
+Readable.prototype.unshift = function (chunk) {
+ return readableAddChunk(this, chunk, null, true, false);
+};
+function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
+ debug('readableAddChunk', chunk);
+ var state = stream._readableState;
+ if (chunk === null) {
+ state.reading = false;
+ onEofChunk(stream, state);
+ } else {
+ var er;
+ if (!skipChunkCheck) er = chunkInvalid(state, chunk);
+ if (er) {
+ errorOrDestroy(stream, er);
+ } else if (state.objectMode || chunk && chunk.length > 0) {
+ if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
+ chunk = _uint8ArrayToBuffer(chunk);
+ }
+ if (addToFront) {
+ if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);
+ } else if (state.ended) {
+ errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());
+ } else if (state.destroyed) {
+ return false;
} else {
- this._iaddn(word);
+ state.reading = false;
+ if (state.decoder && !encoding) {
+ chunk = state.decoder.write(chunk);
+ if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
+ } else {
+ addChunk(stream, state, chunk, false);
+ }
}
+ } else if (!addToFront) {
+ state.reading = false;
+ maybeReadMore(stream, state);
}
-
- this._strip();
- };
-
- BN.prototype.copy = function copy (dest) {
- dest.words = new Array(this.length);
- for (var i = 0; i < this.length; i++) {
- dest.words[i] = this.words[i];
- }
- dest.length = this.length;
- dest.negative = this.negative;
- dest.red = this.red;
- };
-
- function move (dest, src) {
- dest.words = src.words;
- dest.length = src.length;
- dest.negative = src.negative;
- dest.red = src.red;
}
- BN.prototype._move = function _move (dest) {
- move(dest, this);
- };
-
- BN.prototype.clone = function clone () {
- var r = new BN(null);
- this.copy(r);
- return r;
- };
-
- BN.prototype._expand = function _expand (size) {
- while (this.length < size) {
- this.words[this.length++] = 0;
- }
- return this;
- };
+ // We can push more data if we are below the highWaterMark.
+ // Also, if we have no data yet, we can stand some more bytes.
+ // This is to work around cases where hwm=0, such as the repl.
+ return !state.ended && (state.length < state.highWaterMark || state.length === 0);
+}
+function addChunk(stream, state, chunk, addToFront) {
+ if (state.flowing && state.length === 0 && !state.sync) {
+ state.awaitDrain = 0;
+ stream.emit('data', chunk);
+ } else {
+ // update the buffer info.
+ state.length += state.objectMode ? 1 : chunk.length;
+ if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+ if (state.needReadable) emitReadable(stream);
+ }
+ maybeReadMore(stream, state);
+}
+function chunkInvalid(state, chunk) {
+ var er;
+ if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+ er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);
+ }
+ return er;
+}
+Readable.prototype.isPaused = function () {
+ return this._readableState.flowing === false;
+};
- // Remove leading `0` from `this`
- BN.prototype._strip = function strip () {
- while (this.length > 1 && this.words[this.length - 1] === 0) {
- this.length--;
- }
- return this._normSign();
- };
+// backwards compatibility.
+Readable.prototype.setEncoding = function (enc) {
+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+ var decoder = new StringDecoder(enc);
+ this._readableState.decoder = decoder;
+ // If setEncoding(null), decoder.encoding equals utf8
+ this._readableState.encoding = this._readableState.decoder.encoding;
- BN.prototype._normSign = function _normSign () {
- // -0 = 0
- if (this.length === 1 && this.words[0] === 0) {
- this.negative = 0;
- }
- return this;
- };
+ // Iterate over current buffer to convert already stored Buffers:
+ var p = this._readableState.buffer.head;
+ var content = '';
+ while (p !== null) {
+ content += decoder.write(p.data);
+ p = p.next;
+ }
+ this._readableState.buffer.clear();
+ if (content !== '') this._readableState.buffer.push(content);
+ this._readableState.length = content.length;
+ return this;
+};
- // Check Symbol.for because not everywhere where Symbol defined
- // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility
- if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {
- try {
- BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;
- } catch (e) {
- BN.prototype.inspect = inspect;
- }
+// Don't raise the hwm > 1GB
+var MAX_HWM = 0x40000000;
+function computeNewHighWaterMark(n) {
+ if (n >= MAX_HWM) {
+ // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.
+ n = MAX_HWM;
} else {
- BN.prototype.inspect = inspect;
+ // Get the next highest power of 2 to prevent increasing hwm excessively in
+ // tiny amounts
+ n--;
+ n |= n >>> 1;
+ n |= n >>> 2;
+ n |= n >>> 4;
+ n |= n >>> 8;
+ n |= n >>> 16;
+ n++;
}
+ return n;
+}
- function inspect () {
- return (this.red ? '';
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function howMuchToRead(n, state) {
+ if (n <= 0 || state.length === 0 && state.ended) return 0;
+ if (state.objectMode) return 1;
+ if (n !== n) {
+ // Only flow one buffer at a time
+ if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
}
+ // If we're asking for more than the current hwm, then raise the hwm.
+ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+ if (n <= state.length) return n;
+ // Don't have enough
+ if (!state.ended) {
+ state.needReadable = true;
+ return 0;
+ }
+ return state.length;
+}
- /*
-
- var zeros = [];
- var groupSizes = [];
- var groupBases = [];
+// you can override either this method, or the async _read(n) below.
+Readable.prototype.read = function (n) {
+ debug('read', n);
+ n = parseInt(n, 10);
+ var state = this._readableState;
+ var nOrig = n;
+ if (n !== 0) state.emittedReadable = false;
- var s = '';
- var i = -1;
- while (++i < BN.wordSize) {
- zeros[i] = s;
- s += '0';
+ // if we're doing read(0) to trigger a readable event, but we
+ // already have a bunch of data in the buffer, then just trigger
+ // the 'readable' event and move on.
+ if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {
+ debug('read: emitReadable', state.length, state.ended);
+ if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+ return null;
}
- groupSizes[0] = 0;
- groupSizes[1] = 0;
- groupBases[0] = 0;
- groupBases[1] = 0;
- var base = 2 - 1;
- while (++base < 36 + 1) {
- var groupSize = 0;
- var groupBase = 1;
- while (groupBase < (1 << BN.wordSize) / base) {
- groupBase *= base;
- groupSize += 1;
- }
- groupSizes[base] = groupSize;
- groupBases[base] = groupBase;
+ n = howMuchToRead(n, state);
+
+ // if we've ended, and we're now clear, then finish it up.
+ if (n === 0 && state.ended) {
+ if (state.length === 0) endReadable(this);
+ return null;
}
- */
+ // All the actual chunk generation logic needs to be
+ // *below* the call to _read. The reason is that in certain
+ // synthetic stream cases, such as passthrough streams, _read
+ // may be a completely synchronous operation which may change
+ // the state of the read buffer, providing enough data when
+ // before there was *not* enough.
+ //
+ // So, the steps are:
+ // 1. Figure out what the state of things will be after we do
+ // a read from the buffer.
+ //
+ // 2. If that resulting state will trigger a _read, then call _read.
+ // Note that this may be asynchronous, or synchronous. Yes, it is
+ // deeply ugly to write APIs this way, but that still doesn't mean
+ // that the Readable class should behave improperly, as streams are
+ // designed to be sync/async agnostic.
+ // Take note if the _read call is sync or async (ie, if the read call
+ // has returned yet), so that we know whether or not it's safe to emit
+ // 'readable' etc.
+ //
+ // 3. Actually pull the requested chunks out of the buffer and return.
- var zeros = [
- '',
- '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'
- ];
-
- var groupSizes = [
- 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
- ];
-
- var groupBases = [
- 0, 0,
- 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,
- 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,
- 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,
- 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,
- 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176
- ];
-
- BN.prototype.toString = function toString (base, padding) {
- base = base || 10;
- padding = padding | 0 || 1;
+ // if we need a readable event, then we need to do some reading.
+ var doRead = state.needReadable;
+ debug('need readable', doRead);
- var out;
- if (base === 16 || base === 'hex') {
- out = '';
- var off = 0;
- var carry = 0;
- for (var i = 0; i < this.length; i++) {
- var w = this.words[i];
- var word = (((w << off) | carry) & 0xffffff).toString(16);
- carry = (w >>> (24 - off)) & 0xffffff;
- off += 2;
- if (off >= 26) {
- off -= 26;
- i--;
- }
- if (carry !== 0 || i !== this.length - 1) {
- out = zeros[6 - word.length] + word + out;
- } else {
- out = word + out;
- }
- }
- if (carry !== 0) {
- out = carry.toString(16) + out;
- }
- while (out.length % padding !== 0) {
- out = '0' + out;
- }
- if (this.negative !== 0) {
- out = '-' + out;
- }
- return out;
- }
+ // if we currently have less than the highWaterMark, then also read some
+ if (state.length === 0 || state.length - n < state.highWaterMark) {
+ doRead = true;
+ debug('length less than watermark', doRead);
+ }
- if (base === (base | 0) && base >= 2 && base <= 36) {
- // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));
- var groupSize = groupSizes[base];
- // var groupBase = Math.pow(base, groupSize);
- var groupBase = groupBases[base];
- out = '';
- var c = this.clone();
- c.negative = 0;
- while (!c.isZero()) {
- var r = c.modrn(groupBase).toString(base);
- c = c.idivn(groupBase);
+ // however, if we've ended, then there's no point, and if we're already
+ // reading, then it's unnecessary.
+ if (state.ended || state.reading) {
+ doRead = false;
+ debug('reading or ended', doRead);
+ } else if (doRead) {
+ debug('do read');
+ state.reading = true;
+ state.sync = true;
+ // if the length is currently zero, then we *need* a readable event.
+ if (state.length === 0) state.needReadable = true;
+ // call internal read method
+ this._read(state.highWaterMark);
+ state.sync = false;
+ // If _read pushed data synchronously, then `reading` will be false,
+ // and we need to re-evaluate how much data we can return to the user.
+ if (!state.reading) n = howMuchToRead(nOrig, state);
+ }
+ var ret;
+ if (n > 0) ret = fromList(n, state);else ret = null;
+ if (ret === null) {
+ state.needReadable = state.length <= state.highWaterMark;
+ n = 0;
+ } else {
+ state.length -= n;
+ state.awaitDrain = 0;
+ }
+ if (state.length === 0) {
+ // If we have nothing in the buffer, then we want to know
+ // as soon as we *do* get something into the buffer.
+ if (!state.ended) state.needReadable = true;
- if (!c.isZero()) {
- out = zeros[groupSize - r.length] + r + out;
- } else {
- out = r + out;
- }
- }
- if (this.isZero()) {
- out = '0' + out;
- }
- while (out.length % padding !== 0) {
- out = '0' + out;
- }
- if (this.negative !== 0) {
- out = '-' + out;
- }
- return out;
+ // If we tried to read() past the EOF, then emit end on the next tick.
+ if (nOrig !== n && state.ended) endReadable(this);
+ }
+ if (ret !== null) this.emit('data', ret);
+ return ret;
+};
+function onEofChunk(stream, state) {
+ debug('onEofChunk');
+ if (state.ended) return;
+ if (state.decoder) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) {
+ state.buffer.push(chunk);
+ state.length += state.objectMode ? 1 : chunk.length;
}
-
- assert(false, 'Base should be between 2 and 36');
- };
-
- BN.prototype.toNumber = function toNumber () {
- var ret = this.words[0];
- if (this.length === 2) {
- ret += this.words[1] * 0x4000000;
- } else if (this.length === 3 && this.words[2] === 0x01) {
- // NOTE: at this stage it is known that the top bit is set
- ret += 0x10000000000000 + (this.words[1] * 0x4000000);
- } else if (this.length > 2) {
- assert(false, 'Number can only safely store up to 53 bits');
+ }
+ state.ended = true;
+ if (state.sync) {
+ // if we are sync, wait until next tick to emit the data.
+ // Otherwise we risk emitting data in the flow()
+ // the readable code triggers during a read() call
+ emitReadable(stream);
+ } else {
+ // emit 'readable' now to make sure it gets picked up.
+ state.needReadable = false;
+ if (!state.emittedReadable) {
+ state.emittedReadable = true;
+ emitReadable_(stream);
}
- return (this.negative !== 0) ? -ret : ret;
- };
-
- BN.prototype.toJSON = function toJSON () {
- return this.toString(16, 2);
- };
+ }
+}
- if (Buffer) {
- BN.prototype.toBuffer = function toBuffer (endian, length) {
- return this.toArrayLike(Buffer, endian, length);
- };
+// Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow. This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+function emitReadable(stream) {
+ var state = stream._readableState;
+ debug('emitReadable', state.needReadable, state.emittedReadable);
+ state.needReadable = false;
+ if (!state.emittedReadable) {
+ debug('emitReadable', state.flowing);
+ state.emittedReadable = true;
+ process.nextTick(emitReadable_, stream);
+ }
+}
+function emitReadable_(stream) {
+ var state = stream._readableState;
+ debug('emitReadable_', state.destroyed, state.length, state.ended);
+ if (!state.destroyed && (state.length || state.ended)) {
+ stream.emit('readable');
+ state.emittedReadable = false;
}
- BN.prototype.toArray = function toArray (endian, length) {
- return this.toArrayLike(Array, endian, length);
- };
+ // The stream needs another readable event if
+ // 1. It is not flowing, as the flow mechanism will take
+ // care of it.
+ // 2. It is not ended.
+ // 3. It is below the highWaterMark, so we can schedule
+ // another readable later.
+ state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;
+ flow(stream);
+}
- var allocate = function allocate (ArrayType, size) {
- if (ArrayType.allocUnsafe) {
- return ArrayType.allocUnsafe(size);
- }
- return new ArrayType(size);
- };
+// at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data. that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+function maybeReadMore(stream, state) {
+ if (!state.readingMore) {
+ state.readingMore = true;
+ process.nextTick(maybeReadMore_, stream, state);
+ }
+}
+function maybeReadMore_(stream, state) {
+ // Attempt to read more data if we should.
+ //
+ // The conditions for reading more data are (one of):
+ // - Not enough data buffered (state.length < state.highWaterMark). The loop
+ // is responsible for filling the buffer with enough data if such data
+ // is available. If highWaterMark is 0 and we are not in the flowing mode
+ // we should _not_ attempt to buffer any extra data. We'll get more data
+ // when the stream consumer calls read() instead.
+ // - No data in the buffer, and the stream is in flowing mode. In this mode
+ // the loop below is responsible for ensuring read() is called. Failing to
+ // call read here would abort the flow and there's no other mechanism for
+ // continuing the flow if the stream consumer has just subscribed to the
+ // 'data' event.
+ //
+ // In addition to the above conditions to keep reading data, the following
+ // conditions prevent the data from being read:
+ // - The stream has ended (state.ended).
+ // - There is already a pending 'read' operation (state.reading). This is a
+ // case where the the stream has called the implementation defined _read()
+ // method, but they are processing the call asynchronously and have _not_
+ // called push() with new data. In this case we skip performing more
+ // read()s. The execution ends in this method again after the _read() ends
+ // up calling push() with more data.
+ while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {
+ var len = state.length;
+ debug('maybeReadMore read 0');
+ stream.read(0);
+ if (len === state.length)
+ // didn't get any data, stop spinning.
+ break;
+ }
+ state.readingMore = false;
+}
- BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {
- this._strip();
-
- var byteLength = this.byteLength();
- var reqLength = length || Math.max(1, byteLength);
- assert(byteLength <= reqLength, 'byte array longer than desired length');
- assert(reqLength > 0, 'Requested array length <= 0');
-
- var res = allocate(ArrayType, reqLength);
- var postfix = endian === 'le' ? 'LE' : 'BE';
- this['_toArrayLike' + postfix](res, byteLength);
- return res;
- };
-
- BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {
- var position = 0;
- var carry = 0;
-
- for (var i = 0, shift = 0; i < this.length; i++) {
- var word = (this.words[i] << shift) | carry;
-
- res[position++] = word & 0xff;
- if (position < res.length) {
- res[position++] = (word >> 8) & 0xff;
- }
- if (position < res.length) {
- res[position++] = (word >> 16) & 0xff;
- }
-
- if (shift === 6) {
- if (position < res.length) {
- res[position++] = (word >> 24) & 0xff;
- }
- carry = 0;
- shift = 0;
- } else {
- carry = word >>> 24;
- shift += 2;
+// abstract method. to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+Readable.prototype._read = function (n) {
+ errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));
+};
+Readable.prototype.pipe = function (dest, pipeOpts) {
+ var src = this;
+ var state = this._readableState;
+ switch (state.pipesCount) {
+ case 0:
+ state.pipes = dest;
+ break;
+ case 1:
+ state.pipes = [state.pipes, dest];
+ break;
+ default:
+ state.pipes.push(dest);
+ break;
+ }
+ state.pipesCount += 1;
+ debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+ var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+ var endFn = doEnd ? onend : unpipe;
+ if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);
+ dest.on('unpipe', onunpipe);
+ function onunpipe(readable, unpipeInfo) {
+ debug('onunpipe');
+ if (readable === src) {
+ if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
+ unpipeInfo.hasUnpiped = true;
+ cleanup();
}
}
+ }
+ function onend() {
+ debug('onend');
+ dest.end();
+ }
- if (position < res.length) {
- res[position++] = carry;
+ // when the dest drains, it reduces the awaitDrain counter
+ // on the source. This would be more elegant with a .once()
+ // handler in flow(), but adding and removing repeatedly is
+ // too slow.
+ var ondrain = pipeOnDrain(src);
+ dest.on('drain', ondrain);
+ var cleanedUp = false;
+ function cleanup() {
+ debug('cleanup');
+ // cleanup event handlers once the pipe is broken
+ dest.removeListener('close', onclose);
+ dest.removeListener('finish', onfinish);
+ dest.removeListener('drain', ondrain);
+ dest.removeListener('error', onerror);
+ dest.removeListener('unpipe', onunpipe);
+ src.removeListener('end', onend);
+ src.removeListener('end', unpipe);
+ src.removeListener('data', ondata);
+ cleanedUp = true;
- while (position < res.length) {
- res[position++] = 0;
+ // if the reader is waiting for a drain event from this
+ // specific writer, then it would cause it to never start
+ // flowing again.
+ // So, if this is awaiting a drain, then we just call it now.
+ // If we don't know, then assume that we are waiting for one.
+ if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+ }
+ src.on('data', ondata);
+ function ondata(chunk) {
+ debug('ondata');
+ var ret = dest.write(chunk);
+ debug('dest.write', ret);
+ if (ret === false) {
+ // If the user unpiped during `dest.write()`, it is possible
+ // to get stuck in a permanently paused state if that write
+ // also returned false.
+ // => Check whether `dest` is still a piping destination.
+ if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+ debug('false write response, pause', state.awaitDrain);
+ state.awaitDrain++;
}
+ src.pause();
}
- };
-
- BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {
- var position = res.length - 1;
- var carry = 0;
+ }
- for (var i = 0, shift = 0; i < this.length; i++) {
- var word = (this.words[i] << shift) | carry;
+ // if the dest has an error, then stop piping into it.
+ // however, don't suppress the throwing behavior for this.
+ function onerror(er) {
+ debug('onerror', er);
+ unpipe();
+ dest.removeListener('error', onerror);
+ if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);
+ }
- res[position--] = word & 0xff;
- if (position >= 0) {
- res[position--] = (word >> 8) & 0xff;
- }
- if (position >= 0) {
- res[position--] = (word >> 16) & 0xff;
- }
+ // Make sure our error handler is attached before userland ones.
+ prependListener(dest, 'error', onerror);
- if (shift === 6) {
- if (position >= 0) {
- res[position--] = (word >> 24) & 0xff;
- }
- carry = 0;
- shift = 0;
- } else {
- carry = word >>> 24;
- shift += 2;
- }
- }
+ // Both close and finish should trigger unpipe, but only once.
+ function onclose() {
+ dest.removeListener('finish', onfinish);
+ unpipe();
+ }
+ dest.once('close', onclose);
+ function onfinish() {
+ debug('onfinish');
+ dest.removeListener('close', onclose);
+ unpipe();
+ }
+ dest.once('finish', onfinish);
+ function unpipe() {
+ debug('unpipe');
+ src.unpipe(dest);
+ }
- if (position >= 0) {
- res[position--] = carry;
+ // tell the dest that it's being piped to
+ dest.emit('pipe', src);
- while (position >= 0) {
- res[position--] = 0;
- }
+ // start the flow if it hasn't been started already.
+ if (!state.flowing) {
+ debug('pipe resume');
+ src.resume();
+ }
+ return dest;
+};
+function pipeOnDrain(src) {
+ return function pipeOnDrainFunctionResult() {
+ var state = src._readableState;
+ debug('pipeOnDrain', state.awaitDrain);
+ if (state.awaitDrain) state.awaitDrain--;
+ if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+ state.flowing = true;
+ flow(src);
}
};
+}
+Readable.prototype.unpipe = function (dest) {
+ var state = this._readableState;
+ var unpipeInfo = {
+ hasUnpiped: false
+ };
- if (Math.clz32) {
- BN.prototype._countBits = function _countBits (w) {
- return 32 - Math.clz32(w);
- };
- } else {
- BN.prototype._countBits = function _countBits (w) {
- var t = w;
- var r = 0;
- if (t >= 0x1000) {
- r += 13;
- t >>>= 13;
- }
- if (t >= 0x40) {
- r += 7;
- t >>>= 7;
- }
- if (t >= 0x8) {
- r += 4;
- t >>>= 4;
- }
- if (t >= 0x02) {
- r += 2;
- t >>>= 2;
- }
- return r + t;
- };
+ // if we're not piping anywhere, then do nothing.
+ if (state.pipesCount === 0) return this;
+
+ // just one destination. most common case.
+ if (state.pipesCount === 1) {
+ // passed in one, but it's not the right one.
+ if (dest && dest !== state.pipes) return this;
+ if (!dest) dest = state.pipes;
+
+ // got a match.
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+ if (dest) dest.emit('unpipe', this, unpipeInfo);
+ return this;
}
- BN.prototype._zeroBits = function _zeroBits (w) {
- // Short-cut
- if (w === 0) return 26;
+ // slow case. multiple pipe destinations.
- var t = w;
- var r = 0;
- if ((t & 0x1fff) === 0) {
- r += 13;
- t >>>= 13;
- }
- if ((t & 0x7f) === 0) {
- r += 7;
- t >>>= 7;
- }
- if ((t & 0xf) === 0) {
- r += 4;
- t >>>= 4;
- }
- if ((t & 0x3) === 0) {
- r += 2;
- t >>>= 2;
- }
- if ((t & 0x1) === 0) {
- r++;
- }
- return r;
- };
-
- // Return number of used bits in a BN
- BN.prototype.bitLength = function bitLength () {
- var w = this.words[this.length - 1];
- var hi = this._countBits(w);
- return (this.length - 1) * 26 + hi;
- };
+ if (!dest) {
+ // remove all.
+ var dests = state.pipes;
+ var len = state.pipesCount;
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+ for (var i = 0; i < len; i++) dests[i].emit('unpipe', this, {
+ hasUnpiped: false
+ });
+ return this;
+ }
- function toBitArray (num) {
- var w = new Array(num.bitLength());
+ // try to find the right one.
+ var index = indexOf(state.pipes, dest);
+ if (index === -1) return this;
+ state.pipes.splice(index, 1);
+ state.pipesCount -= 1;
+ if (state.pipesCount === 1) state.pipes = state.pipes[0];
+ dest.emit('unpipe', this, unpipeInfo);
+ return this;
+};
- for (var bit = 0; bit < w.length; bit++) {
- var off = (bit / 26) | 0;
- var wbit = bit % 26;
+// set up data events if they are asked for
+// Ensure readable listeners eventually get something
+Readable.prototype.on = function (ev, fn) {
+ var res = Stream.prototype.on.call(this, ev, fn);
+ var state = this._readableState;
+ if (ev === 'data') {
+ // update readableListening so that resume() may be a no-op
+ // a few lines down. This is needed to support once('readable').
+ state.readableListening = this.listenerCount('readable') > 0;
- w[bit] = (num.words[off] >>> wbit) & 0x01;
+ // Try start flowing on next tick if stream isn't explicitly paused
+ if (state.flowing !== false) this.resume();
+ } else if (ev === 'readable') {
+ if (!state.endEmitted && !state.readableListening) {
+ state.readableListening = state.needReadable = true;
+ state.flowing = false;
+ state.emittedReadable = false;
+ debug('on readable', state.length, state.reading);
+ if (state.length) {
+ emitReadable(this);
+ } else if (!state.reading) {
+ process.nextTick(nReadingNextTick, this);
+ }
}
+ }
+ return res;
+};
+Readable.prototype.addListener = Readable.prototype.on;
+Readable.prototype.removeListener = function (ev, fn) {
+ var res = Stream.prototype.removeListener.call(this, ev, fn);
+ if (ev === 'readable') {
+ // We need to check if there is someone still listening to
+ // readable and reset the state. However this needs to happen
+ // after readable has been emitted but before I/O (nextTick) to
+ // support once('readable', fn) cycles. This means that calling
+ // resume within the same tick will have no
+ // effect.
+ process.nextTick(updateReadableListening, this);
+ }
+ return res;
+};
+Readable.prototype.removeAllListeners = function (ev) {
+ var res = Stream.prototype.removeAllListeners.apply(this, arguments);
+ if (ev === 'readable' || ev === undefined) {
+ // We need to check if there is someone still listening to
+ // readable and reset the state. However this needs to happen
+ // after readable has been emitted but before I/O (nextTick) to
+ // support once('readable', fn) cycles. This means that calling
+ // resume within the same tick will have no
+ // effect.
+ process.nextTick(updateReadableListening, this);
+ }
+ return res;
+};
+function updateReadableListening(self) {
+ var state = self._readableState;
+ state.readableListening = self.listenerCount('readable') > 0;
+ if (state.resumeScheduled && !state.paused) {
+ // flowing needs to be set to true now, otherwise
+ // the upcoming resume will not flow.
+ state.flowing = true;
- return w;
+ // crude way to check if we should resume
+ } else if (self.listenerCount('data') > 0) {
+ self.resume();
}
+}
+function nReadingNextTick(self) {
+ debug('readable nexttick read 0');
+ self.read(0);
+}
- // Number of trailing zero bits
- BN.prototype.zeroBits = function zeroBits () {
- if (this.isZero()) return 0;
+// pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+Readable.prototype.resume = function () {
+ var state = this._readableState;
+ if (!state.flowing) {
+ debug('resume');
+ // we flow only if there is no one listening
+ // for readable, but we still have to call
+ // resume()
+ state.flowing = !state.readableListening;
+ resume(this, state);
+ }
+ state.paused = false;
+ return this;
+};
+function resume(stream, state) {
+ if (!state.resumeScheduled) {
+ state.resumeScheduled = true;
+ process.nextTick(resume_, stream, state);
+ }
+}
+function resume_(stream, state) {
+ debug('resume', state.reading);
+ if (!state.reading) {
+ stream.read(0);
+ }
+ state.resumeScheduled = false;
+ stream.emit('resume');
+ flow(stream);
+ if (state.flowing && !state.reading) stream.read(0);
+}
+Readable.prototype.pause = function () {
+ debug('call pause flowing=%j', this._readableState.flowing);
+ if (this._readableState.flowing !== false) {
+ debug('pause');
+ this._readableState.flowing = false;
+ this.emit('pause');
+ }
+ this._readableState.paused = true;
+ return this;
+};
+function flow(stream) {
+ var state = stream._readableState;
+ debug('flow', state.flowing);
+ while (state.flowing && stream.read() !== null);
+}
- var r = 0;
- for (var i = 0; i < this.length; i++) {
- var b = this._zeroBits(this.words[i]);
- r += b;
- if (b !== 26) break;
+// wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+Readable.prototype.wrap = function (stream) {
+ var _this = this;
+ var state = this._readableState;
+ var paused = false;
+ stream.on('end', function () {
+ debug('wrapped end');
+ if (state.decoder && !state.ended) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) _this.push(chunk);
}
- return r;
- };
-
- BN.prototype.byteLength = function byteLength () {
- return Math.ceil(this.bitLength() / 8);
- };
+ _this.push(null);
+ });
+ stream.on('data', function (chunk) {
+ debug('wrapped data');
+ if (state.decoder) chunk = state.decoder.write(chunk);
- BN.prototype.toTwos = function toTwos (width) {
- if (this.negative !== 0) {
- return this.abs().inotn(width).iaddn(1);
+ // don't skip over falsy values in objectMode
+ if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+ var ret = _this.push(chunk);
+ if (!ret) {
+ paused = true;
+ stream.pause();
}
- return this.clone();
- };
+ });
- BN.prototype.fromTwos = function fromTwos (width) {
- if (this.testn(width - 1)) {
- return this.notn(width).iaddn(1).ineg();
+ // proxy all the other methods.
+ // important when wrapping filters and duplexes.
+ for (var i in stream) {
+ if (this[i] === undefined && typeof stream[i] === 'function') {
+ this[i] = function methodWrap(method) {
+ return function methodWrapReturnFunction() {
+ return stream[method].apply(stream, arguments);
+ };
+ }(i);
}
- return this.clone();
- };
-
- BN.prototype.isNeg = function isNeg () {
- return this.negative !== 0;
- };
+ }
- // Return negative clone of `this`
- BN.prototype.neg = function neg () {
- return this.clone().ineg();
- };
+ // proxy certain important events.
+ for (var n = 0; n < kProxyEvents.length; n++) {
+ stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
+ }
- BN.prototype.ineg = function ineg () {
- if (!this.isZero()) {
- this.negative ^= 1;
+ // when we try to consume some more bytes, simply unpause the
+ // underlying stream.
+ this._read = function (n) {
+ debug('wrapped _read', n);
+ if (paused) {
+ paused = false;
+ stream.resume();
}
-
- return this;
};
-
- // Or `num` with `this` in-place
- BN.prototype.iuor = function iuor (num) {
- while (this.length < num.length) {
- this.words[this.length++] = 0;
- }
-
- for (var i = 0; i < num.length; i++) {
- this.words[i] = this.words[i] | num.words[i];
+ return this;
+};
+if (typeof Symbol === 'function') {
+ Readable.prototype[Symbol.asyncIterator] = function () {
+ if (createReadableStreamAsyncIterator === undefined) {
+ createReadableStreamAsyncIterator = require('./internal/streams/async_iterator');
}
-
- return this._strip();
+ return createReadableStreamAsyncIterator(this);
};
+}
+Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._readableState.highWaterMark;
+ }
+});
+Object.defineProperty(Readable.prototype, 'readableBuffer', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._readableState && this._readableState.buffer;
+ }
+});
+Object.defineProperty(Readable.prototype, 'readableFlowing', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._readableState.flowing;
+ },
+ set: function set(state) {
+ if (this._readableState) {
+ this._readableState.flowing = state;
+ }
+ }
+});
- BN.prototype.ior = function ior (num) {
- assert((this.negative | num.negative) === 0);
- return this.iuor(num);
- };
+// exposed for testing purposes only.
+Readable._fromList = fromList;
+Object.defineProperty(Readable.prototype, 'readableLength', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._readableState.length;
+ }
+});
- // Or `num` with `this`
- BN.prototype.or = function or (num) {
- if (this.length > num.length) return this.clone().ior(num);
- return num.clone().ior(this);
- };
-
- BN.prototype.uor = function uor (num) {
- if (this.length > num.length) return this.clone().iuor(num);
- return num.clone().iuor(this);
- };
+// Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromList(n, state) {
+ // nothing buffered
+ if (state.length === 0) return null;
+ var ret;
+ if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+ // read it all, truncate the list
+ if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);
+ state.buffer.clear();
+ } else {
+ // read part of list
+ ret = state.buffer.consume(n, state.decoder);
+ }
+ return ret;
+}
+function endReadable(stream) {
+ var state = stream._readableState;
+ debug('endReadable', state.endEmitted);
+ if (!state.endEmitted) {
+ state.ended = true;
+ process.nextTick(endReadableNT, state, stream);
+ }
+}
+function endReadableNT(state, stream) {
+ debug('endReadableNT', state.endEmitted, state.length);
- // And `num` with `this` in-place
- BN.prototype.iuand = function iuand (num) {
- // b = min-length(num, this)
- var b;
- if (this.length > num.length) {
- b = num;
- } else {
- b = this;
+ // Check that we didn't get one last unshift.
+ if (!state.endEmitted && state.length === 0) {
+ state.endEmitted = true;
+ stream.readable = false;
+ stream.emit('end');
+ if (state.autoDestroy) {
+ // In case of duplex streams we need a way to detect
+ // if the writable side is ready for autoDestroy as well
+ var wState = stream._writableState;
+ if (!wState || wState.autoDestroy && wState.finished) {
+ stream.destroy();
+ }
}
-
- for (var i = 0; i < b.length; i++) {
- this.words[i] = this.words[i] & num.words[i];
+ }
+}
+if (typeof Symbol === 'function') {
+ Readable.from = function (iterable, opts) {
+ if (from === undefined) {
+ from = require('./internal/streams/from');
}
-
- this.length = b.length;
-
- return this._strip();
+ return from(Readable, iterable, opts);
};
+}
+function indexOf(xs, x) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ if (xs[i] === x) return i;
+ }
+ return -1;
+}
+}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"../errors":33,"./_stream_duplex":34,"./internal/streams/async_iterator":39,"./internal/streams/buffer_list":40,"./internal/streams/destroy":41,"./internal/streams/from":43,"./internal/streams/state":45,"./internal/streams/stream":46,"_process":168,"buffer":120,"events":128,"inherits":156,"string_decoder/":217,"util":119}],37:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
- BN.prototype.iand = function iand (num) {
- assert((this.negative | num.negative) === 0);
- return this.iuand(num);
- };
+// a transform stream is a readable/writable stream where you do
+// something with the data. Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored. (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation. For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes. When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up. When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer. When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks. If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk. However,
+// a pathological inflate type of transform can cause excessive buffering
+// here. For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output. In this case, you could write a very small
+// amount of input, and end up with a very large amount of output. In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform. A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
- // And `num` with `this`
- BN.prototype.and = function and (num) {
- if (this.length > num.length) return this.clone().iand(num);
- return num.clone().iand(this);
- };
+'use strict';
- BN.prototype.uand = function uand (num) {
- if (this.length > num.length) return this.clone().iuand(num);
- return num.clone().iuand(this);
+module.exports = Transform;
+var _require$codes = require('../errors').codes,
+ ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+ ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
+ ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,
+ ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;
+var Duplex = require('./_stream_duplex');
+require('inherits')(Transform, Duplex);
+function afterTransform(er, data) {
+ var ts = this._transformState;
+ ts.transforming = false;
+ var cb = ts.writecb;
+ if (cb === null) {
+ return this.emit('error', new ERR_MULTIPLE_CALLBACK());
+ }
+ ts.writechunk = null;
+ ts.writecb = null;
+ if (data != null)
+ // single equals check for both `null` and `undefined`
+ this.push(data);
+ cb(er);
+ var rs = this._readableState;
+ rs.reading = false;
+ if (rs.needReadable || rs.length < rs.highWaterMark) {
+ this._read(rs.highWaterMark);
+ }
+}
+function Transform(options) {
+ if (!(this instanceof Transform)) return new Transform(options);
+ Duplex.call(this, options);
+ this._transformState = {
+ afterTransform: afterTransform.bind(this),
+ needTransform: false,
+ transforming: false,
+ writecb: null,
+ writechunk: null,
+ writeencoding: null
};
- // Xor `num` with `this` in-place
- BN.prototype.iuxor = function iuxor (num) {
- // a.length > b.length
- var a;
- var b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
-
- for (var i = 0; i < b.length; i++) {
- this.words[i] = a.words[i] ^ b.words[i];
- }
-
- if (this !== a) {
- for (; i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
-
- this.length = a.length;
-
- return this._strip();
- };
+ // start out asking for a readable event once data is transformed.
+ this._readableState.needReadable = true;
- BN.prototype.ixor = function ixor (num) {
- assert((this.negative | num.negative) === 0);
- return this.iuxor(num);
- };
+ // we have implemented the _read method, and done the other things
+ // that Readable wants before the first _read call, so unset the
+ // sync guard flag.
+ this._readableState.sync = false;
+ if (options) {
+ if (typeof options.transform === 'function') this._transform = options.transform;
+ if (typeof options.flush === 'function') this._flush = options.flush;
+ }
- // Xor `num` with `this`
- BN.prototype.xor = function xor (num) {
- if (this.length > num.length) return this.clone().ixor(num);
- return num.clone().ixor(this);
- };
+ // When the writable side finishes, then flush out anything remaining.
+ this.on('prefinish', prefinish);
+}
+function prefinish() {
+ var _this = this;
+ if (typeof this._flush === 'function' && !this._readableState.destroyed) {
+ this._flush(function (er, data) {
+ done(_this, er, data);
+ });
+ } else {
+ done(this, null, null);
+ }
+}
+Transform.prototype.push = function (chunk, encoding) {
+ this._transformState.needTransform = false;
+ return Duplex.prototype.push.call(this, chunk, encoding);
+};
- BN.prototype.uxor = function uxor (num) {
- if (this.length > num.length) return this.clone().iuxor(num);
- return num.clone().iuxor(this);
- };
+// This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side. You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk. If you pass
+// an error, then that'll put the hurt on the whole operation. If you
+// never call cb(), then you'll never get another chunk.
+Transform.prototype._transform = function (chunk, encoding, cb) {
+ cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));
+};
+Transform.prototype._write = function (chunk, encoding, cb) {
+ var ts = this._transformState;
+ ts.writecb = cb;
+ ts.writechunk = chunk;
+ ts.writeencoding = encoding;
+ if (!ts.transforming) {
+ var rs = this._readableState;
+ if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+ }
+};
- // Not ``this`` with ``width`` bitwidth
- BN.prototype.inotn = function inotn (width) {
- assert(typeof width === 'number' && width >= 0);
+// Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+Transform.prototype._read = function (n) {
+ var ts = this._transformState;
+ if (ts.writechunk !== null && !ts.transforming) {
+ ts.transforming = true;
+ this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+ } else {
+ // mark that we need a transform, so that any data that comes in
+ // will get processed, now that we've asked for it.
+ ts.needTransform = true;
+ }
+};
+Transform.prototype._destroy = function (err, cb) {
+ Duplex.prototype._destroy.call(this, err, function (err2) {
+ cb(err2);
+ });
+};
+function done(stream, er, data) {
+ if (er) return stream.emit('error', er);
+ if (data != null)
+ // single equals check for both `null` and `undefined`
+ stream.push(data);
- var bytesNeeded = Math.ceil(width / 26) | 0;
- var bitsLeft = width % 26;
+ // TODO(BridgeAR): Write a test for these two error cases
+ // if there's nothing in the write buffer, then that means
+ // that nothing more will ever be provided
+ if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();
+ if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();
+ return stream.push(null);
+}
+},{"../errors":33,"./_stream_duplex":34,"inherits":156}],38:[function(require,module,exports){
+(function (process,global){(function (){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
- // Extend the buffer with leading zeroes
- this._expand(bytesNeeded);
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
- if (bitsLeft > 0) {
- bytesNeeded--;
- }
+'use strict';
- // Handle complete words
- for (var i = 0; i < bytesNeeded; i++) {
- this.words[i] = ~this.words[i] & 0x3ffffff;
- }
+module.exports = Writable;
- // Handle the residue
- if (bitsLeft > 0) {
- this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));
- }
+/* */
+function WriteReq(chunk, encoding, cb) {
+ this.chunk = chunk;
+ this.encoding = encoding;
+ this.callback = cb;
+ this.next = null;
+}
- // And remove leading zeroes
- return this._strip();
+// It seems a linked list but it is not
+// there will be only 2 of these for each stream
+function CorkedRequest(state) {
+ var _this = this;
+ this.next = null;
+ this.entry = null;
+ this.finish = function () {
+ onCorkedFinish(_this, state);
};
+}
+/* */
- BN.prototype.notn = function notn (width) {
- return this.clone().inotn(width);
- };
+/**/
+var Duplex;
+/**/
- // Set `bit` of `this`
- BN.prototype.setn = function setn (bit, val) {
- assert(typeof bit === 'number' && bit >= 0);
+Writable.WritableState = WritableState;
- var off = (bit / 26) | 0;
- var wbit = bit % 26;
+/**/
+var internalUtil = {
+ deprecate: require('util-deprecate')
+};
+/**/
- this._expand(off + 1);
+/**/
+var Stream = require('./internal/streams/stream');
+/**/
- if (val) {
- this.words[off] = this.words[off] | (1 << wbit);
- } else {
- this.words[off] = this.words[off] & ~(1 << wbit);
- }
+var Buffer = require('buffer').Buffer;
+var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
+function _uint8ArrayToBuffer(chunk) {
+ return Buffer.from(chunk);
+}
+function _isUint8Array(obj) {
+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+var destroyImpl = require('./internal/streams/destroy');
+var _require = require('./internal/streams/state'),
+ getHighWaterMark = _require.getHighWaterMark;
+var _require$codes = require('../errors').codes,
+ ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,
+ ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,
+ ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,
+ ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,
+ ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,
+ ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,
+ ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,
+ ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;
+var errorOrDestroy = destroyImpl.errorOrDestroy;
+require('inherits')(Writable, Stream);
+function nop() {}
+function WritableState(options, stream, isDuplex) {
+ Duplex = Duplex || require('./_stream_duplex');
+ options = options || {};
- return this._strip();
- };
+ // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream,
+ // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
+ if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex;
- // Add `num` to `this` in-place
- BN.prototype.iadd = function iadd (num) {
- var r;
+ // object stream flag to indicate whether or not this stream
+ // contains buffers or objects.
+ this.objectMode = !!options.objectMode;
+ if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
- // negative + positive
- if (this.negative !== 0 && num.negative === 0) {
- this.negative = 0;
- r = this.isub(num);
- this.negative ^= 1;
- return this._normSign();
+ // the point at which write() starts returning false
+ // Note: 0 is a valid value, means that we always return false if
+ // the entire buffer is not flushed immediately on write()
+ this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex);
- // positive + negative
- } else if (this.negative === 0 && num.negative !== 0) {
- num.negative = 0;
- r = this.isub(num);
- num.negative = 1;
- return r._normSign();
- }
+ // if _final has been called
+ this.finalCalled = false;
- // a.length > b.length
- var a, b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
+ // drain event flag.
+ this.needDrain = false;
+ // at the start of calling end()
+ this.ending = false;
+ // when end() has been called, and returned
+ this.ended = false;
+ // when 'finish' is emitted
+ this.finished = false;
- var carry = 0;
- for (var i = 0; i < b.length; i++) {
- r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
- this.words[i] = r & 0x3ffffff;
- carry = r >>> 26;
- }
- for (; carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- this.words[i] = r & 0x3ffffff;
- carry = r >>> 26;
- }
+ // has it been destroyed
+ this.destroyed = false;
- this.length = a.length;
- if (carry !== 0) {
- this.words[this.length] = carry;
- this.length++;
- // Copy the rest of the words
- } else if (a !== this) {
- for (; i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
+ // should we decode strings into buffers before passing to _write?
+ // this is here so that some node-core streams can optimize string
+ // handling at a lower level.
+ var noDecode = options.decodeStrings === false;
+ this.decodeStrings = !noDecode;
- return this;
- };
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
- // Add `num` to `this`
- BN.prototype.add = function add (num) {
- var res;
- if (num.negative !== 0 && this.negative === 0) {
- num.negative = 0;
- res = this.sub(num);
- num.negative ^= 1;
- return res;
- } else if (num.negative === 0 && this.negative !== 0) {
- this.negative = 0;
- res = num.sub(this);
- this.negative = 1;
- return res;
- }
+ // not an actual buffer we keep track of, but a measurement
+ // of how much we're waiting to get pushed to some underlying
+ // socket or file.
+ this.length = 0;
- if (this.length > num.length) return this.clone().iadd(num);
+ // a flag to see when we're in the middle of a write.
+ this.writing = false;
- return num.clone().iadd(this);
- };
+ // when true all writes will be buffered until .uncork() call
+ this.corked = 0;
- // Subtract `num` from `this` in-place
- BN.prototype.isub = function isub (num) {
- // this - (-num) = this + num
- if (num.negative !== 0) {
- num.negative = 0;
- var r = this.iadd(num);
- num.negative = 1;
- return r._normSign();
+ // a flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+ this.sync = true;
- // -this - num = -(this + num)
- } else if (this.negative !== 0) {
- this.negative = 0;
- this.iadd(num);
- this.negative = 1;
- return this._normSign();
- }
+ // a flag to know if we're processing previously buffered items, which
+ // may call the _write() callback in the same tick, so that we don't
+ // end up in an overlapped onwrite situation.
+ this.bufferProcessing = false;
- // At this point both numbers are positive
- var cmp = this.cmp(num);
+ // the callback that's passed to _write(chunk,cb)
+ this.onwrite = function (er) {
+ onwrite(stream, er);
+ };
- // Optimization - zeroify
- if (cmp === 0) {
- this.negative = 0;
- this.length = 1;
- this.words[0] = 0;
- return this;
- }
+ // the callback that the user supplies to write(chunk,encoding,cb)
+ this.writecb = null;
- // a > b
- var a, b;
- if (cmp > 0) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
+ // the amount that is being written when _write is called.
+ this.writelen = 0;
+ this.bufferedRequest = null;
+ this.lastBufferedRequest = null;
- var carry = 0;
- for (var i = 0; i < b.length; i++) {
- r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 0x3ffffff;
- }
- for (; carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 0x3ffffff;
- }
+ // number of pending user-supplied write callbacks
+ // this must be 0 before 'finish' can be emitted
+ this.pendingcb = 0;
- // Copy rest of the words
- if (carry === 0 && i < a.length && a !== this) {
- for (; i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
+ // emit prefinish if the only thing we're waiting for is _write cbs
+ // This is relevant for synchronous Transform streams
+ this.prefinished = false;
- this.length = Math.max(this.length, i);
+ // True if the error was already emitted and should not be thrown again
+ this.errorEmitted = false;
- if (a !== this) {
- this.negative = 1;
- }
+ // Should close be emitted on destroy. Defaults to true.
+ this.emitClose = options.emitClose !== false;
- return this._strip();
- };
+ // Should .destroy() be called after 'finish' (and potentially 'end')
+ this.autoDestroy = !!options.autoDestroy;
- // Subtract `num` from `this`
- BN.prototype.sub = function sub (num) {
- return this.clone().isub(num);
- };
+ // count buffered requests
+ this.bufferedRequestCount = 0;
- function smallMulTo (self, num, out) {
- out.negative = num.negative ^ self.negative;
- var len = (self.length + num.length) | 0;
- out.length = len;
- len = (len - 1) | 0;
+ // allocate the first CorkedRequest, there is always
+ // one allocated and free to use, and we maintain at most two
+ this.corkedRequestsFree = new CorkedRequest(this);
+}
+WritableState.prototype.getBuffer = function getBuffer() {
+ var current = this.bufferedRequest;
+ var out = [];
+ while (current) {
+ out.push(current);
+ current = current.next;
+ }
+ return out;
+};
+(function () {
+ try {
+ Object.defineProperty(WritableState.prototype, 'buffer', {
+ get: internalUtil.deprecate(function writableStateBufferGetter() {
+ return this.getBuffer();
+ }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
+ });
+ } catch (_) {}
+})();
- // Peel one iteration (compiler can't do it, because of code complexity)
- var a = self.words[0] | 0;
- var b = num.words[0] | 0;
- var r = a * b;
+// Test _writableState for inheritance to account for Duplex streams,
+// whose prototype chain only points to Readable.
+var realHasInstance;
+if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
+ realHasInstance = Function.prototype[Symbol.hasInstance];
+ Object.defineProperty(Writable, Symbol.hasInstance, {
+ value: function value(object) {
+ if (realHasInstance.call(this, object)) return true;
+ if (this !== Writable) return false;
+ return object && object._writableState instanceof WritableState;
+ }
+ });
+} else {
+ realHasInstance = function realHasInstance(object) {
+ return object instanceof this;
+ };
+}
+function Writable(options) {
+ Duplex = Duplex || require('./_stream_duplex');
- var lo = r & 0x3ffffff;
- var carry = (r / 0x4000000) | 0;
- out.words[0] = lo;
+ // Writable ctor is applied to Duplexes, too.
+ // `realHasInstance` is necessary because using plain `instanceof`
+ // would return false, as no `_writableState` property is attached.
- for (var k = 1; k < len; k++) {
- // Sum all words with the same `i + j = k` and accumulate `ncarry`,
- // note that ncarry could be >= 0x3ffffff
- var ncarry = carry >>> 26;
- var rword = carry & 0x3ffffff;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
- var i = (k - j) | 0;
- a = self.words[i] | 0;
- b = num.words[j] | 0;
- r = a * b + rword;
- ncarry += (r / 0x4000000) | 0;
- rword = r & 0x3ffffff;
- }
- out.words[k] = rword | 0;
- carry = ncarry | 0;
- }
- if (carry !== 0) {
- out.words[k] = carry | 0;
- } else {
- out.length--;
- }
+ // Trying to use the custom `instanceof` for Writable here will also break the
+ // Node.js LazyTransform implementation, which has a non-trivial getter for
+ // `_writableState` that would lead to infinite recursion.
- return out._strip();
+ // Checking for a Stream.Duplex instance is faster here instead of inside
+ // the WritableState constructor, at least with V8 6.5
+ var isDuplex = this instanceof Duplex;
+ if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);
+ this._writableState = new WritableState(options, this, isDuplex);
+
+ // legacy.
+ this.writable = true;
+ if (options) {
+ if (typeof options.write === 'function') this._write = options.write;
+ if (typeof options.writev === 'function') this._writev = options.writev;
+ if (typeof options.destroy === 'function') this._destroy = options.destroy;
+ if (typeof options.final === 'function') this._final = options.final;
}
+ Stream.call(this);
+}
- // TODO(indutny): it may be reasonable to omit it for users who don't need
- // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit
- // multiplication (like elliptic secp256k1).
- var comb10MulTo = function comb10MulTo (self, num, out) {
- var a = self.words;
- var b = num.words;
- var o = out.words;
- var c = 0;
- var lo;
- var mid;
- var hi;
- var a0 = a[0] | 0;
- var al0 = a0 & 0x1fff;
- var ah0 = a0 >>> 13;
- var a1 = a[1] | 0;
- var al1 = a1 & 0x1fff;
- var ah1 = a1 >>> 13;
- var a2 = a[2] | 0;
- var al2 = a2 & 0x1fff;
- var ah2 = a2 >>> 13;
- var a3 = a[3] | 0;
- var al3 = a3 & 0x1fff;
- var ah3 = a3 >>> 13;
- var a4 = a[4] | 0;
- var al4 = a4 & 0x1fff;
- var ah4 = a4 >>> 13;
- var a5 = a[5] | 0;
- var al5 = a5 & 0x1fff;
- var ah5 = a5 >>> 13;
- var a6 = a[6] | 0;
- var al6 = a6 & 0x1fff;
- var ah6 = a6 >>> 13;
- var a7 = a[7] | 0;
- var al7 = a7 & 0x1fff;
- var ah7 = a7 >>> 13;
- var a8 = a[8] | 0;
- var al8 = a8 & 0x1fff;
- var ah8 = a8 >>> 13;
- var a9 = a[9] | 0;
- var al9 = a9 & 0x1fff;
- var ah9 = a9 >>> 13;
- var b0 = b[0] | 0;
- var bl0 = b0 & 0x1fff;
- var bh0 = b0 >>> 13;
- var b1 = b[1] | 0;
- var bl1 = b1 & 0x1fff;
- var bh1 = b1 >>> 13;
- var b2 = b[2] | 0;
- var bl2 = b2 & 0x1fff;
- var bh2 = b2 >>> 13;
- var b3 = b[3] | 0;
- var bl3 = b3 & 0x1fff;
- var bh3 = b3 >>> 13;
- var b4 = b[4] | 0;
- var bl4 = b4 & 0x1fff;
- var bh4 = b4 >>> 13;
- var b5 = b[5] | 0;
- var bl5 = b5 & 0x1fff;
- var bh5 = b5 >>> 13;
- var b6 = b[6] | 0;
- var bl6 = b6 & 0x1fff;
- var bh6 = b6 >>> 13;
- var b7 = b[7] | 0;
- var bl7 = b7 & 0x1fff;
- var bh7 = b7 >>> 13;
- var b8 = b[8] | 0;
- var bl8 = b8 & 0x1fff;
- var bh8 = b8 >>> 13;
- var b9 = b[9] | 0;
- var bl9 = b9 & 0x1fff;
- var bh9 = b9 >>> 13;
+// Otherwise people can pipe Writable streams, which is just wrong.
+Writable.prototype.pipe = function () {
+ errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());
+};
+function writeAfterEnd(stream, cb) {
+ var er = new ERR_STREAM_WRITE_AFTER_END();
+ // TODO: defer error events consistently everywhere, not just the cb
+ errorOrDestroy(stream, er);
+ process.nextTick(cb, er);
+}
- out.negative = self.negative ^ num.negative;
- out.length = 19;
- /* k = 0 */
- lo = Math.imul(al0, bl0);
- mid = Math.imul(al0, bh0);
- mid = (mid + Math.imul(ah0, bl0)) | 0;
- hi = Math.imul(ah0, bh0);
- var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;
- w0 &= 0x3ffffff;
- /* k = 1 */
- lo = Math.imul(al1, bl0);
- mid = Math.imul(al1, bh0);
- mid = (mid + Math.imul(ah1, bl0)) | 0;
- hi = Math.imul(ah1, bh0);
- lo = (lo + Math.imul(al0, bl1)) | 0;
- mid = (mid + Math.imul(al0, bh1)) | 0;
- mid = (mid + Math.imul(ah0, bl1)) | 0;
- hi = (hi + Math.imul(ah0, bh1)) | 0;
- var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;
- w1 &= 0x3ffffff;
- /* k = 2 */
- lo = Math.imul(al2, bl0);
- mid = Math.imul(al2, bh0);
- mid = (mid + Math.imul(ah2, bl0)) | 0;
- hi = Math.imul(ah2, bh0);
- lo = (lo + Math.imul(al1, bl1)) | 0;
- mid = (mid + Math.imul(al1, bh1)) | 0;
- mid = (mid + Math.imul(ah1, bl1)) | 0;
- hi = (hi + Math.imul(ah1, bh1)) | 0;
- lo = (lo + Math.imul(al0, bl2)) | 0;
- mid = (mid + Math.imul(al0, bh2)) | 0;
- mid = (mid + Math.imul(ah0, bl2)) | 0;
- hi = (hi + Math.imul(ah0, bh2)) | 0;
- var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;
- w2 &= 0x3ffffff;
- /* k = 3 */
- lo = Math.imul(al3, bl0);
- mid = Math.imul(al3, bh0);
- mid = (mid + Math.imul(ah3, bl0)) | 0;
- hi = Math.imul(ah3, bh0);
- lo = (lo + Math.imul(al2, bl1)) | 0;
- mid = (mid + Math.imul(al2, bh1)) | 0;
- mid = (mid + Math.imul(ah2, bl1)) | 0;
- hi = (hi + Math.imul(ah2, bh1)) | 0;
- lo = (lo + Math.imul(al1, bl2)) | 0;
- mid = (mid + Math.imul(al1, bh2)) | 0;
- mid = (mid + Math.imul(ah1, bl2)) | 0;
- hi = (hi + Math.imul(ah1, bh2)) | 0;
- lo = (lo + Math.imul(al0, bl3)) | 0;
- mid = (mid + Math.imul(al0, bh3)) | 0;
- mid = (mid + Math.imul(ah0, bl3)) | 0;
- hi = (hi + Math.imul(ah0, bh3)) | 0;
- var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;
- w3 &= 0x3ffffff;
- /* k = 4 */
- lo = Math.imul(al4, bl0);
- mid = Math.imul(al4, bh0);
- mid = (mid + Math.imul(ah4, bl0)) | 0;
- hi = Math.imul(ah4, bh0);
- lo = (lo + Math.imul(al3, bl1)) | 0;
- mid = (mid + Math.imul(al3, bh1)) | 0;
- mid = (mid + Math.imul(ah3, bl1)) | 0;
- hi = (hi + Math.imul(ah3, bh1)) | 0;
- lo = (lo + Math.imul(al2, bl2)) | 0;
- mid = (mid + Math.imul(al2, bh2)) | 0;
- mid = (mid + Math.imul(ah2, bl2)) | 0;
- hi = (hi + Math.imul(ah2, bh2)) | 0;
- lo = (lo + Math.imul(al1, bl3)) | 0;
- mid = (mid + Math.imul(al1, bh3)) | 0;
- mid = (mid + Math.imul(ah1, bl3)) | 0;
- hi = (hi + Math.imul(ah1, bh3)) | 0;
- lo = (lo + Math.imul(al0, bl4)) | 0;
- mid = (mid + Math.imul(al0, bh4)) | 0;
- mid = (mid + Math.imul(ah0, bl4)) | 0;
- hi = (hi + Math.imul(ah0, bh4)) | 0;
- var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;
- w4 &= 0x3ffffff;
- /* k = 5 */
- lo = Math.imul(al5, bl0);
- mid = Math.imul(al5, bh0);
- mid = (mid + Math.imul(ah5, bl0)) | 0;
- hi = Math.imul(ah5, bh0);
- lo = (lo + Math.imul(al4, bl1)) | 0;
- mid = (mid + Math.imul(al4, bh1)) | 0;
- mid = (mid + Math.imul(ah4, bl1)) | 0;
- hi = (hi + Math.imul(ah4, bh1)) | 0;
- lo = (lo + Math.imul(al3, bl2)) | 0;
- mid = (mid + Math.imul(al3, bh2)) | 0;
- mid = (mid + Math.imul(ah3, bl2)) | 0;
- hi = (hi + Math.imul(ah3, bh2)) | 0;
- lo = (lo + Math.imul(al2, bl3)) | 0;
- mid = (mid + Math.imul(al2, bh3)) | 0;
- mid = (mid + Math.imul(ah2, bl3)) | 0;
- hi = (hi + Math.imul(ah2, bh3)) | 0;
- lo = (lo + Math.imul(al1, bl4)) | 0;
- mid = (mid + Math.imul(al1, bh4)) | 0;
- mid = (mid + Math.imul(ah1, bl4)) | 0;
- hi = (hi + Math.imul(ah1, bh4)) | 0;
- lo = (lo + Math.imul(al0, bl5)) | 0;
- mid = (mid + Math.imul(al0, bh5)) | 0;
- mid = (mid + Math.imul(ah0, bl5)) | 0;
- hi = (hi + Math.imul(ah0, bh5)) | 0;
- var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;
- w5 &= 0x3ffffff;
- /* k = 6 */
- lo = Math.imul(al6, bl0);
- mid = Math.imul(al6, bh0);
- mid = (mid + Math.imul(ah6, bl0)) | 0;
- hi = Math.imul(ah6, bh0);
- lo = (lo + Math.imul(al5, bl1)) | 0;
- mid = (mid + Math.imul(al5, bh1)) | 0;
- mid = (mid + Math.imul(ah5, bl1)) | 0;
- hi = (hi + Math.imul(ah5, bh1)) | 0;
- lo = (lo + Math.imul(al4, bl2)) | 0;
- mid = (mid + Math.imul(al4, bh2)) | 0;
- mid = (mid + Math.imul(ah4, bl2)) | 0;
- hi = (hi + Math.imul(ah4, bh2)) | 0;
- lo = (lo + Math.imul(al3, bl3)) | 0;
- mid = (mid + Math.imul(al3, bh3)) | 0;
- mid = (mid + Math.imul(ah3, bl3)) | 0;
- hi = (hi + Math.imul(ah3, bh3)) | 0;
- lo = (lo + Math.imul(al2, bl4)) | 0;
- mid = (mid + Math.imul(al2, bh4)) | 0;
- mid = (mid + Math.imul(ah2, bl4)) | 0;
- hi = (hi + Math.imul(ah2, bh4)) | 0;
- lo = (lo + Math.imul(al1, bl5)) | 0;
- mid = (mid + Math.imul(al1, bh5)) | 0;
- mid = (mid + Math.imul(ah1, bl5)) | 0;
- hi = (hi + Math.imul(ah1, bh5)) | 0;
- lo = (lo + Math.imul(al0, bl6)) | 0;
- mid = (mid + Math.imul(al0, bh6)) | 0;
- mid = (mid + Math.imul(ah0, bl6)) | 0;
- hi = (hi + Math.imul(ah0, bh6)) | 0;
- var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;
- w6 &= 0x3ffffff;
- /* k = 7 */
- lo = Math.imul(al7, bl0);
- mid = Math.imul(al7, bh0);
- mid = (mid + Math.imul(ah7, bl0)) | 0;
- hi = Math.imul(ah7, bh0);
- lo = (lo + Math.imul(al6, bl1)) | 0;
- mid = (mid + Math.imul(al6, bh1)) | 0;
- mid = (mid + Math.imul(ah6, bl1)) | 0;
- hi = (hi + Math.imul(ah6, bh1)) | 0;
- lo = (lo + Math.imul(al5, bl2)) | 0;
- mid = (mid + Math.imul(al5, bh2)) | 0;
- mid = (mid + Math.imul(ah5, bl2)) | 0;
- hi = (hi + Math.imul(ah5, bh2)) | 0;
- lo = (lo + Math.imul(al4, bl3)) | 0;
- mid = (mid + Math.imul(al4, bh3)) | 0;
- mid = (mid + Math.imul(ah4, bl3)) | 0;
- hi = (hi + Math.imul(ah4, bh3)) | 0;
- lo = (lo + Math.imul(al3, bl4)) | 0;
- mid = (mid + Math.imul(al3, bh4)) | 0;
- mid = (mid + Math.imul(ah3, bl4)) | 0;
- hi = (hi + Math.imul(ah3, bh4)) | 0;
- lo = (lo + Math.imul(al2, bl5)) | 0;
- mid = (mid + Math.imul(al2, bh5)) | 0;
- mid = (mid + Math.imul(ah2, bl5)) | 0;
- hi = (hi + Math.imul(ah2, bh5)) | 0;
- lo = (lo + Math.imul(al1, bl6)) | 0;
- mid = (mid + Math.imul(al1, bh6)) | 0;
- mid = (mid + Math.imul(ah1, bl6)) | 0;
- hi = (hi + Math.imul(ah1, bh6)) | 0;
- lo = (lo + Math.imul(al0, bl7)) | 0;
- mid = (mid + Math.imul(al0, bh7)) | 0;
- mid = (mid + Math.imul(ah0, bl7)) | 0;
- hi = (hi + Math.imul(ah0, bh7)) | 0;
- var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;
- w7 &= 0x3ffffff;
- /* k = 8 */
- lo = Math.imul(al8, bl0);
- mid = Math.imul(al8, bh0);
- mid = (mid + Math.imul(ah8, bl0)) | 0;
- hi = Math.imul(ah8, bh0);
- lo = (lo + Math.imul(al7, bl1)) | 0;
- mid = (mid + Math.imul(al7, bh1)) | 0;
- mid = (mid + Math.imul(ah7, bl1)) | 0;
- hi = (hi + Math.imul(ah7, bh1)) | 0;
- lo = (lo + Math.imul(al6, bl2)) | 0;
- mid = (mid + Math.imul(al6, bh2)) | 0;
- mid = (mid + Math.imul(ah6, bl2)) | 0;
- hi = (hi + Math.imul(ah6, bh2)) | 0;
- lo = (lo + Math.imul(al5, bl3)) | 0;
- mid = (mid + Math.imul(al5, bh3)) | 0;
- mid = (mid + Math.imul(ah5, bl3)) | 0;
- hi = (hi + Math.imul(ah5, bh3)) | 0;
- lo = (lo + Math.imul(al4, bl4)) | 0;
- mid = (mid + Math.imul(al4, bh4)) | 0;
- mid = (mid + Math.imul(ah4, bl4)) | 0;
- hi = (hi + Math.imul(ah4, bh4)) | 0;
- lo = (lo + Math.imul(al3, bl5)) | 0;
- mid = (mid + Math.imul(al3, bh5)) | 0;
- mid = (mid + Math.imul(ah3, bl5)) | 0;
- hi = (hi + Math.imul(ah3, bh5)) | 0;
- lo = (lo + Math.imul(al2, bl6)) | 0;
- mid = (mid + Math.imul(al2, bh6)) | 0;
- mid = (mid + Math.imul(ah2, bl6)) | 0;
- hi = (hi + Math.imul(ah2, bh6)) | 0;
- lo = (lo + Math.imul(al1, bl7)) | 0;
- mid = (mid + Math.imul(al1, bh7)) | 0;
- mid = (mid + Math.imul(ah1, bl7)) | 0;
- hi = (hi + Math.imul(ah1, bh7)) | 0;
- lo = (lo + Math.imul(al0, bl8)) | 0;
- mid = (mid + Math.imul(al0, bh8)) | 0;
- mid = (mid + Math.imul(ah0, bl8)) | 0;
- hi = (hi + Math.imul(ah0, bh8)) | 0;
- var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;
- w8 &= 0x3ffffff;
- /* k = 9 */
- lo = Math.imul(al9, bl0);
- mid = Math.imul(al9, bh0);
- mid = (mid + Math.imul(ah9, bl0)) | 0;
- hi = Math.imul(ah9, bh0);
- lo = (lo + Math.imul(al8, bl1)) | 0;
- mid = (mid + Math.imul(al8, bh1)) | 0;
- mid = (mid + Math.imul(ah8, bl1)) | 0;
- hi = (hi + Math.imul(ah8, bh1)) | 0;
- lo = (lo + Math.imul(al7, bl2)) | 0;
- mid = (mid + Math.imul(al7, bh2)) | 0;
- mid = (mid + Math.imul(ah7, bl2)) | 0;
- hi = (hi + Math.imul(ah7, bh2)) | 0;
- lo = (lo + Math.imul(al6, bl3)) | 0;
- mid = (mid + Math.imul(al6, bh3)) | 0;
- mid = (mid + Math.imul(ah6, bl3)) | 0;
- hi = (hi + Math.imul(ah6, bh3)) | 0;
- lo = (lo + Math.imul(al5, bl4)) | 0;
- mid = (mid + Math.imul(al5, bh4)) | 0;
- mid = (mid + Math.imul(ah5, bl4)) | 0;
- hi = (hi + Math.imul(ah5, bh4)) | 0;
- lo = (lo + Math.imul(al4, bl5)) | 0;
- mid = (mid + Math.imul(al4, bh5)) | 0;
- mid = (mid + Math.imul(ah4, bl5)) | 0;
- hi = (hi + Math.imul(ah4, bh5)) | 0;
- lo = (lo + Math.imul(al3, bl6)) | 0;
- mid = (mid + Math.imul(al3, bh6)) | 0;
- mid = (mid + Math.imul(ah3, bl6)) | 0;
- hi = (hi + Math.imul(ah3, bh6)) | 0;
- lo = (lo + Math.imul(al2, bl7)) | 0;
- mid = (mid + Math.imul(al2, bh7)) | 0;
- mid = (mid + Math.imul(ah2, bl7)) | 0;
- hi = (hi + Math.imul(ah2, bh7)) | 0;
- lo = (lo + Math.imul(al1, bl8)) | 0;
- mid = (mid + Math.imul(al1, bh8)) | 0;
- mid = (mid + Math.imul(ah1, bl8)) | 0;
- hi = (hi + Math.imul(ah1, bh8)) | 0;
- lo = (lo + Math.imul(al0, bl9)) | 0;
- mid = (mid + Math.imul(al0, bh9)) | 0;
- mid = (mid + Math.imul(ah0, bl9)) | 0;
- hi = (hi + Math.imul(ah0, bh9)) | 0;
- var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;
- w9 &= 0x3ffffff;
- /* k = 10 */
- lo = Math.imul(al9, bl1);
- mid = Math.imul(al9, bh1);
- mid = (mid + Math.imul(ah9, bl1)) | 0;
- hi = Math.imul(ah9, bh1);
- lo = (lo + Math.imul(al8, bl2)) | 0;
- mid = (mid + Math.imul(al8, bh2)) | 0;
- mid = (mid + Math.imul(ah8, bl2)) | 0;
- hi = (hi + Math.imul(ah8, bh2)) | 0;
- lo = (lo + Math.imul(al7, bl3)) | 0;
- mid = (mid + Math.imul(al7, bh3)) | 0;
- mid = (mid + Math.imul(ah7, bl3)) | 0;
- hi = (hi + Math.imul(ah7, bh3)) | 0;
- lo = (lo + Math.imul(al6, bl4)) | 0;
- mid = (mid + Math.imul(al6, bh4)) | 0;
- mid = (mid + Math.imul(ah6, bl4)) | 0;
- hi = (hi + Math.imul(ah6, bh4)) | 0;
- lo = (lo + Math.imul(al5, bl5)) | 0;
- mid = (mid + Math.imul(al5, bh5)) | 0;
- mid = (mid + Math.imul(ah5, bl5)) | 0;
- hi = (hi + Math.imul(ah5, bh5)) | 0;
- lo = (lo + Math.imul(al4, bl6)) | 0;
- mid = (mid + Math.imul(al4, bh6)) | 0;
- mid = (mid + Math.imul(ah4, bl6)) | 0;
- hi = (hi + Math.imul(ah4, bh6)) | 0;
- lo = (lo + Math.imul(al3, bl7)) | 0;
- mid = (mid + Math.imul(al3, bh7)) | 0;
- mid = (mid + Math.imul(ah3, bl7)) | 0;
- hi = (hi + Math.imul(ah3, bh7)) | 0;
- lo = (lo + Math.imul(al2, bl8)) | 0;
- mid = (mid + Math.imul(al2, bh8)) | 0;
- mid = (mid + Math.imul(ah2, bl8)) | 0;
- hi = (hi + Math.imul(ah2, bh8)) | 0;
- lo = (lo + Math.imul(al1, bl9)) | 0;
- mid = (mid + Math.imul(al1, bh9)) | 0;
- mid = (mid + Math.imul(ah1, bl9)) | 0;
- hi = (hi + Math.imul(ah1, bh9)) | 0;
- var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;
- w10 &= 0x3ffffff;
- /* k = 11 */
- lo = Math.imul(al9, bl2);
- mid = Math.imul(al9, bh2);
- mid = (mid + Math.imul(ah9, bl2)) | 0;
- hi = Math.imul(ah9, bh2);
- lo = (lo + Math.imul(al8, bl3)) | 0;
- mid = (mid + Math.imul(al8, bh3)) | 0;
- mid = (mid + Math.imul(ah8, bl3)) | 0;
- hi = (hi + Math.imul(ah8, bh3)) | 0;
- lo = (lo + Math.imul(al7, bl4)) | 0;
- mid = (mid + Math.imul(al7, bh4)) | 0;
- mid = (mid + Math.imul(ah7, bl4)) | 0;
- hi = (hi + Math.imul(ah7, bh4)) | 0;
- lo = (lo + Math.imul(al6, bl5)) | 0;
- mid = (mid + Math.imul(al6, bh5)) | 0;
- mid = (mid + Math.imul(ah6, bl5)) | 0;
- hi = (hi + Math.imul(ah6, bh5)) | 0;
- lo = (lo + Math.imul(al5, bl6)) | 0;
- mid = (mid + Math.imul(al5, bh6)) | 0;
- mid = (mid + Math.imul(ah5, bl6)) | 0;
- hi = (hi + Math.imul(ah5, bh6)) | 0;
- lo = (lo + Math.imul(al4, bl7)) | 0;
- mid = (mid + Math.imul(al4, bh7)) | 0;
- mid = (mid + Math.imul(ah4, bl7)) | 0;
- hi = (hi + Math.imul(ah4, bh7)) | 0;
- lo = (lo + Math.imul(al3, bl8)) | 0;
- mid = (mid + Math.imul(al3, bh8)) | 0;
- mid = (mid + Math.imul(ah3, bl8)) | 0;
- hi = (hi + Math.imul(ah3, bh8)) | 0;
- lo = (lo + Math.imul(al2, bl9)) | 0;
- mid = (mid + Math.imul(al2, bh9)) | 0;
- mid = (mid + Math.imul(ah2, bl9)) | 0;
- hi = (hi + Math.imul(ah2, bh9)) | 0;
- var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;
- w11 &= 0x3ffffff;
- /* k = 12 */
- lo = Math.imul(al9, bl3);
- mid = Math.imul(al9, bh3);
- mid = (mid + Math.imul(ah9, bl3)) | 0;
- hi = Math.imul(ah9, bh3);
- lo = (lo + Math.imul(al8, bl4)) | 0;
- mid = (mid + Math.imul(al8, bh4)) | 0;
- mid = (mid + Math.imul(ah8, bl4)) | 0;
- hi = (hi + Math.imul(ah8, bh4)) | 0;
- lo = (lo + Math.imul(al7, bl5)) | 0;
- mid = (mid + Math.imul(al7, bh5)) | 0;
- mid = (mid + Math.imul(ah7, bl5)) | 0;
- hi = (hi + Math.imul(ah7, bh5)) | 0;
- lo = (lo + Math.imul(al6, bl6)) | 0;
- mid = (mid + Math.imul(al6, bh6)) | 0;
- mid = (mid + Math.imul(ah6, bl6)) | 0;
- hi = (hi + Math.imul(ah6, bh6)) | 0;
- lo = (lo + Math.imul(al5, bl7)) | 0;
- mid = (mid + Math.imul(al5, bh7)) | 0;
- mid = (mid + Math.imul(ah5, bl7)) | 0;
- hi = (hi + Math.imul(ah5, bh7)) | 0;
- lo = (lo + Math.imul(al4, bl8)) | 0;
- mid = (mid + Math.imul(al4, bh8)) | 0;
- mid = (mid + Math.imul(ah4, bl8)) | 0;
- hi = (hi + Math.imul(ah4, bh8)) | 0;
- lo = (lo + Math.imul(al3, bl9)) | 0;
- mid = (mid + Math.imul(al3, bh9)) | 0;
- mid = (mid + Math.imul(ah3, bl9)) | 0;
- hi = (hi + Math.imul(ah3, bh9)) | 0;
- var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;
- w12 &= 0x3ffffff;
- /* k = 13 */
- lo = Math.imul(al9, bl4);
- mid = Math.imul(al9, bh4);
- mid = (mid + Math.imul(ah9, bl4)) | 0;
- hi = Math.imul(ah9, bh4);
- lo = (lo + Math.imul(al8, bl5)) | 0;
- mid = (mid + Math.imul(al8, bh5)) | 0;
- mid = (mid + Math.imul(ah8, bl5)) | 0;
- hi = (hi + Math.imul(ah8, bh5)) | 0;
- lo = (lo + Math.imul(al7, bl6)) | 0;
- mid = (mid + Math.imul(al7, bh6)) | 0;
- mid = (mid + Math.imul(ah7, bl6)) | 0;
- hi = (hi + Math.imul(ah7, bh6)) | 0;
- lo = (lo + Math.imul(al6, bl7)) | 0;
- mid = (mid + Math.imul(al6, bh7)) | 0;
- mid = (mid + Math.imul(ah6, bl7)) | 0;
- hi = (hi + Math.imul(ah6, bh7)) | 0;
- lo = (lo + Math.imul(al5, bl8)) | 0;
- mid = (mid + Math.imul(al5, bh8)) | 0;
- mid = (mid + Math.imul(ah5, bl8)) | 0;
- hi = (hi + Math.imul(ah5, bh8)) | 0;
- lo = (lo + Math.imul(al4, bl9)) | 0;
- mid = (mid + Math.imul(al4, bh9)) | 0;
- mid = (mid + Math.imul(ah4, bl9)) | 0;
- hi = (hi + Math.imul(ah4, bh9)) | 0;
- var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;
- w13 &= 0x3ffffff;
- /* k = 14 */
- lo = Math.imul(al9, bl5);
- mid = Math.imul(al9, bh5);
- mid = (mid + Math.imul(ah9, bl5)) | 0;
- hi = Math.imul(ah9, bh5);
- lo = (lo + Math.imul(al8, bl6)) | 0;
- mid = (mid + Math.imul(al8, bh6)) | 0;
- mid = (mid + Math.imul(ah8, bl6)) | 0;
- hi = (hi + Math.imul(ah8, bh6)) | 0;
- lo = (lo + Math.imul(al7, bl7)) | 0;
- mid = (mid + Math.imul(al7, bh7)) | 0;
- mid = (mid + Math.imul(ah7, bl7)) | 0;
- hi = (hi + Math.imul(ah7, bh7)) | 0;
- lo = (lo + Math.imul(al6, bl8)) | 0;
- mid = (mid + Math.imul(al6, bh8)) | 0;
- mid = (mid + Math.imul(ah6, bl8)) | 0;
- hi = (hi + Math.imul(ah6, bh8)) | 0;
- lo = (lo + Math.imul(al5, bl9)) | 0;
- mid = (mid + Math.imul(al5, bh9)) | 0;
- mid = (mid + Math.imul(ah5, bl9)) | 0;
- hi = (hi + Math.imul(ah5, bh9)) | 0;
- var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;
- w14 &= 0x3ffffff;
- /* k = 15 */
- lo = Math.imul(al9, bl6);
- mid = Math.imul(al9, bh6);
- mid = (mid + Math.imul(ah9, bl6)) | 0;
- hi = Math.imul(ah9, bh6);
- lo = (lo + Math.imul(al8, bl7)) | 0;
- mid = (mid + Math.imul(al8, bh7)) | 0;
- mid = (mid + Math.imul(ah8, bl7)) | 0;
- hi = (hi + Math.imul(ah8, bh7)) | 0;
- lo = (lo + Math.imul(al7, bl8)) | 0;
- mid = (mid + Math.imul(al7, bh8)) | 0;
- mid = (mid + Math.imul(ah7, bl8)) | 0;
- hi = (hi + Math.imul(ah7, bh8)) | 0;
- lo = (lo + Math.imul(al6, bl9)) | 0;
- mid = (mid + Math.imul(al6, bh9)) | 0;
- mid = (mid + Math.imul(ah6, bl9)) | 0;
- hi = (hi + Math.imul(ah6, bh9)) | 0;
- var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;
- w15 &= 0x3ffffff;
- /* k = 16 */
- lo = Math.imul(al9, bl7);
- mid = Math.imul(al9, bh7);
- mid = (mid + Math.imul(ah9, bl7)) | 0;
- hi = Math.imul(ah9, bh7);
- lo = (lo + Math.imul(al8, bl8)) | 0;
- mid = (mid + Math.imul(al8, bh8)) | 0;
- mid = (mid + Math.imul(ah8, bl8)) | 0;
- hi = (hi + Math.imul(ah8, bh8)) | 0;
- lo = (lo + Math.imul(al7, bl9)) | 0;
- mid = (mid + Math.imul(al7, bh9)) | 0;
- mid = (mid + Math.imul(ah7, bl9)) | 0;
- hi = (hi + Math.imul(ah7, bh9)) | 0;
- var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;
- w16 &= 0x3ffffff;
- /* k = 17 */
- lo = Math.imul(al9, bl8);
- mid = Math.imul(al9, bh8);
- mid = (mid + Math.imul(ah9, bl8)) | 0;
- hi = Math.imul(ah9, bh8);
- lo = (lo + Math.imul(al8, bl9)) | 0;
- mid = (mid + Math.imul(al8, bh9)) | 0;
- mid = (mid + Math.imul(ah8, bl9)) | 0;
- hi = (hi + Math.imul(ah8, bh9)) | 0;
- var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;
- w17 &= 0x3ffffff;
- /* k = 18 */
- lo = Math.imul(al9, bl9);
- mid = Math.imul(al9, bh9);
- mid = (mid + Math.imul(ah9, bl9)) | 0;
- hi = Math.imul(ah9, bh9);
- var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;
- w18 &= 0x3ffffff;
- o[0] = w0;
- o[1] = w1;
- o[2] = w2;
- o[3] = w3;
- o[4] = w4;
- o[5] = w5;
- o[6] = w6;
- o[7] = w7;
- o[8] = w8;
- o[9] = w9;
- o[10] = w10;
- o[11] = w11;
- o[12] = w12;
- o[13] = w13;
- o[14] = w14;
- o[15] = w15;
- o[16] = w16;
- o[17] = w17;
- o[18] = w18;
- if (c !== 0) {
- o[19] = c;
- out.length++;
- }
- return out;
- };
-
- // Polyfill comb
- if (!Math.imul) {
- comb10MulTo = smallMulTo;
- }
-
- function bigMulTo (self, num, out) {
- out.negative = num.negative ^ self.negative;
- out.length = self.length + num.length;
-
- var carry = 0;
- var hncarry = 0;
- for (var k = 0; k < out.length - 1; k++) {
- // Sum all words with the same `i + j = k` and accumulate `ncarry`,
- // note that ncarry could be >= 0x3ffffff
- var ncarry = hncarry;
- hncarry = 0;
- var rword = carry & 0x3ffffff;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
- var i = k - j;
- var a = self.words[i] | 0;
- var b = num.words[j] | 0;
- var r = a * b;
-
- var lo = r & 0x3ffffff;
- ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
- lo = (lo + rword) | 0;
- rword = lo & 0x3ffffff;
- ncarry = (ncarry + (lo >>> 26)) | 0;
-
- hncarry += ncarry >>> 26;
- ncarry &= 0x3ffffff;
- }
- out.words[k] = rword;
- carry = ncarry;
- ncarry = hncarry;
- }
- if (carry !== 0) {
- out.words[k] = carry;
- } else {
- out.length--;
- }
-
- return out._strip();
- }
-
- function jumboMulTo (self, num, out) {
- // Temporary disable, see https://github.com/indutny/bn.js/issues/211
- // var fftm = new FFTM();
- // return fftm.mulp(self, num, out);
- return bigMulTo(self, num, out);
- }
-
- BN.prototype.mulTo = function mulTo (num, out) {
- var res;
- var len = this.length + num.length;
- if (this.length === 10 && num.length === 10) {
- res = comb10MulTo(this, num, out);
- } else if (len < 63) {
- res = smallMulTo(this, num, out);
- } else if (len < 1024) {
- res = bigMulTo(this, num, out);
- } else {
- res = jumboMulTo(this, num, out);
- }
-
- return res;
- };
-
- // Cooley-Tukey algorithm for FFT
- // slightly revisited to rely on looping instead of recursion
-
- function FFTM (x, y) {
- this.x = x;
- this.y = y;
- }
-
- FFTM.prototype.makeRBT = function makeRBT (N) {
- var t = new Array(N);
- var l = BN.prototype._countBits(N) - 1;
- for (var i = 0; i < N; i++) {
- t[i] = this.revBin(i, l, N);
- }
-
- return t;
- };
-
- // Returns binary-reversed representation of `x`
- FFTM.prototype.revBin = function revBin (x, l, N) {
- if (x === 0 || x === N - 1) return x;
-
- var rb = 0;
- for (var i = 0; i < l; i++) {
- rb |= (x & 1) << (l - i - 1);
- x >>= 1;
- }
-
- return rb;
- };
-
- // Performs "tweedling" phase, therefore 'emulating'
- // behaviour of the recursive algorithm
- FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {
- for (var i = 0; i < N; i++) {
- rtws[i] = rws[rbt[i]];
- itws[i] = iws[rbt[i]];
- }
- };
-
- FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {
- this.permute(rbt, rws, iws, rtws, itws, N);
-
- for (var s = 1; s < N; s <<= 1) {
- var l = s << 1;
-
- var rtwdf = Math.cos(2 * Math.PI / l);
- var itwdf = Math.sin(2 * Math.PI / l);
-
- for (var p = 0; p < N; p += l) {
- var rtwdf_ = rtwdf;
- var itwdf_ = itwdf;
-
- for (var j = 0; j < s; j++) {
- var re = rtws[p + j];
- var ie = itws[p + j];
-
- var ro = rtws[p + j + s];
- var io = itws[p + j + s];
-
- var rx = rtwdf_ * ro - itwdf_ * io;
-
- io = rtwdf_ * io + itwdf_ * ro;
- ro = rx;
-
- rtws[p + j] = re + ro;
- itws[p + j] = ie + io;
-
- rtws[p + j + s] = re - ro;
- itws[p + j + s] = ie - io;
-
- /* jshint maxdepth : false */
- if (j !== l) {
- rx = rtwdf * rtwdf_ - itwdf * itwdf_;
-
- itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
- rtwdf_ = rx;
- }
- }
- }
- }
- };
-
- FFTM.prototype.guessLen13b = function guessLen13b (n, m) {
- var N = Math.max(m, n) | 1;
- var odd = N & 1;
- var i = 0;
- for (N = N / 2 | 0; N; N = N >>> 1) {
- i++;
- }
-
- return 1 << i + 1 + odd;
- };
-
- FFTM.prototype.conjugate = function conjugate (rws, iws, N) {
- if (N <= 1) return;
-
- for (var i = 0; i < N / 2; i++) {
- var t = rws[i];
-
- rws[i] = rws[N - i - 1];
- rws[N - i - 1] = t;
-
- t = iws[i];
-
- iws[i] = -iws[N - i - 1];
- iws[N - i - 1] = -t;
- }
- };
-
- FFTM.prototype.normalize13b = function normalize13b (ws, N) {
- var carry = 0;
- for (var i = 0; i < N / 2; i++) {
- var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +
- Math.round(ws[2 * i] / N) +
- carry;
-
- ws[i] = w & 0x3ffffff;
-
- if (w < 0x4000000) {
- carry = 0;
- } else {
- carry = w / 0x4000000 | 0;
- }
- }
-
- return ws;
- };
-
- FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {
- var carry = 0;
- for (var i = 0; i < len; i++) {
- carry = carry + (ws[i] | 0);
-
- rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;
- rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;
- }
-
- // Pad with zeroes
- for (i = 2 * len; i < N; ++i) {
- rws[i] = 0;
- }
-
- assert(carry === 0);
- assert((carry & ~0x1fff) === 0);
- };
-
- FFTM.prototype.stub = function stub (N) {
- var ph = new Array(N);
- for (var i = 0; i < N; i++) {
- ph[i] = 0;
- }
-
- return ph;
- };
-
- FFTM.prototype.mulp = function mulp (x, y, out) {
- var N = 2 * this.guessLen13b(x.length, y.length);
-
- var rbt = this.makeRBT(N);
-
- var _ = this.stub(N);
-
- var rws = new Array(N);
- var rwst = new Array(N);
- var iwst = new Array(N);
-
- var nrws = new Array(N);
- var nrwst = new Array(N);
- var niwst = new Array(N);
-
- var rmws = out.words;
- rmws.length = N;
-
- this.convert13b(x.words, x.length, rws, N);
- this.convert13b(y.words, y.length, nrws, N);
-
- this.transform(rws, _, rwst, iwst, N, rbt);
- this.transform(nrws, _, nrwst, niwst, N, rbt);
-
- for (var i = 0; i < N; i++) {
- var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
- iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
- rwst[i] = rx;
- }
-
- this.conjugate(rwst, iwst, N);
- this.transform(rwst, iwst, rmws, _, N, rbt);
- this.conjugate(rmws, _, N);
- this.normalize13b(rmws, N);
-
- out.negative = x.negative ^ y.negative;
- out.length = x.length + y.length;
- return out._strip();
- };
-
- // Multiply `this` by `num`
- BN.prototype.mul = function mul (num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return this.mulTo(num, out);
- };
-
- // Multiply employing FFT
- BN.prototype.mulf = function mulf (num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return jumboMulTo(this, num, out);
- };
-
- // In-place Multiplication
- BN.prototype.imul = function imul (num) {
- return this.clone().mulTo(num, this);
- };
-
- BN.prototype.imuln = function imuln (num) {
- var isNegNum = num < 0;
- if (isNegNum) num = -num;
-
- assert(typeof num === 'number');
- assert(num < 0x4000000);
-
- // Carry
- var carry = 0;
- for (var i = 0; i < this.length; i++) {
- var w = (this.words[i] | 0) * num;
- var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);
- carry >>= 26;
- carry += (w / 0x4000000) | 0;
- // NOTE: lo is 27bit maximum
- carry += lo >>> 26;
- this.words[i] = lo & 0x3ffffff;
- }
-
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
-
- return isNegNum ? this.ineg() : this;
- };
-
- BN.prototype.muln = function muln (num) {
- return this.clone().imuln(num);
- };
-
- // `this` * `this`
- BN.prototype.sqr = function sqr () {
- return this.mul(this);
- };
-
- // `this` * `this` in-place
- BN.prototype.isqr = function isqr () {
- return this.imul(this.clone());
- };
-
- // Math.pow(`this`, `num`)
- BN.prototype.pow = function pow (num) {
- var w = toBitArray(num);
- if (w.length === 0) return new BN(1);
-
- // Skip leading zeroes
- var res = this;
- for (var i = 0; i < w.length; i++, res = res.sqr()) {
- if (w[i] !== 0) break;
- }
-
- if (++i < w.length) {
- for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {
- if (w[i] === 0) continue;
-
- res = res.mul(q);
- }
- }
-
- return res;
- };
-
- // Shift-left in-place
- BN.prototype.iushln = function iushln (bits) {
- assert(typeof bits === 'number' && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);
- var i;
-
- if (r !== 0) {
- var carry = 0;
-
- for (i = 0; i < this.length; i++) {
- var newCarry = this.words[i] & carryMask;
- var c = ((this.words[i] | 0) - newCarry) << r;
- this.words[i] = c | carry;
- carry = newCarry >>> (26 - r);
- }
-
- if (carry) {
- this.words[i] = carry;
- this.length++;
- }
- }
-
- if (s !== 0) {
- for (i = this.length - 1; i >= 0; i--) {
- this.words[i + s] = this.words[i];
- }
-
- for (i = 0; i < s; i++) {
- this.words[i] = 0;
- }
-
- this.length += s;
- }
-
- return this._strip();
- };
-
- BN.prototype.ishln = function ishln (bits) {
- // TODO(indutny): implement me
- assert(this.negative === 0);
- return this.iushln(bits);
- };
-
- // Shift-right in-place
- // NOTE: `hint` is a lowest bit before trailing zeroes
- // NOTE: if `extended` is present - it will be filled with destroyed bits
- BN.prototype.iushrn = function iushrn (bits, hint, extended) {
- assert(typeof bits === 'number' && bits >= 0);
- var h;
- if (hint) {
- h = (hint - (hint % 26)) / 26;
- } else {
- h = 0;
- }
-
- var r = bits % 26;
- var s = Math.min((bits - r) / 26, this.length);
- var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
- var maskedWords = extended;
-
- h -= s;
- h = Math.max(0, h);
-
- // Extended mode, copy masked part
- if (maskedWords) {
- for (var i = 0; i < s; i++) {
- maskedWords.words[i] = this.words[i];
- }
- maskedWords.length = s;
- }
-
- if (s === 0) {
- // No-op, we should not move anything at all
- } else if (this.length > s) {
- this.length -= s;
- for (i = 0; i < this.length; i++) {
- this.words[i] = this.words[i + s];
- }
- } else {
- this.words[0] = 0;
- this.length = 1;
- }
-
- var carry = 0;
- for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
- var word = this.words[i] | 0;
- this.words[i] = (carry << (26 - r)) | (word >>> r);
- carry = word & mask;
- }
-
- // Push carried bits as a mask
- if (maskedWords && carry !== 0) {
- maskedWords.words[maskedWords.length++] = carry;
- }
-
- if (this.length === 0) {
- this.words[0] = 0;
- this.length = 1;
- }
-
- return this._strip();
- };
-
- BN.prototype.ishrn = function ishrn (bits, hint, extended) {
- // TODO(indutny): implement me
- assert(this.negative === 0);
- return this.iushrn(bits, hint, extended);
- };
-
- // Shift-left
- BN.prototype.shln = function shln (bits) {
- return this.clone().ishln(bits);
- };
-
- BN.prototype.ushln = function ushln (bits) {
- return this.clone().iushln(bits);
- };
-
- // Shift-right
- BN.prototype.shrn = function shrn (bits) {
- return this.clone().ishrn(bits);
- };
-
- BN.prototype.ushrn = function ushrn (bits) {
- return this.clone().iushrn(bits);
- };
-
- // Test if n bit is set
- BN.prototype.testn = function testn (bit) {
- assert(typeof bit === 'number' && bit >= 0);
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
-
- // Fast case: bit is much higher than all existing words
- if (this.length <= s) return false;
-
- // Check bit and return
- var w = this.words[s];
-
- return !!(w & q);
- };
-
- // Return only lowers bits of number (in-place)
- BN.prototype.imaskn = function imaskn (bits) {
- assert(typeof bits === 'number' && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
-
- assert(this.negative === 0, 'imaskn works only with positive numbers');
-
- if (this.length <= s) {
- return this;
- }
-
- if (r !== 0) {
- s++;
- }
- this.length = Math.min(s, this.length);
-
- if (r !== 0) {
- var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
- this.words[this.length - 1] &= mask;
- }
-
- return this._strip();
- };
-
- // Return only lowers bits of number
- BN.prototype.maskn = function maskn (bits) {
- return this.clone().imaskn(bits);
- };
-
- // Add plain number `num` to `this`
- BN.prototype.iaddn = function iaddn (num) {
- assert(typeof num === 'number');
- assert(num < 0x4000000);
- if (num < 0) return this.isubn(-num);
-
- // Possible sign change
- if (this.negative !== 0) {
- if (this.length === 1 && (this.words[0] | 0) <= num) {
- this.words[0] = num - (this.words[0] | 0);
- this.negative = 0;
- return this;
- }
-
- this.negative = 0;
- this.isubn(num);
- this.negative = 1;
- return this;
- }
-
- // Add without checks
- return this._iaddn(num);
- };
-
- BN.prototype._iaddn = function _iaddn (num) {
- this.words[0] += num;
-
- // Carry
- for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {
- this.words[i] -= 0x4000000;
- if (i === this.length - 1) {
- this.words[i + 1] = 1;
- } else {
- this.words[i + 1]++;
- }
- }
- this.length = Math.max(this.length, i + 1);
-
- return this;
- };
-
- // Subtract plain number `num` from `this`
- BN.prototype.isubn = function isubn (num) {
- assert(typeof num === 'number');
- assert(num < 0x4000000);
- if (num < 0) return this.iaddn(-num);
-
- if (this.negative !== 0) {
- this.negative = 0;
- this.iaddn(num);
- this.negative = 1;
- return this;
- }
-
- this.words[0] -= num;
-
- if (this.length === 1 && this.words[0] < 0) {
- this.words[0] = -this.words[0];
- this.negative = 1;
- } else {
- // Carry
- for (var i = 0; i < this.length && this.words[i] < 0; i++) {
- this.words[i] += 0x4000000;
- this.words[i + 1] -= 1;
- }
- }
-
- return this._strip();
- };
-
- BN.prototype.addn = function addn (num) {
- return this.clone().iaddn(num);
- };
-
- BN.prototype.subn = function subn (num) {
- return this.clone().isubn(num);
- };
-
- BN.prototype.iabs = function iabs () {
- this.negative = 0;
-
- return this;
- };
-
- BN.prototype.abs = function abs () {
- return this.clone().iabs();
- };
-
- BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {
- var len = num.length + shift;
- var i;
-
- this._expand(len);
-
- var w;
- var carry = 0;
- for (i = 0; i < num.length; i++) {
- w = (this.words[i + shift] | 0) + carry;
- var right = (num.words[i] | 0) * mul;
- w -= right & 0x3ffffff;
- carry = (w >> 26) - ((right / 0x4000000) | 0);
- this.words[i + shift] = w & 0x3ffffff;
- }
- for (; i < this.length - shift; i++) {
- w = (this.words[i + shift] | 0) + carry;
- carry = w >> 26;
- this.words[i + shift] = w & 0x3ffffff;
- }
-
- if (carry === 0) return this._strip();
-
- // Subtraction overflow
- assert(carry === -1);
- carry = 0;
- for (i = 0; i < this.length; i++) {
- w = -(this.words[i] | 0) + carry;
- carry = w >> 26;
- this.words[i] = w & 0x3ffffff;
- }
- this.negative = 1;
-
- return this._strip();
- };
-
- BN.prototype._wordDiv = function _wordDiv (num, mode) {
- var shift = this.length - num.length;
-
- var a = this.clone();
- var b = num;
-
- // Normalize
- var bhi = b.words[b.length - 1] | 0;
- var bhiBits = this._countBits(bhi);
- shift = 26 - bhiBits;
- if (shift !== 0) {
- b = b.ushln(shift);
- a.iushln(shift);
- bhi = b.words[b.length - 1] | 0;
- }
-
- // Initialize quotient
- var m = a.length - b.length;
- var q;
-
- if (mode !== 'mod') {
- q = new BN(null);
- q.length = m + 1;
- q.words = new Array(q.length);
- for (var i = 0; i < q.length; i++) {
- q.words[i] = 0;
- }
- }
-
- var diff = a.clone()._ishlnsubmul(b, 1, m);
- if (diff.negative === 0) {
- a = diff;
- if (q) {
- q.words[m] = 1;
- }
- }
-
- for (var j = m - 1; j >= 0; j--) {
- var qj = (a.words[b.length + j] | 0) * 0x4000000 +
- (a.words[b.length + j - 1] | 0);
-
- // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max
- // (0x7ffffff)
- qj = Math.min((qj / bhi) | 0, 0x3ffffff);
-
- a._ishlnsubmul(b, qj, j);
- while (a.negative !== 0) {
- qj--;
- a.negative = 0;
- a._ishlnsubmul(b, 1, j);
- if (!a.isZero()) {
- a.negative ^= 1;
- }
- }
- if (q) {
- q.words[j] = qj;
- }
- }
- if (q) {
- q._strip();
- }
- a._strip();
-
- // Denormalize
- if (mode !== 'div' && shift !== 0) {
- a.iushrn(shift);
- }
-
- return {
- div: q || null,
- mod: a
- };
- };
-
- // NOTE: 1) `mode` can be set to `mod` to request mod only,
- // to `div` to request div only, or be absent to
- // request both div & mod
- // 2) `positive` is true if unsigned mod is requested
- BN.prototype.divmod = function divmod (num, mode, positive) {
- assert(!num.isZero());
-
- if (this.isZero()) {
- return {
- div: new BN(0),
- mod: new BN(0)
- };
- }
-
- var div, mod, res;
- if (this.negative !== 0 && num.negative === 0) {
- res = this.neg().divmod(num, mode);
-
- if (mode !== 'mod') {
- div = res.div.neg();
- }
-
- if (mode !== 'div') {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.iadd(num);
- }
- }
-
- return {
- div: div,
- mod: mod
- };
- }
-
- if (this.negative === 0 && num.negative !== 0) {
- res = this.divmod(num.neg(), mode);
-
- if (mode !== 'mod') {
- div = res.div.neg();
- }
-
- return {
- div: div,
- mod: res.mod
- };
- }
-
- if ((this.negative & num.negative) !== 0) {
- res = this.neg().divmod(num.neg(), mode);
-
- if (mode !== 'div') {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.isub(num);
- }
- }
-
- return {
- div: res.div,
- mod: mod
- };
- }
-
- // Both numbers are positive at this point
-
- // Strip both numbers to approximate shift value
- if (num.length > this.length || this.cmp(num) < 0) {
- return {
- div: new BN(0),
- mod: this
- };
- }
-
- // Very short reduction
- if (num.length === 1) {
- if (mode === 'div') {
- return {
- div: this.divn(num.words[0]),
- mod: null
- };
- }
-
- if (mode === 'mod') {
- return {
- div: null,
- mod: new BN(this.modrn(num.words[0]))
- };
- }
-
- return {
- div: this.divn(num.words[0]),
- mod: new BN(this.modrn(num.words[0]))
- };
- }
-
- return this._wordDiv(num, mode);
- };
-
- // Find `this` / `num`
- BN.prototype.div = function div (num) {
- return this.divmod(num, 'div', false).div;
- };
-
- // Find `this` % `num`
- BN.prototype.mod = function mod (num) {
- return this.divmod(num, 'mod', false).mod;
- };
-
- BN.prototype.umod = function umod (num) {
- return this.divmod(num, 'mod', true).mod;
- };
-
- // Find Round(`this` / `num`)
- BN.prototype.divRound = function divRound (num) {
- var dm = this.divmod(num);
-
- // Fast case - exact division
- if (dm.mod.isZero()) return dm.div;
-
- var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
-
- var half = num.ushrn(1);
- var r2 = num.andln(1);
- var cmp = mod.cmp(half);
-
- // Round down
- if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;
-
- // Round up
- return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
- };
-
- BN.prototype.modrn = function modrn (num) {
- var isNegNum = num < 0;
- if (isNegNum) num = -num;
-
- assert(num <= 0x3ffffff);
- var p = (1 << 26) % num;
-
- var acc = 0;
- for (var i = this.length - 1; i >= 0; i--) {
- acc = (p * acc + (this.words[i] | 0)) % num;
- }
-
- return isNegNum ? -acc : acc;
- };
-
- // WARNING: DEPRECATED
- BN.prototype.modn = function modn (num) {
- return this.modrn(num);
- };
-
- // In-place division by number
- BN.prototype.idivn = function idivn (num) {
- var isNegNum = num < 0;
- if (isNegNum) num = -num;
-
- assert(num <= 0x3ffffff);
-
- var carry = 0;
- for (var i = this.length - 1; i >= 0; i--) {
- var w = (this.words[i] | 0) + carry * 0x4000000;
- this.words[i] = (w / num) | 0;
- carry = w % num;
- }
-
- this._strip();
- return isNegNum ? this.ineg() : this;
- };
-
- BN.prototype.divn = function divn (num) {
- return this.clone().idivn(num);
- };
-
- BN.prototype.egcd = function egcd (p) {
- assert(p.negative === 0);
- assert(!p.isZero());
-
- var x = this;
- var y = p.clone();
-
- if (x.negative !== 0) {
- x = x.umod(p);
- } else {
- x = x.clone();
- }
-
- // A * x + B * y = x
- var A = new BN(1);
- var B = new BN(0);
-
- // C * x + D * y = y
- var C = new BN(0);
- var D = new BN(1);
-
- var g = 0;
-
- while (x.isEven() && y.isEven()) {
- x.iushrn(1);
- y.iushrn(1);
- ++g;
- }
-
- var yp = y.clone();
- var xp = x.clone();
-
- while (!x.isZero()) {
- for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
- if (i > 0) {
- x.iushrn(i);
- while (i-- > 0) {
- if (A.isOdd() || B.isOdd()) {
- A.iadd(yp);
- B.isub(xp);
- }
-
- A.iushrn(1);
- B.iushrn(1);
- }
- }
-
- for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
- if (j > 0) {
- y.iushrn(j);
- while (j-- > 0) {
- if (C.isOdd() || D.isOdd()) {
- C.iadd(yp);
- D.isub(xp);
- }
-
- C.iushrn(1);
- D.iushrn(1);
- }
- }
-
- if (x.cmp(y) >= 0) {
- x.isub(y);
- A.isub(C);
- B.isub(D);
- } else {
- y.isub(x);
- C.isub(A);
- D.isub(B);
- }
- }
-
- return {
- a: C,
- b: D,
- gcd: y.iushln(g)
- };
- };
-
- // This is reduced incarnation of the binary EEA
- // above, designated to invert members of the
- // _prime_ fields F(p) at a maximal speed
- BN.prototype._invmp = function _invmp (p) {
- assert(p.negative === 0);
- assert(!p.isZero());
-
- var a = this;
- var b = p.clone();
-
- if (a.negative !== 0) {
- a = a.umod(p);
- } else {
- a = a.clone();
- }
-
- var x1 = new BN(1);
- var x2 = new BN(0);
-
- var delta = b.clone();
-
- while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
- for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
- if (i > 0) {
- a.iushrn(i);
- while (i-- > 0) {
- if (x1.isOdd()) {
- x1.iadd(delta);
- }
-
- x1.iushrn(1);
- }
- }
-
- for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
- if (j > 0) {
- b.iushrn(j);
- while (j-- > 0) {
- if (x2.isOdd()) {
- x2.iadd(delta);
- }
-
- x2.iushrn(1);
- }
- }
-
- if (a.cmp(b) >= 0) {
- a.isub(b);
- x1.isub(x2);
- } else {
- b.isub(a);
- x2.isub(x1);
- }
- }
-
- var res;
- if (a.cmpn(1) === 0) {
- res = x1;
- } else {
- res = x2;
- }
-
- if (res.cmpn(0) < 0) {
- res.iadd(p);
- }
-
- return res;
- };
-
- BN.prototype.gcd = function gcd (num) {
- if (this.isZero()) return num.abs();
- if (num.isZero()) return this.abs();
-
- var a = this.clone();
- var b = num.clone();
- a.negative = 0;
- b.negative = 0;
-
- // Remove common factor of two
- for (var shift = 0; a.isEven() && b.isEven(); shift++) {
- a.iushrn(1);
- b.iushrn(1);
- }
-
- do {
- while (a.isEven()) {
- a.iushrn(1);
- }
- while (b.isEven()) {
- b.iushrn(1);
- }
-
- var r = a.cmp(b);
- if (r < 0) {
- // Swap `a` and `b` to make `a` always bigger than `b`
- var t = a;
- a = b;
- b = t;
- } else if (r === 0 || b.cmpn(1) === 0) {
- break;
- }
-
- a.isub(b);
- } while (true);
-
- return b.iushln(shift);
- };
-
- // Invert number in the field F(num)
- BN.prototype.invm = function invm (num) {
- return this.egcd(num).a.umod(num);
- };
-
- BN.prototype.isEven = function isEven () {
- return (this.words[0] & 1) === 0;
- };
-
- BN.prototype.isOdd = function isOdd () {
- return (this.words[0] & 1) === 1;
- };
-
- // And first word and num
- BN.prototype.andln = function andln (num) {
- return this.words[0] & num;
- };
-
- // Increment at the bit position in-line
- BN.prototype.bincn = function bincn (bit) {
- assert(typeof bit === 'number');
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
-
- // Fast case: bit is much higher than all existing words
- if (this.length <= s) {
- this._expand(s + 1);
- this.words[s] |= q;
- return this;
- }
-
- // Add bit and propagate, if needed
- var carry = q;
- for (var i = s; carry !== 0 && i < this.length; i++) {
- var w = this.words[i] | 0;
- w += carry;
- carry = w >>> 26;
- w &= 0x3ffffff;
- this.words[i] = w;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- return this;
- };
-
- BN.prototype.isZero = function isZero () {
- return this.length === 1 && this.words[0] === 0;
- };
-
- BN.prototype.cmpn = function cmpn (num) {
- var negative = num < 0;
-
- if (this.negative !== 0 && !negative) return -1;
- if (this.negative === 0 && negative) return 1;
-
- this._strip();
-
- var res;
- if (this.length > 1) {
- res = 1;
- } else {
- if (negative) {
- num = -num;
- }
-
- assert(num <= 0x3ffffff, 'Number is too big');
-
- var w = this.words[0] | 0;
- res = w === num ? 0 : w < num ? -1 : 1;
- }
- if (this.negative !== 0) return -res | 0;
- return res;
- };
-
- // Compare two numbers and return:
- // 1 - if `this` > `num`
- // 0 - if `this` == `num`
- // -1 - if `this` < `num`
- BN.prototype.cmp = function cmp (num) {
- if (this.negative !== 0 && num.negative === 0) return -1;
- if (this.negative === 0 && num.negative !== 0) return 1;
-
- var res = this.ucmp(num);
- if (this.negative !== 0) return -res | 0;
- return res;
- };
-
- // Unsigned comparison
- BN.prototype.ucmp = function ucmp (num) {
- // At this point both numbers have the same sign
- if (this.length > num.length) return 1;
- if (this.length < num.length) return -1;
-
- var res = 0;
- for (var i = this.length - 1; i >= 0; i--) {
- var a = this.words[i] | 0;
- var b = num.words[i] | 0;
-
- if (a === b) continue;
- if (a < b) {
- res = -1;
- } else if (a > b) {
- res = 1;
- }
- break;
- }
- return res;
- };
-
- BN.prototype.gtn = function gtn (num) {
- return this.cmpn(num) === 1;
- };
-
- BN.prototype.gt = function gt (num) {
- return this.cmp(num) === 1;
- };
-
- BN.prototype.gten = function gten (num) {
- return this.cmpn(num) >= 0;
- };
-
- BN.prototype.gte = function gte (num) {
- return this.cmp(num) >= 0;
- };
-
- BN.prototype.ltn = function ltn (num) {
- return this.cmpn(num) === -1;
- };
-
- BN.prototype.lt = function lt (num) {
- return this.cmp(num) === -1;
- };
-
- BN.prototype.lten = function lten (num) {
- return this.cmpn(num) <= 0;
- };
-
- BN.prototype.lte = function lte (num) {
- return this.cmp(num) <= 0;
- };
-
- BN.prototype.eqn = function eqn (num) {
- return this.cmpn(num) === 0;
- };
-
- BN.prototype.eq = function eq (num) {
- return this.cmp(num) === 0;
- };
-
- //
- // A reduce context, could be using montgomery or something better, depending
- // on the `m` itself.
- //
- BN.red = function red (num) {
- return new Red(num);
- };
-
- BN.prototype.toRed = function toRed (ctx) {
- assert(!this.red, 'Already a number in reduction context');
- assert(this.negative === 0, 'red works only with positives');
- return ctx.convertTo(this)._forceRed(ctx);
- };
-
- BN.prototype.fromRed = function fromRed () {
- assert(this.red, 'fromRed works only with numbers in reduction context');
- return this.red.convertFrom(this);
- };
-
- BN.prototype._forceRed = function _forceRed (ctx) {
- this.red = ctx;
- return this;
- };
-
- BN.prototype.forceRed = function forceRed (ctx) {
- assert(!this.red, 'Already a number in reduction context');
- return this._forceRed(ctx);
- };
-
- BN.prototype.redAdd = function redAdd (num) {
- assert(this.red, 'redAdd works only with red numbers');
- return this.red.add(this, num);
- };
-
- BN.prototype.redIAdd = function redIAdd (num) {
- assert(this.red, 'redIAdd works only with red numbers');
- return this.red.iadd(this, num);
- };
-
- BN.prototype.redSub = function redSub (num) {
- assert(this.red, 'redSub works only with red numbers');
- return this.red.sub(this, num);
- };
-
- BN.prototype.redISub = function redISub (num) {
- assert(this.red, 'redISub works only with red numbers');
- return this.red.isub(this, num);
- };
-
- BN.prototype.redShl = function redShl (num) {
- assert(this.red, 'redShl works only with red numbers');
- return this.red.shl(this, num);
- };
-
- BN.prototype.redMul = function redMul (num) {
- assert(this.red, 'redMul works only with red numbers');
- this.red._verify2(this, num);
- return this.red.mul(this, num);
- };
-
- BN.prototype.redIMul = function redIMul (num) {
- assert(this.red, 'redMul works only with red numbers');
- this.red._verify2(this, num);
- return this.red.imul(this, num);
- };
-
- BN.prototype.redSqr = function redSqr () {
- assert(this.red, 'redSqr works only with red numbers');
- this.red._verify1(this);
- return this.red.sqr(this);
- };
-
- BN.prototype.redISqr = function redISqr () {
- assert(this.red, 'redISqr works only with red numbers');
- this.red._verify1(this);
- return this.red.isqr(this);
- };
-
- // Square root over p
- BN.prototype.redSqrt = function redSqrt () {
- assert(this.red, 'redSqrt works only with red numbers');
- this.red._verify1(this);
- return this.red.sqrt(this);
- };
-
- BN.prototype.redInvm = function redInvm () {
- assert(this.red, 'redInvm works only with red numbers');
- this.red._verify1(this);
- return this.red.invm(this);
- };
-
- // Return negative clone of `this` % `red modulo`
- BN.prototype.redNeg = function redNeg () {
- assert(this.red, 'redNeg works only with red numbers');
- this.red._verify1(this);
- return this.red.neg(this);
- };
-
- BN.prototype.redPow = function redPow (num) {
- assert(this.red && !num.red, 'redPow(normalNum)');
- this.red._verify1(this);
- return this.red.pow(this, num);
- };
-
- // Prime numbers with efficient reduction
- var primes = {
- k256: null,
- p224: null,
- p192: null,
- p25519: null
- };
-
- // Pseudo-Mersenne prime
- function MPrime (name, p) {
- // P = 2 ^ N - K
- this.name = name;
- this.p = new BN(p, 16);
- this.n = this.p.bitLength();
- this.k = new BN(1).iushln(this.n).isub(this.p);
-
- this.tmp = this._tmp();
- }
-
- MPrime.prototype._tmp = function _tmp () {
- var tmp = new BN(null);
- tmp.words = new Array(Math.ceil(this.n / 13));
- return tmp;
- };
-
- MPrime.prototype.ireduce = function ireduce (num) {
- // Assumes that `num` is less than `P^2`
- // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)
- var r = num;
- var rlen;
-
- do {
- this.split(r, this.tmp);
- r = this.imulK(r);
- r = r.iadd(this.tmp);
- rlen = r.bitLength();
- } while (rlen > this.n);
-
- var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
- if (cmp === 0) {
- r.words[0] = 0;
- r.length = 1;
- } else if (cmp > 0) {
- r.isub(this.p);
- } else {
- if (r.strip !== undefined) {
- // r is a BN v4 instance
- r.strip();
- } else {
- // r is a BN v5 instance
- r._strip();
- }
- }
-
- return r;
- };
-
- MPrime.prototype.split = function split (input, out) {
- input.iushrn(this.n, 0, out);
- };
-
- MPrime.prototype.imulK = function imulK (num) {
- return num.imul(this.k);
- };
-
- function K256 () {
- MPrime.call(
- this,
- 'k256',
- 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');
- }
- inherits(K256, MPrime);
-
- K256.prototype.split = function split (input, output) {
- // 256 = 9 * 26 + 22
- var mask = 0x3fffff;
-
- var outLen = Math.min(input.length, 9);
- for (var i = 0; i < outLen; i++) {
- output.words[i] = input.words[i];
- }
- output.length = outLen;
-
- if (input.length <= 9) {
- input.words[0] = 0;
- input.length = 1;
- return;
- }
-
- // Shift by 9 limbs
- var prev = input.words[9];
- output.words[output.length++] = prev & mask;
-
- for (i = 10; i < input.length; i++) {
- var next = input.words[i] | 0;
- input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);
- prev = next;
- }
- prev >>>= 22;
- input.words[i - 10] = prev;
- if (prev === 0 && input.length > 10) {
- input.length -= 10;
- } else {
- input.length -= 9;
- }
- };
-
- K256.prototype.imulK = function imulK (num) {
- // K = 0x1000003d1 = [ 0x40, 0x3d1 ]
- num.words[num.length] = 0;
- num.words[num.length + 1] = 0;
- num.length += 2;
-
- // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390
- var lo = 0;
- for (var i = 0; i < num.length; i++) {
- var w = num.words[i] | 0;
- lo += w * 0x3d1;
- num.words[i] = lo & 0x3ffffff;
- lo = w * 0x40 + ((lo / 0x4000000) | 0);
- }
-
- // Fast length reduction
- if (num.words[num.length - 1] === 0) {
- num.length--;
- if (num.words[num.length - 1] === 0) {
- num.length--;
- }
- }
- return num;
- };
-
- function P224 () {
- MPrime.call(
- this,
- 'p224',
- 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');
- }
- inherits(P224, MPrime);
-
- function P192 () {
- MPrime.call(
- this,
- 'p192',
- 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');
- }
- inherits(P192, MPrime);
-
- function P25519 () {
- // 2 ^ 255 - 19
- MPrime.call(
- this,
- '25519',
- '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');
- }
- inherits(P25519, MPrime);
-
- P25519.prototype.imulK = function imulK (num) {
- // K = 0x13
- var carry = 0;
- for (var i = 0; i < num.length; i++) {
- var hi = (num.words[i] | 0) * 0x13 + carry;
- var lo = hi & 0x3ffffff;
- hi >>>= 26;
-
- num.words[i] = lo;
- carry = hi;
- }
- if (carry !== 0) {
- num.words[num.length++] = carry;
- }
- return num;
- };
-
- // Exported mostly for testing purposes, use plain name instead
- BN._prime = function prime (name) {
- // Cached version of prime
- if (primes[name]) return primes[name];
-
- var prime;
- if (name === 'k256') {
- prime = new K256();
- } else if (name === 'p224') {
- prime = new P224();
- } else if (name === 'p192') {
- prime = new P192();
- } else if (name === 'p25519') {
- prime = new P25519();
- } else {
- throw new Error('Unknown prime ' + name);
- }
- primes[name] = prime;
-
- return prime;
- };
-
- //
- // Base reduction engine
- //
- function Red (m) {
- if (typeof m === 'string') {
- var prime = BN._prime(m);
- this.m = prime.p;
- this.prime = prime;
- } else {
- assert(m.gtn(1), 'modulus must be greater than 1');
- this.m = m;
- this.prime = null;
- }
- }
-
- Red.prototype._verify1 = function _verify1 (a) {
- assert(a.negative === 0, 'red works only with positives');
- assert(a.red, 'red works only with red numbers');
- };
-
- Red.prototype._verify2 = function _verify2 (a, b) {
- assert((a.negative | b.negative) === 0, 'red works only with positives');
- assert(a.red && a.red === b.red,
- 'red works only with red numbers');
- };
-
- Red.prototype.imod = function imod (a) {
- if (this.prime) return this.prime.ireduce(a)._forceRed(this);
-
- move(a, a.umod(this.m)._forceRed(this));
- return a;
- };
-
- Red.prototype.neg = function neg (a) {
- if (a.isZero()) {
- return a.clone();
- }
-
- return this.m.sub(a)._forceRed(this);
- };
-
- Red.prototype.add = function add (a, b) {
- this._verify2(a, b);
-
- var res = a.add(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res._forceRed(this);
- };
-
- Red.prototype.iadd = function iadd (a, b) {
- this._verify2(a, b);
-
- var res = a.iadd(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res;
- };
-
- Red.prototype.sub = function sub (a, b) {
- this._verify2(a, b);
-
- var res = a.sub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res._forceRed(this);
- };
-
- Red.prototype.isub = function isub (a, b) {
- this._verify2(a, b);
-
- var res = a.isub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res;
- };
-
- Red.prototype.shl = function shl (a, num) {
- this._verify1(a);
- return this.imod(a.ushln(num));
- };
-
- Red.prototype.imul = function imul (a, b) {
- this._verify2(a, b);
- return this.imod(a.imul(b));
- };
-
- Red.prototype.mul = function mul (a, b) {
- this._verify2(a, b);
- return this.imod(a.mul(b));
- };
-
- Red.prototype.isqr = function isqr (a) {
- return this.imul(a, a.clone());
- };
-
- Red.prototype.sqr = function sqr (a) {
- return this.mul(a, a);
- };
-
- Red.prototype.sqrt = function sqrt (a) {
- if (a.isZero()) return a.clone();
-
- var mod3 = this.m.andln(3);
- assert(mod3 % 2 === 1);
-
- // Fast case
- if (mod3 === 3) {
- var pow = this.m.add(new BN(1)).iushrn(2);
- return this.pow(a, pow);
- }
-
- // Tonelli-Shanks algorithm (Totally unoptimized and slow)
- //
- // Find Q and S, that Q * 2 ^ S = (P - 1)
- var q = this.m.subn(1);
- var s = 0;
- while (!q.isZero() && q.andln(1) === 0) {
- s++;
- q.iushrn(1);
- }
- assert(!q.isZero());
-
- var one = new BN(1).toRed(this);
- var nOne = one.redNeg();
-
- // Find quadratic non-residue
- // NOTE: Max is such because of generalized Riemann hypothesis.
- var lpow = this.m.subn(1).iushrn(1);
- var z = this.m.bitLength();
- z = new BN(2 * z * z).toRed(this);
-
- while (this.pow(z, lpow).cmp(nOne) !== 0) {
- z.redIAdd(nOne);
- }
-
- var c = this.pow(z, q);
- var r = this.pow(a, q.addn(1).iushrn(1));
- var t = this.pow(a, q);
- var m = s;
- while (t.cmp(one) !== 0) {
- var tmp = t;
- for (var i = 0; tmp.cmp(one) !== 0; i++) {
- tmp = tmp.redSqr();
- }
- assert(i < m);
- var b = this.pow(c, new BN(1).iushln(m - i - 1));
-
- r = r.redMul(b);
- c = b.redSqr();
- t = t.redMul(c);
- m = i;
- }
-
- return r;
- };
-
- Red.prototype.invm = function invm (a) {
- var inv = a._invmp(this.m);
- if (inv.negative !== 0) {
- inv.negative = 0;
- return this.imod(inv).redNeg();
- } else {
- return this.imod(inv);
- }
- };
-
- Red.prototype.pow = function pow (a, num) {
- if (num.isZero()) return new BN(1).toRed(this);
- if (num.cmpn(1) === 0) return a.clone();
-
- var windowSize = 4;
- var wnd = new Array(1 << windowSize);
- wnd[0] = new BN(1).toRed(this);
- wnd[1] = a;
- for (var i = 2; i < wnd.length; i++) {
- wnd[i] = this.mul(wnd[i - 1], a);
- }
-
- var res = wnd[0];
- var current = 0;
- var currentLen = 0;
- var start = num.bitLength() % 26;
- if (start === 0) {
- start = 26;
- }
-
- for (i = num.length - 1; i >= 0; i--) {
- var word = num.words[i];
- for (var j = start - 1; j >= 0; j--) {
- var bit = (word >> j) & 1;
- if (res !== wnd[0]) {
- res = this.sqr(res);
- }
-
- if (bit === 0 && current === 0) {
- currentLen = 0;
- continue;
- }
-
- current <<= 1;
- current |= bit;
- currentLen++;
- if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;
-
- res = this.mul(res, wnd[current]);
- currentLen = 0;
- current = 0;
- }
- start = 26;
- }
-
- return res;
- };
-
- Red.prototype.convertTo = function convertTo (num) {
- var r = num.umod(this.m);
-
- return r === num ? r.clone() : r;
- };
-
- Red.prototype.convertFrom = function convertFrom (num) {
- var res = num.clone();
- res.red = null;
- return res;
- };
-
- //
- // Montgomery method engine
- //
-
- BN.mont = function mont (num) {
- return new Mont(num);
- };
-
- function Mont (m) {
- Red.call(this, m);
-
- this.shift = this.m.bitLength();
- if (this.shift % 26 !== 0) {
- this.shift += 26 - (this.shift % 26);
- }
-
- this.r = new BN(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);
- }
- inherits(Mont, Red);
-
- Mont.prototype.convertTo = function convertTo (num) {
- return this.imod(num.ushln(this.shift));
- };
-
- Mont.prototype.convertFrom = function convertFrom (num) {
- var r = this.imod(num.mul(this.rinv));
- r.red = null;
- return r;
- };
-
- Mont.prototype.imul = function imul (a, b) {
- if (a.isZero() || b.isZero()) {
- a.words[0] = 0;
- a.length = 1;
- return a;
- }
-
- var t = a.imul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
-
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
-
- return res._forceRed(this);
- };
-
- Mont.prototype.mul = function mul (a, b) {
- if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);
-
- var t = a.mul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
-
- return res._forceRed(this);
- };
-
- Mont.prototype.invm = function invm (a) {
- // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R
- var res = this.imod(a._invmp(this.m).mul(this.r2));
- return res._forceRed(this);
- };
-})(typeof module === 'undefined' || module, this);
-
-},{"buffer":37}],37:[function(require,module,exports){
-
-},{}],38:[function(require,module,exports){
-(function (Buffer){(function (){
-/*!
- * The buffer module from node.js, for the browser.
- *
- * @author Feross Aboukhadijeh
- * @license MIT
- */
-/* eslint-disable no-proto */
-
-'use strict'
-
-var base64 = require('base64-js')
-var ieee754 = require('ieee754')
-
-exports.Buffer = Buffer
-exports.SlowBuffer = SlowBuffer
-exports.INSPECT_MAX_BYTES = 50
-
-var K_MAX_LENGTH = 0x7fffffff
-exports.kMaxLength = K_MAX_LENGTH
-
-/**
- * If `Buffer.TYPED_ARRAY_SUPPORT`:
- * === true Use Uint8Array implementation (fastest)
- * === false Print warning and recommend using `buffer` v4.x which has an Object
- * implementation (most compatible, even IE6)
- *
- * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
- * Opera 11.6+, iOS 4.2+.
- *
- * We report that the browser does not support typed arrays if the are not subclassable
- * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
- * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
- * for __proto__ and has a buggy typed array implementation.
- */
-Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
-
-if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
- typeof console.error === 'function') {
- console.error(
- 'This browser lacks typed array (Uint8Array) support which is required by ' +
- '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
- )
-}
-
-function typedArraySupport () {
- // Can typed array instances can be augmented?
- try {
- var arr = new Uint8Array(1)
- arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }
- return arr.foo() === 42
- } catch (e) {
- return false
- }
-}
-
-Object.defineProperty(Buffer.prototype, 'parent', {
- enumerable: true,
- get: function () {
- if (!Buffer.isBuffer(this)) return undefined
- return this.buffer
- }
-})
-
-Object.defineProperty(Buffer.prototype, 'offset', {
- enumerable: true,
- get: function () {
- if (!Buffer.isBuffer(this)) return undefined
- return this.byteOffset
- }
-})
-
-function createBuffer (length) {
- if (length > K_MAX_LENGTH) {
- throw new RangeError('The value "' + length + '" is invalid for option "size"')
- }
- // Return an augmented `Uint8Array` instance
- var buf = new Uint8Array(length)
- buf.__proto__ = Buffer.prototype
- return buf
-}
-
-/**
- * The Buffer constructor returns instances of `Uint8Array` that have their
- * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
- * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
- * and the `Uint8Array` methods. Square bracket notation works as expected -- it
- * returns a single octet.
- *
- * The `Uint8Array` prototype remains unmodified.
- */
-
-function Buffer (arg, encodingOrOffset, length) {
- // Common case.
- if (typeof arg === 'number') {
- if (typeof encodingOrOffset === 'string') {
- throw new TypeError(
- 'The "string" argument must be of type string. Received type number'
- )
- }
- return allocUnsafe(arg)
- }
- return from(arg, encodingOrOffset, length)
-}
-
-// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
-if (typeof Symbol !== 'undefined' && Symbol.species != null &&
- Buffer[Symbol.species] === Buffer) {
- Object.defineProperty(Buffer, Symbol.species, {
- value: null,
- configurable: true,
- enumerable: false,
- writable: false
- })
-}
-
-Buffer.poolSize = 8192 // not used by this implementation
-
-function from (value, encodingOrOffset, length) {
- if (typeof value === 'string') {
- return fromString(value, encodingOrOffset)
- }
-
- if (ArrayBuffer.isView(value)) {
- return fromArrayLike(value)
- }
-
- if (value == null) {
- throw TypeError(
- 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
- 'or Array-like Object. Received type ' + (typeof value)
- )
- }
-
- if (isInstance(value, ArrayBuffer) ||
- (value && isInstance(value.buffer, ArrayBuffer))) {
- return fromArrayBuffer(value, encodingOrOffset, length)
- }
-
- if (typeof value === 'number') {
- throw new TypeError(
- 'The "value" argument must not be of type number. Received type number'
- )
- }
-
- var valueOf = value.valueOf && value.valueOf()
- if (valueOf != null && valueOf !== value) {
- return Buffer.from(valueOf, encodingOrOffset, length)
- }
-
- var b = fromObject(value)
- if (b) return b
-
- if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
- typeof value[Symbol.toPrimitive] === 'function') {
- return Buffer.from(
- value[Symbol.toPrimitive]('string'), encodingOrOffset, length
- )
- }
-
- throw new TypeError(
- 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
- 'or Array-like Object. Received type ' + (typeof value)
- )
-}
-
-/**
- * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
- * if value is a number.
- * Buffer.from(str[, encoding])
- * Buffer.from(array)
- * Buffer.from(buffer)
- * Buffer.from(arrayBuffer[, byteOffset[, length]])
- **/
-Buffer.from = function (value, encodingOrOffset, length) {
- return from(value, encodingOrOffset, length)
-}
-
-// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
-// https://github.com/feross/buffer/pull/148
-Buffer.prototype.__proto__ = Uint8Array.prototype
-Buffer.__proto__ = Uint8Array
-
-function assertSize (size) {
- if (typeof size !== 'number') {
- throw new TypeError('"size" argument must be of type number')
- } else if (size < 0) {
- throw new RangeError('The value "' + size + '" is invalid for option "size"')
- }
-}
-
-function alloc (size, fill, encoding) {
- assertSize(size)
- if (size <= 0) {
- return createBuffer(size)
- }
- if (fill !== undefined) {
- // Only pay attention to encoding if it's a string. This
- // prevents accidentally sending in a number that would
- // be interpretted as a start offset.
- return typeof encoding === 'string'
- ? createBuffer(size).fill(fill, encoding)
- : createBuffer(size).fill(fill)
- }
- return createBuffer(size)
-}
-
-/**
- * Creates a new filled Buffer instance.
- * alloc(size[, fill[, encoding]])
- **/
-Buffer.alloc = function (size, fill, encoding) {
- return alloc(size, fill, encoding)
-}
-
-function allocUnsafe (size) {
- assertSize(size)
- return createBuffer(size < 0 ? 0 : checked(size) | 0)
-}
-
-/**
- * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
- * */
-Buffer.allocUnsafe = function (size) {
- return allocUnsafe(size)
-}
-/**
- * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
- */
-Buffer.allocUnsafeSlow = function (size) {
- return allocUnsafe(size)
-}
-
-function fromString (string, encoding) {
- if (typeof encoding !== 'string' || encoding === '') {
- encoding = 'utf8'
- }
-
- if (!Buffer.isEncoding(encoding)) {
- throw new TypeError('Unknown encoding: ' + encoding)
- }
-
- var length = byteLength(string, encoding) | 0
- var buf = createBuffer(length)
-
- var actual = buf.write(string, encoding)
-
- if (actual !== length) {
- // Writing a hex string, for example, that contains invalid characters will
- // cause everything after the first invalid character to be ignored. (e.g.
- // 'abxxcd' will be treated as 'ab')
- buf = buf.slice(0, actual)
- }
-
- return buf
-}
-
-function fromArrayLike (array) {
- var length = array.length < 0 ? 0 : checked(array.length) | 0
- var buf = createBuffer(length)
- for (var i = 0; i < length; i += 1) {
- buf[i] = array[i] & 255
- }
- return buf
-}
-
-function fromArrayBuffer (array, byteOffset, length) {
- if (byteOffset < 0 || array.byteLength < byteOffset) {
- throw new RangeError('"offset" is outside of buffer bounds')
- }
-
- if (array.byteLength < byteOffset + (length || 0)) {
- throw new RangeError('"length" is outside of buffer bounds')
- }
-
- var buf
- if (byteOffset === undefined && length === undefined) {
- buf = new Uint8Array(array)
- } else if (length === undefined) {
- buf = new Uint8Array(array, byteOffset)
- } else {
- buf = new Uint8Array(array, byteOffset, length)
- }
-
- // Return an augmented `Uint8Array` instance
- buf.__proto__ = Buffer.prototype
- return buf
-}
-
-function fromObject (obj) {
- if (Buffer.isBuffer(obj)) {
- var len = checked(obj.length) | 0
- var buf = createBuffer(len)
-
- if (buf.length === 0) {
- return buf
- }
-
- obj.copy(buf, 0, 0, len)
- return buf
- }
-
- if (obj.length !== undefined) {
- if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
- return createBuffer(0)
- }
- return fromArrayLike(obj)
- }
-
- if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
- return fromArrayLike(obj.data)
- }
-}
-
-function checked (length) {
- // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
- // length is NaN (which is otherwise coerced to zero.)
- if (length >= K_MAX_LENGTH) {
- throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
- 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
- }
- return length | 0
-}
-
-function SlowBuffer (length) {
- if (+length != length) { // eslint-disable-line eqeqeq
- length = 0
- }
- return Buffer.alloc(+length)
-}
-
-Buffer.isBuffer = function isBuffer (b) {
- return b != null && b._isBuffer === true &&
- b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
-}
-
-Buffer.compare = function compare (a, b) {
- if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
- if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
- if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
- throw new TypeError(
- 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
- )
- }
-
- if (a === b) return 0
-
- var x = a.length
- var y = b.length
-
- for (var i = 0, len = Math.min(x, y); i < len; ++i) {
- if (a[i] !== b[i]) {
- x = a[i]
- y = b[i]
- break
- }
- }
-
- if (x < y) return -1
- if (y < x) return 1
- return 0
-}
-
-Buffer.isEncoding = function isEncoding (encoding) {
- switch (String(encoding).toLowerCase()) {
- case 'hex':
- case 'utf8':
- case 'utf-8':
- case 'ascii':
- case 'latin1':
- case 'binary':
- case 'base64':
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return true
- default:
- return false
- }
-}
-
-Buffer.concat = function concat (list, length) {
- if (!Array.isArray(list)) {
- throw new TypeError('"list" argument must be an Array of Buffers')
- }
-
- if (list.length === 0) {
- return Buffer.alloc(0)
- }
-
- var i
- if (length === undefined) {
- length = 0
- for (i = 0; i < list.length; ++i) {
- length += list[i].length
- }
- }
-
- var buffer = Buffer.allocUnsafe(length)
- var pos = 0
- for (i = 0; i < list.length; ++i) {
- var buf = list[i]
- if (isInstance(buf, Uint8Array)) {
- buf = Buffer.from(buf)
- }
- if (!Buffer.isBuffer(buf)) {
- throw new TypeError('"list" argument must be an Array of Buffers')
- }
- buf.copy(buffer, pos)
- pos += buf.length
- }
- return buffer
-}
-
-function byteLength (string, encoding) {
- if (Buffer.isBuffer(string)) {
- return string.length
- }
- if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
- return string.byteLength
- }
- if (typeof string !== 'string') {
- throw new TypeError(
- 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
- 'Received type ' + typeof string
- )
- }
-
- var len = string.length
- var mustMatch = (arguments.length > 2 && arguments[2] === true)
- if (!mustMatch && len === 0) return 0
-
- // Use a for loop to avoid recursion
- var loweredCase = false
- for (;;) {
- switch (encoding) {
- case 'ascii':
- case 'latin1':
- case 'binary':
- return len
- case 'utf8':
- case 'utf-8':
- return utf8ToBytes(string).length
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return len * 2
- case 'hex':
- return len >>> 1
- case 'base64':
- return base64ToBytes(string).length
- default:
- if (loweredCase) {
- return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
- }
- encoding = ('' + encoding).toLowerCase()
- loweredCase = true
- }
- }
-}
-Buffer.byteLength = byteLength
-
-function slowToString (encoding, start, end) {
- var loweredCase = false
-
- // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
- // property of a typed array.
-
- // This behaves neither like String nor Uint8Array in that we set start/end
- // to their upper/lower bounds if the value passed is out of range.
- // undefined is handled specially as per ECMA-262 6th Edition,
- // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
- if (start === undefined || start < 0) {
- start = 0
- }
- // Return early if start > this.length. Done here to prevent potential uint32
- // coercion fail below.
- if (start > this.length) {
- return ''
- }
-
- if (end === undefined || end > this.length) {
- end = this.length
- }
-
- if (end <= 0) {
- return ''
- }
-
- // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
- end >>>= 0
- start >>>= 0
-
- if (end <= start) {
- return ''
- }
-
- if (!encoding) encoding = 'utf8'
-
- while (true) {
- switch (encoding) {
- case 'hex':
- return hexSlice(this, start, end)
-
- case 'utf8':
- case 'utf-8':
- return utf8Slice(this, start, end)
-
- case 'ascii':
- return asciiSlice(this, start, end)
-
- case 'latin1':
- case 'binary':
- return latin1Slice(this, start, end)
-
- case 'base64':
- return base64Slice(this, start, end)
-
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return utf16leSlice(this, start, end)
-
- default:
- if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
- encoding = (encoding + '').toLowerCase()
- loweredCase = true
- }
- }
-}
-
-// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
-// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
-// reliably in a browserify context because there could be multiple different
-// copies of the 'buffer' package in use. This method works even for Buffer
-// instances that were created from another copy of the `buffer` package.
-// See: https://github.com/feross/buffer/issues/154
-Buffer.prototype._isBuffer = true
-
-function swap (b, n, m) {
- var i = b[n]
- b[n] = b[m]
- b[m] = i
-}
-
-Buffer.prototype.swap16 = function swap16 () {
- var len = this.length
- if (len % 2 !== 0) {
- throw new RangeError('Buffer size must be a multiple of 16-bits')
- }
- for (var i = 0; i < len; i += 2) {
- swap(this, i, i + 1)
- }
- return this
-}
-
-Buffer.prototype.swap32 = function swap32 () {
- var len = this.length
- if (len % 4 !== 0) {
- throw new RangeError('Buffer size must be a multiple of 32-bits')
- }
- for (var i = 0; i < len; i += 4) {
- swap(this, i, i + 3)
- swap(this, i + 1, i + 2)
- }
- return this
-}
-
-Buffer.prototype.swap64 = function swap64 () {
- var len = this.length
- if (len % 8 !== 0) {
- throw new RangeError('Buffer size must be a multiple of 64-bits')
- }
- for (var i = 0; i < len; i += 8) {
- swap(this, i, i + 7)
- swap(this, i + 1, i + 6)
- swap(this, i + 2, i + 5)
- swap(this, i + 3, i + 4)
- }
- return this
-}
-
-Buffer.prototype.toString = function toString () {
- var length = this.length
- if (length === 0) return ''
- if (arguments.length === 0) return utf8Slice(this, 0, length)
- return slowToString.apply(this, arguments)
-}
-
-Buffer.prototype.toLocaleString = Buffer.prototype.toString
-
-Buffer.prototype.equals = function equals (b) {
- if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
- if (this === b) return true
- return Buffer.compare(this, b) === 0
-}
-
-Buffer.prototype.inspect = function inspect () {
- var str = ''
- var max = exports.INSPECT_MAX_BYTES
- str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
- if (this.length > max) str += ' ... '
- return ''
-}
-
-Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
- if (isInstance(target, Uint8Array)) {
- target = Buffer.from(target, target.offset, target.byteLength)
- }
- if (!Buffer.isBuffer(target)) {
- throw new TypeError(
- 'The "target" argument must be one of type Buffer or Uint8Array. ' +
- 'Received type ' + (typeof target)
- )
- }
-
- if (start === undefined) {
- start = 0
- }
- if (end === undefined) {
- end = target ? target.length : 0
- }
- if (thisStart === undefined) {
- thisStart = 0
- }
- if (thisEnd === undefined) {
- thisEnd = this.length
- }
-
- if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
- throw new RangeError('out of range index')
- }
-
- if (thisStart >= thisEnd && start >= end) {
- return 0
- }
- if (thisStart >= thisEnd) {
- return -1
- }
- if (start >= end) {
- return 1
- }
-
- start >>>= 0
- end >>>= 0
- thisStart >>>= 0
- thisEnd >>>= 0
-
- if (this === target) return 0
-
- var x = thisEnd - thisStart
- var y = end - start
- var len = Math.min(x, y)
-
- var thisCopy = this.slice(thisStart, thisEnd)
- var targetCopy = target.slice(start, end)
-
- for (var i = 0; i < len; ++i) {
- if (thisCopy[i] !== targetCopy[i]) {
- x = thisCopy[i]
- y = targetCopy[i]
- break
- }
- }
-
- if (x < y) return -1
- if (y < x) return 1
- return 0
-}
-
-// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
-// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
-//
-// Arguments:
-// - buffer - a Buffer to search
-// - val - a string, Buffer, or number
-// - byteOffset - an index into `buffer`; will be clamped to an int32
-// - encoding - an optional encoding, relevant is val is a string
-// - dir - true for indexOf, false for lastIndexOf
-function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
- // Empty buffer means no match
- if (buffer.length === 0) return -1
-
- // Normalize byteOffset
- if (typeof byteOffset === 'string') {
- encoding = byteOffset
- byteOffset = 0
- } else if (byteOffset > 0x7fffffff) {
- byteOffset = 0x7fffffff
- } else if (byteOffset < -0x80000000) {
- byteOffset = -0x80000000
- }
- byteOffset = +byteOffset // Coerce to Number.
- if (numberIsNaN(byteOffset)) {
- // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
- byteOffset = dir ? 0 : (buffer.length - 1)
- }
-
- // Normalize byteOffset: negative offsets start from the end of the buffer
- if (byteOffset < 0) byteOffset = buffer.length + byteOffset
- if (byteOffset >= buffer.length) {
- if (dir) return -1
- else byteOffset = buffer.length - 1
- } else if (byteOffset < 0) {
- if (dir) byteOffset = 0
- else return -1
- }
-
- // Normalize val
- if (typeof val === 'string') {
- val = Buffer.from(val, encoding)
- }
-
- // Finally, search either indexOf (if dir is true) or lastIndexOf
- if (Buffer.isBuffer(val)) {
- // Special case: looking for empty string/buffer always fails
- if (val.length === 0) {
- return -1
- }
- return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
- } else if (typeof val === 'number') {
- val = val & 0xFF // Search for a byte value [0-255]
- if (typeof Uint8Array.prototype.indexOf === 'function') {
- if (dir) {
- return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
- } else {
- return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
- }
- }
- return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
- }
-
- throw new TypeError('val must be string, number or Buffer')
-}
-
-function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
- var indexSize = 1
- var arrLength = arr.length
- var valLength = val.length
-
- if (encoding !== undefined) {
- encoding = String(encoding).toLowerCase()
- if (encoding === 'ucs2' || encoding === 'ucs-2' ||
- encoding === 'utf16le' || encoding === 'utf-16le') {
- if (arr.length < 2 || val.length < 2) {
- return -1
- }
- indexSize = 2
- arrLength /= 2
- valLength /= 2
- byteOffset /= 2
- }
- }
-
- function read (buf, i) {
- if (indexSize === 1) {
- return buf[i]
- } else {
- return buf.readUInt16BE(i * indexSize)
- }
- }
-
- var i
- if (dir) {
- var foundIndex = -1
- for (i = byteOffset; i < arrLength; i++) {
- if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
- if (foundIndex === -1) foundIndex = i
- if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
- } else {
- if (foundIndex !== -1) i -= i - foundIndex
- foundIndex = -1
- }
- }
- } else {
- if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
- for (i = byteOffset; i >= 0; i--) {
- var found = true
- for (var j = 0; j < valLength; j++) {
- if (read(arr, i + j) !== read(val, j)) {
- found = false
- break
- }
- }
- if (found) return i
- }
- }
-
- return -1
-}
-
-Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
- return this.indexOf(val, byteOffset, encoding) !== -1
-}
-
-Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
- return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
-}
-
-Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
- return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
-}
-
-function hexWrite (buf, string, offset, length) {
- offset = Number(offset) || 0
- var remaining = buf.length - offset
- if (!length) {
- length = remaining
- } else {
- length = Number(length)
- if (length > remaining) {
- length = remaining
- }
- }
-
- var strLen = string.length
-
- if (length > strLen / 2) {
- length = strLen / 2
- }
- for (var i = 0; i < length; ++i) {
- var parsed = parseInt(string.substr(i * 2, 2), 16)
- if (numberIsNaN(parsed)) return i
- buf[offset + i] = parsed
- }
- return i
-}
-
-function utf8Write (buf, string, offset, length) {
- return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-function asciiWrite (buf, string, offset, length) {
- return blitBuffer(asciiToBytes(string), buf, offset, length)
-}
-
-function latin1Write (buf, string, offset, length) {
- return asciiWrite(buf, string, offset, length)
-}
-
-function base64Write (buf, string, offset, length) {
- return blitBuffer(base64ToBytes(string), buf, offset, length)
-}
-
-function ucs2Write (buf, string, offset, length) {
- return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-Buffer.prototype.write = function write (string, offset, length, encoding) {
- // Buffer#write(string)
- if (offset === undefined) {
- encoding = 'utf8'
- length = this.length
- offset = 0
- // Buffer#write(string, encoding)
- } else if (length === undefined && typeof offset === 'string') {
- encoding = offset
- length = this.length
- offset = 0
- // Buffer#write(string, offset[, length][, encoding])
- } else if (isFinite(offset)) {
- offset = offset >>> 0
- if (isFinite(length)) {
- length = length >>> 0
- if (encoding === undefined) encoding = 'utf8'
- } else {
- encoding = length
- length = undefined
- }
- } else {
- throw new Error(
- 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
- )
- }
-
- var remaining = this.length - offset
- if (length === undefined || length > remaining) length = remaining
-
- if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
- throw new RangeError('Attempt to write outside buffer bounds')
- }
-
- if (!encoding) encoding = 'utf8'
-
- var loweredCase = false
- for (;;) {
- switch (encoding) {
- case 'hex':
- return hexWrite(this, string, offset, length)
-
- case 'utf8':
- case 'utf-8':
- return utf8Write(this, string, offset, length)
-
- case 'ascii':
- return asciiWrite(this, string, offset, length)
-
- case 'latin1':
- case 'binary':
- return latin1Write(this, string, offset, length)
-
- case 'base64':
- // Warning: maxLength not taken into account in base64Write
- return base64Write(this, string, offset, length)
-
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return ucs2Write(this, string, offset, length)
-
- default:
- if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
- encoding = ('' + encoding).toLowerCase()
- loweredCase = true
- }
- }
-}
-
-Buffer.prototype.toJSON = function toJSON () {
- return {
- type: 'Buffer',
- data: Array.prototype.slice.call(this._arr || this, 0)
- }
-}
-
-function base64Slice (buf, start, end) {
- if (start === 0 && end === buf.length) {
- return base64.fromByteArray(buf)
- } else {
- return base64.fromByteArray(buf.slice(start, end))
- }
-}
-
-function utf8Slice (buf, start, end) {
- end = Math.min(buf.length, end)
- var res = []
-
- var i = start
- while (i < end) {
- var firstByte = buf[i]
- var codePoint = null
- var bytesPerSequence = (firstByte > 0xEF) ? 4
- : (firstByte > 0xDF) ? 3
- : (firstByte > 0xBF) ? 2
- : 1
-
- if (i + bytesPerSequence <= end) {
- var secondByte, thirdByte, fourthByte, tempCodePoint
-
- switch (bytesPerSequence) {
- case 1:
- if (firstByte < 0x80) {
- codePoint = firstByte
- }
- break
- case 2:
- secondByte = buf[i + 1]
- if ((secondByte & 0xC0) === 0x80) {
- tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
- if (tempCodePoint > 0x7F) {
- codePoint = tempCodePoint
- }
- }
- break
- case 3:
- secondByte = buf[i + 1]
- thirdByte = buf[i + 2]
- if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
- tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
- if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
- codePoint = tempCodePoint
- }
- }
- break
- case 4:
- secondByte = buf[i + 1]
- thirdByte = buf[i + 2]
- fourthByte = buf[i + 3]
- if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
- tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
- if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
- codePoint = tempCodePoint
- }
- }
- }
- }
-
- if (codePoint === null) {
- // we did not generate a valid codePoint so insert a
- // replacement char (U+FFFD) and advance only 1 byte
- codePoint = 0xFFFD
- bytesPerSequence = 1
- } else if (codePoint > 0xFFFF) {
- // encode to utf16 (surrogate pair dance)
- codePoint -= 0x10000
- res.push(codePoint >>> 10 & 0x3FF | 0xD800)
- codePoint = 0xDC00 | codePoint & 0x3FF
- }
-
- res.push(codePoint)
- i += bytesPerSequence
- }
-
- return decodeCodePointsArray(res)
-}
-
-// Based on http://stackoverflow.com/a/22747272/680742, the browser with
-// the lowest limit is Chrome, with 0x10000 args.
-// We go 1 magnitude less, for safety
-var MAX_ARGUMENTS_LENGTH = 0x1000
-
-function decodeCodePointsArray (codePoints) {
- var len = codePoints.length
- if (len <= MAX_ARGUMENTS_LENGTH) {
- return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
- }
-
- // Decode in chunks to avoid "call stack size exceeded".
- var res = ''
- var i = 0
- while (i < len) {
- res += String.fromCharCode.apply(
- String,
- codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
- )
- }
- return res
-}
-
-function asciiSlice (buf, start, end) {
- var ret = ''
- end = Math.min(buf.length, end)
-
- for (var i = start; i < end; ++i) {
- ret += String.fromCharCode(buf[i] & 0x7F)
- }
- return ret
-}
-
-function latin1Slice (buf, start, end) {
- var ret = ''
- end = Math.min(buf.length, end)
-
- for (var i = start; i < end; ++i) {
- ret += String.fromCharCode(buf[i])
- }
- return ret
-}
-
-function hexSlice (buf, start, end) {
- var len = buf.length
-
- if (!start || start < 0) start = 0
- if (!end || end < 0 || end > len) end = len
-
- var out = ''
- for (var i = start; i < end; ++i) {
- out += toHex(buf[i])
- }
- return out
-}
-
-function utf16leSlice (buf, start, end) {
- var bytes = buf.slice(start, end)
- var res = ''
- for (var i = 0; i < bytes.length; i += 2) {
- res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
- }
- return res
-}
-
-Buffer.prototype.slice = function slice (start, end) {
- var len = this.length
- start = ~~start
- end = end === undefined ? len : ~~end
-
- if (start < 0) {
- start += len
- if (start < 0) start = 0
- } else if (start > len) {
- start = len
- }
-
- if (end < 0) {
- end += len
- if (end < 0) end = 0
- } else if (end > len) {
- end = len
- }
-
- if (end < start) end = start
-
- var newBuf = this.subarray(start, end)
- // Return an augmented `Uint8Array` instance
- newBuf.__proto__ = Buffer.prototype
- return newBuf
-}
-
-/*
- * Need to make sure that buffer isn't trying to write out of bounds.
- */
-function checkOffset (offset, ext, length) {
- if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
- if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
-}
-
-Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
- offset = offset >>> 0
- byteLength = byteLength >>> 0
- if (!noAssert) checkOffset(offset, byteLength, this.length)
-
- var val = this[offset]
- var mul = 1
- var i = 0
- while (++i < byteLength && (mul *= 0x100)) {
- val += this[offset + i] * mul
- }
-
- return val
-}
-
-Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
- offset = offset >>> 0
- byteLength = byteLength >>> 0
- if (!noAssert) {
- checkOffset(offset, byteLength, this.length)
- }
-
- var val = this[offset + --byteLength]
- var mul = 1
- while (byteLength > 0 && (mul *= 0x100)) {
- val += this[offset + --byteLength] * mul
- }
-
- return val
-}
-
-Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 1, this.length)
- return this[offset]
-}
-
-Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 2, this.length)
- return this[offset] | (this[offset + 1] << 8)
-}
-
-Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 2, this.length)
- return (this[offset] << 8) | this[offset + 1]
-}
-
-Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 4, this.length)
-
- return ((this[offset]) |
- (this[offset + 1] << 8) |
- (this[offset + 2] << 16)) +
- (this[offset + 3] * 0x1000000)
-}
-
-Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 4, this.length)
-
- return (this[offset] * 0x1000000) +
- ((this[offset + 1] << 16) |
- (this[offset + 2] << 8) |
- this[offset + 3])
-}
-
-Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
- offset = offset >>> 0
- byteLength = byteLength >>> 0
- if (!noAssert) checkOffset(offset, byteLength, this.length)
-
- var val = this[offset]
- var mul = 1
- var i = 0
- while (++i < byteLength && (mul *= 0x100)) {
- val += this[offset + i] * mul
- }
- mul *= 0x80
-
- if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
- return val
-}
-
-Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
- offset = offset >>> 0
- byteLength = byteLength >>> 0
- if (!noAssert) checkOffset(offset, byteLength, this.length)
-
- var i = byteLength
- var mul = 1
- var val = this[offset + --i]
- while (i > 0 && (mul *= 0x100)) {
- val += this[offset + --i] * mul
- }
- mul *= 0x80
-
- if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
- return val
-}
-
-Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 1, this.length)
- if (!(this[offset] & 0x80)) return (this[offset])
- return ((0xff - this[offset] + 1) * -1)
-}
-
-Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 2, this.length)
- var val = this[offset] | (this[offset + 1] << 8)
- return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 2, this.length)
- var val = this[offset + 1] | (this[offset] << 8)
- return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 4, this.length)
-
- return (this[offset]) |
- (this[offset + 1] << 8) |
- (this[offset + 2] << 16) |
- (this[offset + 3] << 24)
-}
-
-Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 4, this.length)
-
- return (this[offset] << 24) |
- (this[offset + 1] << 16) |
- (this[offset + 2] << 8) |
- (this[offset + 3])
-}
-
-Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 4, this.length)
- return ieee754.read(this, offset, true, 23, 4)
-}
-
-Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 4, this.length)
- return ieee754.read(this, offset, false, 23, 4)
-}
-
-Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 8, this.length)
- return ieee754.read(this, offset, true, 52, 8)
-}
-
-Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
- offset = offset >>> 0
- if (!noAssert) checkOffset(offset, 8, this.length)
- return ieee754.read(this, offset, false, 52, 8)
-}
-
-function checkInt (buf, value, offset, ext, max, min) {
- if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
- if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
- if (offset + ext > buf.length) throw new RangeError('Index out of range')
-}
-
-Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset >>> 0
- byteLength = byteLength >>> 0
- if (!noAssert) {
- var maxBytes = Math.pow(2, 8 * byteLength) - 1
- checkInt(this, value, offset, byteLength, maxBytes, 0)
- }
-
- var mul = 1
- var i = 0
- this[offset] = value & 0xFF
- while (++i < byteLength && (mul *= 0x100)) {
- this[offset + i] = (value / mul) & 0xFF
- }
-
- return offset + byteLength
-}
-
-Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset >>> 0
- byteLength = byteLength >>> 0
- if (!noAssert) {
- var maxBytes = Math.pow(2, 8 * byteLength) - 1
- checkInt(this, value, offset, byteLength, maxBytes, 0)
- }
-
- var i = byteLength - 1
- var mul = 1
- this[offset + i] = value & 0xFF
- while (--i >= 0 && (mul *= 0x100)) {
- this[offset + i] = (value / mul) & 0xFF
- }
-
- return offset + byteLength
-}
-
-Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
- this[offset] = (value & 0xff)
- return offset + 1
-}
-
-Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
- this[offset] = (value & 0xff)
- this[offset + 1] = (value >>> 8)
- return offset + 2
-}
-
-Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
- this[offset] = (value >>> 8)
- this[offset + 1] = (value & 0xff)
- return offset + 2
-}
-
-Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
- this[offset + 3] = (value >>> 24)
- this[offset + 2] = (value >>> 16)
- this[offset + 1] = (value >>> 8)
- this[offset] = (value & 0xff)
- return offset + 4
-}
-
-Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
- this[offset] = (value >>> 24)
- this[offset + 1] = (value >>> 16)
- this[offset + 2] = (value >>> 8)
- this[offset + 3] = (value & 0xff)
- return offset + 4
-}
-
-Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) {
- var limit = Math.pow(2, (8 * byteLength) - 1)
-
- checkInt(this, value, offset, byteLength, limit - 1, -limit)
- }
-
- var i = 0
- var mul = 1
- var sub = 0
- this[offset] = value & 0xFF
- while (++i < byteLength && (mul *= 0x100)) {
- if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
- sub = 1
- }
- this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
- }
-
- return offset + byteLength
-}
-
-Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) {
- var limit = Math.pow(2, (8 * byteLength) - 1)
-
- checkInt(this, value, offset, byteLength, limit - 1, -limit)
- }
-
- var i = byteLength - 1
- var mul = 1
- var sub = 0
- this[offset + i] = value & 0xFF
- while (--i >= 0 && (mul *= 0x100)) {
- if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
- sub = 1
- }
- this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
- }
-
- return offset + byteLength
-}
-
-Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
- if (value < 0) value = 0xff + value + 1
- this[offset] = (value & 0xff)
- return offset + 1
-}
-
-Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
- this[offset] = (value & 0xff)
- this[offset + 1] = (value >>> 8)
- return offset + 2
-}
-
-Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
- this[offset] = (value >>> 8)
- this[offset + 1] = (value & 0xff)
- return offset + 2
-}
-
-Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
- this[offset] = (value & 0xff)
- this[offset + 1] = (value >>> 8)
- this[offset + 2] = (value >>> 16)
- this[offset + 3] = (value >>> 24)
- return offset + 4
-}
-
-Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
- if (value < 0) value = 0xffffffff + value + 1
- this[offset] = (value >>> 24)
- this[offset + 1] = (value >>> 16)
- this[offset + 2] = (value >>> 8)
- this[offset + 3] = (value & 0xff)
- return offset + 4
-}
-
-function checkIEEE754 (buf, value, offset, ext, max, min) {
- if (offset + ext > buf.length) throw new RangeError('Index out of range')
- if (offset < 0) throw new RangeError('Index out of range')
-}
-
-function writeFloat (buf, value, offset, littleEndian, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) {
- checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
- }
- ieee754.write(buf, value, offset, littleEndian, 23, 4)
- return offset + 4
-}
-
-Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
- return writeFloat(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
- return writeFloat(this, value, offset, false, noAssert)
-}
-
-function writeDouble (buf, value, offset, littleEndian, noAssert) {
- value = +value
- offset = offset >>> 0
- if (!noAssert) {
- checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
- }
- ieee754.write(buf, value, offset, littleEndian, 52, 8)
- return offset + 8
-}
-
-Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
- return writeDouble(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
- return writeDouble(this, value, offset, false, noAssert)
-}
-
-// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
-Buffer.prototype.copy = function copy (target, targetStart, start, end) {
- if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
- if (!start) start = 0
- if (!end && end !== 0) end = this.length
- if (targetStart >= target.length) targetStart = target.length
- if (!targetStart) targetStart = 0
- if (end > 0 && end < start) end = start
-
- // Copy 0 bytes; we're done
- if (end === start) return 0
- if (target.length === 0 || this.length === 0) return 0
-
- // Fatal error conditions
- if (targetStart < 0) {
- throw new RangeError('targetStart out of bounds')
- }
- if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
- if (end < 0) throw new RangeError('sourceEnd out of bounds')
-
- // Are we oob?
- if (end > this.length) end = this.length
- if (target.length - targetStart < end - start) {
- end = target.length - targetStart + start
- }
-
- var len = end - start
-
- if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
- // Use built-in when available, missing from IE11
- this.copyWithin(targetStart, start, end)
- } else if (this === target && start < targetStart && targetStart < end) {
- // descending copy from end
- for (var i = len - 1; i >= 0; --i) {
- target[i + targetStart] = this[i + start]
- }
- } else {
- Uint8Array.prototype.set.call(
- target,
- this.subarray(start, end),
- targetStart
- )
- }
-
- return len
-}
-
-// Usage:
-// buffer.fill(number[, offset[, end]])
-// buffer.fill(buffer[, offset[, end]])
-// buffer.fill(string[, offset[, end]][, encoding])
-Buffer.prototype.fill = function fill (val, start, end, encoding) {
- // Handle string cases:
- if (typeof val === 'string') {
- if (typeof start === 'string') {
- encoding = start
- start = 0
- end = this.length
- } else if (typeof end === 'string') {
- encoding = end
- end = this.length
- }
- if (encoding !== undefined && typeof encoding !== 'string') {
- throw new TypeError('encoding must be a string')
- }
- if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
- throw new TypeError('Unknown encoding: ' + encoding)
- }
- if (val.length === 1) {
- var code = val.charCodeAt(0)
- if ((encoding === 'utf8' && code < 128) ||
- encoding === 'latin1') {
- // Fast path: If `val` fits into a single byte, use that numeric value.
- val = code
- }
- }
- } else if (typeof val === 'number') {
- val = val & 255
- }
-
- // Invalid ranges are not set to a default, so can range check early.
- if (start < 0 || this.length < start || this.length < end) {
- throw new RangeError('Out of range index')
- }
-
- if (end <= start) {
- return this
- }
-
- start = start >>> 0
- end = end === undefined ? this.length : end >>> 0
-
- if (!val) val = 0
-
- var i
- if (typeof val === 'number') {
- for (i = start; i < end; ++i) {
- this[i] = val
- }
- } else {
- var bytes = Buffer.isBuffer(val)
- ? val
- : Buffer.from(val, encoding)
- var len = bytes.length
- if (len === 0) {
- throw new TypeError('The value "' + val +
- '" is invalid for argument "value"')
- }
- for (i = 0; i < end - start; ++i) {
- this[i + start] = bytes[i % len]
- }
- }
-
- return this
-}
-
-// HELPER FUNCTIONS
-// ================
-
-var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
-
-function base64clean (str) {
- // Node takes equal signs as end of the Base64 encoding
- str = str.split('=')[0]
- // Node strips out invalid characters like \n and \t from the string, base64-js does not
- str = str.trim().replace(INVALID_BASE64_RE, '')
- // Node converts strings with length < 2 to ''
- if (str.length < 2) return ''
- // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
- while (str.length % 4 !== 0) {
- str = str + '='
- }
- return str
-}
-
-function toHex (n) {
- if (n < 16) return '0' + n.toString(16)
- return n.toString(16)
-}
-
-function utf8ToBytes (string, units) {
- units = units || Infinity
- var codePoint
- var length = string.length
- var leadSurrogate = null
- var bytes = []
-
- for (var i = 0; i < length; ++i) {
- codePoint = string.charCodeAt(i)
-
- // is surrogate component
- if (codePoint > 0xD7FF && codePoint < 0xE000) {
- // last char was a lead
- if (!leadSurrogate) {
- // no lead yet
- if (codePoint > 0xDBFF) {
- // unexpected trail
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- continue
- } else if (i + 1 === length) {
- // unpaired lead
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- continue
- }
-
- // valid lead
- leadSurrogate = codePoint
-
- continue
- }
-
- // 2 leads in a row
- if (codePoint < 0xDC00) {
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- leadSurrogate = codePoint
- continue
- }
-
- // valid surrogate pair
- codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
- } else if (leadSurrogate) {
- // valid bmp char, but last char was a lead
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- }
-
- leadSurrogate = null
-
- // encode utf8
- if (codePoint < 0x80) {
- if ((units -= 1) < 0) break
- bytes.push(codePoint)
- } else if (codePoint < 0x800) {
- if ((units -= 2) < 0) break
- bytes.push(
- codePoint >> 0x6 | 0xC0,
- codePoint & 0x3F | 0x80
- )
- } else if (codePoint < 0x10000) {
- if ((units -= 3) < 0) break
- bytes.push(
- codePoint >> 0xC | 0xE0,
- codePoint >> 0x6 & 0x3F | 0x80,
- codePoint & 0x3F | 0x80
- )
- } else if (codePoint < 0x110000) {
- if ((units -= 4) < 0) break
- bytes.push(
- codePoint >> 0x12 | 0xF0,
- codePoint >> 0xC & 0x3F | 0x80,
- codePoint >> 0x6 & 0x3F | 0x80,
- codePoint & 0x3F | 0x80
- )
- } else {
- throw new Error('Invalid code point')
- }
- }
-
- return bytes
-}
-
-function asciiToBytes (str) {
- var byteArray = []
- for (var i = 0; i < str.length; ++i) {
- // Node's code seems to be doing this and not & 0x7F..
- byteArray.push(str.charCodeAt(i) & 0xFF)
- }
- return byteArray
-}
-
-function utf16leToBytes (str, units) {
- var c, hi, lo
- var byteArray = []
- for (var i = 0; i < str.length; ++i) {
- if ((units -= 2) < 0) break
-
- c = str.charCodeAt(i)
- hi = c >> 8
- lo = c % 256
- byteArray.push(lo)
- byteArray.push(hi)
- }
-
- return byteArray
-}
-
-function base64ToBytes (str) {
- return base64.toByteArray(base64clean(str))
-}
-
-function blitBuffer (src, dst, offset, length) {
- for (var i = 0; i < length; ++i) {
- if ((i + offset >= dst.length) || (i >= src.length)) break
- dst[i + offset] = src[i]
- }
- return i
-}
-
-// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
-// the `instanceof` check but they should be treated as of that type.
-// See: https://github.com/feross/buffer/issues/166
-function isInstance (obj, type) {
- return obj instanceof type ||
- (obj != null && obj.constructor != null && obj.constructor.name != null &&
- obj.constructor.name === type.name)
-}
-function numberIsNaN (obj) {
- // For IE11 support
- return obj !== obj // eslint-disable-line no-self-compare
-}
-
-}).call(this)}).call(this,require("buffer").Buffer)
-},{"base64-js":35,"buffer":38,"ieee754":79}],39:[function(require,module,exports){
-(function (Buffer){(function (){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// NOTE: These type checking functions intentionally don't use `instanceof`
-// because it is fragile and can be easily faked with `Object.create()`.
-
-function isArray(arg) {
- if (Array.isArray) {
- return Array.isArray(arg);
- }
- return objectToString(arg) === '[object Array]';
-}
-exports.isArray = isArray;
-
-function isBoolean(arg) {
- return typeof arg === 'boolean';
-}
-exports.isBoolean = isBoolean;
-
-function isNull(arg) {
- return arg === null;
-}
-exports.isNull = isNull;
-
-function isNullOrUndefined(arg) {
- return arg == null;
-}
-exports.isNullOrUndefined = isNullOrUndefined;
-
-function isNumber(arg) {
- return typeof arg === 'number';
-}
-exports.isNumber = isNumber;
-
-function isString(arg) {
- return typeof arg === 'string';
-}
-exports.isString = isString;
-
-function isSymbol(arg) {
- return typeof arg === 'symbol';
-}
-exports.isSymbol = isSymbol;
-
-function isUndefined(arg) {
- return arg === void 0;
-}
-exports.isUndefined = isUndefined;
-
-function isRegExp(re) {
- return objectToString(re) === '[object RegExp]';
-}
-exports.isRegExp = isRegExp;
-
-function isObject(arg) {
- return typeof arg === 'object' && arg !== null;
-}
-exports.isObject = isObject;
-
-function isDate(d) {
- return objectToString(d) === '[object Date]';
-}
-exports.isDate = isDate;
-
-function isError(e) {
- return (objectToString(e) === '[object Error]' || e instanceof Error);
-}
-exports.isError = isError;
-
-function isFunction(arg) {
- return typeof arg === 'function';
-}
-exports.isFunction = isFunction;
-
-function isPrimitive(arg) {
- return arg === null ||
- typeof arg === 'boolean' ||
- typeof arg === 'number' ||
- typeof arg === 'string' ||
- typeof arg === 'symbol' || // ES6 symbol
- typeof arg === 'undefined';
-}
-exports.isPrimitive = isPrimitive;
-
-exports.isBuffer = Buffer.isBuffer;
-
-function objectToString(o) {
- return Object.prototype.toString.call(o);
-}
-
-}).call(this)}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
-},{"../../is-buffer/index.js":81}],40:[function(require,module,exports){
-(function (process){(function (){
-"use strict";
-var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
- if (ar || !(i in from)) {
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
- ar[i] = from[i];
- }
- }
- return to.concat(ar || Array.prototype.slice.call(from));
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getNodeVersion = exports.detectOS = exports.parseUserAgent = exports.browserName = exports.detect = exports.ReactNativeInfo = exports.BotInfo = exports.SearchBotDeviceInfo = exports.NodeInfo = exports.BrowserInfo = void 0;
-var BrowserInfo = /** @class */ (function () {
- function BrowserInfo(name, version, os) {
- this.name = name;
- this.version = version;
- this.os = os;
- this.type = 'browser';
- }
- return BrowserInfo;
-}());
-exports.BrowserInfo = BrowserInfo;
-var NodeInfo = /** @class */ (function () {
- function NodeInfo(version) {
- this.version = version;
- this.type = 'node';
- this.name = 'node';
- this.os = process.platform;
- }
- return NodeInfo;
-}());
-exports.NodeInfo = NodeInfo;
-var SearchBotDeviceInfo = /** @class */ (function () {
- function SearchBotDeviceInfo(name, version, os, bot) {
- this.name = name;
- this.version = version;
- this.os = os;
- this.bot = bot;
- this.type = 'bot-device';
- }
- return SearchBotDeviceInfo;
-}());
-exports.SearchBotDeviceInfo = SearchBotDeviceInfo;
-var BotInfo = /** @class */ (function () {
- function BotInfo() {
- this.type = 'bot';
- this.bot = true; // NOTE: deprecated test name instead
- this.name = 'bot';
- this.version = null;
- this.os = null;
- }
- return BotInfo;
-}());
-exports.BotInfo = BotInfo;
-var ReactNativeInfo = /** @class */ (function () {
- function ReactNativeInfo() {
- this.type = 'react-native';
- this.name = 'react-native';
- this.version = null;
- this.os = null;
- }
- return ReactNativeInfo;
-}());
-exports.ReactNativeInfo = ReactNativeInfo;
-// tslint:disable-next-line:max-line-length
-var SEARCHBOX_UA_REGEX = /alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/;
-var SEARCHBOT_OS_REGEX = /(nuhk|curl|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\ Jeeves\/Teoma|ia_archiver)/;
-var REQUIRED_VERSION_PARTS = 3;
-var userAgentRules = [
- ['aol', /AOLShield\/([0-9\._]+)/],
- ['edge', /Edge\/([0-9\._]+)/],
- ['edge-ios', /EdgiOS\/([0-9\._]+)/],
- ['yandexbrowser', /YaBrowser\/([0-9\._]+)/],
- ['kakaotalk', /KAKAOTALK\s([0-9\.]+)/],
- ['samsung', /SamsungBrowser\/([0-9\.]+)/],
- ['silk', /\bSilk\/([0-9._-]+)\b/],
- ['miui', /MiuiBrowser\/([0-9\.]+)$/],
- ['beaker', /BeakerBrowser\/([0-9\.]+)/],
- ['edge-chromium', /EdgA?\/([0-9\.]+)/],
- [
- 'chromium-webview',
- /(?!Chrom.*OPR)wv\).*Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/,
- ],
- ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],
- ['phantomjs', /PhantomJS\/([0-9\.]+)(:?\s|$)/],
- ['crios', /CriOS\/([0-9\.]+)(:?\s|$)/],
- ['firefox', /Firefox\/([0-9\.]+)(?:\s|$)/],
- ['fxios', /FxiOS\/([0-9\.]+)/],
- ['opera-mini', /Opera Mini.*Version\/([0-9\.]+)/],
- ['opera', /Opera\/([0-9\.]+)(?:\s|$)/],
- ['opera', /OPR\/([0-9\.]+)(:?\s|$)/],
- ['pie', /^Microsoft Pocket Internet Explorer\/(\d+\.\d+)$/],
- ['pie', /^Mozilla\/\d\.\d+\s\(compatible;\s(?:MSP?IE|MSInternet Explorer) (\d+\.\d+);.*Windows CE.*\)$/],
- ['netfront', /^Mozilla\/\d\.\d+.*NetFront\/(\d.\d)/],
- ['ie', /Trident\/7\.0.*rv\:([0-9\.]+).*\).*Gecko$/],
- ['ie', /MSIE\s([0-9\.]+);.*Trident\/[4-7].0/],
- ['ie', /MSIE\s(7\.0)/],
- ['bb10', /BB10;\sTouch.*Version\/([0-9\.]+)/],
- ['android', /Android\s([0-9\.]+)/],
- ['ios', /Version\/([0-9\._]+).*Mobile.*Safari.*/],
- ['safari', /Version\/([0-9\._]+).*Safari/],
- ['facebook', /FB[AS]V\/([0-9\.]+)/],
- ['instagram', /Instagram\s([0-9\.]+)/],
- ['ios-webview', /AppleWebKit\/([0-9\.]+).*Mobile/],
- ['ios-webview', /AppleWebKit\/([0-9\.]+).*Gecko\)$/],
- ['curl', /^curl\/([0-9\.]+)$/],
- ['searchbot', SEARCHBOX_UA_REGEX],
-];
-var operatingSystemRules = [
- ['iOS', /iP(hone|od|ad)/],
- ['Android OS', /Android/],
- ['BlackBerry OS', /BlackBerry|BB10/],
- ['Windows Mobile', /IEMobile/],
- ['Amazon OS', /Kindle/],
- ['Windows 3.11', /Win16/],
- ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/],
- ['Windows 98', /(Windows 98)|(Win98)/],
- ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/],
- ['Windows XP', /(Windows NT 5.1)|(Windows XP)/],
- ['Windows Server 2003', /(Windows NT 5.2)/],
- ['Windows Vista', /(Windows NT 6.0)/],
- ['Windows 7', /(Windows NT 6.1)/],
- ['Windows 8', /(Windows NT 6.2)/],
- ['Windows 8.1', /(Windows NT 6.3)/],
- ['Windows 10', /(Windows NT 10.0)/],
- ['Windows ME', /Windows ME/],
- ['Windows CE', /Windows CE|WinCE|Microsoft Pocket Internet Explorer/],
- ['Open BSD', /OpenBSD/],
- ['Sun OS', /SunOS/],
- ['Chrome OS', /CrOS/],
- ['Linux', /(Linux)|(X11)/],
- ['Mac OS', /(Mac_PowerPC)|(Macintosh)/],
- ['QNX', /QNX/],
- ['BeOS', /BeOS/],
- ['OS/2', /OS\/2/],
-];
-function detect(userAgent) {
- if (!!userAgent) {
- return parseUserAgent(userAgent);
- }
- if (typeof document === 'undefined' &&
- typeof navigator !== 'undefined' &&
- navigator.product === 'ReactNative') {
- return new ReactNativeInfo();
- }
- if (typeof navigator !== 'undefined') {
- return parseUserAgent(navigator.userAgent);
- }
- return getNodeVersion();
-}
-exports.detect = detect;
-function matchUserAgent(ua) {
- // opted for using reduce here rather than Array#first with a regex.test call
- // this is primarily because using the reduce we only perform the regex
- // execution once rather than once for the test and for the exec again below
- // probably something that needs to be benchmarked though
- return (ua !== '' &&
- userAgentRules.reduce(function (matched, _a) {
- var browser = _a[0], regex = _a[1];
- if (matched) {
- return matched;
- }
- var uaMatch = regex.exec(ua);
- return !!uaMatch && [browser, uaMatch];
- }, false));
-}
-function browserName(ua) {
- var data = matchUserAgent(ua);
- return data ? data[0] : null;
-}
-exports.browserName = browserName;
-function parseUserAgent(ua) {
- var matchedRule = matchUserAgent(ua);
- if (!matchedRule) {
- return null;
- }
- var name = matchedRule[0], match = matchedRule[1];
- if (name === 'searchbot') {
- return new BotInfo();
- }
- // Do not use RegExp for split operation as some browser do not support it (See: http://blog.stevenlevithan.com/archives/cross-browser-split)
- var versionParts = match[1] && match[1].split('.').join('_').split('_').slice(0, 3);
- if (versionParts) {
- if (versionParts.length < REQUIRED_VERSION_PARTS) {
- versionParts = __spreadArray(__spreadArray([], versionParts, true), createVersionParts(REQUIRED_VERSION_PARTS - versionParts.length), true);
- }
- }
- else {
- versionParts = [];
- }
- var version = versionParts.join('.');
- var os = detectOS(ua);
- var searchBotMatch = SEARCHBOT_OS_REGEX.exec(ua);
- if (searchBotMatch && searchBotMatch[1]) {
- return new SearchBotDeviceInfo(name, version, os, searchBotMatch[1]);
- }
- return new BrowserInfo(name, version, os);
-}
-exports.parseUserAgent = parseUserAgent;
-function detectOS(ua) {
- for (var ii = 0, count = operatingSystemRules.length; ii < count; ii++) {
- var _a = operatingSystemRules[ii], os = _a[0], regex = _a[1];
- var match = regex.exec(ua);
- if (match) {
- return os;
- }
- }
- return null;
-}
-exports.detectOS = detectOS;
-function getNodeVersion() {
- var isNode = typeof process !== 'undefined' && process.version;
- return isNode ? new NodeInfo(process.version.slice(1)) : null;
-}
-exports.getNodeVersion = getNodeVersion;
-function createVersionParts(count) {
- var output = [];
- for (var ii = 0; ii < count; ii++) {
- output.push('0');
- }
- return output;
-}
-
-}).call(this)}).call(this,require('_process'))
-},{"_process":101}],41:[function(require,module,exports){
-(function (process){(function (){
-var once = require('once');
-
-var noop = function() {};
-
-var isRequest = function(stream) {
- return stream.setHeader && typeof stream.abort === 'function';
-};
-
-var isChildProcess = function(stream) {
- return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3
-};
-
-var eos = function(stream, opts, callback) {
- if (typeof opts === 'function') return eos(stream, null, opts);
- if (!opts) opts = {};
-
- callback = once(callback || noop);
-
- var ws = stream._writableState;
- var rs = stream._readableState;
- var readable = opts.readable || (opts.readable !== false && stream.readable);
- var writable = opts.writable || (opts.writable !== false && stream.writable);
- var cancelled = false;
-
- var onlegacyfinish = function() {
- if (!stream.writable) onfinish();
- };
-
- var onfinish = function() {
- writable = false;
- if (!readable) callback.call(stream);
- };
-
- var onend = function() {
- readable = false;
- if (!writable) callback.call(stream);
- };
-
- var onexit = function(exitCode) {
- callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);
- };
-
- var onerror = function(err) {
- callback.call(stream, err);
- };
-
- var onclose = function() {
- process.nextTick(onclosenexttick);
- };
-
- var onclosenexttick = function() {
- if (cancelled) return;
- if (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));
- if (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));
- };
-
- var onrequest = function() {
- stream.req.on('finish', onfinish);
- };
-
- if (isRequest(stream)) {
- stream.on('complete', onfinish);
- stream.on('abort', onclose);
- if (stream.req) onrequest();
- else stream.on('request', onrequest);
- } else if (writable && !ws) { // legacy streams
- stream.on('end', onlegacyfinish);
- stream.on('close', onlegacyfinish);
- }
-
- if (isChildProcess(stream)) stream.on('exit', onexit);
-
- stream.on('end', onend);
- stream.on('finish', onfinish);
- if (opts.error !== false) stream.on('error', onerror);
- stream.on('close', onclose);
-
- return function() {
- cancelled = true;
- stream.removeListener('complete', onfinish);
- stream.removeListener('abort', onclose);
- stream.removeListener('request', onrequest);
- if (stream.req) stream.req.removeListener('finish', onfinish);
- stream.removeListener('end', onlegacyfinish);
- stream.removeListener('close', onlegacyfinish);
- stream.removeListener('finish', onfinish);
- stream.removeListener('exit', onexit);
- stream.removeListener('end', onend);
- stream.removeListener('error', onerror);
- stream.removeListener('close', onclose);
- };
-};
-
-module.exports = eos;
-
-}).call(this)}).call(this,require('_process'))
-},{"_process":101,"once":99}],42:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EthereumProviderError = exports.EthereumRpcError = void 0;
-const fast_safe_stringify_1 = require("fast-safe-stringify");
-/**
- * Error subclass implementing JSON RPC 2.0 errors and Ethereum RPC errors
- * per EIP-1474.
- * Permits any integer error code.
- */
-class EthereumRpcError extends Error {
- constructor(code, message, data) {
- if (!Number.isInteger(code)) {
- throw new Error('"code" must be an integer.');
- }
- if (!message || typeof message !== 'string') {
- throw new Error('"message" must be a nonempty string.');
- }
- super(message);
- this.code = code;
- if (data !== undefined) {
- this.data = data;
- }
- }
- /**
- * Returns a plain object with all public class properties.
- */
- serialize() {
- const serialized = {
- code: this.code,
- message: this.message,
- };
- if (this.data !== undefined) {
- serialized.data = this.data;
- }
- if (this.stack) {
- serialized.stack = this.stack;
- }
- return serialized;
- }
- /**
- * Return a string representation of the serialized error, omitting
- * any circular references.
- */
- toString() {
- return fast_safe_stringify_1.default(this.serialize(), stringifyReplacer, 2);
- }
-}
-exports.EthereumRpcError = EthereumRpcError;
-/**
- * Error subclass implementing Ethereum Provider errors per EIP-1193.
- * Permits integer error codes in the [ 1000 <= 4999 ] range.
- */
-class EthereumProviderError extends EthereumRpcError {
- /**
- * Create an Ethereum Provider JSON-RPC error.
- * `code` must be an integer in the 1000 <= 4999 range.
- */
- constructor(code, message, data) {
- if (!isValidEthProviderCode(code)) {
- throw new Error('"code" must be an integer such that: 1000 <= code <= 4999');
- }
- super(code, message, data);
- }
-}
-exports.EthereumProviderError = EthereumProviderError;
-// Internal
-function isValidEthProviderCode(code) {
- return Number.isInteger(code) && code >= 1000 && code <= 4999;
-}
-function stringifyReplacer(_, value) {
- if (value === '[Circular]') {
- return undefined;
- }
- return value;
-}
-
-},{"fast-safe-stringify":78}],43:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.errorValues = exports.errorCodes = void 0;
-exports.errorCodes = {
- rpc: {
- invalidInput: -32000,
- resourceNotFound: -32001,
- resourceUnavailable: -32002,
- transactionRejected: -32003,
- methodNotSupported: -32004,
- limitExceeded: -32005,
- parse: -32700,
- invalidRequest: -32600,
- methodNotFound: -32601,
- invalidParams: -32602,
- internal: -32603,
- },
- provider: {
- userRejectedRequest: 4001,
- unauthorized: 4100,
- unsupportedMethod: 4200,
- disconnected: 4900,
- chainDisconnected: 4901,
- },
-};
-exports.errorValues = {
- '-32700': {
- standard: 'JSON RPC 2.0',
- message: 'Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text.',
- },
- '-32600': {
- standard: 'JSON RPC 2.0',
- message: 'The JSON sent is not a valid Request object.',
- },
- '-32601': {
- standard: 'JSON RPC 2.0',
- message: 'The method does not exist / is not available.',
- },
- '-32602': {
- standard: 'JSON RPC 2.0',
- message: 'Invalid method parameter(s).',
- },
- '-32603': {
- standard: 'JSON RPC 2.0',
- message: 'Internal JSON-RPC error.',
- },
- '-32000': {
- standard: 'EIP-1474',
- message: 'Invalid input.',
- },
- '-32001': {
- standard: 'EIP-1474',
- message: 'Resource not found.',
- },
- '-32002': {
- standard: 'EIP-1474',
- message: 'Resource unavailable.',
- },
- '-32003': {
- standard: 'EIP-1474',
- message: 'Transaction rejected.',
- },
- '-32004': {
- standard: 'EIP-1474',
- message: 'Method not supported.',
- },
- '-32005': {
- standard: 'EIP-1474',
- message: 'Request limit exceeded.',
- },
- '4001': {
- standard: 'EIP-1193',
- message: 'User rejected the request.',
- },
- '4100': {
- standard: 'EIP-1193',
- message: 'The requested account and/or method has not been authorized by the user.',
- },
- '4200': {
- standard: 'EIP-1193',
- message: 'The requested method is not supported by this Ethereum provider.',
- },
- '4900': {
- standard: 'EIP-1193',
- message: 'The provider is disconnected from all chains.',
- },
- '4901': {
- standard: 'EIP-1193',
- message: 'The provider is disconnected from the specified chain.',
- },
-};
-
-},{}],44:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ethErrors = void 0;
-const classes_1 = require("./classes");
-const utils_1 = require("./utils");
-const error_constants_1 = require("./error-constants");
-exports.ethErrors = {
- rpc: {
- /**
- * Get a JSON RPC 2.0 Parse (-32700) error.
- */
- parse: (arg) => getEthJsonRpcError(error_constants_1.errorCodes.rpc.parse, arg),
- /**
- * Get a JSON RPC 2.0 Invalid Request (-32600) error.
- */
- invalidRequest: (arg) => getEthJsonRpcError(error_constants_1.errorCodes.rpc.invalidRequest, arg),
- /**
- * Get a JSON RPC 2.0 Invalid Params (-32602) error.
- */
- invalidParams: (arg) => getEthJsonRpcError(error_constants_1.errorCodes.rpc.invalidParams, arg),
- /**
- * Get a JSON RPC 2.0 Method Not Found (-32601) error.
- */
- methodNotFound: (arg) => getEthJsonRpcError(error_constants_1.errorCodes.rpc.methodNotFound, arg),
- /**
- * Get a JSON RPC 2.0 Internal (-32603) error.
- */
- internal: (arg) => getEthJsonRpcError(error_constants_1.errorCodes.rpc.internal, arg),
- /**
- * Get a JSON RPC 2.0 Server error.
- * Permits integer error codes in the [ -32099 <= -32005 ] range.
- * Codes -32000 through -32004 are reserved by EIP-1474.
- */
- server: (opts) => {
- if (!opts || typeof opts !== 'object' || Array.isArray(opts)) {
- throw new Error('Ethereum RPC Server errors must provide single object argument.');
- }
- const { code } = opts;
- if (!Number.isInteger(code) || code > -32005 || code < -32099) {
- throw new Error('"code" must be an integer such that: -32099 <= code <= -32005');
- }
- return getEthJsonRpcError(code, opts);
- },
- /**
- * Get an Ethereum JSON RPC Invalid Input (-32000) error.
- */
- invalidInput: (arg) => getEthJsonRpcError(error_constants_1.errorCodes.rpc.invalidInput, arg),
- /**
- * Get an Ethereum JSON RPC Resource Not Found (-32001) error.
- */
- resourceNotFound: (arg) => getEthJsonRpcError(error_constants_1.errorCodes.rpc.resourceNotFound, arg),
- /**
- * Get an Ethereum JSON RPC Resource Unavailable (-32002) error.
- */
- resourceUnavailable: (arg) => getEthJsonRpcError(error_constants_1.errorCodes.rpc.resourceUnavailable, arg),
- /**
- * Get an Ethereum JSON RPC Transaction Rejected (-32003) error.
- */
- transactionRejected: (arg) => getEthJsonRpcError(error_constants_1.errorCodes.rpc.transactionRejected, arg),
- /**
- * Get an Ethereum JSON RPC Method Not Supported (-32004) error.
- */
- methodNotSupported: (arg) => getEthJsonRpcError(error_constants_1.errorCodes.rpc.methodNotSupported, arg),
- /**
- * Get an Ethereum JSON RPC Limit Exceeded (-32005) error.
- */
- limitExceeded: (arg) => getEthJsonRpcError(error_constants_1.errorCodes.rpc.limitExceeded, arg),
- },
- provider: {
- /**
- * Get an Ethereum Provider User Rejected Request (4001) error.
- */
- userRejectedRequest: (arg) => {
- return getEthProviderError(error_constants_1.errorCodes.provider.userRejectedRequest, arg);
- },
- /**
- * Get an Ethereum Provider Unauthorized (4100) error.
- */
- unauthorized: (arg) => {
- return getEthProviderError(error_constants_1.errorCodes.provider.unauthorized, arg);
- },
- /**
- * Get an Ethereum Provider Unsupported Method (4200) error.
- */
- unsupportedMethod: (arg) => {
- return getEthProviderError(error_constants_1.errorCodes.provider.unsupportedMethod, arg);
- },
- /**
- * Get an Ethereum Provider Not Connected (4900) error.
- */
- disconnected: (arg) => {
- return getEthProviderError(error_constants_1.errorCodes.provider.disconnected, arg);
- },
- /**
- * Get an Ethereum Provider Chain Not Connected (4901) error.
- */
- chainDisconnected: (arg) => {
- return getEthProviderError(error_constants_1.errorCodes.provider.chainDisconnected, arg);
- },
- /**
- * Get a custom Ethereum Provider error.
- */
- custom: (opts) => {
- if (!opts || typeof opts !== 'object' || Array.isArray(opts)) {
- throw new Error('Ethereum Provider custom errors must provide single object argument.');
- }
- const { code, message, data } = opts;
- if (!message || typeof message !== 'string') {
- throw new Error('"message" must be a nonempty string');
- }
- return new classes_1.EthereumProviderError(code, message, data);
- },
- },
-};
-// Internal
-function getEthJsonRpcError(code, arg) {
- const [message, data] = parseOpts(arg);
- return new classes_1.EthereumRpcError(code, message || utils_1.getMessageFromCode(code), data);
-}
-function getEthProviderError(code, arg) {
- const [message, data] = parseOpts(arg);
- return new classes_1.EthereumProviderError(code, message || utils_1.getMessageFromCode(code), data);
-}
-function parseOpts(arg) {
- if (arg) {
- if (typeof arg === 'string') {
- return [arg];
- }
- else if (typeof arg === 'object' && !Array.isArray(arg)) {
- const { message, data } = arg;
- if (message && typeof message !== 'string') {
- throw new Error('Must specify string message.');
- }
- return [message || undefined, data];
- }
- }
- return [];
-}
-
-},{"./classes":42,"./error-constants":43,"./utils":46}],45:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getMessageFromCode = exports.serializeError = exports.EthereumProviderError = exports.EthereumRpcError = exports.ethErrors = exports.errorCodes = void 0;
-const classes_1 = require("./classes");
-Object.defineProperty(exports, "EthereumRpcError", { enumerable: true, get: function () { return classes_1.EthereumRpcError; } });
-Object.defineProperty(exports, "EthereumProviderError", { enumerable: true, get: function () { return classes_1.EthereumProviderError; } });
-const utils_1 = require("./utils");
-Object.defineProperty(exports, "serializeError", { enumerable: true, get: function () { return utils_1.serializeError; } });
-Object.defineProperty(exports, "getMessageFromCode", { enumerable: true, get: function () { return utils_1.getMessageFromCode; } });
-const errors_1 = require("./errors");
-Object.defineProperty(exports, "ethErrors", { enumerable: true, get: function () { return errors_1.ethErrors; } });
-const error_constants_1 = require("./error-constants");
-Object.defineProperty(exports, "errorCodes", { enumerable: true, get: function () { return error_constants_1.errorCodes; } });
-
-},{"./classes":42,"./error-constants":43,"./errors":44,"./utils":46}],46:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.serializeError = exports.isValidCode = exports.getMessageFromCode = exports.JSON_RPC_SERVER_ERROR_MESSAGE = void 0;
-const error_constants_1 = require("./error-constants");
-const classes_1 = require("./classes");
-const FALLBACK_ERROR_CODE = error_constants_1.errorCodes.rpc.internal;
-const FALLBACK_MESSAGE = 'Unspecified error message. This is a bug, please report it.';
-const FALLBACK_ERROR = {
- code: FALLBACK_ERROR_CODE,
- message: getMessageFromCode(FALLBACK_ERROR_CODE),
-};
-exports.JSON_RPC_SERVER_ERROR_MESSAGE = 'Unspecified server error.';
-/**
- * Gets the message for a given code, or a fallback message if the code has
- * no corresponding message.
- */
-function getMessageFromCode(code, fallbackMessage = FALLBACK_MESSAGE) {
- if (Number.isInteger(code)) {
- const codeString = code.toString();
- if (hasKey(error_constants_1.errorValues, codeString)) {
- return error_constants_1.errorValues[codeString].message;
- }
- if (isJsonRpcServerError(code)) {
- return exports.JSON_RPC_SERVER_ERROR_MESSAGE;
- }
- }
- return fallbackMessage;
-}
-exports.getMessageFromCode = getMessageFromCode;
-/**
- * Returns whether the given code is valid.
- * A code is only valid if it has a message.
- */
-function isValidCode(code) {
- if (!Number.isInteger(code)) {
- return false;
- }
- const codeString = code.toString();
- if (error_constants_1.errorValues[codeString]) {
- return true;
- }
- if (isJsonRpcServerError(code)) {
- return true;
- }
- return false;
-}
-exports.isValidCode = isValidCode;
-/**
- * Serializes the given error to an Ethereum JSON RPC-compatible error object.
- * Merely copies the given error's values if it is already compatible.
- * If the given error is not fully compatible, it will be preserved on the
- * returned object's data.originalError property.
- */
-function serializeError(error, { fallbackError = FALLBACK_ERROR, shouldIncludeStack = false, } = {}) {
- var _a, _b;
- if (!fallbackError ||
- !Number.isInteger(fallbackError.code) ||
- typeof fallbackError.message !== 'string') {
- throw new Error('Must provide fallback error with integer number code and string message.');
- }
- if (error instanceof classes_1.EthereumRpcError) {
- return error.serialize();
- }
- const serialized = {};
- if (error &&
- typeof error === 'object' &&
- !Array.isArray(error) &&
- hasKey(error, 'code') &&
- isValidCode(error.code)) {
- const _error = error;
- serialized.code = _error.code;
- if (_error.message && typeof _error.message === 'string') {
- serialized.message = _error.message;
- if (hasKey(_error, 'data')) {
- serialized.data = _error.data;
- }
- }
- else {
- serialized.message = getMessageFromCode(serialized.code);
- serialized.data = { originalError: assignOriginalError(error) };
- }
- }
- else {
- serialized.code = fallbackError.code;
- const message = (_a = error) === null || _a === void 0 ? void 0 : _a.message;
- serialized.message = (message && typeof message === 'string'
- ? message
- : fallbackError.message);
- serialized.data = { originalError: assignOriginalError(error) };
- }
- const stack = (_b = error) === null || _b === void 0 ? void 0 : _b.stack;
- if (shouldIncludeStack && error && stack && typeof stack === 'string') {
- serialized.stack = stack;
- }
- return serialized;
-}
-exports.serializeError = serializeError;
-// Internal
-function isJsonRpcServerError(code) {
- return code >= -32099 && code <= -32000;
-}
-function assignOriginalError(error) {
- if (error && typeof error === 'object' && !Array.isArray(error)) {
- return Object.assign({}, error);
- }
- return error;
-}
-function hasKey(obj, key) {
- return Object.prototype.hasOwnProperty.call(obj, key);
-}
-
-},{"./classes":42,"./error-constants":43}],47:[function(require,module,exports){
-(function (Buffer){(function (){
-'use strict';
-
-/* eslint-disable */
-
-var utils = require('./utils/index.js');
-var uint256Coder = utils.uint256Coder;
-var coderBoolean = utils.coderBoolean;
-var coderFixedBytes = utils.coderFixedBytes;
-var coderAddress = utils.coderAddress;
-var coderDynamicBytes = utils.coderDynamicBytes;
-var coderString = utils.coderString;
-var coderArray = utils.coderArray;
-var paramTypePart = utils.paramTypePart;
-var getParamCoder = utils.getParamCoder;
-
-function Result() {}
-
-function encodeParams(types, values) {
- if (types.length !== values.length) {
- throw new Error('[ethjs-abi] while encoding params, types/values mismatch, Your contract requires ' + types.length + ' types (arguments), and you passed in ' + values.length);
- }
-
- var parts = [];
-
- types.forEach(function (type, index) {
- var coder = getParamCoder(type);
- parts.push({ dynamic: coder.dynamic, value: coder.encode(values[index]) });
- });
-
- function alignSize(size) {
- return parseInt(32 * Math.ceil(size / 32));
- }
-
- var staticSize = 0,
- dynamicSize = 0;
- parts.forEach(function (part) {
- if (part.dynamic) {
- staticSize += 32;
- dynamicSize += alignSize(part.value.length);
- } else {
- staticSize += alignSize(part.value.length);
- }
- });
-
- var offset = 0,
- dynamicOffset = staticSize;
- var data = new Buffer(staticSize + dynamicSize);
-
- parts.forEach(function (part, index) {
- if (part.dynamic) {
- uint256Coder.encode(dynamicOffset).copy(data, offset);
- offset += 32;
-
- part.value.copy(data, dynamicOffset);
- dynamicOffset += alignSize(part.value.length);
- } else {
- part.value.copy(data, offset);
- offset += alignSize(part.value.length);
- }
- });
-
- return '0x' + data.toString('hex');
-}
-
-// decode bytecode data from output names and types
-function decodeParams(names, types, data) {
- var useNumberedParams = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
-
- // Names is optional, so shift over all the parameters if not provided
- if (arguments.length < 3) {
- data = types;
- types = names;
- names = [];
- }
-
- data = utils.hexOrBuffer(data);
- var values = new Result();
-
- var offset = 0;
- types.forEach(function (type, index) {
- var coder = getParamCoder(type);
-
- if (coder.dynamic) {
- var dynamicOffset = uint256Coder.decode(data, offset);
- var result = coder.decode(data, dynamicOffset.value.toNumber());
- offset += dynamicOffset.consumed;
- } else {
- var result = coder.decode(data, offset);
- offset += result.consumed;
- }
-
- if (useNumberedParams) {
- values[index] = result.value;
- }
-
- if (names[index]) {
- values[names[index]] = result.value;
- }
- });
- return values;
-}
-
-// create an encoded method signature from an ABI object
-function encodeSignature(method) {
- var signature = method.name + '(' + utils.getKeys(method.inputs, 'type').join(',') + ')';
- var signatureEncoded = '0x' + new Buffer(utils.keccak256(signature), 'hex').slice(0, 4).toString('hex');
-
- return signatureEncoded;
-}
-
-// encode method ABI object with values in an array, output bytecode
-function encodeMethod(method, values) {
- var paramsEncoded = encodeParams(utils.getKeys(method.inputs, 'type'), values).substring(2);
-
- return '' + encodeSignature(method) + paramsEncoded;
-}
-
-// decode method data bytecode, from method ABI object
-function decodeMethod(method, data) {
- var outputNames = utils.getKeys(method.outputs, 'name', true);
- var outputTypes = utils.getKeys(method.outputs, 'type');
-
- return decodeParams(outputNames, outputTypes, utils.hexOrBuffer(data));
-}
-
-// decode method data bytecode, from method ABI object
-function encodeEvent(eventObject, values) {
- return encodeMethod(eventObject, values);
-}
-
-function eventSignature(eventObject) {
- var signature = eventObject.name + '(' + utils.getKeys(eventObject.inputs, 'type').join(',') + ')';
-
- return '0x' + utils.keccak256(signature);
-}
-
-// decode method data bytecode, from method ABI object
-function decodeEvent(eventObject, data, topics) {
- var useNumberedParams = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
-
- var nonIndexed = eventObject.inputs.filter(function (input) {
- return !input.indexed;
- });
- var nonIndexedNames = utils.getKeys(nonIndexed, 'name', true);
- var nonIndexedTypes = utils.getKeys(nonIndexed, 'type');
- var event = decodeParams(nonIndexedNames, nonIndexedTypes, utils.hexOrBuffer(data), useNumberedParams);
- var topicOffset = eventObject.anonymous ? 0 : 1;
-
- eventObject.inputs.filter(function (input) {
- return input.indexed;
- }).map(function (input, i) {
- var topic = new Buffer(topics[i + topicOffset].slice(2), 'hex');
- var coder = getParamCoder(input.type);
- event[input.name] = coder.decode(topic, 0).value;
- });
-
- event._eventName = eventObject.name;
-
- return event;
-}
-
-// Decode a specific log item with a specific event abi
-function decodeLogItem(eventObject, log) {
- var useNumberedParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
-
- if (eventObject && log.topics[0] === eventSignature(eventObject)) {
- return decodeEvent(eventObject, log.data, log.topics, useNumberedParams);
- }
-}
-
-// Create a decoder for all events defined in an abi. It returns a function which is called
-// on an array of log entries such as received from getLogs or getTransactionReceipt and parses
-// any matching log entries
-function logDecoder(abi) {
- var useNumberedParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
-
- var eventMap = {};
- abi.filter(function (item) {
- return item.type === 'event';
- }).map(function (item) {
- eventMap[eventSignature(item)] = item;
- });
- return function (logItems) {
- return logItems.map(function (log) {
- return decodeLogItem(eventMap[log.topics[0]], log, useNumberedParams);
- }).filter(function (i) {
- return i;
- });
- };
-}
-
-module.exports = {
- encodeParams: encodeParams,
- decodeParams: decodeParams,
- encodeMethod: encodeMethod,
- decodeMethod: decodeMethod,
- encodeEvent: encodeEvent,
- decodeEvent: decodeEvent,
- decodeLogItem: decodeLogItem,
- logDecoder: logDecoder,
- eventSignature: eventSignature,
- encodeSignature: encodeSignature
-};
-}).call(this)}).call(this,require("buffer").Buffer)
-},{"./utils/index.js":48,"buffer":38}],48:[function(require,module,exports){
-(function (Buffer){(function (){
-'use strict';
-
-var BN = require('bn.js');
-var numberToBN = require('number-to-bn');
-var keccak256 = require('js-sha3').keccak_256;
-
-// from ethereumjs-util
-function stripZeros(aInput) {
- var a = aInput; // eslint-disable-line
- var first = a[0]; // eslint-disable-line
- while (a.length > 0 && first.toString() === '0') {
- a = a.slice(1);
- first = a[0];
- }
- return a;
-}
-
-function bnToBuffer(bnInput) {
- var bn = bnInput; // eslint-disable-line
- var hex = bn.toString(16); // eslint-disable-line
- if (hex.length % 2) {
- hex = '0' + hex;
- }
- return stripZeros(new Buffer(hex, 'hex'));
-}
-
-function isHexString(value, length) {
- if (typeof value !== 'string' || !value.match(/^0x[0-9A-Fa-f]*$/)) {
- return false;
- }
- if (length && value.length !== 2 + 2 * length) {
- return false;
- }
- return true;
-}
-
-function hexOrBuffer(valueInput, name) {
- var value = valueInput; // eslint-disable-line
- if (!Buffer.isBuffer(value)) {
- if (!isHexString(value)) {
- var error = new Error(name ? '[ethjs-abi] invalid ' + name : '[ethjs-abi] invalid hex or buffer, must be a prefixed alphanumeric even length hex string');
- error.reason = '[ethjs-abi] invalid hex string, hex must be prefixed and alphanumeric (e.g. 0x023..)';
- error.value = value;
- throw error;
- }
-
- value = value.substring(2);
- if (value.length % 2) {
- value = '0' + value;
- }
- value = new Buffer(value, 'hex');
- }
-
- return value;
-}
-
-function hexlify(value) {
- if (typeof value === 'number') {
- return '0x' + bnToBuffer(new BN(value)).toString('hex');
- } else if (value.mod || value.modulo) {
- return '0x' + bnToBuffer(value).toString('hex');
- } else {
- // eslint-disable-line
- return '0x' + hexOrBuffer(value).toString('hex');
- }
-}
-
-// getKeys([{a: 1, b: 2}, {a: 3, b: 4}], 'a') => [1, 3]
-function getKeys(params, key, allowEmpty) {
- var result = []; // eslint-disable-line
-
- if (!Array.isArray(params)) {
- throw new Error('[ethjs-abi] while getting keys, invalid params value ' + JSON.stringify(params));
- }
-
- for (var i = 0; i < params.length; i++) {
- // eslint-disable-line
- var value = params[i][key]; // eslint-disable-line
- if (allowEmpty && !value) {
- value = '';
- } else if (typeof value !== 'string') {
- throw new Error('[ethjs-abi] while getKeys found invalid ABI data structure, type value not string');
- }
- result.push(value);
- }
-
- return result;
-}
-
-function coderNumber(size, signed) {
- return {
- encode: function encodeNumber(valueInput) {
- var value = valueInput; // eslint-disable-line
-
- if (typeof value === 'object' && value.toString && (value.toTwos || value.dividedToIntegerBy)) {
- value = value.toString(10).split('.')[0];
- }
-
- if (typeof value === 'string' || typeof value === 'number') {
- value = String(value).split('.')[0];
- }
-
- value = numberToBN(value);
- value = value.toTwos(size * 8).maskn(size * 8);
- if (signed) {
- value = value.fromTwos(size * 8).toTwos(256);
- }
- return value.toArrayLike(Buffer, 'be', 32);
- },
- decode: function decodeNumber(data, offset) {
- var junkLength = 32 - size; // eslint-disable-line
- var value = new BN(data.slice(offset + junkLength, offset + 32)); // eslint-disable-line
- if (signed) {
- value = value.fromTwos(size * 8);
- } else {
- value = value.maskn(size * 8);
- }
- return {
- consumed: 32,
- value: new BN(value.toString(10))
- };
- }
- };
-}
-var uint256Coder = coderNumber(32, false);
-
-var coderBoolean = {
- encode: function encodeBoolean(value) {
- return uint256Coder.encode(value ? 1 : 0);
- },
- decode: function decodeBoolean(data, offset) {
- var result = uint256Coder.decode(data, offset); // eslint-disable-line
- return {
- consumed: result.consumed,
- value: !result.value.isZero()
- };
- }
-};
-
-function coderFixedBytes(length) {
- return {
- encode: function encodeFixedBytes(valueInput) {
- var value = valueInput; // eslint-disable-line
- value = hexOrBuffer(value);
-
- if (value.length === 32) {
- return value;
- }
-
- var result = new Buffer(32); // eslint-disable-line
- result.fill(0);
- value.copy(result);
- return result;
- },
- decode: function decodeFixedBytes(data, offset) {
- if (data.length !== 0 && data.length < offset + 32) {
- throw new Error('[ethjs-abi] while decoding fixed bytes, invalid bytes data length: ' + length);
- }
-
- return {
- consumed: 32,
- value: '0x' + data.slice(offset, offset + length).toString('hex')
- };
- }
- };
-}
-
-var coderAddress = {
- encode: function encodeAddress(valueInput) {
- var value = valueInput; // eslint-disable-line
- var result = new Buffer(32); // eslint-disable-line
- if (!isHexString(value, 20)) {
- throw new Error('[ethjs-abi] while encoding address, invalid address value, not alphanumeric 20 byte hex string');
- }
- value = hexOrBuffer(value);
- result.fill(0);
- value.copy(result, 12);
- return result;
- },
- decode: function decodeAddress(data, offset) {
- if (data.length === 0) {
- return {
- consumed: 32,
- value: '0x'
- };
- }
- if (data.length !== 0 && data.length < offset + 32) {
- throw new Error('[ethjs-abi] while decoding address data, invalid address data, invalid byte length ' + data.length);
- }
- return {
- consumed: 32,
- value: '0x' + data.slice(offset + 12, offset + 32).toString('hex')
- };
- }
-};
-
-function encodeDynamicBytesHelper(value) {
- var dataLength = parseInt(32 * Math.ceil(value.length / 32)); // eslint-disable-line
- var padding = new Buffer(dataLength - value.length); // eslint-disable-line
- padding.fill(0);
-
- return Buffer.concat([uint256Coder.encode(value.length), value, padding]);
-}
-
-function decodeDynamicBytesHelper(data, offset) {
- if (data.length !== 0 && data.length < offset + 32) {
- throw new Error('[ethjs-abi] while decoding dynamic bytes data, invalid bytes length: ' + data.length + ' should be less than ' + (offset + 32));
- }
-
- var length = uint256Coder.decode(data, offset).value; // eslint-disable-line
- length = length.toNumber();
- if (data.length !== 0 && data.length < offset + 32 + length) {
- throw new Error('[ethjs-abi] while decoding dynamic bytes data, invalid bytes length: ' + data.length + ' should be less than ' + (offset + 32 + length));
- }
-
- return {
- consumed: parseInt(32 + 32 * Math.ceil(length / 32), 10),
- value: data.slice(offset + 32, offset + 32 + length)
- };
-}
-
-var coderDynamicBytes = {
- encode: function encodeDynamicBytes(value) {
- return encodeDynamicBytesHelper(hexOrBuffer(value));
- },
- decode: function decodeDynamicBytes(data, offset) {
- var result = decodeDynamicBytesHelper(data, offset); // eslint-disable-line
- result.value = '0x' + result.value.toString('hex');
- return result;
- },
- dynamic: true
-};
-
-var coderString = {
- encode: function encodeString(value) {
- return encodeDynamicBytesHelper(new Buffer(value, 'utf8'));
- },
- decode: function decodeString(data, offset) {
- var result = decodeDynamicBytesHelper(data, offset); // eslint-disable-line
- result.value = result.value.toString('utf8');
- return result;
- },
- dynamic: true
-};
-
-function coderArray(coder, lengthInput) {
- return {
- encode: function encodeArray(value) {
- var result = new Buffer(0); // eslint-disable-line
- var length = lengthInput; // eslint-disable-line
-
- if (!Array.isArray(value)) {
- throw new Error('[ethjs-abi] while encoding array, invalid array data, not type Object (Array)');
- }
-
- if (length === -1) {
- length = value.length;
- result = uint256Coder.encode(length);
- }
-
- if (length !== value.length) {
- throw new Error('[ethjs-abi] while encoding array, size mismatch array length ' + length + ' does not equal ' + value.length);
- }
-
- value.forEach(function (resultValue) {
- result = Buffer.concat([result, coder.encode(resultValue)]);
- });
-
- return result;
- },
- decode: function decodeArray(data, offsetInput) {
- var length = lengthInput; // eslint-disable-line
- var offset = offsetInput; // eslint-disable-line
- // @TODO:
- // if (data.length < offset + length * 32) { throw new Error('invalid array'); }
-
- var consumed = 0; // eslint-disable-line
- var decodeResult; // eslint-disable-line
-
- if (length === -1) {
- decodeResult = uint256Coder.decode(data, offset);
- length = decodeResult.value.toNumber();
- consumed += decodeResult.consumed;
- offset += decodeResult.consumed;
- }
-
- var value = []; // eslint-disable-line
-
- for (var i = 0; i < length; i++) {
- // eslint-disable-line
- var loopResult = coder.decode(data, offset);
- consumed += loopResult.consumed;
- offset += loopResult.consumed;
- value.push(loopResult.value);
- }
-
- return {
- consumed: consumed,
- value: value
- };
- },
- dynamic: lengthInput === -1
- };
-}
-
-// Break the type up into [staticType][staticArray]*[dynamicArray]? | [dynamicType] and
-// build the coder up from its parts
-var paramTypePart = new RegExp(/^((u?int|bytes)([0-9]*)|(address|bool|string)|(\[([0-9]*)\]))/);
-
-function getParamCoder(typeInput) {
- var type = typeInput; // eslint-disable-line
- var coder = null; // eslint-disable-line
- var invalidTypeErrorMessage = '[ethjs-abi] while getting param coder (getParamCoder) type value ' + JSON.stringify(type) + ' is either invalid or unsupported by ethjs-abi.';
-
- while (type) {
- var part = type.match(paramTypePart); // eslint-disable-line
- if (!part) {
- throw new Error(invalidTypeErrorMessage);
- }
- type = type.substring(part[0].length);
-
- var prefix = part[2] || part[4] || part[5]; // eslint-disable-line
- switch (prefix) {
- case 'int':case 'uint':
- if (coder) {
- throw new Error(invalidTypeErrorMessage);
- }
- var intSize = parseInt(part[3] || 256); // eslint-disable-line
- if (intSize === 0 || intSize > 256 || intSize % 8 !== 0) {
- throw new Error('[ethjs-abi] while getting param coder for type ' + type + ', invalid ' + prefix + ' width: ' + type);
- }
-
- coder = coderNumber(intSize / 8, prefix === 'int');
- break;
-
- case 'bool':
- if (coder) {
- throw new Error(invalidTypeErrorMessage);
- }
- coder = coderBoolean;
- break;
-
- case 'string':
- if (coder) {
- throw new Error(invalidTypeErrorMessage);
- }
- coder = coderString;
- break;
-
- case 'bytes':
- if (coder) {
- throw new Error(invalidTypeErrorMessage);
- }
- if (part[3]) {
- var size = parseInt(part[3]); // eslint-disable-line
- if (size === 0 || size > 32) {
- throw new Error('[ethjs-abi] while getting param coder for prefix bytes, invalid type ' + type + ', size ' + size + ' should be 0 or greater than 32');
- }
- coder = coderFixedBytes(size);
- } else {
- coder = coderDynamicBytes;
- }
- break;
-
- case 'address':
- if (coder) {
- throw new Error(invalidTypeErrorMessage);
- }
- coder = coderAddress;
- break;
-
- case '[]':
- if (!coder || coder.dynamic) {
- throw new Error(invalidTypeErrorMessage);
- }
- coder = coderArray(coder, -1);
- break;
-
- // "[0-9+]"
- default:
- if (!coder || coder.dynamic) {
- throw new Error(invalidTypeErrorMessage);
- }
- var defaultSize = parseInt(part[6]); // eslint-disable-line
- coder = coderArray(coder, defaultSize);
- }
- }
-
- if (!coder) {
- throw new Error(invalidTypeErrorMessage);
- }
- return coder;
-}
-
-module.exports = {
- BN: BN,
- bnToBuffer: bnToBuffer,
- isHexString: isHexString,
- hexOrBuffer: hexOrBuffer,
- hexlify: hexlify,
- stripZeros: stripZeros,
-
- keccak256: keccak256,
-
- getKeys: getKeys,
- numberToBN: numberToBN,
- coderNumber: coderNumber,
- uint256Coder: uint256Coder,
- coderBoolean: coderBoolean,
- coderFixedBytes: coderFixedBytes,
- coderAddress: coderAddress,
- coderDynamicBytes: coderDynamicBytes,
- coderString: coderString,
- coderArray: coderArray,
- paramTypePart: paramTypePart,
- getParamCoder: getParamCoder
-};
-}).call(this)}).call(this,require("buffer").Buffer)
-},{"bn.js":49,"buffer":38,"js-sha3":86,"number-to-bn":98}],49:[function(require,module,exports){
-(function (module, exports) {
- 'use strict';
-
- // Utils
- function assert (val, msg) {
- if (!val) throw new Error(msg || 'Assertion failed');
- }
-
- // Could use `inherits` module, but don't want to move from single file
- // architecture yet.
- function inherits (ctor, superCtor) {
- ctor.super_ = superCtor;
- var TempCtor = function () {};
- TempCtor.prototype = superCtor.prototype;
- ctor.prototype = new TempCtor();
- ctor.prototype.constructor = ctor;
- }
-
- // BN
-
- function BN (number, base, endian) {
- if (BN.isBN(number)) {
- return number;
- }
-
- this.negative = 0;
- this.words = null;
- this.length = 0;
-
- // Reduction context
- this.red = null;
-
- if (number !== null) {
- if (base === 'le' || base === 'be') {
- endian = base;
- base = 10;
- }
-
- this._init(number || 0, base || 10, endian || 'be');
- }
- }
- if (typeof module === 'object') {
- module.exports = BN;
- } else {
- exports.BN = BN;
- }
-
- BN.BN = BN;
- BN.wordSize = 26;
-
- var Buffer;
- try {
- Buffer = require('buf' + 'fer').Buffer;
- } catch (e) {
- }
-
- BN.isBN = function isBN (num) {
- if (num instanceof BN) {
- return true;
- }
-
- return num !== null && typeof num === 'object' &&
- num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
- };
-
- BN.max = function max (left, right) {
- if (left.cmp(right) > 0) return left;
- return right;
- };
-
- BN.min = function min (left, right) {
- if (left.cmp(right) < 0) return left;
- return right;
- };
-
- BN.prototype._init = function init (number, base, endian) {
- if (typeof number === 'number') {
- return this._initNumber(number, base, endian);
- }
-
- if (typeof number === 'object') {
- return this._initArray(number, base, endian);
- }
-
- if (base === 'hex') {
- base = 16;
- }
- assert(base === (base | 0) && base >= 2 && base <= 36);
-
- number = number.toString().replace(/\s+/g, '');
- var start = 0;
- if (number[0] === '-') {
- start++;
- }
-
- if (base === 16) {
- this._parseHex(number, start);
- } else {
- this._parseBase(number, base, start);
- }
-
- if (number[0] === '-') {
- this.negative = 1;
- }
-
- this.strip();
-
- if (endian !== 'le') return;
-
- this._initArray(this.toArray(), base, endian);
- };
-
- BN.prototype._initNumber = function _initNumber (number, base, endian) {
- if (number < 0) {
- this.negative = 1;
- number = -number;
- }
- if (number < 0x4000000) {
- this.words = [ number & 0x3ffffff ];
- this.length = 1;
- } else if (number < 0x10000000000000) {
- this.words = [
- number & 0x3ffffff,
- (number / 0x4000000) & 0x3ffffff
- ];
- this.length = 2;
- } else {
- assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)
- this.words = [
- number & 0x3ffffff,
- (number / 0x4000000) & 0x3ffffff,
- 1
- ];
- this.length = 3;
- }
-
- if (endian !== 'le') return;
-
- // Reverse the bytes
- this._initArray(this.toArray(), base, endian);
- };
-
- BN.prototype._initArray = function _initArray (number, base, endian) {
- // Perhaps a Uint8Array
- assert(typeof number.length === 'number');
- if (number.length <= 0) {
- this.words = [ 0 ];
- this.length = 1;
- return this;
- }
-
- this.length = Math.ceil(number.length / 3);
- this.words = new Array(this.length);
- for (var i = 0; i < this.length; i++) {
- this.words[i] = 0;
- }
-
- var j, w;
- var off = 0;
- if (endian === 'be') {
- for (i = number.length - 1, j = 0; i >= 0; i -= 3) {
- w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);
- this.words[j] |= (w << off) & 0x3ffffff;
- this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- } else if (endian === 'le') {
- for (i = 0, j = 0; i < number.length; i += 3) {
- w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);
- this.words[j] |= (w << off) & 0x3ffffff;
- this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- }
- return this.strip();
- };
-
- function parseHex (str, start, end) {
- var r = 0;
- var len = Math.min(str.length, end);
- for (var i = start; i < len; i++) {
- var c = str.charCodeAt(i) - 48;
-
- r <<= 4;
-
- // 'a' - 'f'
- if (c >= 49 && c <= 54) {
- r |= c - 49 + 0xa;
-
- // 'A' - 'F'
- } else if (c >= 17 && c <= 22) {
- r |= c - 17 + 0xa;
-
- // '0' - '9'
- } else {
- r |= c & 0xf;
- }
- }
- return r;
- }
-
- BN.prototype._parseHex = function _parseHex (number, start) {
- // Create possibly bigger array to ensure that it fits the number
- this.length = Math.ceil((number.length - start) / 6);
- this.words = new Array(this.length);
- for (var i = 0; i < this.length; i++) {
- this.words[i] = 0;
- }
-
- var j, w;
- // Scan 24-bit chunks and add them to the number
- var off = 0;
- for (i = number.length - 6, j = 0; i >= start; i -= 6) {
- w = parseHex(number, i, i + 6);
- this.words[j] |= (w << off) & 0x3ffffff;
- // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb
- this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;
- off += 24;
- if (off >= 26) {
- off -= 26;
- j++;
- }
- }
- if (i + 6 !== start) {
- w = parseHex(number, start, i + 6);
- this.words[j] |= (w << off) & 0x3ffffff;
- this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;
- }
- this.strip();
- };
-
- function parseBase (str, start, end, mul) {
- var r = 0;
- var len = Math.min(str.length, end);
- for (var i = start; i < len; i++) {
- var c = str.charCodeAt(i) - 48;
-
- r *= mul;
-
- // 'a'
- if (c >= 49) {
- r += c - 49 + 0xa;
-
- // 'A'
- } else if (c >= 17) {
- r += c - 17 + 0xa;
-
- // '0' - '9'
- } else {
- r += c;
- }
- }
- return r;
- }
-
- BN.prototype._parseBase = function _parseBase (number, base, start) {
- // Initialize as zero
- this.words = [ 0 ];
- this.length = 1;
-
- // Find length of limb in base
- for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {
- limbLen++;
- }
- limbLen--;
- limbPow = (limbPow / base) | 0;
-
- var total = number.length - start;
- var mod = total % limbLen;
- var end = Math.min(total, total - mod) + start;
-
- var word = 0;
- for (var i = start; i < end; i += limbLen) {
- word = parseBase(number, i, i + limbLen, base);
-
- this.imuln(limbPow);
- if (this.words[0] + word < 0x4000000) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
-
- if (mod !== 0) {
- var pow = 1;
- word = parseBase(number, i, number.length, base);
-
- for (i = 0; i < mod; i++) {
- pow *= base;
- }
-
- this.imuln(pow);
- if (this.words[0] + word < 0x4000000) {
- this.words[0] += word;
- } else {
- this._iaddn(word);
- }
- }
- };
-
- BN.prototype.copy = function copy (dest) {
- dest.words = new Array(this.length);
- for (var i = 0; i < this.length; i++) {
- dest.words[i] = this.words[i];
- }
- dest.length = this.length;
- dest.negative = this.negative;
- dest.red = this.red;
- };
-
- BN.prototype.clone = function clone () {
- var r = new BN(null);
- this.copy(r);
- return r;
- };
-
- BN.prototype._expand = function _expand (size) {
- while (this.length < size) {
- this.words[this.length++] = 0;
- }
- return this;
- };
-
- // Remove leading `0` from `this`
- BN.prototype.strip = function strip () {
- while (this.length > 1 && this.words[this.length - 1] === 0) {
- this.length--;
- }
- return this._normSign();
- };
-
- BN.prototype._normSign = function _normSign () {
- // -0 = 0
- if (this.length === 1 && this.words[0] === 0) {
- this.negative = 0;
- }
- return this;
- };
-
- BN.prototype.inspect = function inspect () {
- return (this.red ? '';
- };
-
- /*
-
- var zeros = [];
- var groupSizes = [];
- var groupBases = [];
-
- var s = '';
- var i = -1;
- while (++i < BN.wordSize) {
- zeros[i] = s;
- s += '0';
- }
- groupSizes[0] = 0;
- groupSizes[1] = 0;
- groupBases[0] = 0;
- groupBases[1] = 0;
- var base = 2 - 1;
- while (++base < 36 + 1) {
- var groupSize = 0;
- var groupBase = 1;
- while (groupBase < (1 << BN.wordSize) / base) {
- groupBase *= base;
- groupSize += 1;
- }
- groupSizes[base] = groupSize;
- groupBases[base] = groupBase;
- }
-
- */
-
- var zeros = [
- '',
- '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'
- ];
-
- var groupSizes = [
- 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
- ];
-
- var groupBases = [
- 0, 0,
- 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,
- 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,
- 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,
- 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,
- 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176
- ];
-
- BN.prototype.toString = function toString (base, padding) {
- base = base || 10;
- padding = padding | 0 || 1;
-
- var out;
- if (base === 16 || base === 'hex') {
- out = '';
- var off = 0;
- var carry = 0;
- for (var i = 0; i < this.length; i++) {
- var w = this.words[i];
- var word = (((w << off) | carry) & 0xffffff).toString(16);
- carry = (w >>> (24 - off)) & 0xffffff;
- if (carry !== 0 || i !== this.length - 1) {
- out = zeros[6 - word.length] + word + out;
- } else {
- out = word + out;
- }
- off += 2;
- if (off >= 26) {
- off -= 26;
- i--;
- }
- }
- if (carry !== 0) {
- out = carry.toString(16) + out;
- }
- while (out.length % padding !== 0) {
- out = '0' + out;
- }
- if (this.negative !== 0) {
- out = '-' + out;
- }
- return out;
- }
-
- if (base === (base | 0) && base >= 2 && base <= 36) {
- // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));
- var groupSize = groupSizes[base];
- // var groupBase = Math.pow(base, groupSize);
- var groupBase = groupBases[base];
- out = '';
- var c = this.clone();
- c.negative = 0;
- while (!c.isZero()) {
- var r = c.modn(groupBase).toString(base);
- c = c.idivn(groupBase);
-
- if (!c.isZero()) {
- out = zeros[groupSize - r.length] + r + out;
- } else {
- out = r + out;
- }
- }
- if (this.isZero()) {
- out = '0' + out;
- }
- while (out.length % padding !== 0) {
- out = '0' + out;
- }
- if (this.negative !== 0) {
- out = '-' + out;
- }
- return out;
- }
-
- assert(false, 'Base should be between 2 and 36');
- };
-
- BN.prototype.toNumber = function toNumber () {
- var ret = this.words[0];
- if (this.length === 2) {
- ret += this.words[1] * 0x4000000;
- } else if (this.length === 3 && this.words[2] === 0x01) {
- // NOTE: at this stage it is known that the top bit is set
- ret += 0x10000000000000 + (this.words[1] * 0x4000000);
- } else if (this.length > 2) {
- assert(false, 'Number can only safely store up to 53 bits');
- }
- return (this.negative !== 0) ? -ret : ret;
- };
-
- BN.prototype.toJSON = function toJSON () {
- return this.toString(16);
- };
-
- BN.prototype.toBuffer = function toBuffer (endian, length) {
- assert(typeof Buffer !== 'undefined');
- return this.toArrayLike(Buffer, endian, length);
- };
-
- BN.prototype.toArray = function toArray (endian, length) {
- return this.toArrayLike(Array, endian, length);
- };
-
- BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {
- var byteLength = this.byteLength();
- var reqLength = length || Math.max(1, byteLength);
- assert(byteLength <= reqLength, 'byte array longer than desired length');
- assert(reqLength > 0, 'Requested array length <= 0');
-
- this.strip();
- var littleEndian = endian === 'le';
- var res = new ArrayType(reqLength);
-
- var b, i;
- var q = this.clone();
- if (!littleEndian) {
- // Assume big-endian
- for (i = 0; i < reqLength - byteLength; i++) {
- res[i] = 0;
- }
-
- for (i = 0; !q.isZero(); i++) {
- b = q.andln(0xff);
- q.iushrn(8);
-
- res[reqLength - i - 1] = b;
- }
- } else {
- for (i = 0; !q.isZero(); i++) {
- b = q.andln(0xff);
- q.iushrn(8);
-
- res[i] = b;
- }
-
- for (; i < reqLength; i++) {
- res[i] = 0;
- }
- }
-
- return res;
- };
-
- if (Math.clz32) {
- BN.prototype._countBits = function _countBits (w) {
- return 32 - Math.clz32(w);
- };
- } else {
- BN.prototype._countBits = function _countBits (w) {
- var t = w;
- var r = 0;
- if (t >= 0x1000) {
- r += 13;
- t >>>= 13;
- }
- if (t >= 0x40) {
- r += 7;
- t >>>= 7;
- }
- if (t >= 0x8) {
- r += 4;
- t >>>= 4;
- }
- if (t >= 0x02) {
- r += 2;
- t >>>= 2;
- }
- return r + t;
- };
- }
-
- BN.prototype._zeroBits = function _zeroBits (w) {
- // Short-cut
- if (w === 0) return 26;
-
- var t = w;
- var r = 0;
- if ((t & 0x1fff) === 0) {
- r += 13;
- t >>>= 13;
- }
- if ((t & 0x7f) === 0) {
- r += 7;
- t >>>= 7;
- }
- if ((t & 0xf) === 0) {
- r += 4;
- t >>>= 4;
- }
- if ((t & 0x3) === 0) {
- r += 2;
- t >>>= 2;
- }
- if ((t & 0x1) === 0) {
- r++;
- }
- return r;
- };
-
- // Return number of used bits in a BN
- BN.prototype.bitLength = function bitLength () {
- var w = this.words[this.length - 1];
- var hi = this._countBits(w);
- return (this.length - 1) * 26 + hi;
- };
-
- function toBitArray (num) {
- var w = new Array(num.bitLength());
-
- for (var bit = 0; bit < w.length; bit++) {
- var off = (bit / 26) | 0;
- var wbit = bit % 26;
-
- w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;
- }
-
- return w;
- }
-
- // Number of trailing zero bits
- BN.prototype.zeroBits = function zeroBits () {
- if (this.isZero()) return 0;
-
- var r = 0;
- for (var i = 0; i < this.length; i++) {
- var b = this._zeroBits(this.words[i]);
- r += b;
- if (b !== 26) break;
- }
- return r;
- };
-
- BN.prototype.byteLength = function byteLength () {
- return Math.ceil(this.bitLength() / 8);
- };
-
- BN.prototype.toTwos = function toTwos (width) {
- if (this.negative !== 0) {
- return this.abs().inotn(width).iaddn(1);
- }
- return this.clone();
- };
-
- BN.prototype.fromTwos = function fromTwos (width) {
- if (this.testn(width - 1)) {
- return this.notn(width).iaddn(1).ineg();
- }
- return this.clone();
- };
-
- BN.prototype.isNeg = function isNeg () {
- return this.negative !== 0;
- };
-
- // Return negative clone of `this`
- BN.prototype.neg = function neg () {
- return this.clone().ineg();
- };
-
- BN.prototype.ineg = function ineg () {
- if (!this.isZero()) {
- this.negative ^= 1;
- }
-
- return this;
- };
-
- // Or `num` with `this` in-place
- BN.prototype.iuor = function iuor (num) {
- while (this.length < num.length) {
- this.words[this.length++] = 0;
- }
-
- for (var i = 0; i < num.length; i++) {
- this.words[i] = this.words[i] | num.words[i];
- }
-
- return this.strip();
- };
-
- BN.prototype.ior = function ior (num) {
- assert((this.negative | num.negative) === 0);
- return this.iuor(num);
- };
-
- // Or `num` with `this`
- BN.prototype.or = function or (num) {
- if (this.length > num.length) return this.clone().ior(num);
- return num.clone().ior(this);
- };
-
- BN.prototype.uor = function uor (num) {
- if (this.length > num.length) return this.clone().iuor(num);
- return num.clone().iuor(this);
- };
-
- // And `num` with `this` in-place
- BN.prototype.iuand = function iuand (num) {
- // b = min-length(num, this)
- var b;
- if (this.length > num.length) {
- b = num;
- } else {
- b = this;
- }
-
- for (var i = 0; i < b.length; i++) {
- this.words[i] = this.words[i] & num.words[i];
- }
-
- this.length = b.length;
-
- return this.strip();
- };
-
- BN.prototype.iand = function iand (num) {
- assert((this.negative | num.negative) === 0);
- return this.iuand(num);
- };
-
- // And `num` with `this`
- BN.prototype.and = function and (num) {
- if (this.length > num.length) return this.clone().iand(num);
- return num.clone().iand(this);
- };
-
- BN.prototype.uand = function uand (num) {
- if (this.length > num.length) return this.clone().iuand(num);
- return num.clone().iuand(this);
- };
-
- // Xor `num` with `this` in-place
- BN.prototype.iuxor = function iuxor (num) {
- // a.length > b.length
- var a;
- var b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
-
- for (var i = 0; i < b.length; i++) {
- this.words[i] = a.words[i] ^ b.words[i];
- }
-
- if (this !== a) {
- for (; i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
-
- this.length = a.length;
-
- return this.strip();
- };
-
- BN.prototype.ixor = function ixor (num) {
- assert((this.negative | num.negative) === 0);
- return this.iuxor(num);
- };
-
- // Xor `num` with `this`
- BN.prototype.xor = function xor (num) {
- if (this.length > num.length) return this.clone().ixor(num);
- return num.clone().ixor(this);
- };
-
- BN.prototype.uxor = function uxor (num) {
- if (this.length > num.length) return this.clone().iuxor(num);
- return num.clone().iuxor(this);
- };
-
- // Not ``this`` with ``width`` bitwidth
- BN.prototype.inotn = function inotn (width) {
- assert(typeof width === 'number' && width >= 0);
-
- var bytesNeeded = Math.ceil(width / 26) | 0;
- var bitsLeft = width % 26;
-
- // Extend the buffer with leading zeroes
- this._expand(bytesNeeded);
-
- if (bitsLeft > 0) {
- bytesNeeded--;
- }
-
- // Handle complete words
- for (var i = 0; i < bytesNeeded; i++) {
- this.words[i] = ~this.words[i] & 0x3ffffff;
- }
-
- // Handle the residue
- if (bitsLeft > 0) {
- this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));
- }
-
- // And remove leading zeroes
- return this.strip();
- };
-
- BN.prototype.notn = function notn (width) {
- return this.clone().inotn(width);
- };
-
- // Set `bit` of `this`
- BN.prototype.setn = function setn (bit, val) {
- assert(typeof bit === 'number' && bit >= 0);
-
- var off = (bit / 26) | 0;
- var wbit = bit % 26;
-
- this._expand(off + 1);
-
- if (val) {
- this.words[off] = this.words[off] | (1 << wbit);
- } else {
- this.words[off] = this.words[off] & ~(1 << wbit);
- }
-
- return this.strip();
- };
-
- // Add `num` to `this` in-place
- BN.prototype.iadd = function iadd (num) {
- var r;
-
- // negative + positive
- if (this.negative !== 0 && num.negative === 0) {
- this.negative = 0;
- r = this.isub(num);
- this.negative ^= 1;
- return this._normSign();
-
- // positive + negative
- } else if (this.negative === 0 && num.negative !== 0) {
- num.negative = 0;
- r = this.isub(num);
- num.negative = 1;
- return r._normSign();
- }
-
- // a.length > b.length
- var a, b;
- if (this.length > num.length) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
-
- var carry = 0;
- for (var i = 0; i < b.length; i++) {
- r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
- this.words[i] = r & 0x3ffffff;
- carry = r >>> 26;
- }
- for (; carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- this.words[i] = r & 0x3ffffff;
- carry = r >>> 26;
- }
-
- this.length = a.length;
- if (carry !== 0) {
- this.words[this.length] = carry;
- this.length++;
- // Copy the rest of the words
- } else if (a !== this) {
- for (; i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
-
- return this;
- };
-
- // Add `num` to `this`
- BN.prototype.add = function add (num) {
- var res;
- if (num.negative !== 0 && this.negative === 0) {
- num.negative = 0;
- res = this.sub(num);
- num.negative ^= 1;
- return res;
- } else if (num.negative === 0 && this.negative !== 0) {
- this.negative = 0;
- res = num.sub(this);
- this.negative = 1;
- return res;
- }
-
- if (this.length > num.length) return this.clone().iadd(num);
-
- return num.clone().iadd(this);
- };
-
- // Subtract `num` from `this` in-place
- BN.prototype.isub = function isub (num) {
- // this - (-num) = this + num
- if (num.negative !== 0) {
- num.negative = 0;
- var r = this.iadd(num);
- num.negative = 1;
- return r._normSign();
-
- // -this - num = -(this + num)
- } else if (this.negative !== 0) {
- this.negative = 0;
- this.iadd(num);
- this.negative = 1;
- return this._normSign();
- }
-
- // At this point both numbers are positive
- var cmp = this.cmp(num);
-
- // Optimization - zeroify
- if (cmp === 0) {
- this.negative = 0;
- this.length = 1;
- this.words[0] = 0;
- return this;
- }
-
- // a > b
- var a, b;
- if (cmp > 0) {
- a = this;
- b = num;
- } else {
- a = num;
- b = this;
- }
-
- var carry = 0;
- for (var i = 0; i < b.length; i++) {
- r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 0x3ffffff;
- }
- for (; carry !== 0 && i < a.length; i++) {
- r = (a.words[i] | 0) + carry;
- carry = r >> 26;
- this.words[i] = r & 0x3ffffff;
- }
-
- // Copy rest of the words
- if (carry === 0 && i < a.length && a !== this) {
- for (; i < a.length; i++) {
- this.words[i] = a.words[i];
- }
- }
-
- this.length = Math.max(this.length, i);
-
- if (a !== this) {
- this.negative = 1;
- }
-
- return this.strip();
- };
-
- // Subtract `num` from `this`
- BN.prototype.sub = function sub (num) {
- return this.clone().isub(num);
- };
-
- function smallMulTo (self, num, out) {
- out.negative = num.negative ^ self.negative;
- var len = (self.length + num.length) | 0;
- out.length = len;
- len = (len - 1) | 0;
-
- // Peel one iteration (compiler can't do it, because of code complexity)
- var a = self.words[0] | 0;
- var b = num.words[0] | 0;
- var r = a * b;
-
- var lo = r & 0x3ffffff;
- var carry = (r / 0x4000000) | 0;
- out.words[0] = lo;
-
- for (var k = 1; k < len; k++) {
- // Sum all words with the same `i + j = k` and accumulate `ncarry`,
- // note that ncarry could be >= 0x3ffffff
- var ncarry = carry >>> 26;
- var rword = carry & 0x3ffffff;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
- var i = (k - j) | 0;
- a = self.words[i] | 0;
- b = num.words[j] | 0;
- r = a * b + rword;
- ncarry += (r / 0x4000000) | 0;
- rword = r & 0x3ffffff;
- }
- out.words[k] = rword | 0;
- carry = ncarry | 0;
- }
- if (carry !== 0) {
- out.words[k] = carry | 0;
- } else {
- out.length--;
- }
-
- return out.strip();
- }
-
- // TODO(indutny): it may be reasonable to omit it for users who don't need
- // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit
- // multiplication (like elliptic secp256k1).
- var comb10MulTo = function comb10MulTo (self, num, out) {
- var a = self.words;
- var b = num.words;
- var o = out.words;
- var c = 0;
- var lo;
- var mid;
- var hi;
- var a0 = a[0] | 0;
- var al0 = a0 & 0x1fff;
- var ah0 = a0 >>> 13;
- var a1 = a[1] | 0;
- var al1 = a1 & 0x1fff;
- var ah1 = a1 >>> 13;
- var a2 = a[2] | 0;
- var al2 = a2 & 0x1fff;
- var ah2 = a2 >>> 13;
- var a3 = a[3] | 0;
- var al3 = a3 & 0x1fff;
- var ah3 = a3 >>> 13;
- var a4 = a[4] | 0;
- var al4 = a4 & 0x1fff;
- var ah4 = a4 >>> 13;
- var a5 = a[5] | 0;
- var al5 = a5 & 0x1fff;
- var ah5 = a5 >>> 13;
- var a6 = a[6] | 0;
- var al6 = a6 & 0x1fff;
- var ah6 = a6 >>> 13;
- var a7 = a[7] | 0;
- var al7 = a7 & 0x1fff;
- var ah7 = a7 >>> 13;
- var a8 = a[8] | 0;
- var al8 = a8 & 0x1fff;
- var ah8 = a8 >>> 13;
- var a9 = a[9] | 0;
- var al9 = a9 & 0x1fff;
- var ah9 = a9 >>> 13;
- var b0 = b[0] | 0;
- var bl0 = b0 & 0x1fff;
- var bh0 = b0 >>> 13;
- var b1 = b[1] | 0;
- var bl1 = b1 & 0x1fff;
- var bh1 = b1 >>> 13;
- var b2 = b[2] | 0;
- var bl2 = b2 & 0x1fff;
- var bh2 = b2 >>> 13;
- var b3 = b[3] | 0;
- var bl3 = b3 & 0x1fff;
- var bh3 = b3 >>> 13;
- var b4 = b[4] | 0;
- var bl4 = b4 & 0x1fff;
- var bh4 = b4 >>> 13;
- var b5 = b[5] | 0;
- var bl5 = b5 & 0x1fff;
- var bh5 = b5 >>> 13;
- var b6 = b[6] | 0;
- var bl6 = b6 & 0x1fff;
- var bh6 = b6 >>> 13;
- var b7 = b[7] | 0;
- var bl7 = b7 & 0x1fff;
- var bh7 = b7 >>> 13;
- var b8 = b[8] | 0;
- var bl8 = b8 & 0x1fff;
- var bh8 = b8 >>> 13;
- var b9 = b[9] | 0;
- var bl9 = b9 & 0x1fff;
- var bh9 = b9 >>> 13;
-
- out.negative = self.negative ^ num.negative;
- out.length = 19;
- /* k = 0 */
- lo = Math.imul(al0, bl0);
- mid = Math.imul(al0, bh0);
- mid = (mid + Math.imul(ah0, bl0)) | 0;
- hi = Math.imul(ah0, bh0);
- var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;
- w0 &= 0x3ffffff;
- /* k = 1 */
- lo = Math.imul(al1, bl0);
- mid = Math.imul(al1, bh0);
- mid = (mid + Math.imul(ah1, bl0)) | 0;
- hi = Math.imul(ah1, bh0);
- lo = (lo + Math.imul(al0, bl1)) | 0;
- mid = (mid + Math.imul(al0, bh1)) | 0;
- mid = (mid + Math.imul(ah0, bl1)) | 0;
- hi = (hi + Math.imul(ah0, bh1)) | 0;
- var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;
- w1 &= 0x3ffffff;
- /* k = 2 */
- lo = Math.imul(al2, bl0);
- mid = Math.imul(al2, bh0);
- mid = (mid + Math.imul(ah2, bl0)) | 0;
- hi = Math.imul(ah2, bh0);
- lo = (lo + Math.imul(al1, bl1)) | 0;
- mid = (mid + Math.imul(al1, bh1)) | 0;
- mid = (mid + Math.imul(ah1, bl1)) | 0;
- hi = (hi + Math.imul(ah1, bh1)) | 0;
- lo = (lo + Math.imul(al0, bl2)) | 0;
- mid = (mid + Math.imul(al0, bh2)) | 0;
- mid = (mid + Math.imul(ah0, bl2)) | 0;
- hi = (hi + Math.imul(ah0, bh2)) | 0;
- var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;
- w2 &= 0x3ffffff;
- /* k = 3 */
- lo = Math.imul(al3, bl0);
- mid = Math.imul(al3, bh0);
- mid = (mid + Math.imul(ah3, bl0)) | 0;
- hi = Math.imul(ah3, bh0);
- lo = (lo + Math.imul(al2, bl1)) | 0;
- mid = (mid + Math.imul(al2, bh1)) | 0;
- mid = (mid + Math.imul(ah2, bl1)) | 0;
- hi = (hi + Math.imul(ah2, bh1)) | 0;
- lo = (lo + Math.imul(al1, bl2)) | 0;
- mid = (mid + Math.imul(al1, bh2)) | 0;
- mid = (mid + Math.imul(ah1, bl2)) | 0;
- hi = (hi + Math.imul(ah1, bh2)) | 0;
- lo = (lo + Math.imul(al0, bl3)) | 0;
- mid = (mid + Math.imul(al0, bh3)) | 0;
- mid = (mid + Math.imul(ah0, bl3)) | 0;
- hi = (hi + Math.imul(ah0, bh3)) | 0;
- var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;
- w3 &= 0x3ffffff;
- /* k = 4 */
- lo = Math.imul(al4, bl0);
- mid = Math.imul(al4, bh0);
- mid = (mid + Math.imul(ah4, bl0)) | 0;
- hi = Math.imul(ah4, bh0);
- lo = (lo + Math.imul(al3, bl1)) | 0;
- mid = (mid + Math.imul(al3, bh1)) | 0;
- mid = (mid + Math.imul(ah3, bl1)) | 0;
- hi = (hi + Math.imul(ah3, bh1)) | 0;
- lo = (lo + Math.imul(al2, bl2)) | 0;
- mid = (mid + Math.imul(al2, bh2)) | 0;
- mid = (mid + Math.imul(ah2, bl2)) | 0;
- hi = (hi + Math.imul(ah2, bh2)) | 0;
- lo = (lo + Math.imul(al1, bl3)) | 0;
- mid = (mid + Math.imul(al1, bh3)) | 0;
- mid = (mid + Math.imul(ah1, bl3)) | 0;
- hi = (hi + Math.imul(ah1, bh3)) | 0;
- lo = (lo + Math.imul(al0, bl4)) | 0;
- mid = (mid + Math.imul(al0, bh4)) | 0;
- mid = (mid + Math.imul(ah0, bl4)) | 0;
- hi = (hi + Math.imul(ah0, bh4)) | 0;
- var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;
- w4 &= 0x3ffffff;
- /* k = 5 */
- lo = Math.imul(al5, bl0);
- mid = Math.imul(al5, bh0);
- mid = (mid + Math.imul(ah5, bl0)) | 0;
- hi = Math.imul(ah5, bh0);
- lo = (lo + Math.imul(al4, bl1)) | 0;
- mid = (mid + Math.imul(al4, bh1)) | 0;
- mid = (mid + Math.imul(ah4, bl1)) | 0;
- hi = (hi + Math.imul(ah4, bh1)) | 0;
- lo = (lo + Math.imul(al3, bl2)) | 0;
- mid = (mid + Math.imul(al3, bh2)) | 0;
- mid = (mid + Math.imul(ah3, bl2)) | 0;
- hi = (hi + Math.imul(ah3, bh2)) | 0;
- lo = (lo + Math.imul(al2, bl3)) | 0;
- mid = (mid + Math.imul(al2, bh3)) | 0;
- mid = (mid + Math.imul(ah2, bl3)) | 0;
- hi = (hi + Math.imul(ah2, bh3)) | 0;
- lo = (lo + Math.imul(al1, bl4)) | 0;
- mid = (mid + Math.imul(al1, bh4)) | 0;
- mid = (mid + Math.imul(ah1, bl4)) | 0;
- hi = (hi + Math.imul(ah1, bh4)) | 0;
- lo = (lo + Math.imul(al0, bl5)) | 0;
- mid = (mid + Math.imul(al0, bh5)) | 0;
- mid = (mid + Math.imul(ah0, bl5)) | 0;
- hi = (hi + Math.imul(ah0, bh5)) | 0;
- var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;
- w5 &= 0x3ffffff;
- /* k = 6 */
- lo = Math.imul(al6, bl0);
- mid = Math.imul(al6, bh0);
- mid = (mid + Math.imul(ah6, bl0)) | 0;
- hi = Math.imul(ah6, bh0);
- lo = (lo + Math.imul(al5, bl1)) | 0;
- mid = (mid + Math.imul(al5, bh1)) | 0;
- mid = (mid + Math.imul(ah5, bl1)) | 0;
- hi = (hi + Math.imul(ah5, bh1)) | 0;
- lo = (lo + Math.imul(al4, bl2)) | 0;
- mid = (mid + Math.imul(al4, bh2)) | 0;
- mid = (mid + Math.imul(ah4, bl2)) | 0;
- hi = (hi + Math.imul(ah4, bh2)) | 0;
- lo = (lo + Math.imul(al3, bl3)) | 0;
- mid = (mid + Math.imul(al3, bh3)) | 0;
- mid = (mid + Math.imul(ah3, bl3)) | 0;
- hi = (hi + Math.imul(ah3, bh3)) | 0;
- lo = (lo + Math.imul(al2, bl4)) | 0;
- mid = (mid + Math.imul(al2, bh4)) | 0;
- mid = (mid + Math.imul(ah2, bl4)) | 0;
- hi = (hi + Math.imul(ah2, bh4)) | 0;
- lo = (lo + Math.imul(al1, bl5)) | 0;
- mid = (mid + Math.imul(al1, bh5)) | 0;
- mid = (mid + Math.imul(ah1, bl5)) | 0;
- hi = (hi + Math.imul(ah1, bh5)) | 0;
- lo = (lo + Math.imul(al0, bl6)) | 0;
- mid = (mid + Math.imul(al0, bh6)) | 0;
- mid = (mid + Math.imul(ah0, bl6)) | 0;
- hi = (hi + Math.imul(ah0, bh6)) | 0;
- var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;
- w6 &= 0x3ffffff;
- /* k = 7 */
- lo = Math.imul(al7, bl0);
- mid = Math.imul(al7, bh0);
- mid = (mid + Math.imul(ah7, bl0)) | 0;
- hi = Math.imul(ah7, bh0);
- lo = (lo + Math.imul(al6, bl1)) | 0;
- mid = (mid + Math.imul(al6, bh1)) | 0;
- mid = (mid + Math.imul(ah6, bl1)) | 0;
- hi = (hi + Math.imul(ah6, bh1)) | 0;
- lo = (lo + Math.imul(al5, bl2)) | 0;
- mid = (mid + Math.imul(al5, bh2)) | 0;
- mid = (mid + Math.imul(ah5, bl2)) | 0;
- hi = (hi + Math.imul(ah5, bh2)) | 0;
- lo = (lo + Math.imul(al4, bl3)) | 0;
- mid = (mid + Math.imul(al4, bh3)) | 0;
- mid = (mid + Math.imul(ah4, bl3)) | 0;
- hi = (hi + Math.imul(ah4, bh3)) | 0;
- lo = (lo + Math.imul(al3, bl4)) | 0;
- mid = (mid + Math.imul(al3, bh4)) | 0;
- mid = (mid + Math.imul(ah3, bl4)) | 0;
- hi = (hi + Math.imul(ah3, bh4)) | 0;
- lo = (lo + Math.imul(al2, bl5)) | 0;
- mid = (mid + Math.imul(al2, bh5)) | 0;
- mid = (mid + Math.imul(ah2, bl5)) | 0;
- hi = (hi + Math.imul(ah2, bh5)) | 0;
- lo = (lo + Math.imul(al1, bl6)) | 0;
- mid = (mid + Math.imul(al1, bh6)) | 0;
- mid = (mid + Math.imul(ah1, bl6)) | 0;
- hi = (hi + Math.imul(ah1, bh6)) | 0;
- lo = (lo + Math.imul(al0, bl7)) | 0;
- mid = (mid + Math.imul(al0, bh7)) | 0;
- mid = (mid + Math.imul(ah0, bl7)) | 0;
- hi = (hi + Math.imul(ah0, bh7)) | 0;
- var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;
- w7 &= 0x3ffffff;
- /* k = 8 */
- lo = Math.imul(al8, bl0);
- mid = Math.imul(al8, bh0);
- mid = (mid + Math.imul(ah8, bl0)) | 0;
- hi = Math.imul(ah8, bh0);
- lo = (lo + Math.imul(al7, bl1)) | 0;
- mid = (mid + Math.imul(al7, bh1)) | 0;
- mid = (mid + Math.imul(ah7, bl1)) | 0;
- hi = (hi + Math.imul(ah7, bh1)) | 0;
- lo = (lo + Math.imul(al6, bl2)) | 0;
- mid = (mid + Math.imul(al6, bh2)) | 0;
- mid = (mid + Math.imul(ah6, bl2)) | 0;
- hi = (hi + Math.imul(ah6, bh2)) | 0;
- lo = (lo + Math.imul(al5, bl3)) | 0;
- mid = (mid + Math.imul(al5, bh3)) | 0;
- mid = (mid + Math.imul(ah5, bl3)) | 0;
- hi = (hi + Math.imul(ah5, bh3)) | 0;
- lo = (lo + Math.imul(al4, bl4)) | 0;
- mid = (mid + Math.imul(al4, bh4)) | 0;
- mid = (mid + Math.imul(ah4, bl4)) | 0;
- hi = (hi + Math.imul(ah4, bh4)) | 0;
- lo = (lo + Math.imul(al3, bl5)) | 0;
- mid = (mid + Math.imul(al3, bh5)) | 0;
- mid = (mid + Math.imul(ah3, bl5)) | 0;
- hi = (hi + Math.imul(ah3, bh5)) | 0;
- lo = (lo + Math.imul(al2, bl6)) | 0;
- mid = (mid + Math.imul(al2, bh6)) | 0;
- mid = (mid + Math.imul(ah2, bl6)) | 0;
- hi = (hi + Math.imul(ah2, bh6)) | 0;
- lo = (lo + Math.imul(al1, bl7)) | 0;
- mid = (mid + Math.imul(al1, bh7)) | 0;
- mid = (mid + Math.imul(ah1, bl7)) | 0;
- hi = (hi + Math.imul(ah1, bh7)) | 0;
- lo = (lo + Math.imul(al0, bl8)) | 0;
- mid = (mid + Math.imul(al0, bh8)) | 0;
- mid = (mid + Math.imul(ah0, bl8)) | 0;
- hi = (hi + Math.imul(ah0, bh8)) | 0;
- var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;
- w8 &= 0x3ffffff;
- /* k = 9 */
- lo = Math.imul(al9, bl0);
- mid = Math.imul(al9, bh0);
- mid = (mid + Math.imul(ah9, bl0)) | 0;
- hi = Math.imul(ah9, bh0);
- lo = (lo + Math.imul(al8, bl1)) | 0;
- mid = (mid + Math.imul(al8, bh1)) | 0;
- mid = (mid + Math.imul(ah8, bl1)) | 0;
- hi = (hi + Math.imul(ah8, bh1)) | 0;
- lo = (lo + Math.imul(al7, bl2)) | 0;
- mid = (mid + Math.imul(al7, bh2)) | 0;
- mid = (mid + Math.imul(ah7, bl2)) | 0;
- hi = (hi + Math.imul(ah7, bh2)) | 0;
- lo = (lo + Math.imul(al6, bl3)) | 0;
- mid = (mid + Math.imul(al6, bh3)) | 0;
- mid = (mid + Math.imul(ah6, bl3)) | 0;
- hi = (hi + Math.imul(ah6, bh3)) | 0;
- lo = (lo + Math.imul(al5, bl4)) | 0;
- mid = (mid + Math.imul(al5, bh4)) | 0;
- mid = (mid + Math.imul(ah5, bl4)) | 0;
- hi = (hi + Math.imul(ah5, bh4)) | 0;
- lo = (lo + Math.imul(al4, bl5)) | 0;
- mid = (mid + Math.imul(al4, bh5)) | 0;
- mid = (mid + Math.imul(ah4, bl5)) | 0;
- hi = (hi + Math.imul(ah4, bh5)) | 0;
- lo = (lo + Math.imul(al3, bl6)) | 0;
- mid = (mid + Math.imul(al3, bh6)) | 0;
- mid = (mid + Math.imul(ah3, bl6)) | 0;
- hi = (hi + Math.imul(ah3, bh6)) | 0;
- lo = (lo + Math.imul(al2, bl7)) | 0;
- mid = (mid + Math.imul(al2, bh7)) | 0;
- mid = (mid + Math.imul(ah2, bl7)) | 0;
- hi = (hi + Math.imul(ah2, bh7)) | 0;
- lo = (lo + Math.imul(al1, bl8)) | 0;
- mid = (mid + Math.imul(al1, bh8)) | 0;
- mid = (mid + Math.imul(ah1, bl8)) | 0;
- hi = (hi + Math.imul(ah1, bh8)) | 0;
- lo = (lo + Math.imul(al0, bl9)) | 0;
- mid = (mid + Math.imul(al0, bh9)) | 0;
- mid = (mid + Math.imul(ah0, bl9)) | 0;
- hi = (hi + Math.imul(ah0, bh9)) | 0;
- var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;
- w9 &= 0x3ffffff;
- /* k = 10 */
- lo = Math.imul(al9, bl1);
- mid = Math.imul(al9, bh1);
- mid = (mid + Math.imul(ah9, bl1)) | 0;
- hi = Math.imul(ah9, bh1);
- lo = (lo + Math.imul(al8, bl2)) | 0;
- mid = (mid + Math.imul(al8, bh2)) | 0;
- mid = (mid + Math.imul(ah8, bl2)) | 0;
- hi = (hi + Math.imul(ah8, bh2)) | 0;
- lo = (lo + Math.imul(al7, bl3)) | 0;
- mid = (mid + Math.imul(al7, bh3)) | 0;
- mid = (mid + Math.imul(ah7, bl3)) | 0;
- hi = (hi + Math.imul(ah7, bh3)) | 0;
- lo = (lo + Math.imul(al6, bl4)) | 0;
- mid = (mid + Math.imul(al6, bh4)) | 0;
- mid = (mid + Math.imul(ah6, bl4)) | 0;
- hi = (hi + Math.imul(ah6, bh4)) | 0;
- lo = (lo + Math.imul(al5, bl5)) | 0;
- mid = (mid + Math.imul(al5, bh5)) | 0;
- mid = (mid + Math.imul(ah5, bl5)) | 0;
- hi = (hi + Math.imul(ah5, bh5)) | 0;
- lo = (lo + Math.imul(al4, bl6)) | 0;
- mid = (mid + Math.imul(al4, bh6)) | 0;
- mid = (mid + Math.imul(ah4, bl6)) | 0;
- hi = (hi + Math.imul(ah4, bh6)) | 0;
- lo = (lo + Math.imul(al3, bl7)) | 0;
- mid = (mid + Math.imul(al3, bh7)) | 0;
- mid = (mid + Math.imul(ah3, bl7)) | 0;
- hi = (hi + Math.imul(ah3, bh7)) | 0;
- lo = (lo + Math.imul(al2, bl8)) | 0;
- mid = (mid + Math.imul(al2, bh8)) | 0;
- mid = (mid + Math.imul(ah2, bl8)) | 0;
- hi = (hi + Math.imul(ah2, bh8)) | 0;
- lo = (lo + Math.imul(al1, bl9)) | 0;
- mid = (mid + Math.imul(al1, bh9)) | 0;
- mid = (mid + Math.imul(ah1, bl9)) | 0;
- hi = (hi + Math.imul(ah1, bh9)) | 0;
- var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;
- w10 &= 0x3ffffff;
- /* k = 11 */
- lo = Math.imul(al9, bl2);
- mid = Math.imul(al9, bh2);
- mid = (mid + Math.imul(ah9, bl2)) | 0;
- hi = Math.imul(ah9, bh2);
- lo = (lo + Math.imul(al8, bl3)) | 0;
- mid = (mid + Math.imul(al8, bh3)) | 0;
- mid = (mid + Math.imul(ah8, bl3)) | 0;
- hi = (hi + Math.imul(ah8, bh3)) | 0;
- lo = (lo + Math.imul(al7, bl4)) | 0;
- mid = (mid + Math.imul(al7, bh4)) | 0;
- mid = (mid + Math.imul(ah7, bl4)) | 0;
- hi = (hi + Math.imul(ah7, bh4)) | 0;
- lo = (lo + Math.imul(al6, bl5)) | 0;
- mid = (mid + Math.imul(al6, bh5)) | 0;
- mid = (mid + Math.imul(ah6, bl5)) | 0;
- hi = (hi + Math.imul(ah6, bh5)) | 0;
- lo = (lo + Math.imul(al5, bl6)) | 0;
- mid = (mid + Math.imul(al5, bh6)) | 0;
- mid = (mid + Math.imul(ah5, bl6)) | 0;
- hi = (hi + Math.imul(ah5, bh6)) | 0;
- lo = (lo + Math.imul(al4, bl7)) | 0;
- mid = (mid + Math.imul(al4, bh7)) | 0;
- mid = (mid + Math.imul(ah4, bl7)) | 0;
- hi = (hi + Math.imul(ah4, bh7)) | 0;
- lo = (lo + Math.imul(al3, bl8)) | 0;
- mid = (mid + Math.imul(al3, bh8)) | 0;
- mid = (mid + Math.imul(ah3, bl8)) | 0;
- hi = (hi + Math.imul(ah3, bh8)) | 0;
- lo = (lo + Math.imul(al2, bl9)) | 0;
- mid = (mid + Math.imul(al2, bh9)) | 0;
- mid = (mid + Math.imul(ah2, bl9)) | 0;
- hi = (hi + Math.imul(ah2, bh9)) | 0;
- var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;
- w11 &= 0x3ffffff;
- /* k = 12 */
- lo = Math.imul(al9, bl3);
- mid = Math.imul(al9, bh3);
- mid = (mid + Math.imul(ah9, bl3)) | 0;
- hi = Math.imul(ah9, bh3);
- lo = (lo + Math.imul(al8, bl4)) | 0;
- mid = (mid + Math.imul(al8, bh4)) | 0;
- mid = (mid + Math.imul(ah8, bl4)) | 0;
- hi = (hi + Math.imul(ah8, bh4)) | 0;
- lo = (lo + Math.imul(al7, bl5)) | 0;
- mid = (mid + Math.imul(al7, bh5)) | 0;
- mid = (mid + Math.imul(ah7, bl5)) | 0;
- hi = (hi + Math.imul(ah7, bh5)) | 0;
- lo = (lo + Math.imul(al6, bl6)) | 0;
- mid = (mid + Math.imul(al6, bh6)) | 0;
- mid = (mid + Math.imul(ah6, bl6)) | 0;
- hi = (hi + Math.imul(ah6, bh6)) | 0;
- lo = (lo + Math.imul(al5, bl7)) | 0;
- mid = (mid + Math.imul(al5, bh7)) | 0;
- mid = (mid + Math.imul(ah5, bl7)) | 0;
- hi = (hi + Math.imul(ah5, bh7)) | 0;
- lo = (lo + Math.imul(al4, bl8)) | 0;
- mid = (mid + Math.imul(al4, bh8)) | 0;
- mid = (mid + Math.imul(ah4, bl8)) | 0;
- hi = (hi + Math.imul(ah4, bh8)) | 0;
- lo = (lo + Math.imul(al3, bl9)) | 0;
- mid = (mid + Math.imul(al3, bh9)) | 0;
- mid = (mid + Math.imul(ah3, bl9)) | 0;
- hi = (hi + Math.imul(ah3, bh9)) | 0;
- var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;
- w12 &= 0x3ffffff;
- /* k = 13 */
- lo = Math.imul(al9, bl4);
- mid = Math.imul(al9, bh4);
- mid = (mid + Math.imul(ah9, bl4)) | 0;
- hi = Math.imul(ah9, bh4);
- lo = (lo + Math.imul(al8, bl5)) | 0;
- mid = (mid + Math.imul(al8, bh5)) | 0;
- mid = (mid + Math.imul(ah8, bl5)) | 0;
- hi = (hi + Math.imul(ah8, bh5)) | 0;
- lo = (lo + Math.imul(al7, bl6)) | 0;
- mid = (mid + Math.imul(al7, bh6)) | 0;
- mid = (mid + Math.imul(ah7, bl6)) | 0;
- hi = (hi + Math.imul(ah7, bh6)) | 0;
- lo = (lo + Math.imul(al6, bl7)) | 0;
- mid = (mid + Math.imul(al6, bh7)) | 0;
- mid = (mid + Math.imul(ah6, bl7)) | 0;
- hi = (hi + Math.imul(ah6, bh7)) | 0;
- lo = (lo + Math.imul(al5, bl8)) | 0;
- mid = (mid + Math.imul(al5, bh8)) | 0;
- mid = (mid + Math.imul(ah5, bl8)) | 0;
- hi = (hi + Math.imul(ah5, bh8)) | 0;
- lo = (lo + Math.imul(al4, bl9)) | 0;
- mid = (mid + Math.imul(al4, bh9)) | 0;
- mid = (mid + Math.imul(ah4, bl9)) | 0;
- hi = (hi + Math.imul(ah4, bh9)) | 0;
- var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;
- w13 &= 0x3ffffff;
- /* k = 14 */
- lo = Math.imul(al9, bl5);
- mid = Math.imul(al9, bh5);
- mid = (mid + Math.imul(ah9, bl5)) | 0;
- hi = Math.imul(ah9, bh5);
- lo = (lo + Math.imul(al8, bl6)) | 0;
- mid = (mid + Math.imul(al8, bh6)) | 0;
- mid = (mid + Math.imul(ah8, bl6)) | 0;
- hi = (hi + Math.imul(ah8, bh6)) | 0;
- lo = (lo + Math.imul(al7, bl7)) | 0;
- mid = (mid + Math.imul(al7, bh7)) | 0;
- mid = (mid + Math.imul(ah7, bl7)) | 0;
- hi = (hi + Math.imul(ah7, bh7)) | 0;
- lo = (lo + Math.imul(al6, bl8)) | 0;
- mid = (mid + Math.imul(al6, bh8)) | 0;
- mid = (mid + Math.imul(ah6, bl8)) | 0;
- hi = (hi + Math.imul(ah6, bh8)) | 0;
- lo = (lo + Math.imul(al5, bl9)) | 0;
- mid = (mid + Math.imul(al5, bh9)) | 0;
- mid = (mid + Math.imul(ah5, bl9)) | 0;
- hi = (hi + Math.imul(ah5, bh9)) | 0;
- var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;
- w14 &= 0x3ffffff;
- /* k = 15 */
- lo = Math.imul(al9, bl6);
- mid = Math.imul(al9, bh6);
- mid = (mid + Math.imul(ah9, bl6)) | 0;
- hi = Math.imul(ah9, bh6);
- lo = (lo + Math.imul(al8, bl7)) | 0;
- mid = (mid + Math.imul(al8, bh7)) | 0;
- mid = (mid + Math.imul(ah8, bl7)) | 0;
- hi = (hi + Math.imul(ah8, bh7)) | 0;
- lo = (lo + Math.imul(al7, bl8)) | 0;
- mid = (mid + Math.imul(al7, bh8)) | 0;
- mid = (mid + Math.imul(ah7, bl8)) | 0;
- hi = (hi + Math.imul(ah7, bh8)) | 0;
- lo = (lo + Math.imul(al6, bl9)) | 0;
- mid = (mid + Math.imul(al6, bh9)) | 0;
- mid = (mid + Math.imul(ah6, bl9)) | 0;
- hi = (hi + Math.imul(ah6, bh9)) | 0;
- var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;
- w15 &= 0x3ffffff;
- /* k = 16 */
- lo = Math.imul(al9, bl7);
- mid = Math.imul(al9, bh7);
- mid = (mid + Math.imul(ah9, bl7)) | 0;
- hi = Math.imul(ah9, bh7);
- lo = (lo + Math.imul(al8, bl8)) | 0;
- mid = (mid + Math.imul(al8, bh8)) | 0;
- mid = (mid + Math.imul(ah8, bl8)) | 0;
- hi = (hi + Math.imul(ah8, bh8)) | 0;
- lo = (lo + Math.imul(al7, bl9)) | 0;
- mid = (mid + Math.imul(al7, bh9)) | 0;
- mid = (mid + Math.imul(ah7, bl9)) | 0;
- hi = (hi + Math.imul(ah7, bh9)) | 0;
- var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;
- w16 &= 0x3ffffff;
- /* k = 17 */
- lo = Math.imul(al9, bl8);
- mid = Math.imul(al9, bh8);
- mid = (mid + Math.imul(ah9, bl8)) | 0;
- hi = Math.imul(ah9, bh8);
- lo = (lo + Math.imul(al8, bl9)) | 0;
- mid = (mid + Math.imul(al8, bh9)) | 0;
- mid = (mid + Math.imul(ah8, bl9)) | 0;
- hi = (hi + Math.imul(ah8, bh9)) | 0;
- var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;
- w17 &= 0x3ffffff;
- /* k = 18 */
- lo = Math.imul(al9, bl9);
- mid = Math.imul(al9, bh9);
- mid = (mid + Math.imul(ah9, bl9)) | 0;
- hi = Math.imul(ah9, bh9);
- var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
- c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;
- w18 &= 0x3ffffff;
- o[0] = w0;
- o[1] = w1;
- o[2] = w2;
- o[3] = w3;
- o[4] = w4;
- o[5] = w5;
- o[6] = w6;
- o[7] = w7;
- o[8] = w8;
- o[9] = w9;
- o[10] = w10;
- o[11] = w11;
- o[12] = w12;
- o[13] = w13;
- o[14] = w14;
- o[15] = w15;
- o[16] = w16;
- o[17] = w17;
- o[18] = w18;
- if (c !== 0) {
- o[19] = c;
- out.length++;
- }
- return out;
- };
-
- // Polyfill comb
- if (!Math.imul) {
- comb10MulTo = smallMulTo;
- }
-
- function bigMulTo (self, num, out) {
- out.negative = num.negative ^ self.negative;
- out.length = self.length + num.length;
-
- var carry = 0;
- var hncarry = 0;
- for (var k = 0; k < out.length - 1; k++) {
- // Sum all words with the same `i + j = k` and accumulate `ncarry`,
- // note that ncarry could be >= 0x3ffffff
- var ncarry = hncarry;
- hncarry = 0;
- var rword = carry & 0x3ffffff;
- var maxJ = Math.min(k, num.length - 1);
- for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
- var i = k - j;
- var a = self.words[i] | 0;
- var b = num.words[j] | 0;
- var r = a * b;
-
- var lo = r & 0x3ffffff;
- ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
- lo = (lo + rword) | 0;
- rword = lo & 0x3ffffff;
- ncarry = (ncarry + (lo >>> 26)) | 0;
-
- hncarry += ncarry >>> 26;
- ncarry &= 0x3ffffff;
- }
- out.words[k] = rword;
- carry = ncarry;
- ncarry = hncarry;
- }
- if (carry !== 0) {
- out.words[k] = carry;
- } else {
- out.length--;
- }
-
- return out.strip();
- }
-
- function jumboMulTo (self, num, out) {
- var fftm = new FFTM();
- return fftm.mulp(self, num, out);
- }
-
- BN.prototype.mulTo = function mulTo (num, out) {
- var res;
- var len = this.length + num.length;
- if (this.length === 10 && num.length === 10) {
- res = comb10MulTo(this, num, out);
- } else if (len < 63) {
- res = smallMulTo(this, num, out);
- } else if (len < 1024) {
- res = bigMulTo(this, num, out);
- } else {
- res = jumboMulTo(this, num, out);
- }
-
- return res;
- };
-
- // Cooley-Tukey algorithm for FFT
- // slightly revisited to rely on looping instead of recursion
-
- function FFTM (x, y) {
- this.x = x;
- this.y = y;
- }
-
- FFTM.prototype.makeRBT = function makeRBT (N) {
- var t = new Array(N);
- var l = BN.prototype._countBits(N) - 1;
- for (var i = 0; i < N; i++) {
- t[i] = this.revBin(i, l, N);
- }
-
- return t;
- };
-
- // Returns binary-reversed representation of `x`
- FFTM.prototype.revBin = function revBin (x, l, N) {
- if (x === 0 || x === N - 1) return x;
-
- var rb = 0;
- for (var i = 0; i < l; i++) {
- rb |= (x & 1) << (l - i - 1);
- x >>= 1;
- }
-
- return rb;
- };
-
- // Performs "tweedling" phase, therefore 'emulating'
- // behaviour of the recursive algorithm
- FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {
- for (var i = 0; i < N; i++) {
- rtws[i] = rws[rbt[i]];
- itws[i] = iws[rbt[i]];
- }
- };
-
- FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {
- this.permute(rbt, rws, iws, rtws, itws, N);
-
- for (var s = 1; s < N; s <<= 1) {
- var l = s << 1;
-
- var rtwdf = Math.cos(2 * Math.PI / l);
- var itwdf = Math.sin(2 * Math.PI / l);
-
- for (var p = 0; p < N; p += l) {
- var rtwdf_ = rtwdf;
- var itwdf_ = itwdf;
-
- for (var j = 0; j < s; j++) {
- var re = rtws[p + j];
- var ie = itws[p + j];
-
- var ro = rtws[p + j + s];
- var io = itws[p + j + s];
-
- var rx = rtwdf_ * ro - itwdf_ * io;
-
- io = rtwdf_ * io + itwdf_ * ro;
- ro = rx;
-
- rtws[p + j] = re + ro;
- itws[p + j] = ie + io;
-
- rtws[p + j + s] = re - ro;
- itws[p + j + s] = ie - io;
-
- /* jshint maxdepth : false */
- if (j !== l) {
- rx = rtwdf * rtwdf_ - itwdf * itwdf_;
-
- itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
- rtwdf_ = rx;
- }
- }
- }
- }
- };
-
- FFTM.prototype.guessLen13b = function guessLen13b (n, m) {
- var N = Math.max(m, n) | 1;
- var odd = N & 1;
- var i = 0;
- for (N = N / 2 | 0; N; N = N >>> 1) {
- i++;
- }
-
- return 1 << i + 1 + odd;
- };
-
- FFTM.prototype.conjugate = function conjugate (rws, iws, N) {
- if (N <= 1) return;
-
- for (var i = 0; i < N / 2; i++) {
- var t = rws[i];
-
- rws[i] = rws[N - i - 1];
- rws[N - i - 1] = t;
-
- t = iws[i];
-
- iws[i] = -iws[N - i - 1];
- iws[N - i - 1] = -t;
- }
- };
-
- FFTM.prototype.normalize13b = function normalize13b (ws, N) {
- var carry = 0;
- for (var i = 0; i < N / 2; i++) {
- var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +
- Math.round(ws[2 * i] / N) +
- carry;
-
- ws[i] = w & 0x3ffffff;
-
- if (w < 0x4000000) {
- carry = 0;
- } else {
- carry = w / 0x4000000 | 0;
- }
- }
-
- return ws;
- };
-
- FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {
- var carry = 0;
- for (var i = 0; i < len; i++) {
- carry = carry + (ws[i] | 0);
-
- rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;
- rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;
- }
-
- // Pad with zeroes
- for (i = 2 * len; i < N; ++i) {
- rws[i] = 0;
- }
-
- assert(carry === 0);
- assert((carry & ~0x1fff) === 0);
- };
-
- FFTM.prototype.stub = function stub (N) {
- var ph = new Array(N);
- for (var i = 0; i < N; i++) {
- ph[i] = 0;
- }
-
- return ph;
- };
-
- FFTM.prototype.mulp = function mulp (x, y, out) {
- var N = 2 * this.guessLen13b(x.length, y.length);
-
- var rbt = this.makeRBT(N);
-
- var _ = this.stub(N);
-
- var rws = new Array(N);
- var rwst = new Array(N);
- var iwst = new Array(N);
-
- var nrws = new Array(N);
- var nrwst = new Array(N);
- var niwst = new Array(N);
-
- var rmws = out.words;
- rmws.length = N;
-
- this.convert13b(x.words, x.length, rws, N);
- this.convert13b(y.words, y.length, nrws, N);
-
- this.transform(rws, _, rwst, iwst, N, rbt);
- this.transform(nrws, _, nrwst, niwst, N, rbt);
-
- for (var i = 0; i < N; i++) {
- var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
- iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
- rwst[i] = rx;
- }
-
- this.conjugate(rwst, iwst, N);
- this.transform(rwst, iwst, rmws, _, N, rbt);
- this.conjugate(rmws, _, N);
- this.normalize13b(rmws, N);
-
- out.negative = x.negative ^ y.negative;
- out.length = x.length + y.length;
- return out.strip();
- };
-
- // Multiply `this` by `num`
- BN.prototype.mul = function mul (num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return this.mulTo(num, out);
- };
-
- // Multiply employing FFT
- BN.prototype.mulf = function mulf (num) {
- var out = new BN(null);
- out.words = new Array(this.length + num.length);
- return jumboMulTo(this, num, out);
- };
-
- // In-place Multiplication
- BN.prototype.imul = function imul (num) {
- return this.clone().mulTo(num, this);
- };
-
- BN.prototype.imuln = function imuln (num) {
- assert(typeof num === 'number');
- assert(num < 0x4000000);
-
- // Carry
- var carry = 0;
- for (var i = 0; i < this.length; i++) {
- var w = (this.words[i] | 0) * num;
- var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);
- carry >>= 26;
- carry += (w / 0x4000000) | 0;
- // NOTE: lo is 27bit maximum
- carry += lo >>> 26;
- this.words[i] = lo & 0x3ffffff;
- }
-
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
-
- return this;
- };
-
- BN.prototype.muln = function muln (num) {
- return this.clone().imuln(num);
- };
-
- // `this` * `this`
- BN.prototype.sqr = function sqr () {
- return this.mul(this);
- };
-
- // `this` * `this` in-place
- BN.prototype.isqr = function isqr () {
- return this.imul(this.clone());
- };
-
- // Math.pow(`this`, `num`)
- BN.prototype.pow = function pow (num) {
- var w = toBitArray(num);
- if (w.length === 0) return new BN(1);
-
- // Skip leading zeroes
- var res = this;
- for (var i = 0; i < w.length; i++, res = res.sqr()) {
- if (w[i] !== 0) break;
- }
-
- if (++i < w.length) {
- for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {
- if (w[i] === 0) continue;
-
- res = res.mul(q);
- }
- }
-
- return res;
- };
-
- // Shift-left in-place
- BN.prototype.iushln = function iushln (bits) {
- assert(typeof bits === 'number' && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
- var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);
- var i;
-
- if (r !== 0) {
- var carry = 0;
-
- for (i = 0; i < this.length; i++) {
- var newCarry = this.words[i] & carryMask;
- var c = ((this.words[i] | 0) - newCarry) << r;
- this.words[i] = c | carry;
- carry = newCarry >>> (26 - r);
- }
-
- if (carry) {
- this.words[i] = carry;
- this.length++;
- }
- }
-
- if (s !== 0) {
- for (i = this.length - 1; i >= 0; i--) {
- this.words[i + s] = this.words[i];
- }
-
- for (i = 0; i < s; i++) {
- this.words[i] = 0;
- }
-
- this.length += s;
- }
-
- return this.strip();
- };
-
- BN.prototype.ishln = function ishln (bits) {
- // TODO(indutny): implement me
- assert(this.negative === 0);
- return this.iushln(bits);
- };
-
- // Shift-right in-place
- // NOTE: `hint` is a lowest bit before trailing zeroes
- // NOTE: if `extended` is present - it will be filled with destroyed bits
- BN.prototype.iushrn = function iushrn (bits, hint, extended) {
- assert(typeof bits === 'number' && bits >= 0);
- var h;
- if (hint) {
- h = (hint - (hint % 26)) / 26;
- } else {
- h = 0;
- }
-
- var r = bits % 26;
- var s = Math.min((bits - r) / 26, this.length);
- var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
- var maskedWords = extended;
-
- h -= s;
- h = Math.max(0, h);
-
- // Extended mode, copy masked part
- if (maskedWords) {
- for (var i = 0; i < s; i++) {
- maskedWords.words[i] = this.words[i];
- }
- maskedWords.length = s;
- }
-
- if (s === 0) {
- // No-op, we should not move anything at all
- } else if (this.length > s) {
- this.length -= s;
- for (i = 0; i < this.length; i++) {
- this.words[i] = this.words[i + s];
- }
- } else {
- this.words[0] = 0;
- this.length = 1;
- }
-
- var carry = 0;
- for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
- var word = this.words[i] | 0;
- this.words[i] = (carry << (26 - r)) | (word >>> r);
- carry = word & mask;
- }
-
- // Push carried bits as a mask
- if (maskedWords && carry !== 0) {
- maskedWords.words[maskedWords.length++] = carry;
- }
-
- if (this.length === 0) {
- this.words[0] = 0;
- this.length = 1;
- }
-
- return this.strip();
- };
-
- BN.prototype.ishrn = function ishrn (bits, hint, extended) {
- // TODO(indutny): implement me
- assert(this.negative === 0);
- return this.iushrn(bits, hint, extended);
- };
-
- // Shift-left
- BN.prototype.shln = function shln (bits) {
- return this.clone().ishln(bits);
- };
-
- BN.prototype.ushln = function ushln (bits) {
- return this.clone().iushln(bits);
- };
-
- // Shift-right
- BN.prototype.shrn = function shrn (bits) {
- return this.clone().ishrn(bits);
- };
-
- BN.prototype.ushrn = function ushrn (bits) {
- return this.clone().iushrn(bits);
- };
-
- // Test if n bit is set
- BN.prototype.testn = function testn (bit) {
- assert(typeof bit === 'number' && bit >= 0);
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
-
- // Fast case: bit is much higher than all existing words
- if (this.length <= s) return false;
-
- // Check bit and return
- var w = this.words[s];
-
- return !!(w & q);
- };
-
- // Return only lowers bits of number (in-place)
- BN.prototype.imaskn = function imaskn (bits) {
- assert(typeof bits === 'number' && bits >= 0);
- var r = bits % 26;
- var s = (bits - r) / 26;
-
- assert(this.negative === 0, 'imaskn works only with positive numbers');
-
- if (this.length <= s) {
- return this;
- }
-
- if (r !== 0) {
- s++;
- }
- this.length = Math.min(s, this.length);
-
- if (r !== 0) {
- var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
- this.words[this.length - 1] &= mask;
- }
-
- return this.strip();
- };
-
- // Return only lowers bits of number
- BN.prototype.maskn = function maskn (bits) {
- return this.clone().imaskn(bits);
- };
-
- // Add plain number `num` to `this`
- BN.prototype.iaddn = function iaddn (num) {
- assert(typeof num === 'number');
- assert(num < 0x4000000);
- if (num < 0) return this.isubn(-num);
-
- // Possible sign change
- if (this.negative !== 0) {
- if (this.length === 1 && (this.words[0] | 0) < num) {
- this.words[0] = num - (this.words[0] | 0);
- this.negative = 0;
- return this;
- }
-
- this.negative = 0;
- this.isubn(num);
- this.negative = 1;
- return this;
- }
-
- // Add without checks
- return this._iaddn(num);
- };
-
- BN.prototype._iaddn = function _iaddn (num) {
- this.words[0] += num;
-
- // Carry
- for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {
- this.words[i] -= 0x4000000;
- if (i === this.length - 1) {
- this.words[i + 1] = 1;
- } else {
- this.words[i + 1]++;
- }
- }
- this.length = Math.max(this.length, i + 1);
-
- return this;
- };
-
- // Subtract plain number `num` from `this`
- BN.prototype.isubn = function isubn (num) {
- assert(typeof num === 'number');
- assert(num < 0x4000000);
- if (num < 0) return this.iaddn(-num);
-
- if (this.negative !== 0) {
- this.negative = 0;
- this.iaddn(num);
- this.negative = 1;
- return this;
- }
-
- this.words[0] -= num;
-
- if (this.length === 1 && this.words[0] < 0) {
- this.words[0] = -this.words[0];
- this.negative = 1;
- } else {
- // Carry
- for (var i = 0; i < this.length && this.words[i] < 0; i++) {
- this.words[i] += 0x4000000;
- this.words[i + 1] -= 1;
- }
- }
-
- return this.strip();
- };
-
- BN.prototype.addn = function addn (num) {
- return this.clone().iaddn(num);
- };
-
- BN.prototype.subn = function subn (num) {
- return this.clone().isubn(num);
- };
-
- BN.prototype.iabs = function iabs () {
- this.negative = 0;
-
- return this;
- };
-
- BN.prototype.abs = function abs () {
- return this.clone().iabs();
- };
-
- BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {
- var len = num.length + shift;
- var i;
-
- this._expand(len);
-
- var w;
- var carry = 0;
- for (i = 0; i < num.length; i++) {
- w = (this.words[i + shift] | 0) + carry;
- var right = (num.words[i] | 0) * mul;
- w -= right & 0x3ffffff;
- carry = (w >> 26) - ((right / 0x4000000) | 0);
- this.words[i + shift] = w & 0x3ffffff;
- }
- for (; i < this.length - shift; i++) {
- w = (this.words[i + shift] | 0) + carry;
- carry = w >> 26;
- this.words[i + shift] = w & 0x3ffffff;
- }
-
- if (carry === 0) return this.strip();
-
- // Subtraction overflow
- assert(carry === -1);
- carry = 0;
- for (i = 0; i < this.length; i++) {
- w = -(this.words[i] | 0) + carry;
- carry = w >> 26;
- this.words[i] = w & 0x3ffffff;
- }
- this.negative = 1;
-
- return this.strip();
- };
-
- BN.prototype._wordDiv = function _wordDiv (num, mode) {
- var shift = this.length - num.length;
-
- var a = this.clone();
- var b = num;
-
- // Normalize
- var bhi = b.words[b.length - 1] | 0;
- var bhiBits = this._countBits(bhi);
- shift = 26 - bhiBits;
- if (shift !== 0) {
- b = b.ushln(shift);
- a.iushln(shift);
- bhi = b.words[b.length - 1] | 0;
- }
-
- // Initialize quotient
- var m = a.length - b.length;
- var q;
-
- if (mode !== 'mod') {
- q = new BN(null);
- q.length = m + 1;
- q.words = new Array(q.length);
- for (var i = 0; i < q.length; i++) {
- q.words[i] = 0;
- }
- }
-
- var diff = a.clone()._ishlnsubmul(b, 1, m);
- if (diff.negative === 0) {
- a = diff;
- if (q) {
- q.words[m] = 1;
- }
- }
-
- for (var j = m - 1; j >= 0; j--) {
- var qj = (a.words[b.length + j] | 0) * 0x4000000 +
- (a.words[b.length + j - 1] | 0);
-
- // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max
- // (0x7ffffff)
- qj = Math.min((qj / bhi) | 0, 0x3ffffff);
-
- a._ishlnsubmul(b, qj, j);
- while (a.negative !== 0) {
- qj--;
- a.negative = 0;
- a._ishlnsubmul(b, 1, j);
- if (!a.isZero()) {
- a.negative ^= 1;
- }
- }
- if (q) {
- q.words[j] = qj;
- }
- }
- if (q) {
- q.strip();
- }
- a.strip();
-
- // Denormalize
- if (mode !== 'div' && shift !== 0) {
- a.iushrn(shift);
- }
-
- return {
- div: q || null,
- mod: a
- };
- };
-
- // NOTE: 1) `mode` can be set to `mod` to request mod only,
- // to `div` to request div only, or be absent to
- // request both div & mod
- // 2) `positive` is true if unsigned mod is requested
- BN.prototype.divmod = function divmod (num, mode, positive) {
- assert(!num.isZero());
-
- if (this.isZero()) {
- return {
- div: new BN(0),
- mod: new BN(0)
- };
- }
-
- var div, mod, res;
- if (this.negative !== 0 && num.negative === 0) {
- res = this.neg().divmod(num, mode);
-
- if (mode !== 'mod') {
- div = res.div.neg();
- }
-
- if (mode !== 'div') {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.iadd(num);
- }
- }
-
- return {
- div: div,
- mod: mod
- };
- }
-
- if (this.negative === 0 && num.negative !== 0) {
- res = this.divmod(num.neg(), mode);
-
- if (mode !== 'mod') {
- div = res.div.neg();
- }
-
- return {
- div: div,
- mod: res.mod
- };
- }
-
- if ((this.negative & num.negative) !== 0) {
- res = this.neg().divmod(num.neg(), mode);
-
- if (mode !== 'div') {
- mod = res.mod.neg();
- if (positive && mod.negative !== 0) {
- mod.isub(num);
- }
- }
-
- return {
- div: res.div,
- mod: mod
- };
- }
-
- // Both numbers are positive at this point
-
- // Strip both numbers to approximate shift value
- if (num.length > this.length || this.cmp(num) < 0) {
- return {
- div: new BN(0),
- mod: this
- };
- }
-
- // Very short reduction
- if (num.length === 1) {
- if (mode === 'div') {
- return {
- div: this.divn(num.words[0]),
- mod: null
- };
- }
-
- if (mode === 'mod') {
- return {
- div: null,
- mod: new BN(this.modn(num.words[0]))
- };
- }
-
- return {
- div: this.divn(num.words[0]),
- mod: new BN(this.modn(num.words[0]))
- };
- }
-
- return this._wordDiv(num, mode);
- };
-
- // Find `this` / `num`
- BN.prototype.div = function div (num) {
- return this.divmod(num, 'div', false).div;
- };
-
- // Find `this` % `num`
- BN.prototype.mod = function mod (num) {
- return this.divmod(num, 'mod', false).mod;
- };
-
- BN.prototype.umod = function umod (num) {
- return this.divmod(num, 'mod', true).mod;
- };
-
- // Find Round(`this` / `num`)
- BN.prototype.divRound = function divRound (num) {
- var dm = this.divmod(num);
-
- // Fast case - exact division
- if (dm.mod.isZero()) return dm.div;
-
- var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
-
- var half = num.ushrn(1);
- var r2 = num.andln(1);
- var cmp = mod.cmp(half);
-
- // Round down
- if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;
-
- // Round up
- return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
- };
-
- BN.prototype.modn = function modn (num) {
- assert(num <= 0x3ffffff);
- var p = (1 << 26) % num;
-
- var acc = 0;
- for (var i = this.length - 1; i >= 0; i--) {
- acc = (p * acc + (this.words[i] | 0)) % num;
- }
-
- return acc;
- };
-
- // In-place division by number
- BN.prototype.idivn = function idivn (num) {
- assert(num <= 0x3ffffff);
-
- var carry = 0;
- for (var i = this.length - 1; i >= 0; i--) {
- var w = (this.words[i] | 0) + carry * 0x4000000;
- this.words[i] = (w / num) | 0;
- carry = w % num;
- }
-
- return this.strip();
- };
-
- BN.prototype.divn = function divn (num) {
- return this.clone().idivn(num);
- };
-
- BN.prototype.egcd = function egcd (p) {
- assert(p.negative === 0);
- assert(!p.isZero());
-
- var x = this;
- var y = p.clone();
-
- if (x.negative !== 0) {
- x = x.umod(p);
- } else {
- x = x.clone();
- }
-
- // A * x + B * y = x
- var A = new BN(1);
- var B = new BN(0);
-
- // C * x + D * y = y
- var C = new BN(0);
- var D = new BN(1);
-
- var g = 0;
-
- while (x.isEven() && y.isEven()) {
- x.iushrn(1);
- y.iushrn(1);
- ++g;
- }
-
- var yp = y.clone();
- var xp = x.clone();
-
- while (!x.isZero()) {
- for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
- if (i > 0) {
- x.iushrn(i);
- while (i-- > 0) {
- if (A.isOdd() || B.isOdd()) {
- A.iadd(yp);
- B.isub(xp);
- }
-
- A.iushrn(1);
- B.iushrn(1);
- }
- }
-
- for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
- if (j > 0) {
- y.iushrn(j);
- while (j-- > 0) {
- if (C.isOdd() || D.isOdd()) {
- C.iadd(yp);
- D.isub(xp);
- }
-
- C.iushrn(1);
- D.iushrn(1);
- }
- }
-
- if (x.cmp(y) >= 0) {
- x.isub(y);
- A.isub(C);
- B.isub(D);
- } else {
- y.isub(x);
- C.isub(A);
- D.isub(B);
- }
- }
-
- return {
- a: C,
- b: D,
- gcd: y.iushln(g)
- };
- };
-
- // This is reduced incarnation of the binary EEA
- // above, designated to invert members of the
- // _prime_ fields F(p) at a maximal speed
- BN.prototype._invmp = function _invmp (p) {
- assert(p.negative === 0);
- assert(!p.isZero());
-
- var a = this;
- var b = p.clone();
-
- if (a.negative !== 0) {
- a = a.umod(p);
- } else {
- a = a.clone();
- }
-
- var x1 = new BN(1);
- var x2 = new BN(0);
-
- var delta = b.clone();
-
- while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
- for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
- if (i > 0) {
- a.iushrn(i);
- while (i-- > 0) {
- if (x1.isOdd()) {
- x1.iadd(delta);
- }
-
- x1.iushrn(1);
- }
- }
-
- for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
- if (j > 0) {
- b.iushrn(j);
- while (j-- > 0) {
- if (x2.isOdd()) {
- x2.iadd(delta);
- }
-
- x2.iushrn(1);
- }
- }
-
- if (a.cmp(b) >= 0) {
- a.isub(b);
- x1.isub(x2);
- } else {
- b.isub(a);
- x2.isub(x1);
- }
- }
-
- var res;
- if (a.cmpn(1) === 0) {
- res = x1;
- } else {
- res = x2;
- }
-
- if (res.cmpn(0) < 0) {
- res.iadd(p);
- }
-
- return res;
- };
-
- BN.prototype.gcd = function gcd (num) {
- if (this.isZero()) return num.abs();
- if (num.isZero()) return this.abs();
-
- var a = this.clone();
- var b = num.clone();
- a.negative = 0;
- b.negative = 0;
-
- // Remove common factor of two
- for (var shift = 0; a.isEven() && b.isEven(); shift++) {
- a.iushrn(1);
- b.iushrn(1);
- }
-
- do {
- while (a.isEven()) {
- a.iushrn(1);
- }
- while (b.isEven()) {
- b.iushrn(1);
- }
-
- var r = a.cmp(b);
- if (r < 0) {
- // Swap `a` and `b` to make `a` always bigger than `b`
- var t = a;
- a = b;
- b = t;
- } else if (r === 0 || b.cmpn(1) === 0) {
- break;
- }
-
- a.isub(b);
- } while (true);
-
- return b.iushln(shift);
- };
-
- // Invert number in the field F(num)
- BN.prototype.invm = function invm (num) {
- return this.egcd(num).a.umod(num);
- };
-
- BN.prototype.isEven = function isEven () {
- return (this.words[0] & 1) === 0;
- };
-
- BN.prototype.isOdd = function isOdd () {
- return (this.words[0] & 1) === 1;
- };
-
- // And first word and num
- BN.prototype.andln = function andln (num) {
- return this.words[0] & num;
- };
-
- // Increment at the bit position in-line
- BN.prototype.bincn = function bincn (bit) {
- assert(typeof bit === 'number');
- var r = bit % 26;
- var s = (bit - r) / 26;
- var q = 1 << r;
-
- // Fast case: bit is much higher than all existing words
- if (this.length <= s) {
- this._expand(s + 1);
- this.words[s] |= q;
- return this;
- }
-
- // Add bit and propagate, if needed
- var carry = q;
- for (var i = s; carry !== 0 && i < this.length; i++) {
- var w = this.words[i] | 0;
- w += carry;
- carry = w >>> 26;
- w &= 0x3ffffff;
- this.words[i] = w;
- }
- if (carry !== 0) {
- this.words[i] = carry;
- this.length++;
- }
- return this;
- };
-
- BN.prototype.isZero = function isZero () {
- return this.length === 1 && this.words[0] === 0;
- };
-
- BN.prototype.cmpn = function cmpn (num) {
- var negative = num < 0;
-
- if (this.negative !== 0 && !negative) return -1;
- if (this.negative === 0 && negative) return 1;
-
- this.strip();
-
- var res;
- if (this.length > 1) {
- res = 1;
- } else {
- if (negative) {
- num = -num;
- }
-
- assert(num <= 0x3ffffff, 'Number is too big');
-
- var w = this.words[0] | 0;
- res = w === num ? 0 : w < num ? -1 : 1;
- }
- if (this.negative !== 0) return -res | 0;
- return res;
- };
-
- // Compare two numbers and return:
- // 1 - if `this` > `num`
- // 0 - if `this` == `num`
- // -1 - if `this` < `num`
- BN.prototype.cmp = function cmp (num) {
- if (this.negative !== 0 && num.negative === 0) return -1;
- if (this.negative === 0 && num.negative !== 0) return 1;
-
- var res = this.ucmp(num);
- if (this.negative !== 0) return -res | 0;
- return res;
- };
-
- // Unsigned comparison
- BN.prototype.ucmp = function ucmp (num) {
- // At this point both numbers have the same sign
- if (this.length > num.length) return 1;
- if (this.length < num.length) return -1;
-
- var res = 0;
- for (var i = this.length - 1; i >= 0; i--) {
- var a = this.words[i] | 0;
- var b = num.words[i] | 0;
-
- if (a === b) continue;
- if (a < b) {
- res = -1;
- } else if (a > b) {
- res = 1;
- }
- break;
- }
- return res;
- };
-
- BN.prototype.gtn = function gtn (num) {
- return this.cmpn(num) === 1;
- };
-
- BN.prototype.gt = function gt (num) {
- return this.cmp(num) === 1;
- };
-
- BN.prototype.gten = function gten (num) {
- return this.cmpn(num) >= 0;
- };
-
- BN.prototype.gte = function gte (num) {
- return this.cmp(num) >= 0;
- };
-
- BN.prototype.ltn = function ltn (num) {
- return this.cmpn(num) === -1;
- };
-
- BN.prototype.lt = function lt (num) {
- return this.cmp(num) === -1;
- };
-
- BN.prototype.lten = function lten (num) {
- return this.cmpn(num) <= 0;
- };
-
- BN.prototype.lte = function lte (num) {
- return this.cmp(num) <= 0;
- };
-
- BN.prototype.eqn = function eqn (num) {
- return this.cmpn(num) === 0;
- };
-
- BN.prototype.eq = function eq (num) {
- return this.cmp(num) === 0;
- };
-
- //
- // A reduce context, could be using montgomery or something better, depending
- // on the `m` itself.
- //
- BN.red = function red (num) {
- return new Red(num);
- };
-
- BN.prototype.toRed = function toRed (ctx) {
- assert(!this.red, 'Already a number in reduction context');
- assert(this.negative === 0, 'red works only with positives');
- return ctx.convertTo(this)._forceRed(ctx);
- };
-
- BN.prototype.fromRed = function fromRed () {
- assert(this.red, 'fromRed works only with numbers in reduction context');
- return this.red.convertFrom(this);
- };
-
- BN.prototype._forceRed = function _forceRed (ctx) {
- this.red = ctx;
- return this;
- };
-
- BN.prototype.forceRed = function forceRed (ctx) {
- assert(!this.red, 'Already a number in reduction context');
- return this._forceRed(ctx);
- };
-
- BN.prototype.redAdd = function redAdd (num) {
- assert(this.red, 'redAdd works only with red numbers');
- return this.red.add(this, num);
- };
-
- BN.prototype.redIAdd = function redIAdd (num) {
- assert(this.red, 'redIAdd works only with red numbers');
- return this.red.iadd(this, num);
- };
-
- BN.prototype.redSub = function redSub (num) {
- assert(this.red, 'redSub works only with red numbers');
- return this.red.sub(this, num);
- };
-
- BN.prototype.redISub = function redISub (num) {
- assert(this.red, 'redISub works only with red numbers');
- return this.red.isub(this, num);
- };
-
- BN.prototype.redShl = function redShl (num) {
- assert(this.red, 'redShl works only with red numbers');
- return this.red.shl(this, num);
- };
-
- BN.prototype.redMul = function redMul (num) {
- assert(this.red, 'redMul works only with red numbers');
- this.red._verify2(this, num);
- return this.red.mul(this, num);
- };
-
- BN.prototype.redIMul = function redIMul (num) {
- assert(this.red, 'redMul works only with red numbers');
- this.red._verify2(this, num);
- return this.red.imul(this, num);
- };
-
- BN.prototype.redSqr = function redSqr () {
- assert(this.red, 'redSqr works only with red numbers');
- this.red._verify1(this);
- return this.red.sqr(this);
- };
-
- BN.prototype.redISqr = function redISqr () {
- assert(this.red, 'redISqr works only with red numbers');
- this.red._verify1(this);
- return this.red.isqr(this);
- };
-
- // Square root over p
- BN.prototype.redSqrt = function redSqrt () {
- assert(this.red, 'redSqrt works only with red numbers');
- this.red._verify1(this);
- return this.red.sqrt(this);
- };
-
- BN.prototype.redInvm = function redInvm () {
- assert(this.red, 'redInvm works only with red numbers');
- this.red._verify1(this);
- return this.red.invm(this);
- };
-
- // Return negative clone of `this` % `red modulo`
- BN.prototype.redNeg = function redNeg () {
- assert(this.red, 'redNeg works only with red numbers');
- this.red._verify1(this);
- return this.red.neg(this);
- };
-
- BN.prototype.redPow = function redPow (num) {
- assert(this.red && !num.red, 'redPow(normalNum)');
- this.red._verify1(this);
- return this.red.pow(this, num);
- };
-
- // Prime numbers with efficient reduction
- var primes = {
- k256: null,
- p224: null,
- p192: null,
- p25519: null
- };
-
- // Pseudo-Mersenne prime
- function MPrime (name, p) {
- // P = 2 ^ N - K
- this.name = name;
- this.p = new BN(p, 16);
- this.n = this.p.bitLength();
- this.k = new BN(1).iushln(this.n).isub(this.p);
-
- this.tmp = this._tmp();
- }
-
- MPrime.prototype._tmp = function _tmp () {
- var tmp = new BN(null);
- tmp.words = new Array(Math.ceil(this.n / 13));
- return tmp;
- };
-
- MPrime.prototype.ireduce = function ireduce (num) {
- // Assumes that `num` is less than `P^2`
- // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)
- var r = num;
- var rlen;
-
- do {
- this.split(r, this.tmp);
- r = this.imulK(r);
- r = r.iadd(this.tmp);
- rlen = r.bitLength();
- } while (rlen > this.n);
-
- var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
- if (cmp === 0) {
- r.words[0] = 0;
- r.length = 1;
- } else if (cmp > 0) {
- r.isub(this.p);
- } else {
- r.strip();
- }
-
- return r;
- };
-
- MPrime.prototype.split = function split (input, out) {
- input.iushrn(this.n, 0, out);
- };
-
- MPrime.prototype.imulK = function imulK (num) {
- return num.imul(this.k);
- };
-
- function K256 () {
- MPrime.call(
- this,
- 'k256',
- 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');
- }
- inherits(K256, MPrime);
-
- K256.prototype.split = function split (input, output) {
- // 256 = 9 * 26 + 22
- var mask = 0x3fffff;
-
- var outLen = Math.min(input.length, 9);
- for (var i = 0; i < outLen; i++) {
- output.words[i] = input.words[i];
- }
- output.length = outLen;
-
- if (input.length <= 9) {
- input.words[0] = 0;
- input.length = 1;
- return;
- }
-
- // Shift by 9 limbs
- var prev = input.words[9];
- output.words[output.length++] = prev & mask;
-
- for (i = 10; i < input.length; i++) {
- var next = input.words[i] | 0;
- input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);
- prev = next;
- }
- prev >>>= 22;
- input.words[i - 10] = prev;
- if (prev === 0 && input.length > 10) {
- input.length -= 10;
- } else {
- input.length -= 9;
- }
- };
-
- K256.prototype.imulK = function imulK (num) {
- // K = 0x1000003d1 = [ 0x40, 0x3d1 ]
- num.words[num.length] = 0;
- num.words[num.length + 1] = 0;
- num.length += 2;
-
- // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390
- var lo = 0;
- for (var i = 0; i < num.length; i++) {
- var w = num.words[i] | 0;
- lo += w * 0x3d1;
- num.words[i] = lo & 0x3ffffff;
- lo = w * 0x40 + ((lo / 0x4000000) | 0);
- }
-
- // Fast length reduction
- if (num.words[num.length - 1] === 0) {
- num.length--;
- if (num.words[num.length - 1] === 0) {
- num.length--;
- }
- }
- return num;
- };
-
- function P224 () {
- MPrime.call(
- this,
- 'p224',
- 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');
- }
- inherits(P224, MPrime);
-
- function P192 () {
- MPrime.call(
- this,
- 'p192',
- 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');
- }
- inherits(P192, MPrime);
-
- function P25519 () {
- // 2 ^ 255 - 19
- MPrime.call(
- this,
- '25519',
- '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');
- }
- inherits(P25519, MPrime);
-
- P25519.prototype.imulK = function imulK (num) {
- // K = 0x13
- var carry = 0;
- for (var i = 0; i < num.length; i++) {
- var hi = (num.words[i] | 0) * 0x13 + carry;
- var lo = hi & 0x3ffffff;
- hi >>>= 26;
-
- num.words[i] = lo;
- carry = hi;
- }
- if (carry !== 0) {
- num.words[num.length++] = carry;
- }
- return num;
- };
-
- // Exported mostly for testing purposes, use plain name instead
- BN._prime = function prime (name) {
- // Cached version of prime
- if (primes[name]) return primes[name];
-
- var prime;
- if (name === 'k256') {
- prime = new K256();
- } else if (name === 'p224') {
- prime = new P224();
- } else if (name === 'p192') {
- prime = new P192();
- } else if (name === 'p25519') {
- prime = new P25519();
- } else {
- throw new Error('Unknown prime ' + name);
- }
- primes[name] = prime;
-
- return prime;
- };
-
- //
- // Base reduction engine
- //
- function Red (m) {
- if (typeof m === 'string') {
- var prime = BN._prime(m);
- this.m = prime.p;
- this.prime = prime;
- } else {
- assert(m.gtn(1), 'modulus must be greater than 1');
- this.m = m;
- this.prime = null;
- }
- }
-
- Red.prototype._verify1 = function _verify1 (a) {
- assert(a.negative === 0, 'red works only with positives');
- assert(a.red, 'red works only with red numbers');
- };
-
- Red.prototype._verify2 = function _verify2 (a, b) {
- assert((a.negative | b.negative) === 0, 'red works only with positives');
- assert(a.red && a.red === b.red,
- 'red works only with red numbers');
- };
-
- Red.prototype.imod = function imod (a) {
- if (this.prime) return this.prime.ireduce(a)._forceRed(this);
- return a.umod(this.m)._forceRed(this);
- };
-
- Red.prototype.neg = function neg (a) {
- if (a.isZero()) {
- return a.clone();
- }
-
- return this.m.sub(a)._forceRed(this);
- };
-
- Red.prototype.add = function add (a, b) {
- this._verify2(a, b);
-
- var res = a.add(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res._forceRed(this);
- };
-
- Red.prototype.iadd = function iadd (a, b) {
- this._verify2(a, b);
-
- var res = a.iadd(b);
- if (res.cmp(this.m) >= 0) {
- res.isub(this.m);
- }
- return res;
- };
-
- Red.prototype.sub = function sub (a, b) {
- this._verify2(a, b);
-
- var res = a.sub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res._forceRed(this);
- };
-
- Red.prototype.isub = function isub (a, b) {
- this._verify2(a, b);
-
- var res = a.isub(b);
- if (res.cmpn(0) < 0) {
- res.iadd(this.m);
- }
- return res;
- };
-
- Red.prototype.shl = function shl (a, num) {
- this._verify1(a);
- return this.imod(a.ushln(num));
- };
-
- Red.prototype.imul = function imul (a, b) {
- this._verify2(a, b);
- return this.imod(a.imul(b));
- };
-
- Red.prototype.mul = function mul (a, b) {
- this._verify2(a, b);
- return this.imod(a.mul(b));
- };
-
- Red.prototype.isqr = function isqr (a) {
- return this.imul(a, a.clone());
- };
-
- Red.prototype.sqr = function sqr (a) {
- return this.mul(a, a);
- };
-
- Red.prototype.sqrt = function sqrt (a) {
- if (a.isZero()) return a.clone();
-
- var mod3 = this.m.andln(3);
- assert(mod3 % 2 === 1);
-
- // Fast case
- if (mod3 === 3) {
- var pow = this.m.add(new BN(1)).iushrn(2);
- return this.pow(a, pow);
- }
-
- // Tonelli-Shanks algorithm (Totally unoptimized and slow)
- //
- // Find Q and S, that Q * 2 ^ S = (P - 1)
- var q = this.m.subn(1);
- var s = 0;
- while (!q.isZero() && q.andln(1) === 0) {
- s++;
- q.iushrn(1);
- }
- assert(!q.isZero());
-
- var one = new BN(1).toRed(this);
- var nOne = one.redNeg();
-
- // Find quadratic non-residue
- // NOTE: Max is such because of generalized Riemann hypothesis.
- var lpow = this.m.subn(1).iushrn(1);
- var z = this.m.bitLength();
- z = new BN(2 * z * z).toRed(this);
-
- while (this.pow(z, lpow).cmp(nOne) !== 0) {
- z.redIAdd(nOne);
- }
-
- var c = this.pow(z, q);
- var r = this.pow(a, q.addn(1).iushrn(1));
- var t = this.pow(a, q);
- var m = s;
- while (t.cmp(one) !== 0) {
- var tmp = t;
- for (var i = 0; tmp.cmp(one) !== 0; i++) {
- tmp = tmp.redSqr();
- }
- assert(i < m);
- var b = this.pow(c, new BN(1).iushln(m - i - 1));
-
- r = r.redMul(b);
- c = b.redSqr();
- t = t.redMul(c);
- m = i;
- }
-
- return r;
- };
-
- Red.prototype.invm = function invm (a) {
- var inv = a._invmp(this.m);
- if (inv.negative !== 0) {
- inv.negative = 0;
- return this.imod(inv).redNeg();
- } else {
- return this.imod(inv);
- }
- };
-
- Red.prototype.pow = function pow (a, num) {
- if (num.isZero()) return new BN(1);
- if (num.cmpn(1) === 0) return a.clone();
-
- var windowSize = 4;
- var wnd = new Array(1 << windowSize);
- wnd[0] = new BN(1).toRed(this);
- wnd[1] = a;
- for (var i = 2; i < wnd.length; i++) {
- wnd[i] = this.mul(wnd[i - 1], a);
- }
-
- var res = wnd[0];
- var current = 0;
- var currentLen = 0;
- var start = num.bitLength() % 26;
- if (start === 0) {
- start = 26;
- }
-
- for (i = num.length - 1; i >= 0; i--) {
- var word = num.words[i];
- for (var j = start - 1; j >= 0; j--) {
- var bit = (word >> j) & 1;
- if (res !== wnd[0]) {
- res = this.sqr(res);
- }
-
- if (bit === 0 && current === 0) {
- currentLen = 0;
- continue;
- }
-
- current <<= 1;
- current |= bit;
- currentLen++;
- if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;
-
- res = this.mul(res, wnd[current]);
- currentLen = 0;
- current = 0;
- }
- start = 26;
- }
-
- return res;
- };
-
- Red.prototype.convertTo = function convertTo (num) {
- var r = num.umod(this.m);
-
- return r === num ? r.clone() : r;
- };
-
- Red.prototype.convertFrom = function convertFrom (num) {
- var res = num.clone();
- res.red = null;
- return res;
- };
-
- //
- // Montgomery method engine
- //
-
- BN.mont = function mont (num) {
- return new Mont(num);
- };
-
- function Mont (m) {
- Red.call(this, m);
-
- this.shift = this.m.bitLength();
- if (this.shift % 26 !== 0) {
- this.shift += 26 - (this.shift % 26);
- }
-
- this.r = new BN(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);
- }
- inherits(Mont, Red);
-
- Mont.prototype.convertTo = function convertTo (num) {
- return this.imod(num.ushln(this.shift));
- };
-
- Mont.prototype.convertFrom = function convertFrom (num) {
- var r = this.imod(num.mul(this.rinv));
- r.red = null;
- return r;
- };
-
- Mont.prototype.imul = function imul (a, b) {
- if (a.isZero() || b.isZero()) {
- a.words[0] = 0;
- a.length = 1;
- return a;
- }
-
- var t = a.imul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
-
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
-
- return res._forceRed(this);
- };
-
- Mont.prototype.mul = function mul (a, b) {
- if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);
-
- var t = a.mul(b);
- var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
- var u = t.isub(c).iushrn(this.shift);
- var res = u;
- if (u.cmp(this.m) >= 0) {
- res = u.isub(this.m);
- } else if (u.cmpn(0) < 0) {
- res = u.iadd(this.m);
- }
-
- return res._forceRed(this);
- };
-
- Mont.prototype.invm = function invm (a) {
- // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R
- var res = this.imod(a._invmp(this.m).mul(this.r2));
- return res._forceRed(this);
- };
-})(typeof module === 'undefined' || module, this);
-
-},{}],50:[function(require,module,exports){
-module.exports={
- "methods": {
- "web3_clientVersion": [[], "S"],
- "web3_sha3": [["S"], "D", 1],
- "net_version": [[], "S"],
- "net_peerCount": [[], "Q"],
- "net_listening": [[], "B"],
- "personal_sign": [["D", "D20", "S"], "D", 2],
- "personal_ecRecover": [["D", "D"], "D20", 2],
- "eth_protocolVersion": [[], "S"],
- "eth_syncing": [[], "B|EthSyncing"],
- "eth_coinbase": [[], "D20"],
- "eth_mining": [[], "B"],
- "eth_hashrate": [[], "Q"],
- "eth_gasPrice": [[], "Q"],
- "eth_accounts": [[], ["D20"]],
- "eth_blockNumber": [[], "Q"],
- "eth_getBalance": [["D20", "Q|T"], "Q", 1, 2],
- "eth_getStorageAt": [["D20", "Q", "Q|T"], "D", 2, 2],
- "eth_getTransactionCount": [["D20", "Q|T"], "Q", 1, 2],
- "eth_getBlockTransactionCountByHash": [["D32"], "Q", 1],
- "eth_getBlockTransactionCountByNumber": [["Q|T"], "Q", 1],
- "eth_getUncleCountByBlockHash": [["D32"], "Q", 1],
- "eth_getUncleCountByBlockNumber": [["Q"], "Q", 1],
- "eth_getCode": [["D20", "Q|T"], "D", 1, 2],
- "eth_sign": [["D20", "D"], "D", 2],
- "eth_signTypedData": [["Array|DATA", "D20"], "D", 1],
- "eth_sendTransaction": [["SendTransaction"], "D", 1],
- "eth_sendRawTransaction": [["D"], "D32", 1],
- "eth_call": [["CallTransaction", "Q|T"], "D", 1, 2],
- "eth_estimateGas": [["EstimateTransaction", "Q|T"], "Q", 1],
- "eth_getBlockByHash": [["D32", "B"], "Block", 2],
- "eth_getBlockByNumber": [["Q|T", "B"], "Block", 2],
- "eth_getTransactionByHash": [["D32"], "Transaction", 1],
- "eth_getTransactionByBlockHashAndIndex": [["D32", "Q"], "Transaction", 2],
- "eth_getTransactionByBlockNumberAndIndex": [["Q|T", "Q"], "Transaction", 2],
- "eth_getTransactionReceipt": [["D32"], "Receipt", 1],
- "eth_getUncleByBlockHashAndIndex": [["D32", "Q"], "Block", 1],
- "eth_getUncleByBlockNumberAndIndex": [["Q|T", "Q"], "Block", 2],
- "eth_getCompilers": [[], ["S"]],
- "eth_compileLLL": [["S"], "D", 1],
- "eth_compileSolidity": [["S"], "D", 1],
- "eth_compileSerpent": [["S"], "D", 1],
- "eth_newFilter": [["Filter"], "Q", 1],
- "eth_newBlockFilter": [[], "Q"],
- "eth_newPendingTransactionFilter": [[], "Q"],
- "eth_uninstallFilter": [["QP"], "B", 1],
- "eth_getFilterChanges": [["QP"], ["FilterChange"], 1],
- "eth_getFilterLogs": [["QP"], ["FilterChange"], 1],
- "eth_getLogs": [["Filter"], ["FilterChange"], 1],
- "eth_getWork": [[], ["D"]],
- "eth_submitWork": [["D", "D32", "D32"], "B", 3],
- "eth_submitHashrate": [["D", "D"], "B", 2],
- "db_putString": [["S", "S", "S"], "B", 2],
- "db_getString": [["S", "S"], "S", 2],
- "db_putHex": [["S", "S", "D"], "B", 2],
- "db_getHex": [["S", "S"], "D", 2],
- "shh_post": [["SHHPost"], "B", 1],
- "shh_version": [[], "S"],
- "shh_newIdentity": [[], "D"],
- "shh_hasIdentity": [["D"], "B"],
- "shh_newGroup": [[], "D"],
- "shh_addToGroup": [["D"], "B", 1],
- "shh_newFilter": [["SHHFilter"], "Q", 1],
- "shh_uninstallFilter": [["Q"], "B", 1],
- "shh_getFilterChanges": [["Q"], ["SHHFilterChange"], 1],
- "shh_getMessages": [["Q"], ["SHHFilterChange"], 1]
- },
- "tags": ["latest", "earliest", "pending"],
- "objects": {
- "EthSyncing": {
- "__required": [],
- "startingBlock": "Q",
- "currentBlock": "Q",
- "highestBlock": "Q"
- },
- "SendTransaction": {
- "__required": ["from", "data"],
- "from": "D20",
- "to": "D20",
- "gas": "Q",
- "gasPrice": "Q",
- "value": "Q",
- "data": "D",
- "nonce": "Q"
- },
- "EstimateTransaction": {
- "__required": [],
- "from": "D20",
- "to": "D20",
- "gas": "Q",
- "gasPrice": "Q",
- "value": "Q",
- "data": "D",
- "nonce": "Q"
- },
- "CallTransaction": {
- "__required": ["to"],
- "from": "D20",
- "to": "D20",
- "gas": "Q",
- "gasPrice": "Q",
- "value": "Q",
- "data": "D",
- "nonce": "Q"
- },
- "Block": {
- "__required": [],
- "number": "Q",
- "hash": "D32",
- "parentHash": "D32",
- "nonce": "D",
- "sha3Uncles": "D",
- "logsBloom": "D",
- "transactionsRoot": "D",
- "stateRoot": "D",
- "receiptsRoot": "D",
- "miner": "D",
- "difficulty": "Q",
- "totalDifficulty": "Q",
- "extraData": "D",
- "size": "Q",
- "gasLimit": "Q",
- "gasUsed": "Q",
- "timestamp": "Q",
- "transactions": ["DATA|Transaction"],
- "uncles": ["D"]
- },
- "Transaction": {
- "__required": [],
- "hash": "D32",
- "nonce": "Q",
- "blockHash": "D32",
- "blockNumber": "Q",
- "transactionIndex": "Q",
- "from": "D20",
- "to": "D20",
- "value": "Q",
- "gasPrice": "Q",
- "gas": "Q",
- "input": "D"
- },
- "Receipt": {
- "__required": [],
- "transactionHash": "D32",
- "transactionIndex": "Q",
- "blockHash": "D32",
- "blockNumber": "Q",
- "cumulativeGasUsed": "Q",
- "gasUsed": "Q",
- "contractAddress": "D20",
- "logs": ["FilterChange"]
- },
- "Filter": {
- "__required": [],
- "fromBlock": "Q|T",
- "toBlock": "Q|T",
- "address": "D20",
- "topics": ["D"]
- },
- "FilterChange": {
- "__required": [],
- "removed": "B",
- "logIndex": "Q",
- "transactionIndex": "Q",
- "transactionHash": "D32",
- "blockHash": "D32",
- "blockNumber": "Q",
- "address": "D20",
- "data": "Array|DATA",
- "topics": ["D"]
- },
- "SHHPost": {
- "__required": ["topics", "payload", "priority", "ttl"],
- "from": "D",
- "to": "D",
- "topics": ["D"],
- "payload": "D",
- "priority": "Q",
- "ttl": "Q"
- },
- "SHHFilter": {
- "__required": ["topics"],
- "to": "D",
- "topics": ["D"]
- },
- "SHHFilterChange": {
- "__required": [],
- "hash": "D",
- "from": "D",
- "to": "D",
- "expiry": "Q",
- "ttl": "Q",
- "sent": "Q",
- "topics": ["D"],
- "payload": "D",
- "workProved": "Q"
- },
- "SHHMessage": {
- "__required": [],
- "hash": "D",
- "from": "D",
- "to": "D",
- "expiry": "Q",
- "ttl": "Q",
- "sent": "Q",
- "topics": ["D"],
- "payload": "D",
- "workProved": "Q"
- }
- }
-}
-
-},{}],51:[function(require,module,exports){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-'use strict';
-
-var R = typeof Reflect === 'object' ? Reflect : null
-var ReflectApply = R && typeof R.apply === 'function'
- ? R.apply
- : function ReflectApply(target, receiver, args) {
- return Function.prototype.apply.call(target, receiver, args);
- }
-
-var ReflectOwnKeys
-if (R && typeof R.ownKeys === 'function') {
- ReflectOwnKeys = R.ownKeys
-} else if (Object.getOwnPropertySymbols) {
- ReflectOwnKeys = function ReflectOwnKeys(target) {
- return Object.getOwnPropertyNames(target)
- .concat(Object.getOwnPropertySymbols(target));
- };
-} else {
- ReflectOwnKeys = function ReflectOwnKeys(target) {
- return Object.getOwnPropertyNames(target);
- };
-}
-
-function ProcessEmitWarning(warning) {
- if (console && console.warn) console.warn(warning);
-}
-
-var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
- return value !== value;
-}
-
-function EventEmitter() {
- EventEmitter.init.call(this);
-}
-module.exports = EventEmitter;
-module.exports.once = once;
-
-// Backwards-compat with node 0.10.x
-EventEmitter.EventEmitter = EventEmitter;
-
-EventEmitter.prototype._events = undefined;
-EventEmitter.prototype._eventsCount = 0;
-EventEmitter.prototype._maxListeners = undefined;
-
-// By default EventEmitters will print a warning if more than 10 listeners are
-// added to it. This is a useful default which helps finding memory leaks.
-var defaultMaxListeners = 10;
-
-function checkListener(listener) {
- if (typeof listener !== 'function') {
- throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
- }
-}
-
-Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
- enumerable: true,
- get: function() {
- return defaultMaxListeners;
- },
- set: function(arg) {
- if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
- throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
- }
- defaultMaxListeners = arg;
- }
-});
-
-EventEmitter.init = function() {
-
- if (this._events === undefined ||
- this._events === Object.getPrototypeOf(this)._events) {
- this._events = Object.create(null);
- this._eventsCount = 0;
- }
-
- this._maxListeners = this._maxListeners || undefined;
-};
-
-// Obviously not all Emitters should be limited to 10. This function allows
-// that to be increased. Set to zero for unlimited.
-EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
- if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
- throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
- }
- this._maxListeners = n;
- return this;
-};
-
-function _getMaxListeners(that) {
- if (that._maxListeners === undefined)
- return EventEmitter.defaultMaxListeners;
- return that._maxListeners;
-}
-
-EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
- return _getMaxListeners(this);
-};
-
-EventEmitter.prototype.emit = function emit(type) {
- var args = [];
- for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
- var doError = (type === 'error');
-
- var events = this._events;
- if (events !== undefined)
- doError = (doError && events.error === undefined);
- else if (!doError)
- return false;
-
- // If there is no 'error' event listener then throw.
- if (doError) {
- var er;
- if (args.length > 0)
- er = args[0];
- if (er instanceof Error) {
- // Note: The comments on the `throw` lines are intentional, they show
- // up in Node's output if this results in an unhandled exception.
- throw er; // Unhandled 'error' event
- }
- // At least give some kind of context to the user
- var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
- err.context = er;
- throw err; // Unhandled 'error' event
- }
-
- var handler = events[type];
-
- if (handler === undefined)
- return false;
-
- if (typeof handler === 'function') {
- ReflectApply(handler, this, args);
- } else {
- var len = handler.length;
- var listeners = arrayClone(handler, len);
- for (var i = 0; i < len; ++i)
- ReflectApply(listeners[i], this, args);
- }
-
- return true;
-};
-
-function _addListener(target, type, listener, prepend) {
- var m;
- var events;
- var existing;
-
- checkListener(listener);
-
- events = target._events;
- if (events === undefined) {
- events = target._events = Object.create(null);
- target._eventsCount = 0;
- } else {
- // To avoid recursion in the case that type === "newListener"! Before
- // adding it to the listeners, first emit "newListener".
- if (events.newListener !== undefined) {
- target.emit('newListener', type,
- listener.listener ? listener.listener : listener);
-
- // Re-assign `events` because a newListener handler could have caused the
- // this._events to be assigned to a new object
- events = target._events;
- }
- existing = events[type];
- }
-
- if (existing === undefined) {
- // Optimize the case of one listener. Don't need the extra array object.
- existing = events[type] = listener;
- ++target._eventsCount;
- } else {
- if (typeof existing === 'function') {
- // Adding the second element, need to change to array.
- existing = events[type] =
- prepend ? [listener, existing] : [existing, listener];
- // If we've already got an array, just append.
- } else if (prepend) {
- existing.unshift(listener);
- } else {
- existing.push(listener);
- }
-
- // Check for listener leak
- m = _getMaxListeners(target);
- if (m > 0 && existing.length > m && !existing.warned) {
- existing.warned = true;
- // No error code for this since it is a Warning
- // eslint-disable-next-line no-restricted-syntax
- var w = new Error('Possible EventEmitter memory leak detected. ' +
- existing.length + ' ' + String(type) + ' listeners ' +
- 'added. Use emitter.setMaxListeners() to ' +
- 'increase limit');
- w.name = 'MaxListenersExceededWarning';
- w.emitter = target;
- w.type = type;
- w.count = existing.length;
- ProcessEmitWarning(w);
- }
- }
-
- return target;
-}
-
-EventEmitter.prototype.addListener = function addListener(type, listener) {
- return _addListener(this, type, listener, false);
-};
-
-EventEmitter.prototype.on = EventEmitter.prototype.addListener;
-
-EventEmitter.prototype.prependListener =
- function prependListener(type, listener) {
- return _addListener(this, type, listener, true);
- };
-
-function onceWrapper() {
- if (!this.fired) {
- this.target.removeListener(this.type, this.wrapFn);
- this.fired = true;
- if (arguments.length === 0)
- return this.listener.call(this.target);
- return this.listener.apply(this.target, arguments);
- }
-}
-
-function _onceWrap(target, type, listener) {
- var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
- var wrapped = onceWrapper.bind(state);
- wrapped.listener = listener;
- state.wrapFn = wrapped;
- return wrapped;
-}
-
-EventEmitter.prototype.once = function once(type, listener) {
- checkListener(listener);
- this.on(type, _onceWrap(this, type, listener));
- return this;
-};
-
-EventEmitter.prototype.prependOnceListener =
- function prependOnceListener(type, listener) {
- checkListener(listener);
- this.prependListener(type, _onceWrap(this, type, listener));
- return this;
- };
-
-// Emits a 'removeListener' event if and only if the listener was removed.
-EventEmitter.prototype.removeListener =
- function removeListener(type, listener) {
- var list, events, position, i, originalListener;
-
- checkListener(listener);
-
- events = this._events;
- if (events === undefined)
- return this;
-
- list = events[type];
- if (list === undefined)
- return this;
-
- if (list === listener || list.listener === listener) {
- if (--this._eventsCount === 0)
- this._events = Object.create(null);
- else {
- delete events[type];
- if (events.removeListener)
- this.emit('removeListener', type, list.listener || listener);
- }
- } else if (typeof list !== 'function') {
- position = -1;
-
- for (i = list.length - 1; i >= 0; i--) {
- if (list[i] === listener || list[i].listener === listener) {
- originalListener = list[i].listener;
- position = i;
- break;
- }
- }
-
- if (position < 0)
- return this;
-
- if (position === 0)
- list.shift();
- else {
- spliceOne(list, position);
- }
-
- if (list.length === 1)
- events[type] = list[0];
-
- if (events.removeListener !== undefined)
- this.emit('removeListener', type, originalListener || listener);
- }
-
- return this;
- };
-
-EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
-
-EventEmitter.prototype.removeAllListeners =
- function removeAllListeners(type) {
- var listeners, events, i;
-
- events = this._events;
- if (events === undefined)
- return this;
-
- // not listening for removeListener, no need to emit
- if (events.removeListener === undefined) {
- if (arguments.length === 0) {
- this._events = Object.create(null);
- this._eventsCount = 0;
- } else if (events[type] !== undefined) {
- if (--this._eventsCount === 0)
- this._events = Object.create(null);
- else
- delete events[type];
- }
- return this;
- }
-
- // emit removeListener for all listeners on all events
- if (arguments.length === 0) {
- var keys = Object.keys(events);
- var key;
- for (i = 0; i < keys.length; ++i) {
- key = keys[i];
- if (key === 'removeListener') continue;
- this.removeAllListeners(key);
- }
- this.removeAllListeners('removeListener');
- this._events = Object.create(null);
- this._eventsCount = 0;
- return this;
- }
-
- listeners = events[type];
-
- if (typeof listeners === 'function') {
- this.removeListener(type, listeners);
- } else if (listeners !== undefined) {
- // LIFO order
- for (i = listeners.length - 1; i >= 0; i--) {
- this.removeListener(type, listeners[i]);
- }
- }
-
- return this;
- };
-
-function _listeners(target, type, unwrap) {
- var events = target._events;
-
- if (events === undefined)
- return [];
-
- var evlistener = events[type];
- if (evlistener === undefined)
- return [];
-
- if (typeof evlistener === 'function')
- return unwrap ? [evlistener.listener || evlistener] : [evlistener];
-
- return unwrap ?
- unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
-}
-
-EventEmitter.prototype.listeners = function listeners(type) {
- return _listeners(this, type, true);
-};
-
-EventEmitter.prototype.rawListeners = function rawListeners(type) {
- return _listeners(this, type, false);
-};
-
-EventEmitter.listenerCount = function(emitter, type) {
- if (typeof emitter.listenerCount === 'function') {
- return emitter.listenerCount(type);
- } else {
- return listenerCount.call(emitter, type);
- }
-};
-
-EventEmitter.prototype.listenerCount = listenerCount;
-function listenerCount(type) {
- var events = this._events;
-
- if (events !== undefined) {
- var evlistener = events[type];
-
- if (typeof evlistener === 'function') {
- return 1;
- } else if (evlistener !== undefined) {
- return evlistener.length;
- }
- }
-
- return 0;
-}
-
-EventEmitter.prototype.eventNames = function eventNames() {
- return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
-};
-
-function arrayClone(arr, n) {
- var copy = new Array(n);
- for (var i = 0; i < n; ++i)
- copy[i] = arr[i];
- return copy;
-}
-
-function spliceOne(list, index) {
- for (; index + 1 < list.length; index++)
- list[index] = list[index + 1];
- list.pop();
-}
-
-function unwrapListeners(arr) {
- var ret = new Array(arr.length);
- for (var i = 0; i < ret.length; ++i) {
- ret[i] = arr[i].listener || arr[i];
- }
- return ret;
-}
-
-function once(emitter, name) {
- return new Promise(function (resolve, reject) {
- function errorListener(err) {
- emitter.removeListener(name, resolver);
- reject(err);
- }
-
- function resolver() {
- if (typeof emitter.removeListener === 'function') {
- emitter.removeListener('error', errorListener);
- }
- resolve([].slice.call(arguments));
- };
-
- eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
- if (name !== 'error') {
- addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
- }
- });
-}
-
-function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
- if (typeof emitter.on === 'function') {
- eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
- }
-}
-
-function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
- if (typeof emitter.on === 'function') {
- if (flags.once) {
- emitter.once(name, listener);
- } else {
- emitter.on(name, listener);
- }
- } else if (typeof emitter.addEventListener === 'function') {
- // EventTarget does not have `error` event semantics like Node
- // EventEmitters, we do not listen for `error` events here.
- emitter.addEventListener(name, function wrapListener(arg) {
- // IE does not have builtin `{ once: true }` support so we
- // have to do it manually.
- if (flags.once) {
- emitter.removeEventListener(name, wrapListener);
- }
- listener(arg);
- });
- } else {
- throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
- }
-}
-
-},{}],52:[function(require,module,exports){
-(function (Buffer){(function (){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const readable_stream_1 = require("readable-stream");
-class PortDuplexStream extends readable_stream_1.Duplex {
- /**
- * @param port - An instance of WebExtensions Runtime.Port. See:
- * {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port}
- */
- constructor(port) {
- super({ objectMode: true });
- this._port = port;
- this._port.onMessage.addListener((msg) => this._onMessage(msg));
- this._port.onDisconnect.addListener(() => this._onDisconnect());
- this._log = () => null;
- }
- /**
- * Callback triggered when a message is received from
- * the remote Port associated with this Stream.
- *
- * @param msg - Payload from the onMessage listener of the port
- */
- _onMessage(msg) {
- if (Buffer.isBuffer(msg)) {
- const data = Buffer.from(msg);
- this._log(data, false);
- this.push(data);
- }
- else {
- this._log(msg, false);
- this.push(msg);
- }
- }
- /**
- * Callback triggered when the remote Port associated with this Stream
- * disconnects.
- */
- _onDisconnect() {
- this.destroy();
- }
- /**
- * Explicitly sets read operations to a no-op.
- */
- _read() {
- return undefined;
- }
- /**
- * Called internally when data should be written to this writable stream.
- *
- * @param msg - Arbitrary object to write
- * @param encoding - Encoding to use when writing payload
- * @param cb - Called when writing is complete or an error occurs
- */
- _write(msg, _encoding, cb) {
- try {
- if (Buffer.isBuffer(msg)) {
- const data = msg.toJSON();
- data._isBuffer = true;
- this._log(data, true);
- this._port.postMessage(data);
- }
- else {
- this._log(msg, true);
- this._port.postMessage(msg);
- }
- }
- catch (error) {
- return cb(new Error('PortDuplexStream - disconnected'));
- }
- return cb();
- }
- /**
- * Call to set a custom logger for incoming/outgoing messages
- *
- * @param log - the logger function
- */
- _setLogger(log) {
- this._log = log;
- }
-}
-exports.default = PortDuplexStream;
-
-}).call(this)}).call(this,require("buffer").Buffer)
-},{"buffer":38,"readable-stream":71}],53:[function(require,module,exports){
-'use strict'
-
-const { SymbolDispose } = require('../../ours/primordials')
-const { AbortError, codes } = require('../../ours/errors')
-const { isNodeStream, isWebStream, kControllerErrorFunction } = require('./utils')
-const eos = require('./end-of-stream')
-const { ERR_INVALID_ARG_TYPE } = codes
-let addAbortListener
-
-// This method is inlined here for readable-stream
-// It also does not allow for signal to not exist on the stream
-// https://github.com/nodejs/node/pull/36061#discussion_r533718029
-const validateAbortSignal = (signal, name) => {
- if (typeof signal !== 'object' || !('aborted' in signal)) {
- throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)
- }
-}
-module.exports.addAbortSignal = function addAbortSignal(signal, stream) {
- validateAbortSignal(signal, 'signal')
- if (!isNodeStream(stream) && !isWebStream(stream)) {
- throw new ERR_INVALID_ARG_TYPE('stream', ['ReadableStream', 'WritableStream', 'Stream'], stream)
- }
- return module.exports.addAbortSignalNoValidate(signal, stream)
-}
-module.exports.addAbortSignalNoValidate = function (signal, stream) {
- if (typeof signal !== 'object' || !('aborted' in signal)) {
- return stream
- }
- const onAbort = isNodeStream(stream)
- ? () => {
- stream.destroy(
- new AbortError(undefined, {
- cause: signal.reason
- })
- )
- }
- : () => {
- stream[kControllerErrorFunction](
- new AbortError(undefined, {
- cause: signal.reason
- })
- )
- }
- if (signal.aborted) {
- onAbort()
- } else {
- addAbortListener = addAbortListener || require('../../ours/util').addAbortListener
- const disposable = addAbortListener(signal, onAbort)
- eos(stream, disposable[SymbolDispose])
- }
- return stream
-}
-
-},{"../../ours/errors":72,"../../ours/primordials":73,"../../ours/util":74,"./end-of-stream":59,"./utils":68}],54:[function(require,module,exports){
-'use strict'
-
-const { StringPrototypeSlice, SymbolIterator, TypedArrayPrototypeSet, Uint8Array } = require('../../ours/primordials')
-const { Buffer } = require('buffer')
-const { inspect } = require('../../ours/util')
-module.exports = class BufferList {
- constructor() {
- this.head = null
- this.tail = null
- this.length = 0
- }
- push(v) {
- const entry = {
- data: v,
- next: null
- }
- if (this.length > 0) this.tail.next = entry
- else this.head = entry
- this.tail = entry
- ++this.length
- }
- unshift(v) {
- const entry = {
- data: v,
- next: this.head
- }
- if (this.length === 0) this.tail = entry
- this.head = entry
- ++this.length
- }
- shift() {
- if (this.length === 0) return
- const ret = this.head.data
- if (this.length === 1) this.head = this.tail = null
- else this.head = this.head.next
- --this.length
- return ret
- }
- clear() {
- this.head = this.tail = null
- this.length = 0
- }
- join(s) {
- if (this.length === 0) return ''
- let p = this.head
- let ret = '' + p.data
- while ((p = p.next) !== null) ret += s + p.data
- return ret
- }
- concat(n) {
- if (this.length === 0) return Buffer.alloc(0)
- const ret = Buffer.allocUnsafe(n >>> 0)
- let p = this.head
- let i = 0
- while (p) {
- TypedArrayPrototypeSet(ret, p.data, i)
- i += p.data.length
- p = p.next
- }
- return ret
- }
-
- // Consumes a specified amount of bytes or characters from the buffered data.
- consume(n, hasStrings) {
- const data = this.head.data
- if (n < data.length) {
- // `slice` is the same for buffers and strings.
- const slice = data.slice(0, n)
- this.head.data = data.slice(n)
- return slice
- }
- if (n === data.length) {
- // First chunk is a perfect match.
- return this.shift()
- }
- // Result spans more than one buffer.
- return hasStrings ? this._getString(n) : this._getBuffer(n)
- }
- first() {
- return this.head.data
- }
- *[SymbolIterator]() {
- for (let p = this.head; p; p = p.next) {
- yield p.data
- }
- }
-
- // Consumes a specified amount of characters from the buffered data.
- _getString(n) {
- let ret = ''
- let p = this.head
- let c = 0
- do {
- const str = p.data
- if (n > str.length) {
- ret += str
- n -= str.length
- } else {
- if (n === str.length) {
- ret += str
- ++c
- if (p.next) this.head = p.next
- else this.head = this.tail = null
- } else {
- ret += StringPrototypeSlice(str, 0, n)
- this.head = p
- p.data = StringPrototypeSlice(str, n)
- }
- break
- }
- ++c
- } while ((p = p.next) !== null)
- this.length -= c
- return ret
- }
-
- // Consumes a specified amount of bytes from the buffered data.
- _getBuffer(n) {
- const ret = Buffer.allocUnsafe(n)
- const retLen = n
- let p = this.head
- let c = 0
- do {
- const buf = p.data
- if (n > buf.length) {
- TypedArrayPrototypeSet(ret, buf, retLen - n)
- n -= buf.length
- } else {
- if (n === buf.length) {
- TypedArrayPrototypeSet(ret, buf, retLen - n)
- ++c
- if (p.next) this.head = p.next
- else this.head = this.tail = null
- } else {
- TypedArrayPrototypeSet(ret, new Uint8Array(buf.buffer, buf.byteOffset, n), retLen - n)
- this.head = p
- p.data = buf.slice(n)
- }
- break
- }
- ++c
- } while ((p = p.next) !== null)
- this.length -= c
- return ret
- }
-
- // Make sure the linked list only shows the minimal necessary information.
- [Symbol.for('nodejs.util.inspect.custom')](_, options) {
- return inspect(this, {
- ...options,
- // Only inspect one level.
- depth: 0,
- // It should not recurse.
- customInspect: false
- })
- }
-}
-
-},{"../../ours/primordials":73,"../../ours/util":74,"buffer":38}],55:[function(require,module,exports){
-'use strict'
-
-const { pipeline } = require('./pipeline')
-const Duplex = require('./duplex')
-const { destroyer } = require('./destroy')
-const {
- isNodeStream,
- isReadable,
- isWritable,
- isWebStream,
- isTransformStream,
- isWritableStream,
- isReadableStream
-} = require('./utils')
-const {
- AbortError,
- codes: { ERR_INVALID_ARG_VALUE, ERR_MISSING_ARGS }
-} = require('../../ours/errors')
-const eos = require('./end-of-stream')
-module.exports = function compose(...streams) {
- if (streams.length === 0) {
- throw new ERR_MISSING_ARGS('streams')
- }
- if (streams.length === 1) {
- return Duplex.from(streams[0])
- }
- const orgStreams = [...streams]
- if (typeof streams[0] === 'function') {
- streams[0] = Duplex.from(streams[0])
- }
- if (typeof streams[streams.length - 1] === 'function') {
- const idx = streams.length - 1
- streams[idx] = Duplex.from(streams[idx])
- }
- for (let n = 0; n < streams.length; ++n) {
- if (!isNodeStream(streams[n]) && !isWebStream(streams[n])) {
- // TODO(ronag): Add checks for non streams.
- continue
- }
- if (
- n < streams.length - 1 &&
- !(isReadable(streams[n]) || isReadableStream(streams[n]) || isTransformStream(streams[n]))
- ) {
- throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be readable')
- }
- if (n > 0 && !(isWritable(streams[n]) || isWritableStream(streams[n]) || isTransformStream(streams[n]))) {
- throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be writable')
- }
- }
- let ondrain
- let onfinish
- let onreadable
- let onclose
- let d
- function onfinished(err) {
- const cb = onclose
- onclose = null
- if (cb) {
- cb(err)
- } else if (err) {
- d.destroy(err)
- } else if (!readable && !writable) {
- d.destroy()
- }
- }
- const head = streams[0]
- const tail = pipeline(streams, onfinished)
- const writable = !!(isWritable(head) || isWritableStream(head) || isTransformStream(head))
- const readable = !!(isReadable(tail) || isReadableStream(tail) || isTransformStream(tail))
-
- // TODO(ronag): Avoid double buffering.
- // Implement Writable/Readable/Duplex traits.
- // See, https://github.com/nodejs/node/pull/33515.
- d = new Duplex({
- // TODO (ronag): highWaterMark?
- writableObjectMode: !!(head !== null && head !== undefined && head.writableObjectMode),
- readableObjectMode: !!(tail !== null && tail !== undefined && tail.readableObjectMode),
- writable,
- readable
- })
- if (writable) {
- if (isNodeStream(head)) {
- d._write = function (chunk, encoding, callback) {
- if (head.write(chunk, encoding)) {
- callback()
- } else {
- ondrain = callback
- }
- }
- d._final = function (callback) {
- head.end()
- onfinish = callback
- }
- head.on('drain', function () {
- if (ondrain) {
- const cb = ondrain
- ondrain = null
- cb()
- }
- })
- } else if (isWebStream(head)) {
- const writable = isTransformStream(head) ? head.writable : head
- const writer = writable.getWriter()
- d._write = async function (chunk, encoding, callback) {
- try {
- await writer.ready
- writer.write(chunk).catch(() => {})
- callback()
- } catch (err) {
- callback(err)
- }
- }
- d._final = async function (callback) {
- try {
- await writer.ready
- writer.close().catch(() => {})
- onfinish = callback
- } catch (err) {
- callback(err)
- }
- }
- }
- const toRead = isTransformStream(tail) ? tail.readable : tail
- eos(toRead, () => {
- if (onfinish) {
- const cb = onfinish
- onfinish = null
- cb()
- }
- })
- }
- if (readable) {
- if (isNodeStream(tail)) {
- tail.on('readable', function () {
- if (onreadable) {
- const cb = onreadable
- onreadable = null
- cb()
- }
- })
- tail.on('end', function () {
- d.push(null)
- })
- d._read = function () {
- while (true) {
- const buf = tail.read()
- if (buf === null) {
- onreadable = d._read
- return
- }
- if (!d.push(buf)) {
- return
- }
- }
- }
- } else if (isWebStream(tail)) {
- const readable = isTransformStream(tail) ? tail.readable : tail
- const reader = readable.getReader()
- d._read = async function () {
- while (true) {
- try {
- const { value, done } = await reader.read()
- if (!d.push(value)) {
- return
- }
- if (done) {
- d.push(null)
- return
- }
- } catch {
- return
- }
- }
- }
- }
- }
- d._destroy = function (err, callback) {
- if (!err && onclose !== null) {
- err = new AbortError()
- }
- onreadable = null
- ondrain = null
- onfinish = null
- if (onclose === null) {
- callback(err)
- } else {
- onclose = callback
- if (isNodeStream(tail)) {
- destroyer(tail, err)
- }
- }
- }
- return d
-}
-
-},{"../../ours/errors":72,"./destroy":56,"./duplex":57,"./end-of-stream":59,"./pipeline":64,"./utils":68}],56:[function(require,module,exports){
-'use strict'
-
-/* replacement start */
-
-const process = require('process/')
-
-/* replacement end */
-
-const {
- aggregateTwoErrors,
- codes: { ERR_MULTIPLE_CALLBACK },
- AbortError
-} = require('../../ours/errors')
-const { Symbol } = require('../../ours/primordials')
-const { kIsDestroyed, isDestroyed, isFinished, isServerRequest } = require('./utils')
-const kDestroy = Symbol('kDestroy')
-const kConstruct = Symbol('kConstruct')
-function checkError(err, w, r) {
- if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack // eslint-disable-line no-unused-expressions
-
- if (w && !w.errored) {
- w.errored = err
- }
- if (r && !r.errored) {
- r.errored = err
- }
- }
-}
-
-// Backwards compat. cb() is undocumented and unused in core but
-// unfortunately might be used by modules.
-function destroy(err, cb) {
- const r = this._readableState
- const w = this._writableState
- // With duplex streams we use the writable side for state.
- const s = w || r
- if ((w !== null && w !== undefined && w.destroyed) || (r !== null && r !== undefined && r.destroyed)) {
- if (typeof cb === 'function') {
- cb()
- }
- return this
- }
-
- // We set destroyed to true before firing error callbacks in order
- // to make it re-entrance safe in case destroy() is called within callbacks
- checkError(err, w, r)
- if (w) {
- w.destroyed = true
- }
- if (r) {
- r.destroyed = true
- }
-
- // If still constructing then defer calling _destroy.
- if (!s.constructed) {
- this.once(kDestroy, function (er) {
- _destroy(this, aggregateTwoErrors(er, err), cb)
- })
- } else {
- _destroy(this, err, cb)
- }
- return this
-}
-function _destroy(self, err, cb) {
- let called = false
- function onDestroy(err) {
- if (called) {
- return
- }
- called = true
- const r = self._readableState
- const w = self._writableState
- checkError(err, w, r)
- if (w) {
- w.closed = true
- }
- if (r) {
- r.closed = true
- }
- if (typeof cb === 'function') {
- cb(err)
- }
- if (err) {
- process.nextTick(emitErrorCloseNT, self, err)
- } else {
- process.nextTick(emitCloseNT, self)
- }
- }
- try {
- self._destroy(err || null, onDestroy)
- } catch (err) {
- onDestroy(err)
- }
-}
-function emitErrorCloseNT(self, err) {
- emitErrorNT(self, err)
- emitCloseNT(self)
-}
-function emitCloseNT(self) {
- const r = self._readableState
- const w = self._writableState
- if (w) {
- w.closeEmitted = true
- }
- if (r) {
- r.closeEmitted = true
- }
- if ((w !== null && w !== undefined && w.emitClose) || (r !== null && r !== undefined && r.emitClose)) {
- self.emit('close')
- }
-}
-function emitErrorNT(self, err) {
- const r = self._readableState
- const w = self._writableState
- if ((w !== null && w !== undefined && w.errorEmitted) || (r !== null && r !== undefined && r.errorEmitted)) {
- return
- }
- if (w) {
- w.errorEmitted = true
- }
- if (r) {
- r.errorEmitted = true
- }
- self.emit('error', err)
-}
-function undestroy() {
- const r = this._readableState
- const w = this._writableState
- if (r) {
- r.constructed = true
- r.closed = false
- r.closeEmitted = false
- r.destroyed = false
- r.errored = null
- r.errorEmitted = false
- r.reading = false
- r.ended = r.readable === false
- r.endEmitted = r.readable === false
- }
- if (w) {
- w.constructed = true
- w.destroyed = false
- w.closed = false
- w.closeEmitted = false
- w.errored = null
- w.errorEmitted = false
- w.finalCalled = false
- w.prefinished = false
- w.ended = w.writable === false
- w.ending = w.writable === false
- w.finished = w.writable === false
- }
-}
-function errorOrDestroy(stream, err, sync) {
- // We have tests that rely on errors being emitted
- // in the same tick, so changing this is semver major.
- // For now when you opt-in to autoDestroy we allow
- // the error to be emitted nextTick. In a future
- // semver major update we should change the default to this.
-
- const r = stream._readableState
- const w = stream._writableState
- if ((w !== null && w !== undefined && w.destroyed) || (r !== null && r !== undefined && r.destroyed)) {
- return this
- }
- if ((r !== null && r !== undefined && r.autoDestroy) || (w !== null && w !== undefined && w.autoDestroy))
- stream.destroy(err)
- else if (err) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- err.stack // eslint-disable-line no-unused-expressions
-
- if (w && !w.errored) {
- w.errored = err
- }
- if (r && !r.errored) {
- r.errored = err
- }
- if (sync) {
- process.nextTick(emitErrorNT, stream, err)
- } else {
- emitErrorNT(stream, err)
- }
- }
-}
-function construct(stream, cb) {
- if (typeof stream._construct !== 'function') {
- return
- }
- const r = stream._readableState
- const w = stream._writableState
- if (r) {
- r.constructed = false
- }
- if (w) {
- w.constructed = false
- }
- stream.once(kConstruct, cb)
- if (stream.listenerCount(kConstruct) > 1) {
- // Duplex
- return
- }
- process.nextTick(constructNT, stream)
-}
-function constructNT(stream) {
- let called = false
- function onConstruct(err) {
- if (called) {
- errorOrDestroy(stream, err !== null && err !== undefined ? err : new ERR_MULTIPLE_CALLBACK())
- return
- }
- called = true
- const r = stream._readableState
- const w = stream._writableState
- const s = w || r
- if (r) {
- r.constructed = true
- }
- if (w) {
- w.constructed = true
- }
- if (s.destroyed) {
- stream.emit(kDestroy, err)
- } else if (err) {
- errorOrDestroy(stream, err, true)
- } else {
- process.nextTick(emitConstructNT, stream)
- }
- }
- try {
- stream._construct((err) => {
- process.nextTick(onConstruct, err)
- })
- } catch (err) {
- process.nextTick(onConstruct, err)
- }
-}
-function emitConstructNT(stream) {
- stream.emit(kConstruct)
-}
-function isRequest(stream) {
- return (stream === null || stream === undefined ? undefined : stream.setHeader) && typeof stream.abort === 'function'
-}
-function emitCloseLegacy(stream) {
- stream.emit('close')
-}
-function emitErrorCloseLegacy(stream, err) {
- stream.emit('error', err)
- process.nextTick(emitCloseLegacy, stream)
-}
-
-// Normalize destroy for legacy.
-function destroyer(stream, err) {
- if (!stream || isDestroyed(stream)) {
- return
- }
- if (!err && !isFinished(stream)) {
- err = new AbortError()
- }
-
- // TODO: Remove isRequest branches.
- if (isServerRequest(stream)) {
- stream.socket = null
- stream.destroy(err)
- } else if (isRequest(stream)) {
- stream.abort()
- } else if (isRequest(stream.req)) {
- stream.req.abort()
- } else if (typeof stream.destroy === 'function') {
- stream.destroy(err)
- } else if (typeof stream.close === 'function') {
- // TODO: Don't lose err?
- stream.close()
- } else if (err) {
- process.nextTick(emitErrorCloseLegacy, stream, err)
- } else {
- process.nextTick(emitCloseLegacy, stream)
- }
- if (!stream.destroyed) {
- stream[kIsDestroyed] = true
- }
-}
-module.exports = {
- construct,
- destroyer,
- destroy,
- undestroy,
- errorOrDestroy
-}
-
-},{"../../ours/errors":72,"../../ours/primordials":73,"./utils":68,"process/":101}],57:[function(require,module,exports){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// a duplex stream is just a stream that is both readable and writable.
-// Since JS doesn't have multiple prototype inheritance, this class
-// prototypically inherits from Readable, and then parasitically from
-// Writable.
-
-'use strict'
-
-const {
- ObjectDefineProperties,
- ObjectGetOwnPropertyDescriptor,
- ObjectKeys,
- ObjectSetPrototypeOf
-} = require('../../ours/primordials')
-module.exports = Duplex
-const Readable = require('./readable')
-const Writable = require('./writable')
-ObjectSetPrototypeOf(Duplex.prototype, Readable.prototype)
-ObjectSetPrototypeOf(Duplex, Readable)
-{
- const keys = ObjectKeys(Writable.prototype)
- // Allow the keys array to be GC'ed.
- for (let i = 0; i < keys.length; i++) {
- const method = keys[i]
- if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]
- }
-}
-function Duplex(options) {
- if (!(this instanceof Duplex)) return new Duplex(options)
- Readable.call(this, options)
- Writable.call(this, options)
- if (options) {
- this.allowHalfOpen = options.allowHalfOpen !== false
- if (options.readable === false) {
- this._readableState.readable = false
- this._readableState.ended = true
- this._readableState.endEmitted = true
- }
- if (options.writable === false) {
- this._writableState.writable = false
- this._writableState.ending = true
- this._writableState.ended = true
- this._writableState.finished = true
- }
- } else {
- this.allowHalfOpen = true
- }
-}
-ObjectDefineProperties(Duplex.prototype, {
- writable: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writable')
- },
- writableHighWaterMark: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableHighWaterMark')
- },
- writableObjectMode: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableObjectMode')
- },
- writableBuffer: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableBuffer')
- },
- writableLength: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableLength')
- },
- writableFinished: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableFinished')
- },
- writableCorked: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableCorked')
- },
- writableEnded: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableEnded')
- },
- writableNeedDrain: {
- __proto__: null,
- ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableNeedDrain')
- },
- destroyed: {
- __proto__: null,
- get() {
- if (this._readableState === undefined || this._writableState === undefined) {
- return false
- }
- return this._readableState.destroyed && this._writableState.destroyed
- },
- set(value) {
- // Backward compatibility, the user is explicitly
- // managing destroyed.
- if (this._readableState && this._writableState) {
- this._readableState.destroyed = value
- this._writableState.destroyed = value
- }
- }
- }
-})
-let webStreamsAdapters
-
-// Lazy to avoid circular references
-function lazyWebStreams() {
- if (webStreamsAdapters === undefined) webStreamsAdapters = {}
- return webStreamsAdapters
-}
-Duplex.fromWeb = function (pair, options) {
- return lazyWebStreams().newStreamDuplexFromReadableWritablePair(pair, options)
-}
-Duplex.toWeb = function (duplex) {
- return lazyWebStreams().newReadableWritablePairFromDuplex(duplex)
-}
-let duplexify
-Duplex.from = function (body) {
- if (!duplexify) {
- duplexify = require('./duplexify')
- }
- return duplexify(body, 'body')
-}
-
-},{"../../ours/primordials":73,"./duplexify":58,"./readable":65,"./writable":69}],58:[function(require,module,exports){
-/* replacement start */
-
-const process = require('process/')
-
-/* replacement end */
-
-;('use strict')
-const bufferModule = require('buffer')
-const {
- isReadable,
- isWritable,
- isIterable,
- isNodeStream,
- isReadableNodeStream,
- isWritableNodeStream,
- isDuplexNodeStream,
- isReadableStream,
- isWritableStream
-} = require('./utils')
-const eos = require('./end-of-stream')
-const {
- AbortError,
- codes: { ERR_INVALID_ARG_TYPE, ERR_INVALID_RETURN_VALUE }
-} = require('../../ours/errors')
-const { destroyer } = require('./destroy')
-const Duplex = require('./duplex')
-const Readable = require('./readable')
-const Writable = require('./writable')
-const { createDeferredPromise } = require('../../ours/util')
-const from = require('./from')
-const Blob = globalThis.Blob || bufferModule.Blob
-const isBlob =
- typeof Blob !== 'undefined'
- ? function isBlob(b) {
- return b instanceof Blob
- }
- : function isBlob(b) {
- return false
- }
-const AbortController = globalThis.AbortController || require('abort-controller').AbortController
-const { FunctionPrototypeCall } = require('../../ours/primordials')
-
-// This is needed for pre node 17.
-class Duplexify extends Duplex {
- constructor(options) {
- super(options)
-
- // https://github.com/nodejs/node/pull/34385
-
- if ((options === null || options === undefined ? undefined : options.readable) === false) {
- this._readableState.readable = false
- this._readableState.ended = true
- this._readableState.endEmitted = true
- }
- if ((options === null || options === undefined ? undefined : options.writable) === false) {
- this._writableState.writable = false
- this._writableState.ending = true
- this._writableState.ended = true
- this._writableState.finished = true
- }
- }
-}
-module.exports = function duplexify(body, name) {
- if (isDuplexNodeStream(body)) {
- return body
- }
- if (isReadableNodeStream(body)) {
- return _duplexify({
- readable: body
- })
- }
- if (isWritableNodeStream(body)) {
- return _duplexify({
- writable: body
- })
- }
- if (isNodeStream(body)) {
- return _duplexify({
- writable: false,
- readable: false
- })
- }
- if (isReadableStream(body)) {
- return _duplexify({
- readable: Readable.fromWeb(body)
- })
- }
- if (isWritableStream(body)) {
- return _duplexify({
- writable: Writable.fromWeb(body)
- })
- }
- if (typeof body === 'function') {
- const { value, write, final, destroy } = fromAsyncGen(body)
- if (isIterable(value)) {
- return from(Duplexify, value, {
- // TODO (ronag): highWaterMark?
- objectMode: true,
- write,
- final,
- destroy
- })
- }
- const then = value === null || value === undefined ? undefined : value.then
- if (typeof then === 'function') {
- let d
- const promise = FunctionPrototypeCall(
- then,
- value,
- (val) => {
- if (val != null) {
- throw new ERR_INVALID_RETURN_VALUE('nully', 'body', val)
- }
- },
- (err) => {
- destroyer(d, err)
- }
- )
- return (d = new Duplexify({
- // TODO (ronag): highWaterMark?
- objectMode: true,
- readable: false,
- write,
- final(cb) {
- final(async () => {
- try {
- await promise
- process.nextTick(cb, null)
- } catch (err) {
- process.nextTick(cb, err)
- }
- })
- },
- destroy
- }))
- }
- throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or AsyncFunction', name, value)
- }
- if (isBlob(body)) {
- return duplexify(body.arrayBuffer())
- }
- if (isIterable(body)) {
- return from(Duplexify, body, {
- // TODO (ronag): highWaterMark?
- objectMode: true,
- writable: false
- })
- }
- if (
- isReadableStream(body === null || body === undefined ? undefined : body.readable) &&
- isWritableStream(body === null || body === undefined ? undefined : body.writable)
- ) {
- return Duplexify.fromWeb(body)
- }
- if (
- typeof (body === null || body === undefined ? undefined : body.writable) === 'object' ||
- typeof (body === null || body === undefined ? undefined : body.readable) === 'object'
- ) {
- const readable =
- body !== null && body !== undefined && body.readable
- ? isReadableNodeStream(body === null || body === undefined ? undefined : body.readable)
- ? body === null || body === undefined
- ? undefined
- : body.readable
- : duplexify(body.readable)
- : undefined
- const writable =
- body !== null && body !== undefined && body.writable
- ? isWritableNodeStream(body === null || body === undefined ? undefined : body.writable)
- ? body === null || body === undefined
- ? undefined
- : body.writable
- : duplexify(body.writable)
- : undefined
- return _duplexify({
- readable,
- writable
- })
- }
- const then = body === null || body === undefined ? undefined : body.then
- if (typeof then === 'function') {
- let d
- FunctionPrototypeCall(
- then,
- body,
- (val) => {
- if (val != null) {
- d.push(val)
- }
- d.push(null)
- },
- (err) => {
- destroyer(d, err)
- }
- )
- return (d = new Duplexify({
- objectMode: true,
- writable: false,
- read() {}
- }))
- }
- throw new ERR_INVALID_ARG_TYPE(
- name,
- [
- 'Blob',
- 'ReadableStream',
- 'WritableStream',
- 'Stream',
- 'Iterable',
- 'AsyncIterable',
- 'Function',
- '{ readable, writable } pair',
- 'Promise'
- ],
- body
- )
-}
-function fromAsyncGen(fn) {
- let { promise, resolve } = createDeferredPromise()
- const ac = new AbortController()
- const signal = ac.signal
- const value = fn(
- (async function* () {
- while (true) {
- const _promise = promise
- promise = null
- const { chunk, done, cb } = await _promise
- process.nextTick(cb)
- if (done) return
- if (signal.aborted)
- throw new AbortError(undefined, {
- cause: signal.reason
- })
- ;({ promise, resolve } = createDeferredPromise())
- yield chunk
- }
- })(),
- {
- signal
- }
- )
- return {
- value,
- write(chunk, encoding, cb) {
- const _resolve = resolve
- resolve = null
- _resolve({
- chunk,
- done: false,
- cb
- })
- },
- final(cb) {
- const _resolve = resolve
- resolve = null
- _resolve({
- done: true,
- cb
- })
- },
- destroy(err, cb) {
- ac.abort()
- cb(err)
- }
- }
-}
-function _duplexify(pair) {
- const r = pair.readable && typeof pair.readable.read !== 'function' ? Readable.wrap(pair.readable) : pair.readable
- const w = pair.writable
- let readable = !!isReadable(r)
- let writable = !!isWritable(w)
- let ondrain
- let onfinish
- let onreadable
- let onclose
- let d
- function onfinished(err) {
- const cb = onclose
- onclose = null
- if (cb) {
- cb(err)
- } else if (err) {
- d.destroy(err)
- }
- }
-
- // TODO(ronag): Avoid double buffering.
- // Implement Writable/Readable/Duplex traits.
- // See, https://github.com/nodejs/node/pull/33515.
- d = new Duplexify({
- // TODO (ronag): highWaterMark?
- readableObjectMode: !!(r !== null && r !== undefined && r.readableObjectMode),
- writableObjectMode: !!(w !== null && w !== undefined && w.writableObjectMode),
- readable,
- writable
- })
- if (writable) {
- eos(w, (err) => {
- writable = false
- if (err) {
- destroyer(r, err)
- }
- onfinished(err)
- })
- d._write = function (chunk, encoding, callback) {
- if (w.write(chunk, encoding)) {
- callback()
- } else {
- ondrain = callback
- }
- }
- d._final = function (callback) {
- w.end()
- onfinish = callback
- }
- w.on('drain', function () {
- if (ondrain) {
- const cb = ondrain
- ondrain = null
- cb()
- }
- })
- w.on('finish', function () {
- if (onfinish) {
- const cb = onfinish
- onfinish = null
- cb()
- }
- })
- }
- if (readable) {
- eos(r, (err) => {
- readable = false
- if (err) {
- destroyer(r, err)
- }
- onfinished(err)
- })
- r.on('readable', function () {
- if (onreadable) {
- const cb = onreadable
- onreadable = null
- cb()
- }
- })
- r.on('end', function () {
- d.push(null)
- })
- d._read = function () {
- while (true) {
- const buf = r.read()
- if (buf === null) {
- onreadable = d._read
- return
- }
- if (!d.push(buf)) {
- return
- }
- }
- }
- }
- d._destroy = function (err, callback) {
- if (!err && onclose !== null) {
- err = new AbortError()
- }
- onreadable = null
- ondrain = null
- onfinish = null
- if (onclose === null) {
- callback(err)
- } else {
- onclose = callback
- destroyer(w, err)
- destroyer(r, err)
- }
- }
- return d
-}
-
-},{"../../ours/errors":72,"../../ours/primordials":73,"../../ours/util":74,"./destroy":56,"./duplex":57,"./end-of-stream":59,"./from":60,"./readable":65,"./utils":68,"./writable":69,"abort-controller":34,"buffer":38,"process/":101}],59:[function(require,module,exports){
-/* replacement start */
-
-const process = require('process/')
-
-/* replacement end */
-// Ported from https://github.com/mafintosh/end-of-stream with
-// permission from the author, Mathias Buus (@mafintosh).
-
-;('use strict')
-const { AbortError, codes } = require('../../ours/errors')
-const { ERR_INVALID_ARG_TYPE, ERR_STREAM_PREMATURE_CLOSE } = codes
-const { kEmptyObject, once } = require('../../ours/util')
-const { validateAbortSignal, validateFunction, validateObject, validateBoolean } = require('../validators')
-const { Promise, PromisePrototypeThen, SymbolDispose } = require('../../ours/primordials')
-const {
- isClosed,
- isReadable,
- isReadableNodeStream,
- isReadableStream,
- isReadableFinished,
- isReadableErrored,
- isWritable,
- isWritableNodeStream,
- isWritableStream,
- isWritableFinished,
- isWritableErrored,
- isNodeStream,
- willEmitClose: _willEmitClose,
- kIsClosedPromise
-} = require('./utils')
-let addAbortListener
-function isRequest(stream) {
- return stream.setHeader && typeof stream.abort === 'function'
-}
-const nop = () => {}
-function eos(stream, options, callback) {
- var _options$readable, _options$writable
- if (arguments.length === 2) {
- callback = options
- options = kEmptyObject
- } else if (options == null) {
- options = kEmptyObject
- } else {
- validateObject(options, 'options')
- }
- validateFunction(callback, 'callback')
- validateAbortSignal(options.signal, 'options.signal')
- callback = once(callback)
- if (isReadableStream(stream) || isWritableStream(stream)) {
- return eosWeb(stream, options, callback)
- }
- if (!isNodeStream(stream)) {
- throw new ERR_INVALID_ARG_TYPE('stream', ['ReadableStream', 'WritableStream', 'Stream'], stream)
- }
- const readable =
- (_options$readable = options.readable) !== null && _options$readable !== undefined
- ? _options$readable
- : isReadableNodeStream(stream)
- const writable =
- (_options$writable = options.writable) !== null && _options$writable !== undefined
- ? _options$writable
- : isWritableNodeStream(stream)
- const wState = stream._writableState
- const rState = stream._readableState
- const onlegacyfinish = () => {
- if (!stream.writable) {
- onfinish()
- }
- }
-
- // TODO (ronag): Improve soft detection to include core modules and
- // common ecosystem modules that do properly emit 'close' but fail
- // this generic check.
- let willEmitClose =
- _willEmitClose(stream) && isReadableNodeStream(stream) === readable && isWritableNodeStream(stream) === writable
- let writableFinished = isWritableFinished(stream, false)
- const onfinish = () => {
- writableFinished = true
- // Stream should not be destroyed here. If it is that
- // means that user space is doing something differently and
- // we cannot trust willEmitClose.
- if (stream.destroyed) {
- willEmitClose = false
- }
- if (willEmitClose && (!stream.readable || readable)) {
- return
- }
- if (!readable || readableFinished) {
- callback.call(stream)
- }
- }
- let readableFinished = isReadableFinished(stream, false)
- const onend = () => {
- readableFinished = true
- // Stream should not be destroyed here. If it is that
- // means that user space is doing something differently and
- // we cannot trust willEmitClose.
- if (stream.destroyed) {
- willEmitClose = false
- }
- if (willEmitClose && (!stream.writable || writable)) {
- return
- }
- if (!writable || writableFinished) {
- callback.call(stream)
- }
- }
- const onerror = (err) => {
- callback.call(stream, err)
- }
- let closed = isClosed(stream)
- const onclose = () => {
- closed = true
- const errored = isWritableErrored(stream) || isReadableErrored(stream)
- if (errored && typeof errored !== 'boolean') {
- return callback.call(stream, errored)
- }
- if (readable && !readableFinished && isReadableNodeStream(stream, true)) {
- if (!isReadableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE())
- }
- if (writable && !writableFinished) {
- if (!isWritableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE())
- }
- callback.call(stream)
- }
- const onclosed = () => {
- closed = true
- const errored = isWritableErrored(stream) || isReadableErrored(stream)
- if (errored && typeof errored !== 'boolean') {
- return callback.call(stream, errored)
- }
- callback.call(stream)
- }
- const onrequest = () => {
- stream.req.on('finish', onfinish)
- }
- if (isRequest(stream)) {
- stream.on('complete', onfinish)
- if (!willEmitClose) {
- stream.on('abort', onclose)
- }
- if (stream.req) {
- onrequest()
- } else {
- stream.on('request', onrequest)
- }
- } else if (writable && !wState) {
- // legacy streams
- stream.on('end', onlegacyfinish)
- stream.on('close', onlegacyfinish)
- }
-
- // Not all streams will emit 'close' after 'aborted'.
- if (!willEmitClose && typeof stream.aborted === 'boolean') {
- stream.on('aborted', onclose)
- }
- stream.on('end', onend)
- stream.on('finish', onfinish)
- if (options.error !== false) {
- stream.on('error', onerror)
- }
- stream.on('close', onclose)
- if (closed) {
- process.nextTick(onclose)
- } else if (
- (wState !== null && wState !== undefined && wState.errorEmitted) ||
- (rState !== null && rState !== undefined && rState.errorEmitted)
- ) {
- if (!willEmitClose) {
- process.nextTick(onclosed)
- }
- } else if (
- !readable &&
- (!willEmitClose || isReadable(stream)) &&
- (writableFinished || isWritable(stream) === false)
- ) {
- process.nextTick(onclosed)
- } else if (
- !writable &&
- (!willEmitClose || isWritable(stream)) &&
- (readableFinished || isReadable(stream) === false)
- ) {
- process.nextTick(onclosed)
- } else if (rState && stream.req && stream.aborted) {
- process.nextTick(onclosed)
- }
- const cleanup = () => {
- callback = nop
- stream.removeListener('aborted', onclose)
- stream.removeListener('complete', onfinish)
- stream.removeListener('abort', onclose)
- stream.removeListener('request', onrequest)
- if (stream.req) stream.req.removeListener('finish', onfinish)
- stream.removeListener('end', onlegacyfinish)
- stream.removeListener('close', onlegacyfinish)
- stream.removeListener('finish', onfinish)
- stream.removeListener('end', onend)
- stream.removeListener('error', onerror)
- stream.removeListener('close', onclose)
- }
- if (options.signal && !closed) {
- const abort = () => {
- // Keep it because cleanup removes it.
- const endCallback = callback
- cleanup()
- endCallback.call(
- stream,
- new AbortError(undefined, {
- cause: options.signal.reason
- })
- )
- }
- if (options.signal.aborted) {
- process.nextTick(abort)
- } else {
- addAbortListener = addAbortListener || require('../../ours/util').addAbortListener
- const disposable = addAbortListener(options.signal, abort)
- const originalCallback = callback
- callback = once((...args) => {
- disposable[SymbolDispose]()
- originalCallback.apply(stream, args)
- })
- }
- }
- return cleanup
-}
-function eosWeb(stream, options, callback) {
- let isAborted = false
- let abort = nop
- if (options.signal) {
- abort = () => {
- isAborted = true
- callback.call(
- stream,
- new AbortError(undefined, {
- cause: options.signal.reason
- })
- )
- }
- if (options.signal.aborted) {
- process.nextTick(abort)
- } else {
- addAbortListener = addAbortListener || require('../../ours/util').addAbortListener
- const disposable = addAbortListener(options.signal, abort)
- const originalCallback = callback
- callback = once((...args) => {
- disposable[SymbolDispose]()
- originalCallback.apply(stream, args)
- })
- }
- }
- const resolverFn = (...args) => {
- if (!isAborted) {
- process.nextTick(() => callback.apply(stream, args))
- }
- }
- PromisePrototypeThen(stream[kIsClosedPromise].promise, resolverFn, resolverFn)
- return nop
-}
-function finished(stream, opts) {
- var _opts
- let autoCleanup = false
- if (opts === null) {
- opts = kEmptyObject
- }
- if ((_opts = opts) !== null && _opts !== undefined && _opts.cleanup) {
- validateBoolean(opts.cleanup, 'cleanup')
- autoCleanup = opts.cleanup
- }
- return new Promise((resolve, reject) => {
- const cleanup = eos(stream, opts, (err) => {
- if (autoCleanup) {
- cleanup()
- }
- if (err) {
- reject(err)
- } else {
- resolve()
- }
- })
- })
-}
-module.exports = eos
-module.exports.finished = finished
-
-},{"../../ours/errors":72,"../../ours/primordials":73,"../../ours/util":74,"../validators":70,"./utils":68,"process/":101}],60:[function(require,module,exports){
-'use strict'
-
-/* replacement start */
-
-const process = require('process/')
-
-/* replacement end */
-
-const { PromisePrototypeThen, SymbolAsyncIterator, SymbolIterator } = require('../../ours/primordials')
-const { Buffer } = require('buffer')
-const { ERR_INVALID_ARG_TYPE, ERR_STREAM_NULL_VALUES } = require('../../ours/errors').codes
-function from(Readable, iterable, opts) {
- let iterator
- if (typeof iterable === 'string' || iterable instanceof Buffer) {
- return new Readable({
- objectMode: true,
- ...opts,
- read() {
- this.push(iterable)
- this.push(null)
- }
- })
- }
- let isAsync
- if (iterable && iterable[SymbolAsyncIterator]) {
- isAsync = true
- iterator = iterable[SymbolAsyncIterator]()
- } else if (iterable && iterable[SymbolIterator]) {
- isAsync = false
- iterator = iterable[SymbolIterator]()
- } else {
- throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable)
- }
- const readable = new Readable({
- objectMode: true,
- highWaterMark: 1,
- // TODO(ronag): What options should be allowed?
- ...opts
- })
-
- // Flag to protect against _read
- // being called before last iteration completion.
- let reading = false
- readable._read = function () {
- if (!reading) {
- reading = true
- next()
- }
- }
- readable._destroy = function (error, cb) {
- PromisePrototypeThen(
- close(error),
- () => process.nextTick(cb, error),
- // nextTick is here in case cb throws
- (e) => process.nextTick(cb, e || error)
- )
- }
- async function close(error) {
- const hadError = error !== undefined && error !== null
- const hasThrow = typeof iterator.throw === 'function'
- if (hadError && hasThrow) {
- const { value, done } = await iterator.throw(error)
- await value
- if (done) {
- return
- }
- }
- if (typeof iterator.return === 'function') {
- const { value } = await iterator.return()
- await value
- }
- }
- async function next() {
- for (;;) {
- try {
- const { value, done } = isAsync ? await iterator.next() : iterator.next()
- if (done) {
- readable.push(null)
- } else {
- const res = value && typeof value.then === 'function' ? await value : value
- if (res === null) {
- reading = false
- throw new ERR_STREAM_NULL_VALUES()
- } else if (readable.push(res)) {
- continue
- } else {
- reading = false
- }
- }
- } catch (err) {
- readable.destroy(err)
- }
- break
- }
- }
- return readable
-}
-module.exports = from
-
-},{"../../ours/errors":72,"../../ours/primordials":73,"buffer":38,"process/":101}],61:[function(require,module,exports){
-'use strict'
-
-const { ArrayIsArray, ObjectSetPrototypeOf } = require('../../ours/primordials')
-const { EventEmitter: EE } = require('events')
-function Stream(opts) {
- EE.call(this, opts)
-}
-ObjectSetPrototypeOf(Stream.prototype, EE.prototype)
-ObjectSetPrototypeOf(Stream, EE)
-Stream.prototype.pipe = function (dest, options) {
- const source = this
- function ondata(chunk) {
- if (dest.writable && dest.write(chunk) === false && source.pause) {
- source.pause()
- }
- }
- source.on('data', ondata)
- function ondrain() {
- if (source.readable && source.resume) {
- source.resume()
- }
- }
- dest.on('drain', ondrain)
-
- // If the 'end' option is not supplied, dest.end() will be called when
- // source gets the 'end' or 'close' events. Only dest.end() once.
- if (!dest._isStdio && (!options || options.end !== false)) {
- source.on('end', onend)
- source.on('close', onclose)
- }
- let didOnEnd = false
- function onend() {
- if (didOnEnd) return
- didOnEnd = true
- dest.end()
- }
- function onclose() {
- if (didOnEnd) return
- didOnEnd = true
- if (typeof dest.destroy === 'function') dest.destroy()
- }
-
- // Don't leave dangling pipes when there are errors.
- function onerror(er) {
- cleanup()
- if (EE.listenerCount(this, 'error') === 0) {
- this.emit('error', er)
- }
- }
- prependListener(source, 'error', onerror)
- prependListener(dest, 'error', onerror)
-
- // Remove all the event listeners that were added.
- function cleanup() {
- source.removeListener('data', ondata)
- dest.removeListener('drain', ondrain)
- source.removeListener('end', onend)
- source.removeListener('close', onclose)
- source.removeListener('error', onerror)
- dest.removeListener('error', onerror)
- source.removeListener('end', cleanup)
- source.removeListener('close', cleanup)
- dest.removeListener('close', cleanup)
- }
- source.on('end', cleanup)
- source.on('close', cleanup)
- dest.on('close', cleanup)
- dest.emit('pipe', source)
-
- // Allow for unix-like usage: A.pipe(B).pipe(C)
- return dest
-}
-function prependListener(emitter, event, fn) {
- // Sadly this is not cacheable as some libraries bundle their own
- // event emitter implementation with them.
- if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn)
-
- // This is a hack to make sure that our error handler is attached before any
- // userland ones. NEVER DO THIS. This is here only because this code needs
- // to continue to work with older versions of Node.js that do not include
- // the prependListener() method. The goal is to eventually remove this hack.
- if (!emitter._events || !emitter._events[event]) emitter.on(event, fn)
- else if (ArrayIsArray(emitter._events[event])) emitter._events[event].unshift(fn)
- else emitter._events[event] = [fn, emitter._events[event]]
-}
-module.exports = {
- Stream,
- prependListener
-}
-
-},{"../../ours/primordials":73,"events":51}],62:[function(require,module,exports){
-'use strict'
-
-const AbortController = globalThis.AbortController || require('abort-controller').AbortController
-const {
- codes: { ERR_INVALID_ARG_VALUE, ERR_INVALID_ARG_TYPE, ERR_MISSING_ARGS, ERR_OUT_OF_RANGE },
- AbortError
-} = require('../../ours/errors')
-const { validateAbortSignal, validateInteger, validateObject } = require('../validators')
-const kWeakHandler = require('../../ours/primordials').Symbol('kWeak')
-const kResistStopPropagation = require('../../ours/primordials').Symbol('kResistStopPropagation')
-const { finished } = require('./end-of-stream')
-const staticCompose = require('./compose')
-const { addAbortSignalNoValidate } = require('./add-abort-signal')
-const { isWritable, isNodeStream } = require('./utils')
-const { deprecate } = require('../../ours/util')
-const {
- ArrayPrototypePush,
- Boolean,
- MathFloor,
- Number,
- NumberIsNaN,
- Promise,
- PromiseReject,
- PromiseResolve,
- PromisePrototypeThen,
- Symbol
-} = require('../../ours/primordials')
-const kEmpty = Symbol('kEmpty')
-const kEof = Symbol('kEof')
-function compose(stream, options) {
- if (options != null) {
- validateObject(options, 'options')
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal')
- }
- if (isNodeStream(stream) && !isWritable(stream)) {
- throw new ERR_INVALID_ARG_VALUE('stream', stream, 'must be writable')
- }
- const composedStream = staticCompose(this, stream)
- if (options !== null && options !== undefined && options.signal) {
- // Not validating as we already validated before
- addAbortSignalNoValidate(options.signal, composedStream)
- }
- return composedStream
-}
-function map(fn, options) {
- if (typeof fn !== 'function') {
- throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
- }
- if (options != null) {
- validateObject(options, 'options')
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal')
- }
- let concurrency = 1
- if ((options === null || options === undefined ? undefined : options.concurrency) != null) {
- concurrency = MathFloor(options.concurrency)
- }
- let highWaterMark = concurrency - 1
- if ((options === null || options === undefined ? undefined : options.highWaterMark) != null) {
- highWaterMark = MathFloor(options.highWaterMark)
- }
- validateInteger(concurrency, 'options.concurrency', 1)
- validateInteger(highWaterMark, 'options.highWaterMark', 0)
- highWaterMark += concurrency
- return async function* map() {
- const signal = require('../../ours/util').AbortSignalAny(
- [options === null || options === undefined ? undefined : options.signal].filter(Boolean)
- )
- const stream = this
- const queue = []
- const signalOpt = {
- signal
- }
- let next
- let resume
- let done = false
- let cnt = 0
- function onCatch() {
- done = true
- afterItemProcessed()
- }
- function afterItemProcessed() {
- cnt -= 1
- maybeResume()
- }
- function maybeResume() {
- if (resume && !done && cnt < concurrency && queue.length < highWaterMark) {
- resume()
- resume = null
- }
- }
- async function pump() {
- try {
- for await (let val of stream) {
- if (done) {
- return
- }
- if (signal.aborted) {
- throw new AbortError()
- }
- try {
- val = fn(val, signalOpt)
- if (val === kEmpty) {
- continue
- }
- val = PromiseResolve(val)
- } catch (err) {
- val = PromiseReject(err)
- }
- cnt += 1
- PromisePrototypeThen(val, afterItemProcessed, onCatch)
- queue.push(val)
- if (next) {
- next()
- next = null
- }
- if (!done && (queue.length >= highWaterMark || cnt >= concurrency)) {
- await new Promise((resolve) => {
- resume = resolve
- })
- }
- }
- queue.push(kEof)
- } catch (err) {
- const val = PromiseReject(err)
- PromisePrototypeThen(val, afterItemProcessed, onCatch)
- queue.push(val)
- } finally {
- done = true
- if (next) {
- next()
- next = null
- }
- }
- }
- pump()
- try {
- while (true) {
- while (queue.length > 0) {
- const val = await queue[0]
- if (val === kEof) {
- return
- }
- if (signal.aborted) {
- throw new AbortError()
- }
- if (val !== kEmpty) {
- yield val
- }
- queue.shift()
- maybeResume()
- }
- await new Promise((resolve) => {
- next = resolve
- })
- }
- } finally {
- done = true
- if (resume) {
- resume()
- resume = null
- }
- }
- }.call(this)
-}
-function asIndexedPairs(options = undefined) {
- if (options != null) {
- validateObject(options, 'options')
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal')
- }
- return async function* asIndexedPairs() {
- let index = 0
- for await (const val of this) {
- var _options$signal
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal = options.signal) !== null &&
- _options$signal !== undefined &&
- _options$signal.aborted
- ) {
- throw new AbortError({
- cause: options.signal.reason
- })
- }
- yield [index++, val]
- }
- }.call(this)
-}
-async function some(fn, options = undefined) {
- for await (const unused of filter.call(this, fn, options)) {
- return true
- }
- return false
-}
-async function every(fn, options = undefined) {
- if (typeof fn !== 'function') {
- throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
- }
- // https://en.wikipedia.org/wiki/De_Morgan%27s_laws
- return !(await some.call(
- this,
- async (...args) => {
- return !(await fn(...args))
- },
- options
- ))
-}
-async function find(fn, options) {
- for await (const result of filter.call(this, fn, options)) {
- return result
- }
- return undefined
-}
-async function forEach(fn, options) {
- if (typeof fn !== 'function') {
- throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
- }
- async function forEachFn(value, options) {
- await fn(value, options)
- return kEmpty
- }
- // eslint-disable-next-line no-unused-vars
- for await (const unused of map.call(this, forEachFn, options));
-}
-function filter(fn, options) {
- if (typeof fn !== 'function') {
- throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
- }
- async function filterFn(value, options) {
- if (await fn(value, options)) {
- return value
- }
- return kEmpty
- }
- return map.call(this, filterFn, options)
-}
-
-// Specific to provide better error to reduce since the argument is only
-// missing if the stream has no items in it - but the code is still appropriate
-class ReduceAwareErrMissingArgs extends ERR_MISSING_ARGS {
- constructor() {
- super('reduce')
- this.message = 'Reduce of an empty stream requires an initial value'
- }
-}
-async function reduce(reducer, initialValue, options) {
- var _options$signal2
- if (typeof reducer !== 'function') {
- throw new ERR_INVALID_ARG_TYPE('reducer', ['Function', 'AsyncFunction'], reducer)
- }
- if (options != null) {
- validateObject(options, 'options')
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal')
- }
- let hasInitialValue = arguments.length > 1
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal2 = options.signal) !== null &&
- _options$signal2 !== undefined &&
- _options$signal2.aborted
- ) {
- const err = new AbortError(undefined, {
- cause: options.signal.reason
- })
- this.once('error', () => {}) // The error is already propagated
- await finished(this.destroy(err))
- throw err
- }
- const ac = new AbortController()
- const signal = ac.signal
- if (options !== null && options !== undefined && options.signal) {
- const opts = {
- once: true,
- [kWeakHandler]: this,
- [kResistStopPropagation]: true
- }
- options.signal.addEventListener('abort', () => ac.abort(), opts)
- }
- let gotAnyItemFromStream = false
- try {
- for await (const value of this) {
- var _options$signal3
- gotAnyItemFromStream = true
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal3 = options.signal) !== null &&
- _options$signal3 !== undefined &&
- _options$signal3.aborted
- ) {
- throw new AbortError()
- }
- if (!hasInitialValue) {
- initialValue = value
- hasInitialValue = true
- } else {
- initialValue = await reducer(initialValue, value, {
- signal
- })
- }
- }
- if (!gotAnyItemFromStream && !hasInitialValue) {
- throw new ReduceAwareErrMissingArgs()
- }
- } finally {
- ac.abort()
- }
- return initialValue
-}
-async function toArray(options) {
- if (options != null) {
- validateObject(options, 'options')
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal')
- }
- const result = []
- for await (const val of this) {
- var _options$signal4
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal4 = options.signal) !== null &&
- _options$signal4 !== undefined &&
- _options$signal4.aborted
- ) {
- throw new AbortError(undefined, {
- cause: options.signal.reason
- })
- }
- ArrayPrototypePush(result, val)
- }
- return result
-}
-function flatMap(fn, options) {
- const values = map.call(this, fn, options)
- return async function* flatMap() {
- for await (const val of values) {
- yield* val
- }
- }.call(this)
-}
-function toIntegerOrInfinity(number) {
- // We coerce here to align with the spec
- // https://github.com/tc39/proposal-iterator-helpers/issues/169
- number = Number(number)
- if (NumberIsNaN(number)) {
- return 0
- }
- if (number < 0) {
- throw new ERR_OUT_OF_RANGE('number', '>= 0', number)
- }
- return number
-}
-function drop(number, options = undefined) {
- if (options != null) {
- validateObject(options, 'options')
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal')
- }
- number = toIntegerOrInfinity(number)
- return async function* drop() {
- var _options$signal5
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal5 = options.signal) !== null &&
- _options$signal5 !== undefined &&
- _options$signal5.aborted
- ) {
- throw new AbortError()
- }
- for await (const val of this) {
- var _options$signal6
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal6 = options.signal) !== null &&
- _options$signal6 !== undefined &&
- _options$signal6.aborted
- ) {
- throw new AbortError()
- }
- if (number-- <= 0) {
- yield val
- }
- }
- }.call(this)
-}
-function take(number, options = undefined) {
- if (options != null) {
- validateObject(options, 'options')
- }
- if ((options === null || options === undefined ? undefined : options.signal) != null) {
- validateAbortSignal(options.signal, 'options.signal')
- }
- number = toIntegerOrInfinity(number)
- return async function* take() {
- var _options$signal7
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal7 = options.signal) !== null &&
- _options$signal7 !== undefined &&
- _options$signal7.aborted
- ) {
- throw new AbortError()
- }
- for await (const val of this) {
- var _options$signal8
- if (
- options !== null &&
- options !== undefined &&
- (_options$signal8 = options.signal) !== null &&
- _options$signal8 !== undefined &&
- _options$signal8.aborted
- ) {
- throw new AbortError()
- }
- if (number-- > 0) {
- yield val
- }
-
- // Don't get another item from iterator in case we reached the end
- if (number <= 0) {
- return
- }
- }
- }.call(this)
-}
-module.exports.streamReturningOperators = {
- asIndexedPairs: deprecate(asIndexedPairs, 'readable.asIndexedPairs will be removed in a future version.'),
- drop,
- filter,
- flatMap,
- map,
- take,
- compose
-}
-module.exports.promiseReturningOperators = {
- every,
- forEach,
- reduce,
- toArray,
- some,
- find
-}
-
-},{"../../ours/errors":72,"../../ours/primordials":73,"../../ours/util":74,"../validators":70,"./add-abort-signal":53,"./compose":55,"./end-of-stream":59,"./utils":68,"abort-controller":34}],63:[function(require,module,exports){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// a passthrough stream.
-// basically just the most minimal sort of Transform stream.
-// Every written chunk gets output as-is.
-
-'use strict'
-
-const { ObjectSetPrototypeOf } = require('../../ours/primordials')
-module.exports = PassThrough
-const Transform = require('./transform')
-ObjectSetPrototypeOf(PassThrough.prototype, Transform.prototype)
-ObjectSetPrototypeOf(PassThrough, Transform)
-function PassThrough(options) {
- if (!(this instanceof PassThrough)) return new PassThrough(options)
- Transform.call(this, options)
-}
-PassThrough.prototype._transform = function (chunk, encoding, cb) {
- cb(null, chunk)
-}
-
-},{"../../ours/primordials":73,"./transform":67}],64:[function(require,module,exports){
-/* replacement start */
-
-const process = require('process/')
-
-/* replacement end */
-// Ported from https://github.com/mafintosh/pump with
-// permission from the author, Mathias Buus (@mafintosh).
-
-;('use strict')
-const { ArrayIsArray, Promise, SymbolAsyncIterator, SymbolDispose } = require('../../ours/primordials')
-const eos = require('./end-of-stream')
-const { once } = require('../../ours/util')
-const destroyImpl = require('./destroy')
-const Duplex = require('./duplex')
-const {
- aggregateTwoErrors,
- codes: {
- ERR_INVALID_ARG_TYPE,
- ERR_INVALID_RETURN_VALUE,
- ERR_MISSING_ARGS,
- ERR_STREAM_DESTROYED,
- ERR_STREAM_PREMATURE_CLOSE
- },
- AbortError
-} = require('../../ours/errors')
-const { validateFunction, validateAbortSignal } = require('../validators')
-const {
- isIterable,
- isReadable,
- isReadableNodeStream,
- isNodeStream,
- isTransformStream,
- isWebStream,
- isReadableStream,
- isReadableFinished
-} = require('./utils')
-const AbortController = globalThis.AbortController || require('abort-controller').AbortController
-let PassThrough
-let Readable
-let addAbortListener
-function destroyer(stream, reading, writing) {
- let finished = false
- stream.on('close', () => {
- finished = true
- })
- const cleanup = eos(
- stream,
- {
- readable: reading,
- writable: writing
- },
- (err) => {
- finished = !err
- }
- )
- return {
- destroy: (err) => {
- if (finished) return
- finished = true
- destroyImpl.destroyer(stream, err || new ERR_STREAM_DESTROYED('pipe'))
- },
- cleanup
- }
-}
-function popCallback(streams) {
- // Streams should never be an empty array. It should always contain at least
- // a single stream. Therefore optimize for the average case instead of
- // checking for length === 0 as well.
- validateFunction(streams[streams.length - 1], 'streams[stream.length - 1]')
- return streams.pop()
-}
-function makeAsyncIterable(val) {
- if (isIterable(val)) {
- return val
- } else if (isReadableNodeStream(val)) {
- // Legacy streams are not Iterable.
- return fromReadable(val)
- }
- throw new ERR_INVALID_ARG_TYPE('val', ['Readable', 'Iterable', 'AsyncIterable'], val)
-}
-async function* fromReadable(val) {
- if (!Readable) {
- Readable = require('./readable')
- }
- yield* Readable.prototype[SymbolAsyncIterator].call(val)
-}
-async function pumpToNode(iterable, writable, finish, { end }) {
- let error
- let onresolve = null
- const resume = (err) => {
- if (err) {
- error = err
- }
- if (onresolve) {
- const callback = onresolve
- onresolve = null
- callback()
- }
- }
- const wait = () =>
- new Promise((resolve, reject) => {
- if (error) {
- reject(error)
- } else {
- onresolve = () => {
- if (error) {
- reject(error)
- } else {
- resolve()
- }
- }
- }
- })
- writable.on('drain', resume)
- const cleanup = eos(
- writable,
- {
- readable: false
- },
- resume
- )
- try {
- if (writable.writableNeedDrain) {
- await wait()
- }
- for await (const chunk of iterable) {
- if (!writable.write(chunk)) {
- await wait()
- }
- }
- if (end) {
- writable.end()
- await wait()
- }
- finish()
- } catch (err) {
- finish(error !== err ? aggregateTwoErrors(error, err) : err)
- } finally {
- cleanup()
- writable.off('drain', resume)
- }
-}
-async function pumpToWeb(readable, writable, finish, { end }) {
- if (isTransformStream(writable)) {
- writable = writable.writable
- }
- // https://streams.spec.whatwg.org/#example-manual-write-with-backpressure
- const writer = writable.getWriter()
- try {
- for await (const chunk of readable) {
- await writer.ready
- writer.write(chunk).catch(() => {})
- }
- await writer.ready
- if (end) {
- await writer.close()
- }
- finish()
- } catch (err) {
- try {
- await writer.abort(err)
- finish(err)
- } catch (err) {
- finish(err)
- }
- }
-}
-function pipeline(...streams) {
- return pipelineImpl(streams, once(popCallback(streams)))
-}
-function pipelineImpl(streams, callback, opts) {
- if (streams.length === 1 && ArrayIsArray(streams[0])) {
- streams = streams[0]
- }
- if (streams.length < 2) {
- throw new ERR_MISSING_ARGS('streams')
- }
- const ac = new AbortController()
- const signal = ac.signal
- const outerSignal = opts === null || opts === undefined ? undefined : opts.signal
-
- // Need to cleanup event listeners if last stream is readable
- // https://github.com/nodejs/node/issues/35452
- const lastStreamCleanup = []
- validateAbortSignal(outerSignal, 'options.signal')
- function abort() {
- finishImpl(new AbortError())
- }
- addAbortListener = addAbortListener || require('../../ours/util').addAbortListener
- let disposable
- if (outerSignal) {
- disposable = addAbortListener(outerSignal, abort)
- }
- let error
- let value
- const destroys = []
- let finishCount = 0
- function finish(err) {
- finishImpl(err, --finishCount === 0)
- }
- function finishImpl(err, final) {
- var _disposable
- if (err && (!error || error.code === 'ERR_STREAM_PREMATURE_CLOSE')) {
- error = err
- }
- if (!error && !final) {
- return
- }
- while (destroys.length) {
- destroys.shift()(error)
- }
- ;(_disposable = disposable) === null || _disposable === undefined ? undefined : _disposable[SymbolDispose]()
- ac.abort()
- if (final) {
- if (!error) {
- lastStreamCleanup.forEach((fn) => fn())
- }
- process.nextTick(callback, error, value)
- }
- }
- let ret
- for (let i = 0; i < streams.length; i++) {
- const stream = streams[i]
- const reading = i < streams.length - 1
- const writing = i > 0
- const end = reading || (opts === null || opts === undefined ? undefined : opts.end) !== false
- const isLastStream = i === streams.length - 1
- if (isNodeStream(stream)) {
- if (end) {
- const { destroy, cleanup } = destroyer(stream, reading, writing)
- destroys.push(destroy)
- if (isReadable(stream) && isLastStream) {
- lastStreamCleanup.push(cleanup)
- }
- }
-
- // Catch stream errors that occur after pipe/pump has completed.
- function onError(err) {
- if (err && err.name !== 'AbortError' && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
- finish(err)
- }
- }
- stream.on('error', onError)
- if (isReadable(stream) && isLastStream) {
- lastStreamCleanup.push(() => {
- stream.removeListener('error', onError)
- })
- }
- }
- if (i === 0) {
- if (typeof stream === 'function') {
- ret = stream({
- signal
- })
- if (!isIterable(ret)) {
- throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or Stream', 'source', ret)
- }
- } else if (isIterable(stream) || isReadableNodeStream(stream) || isTransformStream(stream)) {
- ret = stream
- } else {
- ret = Duplex.from(stream)
- }
- } else if (typeof stream === 'function') {
- if (isTransformStream(ret)) {
- var _ret
- ret = makeAsyncIterable((_ret = ret) === null || _ret === undefined ? undefined : _ret.readable)
- } else {
- ret = makeAsyncIterable(ret)
- }
- ret = stream(ret, {
- signal
- })
- if (reading) {
- if (!isIterable(ret, true)) {
- throw new ERR_INVALID_RETURN_VALUE('AsyncIterable', `transform[${i - 1}]`, ret)
- }
- } else {
- var _ret2
- if (!PassThrough) {
- PassThrough = require('./passthrough')
- }
-
- // If the last argument to pipeline is not a stream
- // we must create a proxy stream so that pipeline(...)
- // always returns a stream which can be further
- // composed through `.pipe(stream)`.
-
- const pt = new PassThrough({
- objectMode: true
- })
-
- // Handle Promises/A+ spec, `then` could be a getter that throws on
- // second use.
- const then = (_ret2 = ret) === null || _ret2 === undefined ? undefined : _ret2.then
- if (typeof then === 'function') {
- finishCount++
- then.call(
- ret,
- (val) => {
- value = val
- if (val != null) {
- pt.write(val)
- }
- if (end) {
- pt.end()
- }
- process.nextTick(finish)
- },
- (err) => {
- pt.destroy(err)
- process.nextTick(finish, err)
- }
- )
- } else if (isIterable(ret, true)) {
- finishCount++
- pumpToNode(ret, pt, finish, {
- end
- })
- } else if (isReadableStream(ret) || isTransformStream(ret)) {
- const toRead = ret.readable || ret
- finishCount++
- pumpToNode(toRead, pt, finish, {
- end
- })
- } else {
- throw new ERR_INVALID_RETURN_VALUE('AsyncIterable or Promise', 'destination', ret)
- }
- ret = pt
- const { destroy, cleanup } = destroyer(ret, false, true)
- destroys.push(destroy)
- if (isLastStream) {
- lastStreamCleanup.push(cleanup)
- }
- }
- } else if (isNodeStream(stream)) {
- if (isReadableNodeStream(ret)) {
- finishCount += 2
- const cleanup = pipe(ret, stream, finish, {
- end
- })
- if (isReadable(stream) && isLastStream) {
- lastStreamCleanup.push(cleanup)
- }
- } else if (isTransformStream(ret) || isReadableStream(ret)) {
- const toRead = ret.readable || ret
- finishCount++
- pumpToNode(toRead, stream, finish, {
- end
- })
- } else if (isIterable(ret)) {
- finishCount++
- pumpToNode(ret, stream, finish, {
- end
- })
- } else {
- throw new ERR_INVALID_ARG_TYPE(
- 'val',
- ['Readable', 'Iterable', 'AsyncIterable', 'ReadableStream', 'TransformStream'],
- ret
- )
- }
- ret = stream
- } else if (isWebStream(stream)) {
- if (isReadableNodeStream(ret)) {
- finishCount++
- pumpToWeb(makeAsyncIterable(ret), stream, finish, {
- end
- })
- } else if (isReadableStream(ret) || isIterable(ret)) {
- finishCount++
- pumpToWeb(ret, stream, finish, {
- end
- })
- } else if (isTransformStream(ret)) {
- finishCount++
- pumpToWeb(ret.readable, stream, finish, {
- end
- })
- } else {
- throw new ERR_INVALID_ARG_TYPE(
- 'val',
- ['Readable', 'Iterable', 'AsyncIterable', 'ReadableStream', 'TransformStream'],
- ret
- )
- }
- ret = stream
- } else {
- ret = Duplex.from(stream)
- }
- }
- if (
- (signal !== null && signal !== undefined && signal.aborted) ||
- (outerSignal !== null && outerSignal !== undefined && outerSignal.aborted)
- ) {
- process.nextTick(abort)
- }
- return ret
-}
-function pipe(src, dst, finish, { end }) {
- let ended = false
- dst.on('close', () => {
- if (!ended) {
- // Finish if the destination closes before the source has completed.
- finish(new ERR_STREAM_PREMATURE_CLOSE())
- }
- })
- src.pipe(dst, {
- end: false
- }) // If end is true we already will have a listener to end dst.
-
- if (end) {
- // Compat. Before node v10.12.0 stdio used to throw an error so
- // pipe() did/does not end() stdio destinations.
- // Now they allow it but "secretly" don't close the underlying fd.
-
- function endFn() {
- ended = true
- dst.end()
- }
- if (isReadableFinished(src)) {
- // End the destination if the source has already ended.
- process.nextTick(endFn)
- } else {
- src.once('end', endFn)
- }
- } else {
- finish()
- }
- eos(
- src,
- {
- readable: true,
- writable: false
- },
- (err) => {
- const rState = src._readableState
- if (
- err &&
- err.code === 'ERR_STREAM_PREMATURE_CLOSE' &&
- rState &&
- rState.ended &&
- !rState.errored &&
- !rState.errorEmitted
- ) {
- // Some readable streams will emit 'close' before 'end'. However, since
- // this is on the readable side 'end' should still be emitted if the
- // stream has been ended and no error emitted. This should be allowed in
- // favor of backwards compatibility. Since the stream is piped to a
- // destination this should not result in any observable difference.
- // We don't need to check if this is a writable premature close since
- // eos will only fail with premature close on the reading side for
- // duplex streams.
- src.once('end', finish).once('error', finish)
- } else {
- finish(err)
- }
- }
- )
- return eos(
- dst,
- {
- readable: false,
- writable: true
- },
- finish
- )
-}
-module.exports = {
- pipelineImpl,
- pipeline
-}
-
-},{"../../ours/errors":72,"../../ours/primordials":73,"../../ours/util":74,"../validators":70,"./destroy":56,"./duplex":57,"./end-of-stream":59,"./passthrough":63,"./readable":65,"./utils":68,"abort-controller":34,"process/":101}],65:[function(require,module,exports){
-/* replacement start */
-
-const process = require('process/')
-
-/* replacement end */
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-;('use strict')
-const {
- ArrayPrototypeIndexOf,
- NumberIsInteger,
- NumberIsNaN,
- NumberParseInt,
- ObjectDefineProperties,
- ObjectKeys,
- ObjectSetPrototypeOf,
- Promise,
- SafeSet,
- SymbolAsyncDispose,
- SymbolAsyncIterator,
- Symbol
-} = require('../../ours/primordials')
-module.exports = Readable
-Readable.ReadableState = ReadableState
-const { EventEmitter: EE } = require('events')
-const { Stream, prependListener } = require('./legacy')
-const { Buffer } = require('buffer')
-const { addAbortSignal } = require('./add-abort-signal')
-const eos = require('./end-of-stream')
-let debug = require('../../ours/util').debuglog('stream', (fn) => {
- debug = fn
-})
-const BufferList = require('./buffer_list')
-const destroyImpl = require('./destroy')
-const { getHighWaterMark, getDefaultHighWaterMark } = require('./state')
-const {
- aggregateTwoErrors,
- codes: {
- ERR_INVALID_ARG_TYPE,
- ERR_METHOD_NOT_IMPLEMENTED,
- ERR_OUT_OF_RANGE,
- ERR_STREAM_PUSH_AFTER_EOF,
- ERR_STREAM_UNSHIFT_AFTER_END_EVENT
- },
- AbortError
-} = require('../../ours/errors')
-const { validateObject } = require('../validators')
-const kPaused = Symbol('kPaused')
-const { StringDecoder } = require('string_decoder')
-const from = require('./from')
-ObjectSetPrototypeOf(Readable.prototype, Stream.prototype)
-ObjectSetPrototypeOf(Readable, Stream)
-const nop = () => {}
-const { errorOrDestroy } = destroyImpl
-const kObjectMode = 1 << 0
-const kEnded = 1 << 1
-const kEndEmitted = 1 << 2
-const kReading = 1 << 3
-const kConstructed = 1 << 4
-const kSync = 1 << 5
-const kNeedReadable = 1 << 6
-const kEmittedReadable = 1 << 7
-const kReadableListening = 1 << 8
-const kResumeScheduled = 1 << 9
-const kErrorEmitted = 1 << 10
-const kEmitClose = 1 << 11
-const kAutoDestroy = 1 << 12
-const kDestroyed = 1 << 13
-const kClosed = 1 << 14
-const kCloseEmitted = 1 << 15
-const kMultiAwaitDrain = 1 << 16
-const kReadingMore = 1 << 17
-const kDataEmitted = 1 << 18
-
-// TODO(benjamingr) it is likely slower to do it this way than with free functions
-function makeBitMapDescriptor(bit) {
- return {
- enumerable: false,
- get() {
- return (this.state & bit) !== 0
- },
- set(value) {
- if (value) this.state |= bit
- else this.state &= ~bit
- }
- }
-}
-ObjectDefineProperties(ReadableState.prototype, {
- objectMode: makeBitMapDescriptor(kObjectMode),
- ended: makeBitMapDescriptor(kEnded),
- endEmitted: makeBitMapDescriptor(kEndEmitted),
- reading: makeBitMapDescriptor(kReading),
- // Stream is still being constructed and cannot be
- // destroyed until construction finished or failed.
- // Async construction is opt in, therefore we start as
- // constructed.
- constructed: makeBitMapDescriptor(kConstructed),
- // A flag to be able to tell if the event 'readable'/'data' is emitted
- // immediately, or on a later tick. We set this to true at first, because
- // any actions that shouldn't happen until "later" should generally also
- // not happen before the first read call.
- sync: makeBitMapDescriptor(kSync),
- // Whenever we return null, then we set a flag to say
- // that we're awaiting a 'readable' event emission.
- needReadable: makeBitMapDescriptor(kNeedReadable),
- emittedReadable: makeBitMapDescriptor(kEmittedReadable),
- readableListening: makeBitMapDescriptor(kReadableListening),
- resumeScheduled: makeBitMapDescriptor(kResumeScheduled),
- // True if the error was already emitted and should not be thrown again.
- errorEmitted: makeBitMapDescriptor(kErrorEmitted),
- emitClose: makeBitMapDescriptor(kEmitClose),
- autoDestroy: makeBitMapDescriptor(kAutoDestroy),
- // Has it been destroyed.
- destroyed: makeBitMapDescriptor(kDestroyed),
- // Indicates whether the stream has finished destroying.
- closed: makeBitMapDescriptor(kClosed),
- // True if close has been emitted or would have been emitted
- // depending on emitClose.
- closeEmitted: makeBitMapDescriptor(kCloseEmitted),
- multiAwaitDrain: makeBitMapDescriptor(kMultiAwaitDrain),
- // If true, a maybeReadMore has been scheduled.
- readingMore: makeBitMapDescriptor(kReadingMore),
- dataEmitted: makeBitMapDescriptor(kDataEmitted)
-})
-function ReadableState(options, stream, isDuplex) {
- // Duplex streams are both readable and writable, but share
- // the same options object.
- // However, some cases require setting options to different
- // values for the readable and the writable sides of the duplex stream.
- // These options can be provided separately as readableXXX and writableXXX.
- if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof require('./duplex')
-
- // Bit map field to store ReadableState more effciently with 1 bit per field
- // instead of a V8 slot per field.
- this.state = kEmitClose | kAutoDestroy | kConstructed | kSync
- // Object stream flag. Used to make read(n) ignore n and to
- // make all the buffer merging and length checks go away.
- if (options && options.objectMode) this.state |= kObjectMode
- if (isDuplex && options && options.readableObjectMode) this.state |= kObjectMode
-
- // The point at which it stops calling _read() to fill the buffer
- // Note: 0 is a valid value, means "don't call _read preemptively ever"
- this.highWaterMark = options
- ? getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex)
- : getDefaultHighWaterMark(false)
-
- // A linked list is used to store data chunks instead of an array because the
- // linked list can remove elements from the beginning faster than
- // array.shift().
- this.buffer = new BufferList()
- this.length = 0
- this.pipes = []
- this.flowing = null
- this[kPaused] = null
-
- // Should close be emitted on destroy. Defaults to true.
- if (options && options.emitClose === false) this.state &= ~kEmitClose
-
- // Should .destroy() be called after 'end' (and potentially 'finish').
- if (options && options.autoDestroy === false) this.state &= ~kAutoDestroy
-
- // Indicates whether the stream has errored. When true no further
- // _read calls, 'data' or 'readable' events should occur. This is needed
- // since when autoDestroy is disabled we need a way to tell whether the
- // stream has failed.
- this.errored = null
-
- // Crypto is kind of old and crusty. Historically, its default string
- // encoding is 'binary' so we have to make this configurable.
- // Everything else in the universe uses 'utf8', though.
- this.defaultEncoding = (options && options.defaultEncoding) || 'utf8'
-
- // Ref the piped dest which we need a drain event on it
- // type: null | Writable | Set.
- this.awaitDrainWriters = null
- this.decoder = null
- this.encoding = null
- if (options && options.encoding) {
- this.decoder = new StringDecoder(options.encoding)
- this.encoding = options.encoding
- }
-}
-function Readable(options) {
- if (!(this instanceof Readable)) return new Readable(options)
-
- // Checking for a Stream.Duplex instance is faster here instead of inside
- // the ReadableState constructor, at least with V8 6.5.
- const isDuplex = this instanceof require('./duplex')
- this._readableState = new ReadableState(options, this, isDuplex)
- if (options) {
- if (typeof options.read === 'function') this._read = options.read
- if (typeof options.destroy === 'function') this._destroy = options.destroy
- if (typeof options.construct === 'function') this._construct = options.construct
- if (options.signal && !isDuplex) addAbortSignal(options.signal, this)
- }
- Stream.call(this, options)
- destroyImpl.construct(this, () => {
- if (this._readableState.needReadable) {
- maybeReadMore(this, this._readableState)
- }
- })
-}
-Readable.prototype.destroy = destroyImpl.destroy
-Readable.prototype._undestroy = destroyImpl.undestroy
-Readable.prototype._destroy = function (err, cb) {
- cb(err)
-}
-Readable.prototype[EE.captureRejectionSymbol] = function (err) {
- this.destroy(err)
-}
-Readable.prototype[SymbolAsyncDispose] = function () {
- let error
- if (!this.destroyed) {
- error = this.readableEnded ? null : new AbortError()
- this.destroy(error)
- }
- return new Promise((resolve, reject) => eos(this, (err) => (err && err !== error ? reject(err) : resolve(null))))
-}
-
-// Manually shove something into the read() buffer.
-// This returns true if the highWaterMark has not been hit yet,
-// similar to how Writable.write() returns true if you should
-// write() some more.
-Readable.prototype.push = function (chunk, encoding) {
- return readableAddChunk(this, chunk, encoding, false)
-}
-
-// Unshift should *always* be something directly out of read().
-Readable.prototype.unshift = function (chunk, encoding) {
- return readableAddChunk(this, chunk, encoding, true)
-}
-function readableAddChunk(stream, chunk, encoding, addToFront) {
- debug('readableAddChunk', chunk)
- const state = stream._readableState
- let err
- if ((state.state & kObjectMode) === 0) {
- if (typeof chunk === 'string') {
- encoding = encoding || state.defaultEncoding
- if (state.encoding !== encoding) {
- if (addToFront && state.encoding) {
- // When unshifting, if state.encoding is set, we have to save
- // the string in the BufferList with the state encoding.
- chunk = Buffer.from(chunk, encoding).toString(state.encoding)
- } else {
- chunk = Buffer.from(chunk, encoding)
- encoding = ''
- }
- }
- } else if (chunk instanceof Buffer) {
- encoding = ''
- } else if (Stream._isUint8Array(chunk)) {
- chunk = Stream._uint8ArrayToBuffer(chunk)
- encoding = ''
- } else if (chunk != null) {
- err = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk)
- }
- }
- if (err) {
- errorOrDestroy(stream, err)
- } else if (chunk === null) {
- state.state &= ~kReading
- onEofChunk(stream, state)
- } else if ((state.state & kObjectMode) !== 0 || (chunk && chunk.length > 0)) {
- if (addToFront) {
- if ((state.state & kEndEmitted) !== 0) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT())
- else if (state.destroyed || state.errored) return false
- else addChunk(stream, state, chunk, true)
- } else if (state.ended) {
- errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF())
- } else if (state.destroyed || state.errored) {
- return false
- } else {
- state.state &= ~kReading
- if (state.decoder && !encoding) {
- chunk = state.decoder.write(chunk)
- if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false)
- else maybeReadMore(stream, state)
- } else {
- addChunk(stream, state, chunk, false)
- }
- }
- } else if (!addToFront) {
- state.state &= ~kReading
- maybeReadMore(stream, state)
- }
-
- // We can push more data if we are below the highWaterMark.
- // Also, if we have no data yet, we can stand some more bytes.
- // This is to work around cases where hwm=0, such as the repl.
- return !state.ended && (state.length < state.highWaterMark || state.length === 0)
-}
-function addChunk(stream, state, chunk, addToFront) {
- if (state.flowing && state.length === 0 && !state.sync && stream.listenerCount('data') > 0) {
- // Use the guard to avoid creating `Set()` repeatedly
- // when we have multiple pipes.
- if ((state.state & kMultiAwaitDrain) !== 0) {
- state.awaitDrainWriters.clear()
- } else {
- state.awaitDrainWriters = null
- }
- state.dataEmitted = true
- stream.emit('data', chunk)
- } else {
- // Update the buffer info.
- state.length += state.objectMode ? 1 : chunk.length
- if (addToFront) state.buffer.unshift(chunk)
- else state.buffer.push(chunk)
- if ((state.state & kNeedReadable) !== 0) emitReadable(stream)
- }
- maybeReadMore(stream, state)
-}
-Readable.prototype.isPaused = function () {
- const state = this._readableState
- return state[kPaused] === true || state.flowing === false
-}
-
-// Backwards compatibility.
-Readable.prototype.setEncoding = function (enc) {
- const decoder = new StringDecoder(enc)
- this._readableState.decoder = decoder
- // If setEncoding(null), decoder.encoding equals utf8.
- this._readableState.encoding = this._readableState.decoder.encoding
- const buffer = this._readableState.buffer
- // Iterate over current buffer to convert already stored Buffers:
- let content = ''
- for (const data of buffer) {
- content += decoder.write(data)
- }
- buffer.clear()
- if (content !== '') buffer.push(content)
- this._readableState.length = content.length
- return this
-}
-
-// Don't raise the hwm > 1GB.
-const MAX_HWM = 0x40000000
-function computeNewHighWaterMark(n) {
- if (n > MAX_HWM) {
- throw new ERR_OUT_OF_RANGE('size', '<= 1GiB', n)
- } else {
- // Get the next highest power of 2 to prevent increasing hwm excessively in
- // tiny amounts.
- n--
- n |= n >>> 1
- n |= n >>> 2
- n |= n >>> 4
- n |= n >>> 8
- n |= n >>> 16
- n++
- }
- return n
-}
-
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function howMuchToRead(n, state) {
- if (n <= 0 || (state.length === 0 && state.ended)) return 0
- if ((state.state & kObjectMode) !== 0) return 1
- if (NumberIsNaN(n)) {
- // Only flow one buffer at a time.
- if (state.flowing && state.length) return state.buffer.first().length
- return state.length
- }
- if (n <= state.length) return n
- return state.ended ? state.length : 0
-}
-
-// You can override either this method, or the async _read(n) below.
-Readable.prototype.read = function (n) {
- debug('read', n)
- // Same as parseInt(undefined, 10), however V8 7.3 performance regressed
- // in this scenario, so we are doing it manually.
- if (n === undefined) {
- n = NaN
- } else if (!NumberIsInteger(n)) {
- n = NumberParseInt(n, 10)
- }
- const state = this._readableState
- const nOrig = n
-
- // If we're asking for more than the current hwm, then raise the hwm.
- if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n)
- if (n !== 0) state.state &= ~kEmittedReadable
-
- // If we're doing read(0) to trigger a readable event, but we
- // already have a bunch of data in the buffer, then just trigger
- // the 'readable' event and move on.
- if (
- n === 0 &&
- state.needReadable &&
- ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)
- ) {
- debug('read: emitReadable', state.length, state.ended)
- if (state.length === 0 && state.ended) endReadable(this)
- else emitReadable(this)
- return null
- }
- n = howMuchToRead(n, state)
-
- // If we've ended, and we're now clear, then finish it up.
- if (n === 0 && state.ended) {
- if (state.length === 0) endReadable(this)
- return null
- }
-
- // All the actual chunk generation logic needs to be
- // *below* the call to _read. The reason is that in certain
- // synthetic stream cases, such as passthrough streams, _read
- // may be a completely synchronous operation which may change
- // the state of the read buffer, providing enough data when
- // before there was *not* enough.
- //
- // So, the steps are:
- // 1. Figure out what the state of things will be after we do
- // a read from the buffer.
- //
- // 2. If that resulting state will trigger a _read, then call _read.
- // Note that this may be asynchronous, or synchronous. Yes, it is
- // deeply ugly to write APIs this way, but that still doesn't mean
- // that the Readable class should behave improperly, as streams are
- // designed to be sync/async agnostic.
- // Take note if the _read call is sync or async (ie, if the read call
- // has returned yet), so that we know whether or not it's safe to emit
- // 'readable' etc.
- //
- // 3. Actually pull the requested chunks out of the buffer and return.
-
- // if we need a readable event, then we need to do some reading.
- let doRead = (state.state & kNeedReadable) !== 0
- debug('need readable', doRead)
-
- // If we currently have less than the highWaterMark, then also read some.
- if (state.length === 0 || state.length - n < state.highWaterMark) {
- doRead = true
- debug('length less than watermark', doRead)
- }
-
- // However, if we've ended, then there's no point, if we're already
- // reading, then it's unnecessary, if we're constructing we have to wait,
- // and if we're destroyed or errored, then it's not allowed,
- if (state.ended || state.reading || state.destroyed || state.errored || !state.constructed) {
- doRead = false
- debug('reading, ended or constructing', doRead)
- } else if (doRead) {
- debug('do read')
- state.state |= kReading | kSync
- // If the length is currently zero, then we *need* a readable event.
- if (state.length === 0) state.state |= kNeedReadable
-
- // Call internal read method
- try {
- this._read(state.highWaterMark)
- } catch (err) {
- errorOrDestroy(this, err)
- }
- state.state &= ~kSync
-
- // If _read pushed data synchronously, then `reading` will be false,
- // and we need to re-evaluate how much data we can return to the user.
- if (!state.reading) n = howMuchToRead(nOrig, state)
- }
- let ret
- if (n > 0) ret = fromList(n, state)
- else ret = null
- if (ret === null) {
- state.needReadable = state.length <= state.highWaterMark
- n = 0
- } else {
- state.length -= n
- if (state.multiAwaitDrain) {
- state.awaitDrainWriters.clear()
- } else {
- state.awaitDrainWriters = null
- }
- }
- if (state.length === 0) {
- // If we have nothing in the buffer, then we want to know
- // as soon as we *do* get something into the buffer.
- if (!state.ended) state.needReadable = true
-
- // If we tried to read() past the EOF, then emit end on the next tick.
- if (nOrig !== n && state.ended) endReadable(this)
- }
- if (ret !== null && !state.errorEmitted && !state.closeEmitted) {
- state.dataEmitted = true
- this.emit('data', ret)
- }
- return ret
-}
-function onEofChunk(stream, state) {
- debug('onEofChunk')
- if (state.ended) return
- if (state.decoder) {
- const chunk = state.decoder.end()
- if (chunk && chunk.length) {
- state.buffer.push(chunk)
- state.length += state.objectMode ? 1 : chunk.length
- }
- }
- state.ended = true
- if (state.sync) {
- // If we are sync, wait until next tick to emit the data.
- // Otherwise we risk emitting data in the flow()
- // the readable code triggers during a read() call.
- emitReadable(stream)
- } else {
- // Emit 'readable' now to make sure it gets picked up.
- state.needReadable = false
- state.emittedReadable = true
- // We have to emit readable now that we are EOF. Modules
- // in the ecosystem (e.g. dicer) rely on this event being sync.
- emitReadable_(stream)
- }
-}
-
-// Don't emit readable right away in sync mode, because this can trigger
-// another read() call => stack overflow. This way, it might trigger
-// a nextTick recursion warning, but that's not so bad.
-function emitReadable(stream) {
- const state = stream._readableState
- debug('emitReadable', state.needReadable, state.emittedReadable)
- state.needReadable = false
- if (!state.emittedReadable) {
- debug('emitReadable', state.flowing)
- state.emittedReadable = true
- process.nextTick(emitReadable_, stream)
- }
-}
-function emitReadable_(stream) {
- const state = stream._readableState
- debug('emitReadable_', state.destroyed, state.length, state.ended)
- if (!state.destroyed && !state.errored && (state.length || state.ended)) {
- stream.emit('readable')
- state.emittedReadable = false
- }
-
- // The stream needs another readable event if:
- // 1. It is not flowing, as the flow mechanism will take
- // care of it.
- // 2. It is not ended.
- // 3. It is below the highWaterMark, so we can schedule
- // another readable later.
- state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark
- flow(stream)
-}
-
-// At this point, the user has presumably seen the 'readable' event,
-// and called read() to consume some data. that may have triggered
-// in turn another _read(n) call, in which case reading = true if
-// it's in progress.
-// However, if we're not ended, or reading, and the length < hwm,
-// then go ahead and try to read some more preemptively.
-function maybeReadMore(stream, state) {
- if (!state.readingMore && state.constructed) {
- state.readingMore = true
- process.nextTick(maybeReadMore_, stream, state)
- }
-}
-function maybeReadMore_(stream, state) {
- // Attempt to read more data if we should.
- //
- // The conditions for reading more data are (one of):
- // - Not enough data buffered (state.length < state.highWaterMark). The loop
- // is responsible for filling the buffer with enough data if such data
- // is available. If highWaterMark is 0 and we are not in the flowing mode
- // we should _not_ attempt to buffer any extra data. We'll get more data
- // when the stream consumer calls read() instead.
- // - No data in the buffer, and the stream is in flowing mode. In this mode
- // the loop below is responsible for ensuring read() is called. Failing to
- // call read here would abort the flow and there's no other mechanism for
- // continuing the flow if the stream consumer has just subscribed to the
- // 'data' event.
- //
- // In addition to the above conditions to keep reading data, the following
- // conditions prevent the data from being read:
- // - The stream has ended (state.ended).
- // - There is already a pending 'read' operation (state.reading). This is a
- // case where the stream has called the implementation defined _read()
- // method, but they are processing the call asynchronously and have _not_
- // called push() with new data. In this case we skip performing more
- // read()s. The execution ends in this method again after the _read() ends
- // up calling push() with more data.
- while (
- !state.reading &&
- !state.ended &&
- (state.length < state.highWaterMark || (state.flowing && state.length === 0))
- ) {
- const len = state.length
- debug('maybeReadMore read 0')
- stream.read(0)
- if (len === state.length)
- // Didn't get any data, stop spinning.
- break
- }
- state.readingMore = false
-}
-
-// Abstract method. to be overridden in specific implementation classes.
-// call cb(er, data) where data is <= n in length.
-// for virtual (non-string, non-buffer) streams, "length" is somewhat
-// arbitrary, and perhaps not very meaningful.
-Readable.prototype._read = function (n) {
- throw new ERR_METHOD_NOT_IMPLEMENTED('_read()')
-}
-Readable.prototype.pipe = function (dest, pipeOpts) {
- const src = this
- const state = this._readableState
- if (state.pipes.length === 1) {
- if (!state.multiAwaitDrain) {
- state.multiAwaitDrain = true
- state.awaitDrainWriters = new SafeSet(state.awaitDrainWriters ? [state.awaitDrainWriters] : [])
- }
- }
- state.pipes.push(dest)
- debug('pipe count=%d opts=%j', state.pipes.length, pipeOpts)
- const doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr
- const endFn = doEnd ? onend : unpipe
- if (state.endEmitted) process.nextTick(endFn)
- else src.once('end', endFn)
- dest.on('unpipe', onunpipe)
- function onunpipe(readable, unpipeInfo) {
- debug('onunpipe')
- if (readable === src) {
- if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
- unpipeInfo.hasUnpiped = true
- cleanup()
- }
- }
- }
- function onend() {
- debug('onend')
- dest.end()
- }
- let ondrain
- let cleanedUp = false
- function cleanup() {
- debug('cleanup')
- // Cleanup event handlers once the pipe is broken.
- dest.removeListener('close', onclose)
- dest.removeListener('finish', onfinish)
- if (ondrain) {
- dest.removeListener('drain', ondrain)
- }
- dest.removeListener('error', onerror)
- dest.removeListener('unpipe', onunpipe)
- src.removeListener('end', onend)
- src.removeListener('end', unpipe)
- src.removeListener('data', ondata)
- cleanedUp = true
-
- // If the reader is waiting for a drain event from this
- // specific writer, then it would cause it to never start
- // flowing again.
- // So, if this is awaiting a drain, then we just call it now.
- // If we don't know, then assume that we are waiting for one.
- if (ondrain && state.awaitDrainWriters && (!dest._writableState || dest._writableState.needDrain)) ondrain()
- }
- function pause() {
- // If the user unpiped during `dest.write()`, it is possible
- // to get stuck in a permanently paused state if that write
- // also returned false.
- // => Check whether `dest` is still a piping destination.
- if (!cleanedUp) {
- if (state.pipes.length === 1 && state.pipes[0] === dest) {
- debug('false write response, pause', 0)
- state.awaitDrainWriters = dest
- state.multiAwaitDrain = false
- } else if (state.pipes.length > 1 && state.pipes.includes(dest)) {
- debug('false write response, pause', state.awaitDrainWriters.size)
- state.awaitDrainWriters.add(dest)
- }
- src.pause()
- }
- if (!ondrain) {
- // When the dest drains, it reduces the awaitDrain counter
- // on the source. This would be more elegant with a .once()
- // handler in flow(), but adding and removing repeatedly is
- // too slow.
- ondrain = pipeOnDrain(src, dest)
- dest.on('drain', ondrain)
- }
- }
- src.on('data', ondata)
- function ondata(chunk) {
- debug('ondata')
- const ret = dest.write(chunk)
- debug('dest.write', ret)
- if (ret === false) {
- pause()
- }
- }
-
- // If the dest has an error, then stop piping into it.
- // However, don't suppress the throwing behavior for this.
- function onerror(er) {
- debug('onerror', er)
- unpipe()
- dest.removeListener('error', onerror)
- if (dest.listenerCount('error') === 0) {
- const s = dest._writableState || dest._readableState
- if (s && !s.errorEmitted) {
- // User incorrectly emitted 'error' directly on the stream.
- errorOrDestroy(dest, er)
- } else {
- dest.emit('error', er)
- }
- }
- }
-
- // Make sure our error handler is attached before userland ones.
- prependListener(dest, 'error', onerror)
-
- // Both close and finish should trigger unpipe, but only once.
- function onclose() {
- dest.removeListener('finish', onfinish)
- unpipe()
- }
- dest.once('close', onclose)
- function onfinish() {
- debug('onfinish')
- dest.removeListener('close', onclose)
- unpipe()
- }
- dest.once('finish', onfinish)
- function unpipe() {
- debug('unpipe')
- src.unpipe(dest)
- }
-
- // Tell the dest that it's being piped to.
- dest.emit('pipe', src)
-
- // Start the flow if it hasn't been started already.
-
- if (dest.writableNeedDrain === true) {
- pause()
- } else if (!state.flowing) {
- debug('pipe resume')
- src.resume()
- }
- return dest
-}
-function pipeOnDrain(src, dest) {
- return function pipeOnDrainFunctionResult() {
- const state = src._readableState
-
- // `ondrain` will call directly,
- // `this` maybe not a reference to dest,
- // so we use the real dest here.
- if (state.awaitDrainWriters === dest) {
- debug('pipeOnDrain', 1)
- state.awaitDrainWriters = null
- } else if (state.multiAwaitDrain) {
- debug('pipeOnDrain', state.awaitDrainWriters.size)
- state.awaitDrainWriters.delete(dest)
- }
- if ((!state.awaitDrainWriters || state.awaitDrainWriters.size === 0) && src.listenerCount('data')) {
- src.resume()
- }
- }
-}
-Readable.prototype.unpipe = function (dest) {
- const state = this._readableState
- const unpipeInfo = {
- hasUnpiped: false
- }
-
- // If we're not piping anywhere, then do nothing.
- if (state.pipes.length === 0) return this
- if (!dest) {
- // remove all.
- const dests = state.pipes
- state.pipes = []
- this.pause()
- for (let i = 0; i < dests.length; i++)
- dests[i].emit('unpipe', this, {
- hasUnpiped: false
- })
- return this
- }
-
- // Try to find the right one.
- const index = ArrayPrototypeIndexOf(state.pipes, dest)
- if (index === -1) return this
- state.pipes.splice(index, 1)
- if (state.pipes.length === 0) this.pause()
- dest.emit('unpipe', this, unpipeInfo)
- return this
-}
-
-// Set up data events if they are asked for
-// Ensure readable listeners eventually get something.
-Readable.prototype.on = function (ev, fn) {
- const res = Stream.prototype.on.call(this, ev, fn)
- const state = this._readableState
- if (ev === 'data') {
- // Update readableListening so that resume() may be a no-op
- // a few lines down. This is needed to support once('readable').
- state.readableListening = this.listenerCount('readable') > 0
-
- // Try start flowing on next tick if stream isn't explicitly paused.
- if (state.flowing !== false) this.resume()
- } else if (ev === 'readable') {
- if (!state.endEmitted && !state.readableListening) {
- state.readableListening = state.needReadable = true
- state.flowing = false
- state.emittedReadable = false
- debug('on readable', state.length, state.reading)
- if (state.length) {
- emitReadable(this)
- } else if (!state.reading) {
- process.nextTick(nReadingNextTick, this)
- }
- }
- }
- return res
-}
-Readable.prototype.addListener = Readable.prototype.on
-Readable.prototype.removeListener = function (ev, fn) {
- const res = Stream.prototype.removeListener.call(this, ev, fn)
- if (ev === 'readable') {
- // We need to check if there is someone still listening to
- // readable and reset the state. However this needs to happen
- // after readable has been emitted but before I/O (nextTick) to
- // support once('readable', fn) cycles. This means that calling
- // resume within the same tick will have no
- // effect.
- process.nextTick(updateReadableListening, this)
- }
- return res
-}
-Readable.prototype.off = Readable.prototype.removeListener
-Readable.prototype.removeAllListeners = function (ev) {
- const res = Stream.prototype.removeAllListeners.apply(this, arguments)
- if (ev === 'readable' || ev === undefined) {
- // We need to check if there is someone still listening to
- // readable and reset the state. However this needs to happen
- // after readable has been emitted but before I/O (nextTick) to
- // support once('readable', fn) cycles. This means that calling
- // resume within the same tick will have no
- // effect.
- process.nextTick(updateReadableListening, this)
- }
- return res
-}
-function updateReadableListening(self) {
- const state = self._readableState
- state.readableListening = self.listenerCount('readable') > 0
- if (state.resumeScheduled && state[kPaused] === false) {
- // Flowing needs to be set to true now, otherwise
- // the upcoming resume will not flow.
- state.flowing = true
-
- // Crude way to check if we should resume.
- } else if (self.listenerCount('data') > 0) {
- self.resume()
- } else if (!state.readableListening) {
- state.flowing = null
- }
-}
-function nReadingNextTick(self) {
- debug('readable nexttick read 0')
- self.read(0)
-}
-
-// pause() and resume() are remnants of the legacy readable stream API
-// If the user uses them, then switch into old mode.
-Readable.prototype.resume = function () {
- const state = this._readableState
- if (!state.flowing) {
- debug('resume')
- // We flow only if there is no one listening
- // for readable, but we still have to call
- // resume().
- state.flowing = !state.readableListening
- resume(this, state)
- }
- state[kPaused] = false
- return this
-}
-function resume(stream, state) {
- if (!state.resumeScheduled) {
- state.resumeScheduled = true
- process.nextTick(resume_, stream, state)
- }
-}
-function resume_(stream, state) {
- debug('resume', state.reading)
- if (!state.reading) {
- stream.read(0)
- }
- state.resumeScheduled = false
- stream.emit('resume')
- flow(stream)
- if (state.flowing && !state.reading) stream.read(0)
-}
-Readable.prototype.pause = function () {
- debug('call pause flowing=%j', this._readableState.flowing)
- if (this._readableState.flowing !== false) {
- debug('pause')
- this._readableState.flowing = false
- this.emit('pause')
- }
- this._readableState[kPaused] = true
- return this
-}
-function flow(stream) {
- const state = stream._readableState
- debug('flow', state.flowing)
- while (state.flowing && stream.read() !== null);
-}
-
-// Wrap an old-style stream as the async data source.
-// This is *not* part of the readable stream interface.
-// It is an ugly unfortunate mess of history.
-Readable.prototype.wrap = function (stream) {
- let paused = false
-
- // TODO (ronag): Should this.destroy(err) emit
- // 'error' on the wrapped stream? Would require
- // a static factory method, e.g. Readable.wrap(stream).
-
- stream.on('data', (chunk) => {
- if (!this.push(chunk) && stream.pause) {
- paused = true
- stream.pause()
- }
- })
- stream.on('end', () => {
- this.push(null)
- })
- stream.on('error', (err) => {
- errorOrDestroy(this, err)
- })
- stream.on('close', () => {
- this.destroy()
- })
- stream.on('destroy', () => {
- this.destroy()
- })
- this._read = () => {
- if (paused && stream.resume) {
- paused = false
- stream.resume()
- }
- }
-
- // Proxy all the other methods. Important when wrapping filters and duplexes.
- const streamKeys = ObjectKeys(stream)
- for (let j = 1; j < streamKeys.length; j++) {
- const i = streamKeys[j]
- if (this[i] === undefined && typeof stream[i] === 'function') {
- this[i] = stream[i].bind(stream)
- }
- }
- return this
-}
-Readable.prototype[SymbolAsyncIterator] = function () {
- return streamToAsyncIterator(this)
-}
-Readable.prototype.iterator = function (options) {
- if (options !== undefined) {
- validateObject(options, 'options')
- }
- return streamToAsyncIterator(this, options)
-}
-function streamToAsyncIterator(stream, options) {
- if (typeof stream.read !== 'function') {
- stream = Readable.wrap(stream, {
- objectMode: true
- })
- }
- const iter = createAsyncIterator(stream, options)
- iter.stream = stream
- return iter
-}
-async function* createAsyncIterator(stream, options) {
- let callback = nop
- function next(resolve) {
- if (this === stream) {
- callback()
- callback = nop
- } else {
- callback = resolve
- }
- }
- stream.on('readable', next)
- let error
- const cleanup = eos(
- stream,
- {
- writable: false
- },
- (err) => {
- error = err ? aggregateTwoErrors(error, err) : null
- callback()
- callback = nop
- }
- )
- try {
- while (true) {
- const chunk = stream.destroyed ? null : stream.read()
- if (chunk !== null) {
- yield chunk
- } else if (error) {
- throw error
- } else if (error === null) {
- return
- } else {
- await new Promise(next)
- }
- }
- } catch (err) {
- error = aggregateTwoErrors(error, err)
- throw error
- } finally {
- if (
- (error || (options === null || options === undefined ? undefined : options.destroyOnReturn) !== false) &&
- (error === undefined || stream._readableState.autoDestroy)
- ) {
- destroyImpl.destroyer(stream, null)
- } else {
- stream.off('readable', next)
- cleanup()
- }
- }
-}
-
-// Making it explicit these properties are not enumerable
-// because otherwise some prototype manipulation in
-// userland will fail.
-ObjectDefineProperties(Readable.prototype, {
- readable: {
- __proto__: null,
- get() {
- const r = this._readableState
- // r.readable === false means that this is part of a Duplex stream
- // where the readable side was disabled upon construction.
- // Compat. The user might manually disable readable side through
- // deprecated setter.
- return !!r && r.readable !== false && !r.destroyed && !r.errorEmitted && !r.endEmitted
- },
- set(val) {
- // Backwards compat.
- if (this._readableState) {
- this._readableState.readable = !!val
- }
- }
- },
- readableDidRead: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return this._readableState.dataEmitted
- }
- },
- readableAborted: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return !!(
- this._readableState.readable !== false &&
- (this._readableState.destroyed || this._readableState.errored) &&
- !this._readableState.endEmitted
- )
- }
- },
- readableHighWaterMark: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return this._readableState.highWaterMark
- }
- },
- readableBuffer: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return this._readableState && this._readableState.buffer
- }
- },
- readableFlowing: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return this._readableState.flowing
- },
- set: function (state) {
- if (this._readableState) {
- this._readableState.flowing = state
- }
- }
- },
- readableLength: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState.length
- }
- },
- readableObjectMode: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState ? this._readableState.objectMode : false
- }
- },
- readableEncoding: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState ? this._readableState.encoding : null
- }
- },
- errored: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState ? this._readableState.errored : null
- }
- },
- closed: {
- __proto__: null,
- get() {
- return this._readableState ? this._readableState.closed : false
- }
- },
- destroyed: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState ? this._readableState.destroyed : false
- },
- set(value) {
- // We ignore the value if the stream
- // has not been initialized yet.
- if (!this._readableState) {
- return
- }
-
- // Backward compatibility, the user is explicitly
- // managing destroyed.
- this._readableState.destroyed = value
- }
- },
- readableEnded: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._readableState ? this._readableState.endEmitted : false
- }
- }
-})
-ObjectDefineProperties(ReadableState.prototype, {
- // Legacy getter for `pipesCount`.
- pipesCount: {
- __proto__: null,
- get() {
- return this.pipes.length
- }
- },
- // Legacy property for `paused`.
- paused: {
- __proto__: null,
- get() {
- return this[kPaused] !== false
- },
- set(value) {
- this[kPaused] = !!value
- }
- }
-})
-
-// Exposed for testing purposes only.
-Readable._fromList = fromList
-
-// Pluck off n bytes from an array of buffers.
-// Length is the combined lengths of all the buffers in the list.
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function fromList(n, state) {
- // nothing buffered.
- if (state.length === 0) return null
- let ret
- if (state.objectMode) ret = state.buffer.shift()
- else if (!n || n >= state.length) {
- // Read it all, truncate the list.
- if (state.decoder) ret = state.buffer.join('')
- else if (state.buffer.length === 1) ret = state.buffer.first()
- else ret = state.buffer.concat(state.length)
- state.buffer.clear()
- } else {
- // read part of list.
- ret = state.buffer.consume(n, state.decoder)
- }
- return ret
-}
-function endReadable(stream) {
- const state = stream._readableState
- debug('endReadable', state.endEmitted)
- if (!state.endEmitted) {
- state.ended = true
- process.nextTick(endReadableNT, state, stream)
- }
-}
-function endReadableNT(state, stream) {
- debug('endReadableNT', state.endEmitted, state.length)
-
- // Check that we didn't get one last unshift.
- if (!state.errored && !state.closeEmitted && !state.endEmitted && state.length === 0) {
- state.endEmitted = true
- stream.emit('end')
- if (stream.writable && stream.allowHalfOpen === false) {
- process.nextTick(endWritableNT, stream)
- } else if (state.autoDestroy) {
- // In case of duplex streams we need a way to detect
- // if the writable side is ready for autoDestroy as well.
- const wState = stream._writableState
- const autoDestroy =
- !wState ||
- (wState.autoDestroy &&
- // We don't expect the writable to ever 'finish'
- // if writable is explicitly set to false.
- (wState.finished || wState.writable === false))
- if (autoDestroy) {
- stream.destroy()
- }
- }
- }
-}
-function endWritableNT(stream) {
- const writable = stream.writable && !stream.writableEnded && !stream.destroyed
- if (writable) {
- stream.end()
- }
-}
-Readable.from = function (iterable, opts) {
- return from(Readable, iterable, opts)
-}
-let webStreamsAdapters
-
-// Lazy to avoid circular references
-function lazyWebStreams() {
- if (webStreamsAdapters === undefined) webStreamsAdapters = {}
- return webStreamsAdapters
-}
-Readable.fromWeb = function (readableStream, options) {
- return lazyWebStreams().newStreamReadableFromReadableStream(readableStream, options)
-}
-Readable.toWeb = function (streamReadable, options) {
- return lazyWebStreams().newReadableStreamFromStreamReadable(streamReadable, options)
-}
-Readable.wrap = function (src, options) {
- var _ref, _src$readableObjectMo
- return new Readable({
- objectMode:
- (_ref =
- (_src$readableObjectMo = src.readableObjectMode) !== null && _src$readableObjectMo !== undefined
- ? _src$readableObjectMo
- : src.objectMode) !== null && _ref !== undefined
- ? _ref
- : true,
- ...options,
- destroy(err, callback) {
- destroyImpl.destroyer(src, err)
- callback(err)
- }
- }).wrap(src)
-}
-
-},{"../../ours/errors":72,"../../ours/primordials":73,"../../ours/util":74,"../validators":70,"./add-abort-signal":53,"./buffer_list":54,"./destroy":56,"./duplex":57,"./end-of-stream":59,"./from":60,"./legacy":61,"./state":66,"buffer":38,"events":51,"process/":101,"string_decoder":115}],66:[function(require,module,exports){
-'use strict'
-
-const { MathFloor, NumberIsInteger } = require('../../ours/primordials')
-const { validateInteger } = require('../validators')
-const { ERR_INVALID_ARG_VALUE } = require('../../ours/errors').codes
-let defaultHighWaterMarkBytes = 16 * 1024
-let defaultHighWaterMarkObjectMode = 16
-function highWaterMarkFrom(options, isDuplex, duplexKey) {
- return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null
-}
-function getDefaultHighWaterMark(objectMode) {
- return objectMode ? defaultHighWaterMarkObjectMode : defaultHighWaterMarkBytes
-}
-function setDefaultHighWaterMark(objectMode, value) {
- validateInteger(value, 'value', 0)
- if (objectMode) {
- defaultHighWaterMarkObjectMode = value
- } else {
- defaultHighWaterMarkBytes = value
- }
-}
-function getHighWaterMark(state, options, duplexKey, isDuplex) {
- const hwm = highWaterMarkFrom(options, isDuplex, duplexKey)
- if (hwm != null) {
- if (!NumberIsInteger(hwm) || hwm < 0) {
- const name = isDuplex ? `options.${duplexKey}` : 'options.highWaterMark'
- throw new ERR_INVALID_ARG_VALUE(name, hwm)
- }
- return MathFloor(hwm)
- }
-
- // Default value
- return getDefaultHighWaterMark(state.objectMode)
-}
-module.exports = {
- getHighWaterMark,
- getDefaultHighWaterMark,
- setDefaultHighWaterMark
-}
-
-},{"../../ours/errors":72,"../../ours/primordials":73,"../validators":70}],67:[function(require,module,exports){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// a transform stream is a readable/writable stream where you do
-// something with the data. Sometimes it's called a "filter",
-// but that's not a great name for it, since that implies a thing where
-// some bits pass through, and others are simply ignored. (That would
-// be a valid example of a transform, of course.)
-//
-// While the output is causally related to the input, it's not a
-// necessarily symmetric or synchronous transformation. For example,
-// a zlib stream might take multiple plain-text writes(), and then
-// emit a single compressed chunk some time in the future.
-//
-// Here's how this works:
-//
-// The Transform stream has all the aspects of the readable and writable
-// stream classes. When you write(chunk), that calls _write(chunk,cb)
-// internally, and returns false if there's a lot of pending writes
-// buffered up. When you call read(), that calls _read(n) until
-// there's enough pending readable data buffered up.
-//
-// In a transform stream, the written data is placed in a buffer. When
-// _read(n) is called, it transforms the queued up data, calling the
-// buffered _write cb's as it consumes chunks. If consuming a single
-// written chunk would result in multiple output chunks, then the first
-// outputted bit calls the readcb, and subsequent chunks just go into
-// the read buffer, and will cause it to emit 'readable' if necessary.
-//
-// This way, back-pressure is actually determined by the reading side,
-// since _read has to be called to start processing a new chunk. However,
-// a pathological inflate type of transform can cause excessive buffering
-// here. For example, imagine a stream where every byte of input is
-// interpreted as an integer from 0-255, and then results in that many
-// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
-// 1kb of data being output. In this case, you could write a very small
-// amount of input, and end up with a very large amount of output. In
-// such a pathological inflating mechanism, there'd be no way to tell
-// the system to stop doing the transform. A single 4MB write could
-// cause the system to run out of memory.
-//
-// However, even in such a pathological case, only a single written chunk
-// would be consumed, and then the rest would wait (un-transformed) until
-// the results of the previous transformed chunk were consumed.
-
-'use strict'
-
-const { ObjectSetPrototypeOf, Symbol } = require('../../ours/primordials')
-module.exports = Transform
-const { ERR_METHOD_NOT_IMPLEMENTED } = require('../../ours/errors').codes
-const Duplex = require('./duplex')
-const { getHighWaterMark } = require('./state')
-ObjectSetPrototypeOf(Transform.prototype, Duplex.prototype)
-ObjectSetPrototypeOf(Transform, Duplex)
-const kCallback = Symbol('kCallback')
-function Transform(options) {
- if (!(this instanceof Transform)) return new Transform(options)
-
- // TODO (ronag): This should preferably always be
- // applied but would be semver-major. Or even better;
- // make Transform a Readable with the Writable interface.
- const readableHighWaterMark = options ? getHighWaterMark(this, options, 'readableHighWaterMark', true) : null
- if (readableHighWaterMark === 0) {
- // A Duplex will buffer both on the writable and readable side while
- // a Transform just wants to buffer hwm number of elements. To avoid
- // buffering twice we disable buffering on the writable side.
- options = {
- ...options,
- highWaterMark: null,
- readableHighWaterMark,
- // TODO (ronag): 0 is not optimal since we have
- // a "bug" where we check needDrain before calling _write and not after.
- // Refs: https://github.com/nodejs/node/pull/32887
- // Refs: https://github.com/nodejs/node/pull/35941
- writableHighWaterMark: options.writableHighWaterMark || 0
- }
- }
- Duplex.call(this, options)
-
- // We have implemented the _read method, and done the other things
- // that Readable wants before the first _read call, so unset the
- // sync guard flag.
- this._readableState.sync = false
- this[kCallback] = null
- if (options) {
- if (typeof options.transform === 'function') this._transform = options.transform
- if (typeof options.flush === 'function') this._flush = options.flush
- }
-
- // When the writable side finishes, then flush out anything remaining.
- // Backwards compat. Some Transform streams incorrectly implement _final
- // instead of or in addition to _flush. By using 'prefinish' instead of
- // implementing _final we continue supporting this unfortunate use case.
- this.on('prefinish', prefinish)
-}
-function final(cb) {
- if (typeof this._flush === 'function' && !this.destroyed) {
- this._flush((er, data) => {
- if (er) {
- if (cb) {
- cb(er)
- } else {
- this.destroy(er)
- }
- return
- }
- if (data != null) {
- this.push(data)
- }
- this.push(null)
- if (cb) {
- cb()
- }
- })
- } else {
- this.push(null)
- if (cb) {
- cb()
- }
- }
-}
-function prefinish() {
- if (this._final !== final) {
- final.call(this)
- }
-}
-Transform.prototype._final = final
-Transform.prototype._transform = function (chunk, encoding, callback) {
- throw new ERR_METHOD_NOT_IMPLEMENTED('_transform()')
-}
-Transform.prototype._write = function (chunk, encoding, callback) {
- const rState = this._readableState
- const wState = this._writableState
- const length = rState.length
- this._transform(chunk, encoding, (err, val) => {
- if (err) {
- callback(err)
- return
- }
- if (val != null) {
- this.push(val)
- }
- if (
- wState.ended ||
- // Backwards compat.
- length === rState.length ||
- // Backwards compat.
- rState.length < rState.highWaterMark
- ) {
- callback()
- } else {
- this[kCallback] = callback
- }
- })
-}
-Transform.prototype._read = function () {
- if (this[kCallback]) {
- const callback = this[kCallback]
- this[kCallback] = null
- callback()
- }
-}
-
-},{"../../ours/errors":72,"../../ours/primordials":73,"./duplex":57,"./state":66}],68:[function(require,module,exports){
-'use strict'
-
-const { SymbolAsyncIterator, SymbolIterator, SymbolFor } = require('../../ours/primordials')
-
-// We need to use SymbolFor to make these globally available
-// for interopt with readable-stream, i.e. readable-stream
-// and node core needs to be able to read/write private state
-// from each other for proper interoperability.
-const kIsDestroyed = SymbolFor('nodejs.stream.destroyed')
-const kIsErrored = SymbolFor('nodejs.stream.errored')
-const kIsReadable = SymbolFor('nodejs.stream.readable')
-const kIsWritable = SymbolFor('nodejs.stream.writable')
-const kIsDisturbed = SymbolFor('nodejs.stream.disturbed')
-const kIsClosedPromise = SymbolFor('nodejs.webstream.isClosedPromise')
-const kControllerErrorFunction = SymbolFor('nodejs.webstream.controllerErrorFunction')
-function isReadableNodeStream(obj, strict = false) {
- var _obj$_readableState
- return !!(
- (
- obj &&
- typeof obj.pipe === 'function' &&
- typeof obj.on === 'function' &&
- (!strict || (typeof obj.pause === 'function' && typeof obj.resume === 'function')) &&
- (!obj._writableState ||
- ((_obj$_readableState = obj._readableState) === null || _obj$_readableState === undefined
- ? undefined
- : _obj$_readableState.readable) !== false) &&
- // Duplex
- (!obj._writableState || obj._readableState)
- ) // Writable has .pipe.
- )
-}
-
-function isWritableNodeStream(obj) {
- var _obj$_writableState
- return !!(
- (
- obj &&
- typeof obj.write === 'function' &&
- typeof obj.on === 'function' &&
- (!obj._readableState ||
- ((_obj$_writableState = obj._writableState) === null || _obj$_writableState === undefined
- ? undefined
- : _obj$_writableState.writable) !== false)
- ) // Duplex
- )
-}
-
-function isDuplexNodeStream(obj) {
- return !!(
- obj &&
- typeof obj.pipe === 'function' &&
- obj._readableState &&
- typeof obj.on === 'function' &&
- typeof obj.write === 'function'
- )
-}
-function isNodeStream(obj) {
- return (
- obj &&
- (obj._readableState ||
- obj._writableState ||
- (typeof obj.write === 'function' && typeof obj.on === 'function') ||
- (typeof obj.pipe === 'function' && typeof obj.on === 'function'))
- )
-}
-function isReadableStream(obj) {
- return !!(
- obj &&
- !isNodeStream(obj) &&
- typeof obj.pipeThrough === 'function' &&
- typeof obj.getReader === 'function' &&
- typeof obj.cancel === 'function'
- )
-}
-function isWritableStream(obj) {
- return !!(obj && !isNodeStream(obj) && typeof obj.getWriter === 'function' && typeof obj.abort === 'function')
-}
-function isTransformStream(obj) {
- return !!(obj && !isNodeStream(obj) && typeof obj.readable === 'object' && typeof obj.writable === 'object')
-}
-function isWebStream(obj) {
- return isReadableStream(obj) || isWritableStream(obj) || isTransformStream(obj)
-}
-function isIterable(obj, isAsync) {
- if (obj == null) return false
- if (isAsync === true) return typeof obj[SymbolAsyncIterator] === 'function'
- if (isAsync === false) return typeof obj[SymbolIterator] === 'function'
- return typeof obj[SymbolAsyncIterator] === 'function' || typeof obj[SymbolIterator] === 'function'
-}
-function isDestroyed(stream) {
- if (!isNodeStream(stream)) return null
- const wState = stream._writableState
- const rState = stream._readableState
- const state = wState || rState
- return !!(stream.destroyed || stream[kIsDestroyed] || (state !== null && state !== undefined && state.destroyed))
-}
-
-// Have been end():d.
-function isWritableEnded(stream) {
- if (!isWritableNodeStream(stream)) return null
- if (stream.writableEnded === true) return true
- const wState = stream._writableState
- if (wState !== null && wState !== undefined && wState.errored) return false
- if (typeof (wState === null || wState === undefined ? undefined : wState.ended) !== 'boolean') return null
- return wState.ended
-}
-
-// Have emitted 'finish'.
-function isWritableFinished(stream, strict) {
- if (!isWritableNodeStream(stream)) return null
- if (stream.writableFinished === true) return true
- const wState = stream._writableState
- if (wState !== null && wState !== undefined && wState.errored) return false
- if (typeof (wState === null || wState === undefined ? undefined : wState.finished) !== 'boolean') return null
- return !!(wState.finished || (strict === false && wState.ended === true && wState.length === 0))
-}
-
-// Have been push(null):d.
-function isReadableEnded(stream) {
- if (!isReadableNodeStream(stream)) return null
- if (stream.readableEnded === true) return true
- const rState = stream._readableState
- if (!rState || rState.errored) return false
- if (typeof (rState === null || rState === undefined ? undefined : rState.ended) !== 'boolean') return null
- return rState.ended
-}
-
-// Have emitted 'end'.
-function isReadableFinished(stream, strict) {
- if (!isReadableNodeStream(stream)) return null
- const rState = stream._readableState
- if (rState !== null && rState !== undefined && rState.errored) return false
- if (typeof (rState === null || rState === undefined ? undefined : rState.endEmitted) !== 'boolean') return null
- return !!(rState.endEmitted || (strict === false && rState.ended === true && rState.length === 0))
-}
-function isReadable(stream) {
- if (stream && stream[kIsReadable] != null) return stream[kIsReadable]
- if (typeof (stream === null || stream === undefined ? undefined : stream.readable) !== 'boolean') return null
- if (isDestroyed(stream)) return false
- return isReadableNodeStream(stream) && stream.readable && !isReadableFinished(stream)
-}
-function isWritable(stream) {
- if (stream && stream[kIsWritable] != null) return stream[kIsWritable]
- if (typeof (stream === null || stream === undefined ? undefined : stream.writable) !== 'boolean') return null
- if (isDestroyed(stream)) return false
- return isWritableNodeStream(stream) && stream.writable && !isWritableEnded(stream)
-}
-function isFinished(stream, opts) {
- if (!isNodeStream(stream)) {
- return null
- }
- if (isDestroyed(stream)) {
- return true
- }
- if ((opts === null || opts === undefined ? undefined : opts.readable) !== false && isReadable(stream)) {
- return false
- }
- if ((opts === null || opts === undefined ? undefined : opts.writable) !== false && isWritable(stream)) {
- return false
- }
- return true
-}
-function isWritableErrored(stream) {
- var _stream$_writableStat, _stream$_writableStat2
- if (!isNodeStream(stream)) {
- return null
- }
- if (stream.writableErrored) {
- return stream.writableErrored
- }
- return (_stream$_writableStat =
- (_stream$_writableStat2 = stream._writableState) === null || _stream$_writableStat2 === undefined
- ? undefined
- : _stream$_writableStat2.errored) !== null && _stream$_writableStat !== undefined
- ? _stream$_writableStat
- : null
-}
-function isReadableErrored(stream) {
- var _stream$_readableStat, _stream$_readableStat2
- if (!isNodeStream(stream)) {
- return null
- }
- if (stream.readableErrored) {
- return stream.readableErrored
- }
- return (_stream$_readableStat =
- (_stream$_readableStat2 = stream._readableState) === null || _stream$_readableStat2 === undefined
- ? undefined
- : _stream$_readableStat2.errored) !== null && _stream$_readableStat !== undefined
- ? _stream$_readableStat
- : null
-}
-function isClosed(stream) {
- if (!isNodeStream(stream)) {
- return null
- }
- if (typeof stream.closed === 'boolean') {
- return stream.closed
- }
- const wState = stream._writableState
- const rState = stream._readableState
- if (
- typeof (wState === null || wState === undefined ? undefined : wState.closed) === 'boolean' ||
- typeof (rState === null || rState === undefined ? undefined : rState.closed) === 'boolean'
- ) {
- return (
- (wState === null || wState === undefined ? undefined : wState.closed) ||
- (rState === null || rState === undefined ? undefined : rState.closed)
- )
- }
- if (typeof stream._closed === 'boolean' && isOutgoingMessage(stream)) {
- return stream._closed
- }
- return null
-}
-function isOutgoingMessage(stream) {
- return (
- typeof stream._closed === 'boolean' &&
- typeof stream._defaultKeepAlive === 'boolean' &&
- typeof stream._removedConnection === 'boolean' &&
- typeof stream._removedContLen === 'boolean'
- )
-}
-function isServerResponse(stream) {
- return typeof stream._sent100 === 'boolean' && isOutgoingMessage(stream)
-}
-function isServerRequest(stream) {
- var _stream$req
- return (
- typeof stream._consuming === 'boolean' &&
- typeof stream._dumped === 'boolean' &&
- ((_stream$req = stream.req) === null || _stream$req === undefined ? undefined : _stream$req.upgradeOrConnect) ===
- undefined
- )
-}
-function willEmitClose(stream) {
- if (!isNodeStream(stream)) return null
- const wState = stream._writableState
- const rState = stream._readableState
- const state = wState || rState
- return (
- (!state && isServerResponse(stream)) || !!(state && state.autoDestroy && state.emitClose && state.closed === false)
- )
-}
-function isDisturbed(stream) {
- var _stream$kIsDisturbed
- return !!(
- stream &&
- ((_stream$kIsDisturbed = stream[kIsDisturbed]) !== null && _stream$kIsDisturbed !== undefined
- ? _stream$kIsDisturbed
- : stream.readableDidRead || stream.readableAborted)
- )
-}
-function isErrored(stream) {
- var _ref,
- _ref2,
- _ref3,
- _ref4,
- _ref5,
- _stream$kIsErrored,
- _stream$_readableStat3,
- _stream$_writableStat3,
- _stream$_readableStat4,
- _stream$_writableStat4
- return !!(
- stream &&
- ((_ref =
- (_ref2 =
- (_ref3 =
- (_ref4 =
- (_ref5 =
- (_stream$kIsErrored = stream[kIsErrored]) !== null && _stream$kIsErrored !== undefined
- ? _stream$kIsErrored
- : stream.readableErrored) !== null && _ref5 !== undefined
- ? _ref5
- : stream.writableErrored) !== null && _ref4 !== undefined
- ? _ref4
- : (_stream$_readableStat3 = stream._readableState) === null || _stream$_readableStat3 === undefined
- ? undefined
- : _stream$_readableStat3.errorEmitted) !== null && _ref3 !== undefined
- ? _ref3
- : (_stream$_writableStat3 = stream._writableState) === null || _stream$_writableStat3 === undefined
- ? undefined
- : _stream$_writableStat3.errorEmitted) !== null && _ref2 !== undefined
- ? _ref2
- : (_stream$_readableStat4 = stream._readableState) === null || _stream$_readableStat4 === undefined
- ? undefined
- : _stream$_readableStat4.errored) !== null && _ref !== undefined
- ? _ref
- : (_stream$_writableStat4 = stream._writableState) === null || _stream$_writableStat4 === undefined
- ? undefined
- : _stream$_writableStat4.errored)
- )
-}
-module.exports = {
- isDestroyed,
- kIsDestroyed,
- isDisturbed,
- kIsDisturbed,
- isErrored,
- kIsErrored,
- isReadable,
- kIsReadable,
- kIsClosedPromise,
- kControllerErrorFunction,
- kIsWritable,
- isClosed,
- isDuplexNodeStream,
- isFinished,
- isIterable,
- isReadableNodeStream,
- isReadableStream,
- isReadableEnded,
- isReadableFinished,
- isReadableErrored,
- isNodeStream,
- isWebStream,
- isWritable,
- isWritableNodeStream,
- isWritableStream,
- isWritableEnded,
- isWritableFinished,
- isWritableErrored,
- isServerRequest,
- isServerResponse,
- willEmitClose,
- isTransformStream
-}
-
-},{"../../ours/primordials":73}],69:[function(require,module,exports){
-/* replacement start */
-
-const process = require('process/')
-
-/* replacement end */
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// A bit simpler than readable streams.
-// Implement an async ._write(chunk, encoding, cb), and it'll handle all
-// the drain event emission and buffering.
-
-;('use strict')
-const {
- ArrayPrototypeSlice,
- Error,
- FunctionPrototypeSymbolHasInstance,
- ObjectDefineProperty,
- ObjectDefineProperties,
- ObjectSetPrototypeOf,
- StringPrototypeToLowerCase,
- Symbol,
- SymbolHasInstance
-} = require('../../ours/primordials')
-module.exports = Writable
-Writable.WritableState = WritableState
-const { EventEmitter: EE } = require('events')
-const Stream = require('./legacy').Stream
-const { Buffer } = require('buffer')
-const destroyImpl = require('./destroy')
-const { addAbortSignal } = require('./add-abort-signal')
-const { getHighWaterMark, getDefaultHighWaterMark } = require('./state')
-const {
- ERR_INVALID_ARG_TYPE,
- ERR_METHOD_NOT_IMPLEMENTED,
- ERR_MULTIPLE_CALLBACK,
- ERR_STREAM_CANNOT_PIPE,
- ERR_STREAM_DESTROYED,
- ERR_STREAM_ALREADY_FINISHED,
- ERR_STREAM_NULL_VALUES,
- ERR_STREAM_WRITE_AFTER_END,
- ERR_UNKNOWN_ENCODING
-} = require('../../ours/errors').codes
-const { errorOrDestroy } = destroyImpl
-ObjectSetPrototypeOf(Writable.prototype, Stream.prototype)
-ObjectSetPrototypeOf(Writable, Stream)
-function nop() {}
-const kOnFinished = Symbol('kOnFinished')
-function WritableState(options, stream, isDuplex) {
- // Duplex streams are both readable and writable, but share
- // the same options object.
- // However, some cases require setting options to different
- // values for the readable and the writable sides of the duplex stream,
- // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
- if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof require('./duplex')
-
- // Object stream flag to indicate whether or not this stream
- // contains buffers or objects.
- this.objectMode = !!(options && options.objectMode)
- if (isDuplex) this.objectMode = this.objectMode || !!(options && options.writableObjectMode)
-
- // The point at which write() starts returning false
- // Note: 0 is a valid value, means that we always return false if
- // the entire buffer is not flushed immediately on write().
- this.highWaterMark = options
- ? getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex)
- : getDefaultHighWaterMark(false)
-
- // if _final has been called.
- this.finalCalled = false
-
- // drain event flag.
- this.needDrain = false
- // At the start of calling end()
- this.ending = false
- // When end() has been called, and returned.
- this.ended = false
- // When 'finish' is emitted.
- this.finished = false
-
- // Has it been destroyed
- this.destroyed = false
-
- // Should we decode strings into buffers before passing to _write?
- // this is here so that some node-core streams can optimize string
- // handling at a lower level.
- const noDecode = !!(options && options.decodeStrings === false)
- this.decodeStrings = !noDecode
-
- // Crypto is kind of old and crusty. Historically, its default string
- // encoding is 'binary' so we have to make this configurable.
- // Everything else in the universe uses 'utf8', though.
- this.defaultEncoding = (options && options.defaultEncoding) || 'utf8'
-
- // Not an actual buffer we keep track of, but a measurement
- // of how much we're waiting to get pushed to some underlying
- // socket or file.
- this.length = 0
-
- // A flag to see when we're in the middle of a write.
- this.writing = false
-
- // When true all writes will be buffered until .uncork() call.
- this.corked = 0
-
- // A flag to be able to tell if the onwrite cb is called immediately,
- // or on a later tick. We set this to true at first, because any
- // actions that shouldn't happen until "later" should generally also
- // not happen before the first write call.
- this.sync = true
-
- // A flag to know if we're processing previously buffered items, which
- // may call the _write() callback in the same tick, so that we don't
- // end up in an overlapped onwrite situation.
- this.bufferProcessing = false
-
- // The callback that's passed to _write(chunk, cb).
- this.onwrite = onwrite.bind(undefined, stream)
-
- // The callback that the user supplies to write(chunk, encoding, cb).
- this.writecb = null
-
- // The amount that is being written when _write is called.
- this.writelen = 0
-
- // Storage for data passed to the afterWrite() callback in case of
- // synchronous _write() completion.
- this.afterWriteTickInfo = null
- resetBuffer(this)
-
- // Number of pending user-supplied write callbacks
- // this must be 0 before 'finish' can be emitted.
- this.pendingcb = 0
-
- // Stream is still being constructed and cannot be
- // destroyed until construction finished or failed.
- // Async construction is opt in, therefore we start as
- // constructed.
- this.constructed = true
-
- // Emit prefinish if the only thing we're waiting for is _write cbs
- // This is relevant for synchronous Transform streams.
- this.prefinished = false
-
- // True if the error was already emitted and should not be thrown again.
- this.errorEmitted = false
-
- // Should close be emitted on destroy. Defaults to true.
- this.emitClose = !options || options.emitClose !== false
-
- // Should .destroy() be called after 'finish' (and potentially 'end').
- this.autoDestroy = !options || options.autoDestroy !== false
-
- // Indicates whether the stream has errored. When true all write() calls
- // should return false. This is needed since when autoDestroy
- // is disabled we need a way to tell whether the stream has failed.
- this.errored = null
-
- // Indicates whether the stream has finished destroying.
- this.closed = false
-
- // True if close has been emitted or would have been emitted
- // depending on emitClose.
- this.closeEmitted = false
- this[kOnFinished] = []
-}
-function resetBuffer(state) {
- state.buffered = []
- state.bufferedIndex = 0
- state.allBuffers = true
- state.allNoop = true
-}
-WritableState.prototype.getBuffer = function getBuffer() {
- return ArrayPrototypeSlice(this.buffered, this.bufferedIndex)
-}
-ObjectDefineProperty(WritableState.prototype, 'bufferedRequestCount', {
- __proto__: null,
- get() {
- return this.buffered.length - this.bufferedIndex
- }
-})
-function Writable(options) {
- // Writable ctor is applied to Duplexes, too.
- // `realHasInstance` is necessary because using plain `instanceof`
- // would return false, as no `_writableState` property is attached.
-
- // Trying to use the custom `instanceof` for Writable here will also break the
- // Node.js LazyTransform implementation, which has a non-trivial getter for
- // `_writableState` that would lead to infinite recursion.
-
- // Checking for a Stream.Duplex instance is faster here instead of inside
- // the WritableState constructor, at least with V8 6.5.
- const isDuplex = this instanceof require('./duplex')
- if (!isDuplex && !FunctionPrototypeSymbolHasInstance(Writable, this)) return new Writable(options)
- this._writableState = new WritableState(options, this, isDuplex)
- if (options) {
- if (typeof options.write === 'function') this._write = options.write
- if (typeof options.writev === 'function') this._writev = options.writev
- if (typeof options.destroy === 'function') this._destroy = options.destroy
- if (typeof options.final === 'function') this._final = options.final
- if (typeof options.construct === 'function') this._construct = options.construct
- if (options.signal) addAbortSignal(options.signal, this)
- }
- Stream.call(this, options)
- destroyImpl.construct(this, () => {
- const state = this._writableState
- if (!state.writing) {
- clearBuffer(this, state)
- }
- finishMaybe(this, state)
- })
-}
-ObjectDefineProperty(Writable, SymbolHasInstance, {
- __proto__: null,
- value: function (object) {
- if (FunctionPrototypeSymbolHasInstance(this, object)) return true
- if (this !== Writable) return false
- return object && object._writableState instanceof WritableState
- }
-})
-
-// Otherwise people can pipe Writable streams, which is just wrong.
-Writable.prototype.pipe = function () {
- errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE())
-}
-function _write(stream, chunk, encoding, cb) {
- const state = stream._writableState
- if (typeof encoding === 'function') {
- cb = encoding
- encoding = state.defaultEncoding
- } else {
- if (!encoding) encoding = state.defaultEncoding
- else if (encoding !== 'buffer' && !Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding)
- if (typeof cb !== 'function') cb = nop
- }
- if (chunk === null) {
- throw new ERR_STREAM_NULL_VALUES()
- } else if (!state.objectMode) {
- if (typeof chunk === 'string') {
- if (state.decodeStrings !== false) {
- chunk = Buffer.from(chunk, encoding)
- encoding = 'buffer'
- }
- } else if (chunk instanceof Buffer) {
- encoding = 'buffer'
- } else if (Stream._isUint8Array(chunk)) {
- chunk = Stream._uint8ArrayToBuffer(chunk)
- encoding = 'buffer'
- } else {
- throw new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk)
- }
- }
- let err
- if (state.ending) {
- err = new ERR_STREAM_WRITE_AFTER_END()
- } else if (state.destroyed) {
- err = new ERR_STREAM_DESTROYED('write')
- }
- if (err) {
- process.nextTick(cb, err)
- errorOrDestroy(stream, err, true)
- return err
- }
- state.pendingcb++
- return writeOrBuffer(stream, state, chunk, encoding, cb)
-}
-Writable.prototype.write = function (chunk, encoding, cb) {
- return _write(this, chunk, encoding, cb) === true
-}
-Writable.prototype.cork = function () {
- this._writableState.corked++
-}
-Writable.prototype.uncork = function () {
- const state = this._writableState
- if (state.corked) {
- state.corked--
- if (!state.writing) clearBuffer(this, state)
- }
-}
-Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
- // node::ParseEncoding() requires lower case.
- if (typeof encoding === 'string') encoding = StringPrototypeToLowerCase(encoding)
- if (!Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding)
- this._writableState.defaultEncoding = encoding
- return this
-}
-
-// If we're already writing something, then just put this
-// in the queue, and wait our turn. Otherwise, call _write
-// If we return false, then we need a drain event, so set that flag.
-function writeOrBuffer(stream, state, chunk, encoding, callback) {
- const len = state.objectMode ? 1 : chunk.length
- state.length += len
-
- // stream._write resets state.length
- const ret = state.length < state.highWaterMark
- // We must ensure that previous needDrain will not be reset to false.
- if (!ret) state.needDrain = true
- if (state.writing || state.corked || state.errored || !state.constructed) {
- state.buffered.push({
- chunk,
- encoding,
- callback
- })
- if (state.allBuffers && encoding !== 'buffer') {
- state.allBuffers = false
- }
- if (state.allNoop && callback !== nop) {
- state.allNoop = false
- }
- } else {
- state.writelen = len
- state.writecb = callback
- state.writing = true
- state.sync = true
- stream._write(chunk, encoding, state.onwrite)
- state.sync = false
- }
-
- // Return false if errored or destroyed in order to break
- // any synchronous while(stream.write(data)) loops.
- return ret && !state.errored && !state.destroyed
-}
-function doWrite(stream, state, writev, len, chunk, encoding, cb) {
- state.writelen = len
- state.writecb = cb
- state.writing = true
- state.sync = true
- if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'))
- else if (writev) stream._writev(chunk, state.onwrite)
- else stream._write(chunk, encoding, state.onwrite)
- state.sync = false
-}
-function onwriteError(stream, state, er, cb) {
- --state.pendingcb
- cb(er)
- // Ensure callbacks are invoked even when autoDestroy is
- // not enabled. Passing `er` here doesn't make sense since
- // it's related to one specific write, not to the buffered
- // writes.
- errorBuffer(state)
- // This can emit error, but error must always follow cb.
- errorOrDestroy(stream, er)
-}
-function onwrite(stream, er) {
- const state = stream._writableState
- const sync = state.sync
- const cb = state.writecb
- if (typeof cb !== 'function') {
- errorOrDestroy(stream, new ERR_MULTIPLE_CALLBACK())
- return
- }
- state.writing = false
- state.writecb = null
- state.length -= state.writelen
- state.writelen = 0
- if (er) {
- // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
- er.stack // eslint-disable-line no-unused-expressions
-
- if (!state.errored) {
- state.errored = er
- }
-
- // In case of duplex streams we need to notify the readable side of the
- // error.
- if (stream._readableState && !stream._readableState.errored) {
- stream._readableState.errored = er
- }
- if (sync) {
- process.nextTick(onwriteError, stream, state, er, cb)
- } else {
- onwriteError(stream, state, er, cb)
- }
- } else {
- if (state.buffered.length > state.bufferedIndex) {
- clearBuffer(stream, state)
- }
- if (sync) {
- // It is a common case that the callback passed to .write() is always
- // the same. In that case, we do not schedule a new nextTick(), but
- // rather just increase a counter, to improve performance and avoid
- // memory allocations.
- if (state.afterWriteTickInfo !== null && state.afterWriteTickInfo.cb === cb) {
- state.afterWriteTickInfo.count++
- } else {
- state.afterWriteTickInfo = {
- count: 1,
- cb,
- stream,
- state
- }
- process.nextTick(afterWriteTick, state.afterWriteTickInfo)
- }
- } else {
- afterWrite(stream, state, 1, cb)
- }
- }
-}
-function afterWriteTick({ stream, state, count, cb }) {
- state.afterWriteTickInfo = null
- return afterWrite(stream, state, count, cb)
-}
-function afterWrite(stream, state, count, cb) {
- const needDrain = !state.ending && !stream.destroyed && state.length === 0 && state.needDrain
- if (needDrain) {
- state.needDrain = false
- stream.emit('drain')
- }
- while (count-- > 0) {
- state.pendingcb--
- cb()
- }
- if (state.destroyed) {
- errorBuffer(state)
- }
- finishMaybe(stream, state)
-}
-
-// If there's something in the buffer waiting, then invoke callbacks.
-function errorBuffer(state) {
- if (state.writing) {
- return
- }
- for (let n = state.bufferedIndex; n < state.buffered.length; ++n) {
- var _state$errored
- const { chunk, callback } = state.buffered[n]
- const len = state.objectMode ? 1 : chunk.length
- state.length -= len
- callback(
- (_state$errored = state.errored) !== null && _state$errored !== undefined
- ? _state$errored
- : new ERR_STREAM_DESTROYED('write')
- )
- }
- const onfinishCallbacks = state[kOnFinished].splice(0)
- for (let i = 0; i < onfinishCallbacks.length; i++) {
- var _state$errored2
- onfinishCallbacks[i](
- (_state$errored2 = state.errored) !== null && _state$errored2 !== undefined
- ? _state$errored2
- : new ERR_STREAM_DESTROYED('end')
- )
- }
- resetBuffer(state)
-}
-
-// If there's something in the buffer waiting, then process it.
-function clearBuffer(stream, state) {
- if (state.corked || state.bufferProcessing || state.destroyed || !state.constructed) {
- return
- }
- const { buffered, bufferedIndex, objectMode } = state
- const bufferedLength = buffered.length - bufferedIndex
- if (!bufferedLength) {
- return
- }
- let i = bufferedIndex
- state.bufferProcessing = true
- if (bufferedLength > 1 && stream._writev) {
- state.pendingcb -= bufferedLength - 1
- const callback = state.allNoop
- ? nop
- : (err) => {
- for (let n = i; n < buffered.length; ++n) {
- buffered[n].callback(err)
- }
- }
- // Make a copy of `buffered` if it's going to be used by `callback` above,
- // since `doWrite` will mutate the array.
- const chunks = state.allNoop && i === 0 ? buffered : ArrayPrototypeSlice(buffered, i)
- chunks.allBuffers = state.allBuffers
- doWrite(stream, state, true, state.length, chunks, '', callback)
- resetBuffer(state)
- } else {
- do {
- const { chunk, encoding, callback } = buffered[i]
- buffered[i++] = null
- const len = objectMode ? 1 : chunk.length
- doWrite(stream, state, false, len, chunk, encoding, callback)
- } while (i < buffered.length && !state.writing)
- if (i === buffered.length) {
- resetBuffer(state)
- } else if (i > 256) {
- buffered.splice(0, i)
- state.bufferedIndex = 0
- } else {
- state.bufferedIndex = i
- }
- }
- state.bufferProcessing = false
-}
-Writable.prototype._write = function (chunk, encoding, cb) {
- if (this._writev) {
- this._writev(
- [
- {
- chunk,
- encoding
- }
- ],
- cb
- )
- } else {
- throw new ERR_METHOD_NOT_IMPLEMENTED('_write()')
- }
-}
-Writable.prototype._writev = null
-Writable.prototype.end = function (chunk, encoding, cb) {
- const state = this._writableState
- if (typeof chunk === 'function') {
- cb = chunk
- chunk = null
- encoding = null
- } else if (typeof encoding === 'function') {
- cb = encoding
- encoding = null
- }
- let err
- if (chunk !== null && chunk !== undefined) {
- const ret = _write(this, chunk, encoding)
- if (ret instanceof Error) {
- err = ret
- }
- }
-
- // .end() fully uncorks.
- if (state.corked) {
- state.corked = 1
- this.uncork()
- }
- if (err) {
- // Do nothing...
- } else if (!state.errored && !state.ending) {
- // This is forgiving in terms of unnecessary calls to end() and can hide
- // logic errors. However, usually such errors are harmless and causing a
- // hard error can be disproportionately destructive. It is not always
- // trivial for the user to determine whether end() needs to be called
- // or not.
-
- state.ending = true
- finishMaybe(this, state, true)
- state.ended = true
- } else if (state.finished) {
- err = new ERR_STREAM_ALREADY_FINISHED('end')
- } else if (state.destroyed) {
- err = new ERR_STREAM_DESTROYED('end')
- }
- if (typeof cb === 'function') {
- if (err || state.finished) {
- process.nextTick(cb, err)
- } else {
- state[kOnFinished].push(cb)
- }
- }
- return this
-}
-function needFinish(state) {
- return (
- state.ending &&
- !state.destroyed &&
- state.constructed &&
- state.length === 0 &&
- !state.errored &&
- state.buffered.length === 0 &&
- !state.finished &&
- !state.writing &&
- !state.errorEmitted &&
- !state.closeEmitted
- )
-}
-function callFinal(stream, state) {
- let called = false
- function onFinish(err) {
- if (called) {
- errorOrDestroy(stream, err !== null && err !== undefined ? err : ERR_MULTIPLE_CALLBACK())
- return
- }
- called = true
- state.pendingcb--
- if (err) {
- const onfinishCallbacks = state[kOnFinished].splice(0)
- for (let i = 0; i < onfinishCallbacks.length; i++) {
- onfinishCallbacks[i](err)
- }
- errorOrDestroy(stream, err, state.sync)
- } else if (needFinish(state)) {
- state.prefinished = true
- stream.emit('prefinish')
- // Backwards compat. Don't check state.sync here.
- // Some streams assume 'finish' will be emitted
- // asynchronously relative to _final callback.
- state.pendingcb++
- process.nextTick(finish, stream, state)
- }
- }
- state.sync = true
- state.pendingcb++
- try {
- stream._final(onFinish)
- } catch (err) {
- onFinish(err)
- }
- state.sync = false
-}
-function prefinish(stream, state) {
- if (!state.prefinished && !state.finalCalled) {
- if (typeof stream._final === 'function' && !state.destroyed) {
- state.finalCalled = true
- callFinal(stream, state)
- } else {
- state.prefinished = true
- stream.emit('prefinish')
- }
- }
-}
-function finishMaybe(stream, state, sync) {
- if (needFinish(state)) {
- prefinish(stream, state)
- if (state.pendingcb === 0) {
- if (sync) {
- state.pendingcb++
- process.nextTick(
- (stream, state) => {
- if (needFinish(state)) {
- finish(stream, state)
- } else {
- state.pendingcb--
- }
- },
- stream,
- state
- )
- } else if (needFinish(state)) {
- state.pendingcb++
- finish(stream, state)
- }
- }
- }
-}
-function finish(stream, state) {
- state.pendingcb--
- state.finished = true
- const onfinishCallbacks = state[kOnFinished].splice(0)
- for (let i = 0; i < onfinishCallbacks.length; i++) {
- onfinishCallbacks[i]()
- }
- stream.emit('finish')
- if (state.autoDestroy) {
- // In case of duplex streams we need a way to detect
- // if the readable side is ready for autoDestroy as well.
- const rState = stream._readableState
- const autoDestroy =
- !rState ||
- (rState.autoDestroy &&
- // We don't expect the readable to ever 'end'
- // if readable is explicitly set to false.
- (rState.endEmitted || rState.readable === false))
- if (autoDestroy) {
- stream.destroy()
- }
- }
-}
-ObjectDefineProperties(Writable.prototype, {
- closed: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.closed : false
- }
- },
- destroyed: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.destroyed : false
- },
- set(value) {
- // Backward compatibility, the user is explicitly managing destroyed.
- if (this._writableState) {
- this._writableState.destroyed = value
- }
- }
- },
- writable: {
- __proto__: null,
- get() {
- const w = this._writableState
- // w.writable === false means that this is part of a Duplex stream
- // where the writable side was disabled upon construction.
- // Compat. The user might manually disable writable side through
- // deprecated setter.
- return !!w && w.writable !== false && !w.destroyed && !w.errored && !w.ending && !w.ended
- },
- set(val) {
- // Backwards compatible.
- if (this._writableState) {
- this._writableState.writable = !!val
- }
- }
- },
- writableFinished: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.finished : false
- }
- },
- writableObjectMode: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.objectMode : false
- }
- },
- writableBuffer: {
- __proto__: null,
- get() {
- return this._writableState && this._writableState.getBuffer()
- }
- },
- writableEnded: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.ending : false
- }
- },
- writableNeedDrain: {
- __proto__: null,
- get() {
- const wState = this._writableState
- if (!wState) return false
- return !wState.destroyed && !wState.ending && wState.needDrain
- }
- },
- writableHighWaterMark: {
- __proto__: null,
- get() {
- return this._writableState && this._writableState.highWaterMark
- }
- },
- writableCorked: {
- __proto__: null,
- get() {
- return this._writableState ? this._writableState.corked : 0
- }
- },
- writableLength: {
- __proto__: null,
- get() {
- return this._writableState && this._writableState.length
- }
- },
- errored: {
- __proto__: null,
- enumerable: false,
- get() {
- return this._writableState ? this._writableState.errored : null
- }
- },
- writableAborted: {
- __proto__: null,
- enumerable: false,
- get: function () {
- return !!(
- this._writableState.writable !== false &&
- (this._writableState.destroyed || this._writableState.errored) &&
- !this._writableState.finished
- )
- }
- }
-})
-const destroy = destroyImpl.destroy
-Writable.prototype.destroy = function (err, cb) {
- const state = this._writableState
-
- // Invoke pending callbacks.
- if (!state.destroyed && (state.bufferedIndex < state.buffered.length || state[kOnFinished].length)) {
- process.nextTick(errorBuffer, state)
- }
- destroy.call(this, err, cb)
- return this
-}
-Writable.prototype._undestroy = destroyImpl.undestroy
-Writable.prototype._destroy = function (err, cb) {
- cb(err)
-}
-Writable.prototype[EE.captureRejectionSymbol] = function (err) {
- this.destroy(err)
-}
-let webStreamsAdapters
-
-// Lazy to avoid circular references
-function lazyWebStreams() {
- if (webStreamsAdapters === undefined) webStreamsAdapters = {}
- return webStreamsAdapters
-}
-Writable.fromWeb = function (writableStream, options) {
- return lazyWebStreams().newStreamWritableFromWritableStream(writableStream, options)
-}
-Writable.toWeb = function (streamWritable) {
- return lazyWebStreams().newWritableStreamFromStreamWritable(streamWritable)
-}
-
-},{"../../ours/errors":72,"../../ours/primordials":73,"./add-abort-signal":53,"./destroy":56,"./duplex":57,"./legacy":61,"./state":66,"buffer":38,"events":51,"process/":101}],70:[function(require,module,exports){
-/* eslint jsdoc/require-jsdoc: "error" */
-
-'use strict'
-
-const {
- ArrayIsArray,
- ArrayPrototypeIncludes,
- ArrayPrototypeJoin,
- ArrayPrototypeMap,
- NumberIsInteger,
- NumberIsNaN,
- NumberMAX_SAFE_INTEGER,
- NumberMIN_SAFE_INTEGER,
- NumberParseInt,
- ObjectPrototypeHasOwnProperty,
- RegExpPrototypeExec,
- String,
- StringPrototypeToUpperCase,
- StringPrototypeTrim
-} = require('../ours/primordials')
-const {
- hideStackFrames,
- codes: { ERR_SOCKET_BAD_PORT, ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, ERR_OUT_OF_RANGE, ERR_UNKNOWN_SIGNAL }
-} = require('../ours/errors')
-const { normalizeEncoding } = require('../ours/util')
-const { isAsyncFunction, isArrayBufferView } = require('../ours/util').types
-const signals = {}
-
-/**
- * @param {*} value
- * @returns {boolean}
- */
-function isInt32(value) {
- return value === (value | 0)
-}
-
-/**
- * @param {*} value
- * @returns {boolean}
- */
-function isUint32(value) {
- return value === value >>> 0
-}
-const octalReg = /^[0-7]+$/
-const modeDesc = 'must be a 32-bit unsigned integer or an octal string'
-
-/**
- * Parse and validate values that will be converted into mode_t (the S_*
- * constants). Only valid numbers and octal strings are allowed. They could be
- * converted to 32-bit unsigned integers or non-negative signed integers in the
- * C++ land, but any value higher than 0o777 will result in platform-specific
- * behaviors.
- * @param {*} value Values to be validated
- * @param {string} name Name of the argument
- * @param {number} [def] If specified, will be returned for invalid values
- * @returns {number}
- */
-function parseFileMode(value, name, def) {
- if (typeof value === 'undefined') {
- value = def
- }
- if (typeof value === 'string') {
- if (RegExpPrototypeExec(octalReg, value) === null) {
- throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc)
- }
- value = NumberParseInt(value, 8)
- }
- validateUint32(value, name)
- return value
-}
-
-/**
- * @callback validateInteger
- * @param {*} value
- * @param {string} name
- * @param {number} [min]
- * @param {number} [max]
- * @returns {asserts value is number}
- */
-
-/** @type {validateInteger} */
-const validateInteger = hideStackFrames((value, name, min = NumberMIN_SAFE_INTEGER, max = NumberMAX_SAFE_INTEGER) => {
- if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
- if (!NumberIsInteger(value)) throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
- if (value < min || value > max) throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
-})
-
-/**
- * @callback validateInt32
- * @param {*} value
- * @param {string} name
- * @param {number} [min]
- * @param {number} [max]
- * @returns {asserts value is number}
- */
-
-/** @type {validateInt32} */
-const validateInt32 = hideStackFrames((value, name, min = -2147483648, max = 2147483647) => {
- // The defaults for min and max correspond to the limits of 32-bit integers.
- if (typeof value !== 'number') {
- throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
- }
- if (!NumberIsInteger(value)) {
- throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
- }
- if (value < min || value > max) {
- throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
- }
-})
-
-/**
- * @callback validateUint32
- * @param {*} value
- * @param {string} name
- * @param {number|boolean} [positive=false]
- * @returns {asserts value is number}
- */
-
-/** @type {validateUint32} */
-const validateUint32 = hideStackFrames((value, name, positive = false) => {
- if (typeof value !== 'number') {
- throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
- }
- if (!NumberIsInteger(value)) {
- throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
- }
- const min = positive ? 1 : 0
- // 2 ** 32 === 4294967296
- const max = 4294967295
- if (value < min || value > max) {
- throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
- }
-})
-
-/**
- * @callback validateString
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is string}
- */
-
-/** @type {validateString} */
-function validateString(value, name) {
- if (typeof value !== 'string') throw new ERR_INVALID_ARG_TYPE(name, 'string', value)
-}
-
-/**
- * @callback validateNumber
- * @param {*} value
- * @param {string} name
- * @param {number} [min]
- * @param {number} [max]
- * @returns {asserts value is number}
- */
-
-/** @type {validateNumber} */
-function validateNumber(value, name, min = undefined, max) {
- if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
- if (
- (min != null && value < min) ||
- (max != null && value > max) ||
- ((min != null || max != null) && NumberIsNaN(value))
- ) {
- throw new ERR_OUT_OF_RANGE(
- name,
- `${min != null ? `>= ${min}` : ''}${min != null && max != null ? ' && ' : ''}${max != null ? `<= ${max}` : ''}`,
- value
- )
- }
-}
-
-/**
- * @callback validateOneOf
- * @template T
- * @param {T} value
- * @param {string} name
- * @param {T[]} oneOf
- */
-
-/** @type {validateOneOf} */
-const validateOneOf = hideStackFrames((value, name, oneOf) => {
- if (!ArrayPrototypeIncludes(oneOf, value)) {
- const allowed = ArrayPrototypeJoin(
- ArrayPrototypeMap(oneOf, (v) => (typeof v === 'string' ? `'${v}'` : String(v))),
- ', '
- )
- const reason = 'must be one of: ' + allowed
- throw new ERR_INVALID_ARG_VALUE(name, value, reason)
- }
-})
-
-/**
- * @callback validateBoolean
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is boolean}
- */
-
-/** @type {validateBoolean} */
-function validateBoolean(value, name) {
- if (typeof value !== 'boolean') throw new ERR_INVALID_ARG_TYPE(name, 'boolean', value)
-}
-
-/**
- * @param {any} options
- * @param {string} key
- * @param {boolean} defaultValue
- * @returns {boolean}
- */
-function getOwnPropertyValueOrDefault(options, key, defaultValue) {
- return options == null || !ObjectPrototypeHasOwnProperty(options, key) ? defaultValue : options[key]
-}
-
-/**
- * @callback validateObject
- * @param {*} value
- * @param {string} name
- * @param {{
- * allowArray?: boolean,
- * allowFunction?: boolean,
- * nullable?: boolean
- * }} [options]
- */
-
-/** @type {validateObject} */
-const validateObject = hideStackFrames((value, name, options = null) => {
- const allowArray = getOwnPropertyValueOrDefault(options, 'allowArray', false)
- const allowFunction = getOwnPropertyValueOrDefault(options, 'allowFunction', false)
- const nullable = getOwnPropertyValueOrDefault(options, 'nullable', false)
- if (
- (!nullable && value === null) ||
- (!allowArray && ArrayIsArray(value)) ||
- (typeof value !== 'object' && (!allowFunction || typeof value !== 'function'))
- ) {
- throw new ERR_INVALID_ARG_TYPE(name, 'Object', value)
- }
-})
-
-/**
- * @callback validateDictionary - We are using the Web IDL Standard definition
- * of "dictionary" here, which means any value
- * whose Type is either Undefined, Null, or
- * Object (which includes functions).
- * @param {*} value
- * @param {string} name
- * @see https://webidl.spec.whatwg.org/#es-dictionary
- * @see https://tc39.es/ecma262/#table-typeof-operator-results
- */
-
-/** @type {validateDictionary} */
-const validateDictionary = hideStackFrames((value, name) => {
- if (value != null && typeof value !== 'object' && typeof value !== 'function') {
- throw new ERR_INVALID_ARG_TYPE(name, 'a dictionary', value)
- }
-})
-
-/**
- * @callback validateArray
- * @param {*} value
- * @param {string} name
- * @param {number} [minLength]
- * @returns {asserts value is any[]}
- */
-
-/** @type {validateArray} */
-const validateArray = hideStackFrames((value, name, minLength = 0) => {
- if (!ArrayIsArray(value)) {
- throw new ERR_INVALID_ARG_TYPE(name, 'Array', value)
- }
- if (value.length < minLength) {
- const reason = `must be longer than ${minLength}`
- throw new ERR_INVALID_ARG_VALUE(name, value, reason)
- }
-})
-
-/**
- * @callback validateStringArray
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is string[]}
- */
-
-/** @type {validateStringArray} */
-function validateStringArray(value, name) {
- validateArray(value, name)
- for (let i = 0; i < value.length; i++) {
- validateString(value[i], `${name}[${i}]`)
- }
-}
-
-/**
- * @callback validateBooleanArray
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is boolean[]}
- */
-
-/** @type {validateBooleanArray} */
-function validateBooleanArray(value, name) {
- validateArray(value, name)
- for (let i = 0; i < value.length; i++) {
- validateBoolean(value[i], `${name}[${i}]`)
- }
-}
-
-/**
- * @callback validateAbortSignalArray
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is AbortSignal[]}
- */
-
-/** @type {validateAbortSignalArray} */
-function validateAbortSignalArray(value, name) {
- validateArray(value, name)
- for (let i = 0; i < value.length; i++) {
- const signal = value[i]
- const indexedName = `${name}[${i}]`
- if (signal == null) {
- throw new ERR_INVALID_ARG_TYPE(indexedName, 'AbortSignal', signal)
- }
- validateAbortSignal(signal, indexedName)
- }
-}
-
-/**
- * @param {*} signal
- * @param {string} [name='signal']
- * @returns {asserts signal is keyof signals}
- */
-function validateSignalName(signal, name = 'signal') {
- validateString(signal, name)
- if (signals[signal] === undefined) {
- if (signals[StringPrototypeToUpperCase(signal)] !== undefined) {
- throw new ERR_UNKNOWN_SIGNAL(signal + ' (signals must use all capital letters)')
- }
- throw new ERR_UNKNOWN_SIGNAL(signal)
- }
-}
-
-/**
- * @callback validateBuffer
- * @param {*} buffer
- * @param {string} [name='buffer']
- * @returns {asserts buffer is ArrayBufferView}
- */
-
-/** @type {validateBuffer} */
-const validateBuffer = hideStackFrames((buffer, name = 'buffer') => {
- if (!isArrayBufferView(buffer)) {
- throw new ERR_INVALID_ARG_TYPE(name, ['Buffer', 'TypedArray', 'DataView'], buffer)
- }
-})
-
-/**
- * @param {string} data
- * @param {string} encoding
- */
-function validateEncoding(data, encoding) {
- const normalizedEncoding = normalizeEncoding(encoding)
- const length = data.length
- if (normalizedEncoding === 'hex' && length % 2 !== 0) {
- throw new ERR_INVALID_ARG_VALUE('encoding', encoding, `is invalid for data of length ${length}`)
- }
-}
-
-/**
- * Check that the port number is not NaN when coerced to a number,
- * is an integer and that it falls within the legal range of port numbers.
- * @param {*} port
- * @param {string} [name='Port']
- * @param {boolean} [allowZero=true]
- * @returns {number}
- */
-function validatePort(port, name = 'Port', allowZero = true) {
- if (
- (typeof port !== 'number' && typeof port !== 'string') ||
- (typeof port === 'string' && StringPrototypeTrim(port).length === 0) ||
- +port !== +port >>> 0 ||
- port > 0xffff ||
- (port === 0 && !allowZero)
- ) {
- throw new ERR_SOCKET_BAD_PORT(name, port, allowZero)
- }
- return port | 0
-}
-
-/**
- * @callback validateAbortSignal
- * @param {*} signal
- * @param {string} name
- */
-
-/** @type {validateAbortSignal} */
-const validateAbortSignal = hideStackFrames((signal, name) => {
- if (signal !== undefined && (signal === null || typeof signal !== 'object' || !('aborted' in signal))) {
- throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)
- }
-})
-
-/**
- * @callback validateFunction
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is Function}
- */
-
-/** @type {validateFunction} */
-const validateFunction = hideStackFrames((value, name) => {
- if (typeof value !== 'function') throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)
-})
-
-/**
- * @callback validatePlainFunction
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is Function}
- */
-
-/** @type {validatePlainFunction} */
-const validatePlainFunction = hideStackFrames((value, name) => {
- if (typeof value !== 'function' || isAsyncFunction(value)) throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)
-})
-
-/**
- * @callback validateUndefined
- * @param {*} value
- * @param {string} name
- * @returns {asserts value is undefined}
- */
-
-/** @type {validateUndefined} */
-const validateUndefined = hideStackFrames((value, name) => {
- if (value !== undefined) throw new ERR_INVALID_ARG_TYPE(name, 'undefined', value)
-})
-
-/**
- * @template T
- * @param {T} value
- * @param {string} name
- * @param {T[]} union
- */
-function validateUnion(value, name, union) {
- if (!ArrayPrototypeIncludes(union, value)) {
- throw new ERR_INVALID_ARG_TYPE(name, `('${ArrayPrototypeJoin(union, '|')}')`, value)
- }
-}
-
-/*
- The rules for the Link header field are described here:
- https://www.rfc-editor.org/rfc/rfc8288.html#section-3
-
- This regex validates any string surrounded by angle brackets
- (not necessarily a valid URI reference) followed by zero or more
- link-params separated by semicolons.
-*/
-const linkValueRegExp = /^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/
-
-/**
- * @param {any} value
- * @param {string} name
- */
-function validateLinkHeaderFormat(value, name) {
- if (typeof value === 'undefined' || !RegExpPrototypeExec(linkValueRegExp, value)) {
- throw new ERR_INVALID_ARG_VALUE(
- name,
- value,
- 'must be an array or string of format "; rel=preload; as=style"'
- )
- }
-}
-
-/**
- * @param {any} hints
- * @return {string}
- */
-function validateLinkHeaderValue(hints) {
- if (typeof hints === 'string') {
- validateLinkHeaderFormat(hints, 'hints')
- return hints
- } else if (ArrayIsArray(hints)) {
- const hintsLength = hints.length
- let result = ''
- if (hintsLength === 0) {
- return result
- }
- for (let i = 0; i < hintsLength; i++) {
- const link = hints[i]
- validateLinkHeaderFormat(link, 'hints')
- result += link
- if (i !== hintsLength - 1) {
- result += ', '
- }
- }
- return result
- }
- throw new ERR_INVALID_ARG_VALUE(
- 'hints',
- hints,
- 'must be an array or string of format "; rel=preload; as=style"'
- )
-}
-module.exports = {
- isInt32,
- isUint32,
- parseFileMode,
- validateArray,
- validateStringArray,
- validateBooleanArray,
- validateAbortSignalArray,
- validateBoolean,
- validateBuffer,
- validateDictionary,
- validateEncoding,
- validateFunction,
- validateInt32,
- validateInteger,
- validateNumber,
- validateObject,
- validateOneOf,
- validatePlainFunction,
- validatePort,
- validateSignalName,
- validateString,
- validateUint32,
- validateUndefined,
- validateUnion,
- validateAbortSignal,
- validateLinkHeaderValue
-}
-
-},{"../ours/errors":72,"../ours/primordials":73,"../ours/util":74}],71:[function(require,module,exports){
-'use strict'
-
-const CustomStream = require('../stream')
-const promises = require('../stream/promises')
-const originalDestroy = CustomStream.Readable.destroy
-module.exports = CustomStream.Readable
-
-// Explicit export naming is needed for ESM
-module.exports._uint8ArrayToBuffer = CustomStream._uint8ArrayToBuffer
-module.exports._isUint8Array = CustomStream._isUint8Array
-module.exports.isDisturbed = CustomStream.isDisturbed
-module.exports.isErrored = CustomStream.isErrored
-module.exports.isReadable = CustomStream.isReadable
-module.exports.Readable = CustomStream.Readable
-module.exports.Writable = CustomStream.Writable
-module.exports.Duplex = CustomStream.Duplex
-module.exports.Transform = CustomStream.Transform
-module.exports.PassThrough = CustomStream.PassThrough
-module.exports.addAbortSignal = CustomStream.addAbortSignal
-module.exports.finished = CustomStream.finished
-module.exports.destroy = CustomStream.destroy
-module.exports.destroy = originalDestroy
-module.exports.pipeline = CustomStream.pipeline
-module.exports.compose = CustomStream.compose
-Object.defineProperty(CustomStream, 'promises', {
- configurable: true,
- enumerable: true,
- get() {
- return promises
- }
-})
-module.exports.Stream = CustomStream.Stream
-
-// Allow default importing
-module.exports.default = module.exports
-
-},{"../stream":75,"../stream/promises":76}],72:[function(require,module,exports){
-'use strict'
-
-const { format, inspect, AggregateError: CustomAggregateError } = require('./util')
-
-/*
- This file is a reduced and adapted version of the main lib/internal/errors.js file defined at
-
- https://github.com/nodejs/node/blob/master/lib/internal/errors.js
-
- Don't try to replace with the original file and keep it up to date (starting from E(...) definitions)
- with the upstream file.
-*/
-
-const AggregateError = globalThis.AggregateError || CustomAggregateError
-const kIsNodeError = Symbol('kIsNodeError')
-const kTypes = [
- 'string',
- 'function',
- 'number',
- 'object',
- // Accept 'Function' and 'Object' as alternative to the lower cased version.
- 'Function',
- 'Object',
- 'boolean',
- 'bigint',
- 'symbol'
-]
-const classRegExp = /^([A-Z][a-z0-9]*)+$/
-const nodeInternalPrefix = '__node_internal_'
-const codes = {}
-function assert(value, message) {
- if (!value) {
- throw new codes.ERR_INTERNAL_ASSERTION(message)
- }
-}
-
-// Only use this for integers! Decimal numbers do not work with this function.
-function addNumericalSeparator(val) {
- let res = ''
- let i = val.length
- const start = val[0] === '-' ? 1 : 0
- for (; i >= start + 4; i -= 3) {
- res = `_${val.slice(i - 3, i)}${res}`
- }
- return `${val.slice(0, i)}${res}`
-}
-function getMessage(key, msg, args) {
- if (typeof msg === 'function') {
- assert(
- msg.length <= args.length,
- // Default options do not count.
- `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${msg.length}).`
- )
- return msg(...args)
- }
- const expectedLength = (msg.match(/%[dfijoOs]/g) || []).length
- assert(
- expectedLength === args.length,
- `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${expectedLength}).`
- )
- if (args.length === 0) {
- return msg
- }
- return format(msg, ...args)
-}
-function E(code, message, Base) {
- if (!Base) {
- Base = Error
- }
- class NodeError extends Base {
- constructor(...args) {
- super(getMessage(code, message, args))
- }
- toString() {
- return `${this.name} [${code}]: ${this.message}`
- }
- }
- Object.defineProperties(NodeError.prototype, {
- name: {
- value: Base.name,
- writable: true,
- enumerable: false,
- configurable: true
- },
- toString: {
- value() {
- return `${this.name} [${code}]: ${this.message}`
- },
- writable: true,
- enumerable: false,
- configurable: true
- }
- })
- NodeError.prototype.code = code
- NodeError.prototype[kIsNodeError] = true
- codes[code] = NodeError
-}
-function hideStackFrames(fn) {
- // We rename the functions that will be hidden to cut off the stacktrace
- // at the outermost one
- const hidden = nodeInternalPrefix + fn.name
- Object.defineProperty(fn, 'name', {
- value: hidden
- })
- return fn
-}
-function aggregateTwoErrors(innerError, outerError) {
- if (innerError && outerError && innerError !== outerError) {
- if (Array.isArray(outerError.errors)) {
- // If `outerError` is already an `AggregateError`.
- outerError.errors.push(innerError)
- return outerError
- }
- const err = new AggregateError([outerError, innerError], outerError.message)
- err.code = outerError.code
- return err
- }
- return innerError || outerError
-}
-class AbortError extends Error {
- constructor(message = 'The operation was aborted', options = undefined) {
- if (options !== undefined && typeof options !== 'object') {
- throw new codes.ERR_INVALID_ARG_TYPE('options', 'Object', options)
- }
- super(message, options)
- this.code = 'ABORT_ERR'
- this.name = 'AbortError'
- }
-}
-E('ERR_ASSERTION', '%s', Error)
-E(
- 'ERR_INVALID_ARG_TYPE',
- (name, expected, actual) => {
- assert(typeof name === 'string', "'name' must be a string")
- if (!Array.isArray(expected)) {
- expected = [expected]
- }
- let msg = 'The '
- if (name.endsWith(' argument')) {
- // For cases like 'first argument'
- msg += `${name} `
- } else {
- msg += `"${name}" ${name.includes('.') ? 'property' : 'argument'} `
- }
- msg += 'must be '
- const types = []
- const instances = []
- const other = []
- for (const value of expected) {
- assert(typeof value === 'string', 'All expected entries have to be of type string')
- if (kTypes.includes(value)) {
- types.push(value.toLowerCase())
- } else if (classRegExp.test(value)) {
- instances.push(value)
- } else {
- assert(value !== 'object', 'The value "object" should be written as "Object"')
- other.push(value)
- }
- }
-
- // Special handle `object` in case other instances are allowed to outline
- // the differences between each other.
- if (instances.length > 0) {
- const pos = types.indexOf('object')
- if (pos !== -1) {
- types.splice(types, pos, 1)
- instances.push('Object')
- }
- }
- if (types.length > 0) {
- switch (types.length) {
- case 1:
- msg += `of type ${types[0]}`
- break
- case 2:
- msg += `one of type ${types[0]} or ${types[1]}`
- break
- default: {
- const last = types.pop()
- msg += `one of type ${types.join(', ')}, or ${last}`
- }
- }
- if (instances.length > 0 || other.length > 0) {
- msg += ' or '
- }
- }
- if (instances.length > 0) {
- switch (instances.length) {
- case 1:
- msg += `an instance of ${instances[0]}`
- break
- case 2:
- msg += `an instance of ${instances[0]} or ${instances[1]}`
- break
- default: {
- const last = instances.pop()
- msg += `an instance of ${instances.join(', ')}, or ${last}`
- }
- }
- if (other.length > 0) {
- msg += ' or '
- }
- }
- switch (other.length) {
- case 0:
- break
- case 1:
- if (other[0].toLowerCase() !== other[0]) {
- msg += 'an '
- }
- msg += `${other[0]}`
- break
- case 2:
- msg += `one of ${other[0]} or ${other[1]}`
- break
- default: {
- const last = other.pop()
- msg += `one of ${other.join(', ')}, or ${last}`
- }
- }
- if (actual == null) {
- msg += `. Received ${actual}`
- } else if (typeof actual === 'function' && actual.name) {
- msg += `. Received function ${actual.name}`
- } else if (typeof actual === 'object') {
- var _actual$constructor
- if (
- (_actual$constructor = actual.constructor) !== null &&
- _actual$constructor !== undefined &&
- _actual$constructor.name
- ) {
- msg += `. Received an instance of ${actual.constructor.name}`
- } else {
- const inspected = inspect(actual, {
- depth: -1
- })
- msg += `. Received ${inspected}`
- }
- } else {
- let inspected = inspect(actual, {
- colors: false
- })
- if (inspected.length > 25) {
- inspected = `${inspected.slice(0, 25)}...`
- }
- msg += `. Received type ${typeof actual} (${inspected})`
- }
- return msg
- },
- TypeError
-)
-E(
- 'ERR_INVALID_ARG_VALUE',
- (name, value, reason = 'is invalid') => {
- let inspected = inspect(value)
- if (inspected.length > 128) {
- inspected = inspected.slice(0, 128) + '...'
- }
- const type = name.includes('.') ? 'property' : 'argument'
- return `The ${type} '${name}' ${reason}. Received ${inspected}`
- },
- TypeError
-)
-E(
- 'ERR_INVALID_RETURN_VALUE',
- (input, name, value) => {
- var _value$constructor
- const type =
- value !== null &&
- value !== undefined &&
- (_value$constructor = value.constructor) !== null &&
- _value$constructor !== undefined &&
- _value$constructor.name
- ? `instance of ${value.constructor.name}`
- : `type ${typeof value}`
- return `Expected ${input} to be returned from the "${name}"` + ` function but got ${type}.`
- },
- TypeError
-)
-E(
- 'ERR_MISSING_ARGS',
- (...args) => {
- assert(args.length > 0, 'At least one arg needs to be specified')
- let msg
- const len = args.length
- args = (Array.isArray(args) ? args : [args]).map((a) => `"${a}"`).join(' or ')
- switch (len) {
- case 1:
- msg += `The ${args[0]} argument`
- break
- case 2:
- msg += `The ${args[0]} and ${args[1]} arguments`
- break
- default:
- {
- const last = args.pop()
- msg += `The ${args.join(', ')}, and ${last} arguments`
- }
- break
- }
- return `${msg} must be specified`
- },
- TypeError
-)
-E(
- 'ERR_OUT_OF_RANGE',
- (str, range, input) => {
- assert(range, 'Missing "range" argument')
- let received
- if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {
- received = addNumericalSeparator(String(input))
- } else if (typeof input === 'bigint') {
- received = String(input)
- if (input > 2n ** 32n || input < -(2n ** 32n)) {
- received = addNumericalSeparator(received)
- }
- received += 'n'
- } else {
- received = inspect(input)
- }
- return `The value of "${str}" is out of range. It must be ${range}. Received ${received}`
- },
- RangeError
-)
-E('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times', Error)
-E('ERR_METHOD_NOT_IMPLEMENTED', 'The %s method is not implemented', Error)
-E('ERR_STREAM_ALREADY_FINISHED', 'Cannot call %s after a stream was finished', Error)
-E('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable', Error)
-E('ERR_STREAM_DESTROYED', 'Cannot call %s after a stream was destroyed', Error)
-E('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError)
-E('ERR_STREAM_PREMATURE_CLOSE', 'Premature close', Error)
-E('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF', Error)
-E('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event', Error)
-E('ERR_STREAM_WRITE_AFTER_END', 'write after end', Error)
-E('ERR_UNKNOWN_ENCODING', 'Unknown encoding: %s', TypeError)
-module.exports = {
- AbortError,
- aggregateTwoErrors: hideStackFrames(aggregateTwoErrors),
- hideStackFrames,
- codes
-}
-
-},{"./util":74}],73:[function(require,module,exports){
-'use strict'
-
-/*
- This file is a reduced and adapted version of the main lib/internal/per_context/primordials.js file defined at
-
- https://github.com/nodejs/node/blob/master/lib/internal/per_context/primordials.js
-
- Don't try to replace with the original file and keep it up to date with the upstream file.
-*/
-module.exports = {
- ArrayIsArray(self) {
- return Array.isArray(self)
- },
- ArrayPrototypeIncludes(self, el) {
- return self.includes(el)
- },
- ArrayPrototypeIndexOf(self, el) {
- return self.indexOf(el)
- },
- ArrayPrototypeJoin(self, sep) {
- return self.join(sep)
- },
- ArrayPrototypeMap(self, fn) {
- return self.map(fn)
- },
- ArrayPrototypePop(self, el) {
- return self.pop(el)
- },
- ArrayPrototypePush(self, el) {
- return self.push(el)
- },
- ArrayPrototypeSlice(self, start, end) {
- return self.slice(start, end)
- },
- Error,
- FunctionPrototypeCall(fn, thisArgs, ...args) {
- return fn.call(thisArgs, ...args)
- },
- FunctionPrototypeSymbolHasInstance(self, instance) {
- return Function.prototype[Symbol.hasInstance].call(self, instance)
- },
- MathFloor: Math.floor,
- Number,
- NumberIsInteger: Number.isInteger,
- NumberIsNaN: Number.isNaN,
- NumberMAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER,
- NumberMIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER,
- NumberParseInt: Number.parseInt,
- ObjectDefineProperties(self, props) {
- return Object.defineProperties(self, props)
- },
- ObjectDefineProperty(self, name, prop) {
- return Object.defineProperty(self, name, prop)
- },
- ObjectGetOwnPropertyDescriptor(self, name) {
- return Object.getOwnPropertyDescriptor(self, name)
- },
- ObjectKeys(obj) {
- return Object.keys(obj)
- },
- ObjectSetPrototypeOf(target, proto) {
- return Object.setPrototypeOf(target, proto)
- },
- Promise,
- PromisePrototypeCatch(self, fn) {
- return self.catch(fn)
- },
- PromisePrototypeThen(self, thenFn, catchFn) {
- return self.then(thenFn, catchFn)
- },
- PromiseReject(err) {
- return Promise.reject(err)
- },
- PromiseResolve(val) {
- return Promise.resolve(val)
- },
- ReflectApply: Reflect.apply,
- RegExpPrototypeTest(self, value) {
- return self.test(value)
- },
- SafeSet: Set,
- String,
- StringPrototypeSlice(self, start, end) {
- return self.slice(start, end)
- },
- StringPrototypeToLowerCase(self) {
- return self.toLowerCase()
- },
- StringPrototypeToUpperCase(self) {
- return self.toUpperCase()
- },
- StringPrototypeTrim(self) {
- return self.trim()
- },
- Symbol,
- SymbolFor: Symbol.for,
- SymbolAsyncIterator: Symbol.asyncIterator,
- SymbolHasInstance: Symbol.hasInstance,
- SymbolIterator: Symbol.iterator,
- SymbolDispose: Symbol.dispose || Symbol('Symbol.dispose'),
- SymbolAsyncDispose: Symbol.asyncDispose || Symbol('Symbol.asyncDispose'),
- TypedArrayPrototypeSet(self, buf, len) {
- return self.set(buf, len)
- },
- Boolean: Boolean,
- Uint8Array
-}
-
-},{}],74:[function(require,module,exports){
-'use strict'
-
-const bufferModule = require('buffer')
-const { kResistStopPropagation, SymbolDispose } = require('./primordials')
-const AbortSignal = globalThis.AbortSignal || require('abort-controller').AbortSignal
-const AbortController = globalThis.AbortController || require('abort-controller').AbortController
-const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor
-const Blob = globalThis.Blob || bufferModule.Blob
-/* eslint-disable indent */
-const isBlob =
- typeof Blob !== 'undefined'
- ? function isBlob(b) {
- // eslint-disable-next-line indent
- return b instanceof Blob
- }
- : function isBlob(b) {
- return false
- }
-/* eslint-enable indent */
-
-const validateAbortSignal = (signal, name) => {
- if (signal !== undefined && (signal === null || typeof signal !== 'object' || !('aborted' in signal))) {
- throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)
- }
-}
-const validateFunction = (value, name) => {
- if (typeof value !== 'function') throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)
-}
-
-// This is a simplified version of AggregateError
-class AggregateError extends Error {
- constructor(errors) {
- if (!Array.isArray(errors)) {
- throw new TypeError(`Expected input to be an Array, got ${typeof errors}`)
- }
- let message = ''
- for (let i = 0; i < errors.length; i++) {
- message += ` ${errors[i].stack}\n`
- }
- super(message)
- this.name = 'AggregateError'
- this.errors = errors
- }
-}
-module.exports = {
- AggregateError,
- kEmptyObject: Object.freeze({}),
- once(callback) {
- let called = false
- return function (...args) {
- if (called) {
- return
- }
- called = true
- callback.apply(this, args)
- }
- },
- createDeferredPromise: function () {
- let resolve
- let reject
-
- // eslint-disable-next-line promise/param-names
- const promise = new Promise((res, rej) => {
- resolve = res
- reject = rej
- })
- return {
- promise,
- resolve,
- reject
- }
- },
- promisify(fn) {
- return new Promise((resolve, reject) => {
- fn((err, ...args) => {
- if (err) {
- return reject(err)
- }
- return resolve(...args)
- })
- })
- },
- debuglog() {
- return function () {}
- },
- format(format, ...args) {
- // Simplified version of https://nodejs.org/api/util.html#utilformatformat-args
- return format.replace(/%([sdifj])/g, function (...[_unused, type]) {
- const replacement = args.shift()
- if (type === 'f') {
- return replacement.toFixed(6)
- } else if (type === 'j') {
- return JSON.stringify(replacement)
- } else if (type === 's' && typeof replacement === 'object') {
- const ctor = replacement.constructor !== Object ? replacement.constructor.name : ''
- return `${ctor} {}`.trim()
- } else {
- return replacement.toString()
- }
- })
- },
- inspect(value) {
- // Vastly simplified version of https://nodejs.org/api/util.html#utilinspectobject-options
- switch (typeof value) {
- case 'string':
- if (value.includes("'")) {
- if (!value.includes('"')) {
- return `"${value}"`
- } else if (!value.includes('`') && !value.includes('${')) {
- return `\`${value}\``
- }
- }
- return `'${value}'`
- case 'number':
- if (isNaN(value)) {
- return 'NaN'
- } else if (Object.is(value, -0)) {
- return String(value)
- }
- return value
- case 'bigint':
- return `${String(value)}n`
- case 'boolean':
- case 'undefined':
- return String(value)
- case 'object':
- return '{}'
- }
- },
- types: {
- isAsyncFunction(fn) {
- return fn instanceof AsyncFunction
- },
- isArrayBufferView(arr) {
- return ArrayBuffer.isView(arr)
- }
- },
- isBlob,
- deprecate(fn, message) {
- return fn
- },
- addAbortListener:
- require('events').addAbortListener ||
- function addAbortListener(signal, listener) {
- if (signal === undefined) {
- throw new ERR_INVALID_ARG_TYPE('signal', 'AbortSignal', signal)
- }
- validateAbortSignal(signal, 'signal')
- validateFunction(listener, 'listener')
- let removeEventListener
- if (signal.aborted) {
- queueMicrotask(() => listener())
- } else {
- signal.addEventListener('abort', listener, {
- __proto__: null,
- once: true,
- [kResistStopPropagation]: true
- })
- removeEventListener = () => {
- signal.removeEventListener('abort', listener)
- }
- }
- return {
- __proto__: null,
- [SymbolDispose]() {
- var _removeEventListener
- ;(_removeEventListener = removeEventListener) === null || _removeEventListener === undefined
- ? undefined
- : _removeEventListener()
- }
- }
- },
- AbortSignalAny:
- AbortSignal.any ||
- function AbortSignalAny(signals) {
- // Fast path if there is only one signal.
- if (signals.length === 1) {
- return signals[0]
- }
- const ac = new AbortController()
- const abort = () => ac.abort()
- signals.forEach((signal) => {
- validateAbortSignal(signal, 'signals')
- signal.addEventListener('abort', abort, {
- once: true
- })
- })
- ac.signal.addEventListener(
- 'abort',
- () => {
- signals.forEach((signal) => signal.removeEventListener('abort', abort))
- },
- {
- once: true
- }
- )
- return ac.signal
- }
-}
-module.exports.promisify.custom = Symbol.for('nodejs.util.promisify.custom')
-
-},{"./primordials":73,"abort-controller":34,"buffer":38,"events":51}],75:[function(require,module,exports){
-/* replacement start */
-
-const { Buffer } = require('buffer')
-
-/* replacement end */
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-;('use strict')
-const { ObjectDefineProperty, ObjectKeys, ReflectApply } = require('./ours/primordials')
-const {
- promisify: { custom: customPromisify }
-} = require('./ours/util')
-const { streamReturningOperators, promiseReturningOperators } = require('./internal/streams/operators')
-const {
- codes: { ERR_ILLEGAL_CONSTRUCTOR }
-} = require('./ours/errors')
-const compose = require('./internal/streams/compose')
-const { setDefaultHighWaterMark, getDefaultHighWaterMark } = require('./internal/streams/state')
-const { pipeline } = require('./internal/streams/pipeline')
-const { destroyer } = require('./internal/streams/destroy')
-const eos = require('./internal/streams/end-of-stream')
-const internalBuffer = {}
-const promises = require('./stream/promises')
-const utils = require('./internal/streams/utils')
-const Stream = (module.exports = require('./internal/streams/legacy').Stream)
-Stream.isDestroyed = utils.isDestroyed
-Stream.isDisturbed = utils.isDisturbed
-Stream.isErrored = utils.isErrored
-Stream.isReadable = utils.isReadable
-Stream.isWritable = utils.isWritable
-Stream.Readable = require('./internal/streams/readable')
-for (const key of ObjectKeys(streamReturningOperators)) {
- const op = streamReturningOperators[key]
- function fn(...args) {
- if (new.target) {
- throw ERR_ILLEGAL_CONSTRUCTOR()
- }
- return Stream.Readable.from(ReflectApply(op, this, args))
- }
- ObjectDefineProperty(fn, 'name', {
- __proto__: null,
- value: op.name
- })
- ObjectDefineProperty(fn, 'length', {
- __proto__: null,
- value: op.length
- })
- ObjectDefineProperty(Stream.Readable.prototype, key, {
- __proto__: null,
- value: fn,
- enumerable: false,
- configurable: true,
- writable: true
- })
-}
-for (const key of ObjectKeys(promiseReturningOperators)) {
- const op = promiseReturningOperators[key]
- function fn(...args) {
- if (new.target) {
- throw ERR_ILLEGAL_CONSTRUCTOR()
- }
- return ReflectApply(op, this, args)
- }
- ObjectDefineProperty(fn, 'name', {
- __proto__: null,
- value: op.name
- })
- ObjectDefineProperty(fn, 'length', {
- __proto__: null,
- value: op.length
- })
- ObjectDefineProperty(Stream.Readable.prototype, key, {
- __proto__: null,
- value: fn,
- enumerable: false,
- configurable: true,
- writable: true
- })
-}
-Stream.Writable = require('./internal/streams/writable')
-Stream.Duplex = require('./internal/streams/duplex')
-Stream.Transform = require('./internal/streams/transform')
-Stream.PassThrough = require('./internal/streams/passthrough')
-Stream.pipeline = pipeline
-const { addAbortSignal } = require('./internal/streams/add-abort-signal')
-Stream.addAbortSignal = addAbortSignal
-Stream.finished = eos
-Stream.destroy = destroyer
-Stream.compose = compose
-Stream.setDefaultHighWaterMark = setDefaultHighWaterMark
-Stream.getDefaultHighWaterMark = getDefaultHighWaterMark
-ObjectDefineProperty(Stream, 'promises', {
- __proto__: null,
- configurable: true,
- enumerable: true,
- get() {
- return promises
- }
-})
-ObjectDefineProperty(pipeline, customPromisify, {
- __proto__: null,
- enumerable: true,
- get() {
- return promises.pipeline
- }
-})
-ObjectDefineProperty(eos, customPromisify, {
- __proto__: null,
- enumerable: true,
- get() {
- return promises.finished
- }
-})
-
-// Backwards-compat with node 0.4.x
-Stream.Stream = Stream
-Stream._isUint8Array = function isUint8Array(value) {
- return value instanceof Uint8Array
-}
-Stream._uint8ArrayToBuffer = function _uint8ArrayToBuffer(chunk) {
- return Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength)
-}
-
-},{"./internal/streams/add-abort-signal":53,"./internal/streams/compose":55,"./internal/streams/destroy":56,"./internal/streams/duplex":57,"./internal/streams/end-of-stream":59,"./internal/streams/legacy":61,"./internal/streams/operators":62,"./internal/streams/passthrough":63,"./internal/streams/pipeline":64,"./internal/streams/readable":65,"./internal/streams/state":66,"./internal/streams/transform":67,"./internal/streams/utils":68,"./internal/streams/writable":69,"./ours/errors":72,"./ours/primordials":73,"./ours/util":74,"./stream/promises":76,"buffer":38}],76:[function(require,module,exports){
-'use strict'
-
-const { ArrayPrototypePop, Promise } = require('../ours/primordials')
-const { isIterable, isNodeStream, isWebStream } = require('../internal/streams/utils')
-const { pipelineImpl: pl } = require('../internal/streams/pipeline')
-const { finished } = require('../internal/streams/end-of-stream')
-require('../../lib/stream.js')
-function pipeline(...streams) {
- return new Promise((resolve, reject) => {
- let signal
- let end
- const lastArg = streams[streams.length - 1]
- if (
- lastArg &&
- typeof lastArg === 'object' &&
- !isNodeStream(lastArg) &&
- !isIterable(lastArg) &&
- !isWebStream(lastArg)
- ) {
- const options = ArrayPrototypePop(streams)
- signal = options.signal
- end = options.end
- }
- pl(
- streams,
- (err, value) => {
- if (err) {
- reject(err)
- } else {
- resolve(value)
- }
- },
- {
- signal,
- end
- }
- )
- })
-}
-module.exports = {
- finished,
- pipeline
-}
-
-},{"../../lib/stream.js":75,"../internal/streams/end-of-stream":59,"../internal/streams/pipeline":64,"../internal/streams/utils":68,"../ours/primordials":73}],77:[function(require,module,exports){
-'use strict';
-
-var isArray = Array.isArray;
-var keyList = Object.keys;
-var hasProp = Object.prototype.hasOwnProperty;
-
-module.exports = function equal(a, b) {
- if (a === b) return true;
-
- if (a && b && typeof a == 'object' && typeof b == 'object') {
- var arrA = isArray(a)
- , arrB = isArray(b)
- , i
- , length
- , key;
-
- if (arrA && arrB) {
- length = a.length;
- if (length != b.length) return false;
- for (i = length; i-- !== 0;)
- if (!equal(a[i], b[i])) return false;
- return true;
- }
-
- if (arrA != arrB) return false;
-
- var dateA = a instanceof Date
- , dateB = b instanceof Date;
- if (dateA != dateB) return false;
- if (dateA && dateB) return a.getTime() == b.getTime();
-
- var regexpA = a instanceof RegExp
- , regexpB = b instanceof RegExp;
- if (regexpA != regexpB) return false;
- if (regexpA && regexpB) return a.toString() == b.toString();
-
- var keys = keyList(a);
- length = keys.length;
-
- if (length !== keyList(b).length)
- return false;
-
- for (i = length; i-- !== 0;)
- if (!hasProp.call(b, keys[i])) return false;
-
- for (i = length; i-- !== 0;) {
- key = keys[i];
- if (!equal(a[key], b[key])) return false;
- }
-
- return true;
- }
-
- return a!==a && b!==b;
-};
-
-},{}],78:[function(require,module,exports){
-module.exports = stringify
-stringify.default = stringify
-stringify.stable = deterministicStringify
-stringify.stableStringify = deterministicStringify
-
-var arr = []
-var replacerStack = []
-
-// Regular stringify
-function stringify (obj, replacer, spacer) {
- decirc(obj, '', [], undefined)
- var res
- if (replacerStack.length === 0) {
- res = JSON.stringify(obj, replacer, spacer)
- } else {
- res = JSON.stringify(obj, replaceGetterValues(replacer), spacer)
- }
- while (arr.length !== 0) {
- var part = arr.pop()
- if (part.length === 4) {
- Object.defineProperty(part[0], part[1], part[3])
- } else {
- part[0][part[1]] = part[2]
- }
- }
- return res
-}
-function decirc (val, k, stack, parent) {
- var i
- if (typeof val === 'object' && val !== null) {
- for (i = 0; i < stack.length; i++) {
- if (stack[i] === val) {
- var propertyDescriptor = Object.getOwnPropertyDescriptor(parent, k)
- if (propertyDescriptor.get !== undefined) {
- if (propertyDescriptor.configurable) {
- Object.defineProperty(parent, k, { value: '[Circular]' })
- arr.push([parent, k, val, propertyDescriptor])
- } else {
- replacerStack.push([val, k])
- }
- } else {
- parent[k] = '[Circular]'
- arr.push([parent, k, val])
- }
- return
- }
- }
- stack.push(val)
- // Optimize for Arrays. Big arrays could kill the performance otherwise!
- if (Array.isArray(val)) {
- for (i = 0; i < val.length; i++) {
- decirc(val[i], i, stack, val)
- }
- } else {
- var keys = Object.keys(val)
- for (i = 0; i < keys.length; i++) {
- var key = keys[i]
- decirc(val[key], key, stack, val)
- }
- }
- stack.pop()
- }
-}
-
-// Stable-stringify
-function compareFunction (a, b) {
- if (a < b) {
- return -1
- }
- if (a > b) {
- return 1
- }
- return 0
-}
-
-function deterministicStringify (obj, replacer, spacer) {
- var tmp = deterministicDecirc(obj, '', [], undefined) || obj
- var res
- if (replacerStack.length === 0) {
- res = JSON.stringify(tmp, replacer, spacer)
- } else {
- res = JSON.stringify(tmp, replaceGetterValues(replacer), spacer)
- }
- while (arr.length !== 0) {
- var part = arr.pop()
- if (part.length === 4) {
- Object.defineProperty(part[0], part[1], part[3])
- } else {
- part[0][part[1]] = part[2]
- }
- }
- return res
-}
-
-function deterministicDecirc (val, k, stack, parent) {
- var i
- if (typeof val === 'object' && val !== null) {
- for (i = 0; i < stack.length; i++) {
- if (stack[i] === val) {
- var propertyDescriptor = Object.getOwnPropertyDescriptor(parent, k)
- if (propertyDescriptor.get !== undefined) {
- if (propertyDescriptor.configurable) {
- Object.defineProperty(parent, k, { value: '[Circular]' })
- arr.push([parent, k, val, propertyDescriptor])
- } else {
- replacerStack.push([val, k])
- }
- } else {
- parent[k] = '[Circular]'
- arr.push([parent, k, val])
- }
- return
- }
- }
- if (typeof val.toJSON === 'function') {
- return
- }
- stack.push(val)
- // Optimize for Arrays. Big arrays could kill the performance otherwise!
- if (Array.isArray(val)) {
- for (i = 0; i < val.length; i++) {
- deterministicDecirc(val[i], i, stack, val)
- }
- } else {
- // Create a temporary object in the required way
- var tmp = {}
- var keys = Object.keys(val).sort(compareFunction)
- for (i = 0; i < keys.length; i++) {
- var key = keys[i]
- deterministicDecirc(val[key], key, stack, val)
- tmp[key] = val[key]
- }
- if (parent !== undefined) {
- arr.push([parent, k, val])
- parent[k] = tmp
- } else {
- return tmp
- }
- }
- stack.pop()
- }
-}
-
-// wraps replacer function to handle values we couldn't replace
-// and mark them as [Circular]
-function replaceGetterValues (replacer) {
- replacer = replacer !== undefined ? replacer : function (k, v) { return v }
- return function (key, val) {
- if (replacerStack.length > 0) {
- for (var i = 0; i < replacerStack.length; i++) {
- var part = replacerStack[i]
- if (part[1] === key && part[0] === val) {
- val = '[Circular]'
- replacerStack.splice(i, 1)
- break
- }
- }
- }
- return replacer.call(this, key, val)
- }
-}
-
-},{}],79:[function(require,module,exports){
-/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */
-exports.read = function (buffer, offset, isLE, mLen, nBytes) {
- var e, m
- var eLen = (nBytes * 8) - mLen - 1
- var eMax = (1 << eLen) - 1
- var eBias = eMax >> 1
- var nBits = -7
- var i = isLE ? (nBytes - 1) : 0
- var d = isLE ? -1 : 1
- var s = buffer[offset + i]
-
- i += d
-
- e = s & ((1 << (-nBits)) - 1)
- s >>= (-nBits)
- nBits += eLen
- for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
-
- m = e & ((1 << (-nBits)) - 1)
- e >>= (-nBits)
- nBits += mLen
- for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
-
- if (e === 0) {
- e = 1 - eBias
- } else if (e === eMax) {
- return m ? NaN : ((s ? -1 : 1) * Infinity)
- } else {
- m = m + Math.pow(2, mLen)
- e = e - eBias
- }
- return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
-}
-
-exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
- var e, m, c
- var eLen = (nBytes * 8) - mLen - 1
- var eMax = (1 << eLen) - 1
- var eBias = eMax >> 1
- var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
- var i = isLE ? 0 : (nBytes - 1)
- var d = isLE ? 1 : -1
- var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
-
- value = Math.abs(value)
-
- if (isNaN(value) || value === Infinity) {
- m = isNaN(value) ? 1 : 0
- e = eMax
- } else {
- e = Math.floor(Math.log(value) / Math.LN2)
- if (value * (c = Math.pow(2, -e)) < 1) {
- e--
- c *= 2
- }
- if (e + eBias >= 1) {
- value += rt / c
- } else {
- value += rt * Math.pow(2, 1 - eBias)
- }
- if (value * c >= 2) {
- e++
- c /= 2
- }
-
- if (e + eBias >= eMax) {
- m = 0
- e = eMax
- } else if (e + eBias >= 1) {
- m = ((value * c) - 1) * Math.pow(2, mLen)
- e = e + eBias
- } else {
- m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
- e = 0
- }
- }
-
- for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
-
- e = (e << mLen) | m
- eLen += mLen
- for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
-
- buffer[offset + i - d] |= s * 128
-}
-
-},{}],80:[function(require,module,exports){
-if (typeof Object.create === 'function') {
- // implementation from standard node.js 'util' module
- module.exports = function inherits(ctor, superCtor) {
- ctor.super_ = superCtor
- ctor.prototype = Object.create(superCtor.prototype, {
- constructor: {
- value: ctor,
- enumerable: false,
- writable: true,
- configurable: true
- }
- });
- };
-} else {
- // old school shim for old browsers
- module.exports = function inherits(ctor, superCtor) {
- ctor.super_ = superCtor
- var TempCtor = function () {}
- TempCtor.prototype = superCtor.prototype
- ctor.prototype = new TempCtor()
- ctor.prototype.constructor = ctor
- }
-}
-
-},{}],81:[function(require,module,exports){
-/*!
- * Determine if an object is a Buffer
- *
- * @author Feross Aboukhadijeh
- * @license MIT
- */
-
-// The _isBuffer check is for Safari 5-7 support, because it's missing
-// Object.prototype.constructor. Remove this eventually
-module.exports = function (obj) {
- return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
-}
-
-function isBuffer (obj) {
- return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
-}
-
-// For Node v0.10 support. Remove this eventually.
-function isSlowBuffer (obj) {
- return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
-}
-
-},{}],82:[function(require,module,exports){
-'use strict';
-var toString = Object.prototype.toString;
-
-module.exports = function (x) {
- return toString.call(x) === '[object Function]';
-};
-
-},{}],83:[function(require,module,exports){
-/**
- * Returns a `Boolean` on whether or not the a `String` starts with '0x'
- * @param {String} str the string input value
- * @return {Boolean} a boolean if it is or is not hex prefixed
- * @throws if the str input is not a string
- */
-module.exports = function isHexPrefixed(str) {
- if (typeof str !== 'string') {
- throw new Error("[is-hex-prefixed] value must be type 'string', is currently type " + (typeof str) + ", while checking isHexPrefixed.");
- }
-
- return str.slice(0, 2) === '0x';
-}
-
-},{}],84:[function(require,module,exports){
-'use strict';
-
-const isStream = stream =>
- stream !== null &&
- typeof stream === 'object' &&
- typeof stream.pipe === 'function';
-
-isStream.writable = stream =>
- isStream(stream) &&
- stream.writable !== false &&
- typeof stream._write === 'function' &&
- typeof stream._writableState === 'object';
-
-isStream.readable = stream =>
- isStream(stream) &&
- stream.readable !== false &&
- typeof stream._read === 'function' &&
- typeof stream._readableState === 'object';
-
-isStream.duplex = stream =>
- isStream.writable(stream) &&
- isStream.readable(stream);
-
-isStream.transform = stream =>
- isStream.duplex(stream) &&
- typeof stream._transform === 'function' &&
- typeof stream._transformState === 'object';
-
-module.exports = isStream;
-
-},{}],85:[function(require,module,exports){
-var toString = {}.toString;
-
-module.exports = Array.isArray || function (arr) {
- return toString.call(arr) == '[object Array]';
-};
-
-},{}],86:[function(require,module,exports){
-(function (process,global){(function (){
-/**
- * [js-sha3]{@link https://github.com/emn178/js-sha3}
- *
- * @version 0.5.5
- * @author Chen, Yi-Cyuan [emn178@gmail.com]
- * @copyright Chen, Yi-Cyuan 2015-2016
- * @license MIT
- */
-(function (root) {
- 'use strict';
-
- var NODE_JS = typeof process == 'object' && process.versions && process.versions.node;
- if (NODE_JS) {
- root = global;
- }
- var COMMON_JS = !root.JS_SHA3_TEST && typeof module == 'object' && module.exports;
- var HEX_CHARS = '0123456789abcdef'.split('');
- var SHAKE_PADDING = [31, 7936, 2031616, 520093696];
- var KECCAK_PADDING = [1, 256, 65536, 16777216];
- var PADDING = [6, 1536, 393216, 100663296];
- var SHIFT = [0, 8, 16, 24];
- var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649,
- 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0,
- 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771,
- 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648,
- 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];
- var BITS = [224, 256, 384, 512];
- var SHAKE_BITS = [128, 256];
- var OUTPUT_TYPES = ['hex', 'buffer', 'arrayBuffer', 'array'];
-
- var createOutputMethod = function (bits, padding, outputType) {
- return function (message) {
- return new Keccak(bits, padding, bits).update(message)[outputType]();
- }
- };
-
- var createShakeOutputMethod = function (bits, padding, outputType) {
- return function (message, outputBits) {
- return new Keccak(bits, padding, outputBits).update(message)[outputType]();
- }
- };
-
- var createMethod = function (bits, padding) {
- var method = createOutputMethod(bits, padding, 'hex');
- method.create = function () {
- return new Keccak(bits, padding, bits);
- };
- method.update = function (message) {
- return method.create().update(message);
- };
- for (var i = 0;i < OUTPUT_TYPES.length;++i) {
- var type = OUTPUT_TYPES[i];
- method[type] = createOutputMethod(bits, padding, type);
- }
- return method;
- };
-
- var createShakeMethod = function (bits, padding) {
- var method = createShakeOutputMethod(bits, padding, 'hex');
- method.create = function (outputBits) {
- return new Keccak(bits, padding, outputBits);
- };
- method.update = function (message, outputBits) {
- return method.create(outputBits).update(message);
- };
- for (var i = 0;i < OUTPUT_TYPES.length;++i) {
- var type = OUTPUT_TYPES[i];
- method[type] = createShakeOutputMethod(bits, padding, type);
- }
- return method;
- };
-
- var algorithms = [
- {name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod},
- {name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod},
- {name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod}
- ];
-
- var methods = {};
-
- for (var i = 0;i < algorithms.length;++i) {
- var algorithm = algorithms[i];
- var bits = algorithm.bits;
- for (var j = 0;j < bits.length;++j) {
- methods[algorithm.name +'_' + bits[j]] = algorithm.createMethod(bits[j], algorithm.padding);
- }
- }
-
- function Keccak(bits, padding, outputBits) {
- this.blocks = [];
- this.s = [];
- this.padding = padding;
- this.outputBits = outputBits;
- this.reset = true;
- this.block = 0;
- this.start = 0;
- this.blockCount = (1600 - (bits << 1)) >> 5;
- this.byteCount = this.blockCount << 2;
- this.outputBlocks = outputBits >> 5;
- this.extraBytes = (outputBits & 31) >> 3;
-
- for (var i = 0;i < 50;++i) {
- this.s[i] = 0;
- }
- };
-
- Keccak.prototype.update = function (message) {
- var notString = typeof message != 'string';
- if (notString && message.constructor == root.ArrayBuffer) {
- message = new Uint8Array(message);
- }
- var length = message.length, blocks = this.blocks, byteCount = this.byteCount,
- blockCount = this.blockCount, index = 0, s = this.s, i, code;
-
- while (index < length) {
- if (this.reset) {
- this.reset = false;
- blocks[0] = this.block;
- for (i = 1;i < blockCount + 1;++i) {
- blocks[i] = 0;
- }
- }
- if (notString) {
- for (i = this.start;index < length && i < byteCount;++index) {
- blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
- }
- } else {
- for (i = this.start;index < length && i < byteCount;++index) {
- code = message.charCodeAt(index);
- if (code < 0x80) {
- blocks[i >> 2] |= code << SHIFT[i++ & 3];
- } else if (code < 0x800) {
- blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
- blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
- } else if (code < 0xd800 || code >= 0xe000) {
- blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
- blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
- blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
- } else {
- code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
- blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
- blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
- blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
- blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
- }
- }
- }
- this.lastByteIndex = i;
- if (i >= byteCount) {
- this.start = i - byteCount;
- this.block = blocks[blockCount];
- for (i = 0;i < blockCount;++i) {
- s[i] ^= blocks[i];
- }
- f(s);
- this.reset = true;
- } else {
- this.start = i;
- }
- }
- return this;
- };
-
- Keccak.prototype.finalize = function () {
- var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s;
- blocks[i >> 2] |= this.padding[i & 3];
- if (this.lastByteIndex == this.byteCount) {
- blocks[0] = blocks[blockCount];
- for (i = 1;i < blockCount + 1;++i) {
- blocks[i] = 0;
- }
- }
- blocks[blockCount - 1] |= 0x80000000;
- for (i = 0;i < blockCount;++i) {
- s[i] ^= blocks[i];
- }
- f(s);
- };
-
- Keccak.prototype.toString = Keccak.prototype.hex = function () {
- this.finalize();
-
- var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
- extraBytes = this.extraBytes, i = 0, j = 0;
- var hex = '', block;
- while (j < outputBlocks) {
- for (i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
- block = s[i];
- hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] +
- HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] +
- HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] +
- HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F];
- }
- if (j % blockCount == 0) {
- f(s);
- i = 0;
- }
- }
- if (extraBytes) {
- block = s[i];
- if (extraBytes > 0) {
- hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F];
- }
- if (extraBytes > 1) {
- hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F];
- }
- if (extraBytes > 2) {
- hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F];
- }
- }
- return hex;
- };
-
- Keccak.prototype.arrayBuffer = function () {
- this.finalize();
-
- var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
- extraBytes = this.extraBytes, i = 0, j = 0;
- var bytes = this.outputBits >> 3;
- var buffer;
- if (extraBytes) {
- buffer = new ArrayBuffer((outputBlocks + 1) << 2);
- } else {
- buffer = new ArrayBuffer(bytes);
- }
- var array = new Uint32Array(buffer);
- while (j < outputBlocks) {
- for (i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
- array[j] = s[i];
- }
- if (j % blockCount == 0) {
- f(s);
- }
- }
- if (extraBytes) {
- array[i] = s[i];
- buffer = buffer.slice(0, bytes);
- }
- return buffer;
- };
-
- Keccak.prototype.buffer = Keccak.prototype.arrayBuffer;
-
- Keccak.prototype.digest = Keccak.prototype.array = function () {
- this.finalize();
-
- var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
- extraBytes = this.extraBytes, i = 0, j = 0;
- var array = [], offset, block;
- while (j < outputBlocks) {
- for (i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
- offset = j << 2;
- block = s[i];
- array[offset] = block & 0xFF;
- array[offset + 1] = (block >> 8) & 0xFF;
- array[offset + 2] = (block >> 16) & 0xFF;
- array[offset + 3] = (block >> 24) & 0xFF;
- }
- if (j % blockCount == 0) {
- f(s);
- }
- }
- if (extraBytes) {
- offset = j << 2;
- block = s[i];
- if (extraBytes > 0) {
- array[offset] = block & 0xFF;
- }
- if (extraBytes > 1) {
- array[offset + 1] = (block >> 8) & 0xFF;
- }
- if (extraBytes > 2) {
- array[offset + 2] = (block >> 16) & 0xFF;
- }
- }
- return array;
- };
-
- var f = function (s) {
- var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9,
- b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17,
- b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33,
- b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49;
- for (n = 0;n < 48;n += 2) {
- c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];
- c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];
- c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];
- c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];
- c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];
- c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];
- c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];
- c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];
- c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];
- c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
-
- h = c8 ^ ((c2 << 1) | (c3 >>> 31));
- l = c9 ^ ((c3 << 1) | (c2 >>> 31));
- s[0] ^= h;
- s[1] ^= l;
- s[10] ^= h;
- s[11] ^= l;
- s[20] ^= h;
- s[21] ^= l;
- s[30] ^= h;
- s[31] ^= l;
- s[40] ^= h;
- s[41] ^= l;
- h = c0 ^ ((c4 << 1) | (c5 >>> 31));
- l = c1 ^ ((c5 << 1) | (c4 >>> 31));
- s[2] ^= h;
- s[3] ^= l;
- s[12] ^= h;
- s[13] ^= l;
- s[22] ^= h;
- s[23] ^= l;
- s[32] ^= h;
- s[33] ^= l;
- s[42] ^= h;
- s[43] ^= l;
- h = c2 ^ ((c6 << 1) | (c7 >>> 31));
- l = c3 ^ ((c7 << 1) | (c6 >>> 31));
- s[4] ^= h;
- s[5] ^= l;
- s[14] ^= h;
- s[15] ^= l;
- s[24] ^= h;
- s[25] ^= l;
- s[34] ^= h;
- s[35] ^= l;
- s[44] ^= h;
- s[45] ^= l;
- h = c4 ^ ((c8 << 1) | (c9 >>> 31));
- l = c5 ^ ((c9 << 1) | (c8 >>> 31));
- s[6] ^= h;
- s[7] ^= l;
- s[16] ^= h;
- s[17] ^= l;
- s[26] ^= h;
- s[27] ^= l;
- s[36] ^= h;
- s[37] ^= l;
- s[46] ^= h;
- s[47] ^= l;
- h = c6 ^ ((c0 << 1) | (c1 >>> 31));
- l = c7 ^ ((c1 << 1) | (c0 >>> 31));
- s[8] ^= h;
- s[9] ^= l;
- s[18] ^= h;
- s[19] ^= l;
- s[28] ^= h;
- s[29] ^= l;
- s[38] ^= h;
- s[39] ^= l;
- s[48] ^= h;
- s[49] ^= l;
-
- b0 = s[0];
- b1 = s[1];
- b32 = (s[11] << 4) | (s[10] >>> 28);
- b33 = (s[10] << 4) | (s[11] >>> 28);
- b14 = (s[20] << 3) | (s[21] >>> 29);
- b15 = (s[21] << 3) | (s[20] >>> 29);
- b46 = (s[31] << 9) | (s[30] >>> 23);
- b47 = (s[30] << 9) | (s[31] >>> 23);
- b28 = (s[40] << 18) | (s[41] >>> 14);
- b29 = (s[41] << 18) | (s[40] >>> 14);
- b20 = (s[2] << 1) | (s[3] >>> 31);
- b21 = (s[3] << 1) | (s[2] >>> 31);
- b2 = (s[13] << 12) | (s[12] >>> 20);
- b3 = (s[12] << 12) | (s[13] >>> 20);
- b34 = (s[22] << 10) | (s[23] >>> 22);
- b35 = (s[23] << 10) | (s[22] >>> 22);
- b16 = (s[33] << 13) | (s[32] >>> 19);
- b17 = (s[32] << 13) | (s[33] >>> 19);
- b48 = (s[42] << 2) | (s[43] >>> 30);
- b49 = (s[43] << 2) | (s[42] >>> 30);
- b40 = (s[5] << 30) | (s[4] >>> 2);
- b41 = (s[4] << 30) | (s[5] >>> 2);
- b22 = (s[14] << 6) | (s[15] >>> 26);
- b23 = (s[15] << 6) | (s[14] >>> 26);
- b4 = (s[25] << 11) | (s[24] >>> 21);
- b5 = (s[24] << 11) | (s[25] >>> 21);
- b36 = (s[34] << 15) | (s[35] >>> 17);
- b37 = (s[35] << 15) | (s[34] >>> 17);
- b18 = (s[45] << 29) | (s[44] >>> 3);
- b19 = (s[44] << 29) | (s[45] >>> 3);
- b10 = (s[6] << 28) | (s[7] >>> 4);
- b11 = (s[7] << 28) | (s[6] >>> 4);
- b42 = (s[17] << 23) | (s[16] >>> 9);
- b43 = (s[16] << 23) | (s[17] >>> 9);
- b24 = (s[26] << 25) | (s[27] >>> 7);
- b25 = (s[27] << 25) | (s[26] >>> 7);
- b6 = (s[36] << 21) | (s[37] >>> 11);
- b7 = (s[37] << 21) | (s[36] >>> 11);
- b38 = (s[47] << 24) | (s[46] >>> 8);
- b39 = (s[46] << 24) | (s[47] >>> 8);
- b30 = (s[8] << 27) | (s[9] >>> 5);
- b31 = (s[9] << 27) | (s[8] >>> 5);
- b12 = (s[18] << 20) | (s[19] >>> 12);
- b13 = (s[19] << 20) | (s[18] >>> 12);
- b44 = (s[29] << 7) | (s[28] >>> 25);
- b45 = (s[28] << 7) | (s[29] >>> 25);
- b26 = (s[38] << 8) | (s[39] >>> 24);
- b27 = (s[39] << 8) | (s[38] >>> 24);
- b8 = (s[48] << 14) | (s[49] >>> 18);
- b9 = (s[49] << 14) | (s[48] >>> 18);
-
- s[0] = b0 ^ (~b2 & b4);
- s[1] = b1 ^ (~b3 & b5);
- s[10] = b10 ^ (~b12 & b14);
- s[11] = b11 ^ (~b13 & b15);
- s[20] = b20 ^ (~b22 & b24);
- s[21] = b21 ^ (~b23 & b25);
- s[30] = b30 ^ (~b32 & b34);
- s[31] = b31 ^ (~b33 & b35);
- s[40] = b40 ^ (~b42 & b44);
- s[41] = b41 ^ (~b43 & b45);
- s[2] = b2 ^ (~b4 & b6);
- s[3] = b3 ^ (~b5 & b7);
- s[12] = b12 ^ (~b14 & b16);
- s[13] = b13 ^ (~b15 & b17);
- s[22] = b22 ^ (~b24 & b26);
- s[23] = b23 ^ (~b25 & b27);
- s[32] = b32 ^ (~b34 & b36);
- s[33] = b33 ^ (~b35 & b37);
- s[42] = b42 ^ (~b44 & b46);
- s[43] = b43 ^ (~b45 & b47);
- s[4] = b4 ^ (~b6 & b8);
- s[5] = b5 ^ (~b7 & b9);
- s[14] = b14 ^ (~b16 & b18);
- s[15] = b15 ^ (~b17 & b19);
- s[24] = b24 ^ (~b26 & b28);
- s[25] = b25 ^ (~b27 & b29);
- s[34] = b34 ^ (~b36 & b38);
- s[35] = b35 ^ (~b37 & b39);
- s[44] = b44 ^ (~b46 & b48);
- s[45] = b45 ^ (~b47 & b49);
- s[6] = b6 ^ (~b8 & b0);
- s[7] = b7 ^ (~b9 & b1);
- s[16] = b16 ^ (~b18 & b10);
- s[17] = b17 ^ (~b19 & b11);
- s[26] = b26 ^ (~b28 & b20);
- s[27] = b27 ^ (~b29 & b21);
- s[36] = b36 ^ (~b38 & b30);
- s[37] = b37 ^ (~b39 & b31);
- s[46] = b46 ^ (~b48 & b40);
- s[47] = b47 ^ (~b49 & b41);
- s[8] = b8 ^ (~b0 & b2);
- s[9] = b9 ^ (~b1 & b3);
- s[18] = b18 ^ (~b10 & b12);
- s[19] = b19 ^ (~b11 & b13);
- s[28] = b28 ^ (~b20 & b22);
- s[29] = b29 ^ (~b21 & b23);
- s[38] = b38 ^ (~b30 & b32);
- s[39] = b39 ^ (~b31 & b33);
- s[48] = b48 ^ (~b40 & b42);
- s[49] = b49 ^ (~b41 & b43);
-
- s[0] ^= RC[n];
- s[1] ^= RC[n + 1];
- }
- }
-
- if (COMMON_JS) {
- module.exports = methods;
- } else if (root) {
- for (var key in methods) {
- root[key] = methods[key];
- }
- }
-}(this));
+// Checks that a user-supplied chunk is valid, especially for the particular
+// mode the stream is in. Currently this means that `null` is never accepted
+// and undefined/non-string values are only allowed in object mode.
+function validChunk(stream, state, chunk, cb) {
+ var er;
+ if (chunk === null) {
+ er = new ERR_STREAM_NULL_VALUES();
+ } else if (typeof chunk !== 'string' && !state.objectMode) {
+ er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);
+ }
+ if (er) {
+ errorOrDestroy(stream, er);
+ process.nextTick(cb, er);
+ return false;
+ }
+ return true;
+}
+Writable.prototype.write = function (chunk, encoding, cb) {
+ var state = this._writableState;
+ var ret = false;
+ var isBuf = !state.objectMode && _isUint8Array(chunk);
+ if (isBuf && !Buffer.isBuffer(chunk)) {
+ chunk = _uint8ArrayToBuffer(chunk);
+ }
+ if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+ if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+ if (typeof cb !== 'function') cb = nop;
+ if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
+ state.pendingcb++;
+ ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
+ }
+ return ret;
+};
+Writable.prototype.cork = function () {
+ this._writableState.corked++;
+};
+Writable.prototype.uncork = function () {
+ var state = this._writableState;
+ if (state.corked) {
+ state.corked--;
+ if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+ }
+};
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+ // node::ParseEncoding() requires lower case.
+ if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+ if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);
+ this._writableState.defaultEncoding = encoding;
+ return this;
+};
+Object.defineProperty(Writable.prototype, 'writableBuffer', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState && this._writableState.getBuffer();
+ }
+});
+function decodeChunk(state, chunk, encoding) {
+ if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+ chunk = Buffer.from(chunk, encoding);
+ }
+ return chunk;
+}
+Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState.highWaterMark;
+ }
+});
+
+// if we're already writing something, then just put this
+// in the queue, and wait our turn. Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
+ if (!isBuf) {
+ var newChunk = decodeChunk(state, chunk, encoding);
+ if (chunk !== newChunk) {
+ isBuf = true;
+ encoding = 'buffer';
+ chunk = newChunk;
+ }
+ }
+ var len = state.objectMode ? 1 : chunk.length;
+ state.length += len;
+ var ret = state.length < state.highWaterMark;
+ // we must ensure that previous needDrain will not be reset to false.
+ if (!ret) state.needDrain = true;
+ if (state.writing || state.corked) {
+ var last = state.lastBufferedRequest;
+ state.lastBufferedRequest = {
+ chunk: chunk,
+ encoding: encoding,
+ isBuf: isBuf,
+ callback: cb,
+ next: null
+ };
+ if (last) {
+ last.next = state.lastBufferedRequest;
+ } else {
+ state.bufferedRequest = state.lastBufferedRequest;
+ }
+ state.bufferedRequestCount += 1;
+ } else {
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ }
+ return ret;
+}
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+ state.writelen = len;
+ state.writecb = cb;
+ state.writing = true;
+ state.sync = true;
+ if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+ state.sync = false;
+}
+function onwriteError(stream, state, sync, er, cb) {
+ --state.pendingcb;
+ if (sync) {
+ // defer the callback if we are being called synchronously
+ // to avoid piling up things on the stack
+ process.nextTick(cb, er);
+ // this can emit finish, and it will always happen
+ // after error
+ process.nextTick(finishMaybe, stream, state);
+ stream._writableState.errorEmitted = true;
+ errorOrDestroy(stream, er);
+ } else {
+ // the caller expect this to happen before if
+ // it is async
+ cb(er);
+ stream._writableState.errorEmitted = true;
+ errorOrDestroy(stream, er);
+ // this can emit finish, but finish must
+ // always follow error
+ finishMaybe(stream, state);
+ }
+}
+function onwriteStateUpdate(state) {
+ state.writing = false;
+ state.writecb = null;
+ state.length -= state.writelen;
+ state.writelen = 0;
+}
+function onwrite(stream, er) {
+ var state = stream._writableState;
+ var sync = state.sync;
+ var cb = state.writecb;
+ if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();
+ onwriteStateUpdate(state);
+ if (er) onwriteError(stream, state, sync, er, cb);else {
+ // Check if we're actually ready to finish, but don't emit yet
+ var finished = needFinish(state) || stream.destroyed;
+ if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+ clearBuffer(stream, state);
+ }
+ if (sync) {
+ process.nextTick(afterWrite, stream, state, finished, cb);
+ } else {
+ afterWrite(stream, state, finished, cb);
+ }
+ }
+}
+function afterWrite(stream, state, finished, cb) {
+ if (!finished) onwriteDrain(stream, state);
+ state.pendingcb--;
+ cb();
+ finishMaybe(stream, state);
+}
+
+// Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+function onwriteDrain(stream, state) {
+ if (state.length === 0 && state.needDrain) {
+ state.needDrain = false;
+ stream.emit('drain');
+ }
+}
+
+// if there's something in the buffer waiting, then process it
+function clearBuffer(stream, state) {
+ state.bufferProcessing = true;
+ var entry = state.bufferedRequest;
+ if (stream._writev && entry && entry.next) {
+ // Fast case, write everything using _writev()
+ var l = state.bufferedRequestCount;
+ var buffer = new Array(l);
+ var holder = state.corkedRequestsFree;
+ holder.entry = entry;
+ var count = 0;
+ var allBuffers = true;
+ while (entry) {
+ buffer[count] = entry;
+ if (!entry.isBuf) allBuffers = false;
+ entry = entry.next;
+ count += 1;
+ }
+ buffer.allBuffers = allBuffers;
+ doWrite(stream, state, true, state.length, buffer, '', holder.finish);
+
+ // doWrite is almost always async, defer these to save a bit of time
+ // as the hot path ends with doWrite
+ state.pendingcb++;
+ state.lastBufferedRequest = null;
+ if (holder.next) {
+ state.corkedRequestsFree = holder.next;
+ holder.next = null;
+ } else {
+ state.corkedRequestsFree = new CorkedRequest(state);
+ }
+ state.bufferedRequestCount = 0;
+ } else {
+ // Slow case, write chunks one-by-one
+ while (entry) {
+ var chunk = entry.chunk;
+ var encoding = entry.encoding;
+ var cb = entry.callback;
+ var len = state.objectMode ? 1 : chunk.length;
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ entry = entry.next;
+ state.bufferedRequestCount--;
+ // if we didn't call the onwrite immediately, then
+ // it means that we need to wait until it does.
+ // also, that means that the chunk and cb are currently
+ // being processed, so move the buffer counter past them.
+ if (state.writing) {
+ break;
+ }
+ }
+ if (entry === null) state.lastBufferedRequest = null;
+ }
+ state.bufferedRequest = entry;
+ state.bufferProcessing = false;
+}
+Writable.prototype._write = function (chunk, encoding, cb) {
+ cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));
+};
+Writable.prototype._writev = null;
+Writable.prototype.end = function (chunk, encoding, cb) {
+ var state = this._writableState;
+ if (typeof chunk === 'function') {
+ cb = chunk;
+ chunk = null;
+ encoding = null;
+ } else if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+ if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
+
+ // .end() fully uncorks
+ if (state.corked) {
+ state.corked = 1;
+ this.uncork();
+ }
+
+ // ignore unnecessary end() calls.
+ if (!state.ending) endWritable(this, state, cb);
+ return this;
+};
+Object.defineProperty(Writable.prototype, 'writableLength', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ return this._writableState.length;
+ }
+});
+function needFinish(state) {
+ return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+}
+function callFinal(stream, state) {
+ stream._final(function (err) {
+ state.pendingcb--;
+ if (err) {
+ errorOrDestroy(stream, err);
+ }
+ state.prefinished = true;
+ stream.emit('prefinish');
+ finishMaybe(stream, state);
+ });
+}
+function prefinish(stream, state) {
+ if (!state.prefinished && !state.finalCalled) {
+ if (typeof stream._final === 'function' && !state.destroyed) {
+ state.pendingcb++;
+ state.finalCalled = true;
+ process.nextTick(callFinal, stream, state);
+ } else {
+ state.prefinished = true;
+ stream.emit('prefinish');
+ }
+ }
+}
+function finishMaybe(stream, state) {
+ var need = needFinish(state);
+ if (need) {
+ prefinish(stream, state);
+ if (state.pendingcb === 0) {
+ state.finished = true;
+ stream.emit('finish');
+ if (state.autoDestroy) {
+ // In case of duplex streams we need a way to detect
+ // if the readable side is ready for autoDestroy as well
+ var rState = stream._readableState;
+ if (!rState || rState.autoDestroy && rState.endEmitted) {
+ stream.destroy();
+ }
+ }
+ }
+ }
+ return need;
+}
+function endWritable(stream, state, cb) {
+ state.ending = true;
+ finishMaybe(stream, state);
+ if (cb) {
+ if (state.finished) process.nextTick(cb);else stream.once('finish', cb);
+ }
+ state.ended = true;
+ stream.writable = false;
+}
+function onCorkedFinish(corkReq, state, err) {
+ var entry = corkReq.entry;
+ corkReq.entry = null;
+ while (entry) {
+ var cb = entry.callback;
+ state.pendingcb--;
+ cb(err);
+ entry = entry.next;
+ }
+
+ // reuse the free corkReq.
+ state.corkedRequestsFree.next = corkReq;
+}
+Object.defineProperty(Writable.prototype, 'destroyed', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function get() {
+ if (this._writableState === undefined) {
+ return false;
+ }
+ return this._writableState.destroyed;
+ },
+ set: function set(value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (!this._writableState) {
+ return;
+ }
+
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._writableState.destroyed = value;
+ }
+});
+Writable.prototype.destroy = destroyImpl.destroy;
+Writable.prototype._undestroy = destroyImpl.undestroy;
+Writable.prototype._destroy = function (err, cb) {
+ cb(err);
+};
+}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"../errors":33,"./_stream_duplex":34,"./internal/streams/destroy":41,"./internal/streams/state":45,"./internal/streams/stream":46,"_process":168,"buffer":120,"inherits":156,"util-deprecate":221}],39:[function(require,module,exports){
+(function (process){(function (){
+'use strict';
+
+var _Object$setPrototypeO;
+function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
+function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
+var finished = require('./end-of-stream');
+var kLastResolve = Symbol('lastResolve');
+var kLastReject = Symbol('lastReject');
+var kError = Symbol('error');
+var kEnded = Symbol('ended');
+var kLastPromise = Symbol('lastPromise');
+var kHandlePromise = Symbol('handlePromise');
+var kStream = Symbol('stream');
+function createIterResult(value, done) {
+ return {
+ value: value,
+ done: done
+ };
+}
+function readAndResolve(iter) {
+ var resolve = iter[kLastResolve];
+ if (resolve !== null) {
+ var data = iter[kStream].read();
+ // we defer if data is null
+ // we can be expecting either 'end' or
+ // 'error'
+ if (data !== null) {
+ iter[kLastPromise] = null;
+ iter[kLastResolve] = null;
+ iter[kLastReject] = null;
+ resolve(createIterResult(data, false));
+ }
+ }
+}
+function onReadable(iter) {
+ // we wait for the next tick, because it might
+ // emit an error with process.nextTick
+ process.nextTick(readAndResolve, iter);
+}
+function wrapForNext(lastPromise, iter) {
+ return function (resolve, reject) {
+ lastPromise.then(function () {
+ if (iter[kEnded]) {
+ resolve(createIterResult(undefined, true));
+ return;
+ }
+ iter[kHandlePromise](resolve, reject);
+ }, reject);
+ };
+}
+var AsyncIteratorPrototype = Object.getPrototypeOf(function () {});
+var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {
+ get stream() {
+ return this[kStream];
+ },
+ next: function next() {
+ var _this = this;
+ // if we have detected an error in the meanwhile
+ // reject straight away
+ var error = this[kError];
+ if (error !== null) {
+ return Promise.reject(error);
+ }
+ if (this[kEnded]) {
+ return Promise.resolve(createIterResult(undefined, true));
+ }
+ if (this[kStream].destroyed) {
+ // We need to defer via nextTick because if .destroy(err) is
+ // called, the error will be emitted via nextTick, and
+ // we cannot guarantee that there is no error lingering around
+ // waiting to be emitted.
+ return new Promise(function (resolve, reject) {
+ process.nextTick(function () {
+ if (_this[kError]) {
+ reject(_this[kError]);
+ } else {
+ resolve(createIterResult(undefined, true));
+ }
+ });
+ });
+ }
+
+ // if we have multiple next() calls
+ // we will wait for the previous Promise to finish
+ // this logic is optimized to support for await loops,
+ // where next() is only called once at a time
+ var lastPromise = this[kLastPromise];
+ var promise;
+ if (lastPromise) {
+ promise = new Promise(wrapForNext(lastPromise, this));
+ } else {
+ // fast path needed to support multiple this.push()
+ // without triggering the next() queue
+ var data = this[kStream].read();
+ if (data !== null) {
+ return Promise.resolve(createIterResult(data, false));
+ }
+ promise = new Promise(this[kHandlePromise]);
+ }
+ this[kLastPromise] = promise;
+ return promise;
+ }
+}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {
+ return this;
+}), _defineProperty(_Object$setPrototypeO, "return", function _return() {
+ var _this2 = this;
+ // destroy(err, cb) is a private API
+ // we can guarantee we have that here, because we control the
+ // Readable class this is attached to
+ return new Promise(function (resolve, reject) {
+ _this2[kStream].destroy(null, function (err) {
+ if (err) {
+ reject(err);
+ return;
+ }
+ resolve(createIterResult(undefined, true));
+ });
+ });
+}), _Object$setPrototypeO), AsyncIteratorPrototype);
+var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {
+ var _Object$create;
+ var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {
+ value: stream,
+ writable: true
+ }), _defineProperty(_Object$create, kLastResolve, {
+ value: null,
+ writable: true
+ }), _defineProperty(_Object$create, kLastReject, {
+ value: null,
+ writable: true
+ }), _defineProperty(_Object$create, kError, {
+ value: null,
+ writable: true
+ }), _defineProperty(_Object$create, kEnded, {
+ value: stream._readableState.endEmitted,
+ writable: true
+ }), _defineProperty(_Object$create, kHandlePromise, {
+ value: function value(resolve, reject) {
+ var data = iterator[kStream].read();
+ if (data) {
+ iterator[kLastPromise] = null;
+ iterator[kLastResolve] = null;
+ iterator[kLastReject] = null;
+ resolve(createIterResult(data, false));
+ } else {
+ iterator[kLastResolve] = resolve;
+ iterator[kLastReject] = reject;
+ }
+ },
+ writable: true
+ }), _Object$create));
+ iterator[kLastPromise] = null;
+ finished(stream, function (err) {
+ if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
+ var reject = iterator[kLastReject];
+ // reject if we are waiting for data in the Promise
+ // returned by next() and store the error
+ if (reject !== null) {
+ iterator[kLastPromise] = null;
+ iterator[kLastResolve] = null;
+ iterator[kLastReject] = null;
+ reject(err);
+ }
+ iterator[kError] = err;
+ return;
+ }
+ var resolve = iterator[kLastResolve];
+ if (resolve !== null) {
+ iterator[kLastPromise] = null;
+ iterator[kLastResolve] = null;
+ iterator[kLastReject] = null;
+ resolve(createIterResult(undefined, true));
+ }
+ iterator[kEnded] = true;
+ });
+ stream.on('readable', onReadable.bind(null, iterator));
+ return iterator;
+};
+module.exports = createReadableStreamAsyncIterator;
+}).call(this)}).call(this,require('_process'))
+},{"./end-of-stream":42,"_process":168}],40:[function(require,module,exports){
+'use strict';
+
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
+function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
+function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
+function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
+var _require = require('buffer'),
+ Buffer = _require.Buffer;
+var _require2 = require('util'),
+ inspect = _require2.inspect;
+var custom = inspect && inspect.custom || 'inspect';
+function copyBuffer(src, target, offset) {
+ Buffer.prototype.copy.call(src, target, offset);
+}
+module.exports = /*#__PURE__*/function () {
+ function BufferList() {
+ _classCallCheck(this, BufferList);
+ this.head = null;
+ this.tail = null;
+ this.length = 0;
+ }
+ _createClass(BufferList, [{
+ key: "push",
+ value: function push(v) {
+ var entry = {
+ data: v,
+ next: null
+ };
+ if (this.length > 0) this.tail.next = entry;else this.head = entry;
+ this.tail = entry;
+ ++this.length;
+ }
+ }, {
+ key: "unshift",
+ value: function unshift(v) {
+ var entry = {
+ data: v,
+ next: this.head
+ };
+ if (this.length === 0) this.tail = entry;
+ this.head = entry;
+ ++this.length;
+ }
+ }, {
+ key: "shift",
+ value: function shift() {
+ if (this.length === 0) return;
+ var ret = this.head.data;
+ if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+ --this.length;
+ return ret;
+ }
+ }, {
+ key: "clear",
+ value: function clear() {
+ this.head = this.tail = null;
+ this.length = 0;
+ }
+ }, {
+ key: "join",
+ value: function join(s) {
+ if (this.length === 0) return '';
+ var p = this.head;
+ var ret = '' + p.data;
+ while (p = p.next) ret += s + p.data;
+ return ret;
+ }
+ }, {
+ key: "concat",
+ value: function concat(n) {
+ if (this.length === 0) return Buffer.alloc(0);
+ var ret = Buffer.allocUnsafe(n >>> 0);
+ var p = this.head;
+ var i = 0;
+ while (p) {
+ copyBuffer(p.data, ret, i);
+ i += p.data.length;
+ p = p.next;
+ }
+ return ret;
+ }
+
+ // Consumes a specified amount of bytes or characters from the buffered data.
+ }, {
+ key: "consume",
+ value: function consume(n, hasStrings) {
+ var ret;
+ if (n < this.head.data.length) {
+ // `slice` is the same for buffers and strings.
+ ret = this.head.data.slice(0, n);
+ this.head.data = this.head.data.slice(n);
+ } else if (n === this.head.data.length) {
+ // First chunk is a perfect match.
+ ret = this.shift();
+ } else {
+ // Result spans more than one buffer.
+ ret = hasStrings ? this._getString(n) : this._getBuffer(n);
+ }
+ return ret;
+ }
+ }, {
+ key: "first",
+ value: function first() {
+ return this.head.data;
+ }
+
+ // Consumes a specified amount of characters from the buffered data.
+ }, {
+ key: "_getString",
+ value: function _getString(n) {
+ var p = this.head;
+ var c = 1;
+ var ret = p.data;
+ n -= ret.length;
+ while (p = p.next) {
+ var str = p.data;
+ var nb = n > str.length ? str.length : n;
+ if (nb === str.length) ret += str;else ret += str.slice(0, n);
+ n -= nb;
+ if (n === 0) {
+ if (nb === str.length) {
+ ++c;
+ if (p.next) this.head = p.next;else this.head = this.tail = null;
+ } else {
+ this.head = p;
+ p.data = str.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ this.length -= c;
+ return ret;
+ }
+
+ // Consumes a specified amount of bytes from the buffered data.
+ }, {
+ key: "_getBuffer",
+ value: function _getBuffer(n) {
+ var ret = Buffer.allocUnsafe(n);
+ var p = this.head;
+ var c = 1;
+ p.data.copy(ret);
+ n -= p.data.length;
+ while (p = p.next) {
+ var buf = p.data;
+ var nb = n > buf.length ? buf.length : n;
+ buf.copy(ret, ret.length - n, 0, nb);
+ n -= nb;
+ if (n === 0) {
+ if (nb === buf.length) {
+ ++c;
+ if (p.next) this.head = p.next;else this.head = this.tail = null;
+ } else {
+ this.head = p;
+ p.data = buf.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ this.length -= c;
+ return ret;
+ }
+
+ // Make sure the linked list only shows the minimal necessary information.
+ }, {
+ key: custom,
+ value: function value(_, options) {
+ return inspect(this, _objectSpread(_objectSpread({}, options), {}, {
+ // Only inspect one level.
+ depth: 0,
+ // It should not recurse.
+ customInspect: false
+ }));
+ }
+ }]);
+ return BufferList;
+}();
+},{"buffer":120,"util":119}],41:[function(require,module,exports){
+(function (process){(function (){
+'use strict';
+
+// undocumented cb() API, needed for core, not for public API
+function destroy(err, cb) {
+ var _this = this;
+ var readableDestroyed = this._readableState && this._readableState.destroyed;
+ var writableDestroyed = this._writableState && this._writableState.destroyed;
+ if (readableDestroyed || writableDestroyed) {
+ if (cb) {
+ cb(err);
+ } else if (err) {
+ if (!this._writableState) {
+ process.nextTick(emitErrorNT, this, err);
+ } else if (!this._writableState.errorEmitted) {
+ this._writableState.errorEmitted = true;
+ process.nextTick(emitErrorNT, this, err);
+ }
+ }
+ return this;
+ }
+
+ // we set destroyed to true before firing error callbacks in order
+ // to make it re-entrance safe in case destroy() is called within callbacks
+
+ if (this._readableState) {
+ this._readableState.destroyed = true;
+ }
+
+ // if this is a duplex stream mark the writable part as destroyed as well
+ if (this._writableState) {
+ this._writableState.destroyed = true;
+ }
+ this._destroy(err || null, function (err) {
+ if (!cb && err) {
+ if (!_this._writableState) {
+ process.nextTick(emitErrorAndCloseNT, _this, err);
+ } else if (!_this._writableState.errorEmitted) {
+ _this._writableState.errorEmitted = true;
+ process.nextTick(emitErrorAndCloseNT, _this, err);
+ } else {
+ process.nextTick(emitCloseNT, _this);
+ }
+ } else if (cb) {
+ process.nextTick(emitCloseNT, _this);
+ cb(err);
+ } else {
+ process.nextTick(emitCloseNT, _this);
+ }
+ });
+ return this;
+}
+function emitErrorAndCloseNT(self, err) {
+ emitErrorNT(self, err);
+ emitCloseNT(self);
+}
+function emitCloseNT(self) {
+ if (self._writableState && !self._writableState.emitClose) return;
+ if (self._readableState && !self._readableState.emitClose) return;
+ self.emit('close');
+}
+function undestroy() {
+ if (this._readableState) {
+ this._readableState.destroyed = false;
+ this._readableState.reading = false;
+ this._readableState.ended = false;
+ this._readableState.endEmitted = false;
+ }
+ if (this._writableState) {
+ this._writableState.destroyed = false;
+ this._writableState.ended = false;
+ this._writableState.ending = false;
+ this._writableState.finalCalled = false;
+ this._writableState.prefinished = false;
+ this._writableState.finished = false;
+ this._writableState.errorEmitted = false;
+ }
+}
+function emitErrorNT(self, err) {
+ self.emit('error', err);
+}
+function errorOrDestroy(stream, err) {
+ // We have tests that rely on errors being emitted
+ // in the same tick, so changing this is semver major.
+ // For now when you opt-in to autoDestroy we allow
+ // the error to be emitted nextTick. In a future
+ // semver major update we should change the default to this.
+
+ var rState = stream._readableState;
+ var wState = stream._writableState;
+ if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);
+}
+module.exports = {
+ destroy: destroy,
+ undestroy: undestroy,
+ errorOrDestroy: errorOrDestroy
+};
+}).call(this)}).call(this,require('_process'))
+},{"_process":168}],42:[function(require,module,exports){
+// Ported from https://github.com/mafintosh/end-of-stream with
+// permission from the author, Mathias Buus (@mafintosh).
+
+'use strict';
+
+var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE;
+function once(callback) {
+ var called = false;
+ return function () {
+ if (called) return;
+ called = true;
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+ callback.apply(this, args);
+ };
+}
+function noop() {}
+function isRequest(stream) {
+ return stream.setHeader && typeof stream.abort === 'function';
+}
+function eos(stream, opts, callback) {
+ if (typeof opts === 'function') return eos(stream, null, opts);
+ if (!opts) opts = {};
+ callback = once(callback || noop);
+ var readable = opts.readable || opts.readable !== false && stream.readable;
+ var writable = opts.writable || opts.writable !== false && stream.writable;
+ var onlegacyfinish = function onlegacyfinish() {
+ if (!stream.writable) onfinish();
+ };
+ var writableEnded = stream._writableState && stream._writableState.finished;
+ var onfinish = function onfinish() {
+ writable = false;
+ writableEnded = true;
+ if (!readable) callback.call(stream);
+ };
+ var readableEnded = stream._readableState && stream._readableState.endEmitted;
+ var onend = function onend() {
+ readable = false;
+ readableEnded = true;
+ if (!writable) callback.call(stream);
+ };
+ var onerror = function onerror(err) {
+ callback.call(stream, err);
+ };
+ var onclose = function onclose() {
+ var err;
+ if (readable && !readableEnded) {
+ if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
+ return callback.call(stream, err);
+ }
+ if (writable && !writableEnded) {
+ if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();
+ return callback.call(stream, err);
+ }
+ };
+ var onrequest = function onrequest() {
+ stream.req.on('finish', onfinish);
+ };
+ if (isRequest(stream)) {
+ stream.on('complete', onfinish);
+ stream.on('abort', onclose);
+ if (stream.req) onrequest();else stream.on('request', onrequest);
+ } else if (writable && !stream._writableState) {
+ // legacy streams
+ stream.on('end', onlegacyfinish);
+ stream.on('close', onlegacyfinish);
+ }
+ stream.on('end', onend);
+ stream.on('finish', onfinish);
+ if (opts.error !== false) stream.on('error', onerror);
+ stream.on('close', onclose);
+ return function () {
+ stream.removeListener('complete', onfinish);
+ stream.removeListener('abort', onclose);
+ stream.removeListener('request', onrequest);
+ if (stream.req) stream.req.removeListener('finish', onfinish);
+ stream.removeListener('end', onlegacyfinish);
+ stream.removeListener('close', onlegacyfinish);
+ stream.removeListener('finish', onfinish);
+ stream.removeListener('end', onend);
+ stream.removeListener('error', onerror);
+ stream.removeListener('close', onclose);
+ };
+}
+module.exports = eos;
+},{"../../../errors":33}],43:[function(require,module,exports){
+module.exports = function () {
+ throw new Error('Readable.from is not available in the browser')
+};
+
+},{}],44:[function(require,module,exports){
+// Ported from https://github.com/mafintosh/pump with
+// permission from the author, Mathias Buus (@mafintosh).
+
+'use strict';
+
+var eos;
+function once(callback) {
+ var called = false;
+ return function () {
+ if (called) return;
+ called = true;
+ callback.apply(void 0, arguments);
+ };
+}
+var _require$codes = require('../../../errors').codes,
+ ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,
+ ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;
+function noop(err) {
+ // Rethrow the error if it exists to avoid swallowing it
+ if (err) throw err;
+}
+function isRequest(stream) {
+ return stream.setHeader && typeof stream.abort === 'function';
+}
+function destroyer(stream, reading, writing, callback) {
+ callback = once(callback);
+ var closed = false;
+ stream.on('close', function () {
+ closed = true;
+ });
+ if (eos === undefined) eos = require('./end-of-stream');
+ eos(stream, {
+ readable: reading,
+ writable: writing
+ }, function (err) {
+ if (err) return callback(err);
+ closed = true;
+ callback();
+ });
+ var destroyed = false;
+ return function (err) {
+ if (closed) return;
+ if (destroyed) return;
+ destroyed = true;
+
+ // request.destroy just do .end - .abort is what we want
+ if (isRequest(stream)) return stream.abort();
+ if (typeof stream.destroy === 'function') return stream.destroy();
+ callback(err || new ERR_STREAM_DESTROYED('pipe'));
+ };
+}
+function call(fn) {
+ fn();
+}
+function pipe(from, to) {
+ return from.pipe(to);
+}
+function popCallback(streams) {
+ if (!streams.length) return noop;
+ if (typeof streams[streams.length - 1] !== 'function') return noop;
+ return streams.pop();
+}
+function pipeline() {
+ for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {
+ streams[_key] = arguments[_key];
+ }
+ var callback = popCallback(streams);
+ if (Array.isArray(streams[0])) streams = streams[0];
+ if (streams.length < 2) {
+ throw new ERR_MISSING_ARGS('streams');
+ }
+ var error;
+ var destroys = streams.map(function (stream, i) {
+ var reading = i < streams.length - 1;
+ var writing = i > 0;
+ return destroyer(stream, reading, writing, function (err) {
+ if (!error) error = err;
+ if (err) destroys.forEach(call);
+ if (reading) return;
+ destroys.forEach(call);
+ callback(error);
+ });
+ });
+ return streams.reduce(pipe);
+}
+module.exports = pipeline;
+},{"../../../errors":33,"./end-of-stream":42}],45:[function(require,module,exports){
+'use strict';
+
+var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE;
+function highWaterMarkFrom(options, isDuplex, duplexKey) {
+ return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;
+}
+function getHighWaterMark(state, options, duplexKey, isDuplex) {
+ var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);
+ if (hwm != null) {
+ if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {
+ var name = isDuplex ? duplexKey : 'highWaterMark';
+ throw new ERR_INVALID_OPT_VALUE(name, hwm);
+ }
+ return Math.floor(hwm);
+ }
+
+ // Default value
+ return state.objectMode ? 16 : 16 * 1024;
+}
+module.exports = {
+ getHighWaterMark: getHighWaterMark
+};
+},{"../../../errors":33}],46:[function(require,module,exports){
+module.exports = require('events').EventEmitter;
+
+},{"events":128}],47:[function(require,module,exports){
+exports = module.exports = require('./lib/_stream_readable.js');
+exports.Stream = exports;
+exports.Readable = exports;
+exports.Writable = require('./lib/_stream_writable.js');
+exports.Duplex = require('./lib/_stream_duplex.js');
+exports.Transform = require('./lib/_stream_transform.js');
+exports.PassThrough = require('./lib/_stream_passthrough.js');
+exports.finished = require('./lib/internal/streams/end-of-stream.js');
+exports.pipeline = require('./lib/internal/streams/pipeline.js');
+
+},{"./lib/_stream_duplex.js":34,"./lib/_stream_passthrough.js":35,"./lib/_stream_readable.js":36,"./lib/_stream_transform.js":37,"./lib/_stream_writable.js":38,"./lib/internal/streams/end-of-stream.js":42,"./lib/internal/streams/pipeline.js":44}],48:[function(require,module,exports){
+var BN = require('bn.js');
+var stripHexPrefix = require('strip-hex-prefix');
+
+/**
+ * Returns a BN object, converts a number value to a BN
+ * @param {String|Number|Object} `arg` input a string number, hex string number, number, BigNumber or BN object
+ * @return {Object} `output` BN object of the number
+ * @throws if the argument is not an array, object that isn't a bignumber, not a string number or number
+ */
+module.exports = function numberToBN(arg) {
+ if (typeof arg === 'string' || typeof arg === 'number') {
+ var multiplier = new BN(1); // eslint-disable-line
+ var formattedString = String(arg).toLowerCase().trim();
+ var isHexPrefixed = formattedString.substr(0, 2) === '0x' || formattedString.substr(0, 3) === '-0x';
+ var stringArg = stripHexPrefix(formattedString); // eslint-disable-line
+ if (stringArg.substr(0, 1) === '-') {
+ stringArg = stripHexPrefix(stringArg.slice(1));
+ multiplier = new BN(-1, 10);
+ }
+ stringArg = stringArg === '' ? '0' : stringArg;
+
+ if ((!stringArg.match(/^-?[0-9]+$/) && stringArg.match(/^[0-9A-Fa-f]+$/))
+ || stringArg.match(/^[a-fA-F]+$/)
+ || (isHexPrefixed === true && stringArg.match(/^[0-9A-Fa-f]+$/))) {
+ return new BN(stringArg, 16).mul(multiplier);
+ }
+
+ if ((stringArg.match(/^-?[0-9]+$/) || stringArg === '') && isHexPrefixed === false) {
+ return new BN(stringArg, 10).mul(multiplier);
+ }
+ } else if (typeof arg === 'object' && arg.toString && (!arg.pop && !arg.push)) {
+ if (arg.toString(10).match(/^-?[0-9]+$/) && (arg.mul || arg.dividedToIntegerBy)) {
+ return new BN(arg.toString(10), 10);
+ }
+ }
+
+ throw new Error('[number-to-bn] while converting number ' + JSON.stringify(arg) + ' to BN.js instance, error: invalid number value. Value must be an integer, hex string, BN or BigNumber instance. Note, decimals are not supported.');
+}
+
+},{"bn.js":118,"strip-hex-prefix":218}],49:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});var __accessCheck = (obj, member, msg) => {
+ if (!member.has(obj))
+ throw TypeError("Cannot " + msg);
+};
+var __privateGet = (obj, member, getter) => {
+ __accessCheck(obj, member, "read from private field");
+ return getter ? getter.call(obj) : member.get(obj);
+};
+var __privateAdd = (obj, member, value) => {
+ if (member.has(obj))
+ throw TypeError("Cannot add the same private member more than once");
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
+};
+var __privateSet = (obj, member, value, setter) => {
+ __accessCheck(obj, member, "write to private field");
+ setter ? setter.call(obj, value) : member.set(obj, value);
+ return value;
+};
+
+
+
+
+
+exports.__privateGet = __privateGet; exports.__privateAdd = __privateAdd; exports.__privateSet = __privateSet;
+
+},{}],50:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/messages.ts
+var messages = {
+ errors: {
+ disconnected: () => "MetaMask: Disconnected from chain. Attempting to connect.",
+ permanentlyDisconnected: () => "MetaMask: Disconnected from MetaMask background. Page reload required.",
+ sendSiteMetadata: () => `MetaMask: Failed to send site metadata. This is an internal error, please report this bug.`,
+ unsupportedSync: (method) => `MetaMask: The MetaMask Ethereum provider does not support synchronous methods like ${method} without a callback parameter.`,
+ invalidDuplexStream: () => "Must provide a Node.js-style duplex stream.",
+ invalidNetworkParams: () => "MetaMask: Received invalid network parameters. Please report this bug.",
+ invalidRequestArgs: () => `Expected a single, non-array, object argument.`,
+ invalidRequestMethod: () => `'args.method' must be a non-empty string.`,
+ invalidRequestParams: () => `'args.params' must be an object or array if provided.`,
+ invalidLoggerObject: () => `'args.logger' must be an object if provided.`,
+ invalidLoggerMethod: (method) => `'args.logger' must include required method '${method}'.`
+ },
+ info: {
+ connected: (chainId) => `MetaMask: Connected to chain with ID "${chainId}".`
+ },
+ warnings: {
+ // deprecated properties
+ chainIdDeprecation: `MetaMask: 'ethereum.chainId' is deprecated and may be removed in the future. Please use the 'eth_chainId' RPC method instead.
+For more information, see: https://github.com/MetaMask/metamask-improvement-proposals/discussions/23`,
+ networkVersionDeprecation: `MetaMask: 'ethereum.networkVersion' is deprecated and may be removed in the future. Please use the 'net_version' RPC method instead.
+For more information, see: https://github.com/MetaMask/metamask-improvement-proposals/discussions/23`,
+ selectedAddressDeprecation: `MetaMask: 'ethereum.selectedAddress' is deprecated and may be removed in the future. Please use the 'eth_accounts' RPC method instead.
+For more information, see: https://github.com/MetaMask/metamask-improvement-proposals/discussions/23`,
+ // deprecated methods
+ enableDeprecation: `MetaMask: 'ethereum.enable()' is deprecated and may be removed in the future. Please use the 'eth_requestAccounts' RPC method instead.
+For more information, see: https://eips.ethereum.org/EIPS/eip-1102`,
+ sendDeprecation: `MetaMask: 'ethereum.send(...)' is deprecated and may be removed in the future. Please use 'ethereum.sendAsync(...)' or 'ethereum.request(...)' instead.
+For more information, see: https://eips.ethereum.org/EIPS/eip-1193`,
+ // deprecated events
+ events: {
+ close: `MetaMask: The event 'close' is deprecated and may be removed in the future. Please use 'disconnect' instead.
+For more information, see: https://eips.ethereum.org/EIPS/eip-1193#disconnect`,
+ data: `MetaMask: The event 'data' is deprecated and will be removed in the future. Use 'message' instead.
+For more information, see: https://eips.ethereum.org/EIPS/eip-1193#message`,
+ networkChanged: `MetaMask: The event 'networkChanged' is deprecated and may be removed in the future. Use 'chainChanged' instead.
+For more information, see: https://eips.ethereum.org/EIPS/eip-1193#chainchanged`,
+ notification: `MetaMask: The event 'notification' is deprecated and may be removed in the future. Use 'message' instead.
+For more information, see: https://eips.ethereum.org/EIPS/eip-1193#message`
+ },
+ rpc: {
+ ethDecryptDeprecation: `MetaMask: The RPC method 'eth_decrypt' is deprecated and may be removed in the future.
+For more information, see: https://medium.com/metamask/metamask-api-method-deprecation-2b0564a84686`,
+ ethGetEncryptionPublicKeyDeprecation: `MetaMask: The RPC method 'eth_getEncryptionPublicKey' is deprecated and may be removed in the future.
+For more information, see: https://medium.com/metamask/metamask-api-method-deprecation-2b0564a84686`,
+ walletWatchAssetNFTExperimental: `MetaMask: The RPC method 'wallet_watchAsset' is experimental for ERC721/ERC1155 assets and may change in the future.
+For more information, see: https://github.com/MetaMask/metamask-improvement-proposals/blob/main/MIPs/mip-1.md and https://github.com/MetaMask/metamask-improvement-proposals/blob/main/PROCESS-GUIDE.md#proposal-lifecycle`
+ },
+ // misc
+ experimentalMethods: `MetaMask: 'ethereum._metamask' exposes non-standard, experimental methods. They may be removed or changed without warning.`
+ }
+};
+var messages_default = messages;
+
+
+
+exports.messages_default = messages_default;
+
+},{}],51:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
+
+
+var _chunkZOFGBGOMjs = require('./chunk-ZOFGBGOM.js');
+
+
+var _chunk4EQNSGSRjs = require('./chunk-4EQNSGSR.js');
+
+// src/middleware/createRpcWarningMiddleware.ts
+function createRpcWarningMiddleware(log) {
+ const sentWarnings = {
+ ethDecryptDeprecation: false,
+ ethGetEncryptionPublicKeyDeprecation: false,
+ walletWatchAssetNFTExperimental: false
+ };
+ return (req, _res, next) => {
+ if (!sentWarnings.ethDecryptDeprecation && req.method === "eth_decrypt") {
+ log.warn(_chunk4EQNSGSRjs.messages_default.warnings.rpc.ethDecryptDeprecation);
+ sentWarnings.ethDecryptDeprecation = true;
+ } else if (!sentWarnings.ethGetEncryptionPublicKeyDeprecation && req.method === "eth_getEncryptionPublicKey") {
+ log.warn(_chunk4EQNSGSRjs.messages_default.warnings.rpc.ethGetEncryptionPublicKeyDeprecation);
+ sentWarnings.ethGetEncryptionPublicKeyDeprecation = true;
+ } else if (!sentWarnings.walletWatchAssetNFTExperimental && req.method === "wallet_watchAsset" && [_chunkZOFGBGOMjs.ERC721, _chunkZOFGBGOMjs.ERC1155].includes(
+ _optionalChain([req, 'access', _ => _.params, 'optionalAccess', _2 => _2.type]) || ""
+ )) {
+ log.warn(_chunk4EQNSGSRjs.messages_default.warnings.rpc.walletWatchAssetNFTExperimental);
+ sentWarnings.walletWatchAssetNFTExperimental = true;
+ }
+ next();
+ };
+}
+
+
+
+exports.createRpcWarningMiddleware = createRpcWarningMiddleware;
+
+},{"./chunk-4EQNSGSR.js":50,"./chunk-ZOFGBGOM.js":61}],52:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
+
+
+var _chunkO5ECOCX2js = require('./chunk-O5ECOCX2.js');
+
+
+var _chunk4EQNSGSRjs = require('./chunk-4EQNSGSR.js');
+
+
+
+
+var _chunk3W5G4CYIjs = require('./chunk-3W5G4CYI.js');
+
+// src/BaseProvider.ts
+var _jsonrpcengine = require('@metamask/json-rpc-engine');
+var _rpcerrors = require('@metamask/rpc-errors');
+var _safeeventemitter = require('@metamask/safe-event-emitter'); var _safeeventemitter2 = _interopRequireDefault(_safeeventemitter);
+var _fastdeepequal = require('fast-deep-equal'); var _fastdeepequal2 = _interopRequireDefault(_fastdeepequal);
+var _chainId, _selectedAddress;
+var _BaseProvider = class _BaseProvider extends _safeeventemitter2.default {
+ /**
+ * Create a new instance of the provider.
+ *
+ * @param options - An options bag.
+ * @param options.logger - The logging API to use. Default: `console`.
+ * @param options.maxEventListeners - The maximum number of event
+ * listeners. Default: 100.
+ * @param options.rpcMiddleware - The RPC middleware stack. Default: [].
+ */
+ constructor({
+ logger = console,
+ maxEventListeners = 100,
+ rpcMiddleware = []
+ } = {}) {
+ super();
+ /**
+ * The chain ID of the currently connected Ethereum chain.
+ * See [chainId.network]{@link https://chainid.network} for more information.
+ */
+ _chunk3W5G4CYIjs.__privateAdd.call(void 0, this, _chainId, void 0);
+ /**
+ * The user's currently selected Ethereum address.
+ * If null, MetaMask is either locked or the user has not permitted any
+ * addresses to be viewed.
+ */
+ _chunk3W5G4CYIjs.__privateAdd.call(void 0, this, _selectedAddress, void 0);
+ this._log = logger;
+ this.setMaxListeners(maxEventListeners);
+ this._state = {
+ ..._BaseProvider._defaultState
+ };
+ _chunk3W5G4CYIjs.__privateSet.call(void 0, this, _selectedAddress, null);
+ _chunk3W5G4CYIjs.__privateSet.call(void 0, this, _chainId, null);
+ this._handleAccountsChanged = this._handleAccountsChanged.bind(this);
+ this._handleConnect = this._handleConnect.bind(this);
+ this._handleChainChanged = this._handleChainChanged.bind(this);
+ this._handleDisconnect = this._handleDisconnect.bind(this);
+ this._handleUnlockStateChanged = this._handleUnlockStateChanged.bind(this);
+ this._rpcRequest = this._rpcRequest.bind(this);
+ this.request = this.request.bind(this);
+ const rpcEngine = new (0, _jsonrpcengine.JsonRpcEngine)();
+ rpcMiddleware.forEach((middleware) => rpcEngine.push(middleware));
+ this._rpcEngine = rpcEngine;
+ }
+ //====================
+ // Public Properties
+ //====================
+ get chainId() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _chainId);
+ }
+ get selectedAddress() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _selectedAddress);
+ }
+ //====================
+ // Public Methods
+ //====================
+ /**
+ * Returns whether the provider can process RPC requests.
+ *
+ * @returns Whether the provider can process RPC requests.
+ */
+ isConnected() {
+ return this._state.isConnected;
+ }
+ /**
+ * Submits an RPC request for the given method, with the given params.
+ * Resolves with the result of the method call, or rejects on error.
+ *
+ * @param args - The RPC request arguments.
+ * @param args.method - The RPC method name.
+ * @param args.params - The parameters for the RPC method.
+ * @returns A Promise that resolves with the result of the RPC method,
+ * or rejects if an error is encountered.
+ */
+ async request(args) {
+ if (!args || typeof args !== "object" || Array.isArray(args)) {
+ throw _rpcerrors.rpcErrors.invalidRequest({
+ message: _chunk4EQNSGSRjs.messages_default.errors.invalidRequestArgs(),
+ data: args
+ });
+ }
+ const { method, params } = args;
+ if (typeof method !== "string" || method.length === 0) {
+ throw _rpcerrors.rpcErrors.invalidRequest({
+ message: _chunk4EQNSGSRjs.messages_default.errors.invalidRequestMethod(),
+ data: args
+ });
+ }
+ if (params !== void 0 && !Array.isArray(params) && (typeof params !== "object" || params === null)) {
+ throw _rpcerrors.rpcErrors.invalidRequest({
+ message: _chunk4EQNSGSRjs.messages_default.errors.invalidRequestParams(),
+ data: args
+ });
+ }
+ const payload = params === void 0 || params === null ? {
+ method
+ } : {
+ method,
+ params
+ };
+ return new Promise((resolve, reject) => {
+ this._rpcRequest(payload, _chunkO5ECOCX2js.getRpcPromiseCallback.call(void 0, resolve, reject));
+ });
+ }
+ //====================
+ // Private Methods
+ //====================
+ /**
+ * MUST be called by child classes.
+ *
+ * Sets initial state if provided and marks this provider as initialized.
+ * Throws if called more than once.
+ *
+ * Permits the `networkVersion` field in the parameter object for
+ * compatibility with child classes that use this value.
+ *
+ * @param initialState - The provider's initial state.
+ * @param initialState.accounts - The user's accounts.
+ * @param initialState.chainId - The chain ID.
+ * @param initialState.isUnlocked - Whether the user has unlocked MetaMask.
+ * @param initialState.networkVersion - The network version.
+ * @fires BaseProvider#_initialized - If `initialState` is defined.
+ * @fires BaseProvider#connect - If `initialState` is defined.
+ */
+ _initializeState(initialState) {
+ if (this._state.initialized) {
+ throw new Error("Provider already initialized.");
+ }
+ if (initialState) {
+ const { accounts, chainId, isUnlocked, networkVersion } = initialState;
+ this._handleConnect(chainId);
+ this._handleChainChanged({ chainId, networkVersion });
+ this._handleUnlockStateChanged({ accounts, isUnlocked });
+ this._handleAccountsChanged(accounts);
+ }
+ this._state.initialized = true;
+ this.emit("_initialized");
+ }
+ /**
+ * Internal RPC method. Forwards requests to background via the RPC engine.
+ * Also remap ids inbound and outbound.
+ *
+ * @param payload - The RPC request object.
+ * @param callback - The consumer's callback.
+ * @returns The result of the RPC request.
+ */
+ _rpcRequest(payload, callback) {
+ let callbackWrapper = callback;
+ if (!Array.isArray(payload)) {
+ if (!payload.jsonrpc) {
+ payload.jsonrpc = "2.0";
+ }
+ if (payload.method === "eth_accounts" || payload.method === "eth_requestAccounts") {
+ callbackWrapper = (error, response) => {
+ this._handleAccountsChanged(
+ _nullishCoalesce(response.result, () => ( [])),
+ payload.method === "eth_accounts"
+ );
+ callback(error, response);
+ };
+ }
+ return this._rpcEngine.handle(payload, callbackWrapper);
+ }
+ return this._rpcEngine.handle(payload, callbackWrapper);
+ }
+ /**
+ * When the provider becomes connected, updates internal state and emits
+ * required events. Idempotent.
+ *
+ * @param chainId - The ID of the newly connected chain.
+ * @fires MetaMaskInpageProvider#connect
+ */
+ _handleConnect(chainId) {
+ if (!this._state.isConnected) {
+ this._state.isConnected = true;
+ this.emit("connect", { chainId });
+ this._log.debug(_chunk4EQNSGSRjs.messages_default.info.connected(chainId));
+ }
+ }
+ /**
+ * When the provider becomes disconnected, updates internal state and emits
+ * required events. Idempotent with respect to the isRecoverable parameter.
+ *
+ * Error codes per the CloseEvent status codes as required by EIP-1193:
+ * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.
+ *
+ * @param isRecoverable - Whether the disconnection is recoverable.
+ * @param errorMessage - A custom error message.
+ * @fires BaseProvider#disconnect - If the disconnection is not recoverable.
+ */
+ _handleDisconnect(isRecoverable, errorMessage) {
+ if (this._state.isConnected || !this._state.isPermanentlyDisconnected && !isRecoverable) {
+ this._state.isConnected = false;
+ let error;
+ if (isRecoverable) {
+ error = new (0, _rpcerrors.JsonRpcError)(
+ 1013,
+ // Try again later
+ _nullishCoalesce(errorMessage, () => ( _chunk4EQNSGSRjs.messages_default.errors.disconnected()))
+ );
+ this._log.debug(error);
+ } else {
+ error = new (0, _rpcerrors.JsonRpcError)(
+ 1011,
+ // Internal error
+ _nullishCoalesce(errorMessage, () => ( _chunk4EQNSGSRjs.messages_default.errors.permanentlyDisconnected()))
+ );
+ this._log.error(error);
+ _chunk3W5G4CYIjs.__privateSet.call(void 0, this, _chainId, null);
+ this._state.accounts = null;
+ _chunk3W5G4CYIjs.__privateSet.call(void 0, this, _selectedAddress, null);
+ this._state.isUnlocked = false;
+ this._state.isPermanentlyDisconnected = true;
+ }
+ this.emit("disconnect", error);
+ }
+ }
+ /**
+ * Upon receipt of a new `chainId`, emits the corresponding event and sets
+ * and sets relevant public state. Does nothing if the given `chainId` is
+ * equivalent to the existing value.
+ *
+ * Permits the `networkVersion` field in the parameter object for
+ * compatibility with child classes that use this value.
+ *
+ * @fires BaseProvider#chainChanged
+ * @param networkInfo - An object with network info.
+ * @param networkInfo.chainId - The latest chain ID.
+ */
+ _handleChainChanged({
+ chainId
+ } = {}) {
+ if (!_chunkO5ECOCX2js.isValidChainId.call(void 0, chainId)) {
+ this._log.error(_chunk4EQNSGSRjs.messages_default.errors.invalidNetworkParams(), { chainId });
+ return;
+ }
+ this._handleConnect(chainId);
+ if (chainId !== _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _chainId)) {
+ _chunk3W5G4CYIjs.__privateSet.call(void 0, this, _chainId, chainId);
+ if (this._state.initialized) {
+ this.emit("chainChanged", _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _chainId));
+ }
+ }
+ }
+ /**
+ * Called when accounts may have changed. Diffs the new accounts value with
+ * the current one, updates all state as necessary, and emits the
+ * accountsChanged event.
+ *
+ * @param accounts - The new accounts value.
+ * @param isEthAccounts - Whether the accounts value was returned by
+ * a call to eth_accounts.
+ */
+ _handleAccountsChanged(accounts, isEthAccounts = false) {
+ let _accounts = accounts;
+ if (!Array.isArray(accounts)) {
+ this._log.error(
+ "MetaMask: Received invalid accounts parameter. Please report this bug.",
+ accounts
+ );
+ _accounts = [];
+ }
+ for (const account of accounts) {
+ if (typeof account !== "string") {
+ this._log.error(
+ "MetaMask: Received non-string account. Please report this bug.",
+ accounts
+ );
+ _accounts = [];
+ break;
+ }
+ }
+ if (!_fastdeepequal2.default.call(void 0, this._state.accounts, _accounts)) {
+ if (isEthAccounts && this._state.accounts !== null) {
+ this._log.error(
+ `MetaMask: 'eth_accounts' unexpectedly updated accounts. Please report this bug.`,
+ _accounts
+ );
+ }
+ this._state.accounts = _accounts;
+ if (_chunk3W5G4CYIjs.__privateGet.call(void 0, this, _selectedAddress) !== _accounts[0]) {
+ _chunk3W5G4CYIjs.__privateSet.call(void 0, this, _selectedAddress, _accounts[0] || null);
+ }
+ if (this._state.initialized) {
+ const _nextAccounts = [..._accounts];
+ this.emit("accountsChanged", _nextAccounts);
+ }
+ }
+ }
+ /**
+ * Upon receipt of a new isUnlocked state, sets relevant public state.
+ * Calls the accounts changed handler with the received accounts, or an empty
+ * array.
+ *
+ * Does nothing if the received value is equal to the existing value.
+ * There are no lock/unlock events.
+ *
+ * @param opts - Options bag.
+ * @param opts.accounts - The exposed accounts, if any.
+ * @param opts.isUnlocked - The latest isUnlocked value.
+ */
+ _handleUnlockStateChanged({
+ accounts,
+ isUnlocked
+ } = {}) {
+ if (typeof isUnlocked !== "boolean") {
+ this._log.error(
+ "MetaMask: Received invalid isUnlocked parameter. Please report this bug."
+ );
+ return;
+ }
+ if (isUnlocked !== this._state.isUnlocked) {
+ this._state.isUnlocked = isUnlocked;
+ this._handleAccountsChanged(_nullishCoalesce(accounts, () => ( [])));
+ }
+ }
+};
+_chainId = new WeakMap();
+_selectedAddress = new WeakMap();
+_BaseProvider._defaultState = {
+ accounts: null,
+ isConnected: false,
+ isUnlocked: false,
+ initialized: false,
+ isPermanentlyDisconnected: false
+};
+var BaseProvider = _BaseProvider;
+
+
+
+exports.BaseProvider = BaseProvider;
+
+},{"./chunk-3W5G4CYI.js":49,"./chunk-4EQNSGSR.js":50,"./chunk-O5ECOCX2.js":58,"@metamask/json-rpc-engine":29,"@metamask/rpc-errors":86,"@metamask/safe-event-emitter":87,"fast-deep-equal":66}],53:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/shimWeb3.ts
+function shimWeb3(provider, log = console) {
+ let loggedCurrentProvider = false;
+ let loggedMissingProperty = false;
+ if (!window.web3) {
+ const SHIM_IDENTIFIER = "__isMetaMaskShim__";
+ let web3Shim = { currentProvider: provider };
+ Object.defineProperty(web3Shim, SHIM_IDENTIFIER, {
+ value: true,
+ enumerable: true,
+ configurable: false,
+ writable: false
+ });
+ web3Shim = new Proxy(web3Shim, {
+ get: (target, property, ...args) => {
+ if (property === "currentProvider" && !loggedCurrentProvider) {
+ loggedCurrentProvider = true;
+ log.warn(
+ "You are accessing the MetaMask window.web3.currentProvider shim. This property is deprecated; use window.ethereum instead. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3"
+ );
+ } else if (property !== "currentProvider" && property !== SHIM_IDENTIFIER && !loggedMissingProperty) {
+ loggedMissingProperty = true;
+ log.error(
+ `MetaMask no longer injects web3. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3`
+ );
+ provider.request({ method: "metamask_logWeb3ShimUsage" }).catch((error) => {
+ log.debug("MetaMask: Failed to log web3 shim usage.", error);
+ });
+ }
+ return Reflect.get(target, property, ...args);
+ },
+ set: (...args) => {
+ log.warn(
+ "You are accessing the MetaMask window.web3 shim. This object is deprecated; use window.ethereum instead. For details, see: https://docs.metamask.io/guide/provider-migration.html#replacing-window-web3"
+ );
+ return Reflect.set(...args);
+ }
+ });
+ Object.defineProperty(window, "web3", {
+ value: web3Shim,
+ enumerable: false,
+ configurable: true,
+ writable: true
+ });
+ }
+}
+
+
+
+exports.shimWeb3 = shimWeb3;
+
+},{}],54:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
+
+var _chunkA3W22U42js = require('./chunk-A3W22U42.js');
+
+
+
+
+var _chunkO5ECOCX2js = require('./chunk-O5ECOCX2.js');
+
+
+var _chunk4EQNSGSRjs = require('./chunk-4EQNSGSR.js');
+
+// src/StreamProvider.ts
+var _jsonrpcmiddlewarestream = require('@metamask/json-rpc-middleware-stream');
+var _objectmultiplex = require('@metamask/object-multiplex'); var _objectmultiplex2 = _interopRequireDefault(_objectmultiplex);
+var _isstream = require('is-stream');
+var _readablestream = require('readable-stream');
+var AbstractStreamProvider = class extends _chunkA3W22U42js.BaseProvider {
+ /**
+ * Creates a new AbstractStreamProvider instance.
+ *
+ * @param connectionStream - A Node.js duplex stream.
+ * @param options - An options bag.
+ * @param options.jsonRpcStreamName - The name of the internal JSON-RPC stream.
+ * @param options.logger - The logging API to use. Default: `console`.
+ * @param options.maxEventListeners - The maximum number of event
+ * listeners. Default: 100.
+ * @param options.rpcMiddleware - The RPC middleware stack to use.
+ */
+ constructor(connectionStream, {
+ jsonRpcStreamName,
+ logger = console,
+ maxEventListeners = 100,
+ rpcMiddleware = []
+ }) {
+ super({ logger, maxEventListeners, rpcMiddleware });
+ if (!_isstream.duplex.call(void 0, connectionStream)) {
+ throw new Error(_chunk4EQNSGSRjs.messages_default.errors.invalidDuplexStream());
+ }
+ this._handleStreamDisconnect = this._handleStreamDisconnect.bind(this);
+ const mux = new (0, _objectmultiplex2.default)();
+ _readablestream.pipeline.call(void 0,
+ connectionStream,
+ mux,
+ connectionStream,
+ this._handleStreamDisconnect.bind(this, "MetaMask")
+ );
+ this._jsonRpcConnection = _jsonrpcmiddlewarestream.createStreamMiddleware.call(void 0, {
+ retryOnMessage: "METAMASK_EXTENSION_CONNECT_CAN_RETRY"
+ });
+ _readablestream.pipeline.call(void 0,
+ this._jsonRpcConnection.stream,
+ mux.createStream(jsonRpcStreamName),
+ this._jsonRpcConnection.stream,
+ this._handleStreamDisconnect.bind(this, "MetaMask RpcProvider")
+ );
+ this._rpcEngine.push(this._jsonRpcConnection.middleware);
+ this._jsonRpcConnection.events.on("notification", (payload) => {
+ const { method, params } = payload;
+ if (method === "metamask_accountsChanged") {
+ this._handleAccountsChanged(params);
+ } else if (method === "metamask_unlockStateChanged") {
+ this._handleUnlockStateChanged(params);
+ } else if (method === "metamask_chainChanged") {
+ this._handleChainChanged(params);
+ } else if (_chunkO5ECOCX2js.EMITTED_NOTIFICATIONS.includes(method)) {
+ this.emit("message", {
+ type: method,
+ data: params
+ });
+ } else if (method === "METAMASK_STREAM_FAILURE") {
+ connectionStream.destroy(
+ new Error(_chunk4EQNSGSRjs.messages_default.errors.permanentlyDisconnected())
+ );
+ }
+ });
+ }
+ //====================
+ // Private Methods
+ //====================
+ /**
+ * MUST be called by child classes.
+ *
+ * Calls `metamask_getProviderState` and passes the result to
+ * {@link BaseProvider._initializeState}. Logs an error if getting initial state
+ * fails. Throws if called after initialization has completed.
+ */
+ async _initializeStateAsync() {
+ let initialState;
+ try {
+ initialState = await this.request({
+ method: "metamask_getProviderState"
+ });
+ } catch (error) {
+ this._log.error(
+ "MetaMask: Failed to get initial state. Please report this bug.",
+ error
+ );
+ }
+ this._initializeState(initialState);
+ }
+ /**
+ * Called when connection is lost to critical streams. Emits an 'error' event
+ * from the provider with the error message and stack if present.
+ *
+ * @param streamName - The name of the stream that disconnected.
+ * @param error - The error that caused the disconnection.
+ * @fires BaseProvider#disconnect - If the provider is not already
+ * disconnected.
+ */
+ // eslint-disable-next-line no-restricted-syntax
+ _handleStreamDisconnect(streamName, error) {
+ let warningMsg = `MetaMask: Lost connection to "${streamName}".`;
+ if (_optionalChain([error, 'optionalAccess', _ => _.stack])) {
+ warningMsg += `
+${error.stack}`;
+ }
+ this._log.warn(warningMsg);
+ if (this.listenerCount("error") > 0) {
+ this.emit("error", warningMsg);
+ }
+ this._handleDisconnect(false, error ? error.message : void 0);
+ }
+ /**
+ * Upon receipt of a new chainId and networkVersion, emits corresponding
+ * events and sets relevant public state. This class does not have a
+ * `networkVersion` property, but we rely on receiving a `networkVersion`
+ * with the value of `loading` to detect when the network is changing and
+ * a recoverable `disconnect` even has occurred. Child classes that use the
+ * `networkVersion` for other purposes must implement additional handling
+ * therefore.
+ *
+ * @fires BaseProvider#chainChanged
+ * @param networkInfo - An object with network info.
+ * @param networkInfo.chainId - The latest chain ID.
+ * @param networkInfo.networkVersion - The latest network ID.
+ */
+ _handleChainChanged({
+ chainId,
+ networkVersion
+ } = {}) {
+ if (!_chunkO5ECOCX2js.isValidChainId.call(void 0, chainId) || !_chunkO5ECOCX2js.isValidNetworkVersion.call(void 0, networkVersion)) {
+ this._log.error(_chunk4EQNSGSRjs.messages_default.errors.invalidNetworkParams(), {
+ chainId,
+ networkVersion
+ });
+ return;
+ }
+ if (networkVersion === "loading") {
+ this._handleDisconnect(true);
+ } else {
+ super._handleChainChanged({ chainId });
+ }
+ }
+};
+var StreamProvider = class extends AbstractStreamProvider {
+ /**
+ * MUST be called after instantiation to complete initialization.
+ *
+ * Calls `metamask_getProviderState` and passes the result to
+ * {@link BaseProvider._initializeState}. Logs an error if getting initial state
+ * fails. Throws if called after initialization has completed.
+ */
+ async initialize() {
+ return this._initializeStateAsync();
+ }
+};
+
+
+
+
+exports.AbstractStreamProvider = AbstractStreamProvider; exports.StreamProvider = StreamProvider;
+
+},{"./chunk-4EQNSGSR.js":50,"./chunk-A3W22U42.js":52,"./chunk-O5ECOCX2.js":58,"@metamask/json-rpc-middleware-stream":32,"@metamask/object-multiplex":65,"is-stream":159,"readable-stream":81}],55:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
+
+var _chunkQ4DN6VYNjs = require('./chunk-Q4DN6VYN.js');
+
+
+var _chunkDWR5HIZKjs = require('./chunk-DWR5HIZK.js');
+
+
+
+
+
+var _chunkO5ECOCX2js = require('./chunk-O5ECOCX2.js');
+
+
+var _chunk4EQNSGSRjs = require('./chunk-4EQNSGSR.js');
+
+
+
+
+var _chunk3W5G4CYIjs = require('./chunk-3W5G4CYI.js');
+
+// src/MetaMaskInpageProvider.ts
+var _rpcerrors = require('@metamask/rpc-errors');
+var MetaMaskInpageProviderStreamName = "metamask-provider";
+var _networkVersion;
+var MetaMaskInpageProvider = class extends _chunkDWR5HIZKjs.AbstractStreamProvider {
+ /**
+ * Creates a new `MetaMaskInpageProvider`.
+ *
+ * @param connectionStream - A Node.js duplex stream.
+ * @param options - An options bag.
+ * @param options.jsonRpcStreamName - The name of the internal JSON-RPC stream.
+ * Default: `metamask-provider`.
+ * @param options.logger - The logging API to use. Default: `console`.
+ * @param options.maxEventListeners - The maximum number of event
+ * listeners. Default: 100.
+ * @param options.shouldSendMetadata - Whether the provider should
+ * send page metadata. Default: `true`.
+ */
+ constructor(connectionStream, {
+ jsonRpcStreamName = MetaMaskInpageProviderStreamName,
+ logger = console,
+ maxEventListeners = 100,
+ shouldSendMetadata
+ } = {}) {
+ super(connectionStream, {
+ jsonRpcStreamName,
+ logger,
+ maxEventListeners,
+ rpcMiddleware: _chunkO5ECOCX2js.getDefaultExternalMiddleware.call(void 0, logger)
+ });
+ this._sentWarnings = {
+ // properties
+ chainId: false,
+ networkVersion: false,
+ selectedAddress: false,
+ // methods
+ enable: false,
+ experimentalMethods: false,
+ send: false,
+ // events
+ events: {
+ close: false,
+ data: false,
+ networkChanged: false,
+ notification: false
+ }
+ };
+ _chunk3W5G4CYIjs.__privateAdd.call(void 0, this, _networkVersion, void 0);
+ this._initializeStateAsync();
+ _chunk3W5G4CYIjs.__privateSet.call(void 0, this, _networkVersion, null);
+ this.isMetaMask = true;
+ this._sendSync = this._sendSync.bind(this);
+ this.enable = this.enable.bind(this);
+ this.send = this.send.bind(this);
+ this.sendAsync = this.sendAsync.bind(this);
+ this._warnOfDeprecation = this._warnOfDeprecation.bind(this);
+ this._metamask = this._getExperimentalApi();
+ this._jsonRpcConnection.events.on("notification", (payload) => {
+ const { method } = payload;
+ if (_chunkO5ECOCX2js.EMITTED_NOTIFICATIONS.includes(method)) {
+ this.emit("data", payload);
+ this.emit("notification", payload.params.result);
+ }
+ });
+ if (shouldSendMetadata) {
+ if (document.readyState === "complete") {
+ _chunkQ4DN6VYNjs.sendSiteMetadata.call(void 0, this._rpcEngine, this._log);
+ } else {
+ const domContentLoadedHandler = () => {
+ _chunkQ4DN6VYNjs.sendSiteMetadata.call(void 0, this._rpcEngine, this._log);
+ window.removeEventListener(
+ "DOMContentLoaded",
+ domContentLoadedHandler
+ );
+ };
+ window.addEventListener("DOMContentLoaded", domContentLoadedHandler);
+ }
+ }
+ }
+ //====================
+ // Deprecated Properties
+ //====================
+ get chainId() {
+ if (!this._sentWarnings.chainId) {
+ this._log.warn(_chunk4EQNSGSRjs.messages_default.warnings.chainIdDeprecation);
+ this._sentWarnings.chainId = true;
+ }
+ return super.chainId;
+ }
+ get networkVersion() {
+ if (!this._sentWarnings.networkVersion) {
+ this._log.warn(_chunk4EQNSGSRjs.messages_default.warnings.networkVersionDeprecation);
+ this._sentWarnings.networkVersion = true;
+ }
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _networkVersion);
+ }
+ get selectedAddress() {
+ if (!this._sentWarnings.selectedAddress) {
+ this._log.warn(_chunk4EQNSGSRjs.messages_default.warnings.selectedAddressDeprecation);
+ this._sentWarnings.selectedAddress = true;
+ }
+ return super.selectedAddress;
+ }
+ //====================
+ // Public Methods
+ //====================
+ /**
+ * Submits an RPC request per the given JSON-RPC request object.
+ *
+ * @param payload - The RPC request object.
+ * @param callback - The callback function.
+ */
+ sendAsync(payload, callback) {
+ this._rpcRequest(payload, callback);
+ }
+ /**
+ * We override the following event methods so that we can warn consumers
+ * about deprecated events:
+ * `addListener`, `on`, `once`, `prependListener`, `prependOnceListener`.
+ */
+ addListener(eventName, listener) {
+ this._warnOfDeprecation(eventName);
+ return super.addListener(eventName, listener);
+ }
+ on(eventName, listener) {
+ this._warnOfDeprecation(eventName);
+ return super.on(eventName, listener);
+ }
+ once(eventName, listener) {
+ this._warnOfDeprecation(eventName);
+ return super.once(eventName, listener);
+ }
+ prependListener(eventName, listener) {
+ this._warnOfDeprecation(eventName);
+ return super.prependListener(eventName, listener);
+ }
+ prependOnceListener(eventName, listener) {
+ this._warnOfDeprecation(eventName);
+ return super.prependOnceListener(eventName, listener);
+ }
+ //====================
+ // Private Methods
+ //====================
+ /**
+ * When the provider becomes disconnected, updates internal state and emits
+ * required events. Idempotent with respect to the isRecoverable parameter.
+ *
+ * Error codes per the CloseEvent status codes as required by EIP-1193:
+ * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes.
+ *
+ * @param isRecoverable - Whether the disconnection is recoverable.
+ * @param errorMessage - A custom error message.
+ * @fires BaseProvider#disconnect - If the disconnection is not recoverable.
+ */
+ _handleDisconnect(isRecoverable, errorMessage) {
+ super._handleDisconnect(isRecoverable, errorMessage);
+ if (_chunk3W5G4CYIjs.__privateGet.call(void 0, this, _networkVersion) && !isRecoverable) {
+ _chunk3W5G4CYIjs.__privateSet.call(void 0, this, _networkVersion, null);
+ }
+ }
+ /**
+ * Warns of deprecation for the given event, if applicable.
+ *
+ * @param eventName - The name of the event.
+ */
+ _warnOfDeprecation(eventName) {
+ if (_optionalChain([this, 'access', _ => _._sentWarnings, 'optionalAccess', _2 => _2.events, 'access', _3 => _3[eventName]]) === false) {
+ this._log.warn(_chunk4EQNSGSRjs.messages_default.warnings.events[eventName]);
+ this._sentWarnings.events[eventName] = true;
+ }
+ }
+ //====================
+ // Deprecated Methods
+ //====================
+ /**
+ * Equivalent to: `ethereum.request('eth_requestAccounts')`.
+ *
+ * @deprecated Use request({ method: 'eth_requestAccounts' }) instead.
+ * @returns A promise that resolves to an array of addresses.
+ */
+ async enable() {
+ if (!this._sentWarnings.enable) {
+ this._log.warn(_chunk4EQNSGSRjs.messages_default.warnings.enableDeprecation);
+ this._sentWarnings.enable = true;
+ }
+ return new Promise((resolve, reject) => {
+ try {
+ this._rpcRequest(
+ { method: "eth_requestAccounts", params: [] },
+ _chunkO5ECOCX2js.getRpcPromiseCallback.call(void 0, resolve, reject)
+ );
+ } catch (error) {
+ reject(error);
+ }
+ });
+ }
+ // eslint-disable-next-line @typescript-eslint/promise-function-async
+ send(methodOrPayload, callbackOrArgs) {
+ if (!this._sentWarnings.send) {
+ this._log.warn(_chunk4EQNSGSRjs.messages_default.warnings.sendDeprecation);
+ this._sentWarnings.send = true;
+ }
+ if (typeof methodOrPayload === "string" && (!callbackOrArgs || Array.isArray(callbackOrArgs))) {
+ return new Promise((resolve, reject) => {
+ try {
+ this._rpcRequest(
+ { method: methodOrPayload, params: callbackOrArgs },
+ _chunkO5ECOCX2js.getRpcPromiseCallback.call(void 0, resolve, reject, false)
+ );
+ } catch (error) {
+ reject(error);
+ }
+ });
+ } else if (methodOrPayload && typeof methodOrPayload === "object" && typeof callbackOrArgs === "function") {
+ return this._rpcRequest(
+ methodOrPayload,
+ callbackOrArgs
+ );
+ }
+ return this._sendSync(methodOrPayload);
+ }
+ /**
+ * Internal backwards compatibility method, used in send.
+ *
+ * @param payload - A JSON-RPC request object.
+ * @returns A JSON-RPC response object.
+ * @deprecated
+ */
+ _sendSync(payload) {
+ let result;
+ switch (payload.method) {
+ case "eth_accounts":
+ result = this.selectedAddress ? [this.selectedAddress] : [];
+ break;
+ case "eth_coinbase":
+ result = _nullishCoalesce(this.selectedAddress, () => ( null));
+ break;
+ case "eth_uninstallFilter":
+ this._rpcRequest(payload, _chunkO5ECOCX2js.NOOP);
+ result = true;
+ break;
+ case "net_version":
+ result = _nullishCoalesce(_chunk3W5G4CYIjs.__privateGet.call(void 0, this, _networkVersion), () => ( null));
+ break;
+ default:
+ throw new Error(_chunk4EQNSGSRjs.messages_default.errors.unsupportedSync(payload.method));
+ }
+ return {
+ id: payload.id,
+ jsonrpc: payload.jsonrpc,
+ result
+ };
+ }
+ /**
+ * Constructor helper.
+ *
+ * Gets the experimental _metamask API as Proxy, so that we can warn consumers
+ * about its experimental nature.
+ *
+ * @returns The experimental _metamask API.
+ */
+ _getExperimentalApi() {
+ return new Proxy(
+ {
+ /**
+ * Determines if MetaMask is unlocked by the user.
+ *
+ * @returns Promise resolving to true if MetaMask is currently unlocked.
+ */
+ isUnlocked: async () => {
+ if (!this._state.initialized) {
+ await new Promise((resolve) => {
+ this.on("_initialized", () => resolve());
+ });
+ }
+ return this._state.isUnlocked;
+ },
+ /**
+ * Make a batch RPC request.
+ *
+ * @param requests - The RPC requests to make.
+ */
+ requestBatch: async (requests) => {
+ if (!Array.isArray(requests)) {
+ throw _rpcerrors.rpcErrors.invalidRequest({
+ message: "Batch requests must be made with an array of request objects.",
+ data: requests
+ });
+ }
+ return new Promise((resolve, reject) => {
+ this._rpcRequest(requests, _chunkO5ECOCX2js.getRpcPromiseCallback.call(void 0, resolve, reject));
+ });
+ }
+ },
+ {
+ get: (obj, prop, ...args) => {
+ if (!this._sentWarnings.experimentalMethods) {
+ this._log.warn(_chunk4EQNSGSRjs.messages_default.warnings.experimentalMethods);
+ this._sentWarnings.experimentalMethods = true;
+ }
+ return Reflect.get(obj, prop, ...args);
+ }
+ }
+ );
+ }
+ /**
+ * Upon receipt of a new chainId and networkVersion, emits corresponding
+ * events and sets relevant public state. Does nothing if neither the chainId
+ * nor the networkVersion are different from existing values.
+ *
+ * @fires MetamaskInpageProvider#networkChanged
+ * @param networkInfo - An object with network info.
+ * @param networkInfo.chainId - The latest chain ID.
+ * @param networkInfo.networkVersion - The latest network ID.
+ */
+ _handleChainChanged({
+ chainId,
+ networkVersion
+ } = {}) {
+ super._handleChainChanged({ chainId, networkVersion });
+ if (this._state.isConnected && networkVersion !== _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _networkVersion)) {
+ _chunk3W5G4CYIjs.__privateSet.call(void 0, this, _networkVersion, networkVersion);
+ if (this._state.initialized) {
+ this.emit("networkChanged", _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _networkVersion));
+ }
+ }
+ }
+};
+_networkVersion = new WeakMap();
+
+
+
+
+exports.MetaMaskInpageProviderStreamName = MetaMaskInpageProviderStreamName; exports.MetaMaskInpageProvider = MetaMaskInpageProvider;
+
+},{"./chunk-3W5G4CYI.js":49,"./chunk-4EQNSGSR.js":50,"./chunk-DWR5HIZK.js":54,"./chunk-O5ECOCX2.js":58,"./chunk-Q4DN6VYN.js":59,"@metamask/rpc-errors":86}],56:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+var _chunkDD6YP3BVjs = require('./chunk-DD6YP3BV.js');
+
+
+var _chunkWBB62AKCjs = require('./chunk-WBB62AKC.js');
+
+
+var _chunkHP7EYLLYjs = require('./chunk-HP7EYLLY.js');
+
+// src/initializeInpageProvider.ts
+function initializeProvider({
+ connectionStream,
+ jsonRpcStreamName,
+ logger = console,
+ maxEventListeners = 100,
+ providerInfo,
+ shouldSendMetadata = true,
+ shouldSetOnWindow = true,
+ shouldShimWeb3 = false
+}) {
+ const provider = new (0, _chunkHP7EYLLYjs.MetaMaskInpageProvider)(connectionStream, {
+ jsonRpcStreamName,
+ logger,
+ maxEventListeners,
+ shouldSendMetadata
+ });
+ const proxiedProvider = new Proxy(provider, {
+ // some common libraries, e.g. web3@1.x, mess with our API
+ deleteProperty: () => true,
+ // fix issue with Proxy unable to access private variables from getters
+ // https://stackoverflow.com/a/73051482
+ get(target, propName) {
+ return target[propName];
+ }
+ });
+ if (providerInfo) {
+ _chunkWBB62AKCjs.announceProvider.call(void 0, {
+ info: providerInfo,
+ provider: proxiedProvider
+ });
+ }
+ if (shouldSetOnWindow) {
+ setGlobalProvider(proxiedProvider);
+ }
+ if (shouldShimWeb3) {
+ _chunkDD6YP3BVjs.shimWeb3.call(void 0, proxiedProvider, logger);
+ }
+ return proxiedProvider;
+}
+function setGlobalProvider(providerInstance) {
+ window.ethereum = providerInstance;
+ window.dispatchEvent(new Event("ethereum#initialized"));
+}
+
+
+
+
+exports.initializeProvider = initializeProvider; exports.setGlobalProvider = setGlobalProvider;
+
+},{"./chunk-DD6YP3BV.js":53,"./chunk-HP7EYLLY.js":55,"./chunk-WBB62AKC.js":60}],57:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
+
+var _chunkHP7EYLLYjs = require('./chunk-HP7EYLLY.js');
+
+
+var _chunkDWR5HIZKjs = require('./chunk-DWR5HIZK.js');
+
+
+var _chunkO5ECOCX2js = require('./chunk-O5ECOCX2.js');
+
+// src/extension-provider/createExternalExtensionProvider.ts
+var _detectbrowser = require('detect-browser');
+var _extensionportstream = require('extension-port-stream'); var _extensionportstream2 = _interopRequireDefault(_extensionportstream);
+
+// src/extension-provider/external-extension-config.json
+var external_extension_config_default = {
+ chromeIds: {
+ stable: "nkbihfbeogaeaoehlefnkodbefgpgknn",
+ beta: "pbbkamfgmaedccnfkmjcofcecjhfgldn",
+ flask: "ljfoeinjpaedjfecbmggjgodbgkmjkjk"
+ },
+ firefoxIds: {
+ stable: "webextension@metamask.io",
+ beta: "webextension-beta@metamask.io",
+ flask: "webextension-flask@metamask.io"
+ }
+};
+
+// src/extension-provider/createExternalExtensionProvider.ts
+var browser = _detectbrowser.detect.call(void 0, );
+function createExternalExtensionProvider(typeOrId = "stable") {
+ let provider;
+ try {
+ const extensionId = getExtensionId(typeOrId);
+ const metamaskPort = chrome.runtime.connect(extensionId);
+ const pluginStream = new (0, _extensionportstream2.default)(metamaskPort);
+ provider = new (0, _chunkDWR5HIZKjs.StreamProvider)(pluginStream, {
+ jsonRpcStreamName: _chunkHP7EYLLYjs.MetaMaskInpageProviderStreamName,
+ logger: console,
+ rpcMiddleware: _chunkO5ECOCX2js.getDefaultExternalMiddleware.call(void 0, console)
+ });
+ provider.initialize();
+ } catch (error) {
+ console.dir(`MetaMask connect error.`, error);
+ throw error;
+ }
+ return provider;
+}
+function getExtensionId(typeOrId) {
+ const ids = _optionalChain([browser, 'optionalAccess', _ => _.name]) === "firefox" ? external_extension_config_default.firefoxIds : external_extension_config_default.chromeIds;
+ return _nullishCoalesce(ids[typeOrId], () => ( typeOrId));
+}
+
+
+
+exports.createExternalExtensionProvider = createExternalExtensionProvider;
+
+},{"./chunk-DWR5HIZK.js":54,"./chunk-HP7EYLLY.js":55,"./chunk-O5ECOCX2.js":58,"detect-browser":123,"extension-port-stream":129}],58:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+var _chunk6QNVTE4Wjs = require('./chunk-6QNVTE4W.js');
+
+// src/utils.ts
+var _jsonrpcengine = require('@metamask/json-rpc-engine');
+var _rpcerrors = require('@metamask/rpc-errors');
+var EMITTED_NOTIFICATIONS = Object.freeze([
+ "eth_subscription"
+ // per eth-json-rpc-filters/subscriptionManager
+]);
+var getDefaultExternalMiddleware = (logger = console) => [
+ _jsonrpcengine.createIdRemapMiddleware.call(void 0, ),
+ createErrorMiddleware(logger),
+ _chunk6QNVTE4Wjs.createRpcWarningMiddleware.call(void 0, logger)
+];
+function createErrorMiddleware(log) {
+ return (request, response, next) => {
+ if (typeof request.method !== "string" || !request.method) {
+ response.error = _rpcerrors.rpcErrors.invalidRequest({
+ message: `The request 'method' must be a non-empty string.`,
+ data: request
+ });
+ }
+ next((done) => {
+ const { error } = response;
+ if (!error) {
+ return done();
+ }
+ log.error(`MetaMask - RPC Error: ${error.message}`, error);
+ return done();
+ });
+ };
+}
+var getRpcPromiseCallback = (resolve, reject, unwrapResult = true) => (error, response) => {
+ if (error || response.error) {
+ reject(error || response.error);
+ } else {
+ !unwrapResult || Array.isArray(response) ? resolve(response) : resolve(response.result);
+ }
+};
+var isValidChainId = (chainId) => Boolean(chainId) && typeof chainId === "string" && chainId.startsWith("0x");
+var isValidNetworkVersion = (networkVersion) => Boolean(networkVersion) && typeof networkVersion === "string";
+var NOOP = () => void 0;
+
+
+
+
+
+
+
+
+exports.EMITTED_NOTIFICATIONS = EMITTED_NOTIFICATIONS; exports.getDefaultExternalMiddleware = getDefaultExternalMiddleware; exports.getRpcPromiseCallback = getRpcPromiseCallback; exports.isValidChainId = isValidChainId; exports.isValidNetworkVersion = isValidNetworkVersion; exports.NOOP = NOOP;
+
+},{"./chunk-6QNVTE4W.js":51,"@metamask/json-rpc-engine":29,"@metamask/rpc-errors":86}],59:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+var _chunkO5ECOCX2js = require('./chunk-O5ECOCX2.js');
+
+
+var _chunk4EQNSGSRjs = require('./chunk-4EQNSGSR.js');
+
+// src/siteMetadata.ts
+async function sendSiteMetadata(engine, log) {
+ try {
+ const domainMetadata = await getSiteMetadata();
+ engine.handle(
+ {
+ jsonrpc: "2.0",
+ id: 1,
+ method: "metamask_sendDomainMetadata",
+ params: domainMetadata
+ },
+ _chunkO5ECOCX2js.NOOP
+ );
+ } catch (error) {
+ log.error({
+ message: _chunk4EQNSGSRjs.messages_default.errors.sendSiteMetadata(),
+ originalError: error
+ });
+ }
+}
+async function getSiteMetadata() {
+ return {
+ name: getSiteName(window),
+ icon: await getSiteIcon(window)
+ };
+}
+function getSiteName(windowObject) {
+ const { document: document2 } = windowObject;
+ const siteName = document2.querySelector(
+ 'head > meta[property="og:site_name"]'
+ );
+ if (siteName) {
+ return siteName.content;
+ }
+ const metaTitle = document2.querySelector(
+ 'head > meta[name="title"]'
+ );
+ if (metaTitle) {
+ return metaTitle.content;
+ }
+ if (document2.title && document2.title.length > 0) {
+ return document2.title;
+ }
+ return window.location.hostname;
+}
+async function getSiteIcon(windowObject) {
+ const { document: document2 } = windowObject;
+ const icons = document2.querySelectorAll(
+ 'head > link[rel~="icon"]'
+ );
+ for (const icon of Array.from(icons)) {
+ if (icon && await imgExists(icon.href)) {
+ return icon.href;
+ }
+ }
+ return null;
+}
+async function imgExists(url) {
+ return new Promise((resolve, reject) => {
+ try {
+ const img = document.createElement("img");
+ img.onload = () => resolve(true);
+ img.onerror = () => resolve(false);
+ img.src = url;
+ } catch (error) {
+ reject(error);
+ }
+ });
+}
+
+
+
+exports.sendSiteMetadata = sendSiteMetadata;
+
+},{"./chunk-4EQNSGSR.js":50,"./chunk-O5ECOCX2.js":58}],60:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/EIP6963.ts
+var _utils = require('@metamask/utils');
+var UUID_V4_REGEX = /(?:^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}$)|(?:^0{8}-0{4}-0{4}-0{4}-0{12}$)/u;
+var FQDN_REGEX = /(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{0,62}[a-zA-Z0-9]\.)+[a-zA-Z]{2,63}$)/u;
+function requestProvider(handleProvider) {
+ window.addEventListener(
+ "eip6963:announceProvider" /* Announce */,
+ (event) => {
+ if (!isValidAnnounceProviderEvent(event)) {
+ throwErrorEIP6963(
+ `Invalid EIP-6963 AnnounceProviderEvent object received from ${"eip6963:announceProvider" /* Announce */} event.`
+ );
+ }
+ handleProvider(event.detail);
+ }
+ );
+ window.dispatchEvent(new Event("eip6963:requestProvider" /* Request */));
+}
+function announceProvider(providerDetail) {
+ if (!isValidProviderDetail(providerDetail)) {
+ throwErrorEIP6963("Invalid EIP-6963 ProviderDetail object.");
+ }
+ const { info, provider } = providerDetail;
+ const _announceProvider = () => window.dispatchEvent(
+ new CustomEvent("eip6963:announceProvider" /* Announce */, {
+ detail: Object.freeze({ info: { ...info }, provider })
+ })
+ );
+ _announceProvider();
+ window.addEventListener(
+ "eip6963:requestProvider" /* Request */,
+ (event) => {
+ if (!isValidRequestProviderEvent(event)) {
+ throwErrorEIP6963(
+ `Invalid EIP-6963 RequestProviderEvent object received from ${"eip6963:requestProvider" /* Request */} event.`
+ );
+ }
+ _announceProvider();
+ }
+ );
+}
+function isValidRequestProviderEvent(event) {
+ return event instanceof Event && event.type === "eip6963:requestProvider" /* Request */;
+}
+function isValidAnnounceProviderEvent(event) {
+ return event instanceof CustomEvent && event.type === "eip6963:announceProvider" /* Announce */ && Object.isFrozen(event.detail) && isValidProviderDetail(event.detail);
+}
+function isValidProviderDetail(providerDetail) {
+ if (!_utils.isObject.call(void 0, providerDetail) || !_utils.isObject.call(void 0, providerDetail.info) || !_utils.isObject.call(void 0, providerDetail.provider)) {
+ return false;
+ }
+ const { info } = providerDetail;
+ return typeof info.uuid === "string" && UUID_V4_REGEX.test(info.uuid) && typeof info.name === "string" && Boolean(info.name) && typeof info.icon === "string" && info.icon.startsWith("data:image") && typeof info.rdns === "string" && FQDN_REGEX.test(info.rdns);
+}
+function throwErrorEIP6963(message) {
+ throw new Error(
+ `${message} See https://eips.ethereum.org/EIPS/eip-6963 for requirements.`
+ );
+}
+
+
+
+
+exports.requestProvider = requestProvider; exports.announceProvider = announceProvider;
+
+},{"@metamask/utils":109}],61:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/constants.ts
+var ERC721 = "ERC721";
+var ERC1155 = "ERC1155";
+var ERC20 = "ERC20";
+
+
+
+
+
+exports.ERC721 = ERC721; exports.ERC1155 = ERC1155; exports.ERC20 = ERC20;
+
+},{}],62:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+var _chunkKUKZKOBUjs = require('./chunk-KUKZKOBU.js');
+
+
+
+var _chunkIZY7ABOLjs = require('./chunk-IZY7ABOL.js');
+
+
+var _chunkDD6YP3BVjs = require('./chunk-DD6YP3BV.js');
+
+
+
+var _chunkWBB62AKCjs = require('./chunk-WBB62AKC.js');
+
+
+
+var _chunkHP7EYLLYjs = require('./chunk-HP7EYLLY.js');
+require('./chunk-Q4DN6VYN.js');
+
+
+var _chunkDWR5HIZKjs = require('./chunk-DWR5HIZK.js');
+
+
+var _chunkA3W22U42js = require('./chunk-A3W22U42.js');
+require('./chunk-O5ECOCX2.js');
+require('./chunk-6QNVTE4W.js');
+require('./chunk-ZOFGBGOM.js');
+require('./chunk-4EQNSGSR.js');
+require('./chunk-3W5G4CYI.js');
+
+
+
+
+
+
+
+
+
+
+
+exports.BaseProvider = _chunkA3W22U42js.BaseProvider; exports.MetaMaskInpageProvider = _chunkHP7EYLLYjs.MetaMaskInpageProvider; exports.MetaMaskInpageProviderStreamName = _chunkHP7EYLLYjs.MetaMaskInpageProviderStreamName; exports.StreamProvider = _chunkDWR5HIZKjs.StreamProvider; exports.createExternalExtensionProvider = _chunkKUKZKOBUjs.createExternalExtensionProvider; exports.eip6963AnnounceProvider = _chunkWBB62AKCjs.announceProvider; exports.eip6963RequestProvider = _chunkWBB62AKCjs.requestProvider; exports.initializeProvider = _chunkIZY7ABOLjs.initializeProvider; exports.setGlobalProvider = _chunkIZY7ABOLjs.setGlobalProvider; exports.shimWeb3 = _chunkDD6YP3BVjs.shimWeb3;
+
+},{"./chunk-3W5G4CYI.js":49,"./chunk-4EQNSGSR.js":50,"./chunk-6QNVTE4W.js":51,"./chunk-A3W22U42.js":52,"./chunk-DD6YP3BV.js":53,"./chunk-DWR5HIZK.js":54,"./chunk-HP7EYLLY.js":55,"./chunk-IZY7ABOL.js":56,"./chunk-KUKZKOBU.js":57,"./chunk-O5ECOCX2.js":58,"./chunk-Q4DN6VYN.js":59,"./chunk-WBB62AKC.js":60,"./chunk-ZOFGBGOM.js":61}],63:[function(require,module,exports){
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.ObjectMultiplex = void 0;
+const readable_stream_1 = require("readable-stream");
+const once_1 = __importDefault(require("once"));
+const Substream_1 = require("./Substream");
+const IGNORE_SUBSTREAM = Symbol('IGNORE_SUBSTREAM');
+class ObjectMultiplex extends readable_stream_1.Duplex {
+ constructor(opts = {}) {
+ super(Object.assign(Object.assign({}, opts), { objectMode: true }));
+ this._substreams = {};
+ }
+ createStream(name) {
+ // guard stream against destroyed already
+ if (this.destroyed) {
+ throw new Error(`ObjectMultiplex - parent stream for name "${name}" already destroyed`);
+ }
+ // guard stream against ended already
+ if (this._readableState.ended || this._writableState.ended) {
+ throw new Error(`ObjectMultiplex - parent stream for name "${name}" already ended`);
+ }
+ // validate name
+ if (!name) {
+ throw new Error('ObjectMultiplex - name must not be empty');
+ }
+ if (this._substreams[name]) {
+ throw new Error(`ObjectMultiplex - Substream for name "${name}" already exists`);
+ }
+ // create substream
+ const substream = new Substream_1.Substream({ parent: this, name });
+ this._substreams[name] = substream;
+ // listen for parent stream to end
+ anyStreamEnd(this, (_error) => {
+ return substream.destroy(_error || undefined);
+ });
+ return substream;
+ }
+ // ignore streams (dont display orphaned data warning)
+ ignoreStream(name) {
+ // validate name
+ if (!name) {
+ throw new Error('ObjectMultiplex - name must not be empty');
+ }
+ if (this._substreams[name]) {
+ throw new Error(`ObjectMultiplex - Substream for name "${name}" already exists`);
+ }
+ // set
+ this._substreams[name] = IGNORE_SUBSTREAM;
+ }
+ _read() {
+ return undefined;
+ }
+ _write(chunk, _encoding, callback) {
+ const { name, data } = chunk;
+ if (!name) {
+ console.warn(`ObjectMultiplex - malformed chunk without name "${chunk}"`);
+ return callback();
+ }
+ // get corresponding substream
+ const substream = this._substreams[name];
+ if (!substream) {
+ console.warn(`ObjectMultiplex - orphaned data for stream "${name}"`);
+ return callback();
+ }
+ // push data into substream
+ if (substream !== IGNORE_SUBSTREAM) {
+ substream.push(data);
+ }
+ return callback();
+ }
+}
+exports.ObjectMultiplex = ObjectMultiplex;
+// util
+function anyStreamEnd(stream, _cb) {
+ const cb = (0, once_1.default)(_cb);
+ (0, readable_stream_1.finished)(stream, { readable: false }, cb);
+ (0, readable_stream_1.finished)(stream, { writable: false }, cb);
+}
+
+},{"./Substream":64,"once":164,"readable-stream":81}],64:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Substream = void 0;
+const readable_stream_1 = require("readable-stream");
+class Substream extends readable_stream_1.Duplex {
+ constructor({ parent, name }) {
+ super({ objectMode: true });
+ this._parent = parent;
+ this._name = name;
+ }
+ /**
+ * Explicitly sets read operations to a no-op.
+ */
+ _read() {
+ return undefined;
+ }
+ /**
+ * Called when data should be written to this writable stream.
+ *
+ * @param chunk - Arbitrary object to write
+ * @param encoding - Encoding to use when writing payload
+ * @param callback - Called when writing is complete or an error occurs
+ */
+ _write(chunk, _encoding, callback) {
+ this._parent.push({
+ name: this._name,
+ data: chunk,
+ });
+ callback();
+ }
+}
+exports.Substream = Substream;
+
+},{"readable-stream":81}],65:[function(require,module,exports){
+"use strict";
+const ObjectMultiplex_1 = require("./ObjectMultiplex");
+module.exports = ObjectMultiplex_1.ObjectMultiplex;
+
+},{"./ObjectMultiplex":63}],66:[function(require,module,exports){
+'use strict';
+
+// do not edit .js files directly - edit src/index.jst
+
+
+
+module.exports = function equal(a, b) {
+ if (a === b) return true;
+
+ if (a && b && typeof a == 'object' && typeof b == 'object') {
+ if (a.constructor !== b.constructor) return false;
+
+ var length, i, keys;
+ if (Array.isArray(a)) {
+ length = a.length;
+ if (length != b.length) return false;
+ for (i = length; i-- !== 0;)
+ if (!equal(a[i], b[i])) return false;
+ return true;
+ }
+
+
+
+ if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;
+ if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();
+ if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();
+
+ keys = Object.keys(a);
+ length = keys.length;
+ if (length !== Object.keys(b).length) return false;
+
+ for (i = length; i-- !== 0;)
+ if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;
+
+ for (i = length; i-- !== 0;) {
+ var key = keys[i];
+
+ if (!equal(a[key], b[key])) return false;
+ }
+
+ return true;
+ }
+
+ // true if both NaN, false otherwise
+ return a!==a && b!==b;
+};
+
+},{}],67:[function(require,module,exports){
+arguments[4][33][0].apply(exports,arguments)
+},{"dup":33}],68:[function(require,module,exports){
+arguments[4][34][0].apply(exports,arguments)
+},{"./_stream_readable":70,"./_stream_writable":72,"_process":168,"dup":34,"inherits":156}],69:[function(require,module,exports){
+arguments[4][35][0].apply(exports,arguments)
+},{"./_stream_transform":71,"dup":35,"inherits":156}],70:[function(require,module,exports){
+arguments[4][36][0].apply(exports,arguments)
+},{"../errors":67,"./_stream_duplex":68,"./internal/streams/async_iterator":73,"./internal/streams/buffer_list":74,"./internal/streams/destroy":75,"./internal/streams/from":77,"./internal/streams/state":79,"./internal/streams/stream":80,"_process":168,"buffer":120,"dup":36,"events":128,"inherits":156,"string_decoder/":217,"util":119}],71:[function(require,module,exports){
+arguments[4][37][0].apply(exports,arguments)
+},{"../errors":67,"./_stream_duplex":68,"dup":37,"inherits":156}],72:[function(require,module,exports){
+arguments[4][38][0].apply(exports,arguments)
+},{"../errors":67,"./_stream_duplex":68,"./internal/streams/destroy":75,"./internal/streams/state":79,"./internal/streams/stream":80,"_process":168,"buffer":120,"dup":38,"inherits":156,"util-deprecate":221}],73:[function(require,module,exports){
+arguments[4][39][0].apply(exports,arguments)
+},{"./end-of-stream":76,"_process":168,"dup":39}],74:[function(require,module,exports){
+arguments[4][40][0].apply(exports,arguments)
+},{"buffer":120,"dup":40,"util":119}],75:[function(require,module,exports){
+arguments[4][41][0].apply(exports,arguments)
+},{"_process":168,"dup":41}],76:[function(require,module,exports){
+arguments[4][42][0].apply(exports,arguments)
+},{"../../../errors":67,"dup":42}],77:[function(require,module,exports){
+arguments[4][43][0].apply(exports,arguments)
+},{"dup":43}],78:[function(require,module,exports){
+arguments[4][44][0].apply(exports,arguments)
+},{"../../../errors":67,"./end-of-stream":76,"dup":44}],79:[function(require,module,exports){
+arguments[4][45][0].apply(exports,arguments)
+},{"../../../errors":67,"dup":45}],80:[function(require,module,exports){
+arguments[4][46][0].apply(exports,arguments)
+},{"dup":46,"events":128}],81:[function(require,module,exports){
+arguments[4][47][0].apply(exports,arguments)
+},{"./lib/_stream_duplex.js":68,"./lib/_stream_passthrough.js":69,"./lib/_stream_readable.js":70,"./lib/_stream_transform.js":71,"./lib/_stream_writable.js":72,"./lib/internal/streams/end-of-stream.js":76,"./lib/internal/streams/pipeline.js":78,"dup":47}],82:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var _chunkLIUXO4DWjs = require('./chunk-LIUXO4DW.js');
+
+// src/classes.ts
+var _utils = require('@metamask/utils');
+var _fastsafestringify = require('fast-safe-stringify'); var _fastsafestringify2 = _interopRequireDefault(_fastsafestringify);
+var JsonRpcError = class extends Error {
+ constructor(code, message, data) {
+ if (!Number.isInteger(code)) {
+ throw new Error('"code" must be an integer.');
+ }
+ if (!message || typeof message !== "string") {
+ throw new Error('"message" must be a non-empty string.');
+ }
+ super(message);
+ this.code = code;
+ if (data !== void 0) {
+ this.data = data;
+ }
+ }
+ /**
+ * Get the error as JSON-serializable object.
+ *
+ * @returns A plain object with all public class properties.
+ */
+ serialize() {
+ const serialized = {
+ code: this.code,
+ message: this.message
+ };
+ if (this.data !== void 0) {
+ serialized.data = this.data;
+ if (_utils.isPlainObject.call(void 0, this.data)) {
+ serialized.data.cause = _chunkLIUXO4DWjs.serializeCause.call(void 0, this.data.cause);
+ }
+ }
+ if (this.stack) {
+ serialized.stack = this.stack;
+ }
+ return serialized;
+ }
+ /**
+ * Get a string representation of the serialized error, omitting any circular
+ * references.
+ *
+ * @returns A string representation of the serialized error.
+ */
+ toString() {
+ return _fastsafestringify2.default.call(void 0, this.serialize(), stringifyReplacer, 2);
+ }
+};
+var EthereumProviderError = class extends JsonRpcError {
+ /**
+ * Create an Ethereum Provider JSON-RPC error.
+ *
+ * @param code - The JSON-RPC error code. Must be an integer in the
+ * `1000 <= n <= 4999` range.
+ * @param message - The JSON-RPC error message.
+ * @param data - Optional data to include in the error.
+ */
+ constructor(code, message, data) {
+ if (!isValidEthProviderCode(code)) {
+ throw new Error(
+ '"code" must be an integer such that: 1000 <= code <= 4999'
+ );
+ }
+ super(code, message, data);
+ }
+};
+function isValidEthProviderCode(code) {
+ return Number.isInteger(code) && code >= 1e3 && code <= 4999;
+}
+function stringifyReplacer(_, value) {
+ if (value === "[Circular]") {
+ return void 0;
+ }
+ return value;
+}
+
+
+
+
+exports.JsonRpcError = JsonRpcError; exports.EthereumProviderError = EthereumProviderError;
+
+},{"./chunk-LIUXO4DW.js":85,"@metamask/utils":109,"fast-safe-stringify":154}],83:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/error-constants.ts
+var errorCodes = {
+ rpc: {
+ invalidInput: -32e3,
+ resourceNotFound: -32001,
+ resourceUnavailable: -32002,
+ transactionRejected: -32003,
+ methodNotSupported: -32004,
+ limitExceeded: -32005,
+ parse: -32700,
+ invalidRequest: -32600,
+ methodNotFound: -32601,
+ invalidParams: -32602,
+ internal: -32603
+ },
+ provider: {
+ userRejectedRequest: 4001,
+ unauthorized: 4100,
+ unsupportedMethod: 4200,
+ disconnected: 4900,
+ chainDisconnected: 4901
+ }
+};
+var errorValues = {
+ "-32700": {
+ standard: "JSON RPC 2.0",
+ message: "Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text."
+ },
+ "-32600": {
+ standard: "JSON RPC 2.0",
+ message: "The JSON sent is not a valid Request object."
+ },
+ "-32601": {
+ standard: "JSON RPC 2.0",
+ message: "The method does not exist / is not available."
+ },
+ "-32602": {
+ standard: "JSON RPC 2.0",
+ message: "Invalid method parameter(s)."
+ },
+ "-32603": {
+ standard: "JSON RPC 2.0",
+ message: "Internal JSON-RPC error."
+ },
+ "-32000": {
+ standard: "EIP-1474",
+ message: "Invalid input."
+ },
+ "-32001": {
+ standard: "EIP-1474",
+ message: "Resource not found."
+ },
+ "-32002": {
+ standard: "EIP-1474",
+ message: "Resource unavailable."
+ },
+ "-32003": {
+ standard: "EIP-1474",
+ message: "Transaction rejected."
+ },
+ "-32004": {
+ standard: "EIP-1474",
+ message: "Method not supported."
+ },
+ "-32005": {
+ standard: "EIP-1474",
+ message: "Request limit exceeded."
+ },
+ "4001": {
+ standard: "EIP-1193",
+ message: "User rejected the request."
+ },
+ "4100": {
+ standard: "EIP-1193",
+ message: "The requested account and/or method has not been authorized by the user."
+ },
+ "4200": {
+ standard: "EIP-1193",
+ message: "The requested method is not supported by this Ethereum provider."
+ },
+ "4900": {
+ standard: "EIP-1193",
+ message: "The provider is disconnected from all chains."
+ },
+ "4901": {
+ standard: "EIP-1193",
+ message: "The provider is disconnected from the specified chain."
+ }
+};
+
+
+
+
+exports.errorCodes = errorCodes; exports.errorValues = errorValues;
+
+},{}],84:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
+
+
+var _chunk77LIU62Ijs = require('./chunk-77LIU62I.js');
+
+
+var _chunkLIUXO4DWjs = require('./chunk-LIUXO4DW.js');
+
+
+var _chunkFBHPY3A4js = require('./chunk-FBHPY3A4.js');
+
+// src/errors.ts
+var rpcErrors = {
+ /**
+ * Get a JSON RPC 2.0 Parse (-32700) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ parse: (arg) => getJsonRpcError(_chunkFBHPY3A4js.errorCodes.rpc.parse, arg),
+ /**
+ * Get a JSON RPC 2.0 Invalid Request (-32600) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ invalidRequest: (arg) => getJsonRpcError(_chunkFBHPY3A4js.errorCodes.rpc.invalidRequest, arg),
+ /**
+ * Get a JSON RPC 2.0 Invalid Params (-32602) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ invalidParams: (arg) => getJsonRpcError(_chunkFBHPY3A4js.errorCodes.rpc.invalidParams, arg),
+ /**
+ * Get a JSON RPC 2.0 Method Not Found (-32601) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ methodNotFound: (arg) => getJsonRpcError(_chunkFBHPY3A4js.errorCodes.rpc.methodNotFound, arg),
+ /**
+ * Get a JSON RPC 2.0 Internal (-32603) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ internal: (arg) => getJsonRpcError(_chunkFBHPY3A4js.errorCodes.rpc.internal, arg),
+ /**
+ * Get a JSON RPC 2.0 Server error.
+ * Permits integer error codes in the [ -32099 <= -32005 ] range.
+ * Codes -32000 through -32004 are reserved by EIP-1474.
+ *
+ * @param opts - The error options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ server: (opts) => {
+ if (!opts || typeof opts !== "object" || Array.isArray(opts)) {
+ throw new Error(
+ "Ethereum RPC Server errors must provide single object argument."
+ );
+ }
+ const { code } = opts;
+ if (!Number.isInteger(code) || code > -32005 || code < -32099) {
+ throw new Error(
+ '"code" must be an integer such that: -32099 <= code <= -32005'
+ );
+ }
+ return getJsonRpcError(code, opts);
+ },
+ /**
+ * Get an Ethereum JSON RPC Invalid Input (-32000) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ invalidInput: (arg) => getJsonRpcError(_chunkFBHPY3A4js.errorCodes.rpc.invalidInput, arg),
+ /**
+ * Get an Ethereum JSON RPC Resource Not Found (-32001) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ resourceNotFound: (arg) => getJsonRpcError(_chunkFBHPY3A4js.errorCodes.rpc.resourceNotFound, arg),
+ /**
+ * Get an Ethereum JSON RPC Resource Unavailable (-32002) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ resourceUnavailable: (arg) => getJsonRpcError(_chunkFBHPY3A4js.errorCodes.rpc.resourceUnavailable, arg),
+ /**
+ * Get an Ethereum JSON RPC Transaction Rejected (-32003) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ transactionRejected: (arg) => getJsonRpcError(_chunkFBHPY3A4js.errorCodes.rpc.transactionRejected, arg),
+ /**
+ * Get an Ethereum JSON RPC Method Not Supported (-32004) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ methodNotSupported: (arg) => getJsonRpcError(_chunkFBHPY3A4js.errorCodes.rpc.methodNotSupported, arg),
+ /**
+ * Get an Ethereum JSON RPC Limit Exceeded (-32005) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link JsonRpcError} class.
+ */
+ limitExceeded: (arg) => getJsonRpcError(_chunkFBHPY3A4js.errorCodes.rpc.limitExceeded, arg)
+};
+var providerErrors = {
+ /**
+ * Get an Ethereum Provider User Rejected Request (4001) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link EthereumProviderError} class.
+ */
+ userRejectedRequest: (arg) => {
+ return getEthProviderError(_chunkFBHPY3A4js.errorCodes.provider.userRejectedRequest, arg);
+ },
+ /**
+ * Get an Ethereum Provider Unauthorized (4100) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link EthereumProviderError} class.
+ */
+ unauthorized: (arg) => {
+ return getEthProviderError(_chunkFBHPY3A4js.errorCodes.provider.unauthorized, arg);
+ },
+ /**
+ * Get an Ethereum Provider Unsupported Method (4200) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link EthereumProviderError} class.
+ */
+ unsupportedMethod: (arg) => {
+ return getEthProviderError(_chunkFBHPY3A4js.errorCodes.provider.unsupportedMethod, arg);
+ },
+ /**
+ * Get an Ethereum Provider Not Connected (4900) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link EthereumProviderError} class.
+ */
+ disconnected: (arg) => {
+ return getEthProviderError(_chunkFBHPY3A4js.errorCodes.provider.disconnected, arg);
+ },
+ /**
+ * Get an Ethereum Provider Chain Not Connected (4901) error.
+ *
+ * @param arg - The error message or options bag.
+ * @returns An instance of the {@link EthereumProviderError} class.
+ */
+ chainDisconnected: (arg) => {
+ return getEthProviderError(_chunkFBHPY3A4js.errorCodes.provider.chainDisconnected, arg);
+ },
+ /**
+ * Get a custom Ethereum Provider error.
+ *
+ * @param opts - The error options bag.
+ * @returns An instance of the {@link EthereumProviderError} class.
+ */
+ custom: (opts) => {
+ if (!opts || typeof opts !== "object" || Array.isArray(opts)) {
+ throw new Error(
+ "Ethereum Provider custom errors must provide single object argument."
+ );
+ }
+ const { code, message, data } = opts;
+ if (!message || typeof message !== "string") {
+ throw new Error('"message" must be a nonempty string');
+ }
+ return new (0, _chunk77LIU62Ijs.EthereumProviderError)(code, message, data);
+ }
+};
+function getJsonRpcError(code, arg) {
+ const [message, data] = parseOpts(arg);
+ return new (0, _chunk77LIU62Ijs.JsonRpcError)(code, _nullishCoalesce(message, () => ( _chunkLIUXO4DWjs.getMessageFromCode.call(void 0, code))), data);
+}
+function getEthProviderError(code, arg) {
+ const [message, data] = parseOpts(arg);
+ return new (0, _chunk77LIU62Ijs.EthereumProviderError)(
+ code,
+ _nullishCoalesce(message, () => ( _chunkLIUXO4DWjs.getMessageFromCode.call(void 0, code))),
+ data
+ );
+}
+function parseOpts(arg) {
+ if (arg) {
+ if (typeof arg === "string") {
+ return [arg];
+ } else if (typeof arg === "object" && !Array.isArray(arg)) {
+ const { message, data } = arg;
+ if (message && typeof message !== "string") {
+ throw new Error("Must specify string message.");
+ }
+ return [_nullishCoalesce(message, () => ( void 0)), data];
+ }
+ }
+ return [];
+}
+
+
+
+
+exports.rpcErrors = rpcErrors; exports.providerErrors = providerErrors;
+
+},{"./chunk-77LIU62I.js":82,"./chunk-FBHPY3A4.js":83,"./chunk-LIUXO4DW.js":85}],85:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+
+var _chunkFBHPY3A4js = require('./chunk-FBHPY3A4.js');
+
+// src/utils.ts
+
+
+
+
+
+var _utils = require('@metamask/utils');
+var FALLBACK_ERROR_CODE = _chunkFBHPY3A4js.errorCodes.rpc.internal;
+var FALLBACK_MESSAGE = "Unspecified error message. This is a bug, please report it.";
+var FALLBACK_ERROR = {
+ code: FALLBACK_ERROR_CODE,
+ message: getMessageFromCode(FALLBACK_ERROR_CODE)
+};
+var JSON_RPC_SERVER_ERROR_MESSAGE = "Unspecified server error.";
+function getMessageFromCode(code, fallbackMessage = FALLBACK_MESSAGE) {
+ if (isValidCode(code)) {
+ const codeString = code.toString();
+ if (_utils.hasProperty.call(void 0, _chunkFBHPY3A4js.errorValues, codeString)) {
+ return _chunkFBHPY3A4js.errorValues[codeString].message;
+ }
+ if (isJsonRpcServerError(code)) {
+ return JSON_RPC_SERVER_ERROR_MESSAGE;
+ }
+ }
+ return fallbackMessage;
+}
+function isValidCode(code) {
+ return Number.isInteger(code);
+}
+function serializeError(error, { fallbackError = FALLBACK_ERROR, shouldIncludeStack = true } = {}) {
+ if (!_utils.isJsonRpcError.call(void 0, fallbackError)) {
+ throw new Error(
+ "Must provide fallback error with integer number code and string message."
+ );
+ }
+ const serialized = buildError(error, fallbackError);
+ if (!shouldIncludeStack) {
+ delete serialized.stack;
+ }
+ return serialized;
+}
+function buildError(error, fallbackError) {
+ if (error && typeof error === "object" && "serialize" in error && typeof error.serialize === "function") {
+ return error.serialize();
+ }
+ if (_utils.isJsonRpcError.call(void 0, error)) {
+ return error;
+ }
+ const cause = serializeCause(error);
+ const fallbackWithCause = {
+ ...fallbackError,
+ data: { cause }
+ };
+ return fallbackWithCause;
+}
+function isJsonRpcServerError(code) {
+ return code >= -32099 && code <= -32e3;
+}
+function serializeCause(error) {
+ if (Array.isArray(error)) {
+ return error.map((entry) => {
+ if (_utils.isValidJson.call(void 0, entry)) {
+ return entry;
+ } else if (_utils.isObject.call(void 0, entry)) {
+ return serializeObject(entry);
+ }
+ return null;
+ });
+ } else if (_utils.isObject.call(void 0, error)) {
+ return serializeObject(error);
+ }
+ if (_utils.isValidJson.call(void 0, error)) {
+ return error;
+ }
+ return null;
+}
+function serializeObject(object) {
+ return Object.getOwnPropertyNames(object).reduce(
+ (acc, key) => {
+ const value = object[key];
+ if (_utils.isValidJson.call(void 0, value)) {
+ acc[key] = value;
+ }
+ return acc;
+ },
+ {}
+ );
+}
+
+
+
+
+
+
+
+exports.JSON_RPC_SERVER_ERROR_MESSAGE = JSON_RPC_SERVER_ERROR_MESSAGE; exports.getMessageFromCode = getMessageFromCode; exports.isValidCode = isValidCode; exports.serializeError = serializeError; exports.serializeCause = serializeCause;
+
+},{"./chunk-FBHPY3A4.js":83,"@metamask/utils":109}],86:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+
+var _chunkI3KUC4QQjs = require('./chunk-I3KUC4QQ.js');
+
+
+
+var _chunk77LIU62Ijs = require('./chunk-77LIU62I.js');
+
+
+
+
+var _chunkLIUXO4DWjs = require('./chunk-LIUXO4DW.js');
+
+
+var _chunkFBHPY3A4js = require('./chunk-FBHPY3A4.js');
+
+
+
+
+
+
+
+
+
+exports.EthereumProviderError = _chunk77LIU62Ijs.EthereumProviderError; exports.JsonRpcError = _chunk77LIU62Ijs.JsonRpcError; exports.errorCodes = _chunkFBHPY3A4js.errorCodes; exports.getMessageFromCode = _chunkLIUXO4DWjs.getMessageFromCode; exports.providerErrors = _chunkI3KUC4QQjs.providerErrors; exports.rpcErrors = _chunkI3KUC4QQjs.rpcErrors; exports.serializeCause = _chunkLIUXO4DWjs.serializeCause; exports.serializeError = _chunkLIUXO4DWjs.serializeError;
+
+},{"./chunk-77LIU62I.js":82,"./chunk-FBHPY3A4.js":83,"./chunk-I3KUC4QQ.js":84,"./chunk-LIUXO4DW.js":85}],87:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const events_1 = require("events");
+function safeApply(handler, context, args) {
+ try {
+ Reflect.apply(handler, context, args);
+ }
+ catch (err) {
+ // Throw error after timeout so as not to interrupt the stack
+ setTimeout(() => {
+ throw err;
+ });
+ }
+}
+function arrayClone(arr) {
+ const n = arr.length;
+ const copy = new Array(n);
+ for (let i = 0; i < n; i += 1) {
+ copy[i] = arr[i];
+ }
+ return copy;
+}
+class SafeEventEmitter extends events_1.EventEmitter {
+ emit(type, ...args) {
+ let doError = type === 'error';
+ const events = this._events;
+ if (events !== undefined) {
+ doError = doError && events.error === undefined;
+ }
+ else if (!doError) {
+ return false;
+ }
+ // If there is no 'error' event listener then throw.
+ if (doError) {
+ let er;
+ if (args.length > 0) {
+ [er] = args;
+ }
+ if (er instanceof Error) {
+ // Note: The comments on the `throw` lines are intentional, they show
+ // up in Node's output if this results in an unhandled exception.
+ throw er; // Unhandled 'error' event
+ }
+ // At least give some kind of context to the user
+ const err = new Error(`Unhandled error.${er ? ` (${er.message})` : ''}`);
+ err.context = er;
+ throw err; // Unhandled 'error' event
+ }
+ const handler = events[type];
+ if (handler === undefined) {
+ return false;
+ }
+ if (typeof handler === 'function') {
+ safeApply(handler, this, args);
+ }
+ else {
+ const len = handler.length;
+ const listeners = arrayClone(handler);
+ for (let i = 0; i < len; i += 1) {
+ safeApply(listeners[i], this, args);
+ }
+ }
+ return true;
+ }
+}
+exports.default = SafeEventEmitter;
+
+},{"events":128}],88:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/logging.ts
+var _debug = require('debug'); var _debug2 = _interopRequireDefault(_debug);
+var globalLogger = _debug2.default.call(void 0, "metamask");
+function createProjectLogger(projectName) {
+ return globalLogger.extend(projectName);
+}
+function createModuleLogger(projectLogger, moduleName) {
+ return projectLogger.extend(moduleName);
+}
+
+
+
+
+exports.createProjectLogger = createProjectLogger; exports.createModuleLogger = createModuleLogger;
+
+},{"debug":121}],89:[function(require,module,exports){
+arguments[4][49][0].apply(exports,arguments)
+},{"dup":49}],90:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+var _chunk6ZDHSOUVjs = require('./chunk-6ZDHSOUV.js');
+
+// src/versions.ts
+
+
+
+
+
+
+var _semver = require('semver');
+var _superstruct = require('superstruct');
+var VersionStruct = _superstruct.refine.call(void 0,
+ _superstruct.string.call(void 0, ),
+ "Version",
+ (value) => {
+ if (_semver.valid.call(void 0, value) === null) {
+ return `Expected SemVer version, got "${value}"`;
+ }
+ return true;
+ }
+);
+var VersionRangeStruct = _superstruct.refine.call(void 0,
+ _superstruct.string.call(void 0, ),
+ "Version range",
+ (value) => {
+ if (_semver.validRange.call(void 0, value) === null) {
+ return `Expected SemVer range, got "${value}"`;
+ }
+ return true;
+ }
+);
+function isValidSemVerVersion(version) {
+ return _superstruct.is.call(void 0, version, VersionStruct);
+}
+function isValidSemVerRange(versionRange) {
+ return _superstruct.is.call(void 0, versionRange, VersionRangeStruct);
+}
+function assertIsSemVerVersion(version) {
+ _chunk6ZDHSOUVjs.assertStruct.call(void 0, version, VersionStruct);
+}
+function assertIsSemVerRange(range) {
+ _chunk6ZDHSOUVjs.assertStruct.call(void 0, range, VersionRangeStruct);
+}
+function gtVersion(version1, version2) {
+ return _semver.gt.call(void 0, version1, version2);
+}
+function gtRange(version, range) {
+ return _semver.gtr.call(void 0, version, range);
+}
+function satisfiesVersionRange(version, versionRange) {
+ return _semver.satisfies.call(void 0, version, versionRange, {
+ includePrerelease: true
+ });
+}
+
+
+
+
+
+
+
+
+
+
+
+exports.VersionStruct = VersionStruct; exports.VersionRangeStruct = VersionRangeStruct; exports.isValidSemVerVersion = isValidSemVerVersion; exports.isValidSemVerRange = isValidSemVerRange; exports.assertIsSemVerVersion = assertIsSemVerVersion; exports.assertIsSemVerRange = assertIsSemVerRange; exports.gtVersion = gtVersion; exports.gtRange = gtRange; exports.satisfiesVersionRange = satisfiesVersionRange;
+
+},{"./chunk-6ZDHSOUV.js":94,"semver":198,"superstruct":219}],91:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/time.ts
+var Duration = /* @__PURE__ */ ((Duration2) => {
+ Duration2[Duration2["Millisecond"] = 1] = "Millisecond";
+ Duration2[Duration2["Second"] = 1e3] = "Second";
+ Duration2[Duration2["Minute"] = 6e4] = "Minute";
+ Duration2[Duration2["Hour"] = 36e5] = "Hour";
+ Duration2[Duration2["Day"] = 864e5] = "Day";
+ Duration2[Duration2["Week"] = 6048e5] = "Week";
+ Duration2[Duration2["Year"] = 31536e6] = "Year";
+ return Duration2;
+})(Duration || {});
+var isNonNegativeInteger = (number) => Number.isInteger(number) && number >= 0;
+var assertIsNonNegativeInteger = (number, name) => {
+ if (!isNonNegativeInteger(number)) {
+ throw new Error(
+ `"${name}" must be a non-negative integer. Received: "${number}".`
+ );
+ }
+};
+function inMilliseconds(count, duration) {
+ assertIsNonNegativeInteger(count, "count");
+ return count * duration;
+}
+function timeSince(timestamp) {
+ assertIsNonNegativeInteger(timestamp, "timestamp");
+ return Date.now() - timestamp;
+}
+
+
+
+
+
+exports.Duration = Duration; exports.inMilliseconds = inMilliseconds; exports.timeSince = timeSince;
+
+},{}],92:[function(require,module,exports){
+"use strict";
+},{}],93:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
+
+var _chunk6ZDHSOUVjs = require('./chunk-6ZDHSOUV.js');
+
+// src/base64.ts
+var _superstruct = require('superstruct');
+var base64 = (struct, options = {}) => {
+ const paddingRequired = _nullishCoalesce(options.paddingRequired, () => ( false));
+ const characterSet = _nullishCoalesce(options.characterSet, () => ( "base64"));
+ let letters;
+ if (characterSet === "base64") {
+ letters = String.raw`[A-Za-z0-9+\/]`;
+ } else {
+ _chunk6ZDHSOUVjs.assert.call(void 0, characterSet === "base64url");
+ letters = String.raw`[-_A-Za-z0-9]`;
+ }
+ let re;
+ if (paddingRequired) {
+ re = new RegExp(
+ `^(?:${letters}{4})*(?:${letters}{3}=|${letters}{2}==)?$`,
+ "u"
+ );
+ } else {
+ re = new RegExp(
+ `^(?:${letters}{4})*(?:${letters}{2,3}|${letters}{3}=|${letters}{2}==)?$`,
+ "u"
+ );
+ }
+ return _superstruct.pattern.call(void 0, struct, re);
+};
+
+
+
+exports.base64 = base64;
+
+},{"./chunk-6ZDHSOUV.js":94,"superstruct":219}],94:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
+
+var _chunkIZC266HSjs = require('./chunk-IZC266HS.js');
+
+// src/assert.ts
+var _superstruct = require('superstruct');
+function isConstructable(fn) {
+ return Boolean(typeof _optionalChain([fn, 'optionalAccess', _ => _.prototype, 'optionalAccess', _2 => _2.constructor, 'optionalAccess', _3 => _3.name]) === "string");
+}
+function getErrorMessageWithoutTrailingPeriod(error) {
+ return _chunkIZC266HSjs.getErrorMessage.call(void 0, error).replace(/\.$/u, "");
+}
+function getError(ErrorWrapper, message) {
+ if (isConstructable(ErrorWrapper)) {
+ return new ErrorWrapper({
+ message
+ });
+ }
+ return ErrorWrapper({
+ message
+ });
+}
+var AssertionError = class extends Error {
+ constructor(options) {
+ super(options.message);
+ this.code = "ERR_ASSERTION";
+ }
+};
+function assert(value, message = "Assertion failed.", ErrorWrapper = AssertionError) {
+ if (!value) {
+ if (message instanceof Error) {
+ throw message;
+ }
+ throw getError(ErrorWrapper, message);
+ }
+}
+function assertStruct(value, struct, errorPrefix = "Assertion failed", ErrorWrapper = AssertionError) {
+ try {
+ _superstruct.assert.call(void 0, value, struct);
+ } catch (error) {
+ throw getError(
+ ErrorWrapper,
+ `${errorPrefix}: ${getErrorMessageWithoutTrailingPeriod(error)}.`
+ );
+ }
+}
+function assertExhaustive(_object) {
+ throw new Error(
+ "Invalid branch reached. Should be detected during compilation."
+ );
+}
+
+
+
+
+
+
+exports.AssertionError = AssertionError; exports.assert = assert; exports.assertStruct = assertStruct; exports.assertExhaustive = assertExhaustive;
+
+},{"./chunk-IZC266HS.js":99,"superstruct":219}],95:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/promise.ts
+function createDeferredPromise({
+ suppressUnhandledRejection = false
+} = {}) {
+ let resolve;
+ let reject;
+ const promise = new Promise(
+ (innerResolve, innerReject) => {
+ resolve = innerResolve;
+ reject = innerReject;
+ }
+ );
+ if (suppressUnhandledRejection) {
+ promise.catch((_error) => {
+ });
+ }
+ return { promise, resolve, reject };
+}
+
+
+
+exports.createDeferredPromise = createDeferredPromise;
+
+},{}],96:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+
+
+var _chunkQEPVHEP7js = require('./chunk-QEPVHEP7.js');
+
+
+var _chunk6ZDHSOUVjs = require('./chunk-6ZDHSOUV.js');
+
+// src/coercers.ts
+
+
+
+
+
+
+
+
+
+var _superstruct = require('superstruct');
+var NumberLikeStruct = _superstruct.union.call(void 0, [_superstruct.number.call(void 0, ), _superstruct.bigint.call(void 0, ), _superstruct.string.call(void 0, ), _chunkQEPVHEP7js.StrictHexStruct]);
+var NumberCoercer = _superstruct.coerce.call(void 0, _superstruct.number.call(void 0, ), NumberLikeStruct, Number);
+var BigIntCoercer = _superstruct.coerce.call(void 0, _superstruct.bigint.call(void 0, ), NumberLikeStruct, BigInt);
+var BytesLikeStruct = _superstruct.union.call(void 0, [_chunkQEPVHEP7js.StrictHexStruct, _superstruct.instance.call(void 0, Uint8Array)]);
+var BytesCoercer = _superstruct.coerce.call(void 0,
+ _superstruct.instance.call(void 0, Uint8Array),
+ _superstruct.union.call(void 0, [_chunkQEPVHEP7js.StrictHexStruct]),
+ _chunkQEPVHEP7js.hexToBytes
+);
+var HexCoercer = _superstruct.coerce.call(void 0, _chunkQEPVHEP7js.StrictHexStruct, _superstruct.instance.call(void 0, Uint8Array), _chunkQEPVHEP7js.bytesToHex);
+function createNumber(value) {
+ try {
+ const result = _superstruct.create.call(void 0, value, NumberCoercer);
+ _chunk6ZDHSOUVjs.assert.call(void 0,
+ Number.isFinite(result),
+ `Expected a number-like value, got "${value}".`
+ );
+ return result;
+ } catch (error) {
+ if (error instanceof _superstruct.StructError) {
+ throw new Error(`Expected a number-like value, got "${value}".`);
+ }
+ throw error;
+ }
+}
+function createBigInt(value) {
+ try {
+ return _superstruct.create.call(void 0, value, BigIntCoercer);
+ } catch (error) {
+ if (error instanceof _superstruct.StructError) {
+ throw new Error(
+ `Expected a number-like value, got "${String(error.value)}".`
+ );
+ }
+ throw error;
+ }
+}
+function createBytes(value) {
+ if (typeof value === "string" && value.toLowerCase() === "0x") {
+ return new Uint8Array();
+ }
+ try {
+ return _superstruct.create.call(void 0, value, BytesCoercer);
+ } catch (error) {
+ if (error instanceof _superstruct.StructError) {
+ throw new Error(
+ `Expected a bytes-like value, got "${String(error.value)}".`
+ );
+ }
+ throw error;
+ }
+}
+function createHex(value) {
+ if (value instanceof Uint8Array && value.length === 0 || typeof value === "string" && value.toLowerCase() === "0x") {
+ return "0x";
+ }
+ try {
+ return _superstruct.create.call(void 0, value, HexCoercer);
+ } catch (error) {
+ if (error instanceof _superstruct.StructError) {
+ throw new Error(
+ `Expected a bytes-like value, got "${String(error.value)}".`
+ );
+ }
+ throw error;
+ }
+}
+
+
+
+
+
+
+exports.createNumber = createNumber; exports.createBigInt = createBigInt; exports.createBytes = createBytes; exports.createHex = createHex;
+
+},{"./chunk-6ZDHSOUV.js":94,"./chunk-QEPVHEP7.js":102,"superstruct":219}],97:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+var _chunk6NZW4WK4js = require('./chunk-6NZW4WK4.js');
+
+// src/checksum.ts
+var _superstruct = require('superstruct');
+var ChecksumStruct = _superstruct.size.call(void 0,
+ _chunk6NZW4WK4js.base64.call(void 0, _superstruct.string.call(void 0, ), { paddingRequired: true }),
+ 44,
+ 44
+);
+
+
+
+exports.ChecksumStruct = ChecksumStruct;
+
+},{"./chunk-6NZW4WK4.js":93,"superstruct":219}],98:[function(require,module,exports){
+"use strict";
+},{}],99:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+
+var _chunkQVEKZRZ2js = require('./chunk-QVEKZRZ2.js');
+
+// src/errors.ts
+var _ponycause = require('pony-cause');
+function isError(error) {
+ return error instanceof Error || _chunkQVEKZRZ2js.isObject.call(void 0, error) && error.constructor.name === "Error";
+}
+function isErrorWithCode(error) {
+ return typeof error === "object" && error !== null && "code" in error;
+}
+function isErrorWithMessage(error) {
+ return typeof error === "object" && error !== null && "message" in error;
+}
+function isErrorWithStack(error) {
+ return typeof error === "object" && error !== null && "stack" in error;
+}
+function getErrorMessage(error) {
+ if (isErrorWithMessage(error) && typeof error.message === "string") {
+ return error.message;
+ }
+ if (_chunkQVEKZRZ2js.isNullOrUndefined.call(void 0, error)) {
+ return "";
+ }
+ return String(error);
+}
+function wrapError(originalError, message) {
+ if (isError(originalError)) {
+ let error;
+ if (Error.length === 2) {
+ error = new Error(message, { cause: originalError });
+ } else {
+ error = new (0, _ponycause.ErrorWithCause)(message, { cause: originalError });
+ }
+ if (isErrorWithCode(originalError)) {
+ error.code = originalError.code;
+ }
+ return error;
+ }
+ if (message.length > 0) {
+ return new Error(`${String(originalError)}: ${message}`);
+ }
+ return new Error(String(originalError));
+}
+
+
+
+
+
+
+
+exports.isErrorWithCode = isErrorWithCode; exports.isErrorWithMessage = isErrorWithMessage; exports.isErrorWithStack = isErrorWithStack; exports.getErrorMessage = getErrorMessage; exports.wrapError = wrapError;
+
+},{"./chunk-QVEKZRZ2.js":103,"pony-cause":165}],100:[function(require,module,exports){
+"use strict";
+},{}],101:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+var _chunk6ZDHSOUVjs = require('./chunk-6ZDHSOUV.js');
+
+
+var _chunkQVEKZRZ2js = require('./chunk-QVEKZRZ2.js');
+
+// src/json.ts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var _superstruct = require('superstruct');
+var object = (schema) => (
+ // The type is slightly different from a regular object struct, because we
+ // want to make properties with `undefined` in their type optional, but not
+ // `undefined` itself. This means that we need a type cast.
+ _superstruct.object.call(void 0, schema)
+);
+function hasOptional({ path, branch }) {
+ const field = path[path.length - 1];
+ return _chunkQVEKZRZ2js.hasProperty.call(void 0, branch[branch.length - 2], field);
+}
+function exactOptional(struct) {
+ return new (0, _superstruct.Struct)({
+ ...struct,
+ type: `optional ${struct.type}`,
+ validator: (value, context) => !hasOptional(context) || struct.validator(value, context),
+ refiner: (value, context) => !hasOptional(context) || struct.refiner(value, context)
+ });
+}
+var finiteNumber = () => _superstruct.define.call(void 0, "finite number", (value) => {
+ return _superstruct.is.call(void 0, value, _superstruct.number.call(void 0, )) && Number.isFinite(value);
+});
+var UnsafeJsonStruct = _superstruct.union.call(void 0, [
+ _superstruct.literal.call(void 0, null),
+ _superstruct.boolean.call(void 0, ),
+ finiteNumber(),
+ _superstruct.string.call(void 0, ),
+ _superstruct.array.call(void 0, _superstruct.lazy.call(void 0, () => UnsafeJsonStruct)),
+ _superstruct.record.call(void 0,
+ _superstruct.string.call(void 0, ),
+ _superstruct.lazy.call(void 0, () => UnsafeJsonStruct)
+ )
+]);
+var JsonStruct = _superstruct.coerce.call(void 0, UnsafeJsonStruct, _superstruct.any.call(void 0, ), (value) => {
+ _chunk6ZDHSOUVjs.assertStruct.call(void 0, value, UnsafeJsonStruct);
+ return JSON.parse(
+ JSON.stringify(value, (propKey, propValue) => {
+ if (propKey === "__proto__" || propKey === "constructor") {
+ return void 0;
+ }
+ return propValue;
+ })
+ );
+});
+function isValidJson(value) {
+ try {
+ getSafeJson(value);
+ return true;
+ } catch (e) {
+ return false;
+ }
+}
+function getSafeJson(value) {
+ return _superstruct.create.call(void 0, value, JsonStruct);
+}
+function getJsonSize(value) {
+ _chunk6ZDHSOUVjs.assertStruct.call(void 0, value, JsonStruct, "Invalid JSON value");
+ const json = JSON.stringify(value);
+ return new TextEncoder().encode(json).byteLength;
+}
+var jsonrpc2 = "2.0";
+var JsonRpcVersionStruct = _superstruct.literal.call(void 0, jsonrpc2);
+var JsonRpcIdStruct = _superstruct.nullable.call(void 0, _superstruct.union.call(void 0, [_superstruct.number.call(void 0, ), _superstruct.string.call(void 0, )]));
+var JsonRpcErrorStruct = object({
+ code: _superstruct.integer.call(void 0, ),
+ message: _superstruct.string.call(void 0, ),
+ data: exactOptional(JsonStruct),
+ stack: exactOptional(_superstruct.string.call(void 0, ))
+});
+var JsonRpcParamsStruct = _superstruct.union.call(void 0, [_superstruct.record.call(void 0, _superstruct.string.call(void 0, ), JsonStruct), _superstruct.array.call(void 0, JsonStruct)]);
+var JsonRpcRequestStruct = object({
+ id: JsonRpcIdStruct,
+ jsonrpc: JsonRpcVersionStruct,
+ method: _superstruct.string.call(void 0, ),
+ params: exactOptional(JsonRpcParamsStruct)
+});
+var JsonRpcNotificationStruct = object({
+ jsonrpc: JsonRpcVersionStruct,
+ method: _superstruct.string.call(void 0, ),
+ params: exactOptional(JsonRpcParamsStruct)
+});
+function isJsonRpcNotification(value) {
+ return _superstruct.is.call(void 0, value, JsonRpcNotificationStruct);
+}
+function assertIsJsonRpcNotification(value, ErrorWrapper) {
+ _chunk6ZDHSOUVjs.assertStruct.call(void 0,
+ value,
+ JsonRpcNotificationStruct,
+ "Invalid JSON-RPC notification",
+ ErrorWrapper
+ );
+}
+function isJsonRpcRequest(value) {
+ return _superstruct.is.call(void 0, value, JsonRpcRequestStruct);
+}
+function assertIsJsonRpcRequest(value, ErrorWrapper) {
+ _chunk6ZDHSOUVjs.assertStruct.call(void 0,
+ value,
+ JsonRpcRequestStruct,
+ "Invalid JSON-RPC request",
+ ErrorWrapper
+ );
+}
+var PendingJsonRpcResponseStruct = _superstruct.object.call(void 0, {
+ id: JsonRpcIdStruct,
+ jsonrpc: JsonRpcVersionStruct,
+ result: _superstruct.optional.call(void 0, _superstruct.unknown.call(void 0, )),
+ error: _superstruct.optional.call(void 0, JsonRpcErrorStruct)
+});
+var JsonRpcSuccessStruct = object({
+ id: JsonRpcIdStruct,
+ jsonrpc: JsonRpcVersionStruct,
+ result: JsonStruct
+});
+var JsonRpcFailureStruct = object({
+ id: JsonRpcIdStruct,
+ jsonrpc: JsonRpcVersionStruct,
+ error: JsonRpcErrorStruct
+});
+var JsonRpcResponseStruct = _superstruct.union.call(void 0, [
+ JsonRpcSuccessStruct,
+ JsonRpcFailureStruct
+]);
+function isPendingJsonRpcResponse(response) {
+ return _superstruct.is.call(void 0, response, PendingJsonRpcResponseStruct);
+}
+function assertIsPendingJsonRpcResponse(response, ErrorWrapper) {
+ _chunk6ZDHSOUVjs.assertStruct.call(void 0,
+ response,
+ PendingJsonRpcResponseStruct,
+ "Invalid pending JSON-RPC response",
+ ErrorWrapper
+ );
+}
+function isJsonRpcResponse(response) {
+ return _superstruct.is.call(void 0, response, JsonRpcResponseStruct);
+}
+function assertIsJsonRpcResponse(value, ErrorWrapper) {
+ _chunk6ZDHSOUVjs.assertStruct.call(void 0,
+ value,
+ JsonRpcResponseStruct,
+ "Invalid JSON-RPC response",
+ ErrorWrapper
+ );
+}
+function isJsonRpcSuccess(value) {
+ return _superstruct.is.call(void 0, value, JsonRpcSuccessStruct);
+}
+function assertIsJsonRpcSuccess(value, ErrorWrapper) {
+ _chunk6ZDHSOUVjs.assertStruct.call(void 0,
+ value,
+ JsonRpcSuccessStruct,
+ "Invalid JSON-RPC success response",
+ ErrorWrapper
+ );
+}
+function isJsonRpcFailure(value) {
+ return _superstruct.is.call(void 0, value, JsonRpcFailureStruct);
+}
+function assertIsJsonRpcFailure(value, ErrorWrapper) {
+ _chunk6ZDHSOUVjs.assertStruct.call(void 0,
+ value,
+ JsonRpcFailureStruct,
+ "Invalid JSON-RPC failure response",
+ ErrorWrapper
+ );
+}
+function isJsonRpcError(value) {
+ return _superstruct.is.call(void 0, value, JsonRpcErrorStruct);
+}
+function assertIsJsonRpcError(value, ErrorWrapper) {
+ _chunk6ZDHSOUVjs.assertStruct.call(void 0,
+ value,
+ JsonRpcErrorStruct,
+ "Invalid JSON-RPC error",
+ ErrorWrapper
+ );
+}
+function getJsonRpcIdValidator(options) {
+ const { permitEmptyString, permitFractions, permitNull } = {
+ permitEmptyString: true,
+ permitFractions: false,
+ permitNull: true,
+ ...options
+ };
+ const isValidJsonRpcId = (id) => {
+ return Boolean(
+ typeof id === "number" && (permitFractions || Number.isInteger(id)) || typeof id === "string" && (permitEmptyString || id.length > 0) || permitNull && id === null
+ );
+ };
+ return isValidJsonRpcId;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+exports.object = object; exports.exactOptional = exactOptional; exports.UnsafeJsonStruct = UnsafeJsonStruct; exports.JsonStruct = JsonStruct; exports.isValidJson = isValidJson; exports.getSafeJson = getSafeJson; exports.getJsonSize = getJsonSize; exports.jsonrpc2 = jsonrpc2; exports.JsonRpcVersionStruct = JsonRpcVersionStruct; exports.JsonRpcIdStruct = JsonRpcIdStruct; exports.JsonRpcErrorStruct = JsonRpcErrorStruct; exports.JsonRpcParamsStruct = JsonRpcParamsStruct; exports.JsonRpcRequestStruct = JsonRpcRequestStruct; exports.JsonRpcNotificationStruct = JsonRpcNotificationStruct; exports.isJsonRpcNotification = isJsonRpcNotification; exports.assertIsJsonRpcNotification = assertIsJsonRpcNotification; exports.isJsonRpcRequest = isJsonRpcRequest; exports.assertIsJsonRpcRequest = assertIsJsonRpcRequest; exports.PendingJsonRpcResponseStruct = PendingJsonRpcResponseStruct; exports.JsonRpcSuccessStruct = JsonRpcSuccessStruct; exports.JsonRpcFailureStruct = JsonRpcFailureStruct; exports.JsonRpcResponseStruct = JsonRpcResponseStruct; exports.isPendingJsonRpcResponse = isPendingJsonRpcResponse; exports.assertIsPendingJsonRpcResponse = assertIsPendingJsonRpcResponse; exports.isJsonRpcResponse = isJsonRpcResponse; exports.assertIsJsonRpcResponse = assertIsJsonRpcResponse; exports.isJsonRpcSuccess = isJsonRpcSuccess; exports.assertIsJsonRpcSuccess = assertIsJsonRpcSuccess; exports.isJsonRpcFailure = isJsonRpcFailure; exports.assertIsJsonRpcFailure = assertIsJsonRpcFailure; exports.isJsonRpcError = isJsonRpcError; exports.assertIsJsonRpcError = assertIsJsonRpcError; exports.getJsonRpcIdValidator = getJsonRpcIdValidator;
+
+},{"./chunk-6ZDHSOUV.js":94,"./chunk-QVEKZRZ2.js":103,"superstruct":219}],102:[function(require,module,exports){
+(function (Buffer){(function (){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
+
+var _chunk6ZDHSOUVjs = require('./chunk-6ZDHSOUV.js');
+
+// src/hex.ts
+var _sha3 = require('@noble/hashes/sha3');
+var _superstruct = require('superstruct');
+
+// src/bytes.ts
+var _base = require('@scure/base');
+var HEX_MINIMUM_NUMBER_CHARACTER = 48;
+var HEX_MAXIMUM_NUMBER_CHARACTER = 58;
+var HEX_CHARACTER_OFFSET = 87;
+function getPrecomputedHexValuesBuilder() {
+ const lookupTable = [];
+ return () => {
+ if (lookupTable.length === 0) {
+ for (let i = 0; i < 256; i++) {
+ lookupTable.push(i.toString(16).padStart(2, "0"));
+ }
+ }
+ return lookupTable;
+ };
+}
+var getPrecomputedHexValues = getPrecomputedHexValuesBuilder();
+function isBytes(value) {
+ return value instanceof Uint8Array;
+}
+function assertIsBytes(value) {
+ _chunk6ZDHSOUVjs.assert.call(void 0, isBytes(value), "Value must be a Uint8Array.");
+}
+function bytesToHex(bytes) {
+ assertIsBytes(bytes);
+ if (bytes.length === 0) {
+ return "0x";
+ }
+ const lookupTable = getPrecomputedHexValues();
+ const hexadecimal = new Array(bytes.length);
+ for (let i = 0; i < bytes.length; i++) {
+ hexadecimal[i] = lookupTable[bytes[i]];
+ }
+ return add0x(hexadecimal.join(""));
+}
+function bytesToBigInt(bytes) {
+ assertIsBytes(bytes);
+ const hexadecimal = bytesToHex(bytes);
+ return BigInt(hexadecimal);
+}
+function bytesToSignedBigInt(bytes) {
+ assertIsBytes(bytes);
+ let value = BigInt(0);
+ for (const byte of bytes) {
+ value = (value << BigInt(8)) + BigInt(byte);
+ }
+ return BigInt.asIntN(bytes.length * 8, value);
+}
+function bytesToNumber(bytes) {
+ assertIsBytes(bytes);
+ const bigint = bytesToBigInt(bytes);
+ _chunk6ZDHSOUVjs.assert.call(void 0,
+ bigint <= BigInt(Number.MAX_SAFE_INTEGER),
+ "Number is not a safe integer. Use `bytesToBigInt` instead."
+ );
+ return Number(bigint);
+}
+function bytesToString(bytes) {
+ assertIsBytes(bytes);
+ return new TextDecoder().decode(bytes);
+}
+function bytesToBase64(bytes) {
+ assertIsBytes(bytes);
+ return _base.base64.encode(bytes);
+}
+function hexToBytes(value) {
+ if (_optionalChain([value, 'optionalAccess', _ => _.toLowerCase, 'optionalCall', _2 => _2()]) === "0x") {
+ return new Uint8Array();
+ }
+ assertIsHexString(value);
+ const strippedValue = remove0x(value).toLowerCase();
+ const normalizedValue = strippedValue.length % 2 === 0 ? strippedValue : `0${strippedValue}`;
+ const bytes = new Uint8Array(normalizedValue.length / 2);
+ for (let i = 0; i < bytes.length; i++) {
+ const c1 = normalizedValue.charCodeAt(i * 2);
+ const c2 = normalizedValue.charCodeAt(i * 2 + 1);
+ const n1 = c1 - (c1 < HEX_MAXIMUM_NUMBER_CHARACTER ? HEX_MINIMUM_NUMBER_CHARACTER : HEX_CHARACTER_OFFSET);
+ const n2 = c2 - (c2 < HEX_MAXIMUM_NUMBER_CHARACTER ? HEX_MINIMUM_NUMBER_CHARACTER : HEX_CHARACTER_OFFSET);
+ bytes[i] = n1 * 16 + n2;
+ }
+ return bytes;
+}
+function bigIntToBytes(value) {
+ _chunk6ZDHSOUVjs.assert.call(void 0, typeof value === "bigint", "Value must be a bigint.");
+ _chunk6ZDHSOUVjs.assert.call(void 0, value >= BigInt(0), "Value must be a non-negative bigint.");
+ const hexadecimal = value.toString(16);
+ return hexToBytes(hexadecimal);
+}
+function bigIntFits(value, bytes) {
+ _chunk6ZDHSOUVjs.assert.call(void 0, bytes > 0);
+ const mask = value >> BigInt(31);
+ return !((~value & mask) + (value & ~mask) >> BigInt(bytes * 8 + ~0));
+}
+function signedBigIntToBytes(value, byteLength) {
+ _chunk6ZDHSOUVjs.assert.call(void 0, typeof value === "bigint", "Value must be a bigint.");
+ _chunk6ZDHSOUVjs.assert.call(void 0, typeof byteLength === "number", "Byte length must be a number.");
+ _chunk6ZDHSOUVjs.assert.call(void 0, byteLength > 0, "Byte length must be greater than 0.");
+ _chunk6ZDHSOUVjs.assert.call(void 0,
+ bigIntFits(value, byteLength),
+ "Byte length is too small to represent the given value."
+ );
+ let numberValue = value;
+ const bytes = new Uint8Array(byteLength);
+ for (let i = 0; i < bytes.length; i++) {
+ bytes[i] = Number(BigInt.asUintN(8, numberValue));
+ numberValue >>= BigInt(8);
+ }
+ return bytes.reverse();
+}
+function numberToBytes(value) {
+ _chunk6ZDHSOUVjs.assert.call(void 0, typeof value === "number", "Value must be a number.");
+ _chunk6ZDHSOUVjs.assert.call(void 0, value >= 0, "Value must be a non-negative number.");
+ _chunk6ZDHSOUVjs.assert.call(void 0,
+ Number.isSafeInteger(value),
+ "Value is not a safe integer. Use `bigIntToBytes` instead."
+ );
+ const hexadecimal = value.toString(16);
+ return hexToBytes(hexadecimal);
+}
+function stringToBytes(value) {
+ _chunk6ZDHSOUVjs.assert.call(void 0, typeof value === "string", "Value must be a string.");
+ return new TextEncoder().encode(value);
+}
+function base64ToBytes(value) {
+ _chunk6ZDHSOUVjs.assert.call(void 0, typeof value === "string", "Value must be a string.");
+ return _base.base64.decode(value);
+}
+function valueToBytes(value) {
+ if (typeof value === "bigint") {
+ return bigIntToBytes(value);
+ }
+ if (typeof value === "number") {
+ return numberToBytes(value);
+ }
+ if (typeof value === "string") {
+ if (value.startsWith("0x")) {
+ return hexToBytes(value);
+ }
+ return stringToBytes(value);
+ }
+ if (isBytes(value)) {
+ return value;
+ }
+ throw new TypeError(`Unsupported value type: "${typeof value}".`);
+}
+function concatBytes(values) {
+ const normalizedValues = new Array(values.length);
+ let byteLength = 0;
+ for (let i = 0; i < values.length; i++) {
+ const value = valueToBytes(values[i]);
+ normalizedValues[i] = value;
+ byteLength += value.length;
+ }
+ const bytes = new Uint8Array(byteLength);
+ for (let i = 0, offset = 0; i < normalizedValues.length; i++) {
+ bytes.set(normalizedValues[i], offset);
+ offset += normalizedValues[i].length;
+ }
+ return bytes;
+}
+function createDataView(bytes) {
+ if (typeof Buffer !== "undefined" && bytes instanceof Buffer) {
+ const buffer = bytes.buffer.slice(
+ bytes.byteOffset,
+ bytes.byteOffset + bytes.byteLength
+ );
+ return new DataView(buffer);
+ }
+ return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
+}
+
+// src/hex.ts
+var HexStruct = _superstruct.pattern.call(void 0, _superstruct.string.call(void 0, ), /^(?:0x)?[0-9a-f]+$/iu);
+var StrictHexStruct = _superstruct.pattern.call(void 0, _superstruct.string.call(void 0, ), /^0x[0-9a-f]+$/iu);
+var HexAddressStruct = _superstruct.pattern.call(void 0,
+ _superstruct.string.call(void 0, ),
+ /^0x[0-9a-f]{40}$/u
+);
+var HexChecksumAddressStruct = _superstruct.pattern.call(void 0,
+ _superstruct.string.call(void 0, ),
+ /^0x[0-9a-fA-F]{40}$/u
+);
+function isHexString(value) {
+ return _superstruct.is.call(void 0, value, HexStruct);
+}
+function isStrictHexString(value) {
+ return _superstruct.is.call(void 0, value, StrictHexStruct);
+}
+function assertIsHexString(value) {
+ _chunk6ZDHSOUVjs.assert.call(void 0, isHexString(value), "Value must be a hexadecimal string.");
+}
+function assertIsStrictHexString(value) {
+ _chunk6ZDHSOUVjs.assert.call(void 0,
+ isStrictHexString(value),
+ 'Value must be a hexadecimal string, starting with "0x".'
+ );
+}
+function isValidHexAddress(possibleAddress) {
+ return _superstruct.is.call(void 0, possibleAddress, HexAddressStruct) || isValidChecksumAddress(possibleAddress);
+}
+function getChecksumAddress(address) {
+ _chunk6ZDHSOUVjs.assert.call(void 0, _superstruct.is.call(void 0, address, HexChecksumAddressStruct), "Invalid hex address.");
+ const unPrefixed = remove0x(address.toLowerCase());
+ const unPrefixedHash = remove0x(bytesToHex(_sha3.keccak_256.call(void 0, unPrefixed)));
+ return `0x${unPrefixed.split("").map((character, nibbleIndex) => {
+ const hashCharacter = unPrefixedHash[nibbleIndex];
+ _chunk6ZDHSOUVjs.assert.call(void 0, _superstruct.is.call(void 0, hashCharacter, _superstruct.string.call(void 0, )), "Hash shorter than address.");
+ return parseInt(hashCharacter, 16) > 7 ? character.toUpperCase() : character;
+ }).join("")}`;
+}
+function isValidChecksumAddress(possibleChecksum) {
+ if (!_superstruct.is.call(void 0, possibleChecksum, HexChecksumAddressStruct)) {
+ return false;
+ }
+ return getChecksumAddress(possibleChecksum) === possibleChecksum;
+}
+function add0x(hexadecimal) {
+ if (hexadecimal.startsWith("0x")) {
+ return hexadecimal;
+ }
+ if (hexadecimal.startsWith("0X")) {
+ return `0x${hexadecimal.substring(2)}`;
+ }
+ return `0x${hexadecimal}`;
+}
+function remove0x(hexadecimal) {
+ if (hexadecimal.startsWith("0x") || hexadecimal.startsWith("0X")) {
+ return hexadecimal.substring(2);
+ }
+ return hexadecimal;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+exports.HexStruct = HexStruct; exports.StrictHexStruct = StrictHexStruct; exports.HexAddressStruct = HexAddressStruct; exports.HexChecksumAddressStruct = HexChecksumAddressStruct; exports.isHexString = isHexString; exports.isStrictHexString = isStrictHexString; exports.assertIsHexString = assertIsHexString; exports.assertIsStrictHexString = assertIsStrictHexString; exports.isValidHexAddress = isValidHexAddress; exports.getChecksumAddress = getChecksumAddress; exports.isValidChecksumAddress = isValidChecksumAddress; exports.add0x = add0x; exports.remove0x = remove0x; exports.isBytes = isBytes; exports.assertIsBytes = assertIsBytes; exports.bytesToHex = bytesToHex; exports.bytesToBigInt = bytesToBigInt; exports.bytesToSignedBigInt = bytesToSignedBigInt; exports.bytesToNumber = bytesToNumber; exports.bytesToString = bytesToString; exports.bytesToBase64 = bytesToBase64; exports.hexToBytes = hexToBytes; exports.bigIntToBytes = bigIntToBytes; exports.signedBigIntToBytes = signedBigIntToBytes; exports.numberToBytes = numberToBytes; exports.stringToBytes = stringToBytes; exports.base64ToBytes = base64ToBytes; exports.valueToBytes = valueToBytes; exports.concatBytes = concatBytes; exports.createDataView = createDataView;
+
+}).call(this)}).call(this,require("buffer").Buffer)
+},{"./chunk-6ZDHSOUV.js":94,"@noble/hashes/sha3":113,"@scure/base":115,"buffer":120,"superstruct":219}],103:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/misc.ts
+function isNonEmptyArray(value) {
+ return Array.isArray(value) && value.length > 0;
+}
+function isNullOrUndefined(value) {
+ return value === null || value === void 0;
+}
+function isObject(value) {
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
+}
+var hasProperty = (objectToCheck, name) => Object.hasOwnProperty.call(objectToCheck, name);
+function getKnownPropertyNames(object) {
+ return Object.getOwnPropertyNames(object);
+}
+var JsonSize = /* @__PURE__ */ ((JsonSize2) => {
+ JsonSize2[JsonSize2["Null"] = 4] = "Null";
+ JsonSize2[JsonSize2["Comma"] = 1] = "Comma";
+ JsonSize2[JsonSize2["Wrapper"] = 1] = "Wrapper";
+ JsonSize2[JsonSize2["True"] = 4] = "True";
+ JsonSize2[JsonSize2["False"] = 5] = "False";
+ JsonSize2[JsonSize2["Quote"] = 1] = "Quote";
+ JsonSize2[JsonSize2["Colon"] = 1] = "Colon";
+ JsonSize2[JsonSize2["Date"] = 24] = "Date";
+ return JsonSize2;
+})(JsonSize || {});
+var ESCAPE_CHARACTERS_REGEXP = /"|\\|\n|\r|\t/gu;
+function isPlainObject(value) {
+ if (typeof value !== "object" || value === null) {
+ return false;
+ }
+ try {
+ let proto = value;
+ while (Object.getPrototypeOf(proto) !== null) {
+ proto = Object.getPrototypeOf(proto);
+ }
+ return Object.getPrototypeOf(value) === proto;
+ } catch (_) {
+ return false;
+ }
+}
+function isASCII(character) {
+ return character.charCodeAt(0) <= 127;
+}
+function calculateStringSize(value) {
+ const size = value.split("").reduce((total, character) => {
+ if (isASCII(character)) {
+ return total + 1;
+ }
+ return total + 2;
+ }, 0);
+ return size + (_nullishCoalesce(value.match(ESCAPE_CHARACTERS_REGEXP), () => ( []))).length;
+}
+function calculateNumberSize(value) {
+ return value.toString().length;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+exports.isNonEmptyArray = isNonEmptyArray; exports.isNullOrUndefined = isNullOrUndefined; exports.isObject = isObject; exports.hasProperty = hasProperty; exports.getKnownPropertyNames = getKnownPropertyNames; exports.JsonSize = JsonSize; exports.ESCAPE_CHARACTERS_REGEXP = ESCAPE_CHARACTERS_REGEXP; exports.isPlainObject = isPlainObject; exports.isASCII = isASCII; exports.calculateStringSize = calculateStringSize; exports.calculateNumberSize = calculateNumberSize;
+
+},{}],104:[function(require,module,exports){
+"use strict";
+},{}],105:[function(require,module,exports){
+"use strict";
+},{}],106:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+
+var _chunkQEPVHEP7js = require('./chunk-QEPVHEP7.js');
+
+
+var _chunk6ZDHSOUVjs = require('./chunk-6ZDHSOUV.js');
+
+// src/number.ts
+var numberToHex = (value) => {
+ _chunk6ZDHSOUVjs.assert.call(void 0, typeof value === "number", "Value must be a number.");
+ _chunk6ZDHSOUVjs.assert.call(void 0, value >= 0, "Value must be a non-negative number.");
+ _chunk6ZDHSOUVjs.assert.call(void 0,
+ Number.isSafeInteger(value),
+ "Value is not a safe integer. Use `bigIntToHex` instead."
+ );
+ return _chunkQEPVHEP7js.add0x.call(void 0, value.toString(16));
+};
+var bigIntToHex = (value) => {
+ _chunk6ZDHSOUVjs.assert.call(void 0, typeof value === "bigint", "Value must be a bigint.");
+ _chunk6ZDHSOUVjs.assert.call(void 0, value >= 0, "Value must be a non-negative bigint.");
+ return _chunkQEPVHEP7js.add0x.call(void 0, value.toString(16));
+};
+var hexToNumber = (value) => {
+ _chunkQEPVHEP7js.assertIsHexString.call(void 0, value);
+ const numberValue = parseInt(value, 16);
+ _chunk6ZDHSOUVjs.assert.call(void 0,
+ Number.isSafeInteger(numberValue),
+ "Value is not a safe integer. Use `hexToBigInt` instead."
+ );
+ return numberValue;
+};
+var hexToBigInt = (value) => {
+ _chunkQEPVHEP7js.assertIsHexString.call(void 0, value);
+ return BigInt(_chunkQEPVHEP7js.add0x.call(void 0, value));
+};
+
+
+
+
+
+
+exports.numberToHex = numberToHex; exports.bigIntToHex = bigIntToHex; exports.hexToNumber = hexToNumber; exports.hexToBigInt = hexToBigInt;
+
+},{"./chunk-6ZDHSOUV.js":94,"./chunk-QEPVHEP7.js":102}],107:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/caip-types.ts
+var _superstruct = require('superstruct');
+var CAIP_CHAIN_ID_REGEX = /^(?[-a-z0-9]{3,8}):(?[-_a-zA-Z0-9]{1,32})$/u;
+var CAIP_NAMESPACE_REGEX = /^[-a-z0-9]{3,8}$/u;
+var CAIP_REFERENCE_REGEX = /^[-_a-zA-Z0-9]{1,32}$/u;
+var CAIP_ACCOUNT_ID_REGEX = /^(?(?[-a-z0-9]{3,8}):(?[-_a-zA-Z0-9]{1,32})):(?[-.%a-zA-Z0-9]{1,128})$/u;
+var CAIP_ACCOUNT_ADDRESS_REGEX = /^[-.%a-zA-Z0-9]{1,128}$/u;
+var CaipChainIdStruct = _superstruct.pattern.call(void 0, _superstruct.string.call(void 0, ), CAIP_CHAIN_ID_REGEX);
+var CaipNamespaceStruct = _superstruct.pattern.call(void 0, _superstruct.string.call(void 0, ), CAIP_NAMESPACE_REGEX);
+var CaipReferenceStruct = _superstruct.pattern.call(void 0, _superstruct.string.call(void 0, ), CAIP_REFERENCE_REGEX);
+var CaipAccountIdStruct = _superstruct.pattern.call(void 0, _superstruct.string.call(void 0, ), CAIP_ACCOUNT_ID_REGEX);
+var CaipAccountAddressStruct = _superstruct.pattern.call(void 0,
+ _superstruct.string.call(void 0, ),
+ CAIP_ACCOUNT_ADDRESS_REGEX
+);
+var KnownCaipNamespace = /* @__PURE__ */ ((KnownCaipNamespace2) => {
+ KnownCaipNamespace2["Eip155"] = "eip155";
+ return KnownCaipNamespace2;
+})(KnownCaipNamespace || {});
+function isCaipChainId(value) {
+ return _superstruct.is.call(void 0, value, CaipChainIdStruct);
+}
+function isCaipNamespace(value) {
+ return _superstruct.is.call(void 0, value, CaipNamespaceStruct);
+}
+function isCaipReference(value) {
+ return _superstruct.is.call(void 0, value, CaipReferenceStruct);
+}
+function isCaipAccountId(value) {
+ return _superstruct.is.call(void 0, value, CaipAccountIdStruct);
+}
+function isCaipAccountAddress(value) {
+ return _superstruct.is.call(void 0, value, CaipAccountAddressStruct);
+}
+function parseCaipChainId(caipChainId) {
+ const match = CAIP_CHAIN_ID_REGEX.exec(caipChainId);
+ if (!_optionalChain([match, 'optionalAccess', _ => _.groups])) {
+ throw new Error("Invalid CAIP chain ID.");
+ }
+ return {
+ namespace: match.groups.namespace,
+ reference: match.groups.reference
+ };
+}
+function parseCaipAccountId(caipAccountId) {
+ const match = CAIP_ACCOUNT_ID_REGEX.exec(caipAccountId);
+ if (!_optionalChain([match, 'optionalAccess', _2 => _2.groups])) {
+ throw new Error("Invalid CAIP account ID.");
+ }
+ return {
+ address: match.groups.accountAddress,
+ chainId: match.groups.chainId,
+ chain: {
+ namespace: match.groups.namespace,
+ reference: match.groups.reference
+ }
+ };
+}
+function toCaipChainId(namespace, reference) {
+ if (!isCaipNamespace(namespace)) {
+ throw new Error(
+ `Invalid "namespace", must match: ${CAIP_NAMESPACE_REGEX.toString()}`
+ );
+ }
+ if (!isCaipReference(reference)) {
+ throw new Error(
+ `Invalid "reference", must match: ${CAIP_REFERENCE_REGEX.toString()}`
+ );
+ }
+ return `${namespace}:${reference}`;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+exports.CAIP_CHAIN_ID_REGEX = CAIP_CHAIN_ID_REGEX; exports.CAIP_NAMESPACE_REGEX = CAIP_NAMESPACE_REGEX; exports.CAIP_REFERENCE_REGEX = CAIP_REFERENCE_REGEX; exports.CAIP_ACCOUNT_ID_REGEX = CAIP_ACCOUNT_ID_REGEX; exports.CAIP_ACCOUNT_ADDRESS_REGEX = CAIP_ACCOUNT_ADDRESS_REGEX; exports.CaipChainIdStruct = CaipChainIdStruct; exports.CaipNamespaceStruct = CaipNamespaceStruct; exports.CaipReferenceStruct = CaipReferenceStruct; exports.CaipAccountIdStruct = CaipAccountIdStruct; exports.CaipAccountAddressStruct = CaipAccountAddressStruct; exports.KnownCaipNamespace = KnownCaipNamespace; exports.isCaipChainId = isCaipChainId; exports.isCaipNamespace = isCaipNamespace; exports.isCaipReference = isCaipReference; exports.isCaipAccountId = isCaipAccountId; exports.isCaipAccountAddress = isCaipAccountAddress; exports.parseCaipChainId = parseCaipChainId; exports.parseCaipAccountId = parseCaipAccountId; exports.toCaipChainId = toCaipChainId;
+
+},{"superstruct":219}],108:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});
+
+
+
+var _chunk3W5G4CYIjs = require('./chunk-3W5G4CYI.js');
+
+// src/collections.ts
+var _map;
+var FrozenMap = class {
+ constructor(entries) {
+ _chunk3W5G4CYIjs.__privateAdd.call(void 0, this, _map, void 0);
+ _chunk3W5G4CYIjs.__privateSet.call(void 0, this, _map, new Map(entries));
+ Object.freeze(this);
+ }
+ get size() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _map).size;
+ }
+ [Symbol.iterator]() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _map)[Symbol.iterator]();
+ }
+ entries() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _map).entries();
+ }
+ forEach(callbackfn, thisArg) {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _map).forEach(
+ (value, key, _map2) => callbackfn.call(thisArg, value, key, this)
+ );
+ }
+ get(key) {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _map).get(key);
+ }
+ has(key) {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _map).has(key);
+ }
+ keys() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _map).keys();
+ }
+ values() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _map).values();
+ }
+ toString() {
+ return `FrozenMap(${this.size}) {${this.size > 0 ? ` ${[...this.entries()].map(([key, value]) => `${String(key)} => ${String(value)}`).join(", ")} ` : ""}}`;
+ }
+};
+_map = new WeakMap();
+var _set;
+var FrozenSet = class {
+ constructor(values) {
+ _chunk3W5G4CYIjs.__privateAdd.call(void 0, this, _set, void 0);
+ _chunk3W5G4CYIjs.__privateSet.call(void 0, this, _set, new Set(values));
+ Object.freeze(this);
+ }
+ get size() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _set).size;
+ }
+ [Symbol.iterator]() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _set)[Symbol.iterator]();
+ }
+ entries() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _set).entries();
+ }
+ forEach(callbackfn, thisArg) {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _set).forEach(
+ (value, value2, _set2) => callbackfn.call(thisArg, value, value2, this)
+ );
+ }
+ has(value) {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _set).has(value);
+ }
+ keys() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _set).keys();
+ }
+ values() {
+ return _chunk3W5G4CYIjs.__privateGet.call(void 0, this, _set).values();
+ }
+ toString() {
+ return `FrozenSet(${this.size}) {${this.size > 0 ? ` ${[...this.values()].map((member) => String(member)).join(", ")} ` : ""}}`;
+ }
+};
+_set = new WeakMap();
+Object.freeze(FrozenMap);
+Object.freeze(FrozenMap.prototype);
+Object.freeze(FrozenSet);
+Object.freeze(FrozenSet.prototype);
+
+
+
+
+exports.FrozenMap = FrozenMap; exports.FrozenSet = FrozenSet;
+
+},{"./chunk-3W5G4CYI.js":89}],109:[function(require,module,exports){
+"use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-5AVWINSB.js');
+
+
+
+
+
+var _chunkVFXTVNXNjs = require('./chunk-VFXTVNXN.js');
+require('./chunk-LC2CRSWD.js');
+
+
+var _chunkC6HGFEYLjs = require('./chunk-C6HGFEYL.js');
+
+
+
+
+var _chunk4RMX5YWEjs = require('./chunk-4RMX5YWE.js');
+require('./chunk-UOTVU7OQ.js');
+
+
+
+
+
+
+
+
+
+
+var _chunk4D6XQBHAjs = require('./chunk-4D6XQBHA.js');
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var _chunkOLLG4H35js = require('./chunk-OLLG4H35.js');
+require('./chunk-RKRGAFXY.js');
+
+
+
+var _chunk2LBGT4GHjs = require('./chunk-2LBGT4GH.js');
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var _chunkYWAID473js = require('./chunk-YWAID473.js');
+
+
+var _chunkE4C7EW4Rjs = require('./chunk-E4C7EW4R.js');
+
+
+var _chunk6NZW4WK4js = require('./chunk-6NZW4WK4.js');
+
+
+
+
+
+var _chunkDHVKFDHQjs = require('./chunk-DHVKFDHQ.js');
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var _chunkQEPVHEP7js = require('./chunk-QEPVHEP7.js');
+
+
+
+
+
+var _chunk6ZDHSOUVjs = require('./chunk-6ZDHSOUV.js');
+
+
+
+
+
+
+var _chunkIZC266HSjs = require('./chunk-IZC266HS.js');
+
+
+
+
+
+
+
+
+
+
+
+
+var _chunkQVEKZRZ2js = require('./chunk-QVEKZRZ2.js');
+
+
+
+var _chunkZ2RGWDD7js = require('./chunk-Z2RGWDD7.js');
+require('./chunk-3W5G4CYI.js');
+require('./chunk-EQMZL4XU.js');
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+exports.AssertionError = _chunk6ZDHSOUVjs.AssertionError; exports.CAIP_ACCOUNT_ADDRESS_REGEX = _chunkYWAID473js.CAIP_ACCOUNT_ADDRESS_REGEX; exports.CAIP_ACCOUNT_ID_REGEX = _chunkYWAID473js.CAIP_ACCOUNT_ID_REGEX; exports.CAIP_CHAIN_ID_REGEX = _chunkYWAID473js.CAIP_CHAIN_ID_REGEX; exports.CAIP_NAMESPACE_REGEX = _chunkYWAID473js.CAIP_NAMESPACE_REGEX; exports.CAIP_REFERENCE_REGEX = _chunkYWAID473js.CAIP_REFERENCE_REGEX; exports.CaipAccountAddressStruct = _chunkYWAID473js.CaipAccountAddressStruct; exports.CaipAccountIdStruct = _chunkYWAID473js.CaipAccountIdStruct; exports.CaipChainIdStruct = _chunkYWAID473js.CaipChainIdStruct; exports.CaipNamespaceStruct = _chunkYWAID473js.CaipNamespaceStruct; exports.CaipReferenceStruct = _chunkYWAID473js.CaipReferenceStruct; exports.ChecksumStruct = _chunkE4C7EW4Rjs.ChecksumStruct; exports.Duration = _chunk4RMX5YWEjs.Duration; exports.ESCAPE_CHARACTERS_REGEXP = _chunkQVEKZRZ2js.ESCAPE_CHARACTERS_REGEXP; exports.FrozenMap = _chunkZ2RGWDD7js.FrozenMap; exports.FrozenSet = _chunkZ2RGWDD7js.FrozenSet; exports.HexAddressStruct = _chunkQEPVHEP7js.HexAddressStruct; exports.HexChecksumAddressStruct = _chunkQEPVHEP7js.HexChecksumAddressStruct; exports.HexStruct = _chunkQEPVHEP7js.HexStruct; exports.JsonRpcErrorStruct = _chunkOLLG4H35js.JsonRpcErrorStruct; exports.JsonRpcFailureStruct = _chunkOLLG4H35js.JsonRpcFailureStruct; exports.JsonRpcIdStruct = _chunkOLLG4H35js.JsonRpcIdStruct; exports.JsonRpcNotificationStruct = _chunkOLLG4H35js.JsonRpcNotificationStruct; exports.JsonRpcParamsStruct = _chunkOLLG4H35js.JsonRpcParamsStruct; exports.JsonRpcRequestStruct = _chunkOLLG4H35js.JsonRpcRequestStruct; exports.JsonRpcResponseStruct = _chunkOLLG4H35js.JsonRpcResponseStruct; exports.JsonRpcSuccessStruct = _chunkOLLG4H35js.JsonRpcSuccessStruct; exports.JsonRpcVersionStruct = _chunkOLLG4H35js.JsonRpcVersionStruct; exports.JsonSize = _chunkQVEKZRZ2js.JsonSize; exports.JsonStruct = _chunkOLLG4H35js.JsonStruct; exports.KnownCaipNamespace = _chunkYWAID473js.KnownCaipNamespace; exports.PendingJsonRpcResponseStruct = _chunkOLLG4H35js.PendingJsonRpcResponseStruct; exports.StrictHexStruct = _chunkQEPVHEP7js.StrictHexStruct; exports.UnsafeJsonStruct = _chunkOLLG4H35js.UnsafeJsonStruct; exports.VersionRangeStruct = _chunk4D6XQBHAjs.VersionRangeStruct; exports.VersionStruct = _chunk4D6XQBHAjs.VersionStruct; exports.add0x = _chunkQEPVHEP7js.add0x; exports.assert = _chunk6ZDHSOUVjs.assert; exports.assertExhaustive = _chunk6ZDHSOUVjs.assertExhaustive; exports.assertIsBytes = _chunkQEPVHEP7js.assertIsBytes; exports.assertIsHexString = _chunkQEPVHEP7js.assertIsHexString; exports.assertIsJsonRpcError = _chunkOLLG4H35js.assertIsJsonRpcError; exports.assertIsJsonRpcFailure = _chunkOLLG4H35js.assertIsJsonRpcFailure; exports.assertIsJsonRpcNotification = _chunkOLLG4H35js.assertIsJsonRpcNotification; exports.assertIsJsonRpcRequest = _chunkOLLG4H35js.assertIsJsonRpcRequest; exports.assertIsJsonRpcResponse = _chunkOLLG4H35js.assertIsJsonRpcResponse; exports.assertIsJsonRpcSuccess = _chunkOLLG4H35js.assertIsJsonRpcSuccess; exports.assertIsPendingJsonRpcResponse = _chunkOLLG4H35js.assertIsPendingJsonRpcResponse; exports.assertIsSemVerRange = _chunk4D6XQBHAjs.assertIsSemVerRange; exports.assertIsSemVerVersion = _chunk4D6XQBHAjs.assertIsSemVerVersion; exports.assertIsStrictHexString = _chunkQEPVHEP7js.assertIsStrictHexString; exports.assertStruct = _chunk6ZDHSOUVjs.assertStruct; exports.base64 = _chunk6NZW4WK4js.base64; exports.base64ToBytes = _chunkQEPVHEP7js.base64ToBytes; exports.bigIntToBytes = _chunkQEPVHEP7js.bigIntToBytes; exports.bigIntToHex = _chunkVFXTVNXNjs.bigIntToHex; exports.bytesToBase64 = _chunkQEPVHEP7js.bytesToBase64; exports.bytesToBigInt = _chunkQEPVHEP7js.bytesToBigInt; exports.bytesToHex = _chunkQEPVHEP7js.bytesToHex; exports.bytesToNumber = _chunkQEPVHEP7js.bytesToNumber; exports.bytesToSignedBigInt = _chunkQEPVHEP7js.bytesToSignedBigInt; exports.bytesToString = _chunkQEPVHEP7js.bytesToString; exports.calculateNumberSize = _chunkQVEKZRZ2js.calculateNumberSize; exports.calculateStringSize = _chunkQVEKZRZ2js.calculateStringSize; exports.concatBytes = _chunkQEPVHEP7js.concatBytes; exports.createBigInt = _chunkDHVKFDHQjs.createBigInt; exports.createBytes = _chunkDHVKFDHQjs.createBytes; exports.createDataView = _chunkQEPVHEP7js.createDataView; exports.createDeferredPromise = _chunkC6HGFEYLjs.createDeferredPromise; exports.createHex = _chunkDHVKFDHQjs.createHex; exports.createModuleLogger = _chunk2LBGT4GHjs.createModuleLogger; exports.createNumber = _chunkDHVKFDHQjs.createNumber; exports.createProjectLogger = _chunk2LBGT4GHjs.createProjectLogger; exports.exactOptional = _chunkOLLG4H35js.exactOptional; exports.getChecksumAddress = _chunkQEPVHEP7js.getChecksumAddress; exports.getErrorMessage = _chunkIZC266HSjs.getErrorMessage; exports.getJsonRpcIdValidator = _chunkOLLG4H35js.getJsonRpcIdValidator; exports.getJsonSize = _chunkOLLG4H35js.getJsonSize; exports.getKnownPropertyNames = _chunkQVEKZRZ2js.getKnownPropertyNames; exports.getSafeJson = _chunkOLLG4H35js.getSafeJson; exports.gtRange = _chunk4D6XQBHAjs.gtRange; exports.gtVersion = _chunk4D6XQBHAjs.gtVersion; exports.hasProperty = _chunkQVEKZRZ2js.hasProperty; exports.hexToBigInt = _chunkVFXTVNXNjs.hexToBigInt; exports.hexToBytes = _chunkQEPVHEP7js.hexToBytes; exports.hexToNumber = _chunkVFXTVNXNjs.hexToNumber; exports.inMilliseconds = _chunk4RMX5YWEjs.inMilliseconds; exports.isASCII = _chunkQVEKZRZ2js.isASCII; exports.isBytes = _chunkQEPVHEP7js.isBytes; exports.isCaipAccountAddress = _chunkYWAID473js.isCaipAccountAddress; exports.isCaipAccountId = _chunkYWAID473js.isCaipAccountId; exports.isCaipChainId = _chunkYWAID473js.isCaipChainId; exports.isCaipNamespace = _chunkYWAID473js.isCaipNamespace; exports.isCaipReference = _chunkYWAID473js.isCaipReference; exports.isErrorWithCode = _chunkIZC266HSjs.isErrorWithCode; exports.isErrorWithMessage = _chunkIZC266HSjs.isErrorWithMessage; exports.isErrorWithStack = _chunkIZC266HSjs.isErrorWithStack; exports.isHexString = _chunkQEPVHEP7js.isHexString; exports.isJsonRpcError = _chunkOLLG4H35js.isJsonRpcError; exports.isJsonRpcFailure = _chunkOLLG4H35js.isJsonRpcFailure; exports.isJsonRpcNotification = _chunkOLLG4H35js.isJsonRpcNotification; exports.isJsonRpcRequest = _chunkOLLG4H35js.isJsonRpcRequest; exports.isJsonRpcResponse = _chunkOLLG4H35js.isJsonRpcResponse; exports.isJsonRpcSuccess = _chunkOLLG4H35js.isJsonRpcSuccess; exports.isNonEmptyArray = _chunkQVEKZRZ2js.isNonEmptyArray; exports.isNullOrUndefined = _chunkQVEKZRZ2js.isNullOrUndefined; exports.isObject = _chunkQVEKZRZ2js.isObject; exports.isPendingJsonRpcResponse = _chunkOLLG4H35js.isPendingJsonRpcResponse; exports.isPlainObject = _chunkQVEKZRZ2js.isPlainObject; exports.isStrictHexString = _chunkQEPVHEP7js.isStrictHexString; exports.isValidChecksumAddress = _chunkQEPVHEP7js.isValidChecksumAddress; exports.isValidHexAddress = _chunkQEPVHEP7js.isValidHexAddress; exports.isValidJson = _chunkOLLG4H35js.isValidJson; exports.isValidSemVerRange = _chunk4D6XQBHAjs.isValidSemVerRange; exports.isValidSemVerVersion = _chunk4D6XQBHAjs.isValidSemVerVersion; exports.jsonrpc2 = _chunkOLLG4H35js.jsonrpc2; exports.numberToBytes = _chunkQEPVHEP7js.numberToBytes; exports.numberToHex = _chunkVFXTVNXNjs.numberToHex; exports.object = _chunkOLLG4H35js.object; exports.parseCaipAccountId = _chunkYWAID473js.parseCaipAccountId; exports.parseCaipChainId = _chunkYWAID473js.parseCaipChainId; exports.remove0x = _chunkQEPVHEP7js.remove0x; exports.satisfiesVersionRange = _chunk4D6XQBHAjs.satisfiesVersionRange; exports.signedBigIntToBytes = _chunkQEPVHEP7js.signedBigIntToBytes; exports.stringToBytes = _chunkQEPVHEP7js.stringToBytes; exports.timeSince = _chunk4RMX5YWEjs.timeSince; exports.toCaipChainId = _chunkYWAID473js.toCaipChainId; exports.valueToBytes = _chunkQEPVHEP7js.valueToBytes; exports.wrapError = _chunkIZC266HSjs.wrapError;
+
+},{"./chunk-2LBGT4GH.js":88,"./chunk-3W5G4CYI.js":89,"./chunk-4D6XQBHA.js":90,"./chunk-4RMX5YWE.js":91,"./chunk-5AVWINSB.js":92,"./chunk-6NZW4WK4.js":93,"./chunk-6ZDHSOUV.js":94,"./chunk-C6HGFEYL.js":95,"./chunk-DHVKFDHQ.js":96,"./chunk-E4C7EW4R.js":97,"./chunk-EQMZL4XU.js":98,"./chunk-IZC266HS.js":99,"./chunk-LC2CRSWD.js":100,"./chunk-OLLG4H35.js":101,"./chunk-QEPVHEP7.js":102,"./chunk-QVEKZRZ2.js":103,"./chunk-RKRGAFXY.js":104,"./chunk-UOTVU7OQ.js":105,"./chunk-VFXTVNXN.js":106,"./chunk-YWAID473.js":107,"./chunk-Z2RGWDD7.js":108}],110:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.output = exports.exists = exports.hash = exports.bytes = exports.bool = exports.number = void 0;
+function number(n) {
+ if (!Number.isSafeInteger(n) || n < 0)
+ throw new Error(`Wrong positive integer: ${n}`);
+}
+exports.number = number;
+function bool(b) {
+ if (typeof b !== 'boolean')
+ throw new Error(`Expected boolean, not ${b}`);
+}
+exports.bool = bool;
+// copied from utils
+function isBytes(a) {
+ return (a instanceof Uint8Array ||
+ (a != null && typeof a === 'object' && a.constructor.name === 'Uint8Array'));
+}
+function bytes(b, ...lengths) {
+ if (!isBytes(b))
+ throw new Error('Expected Uint8Array');
+ if (lengths.length > 0 && !lengths.includes(b.length))
+ throw new Error(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`);
+}
+exports.bytes = bytes;
+function hash(hash) {
+ if (typeof hash !== 'function' || typeof hash.create !== 'function')
+ throw new Error('Hash should be wrapped by utils.wrapConstructor');
+ number(hash.outputLen);
+ number(hash.blockLen);
+}
+exports.hash = hash;
+function exists(instance, checkFinished = true) {
+ if (instance.destroyed)
+ throw new Error('Hash instance has been destroyed');
+ if (checkFinished && instance.finished)
+ throw new Error('Hash#digest() has already been called');
+}
+exports.exists = exists;
+function output(out, instance) {
+ bytes(out);
+ const min = instance.outputLen;
+ if (out.length < min) {
+ throw new Error(`digestInto() expects output buffer of length at least ${min}`);
+ }
+}
+exports.output = output;
+const assert = { number, bool, bytes, hash, exists, output };
+exports.default = assert;
+
+},{}],111:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.add5L = exports.add5H = exports.add4H = exports.add4L = exports.add3H = exports.add3L = exports.add = exports.rotlBL = exports.rotlBH = exports.rotlSL = exports.rotlSH = exports.rotr32L = exports.rotr32H = exports.rotrBL = exports.rotrBH = exports.rotrSL = exports.rotrSH = exports.shrSL = exports.shrSH = exports.toBig = exports.split = exports.fromBig = void 0;
+const U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);
+const _32n = /* @__PURE__ */ BigInt(32);
+// We are not using BigUint64Array, because they are extremely slow as per 2022
+function fromBig(n, le = false) {
+ if (le)
+ return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };
+ return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };
+}
+exports.fromBig = fromBig;
+function split(lst, le = false) {
+ let Ah = new Uint32Array(lst.length);
+ let Al = new Uint32Array(lst.length);
+ for (let i = 0; i < lst.length; i++) {
+ const { h, l } = fromBig(lst[i], le);
+ [Ah[i], Al[i]] = [h, l];
+ }
+ return [Ah, Al];
+}
+exports.split = split;
+const toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);
+exports.toBig = toBig;
+// for Shift in [0, 32)
+const shrSH = (h, _l, s) => h >>> s;
+exports.shrSH = shrSH;
+const shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);
+exports.shrSL = shrSL;
+// Right rotate for Shift in [1, 32)
+const rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));
+exports.rotrSH = rotrSH;
+const rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);
+exports.rotrSL = rotrSL;
+// Right rotate for Shift in (32, 64), NOTE: 32 is special case.
+const rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));
+exports.rotrBH = rotrBH;
+const rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));
+exports.rotrBL = rotrBL;
+// Right rotate for shift===32 (just swaps l&h)
+const rotr32H = (_h, l) => l;
+exports.rotr32H = rotr32H;
+const rotr32L = (h, _l) => h;
+exports.rotr32L = rotr32L;
+// Left rotate for Shift in [1, 32)
+const rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));
+exports.rotlSH = rotlSH;
+const rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));
+exports.rotlSL = rotlSL;
+// Left rotate for Shift in (32, 64), NOTE: 32 is special case.
+const rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));
+exports.rotlBH = rotlBH;
+const rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));
+exports.rotlBL = rotlBL;
+// JS uses 32-bit signed integers for bitwise operations which means we cannot
+// simple take carry out of low bit sum by shift, we need to use division.
+function add(Ah, Al, Bh, Bl) {
+ const l = (Al >>> 0) + (Bl >>> 0);
+ return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };
+}
+exports.add = add;
+// Addition with more than 2 elements
+const add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);
+exports.add3L = add3L;
+const add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;
+exports.add3H = add3H;
+const add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);
+exports.add4L = add4L;
+const add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;
+exports.add4H = add4H;
+const add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);
+exports.add5L = add5L;
+const add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;
+exports.add5H = add5H;
+// prettier-ignore
+const u64 = {
+ fromBig, split, toBig,
+ shrSH, shrSL,
+ rotrSH, rotrSL, rotrBH, rotrBL,
+ rotr32H, rotr32L,
+ rotlSH, rotlSL, rotlBH, rotlBL,
+ add, add3L, add3H, add4L, add4H, add5H, add5L,
+};
+exports.default = u64;
+
+},{}],112:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.crypto = void 0;
+exports.crypto = typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;
+
+},{}],113:[function(require,module,exports){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.shake256 = exports.shake128 = exports.keccak_512 = exports.keccak_384 = exports.keccak_256 = exports.keccak_224 = exports.sha3_512 = exports.sha3_384 = exports.sha3_256 = exports.sha3_224 = exports.Keccak = exports.keccakP = void 0;
+const _assert_js_1 = require("./_assert.js");
+const _u64_js_1 = require("./_u64.js");
+const utils_js_1 = require("./utils.js");
+// SHA3 (keccak) is based on a new design: basically, the internal state is bigger than output size.
+// It's called a sponge function.
+// Various per round constants calculations
+const [SHA3_PI, SHA3_ROTL, _SHA3_IOTA] = [[], [], []];
+const _0n = /* @__PURE__ */ BigInt(0);
+const _1n = /* @__PURE__ */ BigInt(1);
+const _2n = /* @__PURE__ */ BigInt(2);
+const _7n = /* @__PURE__ */ BigInt(7);
+const _256n = /* @__PURE__ */ BigInt(256);
+const _0x71n = /* @__PURE__ */ BigInt(0x71);
+for (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {
+ // Pi
+ [x, y] = [y, (2 * x + 3 * y) % 5];
+ SHA3_PI.push(2 * (5 * y + x));
+ // Rotational
+ SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);
+ // Iota
+ let t = _0n;
+ for (let j = 0; j < 7; j++) {
+ R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;
+ if (R & _2n)
+ t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);
+ }
+ _SHA3_IOTA.push(t);
+}
+const [SHA3_IOTA_H, SHA3_IOTA_L] = /* @__PURE__ */ (0, _u64_js_1.split)(_SHA3_IOTA, true);
+// Left rotation (without 0, 32, 64)
+const rotlH = (h, l, s) => (s > 32 ? (0, _u64_js_1.rotlBH)(h, l, s) : (0, _u64_js_1.rotlSH)(h, l, s));
+const rotlL = (h, l, s) => (s > 32 ? (0, _u64_js_1.rotlBL)(h, l, s) : (0, _u64_js_1.rotlSL)(h, l, s));
+// Same as keccakf1600, but allows to skip some rounds
+function keccakP(s, rounds = 24) {
+ const B = new Uint32Array(5 * 2);
+ // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)
+ for (let round = 24 - rounds; round < 24; round++) {
+ // Theta θ
+ for (let x = 0; x < 10; x++)
+ B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];
+ for (let x = 0; x < 10; x += 2) {
+ const idx1 = (x + 8) % 10;
+ const idx0 = (x + 2) % 10;
+ const B0 = B[idx0];
+ const B1 = B[idx0 + 1];
+ const Th = rotlH(B0, B1, 1) ^ B[idx1];
+ const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];
+ for (let y = 0; y < 50; y += 10) {
+ s[x + y] ^= Th;
+ s[x + y + 1] ^= Tl;
+ }
+ }
+ // Rho (ρ) and Pi (π)
+ let curH = s[2];
+ let curL = s[3];
+ for (let t = 0; t < 24; t++) {
+ const shift = SHA3_ROTL[t];
+ const Th = rotlH(curH, curL, shift);
+ const Tl = rotlL(curH, curL, shift);
+ const PI = SHA3_PI[t];
+ curH = s[PI];
+ curL = s[PI + 1];
+ s[PI] = Th;
+ s[PI + 1] = Tl;
+ }
+ // Chi (χ)
+ for (let y = 0; y < 50; y += 10) {
+ for (let x = 0; x < 10; x++)
+ B[x] = s[y + x];
+ for (let x = 0; x < 10; x++)
+ s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];
+ }
+ // Iota (ι)
+ s[0] ^= SHA3_IOTA_H[round];
+ s[1] ^= SHA3_IOTA_L[round];
+ }
+ B.fill(0);
+}
+exports.keccakP = keccakP;
+class Keccak extends utils_js_1.Hash {
+ // NOTE: we accept arguments in bytes instead of bits here.
+ constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {
+ super();
+ this.blockLen = blockLen;
+ this.suffix = suffix;
+ this.outputLen = outputLen;
+ this.enableXOF = enableXOF;
+ this.rounds = rounds;
+ this.pos = 0;
+ this.posOut = 0;
+ this.finished = false;
+ this.destroyed = false;
+ // Can be passed from user as dkLen
+ (0, _assert_js_1.number)(outputLen);
+ // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes
+ if (0 >= this.blockLen || this.blockLen >= 200)
+ throw new Error('Sha3 supports only keccak-f1600 function');
+ this.state = new Uint8Array(200);
+ this.state32 = (0, utils_js_1.u32)(this.state);
+ }
+ keccak() {
+ keccakP(this.state32, this.rounds);
+ this.posOut = 0;
+ this.pos = 0;
+ }
+ update(data) {
+ (0, _assert_js_1.exists)(this);
+ const { blockLen, state } = this;
+ data = (0, utils_js_1.toBytes)(data);
+ const len = data.length;
+ for (let pos = 0; pos < len;) {
+ const take = Math.min(blockLen - this.pos, len - pos);
+ for (let i = 0; i < take; i++)
+ state[this.pos++] ^= data[pos++];
+ if (this.pos === blockLen)
+ this.keccak();
+ }
+ return this;
+ }
+ finish() {
+ if (this.finished)
+ return;
+ this.finished = true;
+ const { state, suffix, pos, blockLen } = this;
+ // Do the padding
+ state[pos] ^= suffix;
+ if ((suffix & 0x80) !== 0 && pos === blockLen - 1)
+ this.keccak();
+ state[blockLen - 1] ^= 0x80;
+ this.keccak();
+ }
+ writeInto(out) {
+ (0, _assert_js_1.exists)(this, false);
+ (0, _assert_js_1.bytes)(out);
+ this.finish();
+ const bufferOut = this.state;
+ const { blockLen } = this;
+ for (let pos = 0, len = out.length; pos < len;) {
+ if (this.posOut >= blockLen)
+ this.keccak();
+ const take = Math.min(blockLen - this.posOut, len - pos);
+ out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);
+ this.posOut += take;
+ pos += take;
+ }
+ return out;
+ }
+ xofInto(out) {
+ // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF
+ if (!this.enableXOF)
+ throw new Error('XOF is not possible for this instance');
+ return this.writeInto(out);
+ }
+ xof(bytes) {
+ (0, _assert_js_1.number)(bytes);
+ return this.xofInto(new Uint8Array(bytes));
+ }
+ digestInto(out) {
+ (0, _assert_js_1.output)(out, this);
+ if (this.finished)
+ throw new Error('digest() was already called');
+ this.writeInto(out);
+ this.destroy();
+ return out;
+ }
+ digest() {
+ return this.digestInto(new Uint8Array(this.outputLen));
+ }
+ destroy() {
+ this.destroyed = true;
+ this.state.fill(0);
+ }
+ _cloneInto(to) {
+ const { blockLen, suffix, outputLen, rounds, enableXOF } = this;
+ to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, rounds));
+ to.state32.set(this.state32);
+ to.pos = this.pos;
+ to.posOut = this.posOut;
+ to.finished = this.finished;
+ to.rounds = rounds;
+ // Suffix can change in cSHAKE
+ to.suffix = suffix;
+ to.outputLen = outputLen;
+ to.enableXOF = enableXOF;
+ to.destroyed = this.destroyed;
+ return to;
+ }
+}
+exports.Keccak = Keccak;
+const gen = (suffix, blockLen, outputLen) => (0, utils_js_1.wrapConstructor)(() => new Keccak(blockLen, suffix, outputLen));
+exports.sha3_224 = gen(0x06, 144, 224 / 8);
+/**
+ * SHA3-256 hash function
+ * @param message - that would be hashed
+ */
+exports.sha3_256 = gen(0x06, 136, 256 / 8);
+exports.sha3_384 = gen(0x06, 104, 384 / 8);
+exports.sha3_512 = gen(0x06, 72, 512 / 8);
+exports.keccak_224 = gen(0x01, 144, 224 / 8);
+/**
+ * keccak-256 hash function. Different from SHA3-256.
+ * @param message - that would be hashed
+ */
+exports.keccak_256 = gen(0x01, 136, 256 / 8);
+exports.keccak_384 = gen(0x01, 104, 384 / 8);
+exports.keccak_512 = gen(0x01, 72, 512 / 8);
+const genShake = (suffix, blockLen, outputLen) => (0, utils_js_1.wrapXOFConstructorWithOpts)((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true));
+exports.shake128 = genShake(0x1f, 168, 128 / 8);
+exports.shake256 = genShake(0x1f, 136, 256 / 8);
+
+},{"./_assert.js":110,"./_u64.js":111,"./utils.js":114}],114:[function(require,module,exports){
+"use strict";
+/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.randomBytes = exports.wrapXOFConstructorWithOpts = exports.wrapConstructorWithOpts = exports.wrapConstructor = exports.checkOpts = exports.Hash = exports.concatBytes = exports.toBytes = exports.utf8ToBytes = exports.asyncLoop = exports.nextTick = exports.hexToBytes = exports.bytesToHex = exports.isLE = exports.rotr = exports.createView = exports.u32 = exports.u8 = void 0;
+// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.
+// node.js versions earlier than v19 don't declare it in global scope.
+// For node.js, package.json#exports field mapping rewrites import
+// from `crypto` to `cryptoNode`, which imports native module.
+// Makes the utils un-importable in browsers without a bundler.
+// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.
+const crypto_1 = require("@noble/hashes/crypto");
+// Cast array to different type
+const u8 = (arr) => new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);
+exports.u8 = u8;
+const u32 = (arr) => new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));
+exports.u32 = u32;
+function isBytes(a) {
+ return (a instanceof Uint8Array ||
+ (a != null && typeof a === 'object' && a.constructor.name === 'Uint8Array'));
+}
+// Cast array to view
+const createView = (arr) => new DataView(arr.buffer, arr.byteOffset, arr.byteLength);
+exports.createView = createView;
+// The rotate right (circular right shift) operation for uint32
+const rotr = (word, shift) => (word << (32 - shift)) | (word >>> shift);
+exports.rotr = rotr;
+// big-endian hardware is rare. Just in case someone still decides to run hashes:
+// early-throw an error because we don't support BE yet.
+// Other libraries would silently corrupt the data instead of throwing an error,
+// when they don't support it.
+exports.isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44;
+if (!exports.isLE)
+ throw new Error('Non little-endian hardware is not supported');
+// Array where index 0xf0 (240) is mapped to string 'f0'
+const hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));
+/**
+ * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'
+ */
+function bytesToHex(bytes) {
+ if (!isBytes(bytes))
+ throw new Error('Uint8Array expected');
+ // pre-caching improves the speed 6x
+ let hex = '';
+ for (let i = 0; i < bytes.length; i++) {
+ hex += hexes[bytes[i]];
+ }
+ return hex;
+}
+exports.bytesToHex = bytesToHex;
+// We use optimized technique to convert hex string to byte array
+const asciis = { _0: 48, _9: 57, _A: 65, _F: 70, _a: 97, _f: 102 };
+function asciiToBase16(char) {
+ if (char >= asciis._0 && char <= asciis._9)
+ return char - asciis._0;
+ if (char >= asciis._A && char <= asciis._F)
+ return char - (asciis._A - 10);
+ if (char >= asciis._a && char <= asciis._f)
+ return char - (asciis._a - 10);
+ return;
+}
+/**
+ * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])
+ */
+function hexToBytes(hex) {
+ if (typeof hex !== 'string')
+ throw new Error('hex string expected, got ' + typeof hex);
+ const hl = hex.length;
+ const al = hl / 2;
+ if (hl % 2)
+ throw new Error('padded hex string expected, got unpadded hex of length ' + hl);
+ const array = new Uint8Array(al);
+ for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
+ const n1 = asciiToBase16(hex.charCodeAt(hi));
+ const n2 = asciiToBase16(hex.charCodeAt(hi + 1));
+ if (n1 === undefined || n2 === undefined) {
+ const char = hex[hi] + hex[hi + 1];
+ throw new Error('hex string expected, got non-hex character "' + char + '" at index ' + hi);
+ }
+ array[ai] = n1 * 16 + n2;
+ }
+ return array;
+}
+exports.hexToBytes = hexToBytes;
+// There is no setImmediate in browser and setTimeout is slow.
+// call of async fn will return Promise, which will be fullfiled only on
+// next scheduler queue processing step and this is exactly what we need.
+const nextTick = async () => { };
+exports.nextTick = nextTick;
+// Returns control to thread each 'tick' ms to avoid blocking
+async function asyncLoop(iters, tick, cb) {
+ let ts = Date.now();
+ for (let i = 0; i < iters; i++) {
+ cb(i);
+ // Date.now() is not monotonic, so in case if clock goes backwards we return return control too
+ const diff = Date.now() - ts;
+ if (diff >= 0 && diff < tick)
+ continue;
+ await (0, exports.nextTick)();
+ ts += diff;
+ }
+}
+exports.asyncLoop = asyncLoop;
+/**
+ * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])
+ */
+function utf8ToBytes(str) {
+ if (typeof str !== 'string')
+ throw new Error(`utf8ToBytes expected string, got ${typeof str}`);
+ return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809
+}
+exports.utf8ToBytes = utf8ToBytes;
+/**
+ * Normalizes (non-hex) string or Uint8Array to Uint8Array.
+ * Warning: when Uint8Array is passed, it would NOT get copied.
+ * Keep in mind for future mutable operations.
+ */
+function toBytes(data) {
+ if (typeof data === 'string')
+ data = utf8ToBytes(data);
+ if (!isBytes(data))
+ throw new Error(`expected Uint8Array, got ${typeof data}`);
+ return data;
+}
+exports.toBytes = toBytes;
+/**
+ * Copies several Uint8Arrays into one.
+ */
+function concatBytes(...arrays) {
+ let sum = 0;
+ for (let i = 0; i < arrays.length; i++) {
+ const a = arrays[i];
+ if (!isBytes(a))
+ throw new Error('Uint8Array expected');
+ sum += a.length;
+ }
+ const res = new Uint8Array(sum);
+ for (let i = 0, pad = 0; i < arrays.length; i++) {
+ const a = arrays[i];
+ res.set(a, pad);
+ pad += a.length;
+ }
+ return res;
+}
+exports.concatBytes = concatBytes;
+// For runtime check if class implements interface
+class Hash {
+ // Safe version that clones internal state
+ clone() {
+ return this._cloneInto();
+ }
+}
+exports.Hash = Hash;
+const toStr = {}.toString;
+function checkOpts(defaults, opts) {
+ if (opts !== undefined && toStr.call(opts) !== '[object Object]')
+ throw new Error('Options should be object or undefined');
+ const merged = Object.assign(defaults, opts);
+ return merged;
+}
+exports.checkOpts = checkOpts;
+function wrapConstructor(hashCons) {
+ const hashC = (msg) => hashCons().update(toBytes(msg)).digest();
+ const tmp = hashCons();
+ hashC.outputLen = tmp.outputLen;
+ hashC.blockLen = tmp.blockLen;
+ hashC.create = () => hashCons();
+ return hashC;
+}
+exports.wrapConstructor = wrapConstructor;
+function wrapConstructorWithOpts(hashCons) {
+ const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();
+ const tmp = hashCons({});
+ hashC.outputLen = tmp.outputLen;
+ hashC.blockLen = tmp.blockLen;
+ hashC.create = (opts) => hashCons(opts);
+ return hashC;
+}
+exports.wrapConstructorWithOpts = wrapConstructorWithOpts;
+function wrapXOFConstructorWithOpts(hashCons) {
+ const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();
+ const tmp = hashCons({});
+ hashC.outputLen = tmp.outputLen;
+ hashC.blockLen = tmp.blockLen;
+ hashC.create = (opts) => hashCons(opts);
+ return hashC;
+}
+exports.wrapXOFConstructorWithOpts = wrapXOFConstructorWithOpts;
+/**
+ * Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS.
+ */
+function randomBytes(bytesLength = 32) {
+ if (crypto_1.crypto && typeof crypto_1.crypto.getRandomValues === 'function') {
+ return crypto_1.crypto.getRandomValues(new Uint8Array(bytesLength));
+ }
+ throw new Error('crypto.getRandomValues must be defined');
+}
+exports.randomBytes = randomBytes;
+
+},{"@noble/hashes/crypto":112}],115:[function(require,module,exports){
+"use strict";
+/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.bytes = exports.stringToBytes = exports.str = exports.bytesToString = exports.hex = exports.utf8 = exports.bech32m = exports.bech32 = exports.base58check = exports.createBase58check = exports.base58xmr = exports.base58xrp = exports.base58flickr = exports.base58 = exports.base64urlnopad = exports.base64url = exports.base64nopad = exports.base64 = exports.base32crockford = exports.base32hex = exports.base32 = exports.base16 = exports.utils = exports.assertNumber = void 0;
+// Utilities
+/**
+ * @__NO_SIDE_EFFECTS__
+ */
+function assertNumber(n) {
+ if (!Number.isSafeInteger(n))
+ throw new Error(`Wrong integer: ${n}`);
+}
+exports.assertNumber = assertNumber;
+function isBytes(a) {
+ return (a instanceof Uint8Array ||
+ (a != null && typeof a === 'object' && a.constructor.name === 'Uint8Array'));
+}
+/**
+ * @__NO_SIDE_EFFECTS__
+ */
+function chain(...args) {
+ const id = (a) => a;
+ // Wrap call in closure so JIT can inline calls
+ const wrap = (a, b) => (c) => a(b(c));
+ // Construct chain of args[-1].encode(args[-2].encode([...]))
+ const encode = args.map((x) => x.encode).reduceRight(wrap, id);
+ // Construct chain of args[0].decode(args[1].decode(...))
+ const decode = args.map((x) => x.decode).reduce(wrap, id);
+ return { encode, decode };
+}
+/**
+ * Encodes integer radix representation to array of strings using alphabet and back
+ * @__NO_SIDE_EFFECTS__
+ */
+function alphabet(alphabet) {
+ return {
+ encode: (digits) => {
+ if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
+ throw new Error('alphabet.encode input should be an array of numbers');
+ return digits.map((i) => {
+ assertNumber(i);
+ if (i < 0 || i >= alphabet.length)
+ throw new Error(`Digit index outside alphabet: ${i} (alphabet: ${alphabet.length})`);
+ return alphabet[i];
+ });
+ },
+ decode: (input) => {
+ if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))
+ throw new Error('alphabet.decode input should be array of strings');
+ return input.map((letter) => {
+ if (typeof letter !== 'string')
+ throw new Error(`alphabet.decode: not string element=${letter}`);
+ const index = alphabet.indexOf(letter);
+ if (index === -1)
+ throw new Error(`Unknown letter: "${letter}". Allowed: ${alphabet}`);
+ return index;
+ });
+ },
+ };
+}
+/**
+ * @__NO_SIDE_EFFECTS__
+ */
+function join(separator = '') {
+ if (typeof separator !== 'string')
+ throw new Error('join separator should be string');
+ return {
+ encode: (from) => {
+ if (!Array.isArray(from) || (from.length && typeof from[0] !== 'string'))
+ throw new Error('join.encode input should be array of strings');
+ for (let i of from)
+ if (typeof i !== 'string')
+ throw new Error(`join.encode: non-string input=${i}`);
+ return from.join(separator);
+ },
+ decode: (to) => {
+ if (typeof to !== 'string')
+ throw new Error('join.decode input should be string');
+ return to.split(separator);
+ },
+ };
+}
+/**
+ * Pad strings array so it has integer number of bits
+ * @__NO_SIDE_EFFECTS__
+ */
+function padding(bits, chr = '=') {
+ assertNumber(bits);
+ if (typeof chr !== 'string')
+ throw new Error('padding chr should be string');
+ return {
+ encode(data) {
+ if (!Array.isArray(data) || (data.length && typeof data[0] !== 'string'))
+ throw new Error('padding.encode input should be array of strings');
+ for (let i of data)
+ if (typeof i !== 'string')
+ throw new Error(`padding.encode: non-string input=${i}`);
+ while ((data.length * bits) % 8)
+ data.push(chr);
+ return data;
+ },
+ decode(input) {
+ if (!Array.isArray(input) || (input.length && typeof input[0] !== 'string'))
+ throw new Error('padding.encode input should be array of strings');
+ for (let i of input)
+ if (typeof i !== 'string')
+ throw new Error(`padding.decode: non-string input=${i}`);
+ let end = input.length;
+ if ((end * bits) % 8)
+ throw new Error('Invalid padding: string should have whole number of bytes');
+ for (; end > 0 && input[end - 1] === chr; end--) {
+ if (!(((end - 1) * bits) % 8))
+ throw new Error('Invalid padding: string has too much padding');
+ }
+ return input.slice(0, end);
+ },
+ };
+}
+/**
+ * @__NO_SIDE_EFFECTS__
+ */
+function normalize(fn) {
+ if (typeof fn !== 'function')
+ throw new Error('normalize fn should be function');
+ return { encode: (from) => from, decode: (to) => fn(to) };
+}
+/**
+ * Slow: O(n^2) time complexity
+ * @__NO_SIDE_EFFECTS__
+ */
+function convertRadix(data, from, to) {
+ // base 1 is impossible
+ if (from < 2)
+ throw new Error(`convertRadix: wrong from=${from}, base cannot be less than 2`);
+ if (to < 2)
+ throw new Error(`convertRadix: wrong to=${to}, base cannot be less than 2`);
+ if (!Array.isArray(data))
+ throw new Error('convertRadix: data should be array');
+ if (!data.length)
+ return [];
+ let pos = 0;
+ const res = [];
+ const digits = Array.from(data);
+ digits.forEach((d) => {
+ assertNumber(d);
+ if (d < 0 || d >= from)
+ throw new Error(`Wrong integer: ${d}`);
+ });
+ while (true) {
+ let carry = 0;
+ let done = true;
+ for (let i = pos; i < digits.length; i++) {
+ const digit = digits[i];
+ const digitBase = from * carry + digit;
+ if (!Number.isSafeInteger(digitBase) ||
+ (from * carry) / from !== carry ||
+ digitBase - digit !== from * carry) {
+ throw new Error('convertRadix: carry overflow');
+ }
+ carry = digitBase % to;
+ const rounded = Math.floor(digitBase / to);
+ digits[i] = rounded;
+ if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)
+ throw new Error('convertRadix: carry overflow');
+ if (!done)
+ continue;
+ else if (!rounded)
+ pos = i;
+ else
+ done = false;
+ }
+ res.push(carry);
+ if (done)
+ break;
+ }
+ for (let i = 0; i < data.length - 1 && data[i] === 0; i++)
+ res.push(0);
+ return res.reverse();
+}
+const gcd = /* @__NO_SIDE_EFFECTS__ */ (a, b) => (!b ? a : gcd(b, a % b));
+const radix2carry = /*@__NO_SIDE_EFFECTS__ */ (from, to) => from + (to - gcd(from, to));
+/**
+ * Implemented with numbers, because BigInt is 5x slower
+ * @__NO_SIDE_EFFECTS__
+ */
+function convertRadix2(data, from, to, padding) {
+ if (!Array.isArray(data))
+ throw new Error('convertRadix2: data should be array');
+ if (from <= 0 || from > 32)
+ throw new Error(`convertRadix2: wrong from=${from}`);
+ if (to <= 0 || to > 32)
+ throw new Error(`convertRadix2: wrong to=${to}`);
+ if (radix2carry(from, to) > 32) {
+ throw new Error(`convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`);
+ }
+ let carry = 0;
+ let pos = 0; // bitwise position in current element
+ const mask = 2 ** to - 1;
+ const res = [];
+ for (const n of data) {
+ assertNumber(n);
+ if (n >= 2 ** from)
+ throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);
+ carry = (carry << from) | n;
+ if (pos + from > 32)
+ throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);
+ pos += from;
+ for (; pos >= to; pos -= to)
+ res.push(((carry >> (pos - to)) & mask) >>> 0);
+ carry &= 2 ** pos - 1; // clean carry, otherwise it will cause overflow
+ }
+ carry = (carry << (to - pos)) & mask;
+ if (!padding && pos >= from)
+ throw new Error('Excess padding');
+ if (!padding && carry)
+ throw new Error(`Non-zero padding: ${carry}`);
+ if (padding && pos > 0)
+ res.push(carry >>> 0);
+ return res;
+}
+/**
+ * @__NO_SIDE_EFFECTS__
+ */
+function radix(num) {
+ assertNumber(num);
+ return {
+ encode: (bytes) => {
+ if (!isBytes(bytes))
+ throw new Error('radix.encode input should be Uint8Array');
+ return convertRadix(Array.from(bytes), 2 ** 8, num);
+ },
+ decode: (digits) => {
+ if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
+ throw new Error('radix.decode input should be array of numbers');
+ return Uint8Array.from(convertRadix(digits, num, 2 ** 8));
+ },
+ };
+}
+/**
+ * If both bases are power of same number (like `2**8 <-> 2**64`),
+ * there is a linear algorithm. For now we have implementation for power-of-two bases only.
+ * @__NO_SIDE_EFFECTS__
+ */
+function radix2(bits, revPadding = false) {
+ assertNumber(bits);
+ if (bits <= 0 || bits > 32)
+ throw new Error('radix2: bits should be in (0..32]');
+ if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)
+ throw new Error('radix2: carry overflow');
+ return {
+ encode: (bytes) => {
+ if (!isBytes(bytes))
+ throw new Error('radix2.encode input should be Uint8Array');
+ return convertRadix2(Array.from(bytes), 8, bits, !revPadding);
+ },
+ decode: (digits) => {
+ if (!Array.isArray(digits) || (digits.length && typeof digits[0] !== 'number'))
+ throw new Error('radix2.decode input should be array of numbers');
+ return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));
+ },
+ };
+}
+/**
+ * @__NO_SIDE_EFFECTS__
+ */
+function unsafeWrapper(fn) {
+ if (typeof fn !== 'function')
+ throw new Error('unsafeWrapper fn should be function');
+ return function (...args) {
+ try {
+ return fn.apply(null, args);
+ }
+ catch (e) { }
+ };
+}
+/**
+ * @__NO_SIDE_EFFECTS__
+ */
+function checksum(len, fn) {
+ assertNumber(len);
+ if (typeof fn !== 'function')
+ throw new Error('checksum fn should be function');
+ return {
+ encode(data) {
+ if (!isBytes(data))
+ throw new Error('checksum.encode: input should be Uint8Array');
+ const checksum = fn(data).slice(0, len);
+ const res = new Uint8Array(data.length + len);
+ res.set(data);
+ res.set(checksum, data.length);
+ return res;
+ },
+ decode(data) {
+ if (!isBytes(data))
+ throw new Error('checksum.decode: input should be Uint8Array');
+ const payload = data.slice(0, -len);
+ const newChecksum = fn(payload).slice(0, len);
+ const oldChecksum = data.slice(-len);
+ for (let i = 0; i < len; i++)
+ if (newChecksum[i] !== oldChecksum[i])
+ throw new Error('Invalid checksum');
+ return payload;
+ },
+ };
+}
+// prettier-ignore
+exports.utils = {
+ alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,
+};
+// RFC 4648 aka RFC 3548
+// ---------------------
+exports.base16 = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));
+exports.base32 = chain(radix2(5), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'), padding(5), join(''));
+exports.base32hex = chain(radix2(5), alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'), padding(5), join(''));
+exports.base32crockford = chain(radix2(5), alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'), join(''), normalize((s) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1')));
+exports.base64 = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), padding(6), join(''));
+exports.base64nopad = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'), join(''));
+exports.base64url = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), padding(6), join(''));
+exports.base64urlnopad = chain(radix2(6), alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'), join(''));
+// base58 code
+// -----------
+const genBase58 = (abc) => chain(radix(58), alphabet(abc), join(''));
+exports.base58 = genBase58('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
+exports.base58flickr = genBase58('123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ');
+exports.base58xrp = genBase58('rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz');
+// xmr ver is done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.
+// Block encoding significantly reduces quadratic complexity of base58.
+// Data len (index) -> encoded block len
+const XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];
+exports.base58xmr = {
+ encode(data) {
+ let res = '';
+ for (let i = 0; i < data.length; i += 8) {
+ const block = data.subarray(i, i + 8);
+ res += exports.base58.encode(block).padStart(XMR_BLOCK_LEN[block.length], '1');
+ }
+ return res;
+ },
+ decode(str) {
+ let res = [];
+ for (let i = 0; i < str.length; i += 11) {
+ const slice = str.slice(i, i + 11);
+ const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);
+ const block = exports.base58.decode(slice);
+ for (let j = 0; j < block.length - blockLen; j++) {
+ if (block[j] !== 0)
+ throw new Error('base58xmr: wrong padding');
+ }
+ res = res.concat(Array.from(block.slice(block.length - blockLen)));
+ }
+ return Uint8Array.from(res);
+ },
+};
+const createBase58check = (sha256) => chain(checksum(4, (data) => sha256(sha256(data))), exports.base58);
+exports.createBase58check = createBase58check;
+// legacy export, bad name
+exports.base58check = exports.createBase58check;
+const BECH_ALPHABET = /* @__PURE__ */ chain(alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), join(''));
+const POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];
+/**
+ * @__NO_SIDE_EFFECTS__
+ */
+function bech32Polymod(pre) {
+ const b = pre >> 25;
+ let chk = (pre & 0x1ffffff) << 5;
+ for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {
+ if (((b >> i) & 1) === 1)
+ chk ^= POLYMOD_GENERATORS[i];
+ }
+ return chk;
+}
+/**
+ * @__NO_SIDE_EFFECTS__
+ */
+function bechChecksum(prefix, words, encodingConst = 1) {
+ const len = prefix.length;
+ let chk = 1;
+ for (let i = 0; i < len; i++) {
+ const c = prefix.charCodeAt(i);
+ if (c < 33 || c > 126)
+ throw new Error(`Invalid prefix (${prefix})`);
+ chk = bech32Polymod(chk) ^ (c >> 5);
+ }
+ chk = bech32Polymod(chk);
+ for (let i = 0; i < len; i++)
+ chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);
+ for (let v of words)
+ chk = bech32Polymod(chk) ^ v;
+ for (let i = 0; i < 6; i++)
+ chk = bech32Polymod(chk);
+ chk ^= encodingConst;
+ return BECH_ALPHABET.encode(convertRadix2([chk % 2 ** 30], 30, 5, false));
+}
+/**
+ * @__NO_SIDE_EFFECTS__
+ */
+function genBech32(encoding) {
+ const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;
+ const _words = radix2(5);
+ const fromWords = _words.decode;
+ const toWords = _words.encode;
+ const fromWordsUnsafe = unsafeWrapper(fromWords);
+ function encode(prefix, words, limit = 90) {
+ if (typeof prefix !== 'string')
+ throw new Error(`bech32.encode prefix should be string, not ${typeof prefix}`);
+ if (!Array.isArray(words) || (words.length && typeof words[0] !== 'number'))
+ throw new Error(`bech32.encode words should be array of numbers, not ${typeof words}`);
+ if (prefix.length === 0)
+ throw new TypeError(`Invalid prefix length ${prefix.length}`);
+ const actualLength = prefix.length + 7 + words.length;
+ if (limit !== false && actualLength > limit)
+ throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);
+ const lowered = prefix.toLowerCase();
+ const sum = bechChecksum(lowered, words, ENCODING_CONST);
+ return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}`;
+ }
+ function decode(str, limit = 90) {
+ if (typeof str !== 'string')
+ throw new Error(`bech32.decode input should be string, not ${typeof str}`);
+ if (str.length < 8 || (limit !== false && str.length > limit))
+ throw new TypeError(`Wrong string length: ${str.length} (${str}). Expected (8..${limit})`);
+ // don't allow mixed case
+ const lowered = str.toLowerCase();
+ if (str !== lowered && str !== str.toUpperCase())
+ throw new Error(`String must be lowercase or uppercase`);
+ const sepIndex = lowered.lastIndexOf('1');
+ if (sepIndex === 0 || sepIndex === -1)
+ throw new Error(`Letter "1" must be present between prefix and data only`);
+ const prefix = lowered.slice(0, sepIndex);
+ const data = lowered.slice(sepIndex + 1);
+ if (data.length < 6)
+ throw new Error('Data must be at least 6 characters long');
+ const words = BECH_ALPHABET.decode(data).slice(0, -6);
+ const sum = bechChecksum(prefix, words, ENCODING_CONST);
+ if (!data.endsWith(sum))
+ throw new Error(`Invalid checksum in ${str}: expected "${sum}"`);
+ return { prefix, words };
+ }
+ const decodeUnsafe = unsafeWrapper(decode);
+ function decodeToBytes(str) {
+ const { prefix, words } = decode(str, false);
+ return { prefix, words, bytes: fromWords(words) };
+ }
+ return { encode, decode, decodeToBytes, decodeUnsafe, fromWords, fromWordsUnsafe, toWords };
+}
+exports.bech32 = genBech32('bech32');
+exports.bech32m = genBech32('bech32m');
+exports.utf8 = {
+ encode: (data) => new TextDecoder().decode(data),
+ decode: (str) => new TextEncoder().encode(str),
+};
+exports.hex = chain(radix2(4), alphabet('0123456789abcdef'), join(''), normalize((s) => {
+ if (typeof s !== 'string' || s.length % 2)
+ throw new TypeError(`hex.decode: expected string, got ${typeof s} with length ${s.length}`);
+ return s.toLowerCase();
+}));
+// prettier-ignore
+const CODERS = {
+ utf8: exports.utf8, hex: exports.hex, base16: exports.base16, base32: exports.base32, base64: exports.base64, base64url: exports.base64url, base58: exports.base58, base58xmr: exports.base58xmr
+};
+const coderTypeError = 'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';
+const bytesToString = (type, bytes) => {
+ if (typeof type !== 'string' || !CODERS.hasOwnProperty(type))
+ throw new TypeError(coderTypeError);
+ if (!isBytes(bytes))
+ throw new TypeError('bytesToString() expects Uint8Array');
+ return CODERS[type].encode(bytes);
+};
+exports.bytesToString = bytesToString;
+exports.str = exports.bytesToString; // as in python, but for bytes only
+const stringToBytes = (type, str) => {
+ if (!CODERS.hasOwnProperty(type))
+ throw new TypeError(coderTypeError);
+ if (typeof str !== 'string')
+ throw new TypeError('stringToBytes() expects string');
+ return CODERS[type].decode(str);
+};
+exports.stringToBytes = stringToBytes;
+exports.bytes = exports.stringToBytes;
+
+},{}],116:[function(require,module,exports){
+/*globals self, window */
+"use strict"
+
+/*eslint-disable @mysticatea/prettier */
+const { AbortController, AbortSignal } =
+ typeof self !== "undefined" ? self :
+ typeof window !== "undefined" ? window :
+ /* otherwise */ undefined
+/*eslint-enable @mysticatea/prettier */
+
+module.exports = AbortController
+module.exports.AbortSignal = AbortSignal
+module.exports.default = AbortController
+
+},{}],117:[function(require,module,exports){
+'use strict'
+
+exports.byteLength = byteLength
+exports.toByteArray = toByteArray
+exports.fromByteArray = fromByteArray
+
+var lookup = []
+var revLookup = []
+var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
+
+var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
+for (var i = 0, len = code.length; i < len; ++i) {
+ lookup[i] = code[i]
+ revLookup[code.charCodeAt(i)] = i
+}
+
+// Support decoding URL-safe base64 strings, as Node.js does.
+// See: https://en.wikipedia.org/wiki/Base64#URL_applications
+revLookup['-'.charCodeAt(0)] = 62
+revLookup['_'.charCodeAt(0)] = 63
+
+function getLens (b64) {
+ var len = b64.length
+
+ if (len % 4 > 0) {
+ throw new Error('Invalid string. Length must be a multiple of 4')
+ }
+
+ // Trim off extra bytes after placeholder bytes are found
+ // See: https://github.com/beatgammit/base64-js/issues/42
+ var validLen = b64.indexOf('=')
+ if (validLen === -1) validLen = len
+
+ var placeHoldersLen = validLen === len
+ ? 0
+ : 4 - (validLen % 4)
+
+ return [validLen, placeHoldersLen]
+}
+
+// base64 is 4/3 + up to two characters of the original data
+function byteLength (b64) {
+ var lens = getLens(b64)
+ var validLen = lens[0]
+ var placeHoldersLen = lens[1]
+ return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
+}
+
+function _byteLength (b64, validLen, placeHoldersLen) {
+ return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
+}
+
+function toByteArray (b64) {
+ var tmp
+ var lens = getLens(b64)
+ var validLen = lens[0]
+ var placeHoldersLen = lens[1]
+
+ var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
+
+ var curByte = 0
+
+ // if there are placeholders, only get up to the last complete 4 chars
+ var len = placeHoldersLen > 0
+ ? validLen - 4
+ : validLen
+
+ var i
+ for (i = 0; i < len; i += 4) {
+ tmp =
+ (revLookup[b64.charCodeAt(i)] << 18) |
+ (revLookup[b64.charCodeAt(i + 1)] << 12) |
+ (revLookup[b64.charCodeAt(i + 2)] << 6) |
+ revLookup[b64.charCodeAt(i + 3)]
+ arr[curByte++] = (tmp >> 16) & 0xFF
+ arr[curByte++] = (tmp >> 8) & 0xFF
+ arr[curByte++] = tmp & 0xFF
+ }
+
+ if (placeHoldersLen === 2) {
+ tmp =
+ (revLookup[b64.charCodeAt(i)] << 2) |
+ (revLookup[b64.charCodeAt(i + 1)] >> 4)
+ arr[curByte++] = tmp & 0xFF
+ }
+
+ if (placeHoldersLen === 1) {
+ tmp =
+ (revLookup[b64.charCodeAt(i)] << 10) |
+ (revLookup[b64.charCodeAt(i + 1)] << 4) |
+ (revLookup[b64.charCodeAt(i + 2)] >> 2)
+ arr[curByte++] = (tmp >> 8) & 0xFF
+ arr[curByte++] = tmp & 0xFF
+ }
+
+ return arr
+}
+
+function tripletToBase64 (num) {
+ return lookup[num >> 18 & 0x3F] +
+ lookup[num >> 12 & 0x3F] +
+ lookup[num >> 6 & 0x3F] +
+ lookup[num & 0x3F]
+}
+
+function encodeChunk (uint8, start, end) {
+ var tmp
+ var output = []
+ for (var i = start; i < end; i += 3) {
+ tmp =
+ ((uint8[i] << 16) & 0xFF0000) +
+ ((uint8[i + 1] << 8) & 0xFF00) +
+ (uint8[i + 2] & 0xFF)
+ output.push(tripletToBase64(tmp))
+ }
+ return output.join('')
+}
+
+function fromByteArray (uint8) {
+ var tmp
+ var len = uint8.length
+ var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
+ var parts = []
+ var maxChunkLength = 16383 // must be multiple of 3
+
+ // go through the array every three bytes, we'll deal with trailing stuff later
+ for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
+ parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
+ }
+
+ // pad the end with zeros, but make sure to not forget the extra bytes
+ if (extraBytes === 1) {
+ tmp = uint8[len - 1]
+ parts.push(
+ lookup[tmp >> 2] +
+ lookup[(tmp << 4) & 0x3F] +
+ '=='
+ )
+ } else if (extraBytes === 2) {
+ tmp = (uint8[len - 2] << 8) + uint8[len - 1]
+ parts.push(
+ lookup[tmp >> 10] +
+ lookup[(tmp >> 4) & 0x3F] +
+ lookup[(tmp << 2) & 0x3F] +
+ '='
+ )
+ }
+
+ return parts.join('')
+}
+
+},{}],118:[function(require,module,exports){
+(function (module, exports) {
+ 'use strict';
+
+ // Utils
+ function assert (val, msg) {
+ if (!val) throw new Error(msg || 'Assertion failed');
+ }
+
+ // Could use `inherits` module, but don't want to move from single file
+ // architecture yet.
+ function inherits (ctor, superCtor) {
+ ctor.super_ = superCtor;
+ var TempCtor = function () {};
+ TempCtor.prototype = superCtor.prototype;
+ ctor.prototype = new TempCtor();
+ ctor.prototype.constructor = ctor;
+ }
+
+ // BN
+
+ function BN (number, base, endian) {
+ if (BN.isBN(number)) {
+ return number;
+ }
+
+ this.negative = 0;
+ this.words = null;
+ this.length = 0;
+
+ // Reduction context
+ this.red = null;
+
+ if (number !== null) {
+ if (base === 'le' || base === 'be') {
+ endian = base;
+ base = 10;
+ }
+
+ this._init(number || 0, base || 10, endian || 'be');
+ }
+ }
+ if (typeof module === 'object') {
+ module.exports = BN;
+ } else {
+ exports.BN = BN;
+ }
+
+ BN.BN = BN;
+ BN.wordSize = 26;
+
+ var Buffer;
+ try {
+ if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {
+ Buffer = window.Buffer;
+ } else {
+ Buffer = require('buffer').Buffer;
+ }
+ } catch (e) {
+ }
+
+ BN.isBN = function isBN (num) {
+ if (num instanceof BN) {
+ return true;
+ }
+
+ return num !== null && typeof num === 'object' &&
+ num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
+ };
+
+ BN.max = function max (left, right) {
+ if (left.cmp(right) > 0) return left;
+ return right;
+ };
+
+ BN.min = function min (left, right) {
+ if (left.cmp(right) < 0) return left;
+ return right;
+ };
+
+ BN.prototype._init = function init (number, base, endian) {
+ if (typeof number === 'number') {
+ return this._initNumber(number, base, endian);
+ }
+
+ if (typeof number === 'object') {
+ return this._initArray(number, base, endian);
+ }
+
+ if (base === 'hex') {
+ base = 16;
+ }
+ assert(base === (base | 0) && base >= 2 && base <= 36);
+
+ number = number.toString().replace(/\s+/g, '');
+ var start = 0;
+ if (number[0] === '-') {
+ start++;
+ this.negative = 1;
+ }
+
+ if (start < number.length) {
+ if (base === 16) {
+ this._parseHex(number, start, endian);
+ } else {
+ this._parseBase(number, base, start);
+ if (endian === 'le') {
+ this._initArray(this.toArray(), base, endian);
+ }
+ }
+ }
+ };
+
+ BN.prototype._initNumber = function _initNumber (number, base, endian) {
+ if (number < 0) {
+ this.negative = 1;
+ number = -number;
+ }
+ if (number < 0x4000000) {
+ this.words = [number & 0x3ffffff];
+ this.length = 1;
+ } else if (number < 0x10000000000000) {
+ this.words = [
+ number & 0x3ffffff,
+ (number / 0x4000000) & 0x3ffffff
+ ];
+ this.length = 2;
+ } else {
+ assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)
+ this.words = [
+ number & 0x3ffffff,
+ (number / 0x4000000) & 0x3ffffff,
+ 1
+ ];
+ this.length = 3;
+ }
+
+ if (endian !== 'le') return;
+
+ // Reverse the bytes
+ this._initArray(this.toArray(), base, endian);
+ };
+
+ BN.prototype._initArray = function _initArray (number, base, endian) {
+ // Perhaps a Uint8Array
+ assert(typeof number.length === 'number');
+ if (number.length <= 0) {
+ this.words = [0];
+ this.length = 1;
+ return this;
+ }
+
+ this.length = Math.ceil(number.length / 3);
+ this.words = new Array(this.length);
+ for (var i = 0; i < this.length; i++) {
+ this.words[i] = 0;
+ }
+
+ var j, w;
+ var off = 0;
+ if (endian === 'be') {
+ for (i = number.length - 1, j = 0; i >= 0; i -= 3) {
+ w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);
+ this.words[j] |= (w << off) & 0x3ffffff;
+ this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
+ off += 24;
+ if (off >= 26) {
+ off -= 26;
+ j++;
+ }
+ }
+ } else if (endian === 'le') {
+ for (i = 0, j = 0; i < number.length; i += 3) {
+ w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);
+ this.words[j] |= (w << off) & 0x3ffffff;
+ this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
+ off += 24;
+ if (off >= 26) {
+ off -= 26;
+ j++;
+ }
+ }
+ }
+ return this._strip();
+ };
+
+ function parseHex4Bits (string, index) {
+ var c = string.charCodeAt(index);
+ // '0' - '9'
+ if (c >= 48 && c <= 57) {
+ return c - 48;
+ // 'A' - 'F'
+ } else if (c >= 65 && c <= 70) {
+ return c - 55;
+ // 'a' - 'f'
+ } else if (c >= 97 && c <= 102) {
+ return c - 87;
+ } else {
+ assert(false, 'Invalid character in ' + string);
+ }
+ }
+
+ function parseHexByte (string, lowerBound, index) {
+ var r = parseHex4Bits(string, index);
+ if (index - 1 >= lowerBound) {
+ r |= parseHex4Bits(string, index - 1) << 4;
+ }
+ return r;
+ }
+
+ BN.prototype._parseHex = function _parseHex (number, start, endian) {
+ // Create possibly bigger array to ensure that it fits the number
+ this.length = Math.ceil((number.length - start) / 6);
+ this.words = new Array(this.length);
+ for (var i = 0; i < this.length; i++) {
+ this.words[i] = 0;
+ }
+
+ // 24-bits chunks
+ var off = 0;
+ var j = 0;
+
+ var w;
+ if (endian === 'be') {
+ for (i = number.length - 1; i >= start; i -= 2) {
+ w = parseHexByte(number, start, i) << off;
+ this.words[j] |= w & 0x3ffffff;
+ if (off >= 18) {
+ off -= 18;
+ j += 1;
+ this.words[j] |= w >>> 26;
+ } else {
+ off += 8;
+ }
+ }
+ } else {
+ var parseLength = number.length - start;
+ for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {
+ w = parseHexByte(number, start, i) << off;
+ this.words[j] |= w & 0x3ffffff;
+ if (off >= 18) {
+ off -= 18;
+ j += 1;
+ this.words[j] |= w >>> 26;
+ } else {
+ off += 8;
+ }
+ }
+ }
+
+ this._strip();
+ };
+
+ function parseBase (str, start, end, mul) {
+ var r = 0;
+ var b = 0;
+ var len = Math.min(str.length, end);
+ for (var i = start; i < len; i++) {
+ var c = str.charCodeAt(i) - 48;
+
+ r *= mul;
+
+ // 'a'
+ if (c >= 49) {
+ b = c - 49 + 0xa;
+
+ // 'A'
+ } else if (c >= 17) {
+ b = c - 17 + 0xa;
+
+ // '0' - '9'
+ } else {
+ b = c;
+ }
+ assert(c >= 0 && b < mul, 'Invalid character');
+ r += b;
+ }
+ return r;
+ }
+
+ BN.prototype._parseBase = function _parseBase (number, base, start) {
+ // Initialize as zero
+ this.words = [0];
+ this.length = 1;
+
+ // Find length of limb in base
+ for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {
+ limbLen++;
+ }
+ limbLen--;
+ limbPow = (limbPow / base) | 0;
+
+ var total = number.length - start;
+ var mod = total % limbLen;
+ var end = Math.min(total, total - mod) + start;
+
+ var word = 0;
+ for (var i = start; i < end; i += limbLen) {
+ word = parseBase(number, i, i + limbLen, base);
+
+ this.imuln(limbPow);
+ if (this.words[0] + word < 0x4000000) {
+ this.words[0] += word;
+ } else {
+ this._iaddn(word);
+ }
+ }
+
+ if (mod !== 0) {
+ var pow = 1;
+ word = parseBase(number, i, number.length, base);
+
+ for (i = 0; i < mod; i++) {
+ pow *= base;
+ }
+
+ this.imuln(pow);
+ if (this.words[0] + word < 0x4000000) {
+ this.words[0] += word;
+ } else {
+ this._iaddn(word);
+ }
+ }
+
+ this._strip();
+ };
+
+ BN.prototype.copy = function copy (dest) {
+ dest.words = new Array(this.length);
+ for (var i = 0; i < this.length; i++) {
+ dest.words[i] = this.words[i];
+ }
+ dest.length = this.length;
+ dest.negative = this.negative;
+ dest.red = this.red;
+ };
+
+ function move (dest, src) {
+ dest.words = src.words;
+ dest.length = src.length;
+ dest.negative = src.negative;
+ dest.red = src.red;
+ }
+
+ BN.prototype._move = function _move (dest) {
+ move(dest, this);
+ };
+
+ BN.prototype.clone = function clone () {
+ var r = new BN(null);
+ this.copy(r);
+ return r;
+ };
+
+ BN.prototype._expand = function _expand (size) {
+ while (this.length < size) {
+ this.words[this.length++] = 0;
+ }
+ return this;
+ };
+
+ // Remove leading `0` from `this`
+ BN.prototype._strip = function strip () {
+ while (this.length > 1 && this.words[this.length - 1] === 0) {
+ this.length--;
+ }
+ return this._normSign();
+ };
+
+ BN.prototype._normSign = function _normSign () {
+ // -0 = 0
+ if (this.length === 1 && this.words[0] === 0) {
+ this.negative = 0;
+ }
+ return this;
+ };
+
+ // Check Symbol.for because not everywhere where Symbol defined
+ // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility
+ if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {
+ try {
+ BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;
+ } catch (e) {
+ BN.prototype.inspect = inspect;
+ }
+ } else {
+ BN.prototype.inspect = inspect;
+ }
+
+ function inspect () {
+ return (this.red ? '';
+ }
+
+ /*
+
+ var zeros = [];
+ var groupSizes = [];
+ var groupBases = [];
+
+ var s = '';
+ var i = -1;
+ while (++i < BN.wordSize) {
+ zeros[i] = s;
+ s += '0';
+ }
+ groupSizes[0] = 0;
+ groupSizes[1] = 0;
+ groupBases[0] = 0;
+ groupBases[1] = 0;
+ var base = 2 - 1;
+ while (++base < 36 + 1) {
+ var groupSize = 0;
+ var groupBase = 1;
+ while (groupBase < (1 << BN.wordSize) / base) {
+ groupBase *= base;
+ groupSize += 1;
+ }
+ groupSizes[base] = groupSize;
+ groupBases[base] = groupBase;
+ }
+
+ */
+
+ var zeros = [
+ '',
+ '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'
+ ];
+
+ var groupSizes = [
+ 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
+ ];
+
+ var groupBases = [
+ 0, 0,
+ 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,
+ 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,
+ 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,
+ 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,
+ 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176
+ ];
+
+ BN.prototype.toString = function toString (base, padding) {
+ base = base || 10;
+ padding = padding | 0 || 1;
+
+ var out;
+ if (base === 16 || base === 'hex') {
+ out = '';
+ var off = 0;
+ var carry = 0;
+ for (var i = 0; i < this.length; i++) {
+ var w = this.words[i];
+ var word = (((w << off) | carry) & 0xffffff).toString(16);
+ carry = (w >>> (24 - off)) & 0xffffff;
+ off += 2;
+ if (off >= 26) {
+ off -= 26;
+ i--;
+ }
+ if (carry !== 0 || i !== this.length - 1) {
+ out = zeros[6 - word.length] + word + out;
+ } else {
+ out = word + out;
+ }
+ }
+ if (carry !== 0) {
+ out = carry.toString(16) + out;
+ }
+ while (out.length % padding !== 0) {
+ out = '0' + out;
+ }
+ if (this.negative !== 0) {
+ out = '-' + out;
+ }
+ return out;
+ }
+
+ if (base === (base | 0) && base >= 2 && base <= 36) {
+ // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));
+ var groupSize = groupSizes[base];
+ // var groupBase = Math.pow(base, groupSize);
+ var groupBase = groupBases[base];
+ out = '';
+ var c = this.clone();
+ c.negative = 0;
+ while (!c.isZero()) {
+ var r = c.modrn(groupBase).toString(base);
+ c = c.idivn(groupBase);
+
+ if (!c.isZero()) {
+ out = zeros[groupSize - r.length] + r + out;
+ } else {
+ out = r + out;
+ }
+ }
+ if (this.isZero()) {
+ out = '0' + out;
+ }
+ while (out.length % padding !== 0) {
+ out = '0' + out;
+ }
+ if (this.negative !== 0) {
+ out = '-' + out;
+ }
+ return out;
+ }
+
+ assert(false, 'Base should be between 2 and 36');
+ };
+
+ BN.prototype.toNumber = function toNumber () {
+ var ret = this.words[0];
+ if (this.length === 2) {
+ ret += this.words[1] * 0x4000000;
+ } else if (this.length === 3 && this.words[2] === 0x01) {
+ // NOTE: at this stage it is known that the top bit is set
+ ret += 0x10000000000000 + (this.words[1] * 0x4000000);
+ } else if (this.length > 2) {
+ assert(false, 'Number can only safely store up to 53 bits');
+ }
+ return (this.negative !== 0) ? -ret : ret;
+ };
+
+ BN.prototype.toJSON = function toJSON () {
+ return this.toString(16, 2);
+ };
+
+ if (Buffer) {
+ BN.prototype.toBuffer = function toBuffer (endian, length) {
+ return this.toArrayLike(Buffer, endian, length);
+ };
+ }
+
+ BN.prototype.toArray = function toArray (endian, length) {
+ return this.toArrayLike(Array, endian, length);
+ };
+
+ var allocate = function allocate (ArrayType, size) {
+ if (ArrayType.allocUnsafe) {
+ return ArrayType.allocUnsafe(size);
+ }
+ return new ArrayType(size);
+ };
+
+ BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {
+ this._strip();
+
+ var byteLength = this.byteLength();
+ var reqLength = length || Math.max(1, byteLength);
+ assert(byteLength <= reqLength, 'byte array longer than desired length');
+ assert(reqLength > 0, 'Requested array length <= 0');
+
+ var res = allocate(ArrayType, reqLength);
+ var postfix = endian === 'le' ? 'LE' : 'BE';
+ this['_toArrayLike' + postfix](res, byteLength);
+ return res;
+ };
+
+ BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {
+ var position = 0;
+ var carry = 0;
+
+ for (var i = 0, shift = 0; i < this.length; i++) {
+ var word = (this.words[i] << shift) | carry;
+
+ res[position++] = word & 0xff;
+ if (position < res.length) {
+ res[position++] = (word >> 8) & 0xff;
+ }
+ if (position < res.length) {
+ res[position++] = (word >> 16) & 0xff;
+ }
+
+ if (shift === 6) {
+ if (position < res.length) {
+ res[position++] = (word >> 24) & 0xff;
+ }
+ carry = 0;
+ shift = 0;
+ } else {
+ carry = word >>> 24;
+ shift += 2;
+ }
+ }
+
+ if (position < res.length) {
+ res[position++] = carry;
+
+ while (position < res.length) {
+ res[position++] = 0;
+ }
+ }
+ };
+
+ BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {
+ var position = res.length - 1;
+ var carry = 0;
+
+ for (var i = 0, shift = 0; i < this.length; i++) {
+ var word = (this.words[i] << shift) | carry;
+
+ res[position--] = word & 0xff;
+ if (position >= 0) {
+ res[position--] = (word >> 8) & 0xff;
+ }
+ if (position >= 0) {
+ res[position--] = (word >> 16) & 0xff;
+ }
+
+ if (shift === 6) {
+ if (position >= 0) {
+ res[position--] = (word >> 24) & 0xff;
+ }
+ carry = 0;
+ shift = 0;
+ } else {
+ carry = word >>> 24;
+ shift += 2;
+ }
+ }
+
+ if (position >= 0) {
+ res[position--] = carry;
+
+ while (position >= 0) {
+ res[position--] = 0;
+ }
+ }
+ };
+
+ if (Math.clz32) {
+ BN.prototype._countBits = function _countBits (w) {
+ return 32 - Math.clz32(w);
+ };
+ } else {
+ BN.prototype._countBits = function _countBits (w) {
+ var t = w;
+ var r = 0;
+ if (t >= 0x1000) {
+ r += 13;
+ t >>>= 13;
+ }
+ if (t >= 0x40) {
+ r += 7;
+ t >>>= 7;
+ }
+ if (t >= 0x8) {
+ r += 4;
+ t >>>= 4;
+ }
+ if (t >= 0x02) {
+ r += 2;
+ t >>>= 2;
+ }
+ return r + t;
+ };
+ }
+
+ BN.prototype._zeroBits = function _zeroBits (w) {
+ // Short-cut
+ if (w === 0) return 26;
+
+ var t = w;
+ var r = 0;
+ if ((t & 0x1fff) === 0) {
+ r += 13;
+ t >>>= 13;
+ }
+ if ((t & 0x7f) === 0) {
+ r += 7;
+ t >>>= 7;
+ }
+ if ((t & 0xf) === 0) {
+ r += 4;
+ t >>>= 4;
+ }
+ if ((t & 0x3) === 0) {
+ r += 2;
+ t >>>= 2;
+ }
+ if ((t & 0x1) === 0) {
+ r++;
+ }
+ return r;
+ };
+
+ // Return number of used bits in a BN
+ BN.prototype.bitLength = function bitLength () {
+ var w = this.words[this.length - 1];
+ var hi = this._countBits(w);
+ return (this.length - 1) * 26 + hi;
+ };
+
+ function toBitArray (num) {
+ var w = new Array(num.bitLength());
+
+ for (var bit = 0; bit < w.length; bit++) {
+ var off = (bit / 26) | 0;
+ var wbit = bit % 26;
+
+ w[bit] = (num.words[off] >>> wbit) & 0x01;
+ }
+
+ return w;
+ }
+
+ // Number of trailing zero bits
+ BN.prototype.zeroBits = function zeroBits () {
+ if (this.isZero()) return 0;
+
+ var r = 0;
+ for (var i = 0; i < this.length; i++) {
+ var b = this._zeroBits(this.words[i]);
+ r += b;
+ if (b !== 26) break;
+ }
+ return r;
+ };
+
+ BN.prototype.byteLength = function byteLength () {
+ return Math.ceil(this.bitLength() / 8);
+ };
+
+ BN.prototype.toTwos = function toTwos (width) {
+ if (this.negative !== 0) {
+ return this.abs().inotn(width).iaddn(1);
+ }
+ return this.clone();
+ };
+
+ BN.prototype.fromTwos = function fromTwos (width) {
+ if (this.testn(width - 1)) {
+ return this.notn(width).iaddn(1).ineg();
+ }
+ return this.clone();
+ };
+
+ BN.prototype.isNeg = function isNeg () {
+ return this.negative !== 0;
+ };
+
+ // Return negative clone of `this`
+ BN.prototype.neg = function neg () {
+ return this.clone().ineg();
+ };
+
+ BN.prototype.ineg = function ineg () {
+ if (!this.isZero()) {
+ this.negative ^= 1;
+ }
+
+ return this;
+ };
+
+ // Or `num` with `this` in-place
+ BN.prototype.iuor = function iuor (num) {
+ while (this.length < num.length) {
+ this.words[this.length++] = 0;
+ }
+
+ for (var i = 0; i < num.length; i++) {
+ this.words[i] = this.words[i] | num.words[i];
+ }
+
+ return this._strip();
+ };
+
+ BN.prototype.ior = function ior (num) {
+ assert((this.negative | num.negative) === 0);
+ return this.iuor(num);
+ };
+
+ // Or `num` with `this`
+ BN.prototype.or = function or (num) {
+ if (this.length > num.length) return this.clone().ior(num);
+ return num.clone().ior(this);
+ };
+
+ BN.prototype.uor = function uor (num) {
+ if (this.length > num.length) return this.clone().iuor(num);
+ return num.clone().iuor(this);
+ };
+
+ // And `num` with `this` in-place
+ BN.prototype.iuand = function iuand (num) {
+ // b = min-length(num, this)
+ var b;
+ if (this.length > num.length) {
+ b = num;
+ } else {
+ b = this;
+ }
+
+ for (var i = 0; i < b.length; i++) {
+ this.words[i] = this.words[i] & num.words[i];
+ }
+
+ this.length = b.length;
+
+ return this._strip();
+ };
+
+ BN.prototype.iand = function iand (num) {
+ assert((this.negative | num.negative) === 0);
+ return this.iuand(num);
+ };
+
+ // And `num` with `this`
+ BN.prototype.and = function and (num) {
+ if (this.length > num.length) return this.clone().iand(num);
+ return num.clone().iand(this);
+ };
+
+ BN.prototype.uand = function uand (num) {
+ if (this.length > num.length) return this.clone().iuand(num);
+ return num.clone().iuand(this);
+ };
+
+ // Xor `num` with `this` in-place
+ BN.prototype.iuxor = function iuxor (num) {
+ // a.length > b.length
+ var a;
+ var b;
+ if (this.length > num.length) {
+ a = this;
+ b = num;
+ } else {
+ a = num;
+ b = this;
+ }
+
+ for (var i = 0; i < b.length; i++) {
+ this.words[i] = a.words[i] ^ b.words[i];
+ }
+
+ if (this !== a) {
+ for (; i < a.length; i++) {
+ this.words[i] = a.words[i];
+ }
+ }
+
+ this.length = a.length;
+
+ return this._strip();
+ };
+
+ BN.prototype.ixor = function ixor (num) {
+ assert((this.negative | num.negative) === 0);
+ return this.iuxor(num);
+ };
+
+ // Xor `num` with `this`
+ BN.prototype.xor = function xor (num) {
+ if (this.length > num.length) return this.clone().ixor(num);
+ return num.clone().ixor(this);
+ };
+
+ BN.prototype.uxor = function uxor (num) {
+ if (this.length > num.length) return this.clone().iuxor(num);
+ return num.clone().iuxor(this);
+ };
+
+ // Not ``this`` with ``width`` bitwidth
+ BN.prototype.inotn = function inotn (width) {
+ assert(typeof width === 'number' && width >= 0);
+
+ var bytesNeeded = Math.ceil(width / 26) | 0;
+ var bitsLeft = width % 26;
+
+ // Extend the buffer with leading zeroes
+ this._expand(bytesNeeded);
+
+ if (bitsLeft > 0) {
+ bytesNeeded--;
+ }
+
+ // Handle complete words
+ for (var i = 0; i < bytesNeeded; i++) {
+ this.words[i] = ~this.words[i] & 0x3ffffff;
+ }
+
+ // Handle the residue
+ if (bitsLeft > 0) {
+ this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));
+ }
+
+ // And remove leading zeroes
+ return this._strip();
+ };
+
+ BN.prototype.notn = function notn (width) {
+ return this.clone().inotn(width);
+ };
+
+ // Set `bit` of `this`
+ BN.prototype.setn = function setn (bit, val) {
+ assert(typeof bit === 'number' && bit >= 0);
+
+ var off = (bit / 26) | 0;
+ var wbit = bit % 26;
+
+ this._expand(off + 1);
+
+ if (val) {
+ this.words[off] = this.words[off] | (1 << wbit);
+ } else {
+ this.words[off] = this.words[off] & ~(1 << wbit);
+ }
+
+ return this._strip();
+ };
+
+ // Add `num` to `this` in-place
+ BN.prototype.iadd = function iadd (num) {
+ var r;
+
+ // negative + positive
+ if (this.negative !== 0 && num.negative === 0) {
+ this.negative = 0;
+ r = this.isub(num);
+ this.negative ^= 1;
+ return this._normSign();
+
+ // positive + negative
+ } else if (this.negative === 0 && num.negative !== 0) {
+ num.negative = 0;
+ r = this.isub(num);
+ num.negative = 1;
+ return r._normSign();
+ }
+
+ // a.length > b.length
+ var a, b;
+ if (this.length > num.length) {
+ a = this;
+ b = num;
+ } else {
+ a = num;
+ b = this;
+ }
+
+ var carry = 0;
+ for (var i = 0; i < b.length; i++) {
+ r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
+ this.words[i] = r & 0x3ffffff;
+ carry = r >>> 26;
+ }
+ for (; carry !== 0 && i < a.length; i++) {
+ r = (a.words[i] | 0) + carry;
+ this.words[i] = r & 0x3ffffff;
+ carry = r >>> 26;
+ }
+
+ this.length = a.length;
+ if (carry !== 0) {
+ this.words[this.length] = carry;
+ this.length++;
+ // Copy the rest of the words
+ } else if (a !== this) {
+ for (; i < a.length; i++) {
+ this.words[i] = a.words[i];
+ }
+ }
+
+ return this;
+ };
+
+ // Add `num` to `this`
+ BN.prototype.add = function add (num) {
+ var res;
+ if (num.negative !== 0 && this.negative === 0) {
+ num.negative = 0;
+ res = this.sub(num);
+ num.negative ^= 1;
+ return res;
+ } else if (num.negative === 0 && this.negative !== 0) {
+ this.negative = 0;
+ res = num.sub(this);
+ this.negative = 1;
+ return res;
+ }
+
+ if (this.length > num.length) return this.clone().iadd(num);
+
+ return num.clone().iadd(this);
+ };
+
+ // Subtract `num` from `this` in-place
+ BN.prototype.isub = function isub (num) {
+ // this - (-num) = this + num
+ if (num.negative !== 0) {
+ num.negative = 0;
+ var r = this.iadd(num);
+ num.negative = 1;
+ return r._normSign();
+
+ // -this - num = -(this + num)
+ } else if (this.negative !== 0) {
+ this.negative = 0;
+ this.iadd(num);
+ this.negative = 1;
+ return this._normSign();
+ }
+
+ // At this point both numbers are positive
+ var cmp = this.cmp(num);
+
+ // Optimization - zeroify
+ if (cmp === 0) {
+ this.negative = 0;
+ this.length = 1;
+ this.words[0] = 0;
+ return this;
+ }
+
+ // a > b
+ var a, b;
+ if (cmp > 0) {
+ a = this;
+ b = num;
+ } else {
+ a = num;
+ b = this;
+ }
+
+ var carry = 0;
+ for (var i = 0; i < b.length; i++) {
+ r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
+ carry = r >> 26;
+ this.words[i] = r & 0x3ffffff;
+ }
+ for (; carry !== 0 && i < a.length; i++) {
+ r = (a.words[i] | 0) + carry;
+ carry = r >> 26;
+ this.words[i] = r & 0x3ffffff;
+ }
+
+ // Copy rest of the words
+ if (carry === 0 && i < a.length && a !== this) {
+ for (; i < a.length; i++) {
+ this.words[i] = a.words[i];
+ }
+ }
+
+ this.length = Math.max(this.length, i);
+
+ if (a !== this) {
+ this.negative = 1;
+ }
+
+ return this._strip();
+ };
+
+ // Subtract `num` from `this`
+ BN.prototype.sub = function sub (num) {
+ return this.clone().isub(num);
+ };
+
+ function smallMulTo (self, num, out) {
+ out.negative = num.negative ^ self.negative;
+ var len = (self.length + num.length) | 0;
+ out.length = len;
+ len = (len - 1) | 0;
+
+ // Peel one iteration (compiler can't do it, because of code complexity)
+ var a = self.words[0] | 0;
+ var b = num.words[0] | 0;
+ var r = a * b;
+
+ var lo = r & 0x3ffffff;
+ var carry = (r / 0x4000000) | 0;
+ out.words[0] = lo;
+
+ for (var k = 1; k < len; k++) {
+ // Sum all words with the same `i + j = k` and accumulate `ncarry`,
+ // note that ncarry could be >= 0x3ffffff
+ var ncarry = carry >>> 26;
+ var rword = carry & 0x3ffffff;
+ var maxJ = Math.min(k, num.length - 1);
+ for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
+ var i = (k - j) | 0;
+ a = self.words[i] | 0;
+ b = num.words[j] | 0;
+ r = a * b + rword;
+ ncarry += (r / 0x4000000) | 0;
+ rword = r & 0x3ffffff;
+ }
+ out.words[k] = rword | 0;
+ carry = ncarry | 0;
+ }
+ if (carry !== 0) {
+ out.words[k] = carry | 0;
+ } else {
+ out.length--;
+ }
+
+ return out._strip();
+ }
+
+ // TODO(indutny): it may be reasonable to omit it for users who don't need
+ // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit
+ // multiplication (like elliptic secp256k1).
+ var comb10MulTo = function comb10MulTo (self, num, out) {
+ var a = self.words;
+ var b = num.words;
+ var o = out.words;
+ var c = 0;
+ var lo;
+ var mid;
+ var hi;
+ var a0 = a[0] | 0;
+ var al0 = a0 & 0x1fff;
+ var ah0 = a0 >>> 13;
+ var a1 = a[1] | 0;
+ var al1 = a1 & 0x1fff;
+ var ah1 = a1 >>> 13;
+ var a2 = a[2] | 0;
+ var al2 = a2 & 0x1fff;
+ var ah2 = a2 >>> 13;
+ var a3 = a[3] | 0;
+ var al3 = a3 & 0x1fff;
+ var ah3 = a3 >>> 13;
+ var a4 = a[4] | 0;
+ var al4 = a4 & 0x1fff;
+ var ah4 = a4 >>> 13;
+ var a5 = a[5] | 0;
+ var al5 = a5 & 0x1fff;
+ var ah5 = a5 >>> 13;
+ var a6 = a[6] | 0;
+ var al6 = a6 & 0x1fff;
+ var ah6 = a6 >>> 13;
+ var a7 = a[7] | 0;
+ var al7 = a7 & 0x1fff;
+ var ah7 = a7 >>> 13;
+ var a8 = a[8] | 0;
+ var al8 = a8 & 0x1fff;
+ var ah8 = a8 >>> 13;
+ var a9 = a[9] | 0;
+ var al9 = a9 & 0x1fff;
+ var ah9 = a9 >>> 13;
+ var b0 = b[0] | 0;
+ var bl0 = b0 & 0x1fff;
+ var bh0 = b0 >>> 13;
+ var b1 = b[1] | 0;
+ var bl1 = b1 & 0x1fff;
+ var bh1 = b1 >>> 13;
+ var b2 = b[2] | 0;
+ var bl2 = b2 & 0x1fff;
+ var bh2 = b2 >>> 13;
+ var b3 = b[3] | 0;
+ var bl3 = b3 & 0x1fff;
+ var bh3 = b3 >>> 13;
+ var b4 = b[4] | 0;
+ var bl4 = b4 & 0x1fff;
+ var bh4 = b4 >>> 13;
+ var b5 = b[5] | 0;
+ var bl5 = b5 & 0x1fff;
+ var bh5 = b5 >>> 13;
+ var b6 = b[6] | 0;
+ var bl6 = b6 & 0x1fff;
+ var bh6 = b6 >>> 13;
+ var b7 = b[7] | 0;
+ var bl7 = b7 & 0x1fff;
+ var bh7 = b7 >>> 13;
+ var b8 = b[8] | 0;
+ var bl8 = b8 & 0x1fff;
+ var bh8 = b8 >>> 13;
+ var b9 = b[9] | 0;
+ var bl9 = b9 & 0x1fff;
+ var bh9 = b9 >>> 13;
+
+ out.negative = self.negative ^ num.negative;
+ out.length = 19;
+ /* k = 0 */
+ lo = Math.imul(al0, bl0);
+ mid = Math.imul(al0, bh0);
+ mid = (mid + Math.imul(ah0, bl0)) | 0;
+ hi = Math.imul(ah0, bh0);
+ var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;
+ w0 &= 0x3ffffff;
+ /* k = 1 */
+ lo = Math.imul(al1, bl0);
+ mid = Math.imul(al1, bh0);
+ mid = (mid + Math.imul(ah1, bl0)) | 0;
+ hi = Math.imul(ah1, bh0);
+ lo = (lo + Math.imul(al0, bl1)) | 0;
+ mid = (mid + Math.imul(al0, bh1)) | 0;
+ mid = (mid + Math.imul(ah0, bl1)) | 0;
+ hi = (hi + Math.imul(ah0, bh1)) | 0;
+ var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;
+ w1 &= 0x3ffffff;
+ /* k = 2 */
+ lo = Math.imul(al2, bl0);
+ mid = Math.imul(al2, bh0);
+ mid = (mid + Math.imul(ah2, bl0)) | 0;
+ hi = Math.imul(ah2, bh0);
+ lo = (lo + Math.imul(al1, bl1)) | 0;
+ mid = (mid + Math.imul(al1, bh1)) | 0;
+ mid = (mid + Math.imul(ah1, bl1)) | 0;
+ hi = (hi + Math.imul(ah1, bh1)) | 0;
+ lo = (lo + Math.imul(al0, bl2)) | 0;
+ mid = (mid + Math.imul(al0, bh2)) | 0;
+ mid = (mid + Math.imul(ah0, bl2)) | 0;
+ hi = (hi + Math.imul(ah0, bh2)) | 0;
+ var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;
+ w2 &= 0x3ffffff;
+ /* k = 3 */
+ lo = Math.imul(al3, bl0);
+ mid = Math.imul(al3, bh0);
+ mid = (mid + Math.imul(ah3, bl0)) | 0;
+ hi = Math.imul(ah3, bh0);
+ lo = (lo + Math.imul(al2, bl1)) | 0;
+ mid = (mid + Math.imul(al2, bh1)) | 0;
+ mid = (mid + Math.imul(ah2, bl1)) | 0;
+ hi = (hi + Math.imul(ah2, bh1)) | 0;
+ lo = (lo + Math.imul(al1, bl2)) | 0;
+ mid = (mid + Math.imul(al1, bh2)) | 0;
+ mid = (mid + Math.imul(ah1, bl2)) | 0;
+ hi = (hi + Math.imul(ah1, bh2)) | 0;
+ lo = (lo + Math.imul(al0, bl3)) | 0;
+ mid = (mid + Math.imul(al0, bh3)) | 0;
+ mid = (mid + Math.imul(ah0, bl3)) | 0;
+ hi = (hi + Math.imul(ah0, bh3)) | 0;
+ var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;
+ w3 &= 0x3ffffff;
+ /* k = 4 */
+ lo = Math.imul(al4, bl0);
+ mid = Math.imul(al4, bh0);
+ mid = (mid + Math.imul(ah4, bl0)) | 0;
+ hi = Math.imul(ah4, bh0);
+ lo = (lo + Math.imul(al3, bl1)) | 0;
+ mid = (mid + Math.imul(al3, bh1)) | 0;
+ mid = (mid + Math.imul(ah3, bl1)) | 0;
+ hi = (hi + Math.imul(ah3, bh1)) | 0;
+ lo = (lo + Math.imul(al2, bl2)) | 0;
+ mid = (mid + Math.imul(al2, bh2)) | 0;
+ mid = (mid + Math.imul(ah2, bl2)) | 0;
+ hi = (hi + Math.imul(ah2, bh2)) | 0;
+ lo = (lo + Math.imul(al1, bl3)) | 0;
+ mid = (mid + Math.imul(al1, bh3)) | 0;
+ mid = (mid + Math.imul(ah1, bl3)) | 0;
+ hi = (hi + Math.imul(ah1, bh3)) | 0;
+ lo = (lo + Math.imul(al0, bl4)) | 0;
+ mid = (mid + Math.imul(al0, bh4)) | 0;
+ mid = (mid + Math.imul(ah0, bl4)) | 0;
+ hi = (hi + Math.imul(ah0, bh4)) | 0;
+ var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;
+ w4 &= 0x3ffffff;
+ /* k = 5 */
+ lo = Math.imul(al5, bl0);
+ mid = Math.imul(al5, bh0);
+ mid = (mid + Math.imul(ah5, bl0)) | 0;
+ hi = Math.imul(ah5, bh0);
+ lo = (lo + Math.imul(al4, bl1)) | 0;
+ mid = (mid + Math.imul(al4, bh1)) | 0;
+ mid = (mid + Math.imul(ah4, bl1)) | 0;
+ hi = (hi + Math.imul(ah4, bh1)) | 0;
+ lo = (lo + Math.imul(al3, bl2)) | 0;
+ mid = (mid + Math.imul(al3, bh2)) | 0;
+ mid = (mid + Math.imul(ah3, bl2)) | 0;
+ hi = (hi + Math.imul(ah3, bh2)) | 0;
+ lo = (lo + Math.imul(al2, bl3)) | 0;
+ mid = (mid + Math.imul(al2, bh3)) | 0;
+ mid = (mid + Math.imul(ah2, bl3)) | 0;
+ hi = (hi + Math.imul(ah2, bh3)) | 0;
+ lo = (lo + Math.imul(al1, bl4)) | 0;
+ mid = (mid + Math.imul(al1, bh4)) | 0;
+ mid = (mid + Math.imul(ah1, bl4)) | 0;
+ hi = (hi + Math.imul(ah1, bh4)) | 0;
+ lo = (lo + Math.imul(al0, bl5)) | 0;
+ mid = (mid + Math.imul(al0, bh5)) | 0;
+ mid = (mid + Math.imul(ah0, bl5)) | 0;
+ hi = (hi + Math.imul(ah0, bh5)) | 0;
+ var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;
+ w5 &= 0x3ffffff;
+ /* k = 6 */
+ lo = Math.imul(al6, bl0);
+ mid = Math.imul(al6, bh0);
+ mid = (mid + Math.imul(ah6, bl0)) | 0;
+ hi = Math.imul(ah6, bh0);
+ lo = (lo + Math.imul(al5, bl1)) | 0;
+ mid = (mid + Math.imul(al5, bh1)) | 0;
+ mid = (mid + Math.imul(ah5, bl1)) | 0;
+ hi = (hi + Math.imul(ah5, bh1)) | 0;
+ lo = (lo + Math.imul(al4, bl2)) | 0;
+ mid = (mid + Math.imul(al4, bh2)) | 0;
+ mid = (mid + Math.imul(ah4, bl2)) | 0;
+ hi = (hi + Math.imul(ah4, bh2)) | 0;
+ lo = (lo + Math.imul(al3, bl3)) | 0;
+ mid = (mid + Math.imul(al3, bh3)) | 0;
+ mid = (mid + Math.imul(ah3, bl3)) | 0;
+ hi = (hi + Math.imul(ah3, bh3)) | 0;
+ lo = (lo + Math.imul(al2, bl4)) | 0;
+ mid = (mid + Math.imul(al2, bh4)) | 0;
+ mid = (mid + Math.imul(ah2, bl4)) | 0;
+ hi = (hi + Math.imul(ah2, bh4)) | 0;
+ lo = (lo + Math.imul(al1, bl5)) | 0;
+ mid = (mid + Math.imul(al1, bh5)) | 0;
+ mid = (mid + Math.imul(ah1, bl5)) | 0;
+ hi = (hi + Math.imul(ah1, bh5)) | 0;
+ lo = (lo + Math.imul(al0, bl6)) | 0;
+ mid = (mid + Math.imul(al0, bh6)) | 0;
+ mid = (mid + Math.imul(ah0, bl6)) | 0;
+ hi = (hi + Math.imul(ah0, bh6)) | 0;
+ var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;
+ w6 &= 0x3ffffff;
+ /* k = 7 */
+ lo = Math.imul(al7, bl0);
+ mid = Math.imul(al7, bh0);
+ mid = (mid + Math.imul(ah7, bl0)) | 0;
+ hi = Math.imul(ah7, bh0);
+ lo = (lo + Math.imul(al6, bl1)) | 0;
+ mid = (mid + Math.imul(al6, bh1)) | 0;
+ mid = (mid + Math.imul(ah6, bl1)) | 0;
+ hi = (hi + Math.imul(ah6, bh1)) | 0;
+ lo = (lo + Math.imul(al5, bl2)) | 0;
+ mid = (mid + Math.imul(al5, bh2)) | 0;
+ mid = (mid + Math.imul(ah5, bl2)) | 0;
+ hi = (hi + Math.imul(ah5, bh2)) | 0;
+ lo = (lo + Math.imul(al4, bl3)) | 0;
+ mid = (mid + Math.imul(al4, bh3)) | 0;
+ mid = (mid + Math.imul(ah4, bl3)) | 0;
+ hi = (hi + Math.imul(ah4, bh3)) | 0;
+ lo = (lo + Math.imul(al3, bl4)) | 0;
+ mid = (mid + Math.imul(al3, bh4)) | 0;
+ mid = (mid + Math.imul(ah3, bl4)) | 0;
+ hi = (hi + Math.imul(ah3, bh4)) | 0;
+ lo = (lo + Math.imul(al2, bl5)) | 0;
+ mid = (mid + Math.imul(al2, bh5)) | 0;
+ mid = (mid + Math.imul(ah2, bl5)) | 0;
+ hi = (hi + Math.imul(ah2, bh5)) | 0;
+ lo = (lo + Math.imul(al1, bl6)) | 0;
+ mid = (mid + Math.imul(al1, bh6)) | 0;
+ mid = (mid + Math.imul(ah1, bl6)) | 0;
+ hi = (hi + Math.imul(ah1, bh6)) | 0;
+ lo = (lo + Math.imul(al0, bl7)) | 0;
+ mid = (mid + Math.imul(al0, bh7)) | 0;
+ mid = (mid + Math.imul(ah0, bl7)) | 0;
+ hi = (hi + Math.imul(ah0, bh7)) | 0;
+ var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;
+ w7 &= 0x3ffffff;
+ /* k = 8 */
+ lo = Math.imul(al8, bl0);
+ mid = Math.imul(al8, bh0);
+ mid = (mid + Math.imul(ah8, bl0)) | 0;
+ hi = Math.imul(ah8, bh0);
+ lo = (lo + Math.imul(al7, bl1)) | 0;
+ mid = (mid + Math.imul(al7, bh1)) | 0;
+ mid = (mid + Math.imul(ah7, bl1)) | 0;
+ hi = (hi + Math.imul(ah7, bh1)) | 0;
+ lo = (lo + Math.imul(al6, bl2)) | 0;
+ mid = (mid + Math.imul(al6, bh2)) | 0;
+ mid = (mid + Math.imul(ah6, bl2)) | 0;
+ hi = (hi + Math.imul(ah6, bh2)) | 0;
+ lo = (lo + Math.imul(al5, bl3)) | 0;
+ mid = (mid + Math.imul(al5, bh3)) | 0;
+ mid = (mid + Math.imul(ah5, bl3)) | 0;
+ hi = (hi + Math.imul(ah5, bh3)) | 0;
+ lo = (lo + Math.imul(al4, bl4)) | 0;
+ mid = (mid + Math.imul(al4, bh4)) | 0;
+ mid = (mid + Math.imul(ah4, bl4)) | 0;
+ hi = (hi + Math.imul(ah4, bh4)) | 0;
+ lo = (lo + Math.imul(al3, bl5)) | 0;
+ mid = (mid + Math.imul(al3, bh5)) | 0;
+ mid = (mid + Math.imul(ah3, bl5)) | 0;
+ hi = (hi + Math.imul(ah3, bh5)) | 0;
+ lo = (lo + Math.imul(al2, bl6)) | 0;
+ mid = (mid + Math.imul(al2, bh6)) | 0;
+ mid = (mid + Math.imul(ah2, bl6)) | 0;
+ hi = (hi + Math.imul(ah2, bh6)) | 0;
+ lo = (lo + Math.imul(al1, bl7)) | 0;
+ mid = (mid + Math.imul(al1, bh7)) | 0;
+ mid = (mid + Math.imul(ah1, bl7)) | 0;
+ hi = (hi + Math.imul(ah1, bh7)) | 0;
+ lo = (lo + Math.imul(al0, bl8)) | 0;
+ mid = (mid + Math.imul(al0, bh8)) | 0;
+ mid = (mid + Math.imul(ah0, bl8)) | 0;
+ hi = (hi + Math.imul(ah0, bh8)) | 0;
+ var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;
+ w8 &= 0x3ffffff;
+ /* k = 9 */
+ lo = Math.imul(al9, bl0);
+ mid = Math.imul(al9, bh0);
+ mid = (mid + Math.imul(ah9, bl0)) | 0;
+ hi = Math.imul(ah9, bh0);
+ lo = (lo + Math.imul(al8, bl1)) | 0;
+ mid = (mid + Math.imul(al8, bh1)) | 0;
+ mid = (mid + Math.imul(ah8, bl1)) | 0;
+ hi = (hi + Math.imul(ah8, bh1)) | 0;
+ lo = (lo + Math.imul(al7, bl2)) | 0;
+ mid = (mid + Math.imul(al7, bh2)) | 0;
+ mid = (mid + Math.imul(ah7, bl2)) | 0;
+ hi = (hi + Math.imul(ah7, bh2)) | 0;
+ lo = (lo + Math.imul(al6, bl3)) | 0;
+ mid = (mid + Math.imul(al6, bh3)) | 0;
+ mid = (mid + Math.imul(ah6, bl3)) | 0;
+ hi = (hi + Math.imul(ah6, bh3)) | 0;
+ lo = (lo + Math.imul(al5, bl4)) | 0;
+ mid = (mid + Math.imul(al5, bh4)) | 0;
+ mid = (mid + Math.imul(ah5, bl4)) | 0;
+ hi = (hi + Math.imul(ah5, bh4)) | 0;
+ lo = (lo + Math.imul(al4, bl5)) | 0;
+ mid = (mid + Math.imul(al4, bh5)) | 0;
+ mid = (mid + Math.imul(ah4, bl5)) | 0;
+ hi = (hi + Math.imul(ah4, bh5)) | 0;
+ lo = (lo + Math.imul(al3, bl6)) | 0;
+ mid = (mid + Math.imul(al3, bh6)) | 0;
+ mid = (mid + Math.imul(ah3, bl6)) | 0;
+ hi = (hi + Math.imul(ah3, bh6)) | 0;
+ lo = (lo + Math.imul(al2, bl7)) | 0;
+ mid = (mid + Math.imul(al2, bh7)) | 0;
+ mid = (mid + Math.imul(ah2, bl7)) | 0;
+ hi = (hi + Math.imul(ah2, bh7)) | 0;
+ lo = (lo + Math.imul(al1, bl8)) | 0;
+ mid = (mid + Math.imul(al1, bh8)) | 0;
+ mid = (mid + Math.imul(ah1, bl8)) | 0;
+ hi = (hi + Math.imul(ah1, bh8)) | 0;
+ lo = (lo + Math.imul(al0, bl9)) | 0;
+ mid = (mid + Math.imul(al0, bh9)) | 0;
+ mid = (mid + Math.imul(ah0, bl9)) | 0;
+ hi = (hi + Math.imul(ah0, bh9)) | 0;
+ var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;
+ w9 &= 0x3ffffff;
+ /* k = 10 */
+ lo = Math.imul(al9, bl1);
+ mid = Math.imul(al9, bh1);
+ mid = (mid + Math.imul(ah9, bl1)) | 0;
+ hi = Math.imul(ah9, bh1);
+ lo = (lo + Math.imul(al8, bl2)) | 0;
+ mid = (mid + Math.imul(al8, bh2)) | 0;
+ mid = (mid + Math.imul(ah8, bl2)) | 0;
+ hi = (hi + Math.imul(ah8, bh2)) | 0;
+ lo = (lo + Math.imul(al7, bl3)) | 0;
+ mid = (mid + Math.imul(al7, bh3)) | 0;
+ mid = (mid + Math.imul(ah7, bl3)) | 0;
+ hi = (hi + Math.imul(ah7, bh3)) | 0;
+ lo = (lo + Math.imul(al6, bl4)) | 0;
+ mid = (mid + Math.imul(al6, bh4)) | 0;
+ mid = (mid + Math.imul(ah6, bl4)) | 0;
+ hi = (hi + Math.imul(ah6, bh4)) | 0;
+ lo = (lo + Math.imul(al5, bl5)) | 0;
+ mid = (mid + Math.imul(al5, bh5)) | 0;
+ mid = (mid + Math.imul(ah5, bl5)) | 0;
+ hi = (hi + Math.imul(ah5, bh5)) | 0;
+ lo = (lo + Math.imul(al4, bl6)) | 0;
+ mid = (mid + Math.imul(al4, bh6)) | 0;
+ mid = (mid + Math.imul(ah4, bl6)) | 0;
+ hi = (hi + Math.imul(ah4, bh6)) | 0;
+ lo = (lo + Math.imul(al3, bl7)) | 0;
+ mid = (mid + Math.imul(al3, bh7)) | 0;
+ mid = (mid + Math.imul(ah3, bl7)) | 0;
+ hi = (hi + Math.imul(ah3, bh7)) | 0;
+ lo = (lo + Math.imul(al2, bl8)) | 0;
+ mid = (mid + Math.imul(al2, bh8)) | 0;
+ mid = (mid + Math.imul(ah2, bl8)) | 0;
+ hi = (hi + Math.imul(ah2, bh8)) | 0;
+ lo = (lo + Math.imul(al1, bl9)) | 0;
+ mid = (mid + Math.imul(al1, bh9)) | 0;
+ mid = (mid + Math.imul(ah1, bl9)) | 0;
+ hi = (hi + Math.imul(ah1, bh9)) | 0;
+ var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;
+ w10 &= 0x3ffffff;
+ /* k = 11 */
+ lo = Math.imul(al9, bl2);
+ mid = Math.imul(al9, bh2);
+ mid = (mid + Math.imul(ah9, bl2)) | 0;
+ hi = Math.imul(ah9, bh2);
+ lo = (lo + Math.imul(al8, bl3)) | 0;
+ mid = (mid + Math.imul(al8, bh3)) | 0;
+ mid = (mid + Math.imul(ah8, bl3)) | 0;
+ hi = (hi + Math.imul(ah8, bh3)) | 0;
+ lo = (lo + Math.imul(al7, bl4)) | 0;
+ mid = (mid + Math.imul(al7, bh4)) | 0;
+ mid = (mid + Math.imul(ah7, bl4)) | 0;
+ hi = (hi + Math.imul(ah7, bh4)) | 0;
+ lo = (lo + Math.imul(al6, bl5)) | 0;
+ mid = (mid + Math.imul(al6, bh5)) | 0;
+ mid = (mid + Math.imul(ah6, bl5)) | 0;
+ hi = (hi + Math.imul(ah6, bh5)) | 0;
+ lo = (lo + Math.imul(al5, bl6)) | 0;
+ mid = (mid + Math.imul(al5, bh6)) | 0;
+ mid = (mid + Math.imul(ah5, bl6)) | 0;
+ hi = (hi + Math.imul(ah5, bh6)) | 0;
+ lo = (lo + Math.imul(al4, bl7)) | 0;
+ mid = (mid + Math.imul(al4, bh7)) | 0;
+ mid = (mid + Math.imul(ah4, bl7)) | 0;
+ hi = (hi + Math.imul(ah4, bh7)) | 0;
+ lo = (lo + Math.imul(al3, bl8)) | 0;
+ mid = (mid + Math.imul(al3, bh8)) | 0;
+ mid = (mid + Math.imul(ah3, bl8)) | 0;
+ hi = (hi + Math.imul(ah3, bh8)) | 0;
+ lo = (lo + Math.imul(al2, bl9)) | 0;
+ mid = (mid + Math.imul(al2, bh9)) | 0;
+ mid = (mid + Math.imul(ah2, bl9)) | 0;
+ hi = (hi + Math.imul(ah2, bh9)) | 0;
+ var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;
+ w11 &= 0x3ffffff;
+ /* k = 12 */
+ lo = Math.imul(al9, bl3);
+ mid = Math.imul(al9, bh3);
+ mid = (mid + Math.imul(ah9, bl3)) | 0;
+ hi = Math.imul(ah9, bh3);
+ lo = (lo + Math.imul(al8, bl4)) | 0;
+ mid = (mid + Math.imul(al8, bh4)) | 0;
+ mid = (mid + Math.imul(ah8, bl4)) | 0;
+ hi = (hi + Math.imul(ah8, bh4)) | 0;
+ lo = (lo + Math.imul(al7, bl5)) | 0;
+ mid = (mid + Math.imul(al7, bh5)) | 0;
+ mid = (mid + Math.imul(ah7, bl5)) | 0;
+ hi = (hi + Math.imul(ah7, bh5)) | 0;
+ lo = (lo + Math.imul(al6, bl6)) | 0;
+ mid = (mid + Math.imul(al6, bh6)) | 0;
+ mid = (mid + Math.imul(ah6, bl6)) | 0;
+ hi = (hi + Math.imul(ah6, bh6)) | 0;
+ lo = (lo + Math.imul(al5, bl7)) | 0;
+ mid = (mid + Math.imul(al5, bh7)) | 0;
+ mid = (mid + Math.imul(ah5, bl7)) | 0;
+ hi = (hi + Math.imul(ah5, bh7)) | 0;
+ lo = (lo + Math.imul(al4, bl8)) | 0;
+ mid = (mid + Math.imul(al4, bh8)) | 0;
+ mid = (mid + Math.imul(ah4, bl8)) | 0;
+ hi = (hi + Math.imul(ah4, bh8)) | 0;
+ lo = (lo + Math.imul(al3, bl9)) | 0;
+ mid = (mid + Math.imul(al3, bh9)) | 0;
+ mid = (mid + Math.imul(ah3, bl9)) | 0;
+ hi = (hi + Math.imul(ah3, bh9)) | 0;
+ var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;
+ w12 &= 0x3ffffff;
+ /* k = 13 */
+ lo = Math.imul(al9, bl4);
+ mid = Math.imul(al9, bh4);
+ mid = (mid + Math.imul(ah9, bl4)) | 0;
+ hi = Math.imul(ah9, bh4);
+ lo = (lo + Math.imul(al8, bl5)) | 0;
+ mid = (mid + Math.imul(al8, bh5)) | 0;
+ mid = (mid + Math.imul(ah8, bl5)) | 0;
+ hi = (hi + Math.imul(ah8, bh5)) | 0;
+ lo = (lo + Math.imul(al7, bl6)) | 0;
+ mid = (mid + Math.imul(al7, bh6)) | 0;
+ mid = (mid + Math.imul(ah7, bl6)) | 0;
+ hi = (hi + Math.imul(ah7, bh6)) | 0;
+ lo = (lo + Math.imul(al6, bl7)) | 0;
+ mid = (mid + Math.imul(al6, bh7)) | 0;
+ mid = (mid + Math.imul(ah6, bl7)) | 0;
+ hi = (hi + Math.imul(ah6, bh7)) | 0;
+ lo = (lo + Math.imul(al5, bl8)) | 0;
+ mid = (mid + Math.imul(al5, bh8)) | 0;
+ mid = (mid + Math.imul(ah5, bl8)) | 0;
+ hi = (hi + Math.imul(ah5, bh8)) | 0;
+ lo = (lo + Math.imul(al4, bl9)) | 0;
+ mid = (mid + Math.imul(al4, bh9)) | 0;
+ mid = (mid + Math.imul(ah4, bl9)) | 0;
+ hi = (hi + Math.imul(ah4, bh9)) | 0;
+ var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;
+ w13 &= 0x3ffffff;
+ /* k = 14 */
+ lo = Math.imul(al9, bl5);
+ mid = Math.imul(al9, bh5);
+ mid = (mid + Math.imul(ah9, bl5)) | 0;
+ hi = Math.imul(ah9, bh5);
+ lo = (lo + Math.imul(al8, bl6)) | 0;
+ mid = (mid + Math.imul(al8, bh6)) | 0;
+ mid = (mid + Math.imul(ah8, bl6)) | 0;
+ hi = (hi + Math.imul(ah8, bh6)) | 0;
+ lo = (lo + Math.imul(al7, bl7)) | 0;
+ mid = (mid + Math.imul(al7, bh7)) | 0;
+ mid = (mid + Math.imul(ah7, bl7)) | 0;
+ hi = (hi + Math.imul(ah7, bh7)) | 0;
+ lo = (lo + Math.imul(al6, bl8)) | 0;
+ mid = (mid + Math.imul(al6, bh8)) | 0;
+ mid = (mid + Math.imul(ah6, bl8)) | 0;
+ hi = (hi + Math.imul(ah6, bh8)) | 0;
+ lo = (lo + Math.imul(al5, bl9)) | 0;
+ mid = (mid + Math.imul(al5, bh9)) | 0;
+ mid = (mid + Math.imul(ah5, bl9)) | 0;
+ hi = (hi + Math.imul(ah5, bh9)) | 0;
+ var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;
+ w14 &= 0x3ffffff;
+ /* k = 15 */
+ lo = Math.imul(al9, bl6);
+ mid = Math.imul(al9, bh6);
+ mid = (mid + Math.imul(ah9, bl6)) | 0;
+ hi = Math.imul(ah9, bh6);
+ lo = (lo + Math.imul(al8, bl7)) | 0;
+ mid = (mid + Math.imul(al8, bh7)) | 0;
+ mid = (mid + Math.imul(ah8, bl7)) | 0;
+ hi = (hi + Math.imul(ah8, bh7)) | 0;
+ lo = (lo + Math.imul(al7, bl8)) | 0;
+ mid = (mid + Math.imul(al7, bh8)) | 0;
+ mid = (mid + Math.imul(ah7, bl8)) | 0;
+ hi = (hi + Math.imul(ah7, bh8)) | 0;
+ lo = (lo + Math.imul(al6, bl9)) | 0;
+ mid = (mid + Math.imul(al6, bh9)) | 0;
+ mid = (mid + Math.imul(ah6, bl9)) | 0;
+ hi = (hi + Math.imul(ah6, bh9)) | 0;
+ var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;
+ w15 &= 0x3ffffff;
+ /* k = 16 */
+ lo = Math.imul(al9, bl7);
+ mid = Math.imul(al9, bh7);
+ mid = (mid + Math.imul(ah9, bl7)) | 0;
+ hi = Math.imul(ah9, bh7);
+ lo = (lo + Math.imul(al8, bl8)) | 0;
+ mid = (mid + Math.imul(al8, bh8)) | 0;
+ mid = (mid + Math.imul(ah8, bl8)) | 0;
+ hi = (hi + Math.imul(ah8, bh8)) | 0;
+ lo = (lo + Math.imul(al7, bl9)) | 0;
+ mid = (mid + Math.imul(al7, bh9)) | 0;
+ mid = (mid + Math.imul(ah7, bl9)) | 0;
+ hi = (hi + Math.imul(ah7, bh9)) | 0;
+ var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;
+ w16 &= 0x3ffffff;
+ /* k = 17 */
+ lo = Math.imul(al9, bl8);
+ mid = Math.imul(al9, bh8);
+ mid = (mid + Math.imul(ah9, bl8)) | 0;
+ hi = Math.imul(ah9, bh8);
+ lo = (lo + Math.imul(al8, bl9)) | 0;
+ mid = (mid + Math.imul(al8, bh9)) | 0;
+ mid = (mid + Math.imul(ah8, bl9)) | 0;
+ hi = (hi + Math.imul(ah8, bh9)) | 0;
+ var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;
+ w17 &= 0x3ffffff;
+ /* k = 18 */
+ lo = Math.imul(al9, bl9);
+ mid = Math.imul(al9, bh9);
+ mid = (mid + Math.imul(ah9, bl9)) | 0;
+ hi = Math.imul(ah9, bh9);
+ var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;
+ w18 &= 0x3ffffff;
+ o[0] = w0;
+ o[1] = w1;
+ o[2] = w2;
+ o[3] = w3;
+ o[4] = w4;
+ o[5] = w5;
+ o[6] = w6;
+ o[7] = w7;
+ o[8] = w8;
+ o[9] = w9;
+ o[10] = w10;
+ o[11] = w11;
+ o[12] = w12;
+ o[13] = w13;
+ o[14] = w14;
+ o[15] = w15;
+ o[16] = w16;
+ o[17] = w17;
+ o[18] = w18;
+ if (c !== 0) {
+ o[19] = c;
+ out.length++;
+ }
+ return out;
+ };
+
+ // Polyfill comb
+ if (!Math.imul) {
+ comb10MulTo = smallMulTo;
+ }
+
+ function bigMulTo (self, num, out) {
+ out.negative = num.negative ^ self.negative;
+ out.length = self.length + num.length;
+
+ var carry = 0;
+ var hncarry = 0;
+ for (var k = 0; k < out.length - 1; k++) {
+ // Sum all words with the same `i + j = k` and accumulate `ncarry`,
+ // note that ncarry could be >= 0x3ffffff
+ var ncarry = hncarry;
+ hncarry = 0;
+ var rword = carry & 0x3ffffff;
+ var maxJ = Math.min(k, num.length - 1);
+ for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
+ var i = k - j;
+ var a = self.words[i] | 0;
+ var b = num.words[j] | 0;
+ var r = a * b;
+
+ var lo = r & 0x3ffffff;
+ ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
+ lo = (lo + rword) | 0;
+ rword = lo & 0x3ffffff;
+ ncarry = (ncarry + (lo >>> 26)) | 0;
+
+ hncarry += ncarry >>> 26;
+ ncarry &= 0x3ffffff;
+ }
+ out.words[k] = rword;
+ carry = ncarry;
+ ncarry = hncarry;
+ }
+ if (carry !== 0) {
+ out.words[k] = carry;
+ } else {
+ out.length--;
+ }
+
+ return out._strip();
+ }
+
+ function jumboMulTo (self, num, out) {
+ // Temporary disable, see https://github.com/indutny/bn.js/issues/211
+ // var fftm = new FFTM();
+ // return fftm.mulp(self, num, out);
+ return bigMulTo(self, num, out);
+ }
+
+ BN.prototype.mulTo = function mulTo (num, out) {
+ var res;
+ var len = this.length + num.length;
+ if (this.length === 10 && num.length === 10) {
+ res = comb10MulTo(this, num, out);
+ } else if (len < 63) {
+ res = smallMulTo(this, num, out);
+ } else if (len < 1024) {
+ res = bigMulTo(this, num, out);
+ } else {
+ res = jumboMulTo(this, num, out);
+ }
+
+ return res;
+ };
+
+ // Cooley-Tukey algorithm for FFT
+ // slightly revisited to rely on looping instead of recursion
+
+ function FFTM (x, y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ FFTM.prototype.makeRBT = function makeRBT (N) {
+ var t = new Array(N);
+ var l = BN.prototype._countBits(N) - 1;
+ for (var i = 0; i < N; i++) {
+ t[i] = this.revBin(i, l, N);
+ }
+
+ return t;
+ };
+
+ // Returns binary-reversed representation of `x`
+ FFTM.prototype.revBin = function revBin (x, l, N) {
+ if (x === 0 || x === N - 1) return x;
+
+ var rb = 0;
+ for (var i = 0; i < l; i++) {
+ rb |= (x & 1) << (l - i - 1);
+ x >>= 1;
+ }
+
+ return rb;
+ };
+
+ // Performs "tweedling" phase, therefore 'emulating'
+ // behaviour of the recursive algorithm
+ FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {
+ for (var i = 0; i < N; i++) {
+ rtws[i] = rws[rbt[i]];
+ itws[i] = iws[rbt[i]];
+ }
+ };
+
+ FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {
+ this.permute(rbt, rws, iws, rtws, itws, N);
+
+ for (var s = 1; s < N; s <<= 1) {
+ var l = s << 1;
+
+ var rtwdf = Math.cos(2 * Math.PI / l);
+ var itwdf = Math.sin(2 * Math.PI / l);
+
+ for (var p = 0; p < N; p += l) {
+ var rtwdf_ = rtwdf;
+ var itwdf_ = itwdf;
+
+ for (var j = 0; j < s; j++) {
+ var re = rtws[p + j];
+ var ie = itws[p + j];
+
+ var ro = rtws[p + j + s];
+ var io = itws[p + j + s];
+
+ var rx = rtwdf_ * ro - itwdf_ * io;
+
+ io = rtwdf_ * io + itwdf_ * ro;
+ ro = rx;
+
+ rtws[p + j] = re + ro;
+ itws[p + j] = ie + io;
+
+ rtws[p + j + s] = re - ro;
+ itws[p + j + s] = ie - io;
+
+ /* jshint maxdepth : false */
+ if (j !== l) {
+ rx = rtwdf * rtwdf_ - itwdf * itwdf_;
+
+ itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
+ rtwdf_ = rx;
+ }
+ }
+ }
+ }
+ };
+
+ FFTM.prototype.guessLen13b = function guessLen13b (n, m) {
+ var N = Math.max(m, n) | 1;
+ var odd = N & 1;
+ var i = 0;
+ for (N = N / 2 | 0; N; N = N >>> 1) {
+ i++;
+ }
+
+ return 1 << i + 1 + odd;
+ };
+
+ FFTM.prototype.conjugate = function conjugate (rws, iws, N) {
+ if (N <= 1) return;
+
+ for (var i = 0; i < N / 2; i++) {
+ var t = rws[i];
+
+ rws[i] = rws[N - i - 1];
+ rws[N - i - 1] = t;
+
+ t = iws[i];
+
+ iws[i] = -iws[N - i - 1];
+ iws[N - i - 1] = -t;
+ }
+ };
+
+ FFTM.prototype.normalize13b = function normalize13b (ws, N) {
+ var carry = 0;
+ for (var i = 0; i < N / 2; i++) {
+ var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +
+ Math.round(ws[2 * i] / N) +
+ carry;
+
+ ws[i] = w & 0x3ffffff;
+
+ if (w < 0x4000000) {
+ carry = 0;
+ } else {
+ carry = w / 0x4000000 | 0;
+ }
+ }
+
+ return ws;
+ };
+
+ FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {
+ var carry = 0;
+ for (var i = 0; i < len; i++) {
+ carry = carry + (ws[i] | 0);
+
+ rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;
+ rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;
+ }
+
+ // Pad with zeroes
+ for (i = 2 * len; i < N; ++i) {
+ rws[i] = 0;
+ }
+
+ assert(carry === 0);
+ assert((carry & ~0x1fff) === 0);
+ };
+
+ FFTM.prototype.stub = function stub (N) {
+ var ph = new Array(N);
+ for (var i = 0; i < N; i++) {
+ ph[i] = 0;
+ }
+
+ return ph;
+ };
+
+ FFTM.prototype.mulp = function mulp (x, y, out) {
+ var N = 2 * this.guessLen13b(x.length, y.length);
+
+ var rbt = this.makeRBT(N);
+
+ var _ = this.stub(N);
+
+ var rws = new Array(N);
+ var rwst = new Array(N);
+ var iwst = new Array(N);
+
+ var nrws = new Array(N);
+ var nrwst = new Array(N);
+ var niwst = new Array(N);
+
+ var rmws = out.words;
+ rmws.length = N;
+
+ this.convert13b(x.words, x.length, rws, N);
+ this.convert13b(y.words, y.length, nrws, N);
+
+ this.transform(rws, _, rwst, iwst, N, rbt);
+ this.transform(nrws, _, nrwst, niwst, N, rbt);
+
+ for (var i = 0; i < N; i++) {
+ var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
+ iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
+ rwst[i] = rx;
+ }
+
+ this.conjugate(rwst, iwst, N);
+ this.transform(rwst, iwst, rmws, _, N, rbt);
+ this.conjugate(rmws, _, N);
+ this.normalize13b(rmws, N);
+
+ out.negative = x.negative ^ y.negative;
+ out.length = x.length + y.length;
+ return out._strip();
+ };
+
+ // Multiply `this` by `num`
+ BN.prototype.mul = function mul (num) {
+ var out = new BN(null);
+ out.words = new Array(this.length + num.length);
+ return this.mulTo(num, out);
+ };
+
+ // Multiply employing FFT
+ BN.prototype.mulf = function mulf (num) {
+ var out = new BN(null);
+ out.words = new Array(this.length + num.length);
+ return jumboMulTo(this, num, out);
+ };
+
+ // In-place Multiplication
+ BN.prototype.imul = function imul (num) {
+ return this.clone().mulTo(num, this);
+ };
+
+ BN.prototype.imuln = function imuln (num) {
+ var isNegNum = num < 0;
+ if (isNegNum) num = -num;
+
+ assert(typeof num === 'number');
+ assert(num < 0x4000000);
+
+ // Carry
+ var carry = 0;
+ for (var i = 0; i < this.length; i++) {
+ var w = (this.words[i] | 0) * num;
+ var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);
+ carry >>= 26;
+ carry += (w / 0x4000000) | 0;
+ // NOTE: lo is 27bit maximum
+ carry += lo >>> 26;
+ this.words[i] = lo & 0x3ffffff;
+ }
+
+ if (carry !== 0) {
+ this.words[i] = carry;
+ this.length++;
+ }
+
+ return isNegNum ? this.ineg() : this;
+ };
+
+ BN.prototype.muln = function muln (num) {
+ return this.clone().imuln(num);
+ };
+
+ // `this` * `this`
+ BN.prototype.sqr = function sqr () {
+ return this.mul(this);
+ };
+
+ // `this` * `this` in-place
+ BN.prototype.isqr = function isqr () {
+ return this.imul(this.clone());
+ };
+
+ // Math.pow(`this`, `num`)
+ BN.prototype.pow = function pow (num) {
+ var w = toBitArray(num);
+ if (w.length === 0) return new BN(1);
+
+ // Skip leading zeroes
+ var res = this;
+ for (var i = 0; i < w.length; i++, res = res.sqr()) {
+ if (w[i] !== 0) break;
+ }
+
+ if (++i < w.length) {
+ for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {
+ if (w[i] === 0) continue;
+
+ res = res.mul(q);
+ }
+ }
+
+ return res;
+ };
+
+ // Shift-left in-place
+ BN.prototype.iushln = function iushln (bits) {
+ assert(typeof bits === 'number' && bits >= 0);
+ var r = bits % 26;
+ var s = (bits - r) / 26;
+ var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);
+ var i;
+
+ if (r !== 0) {
+ var carry = 0;
+
+ for (i = 0; i < this.length; i++) {
+ var newCarry = this.words[i] & carryMask;
+ var c = ((this.words[i] | 0) - newCarry) << r;
+ this.words[i] = c | carry;
+ carry = newCarry >>> (26 - r);
+ }
+
+ if (carry) {
+ this.words[i] = carry;
+ this.length++;
+ }
+ }
+
+ if (s !== 0) {
+ for (i = this.length - 1; i >= 0; i--) {
+ this.words[i + s] = this.words[i];
+ }
+
+ for (i = 0; i < s; i++) {
+ this.words[i] = 0;
+ }
+
+ this.length += s;
+ }
+
+ return this._strip();
+ };
+
+ BN.prototype.ishln = function ishln (bits) {
+ // TODO(indutny): implement me
+ assert(this.negative === 0);
+ return this.iushln(bits);
+ };
+
+ // Shift-right in-place
+ // NOTE: `hint` is a lowest bit before trailing zeroes
+ // NOTE: if `extended` is present - it will be filled with destroyed bits
+ BN.prototype.iushrn = function iushrn (bits, hint, extended) {
+ assert(typeof bits === 'number' && bits >= 0);
+ var h;
+ if (hint) {
+ h = (hint - (hint % 26)) / 26;
+ } else {
+ h = 0;
+ }
+
+ var r = bits % 26;
+ var s = Math.min((bits - r) / 26, this.length);
+ var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
+ var maskedWords = extended;
+
+ h -= s;
+ h = Math.max(0, h);
+
+ // Extended mode, copy masked part
+ if (maskedWords) {
+ for (var i = 0; i < s; i++) {
+ maskedWords.words[i] = this.words[i];
+ }
+ maskedWords.length = s;
+ }
+
+ if (s === 0) {
+ // No-op, we should not move anything at all
+ } else if (this.length > s) {
+ this.length -= s;
+ for (i = 0; i < this.length; i++) {
+ this.words[i] = this.words[i + s];
+ }
+ } else {
+ this.words[0] = 0;
+ this.length = 1;
+ }
+
+ var carry = 0;
+ for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
+ var word = this.words[i] | 0;
+ this.words[i] = (carry << (26 - r)) | (word >>> r);
+ carry = word & mask;
+ }
+
+ // Push carried bits as a mask
+ if (maskedWords && carry !== 0) {
+ maskedWords.words[maskedWords.length++] = carry;
+ }
+
+ if (this.length === 0) {
+ this.words[0] = 0;
+ this.length = 1;
+ }
+
+ return this._strip();
+ };
+
+ BN.prototype.ishrn = function ishrn (bits, hint, extended) {
+ // TODO(indutny): implement me
+ assert(this.negative === 0);
+ return this.iushrn(bits, hint, extended);
+ };
+
+ // Shift-left
+ BN.prototype.shln = function shln (bits) {
+ return this.clone().ishln(bits);
+ };
+
+ BN.prototype.ushln = function ushln (bits) {
+ return this.clone().iushln(bits);
+ };
+
+ // Shift-right
+ BN.prototype.shrn = function shrn (bits) {
+ return this.clone().ishrn(bits);
+ };
+
+ BN.prototype.ushrn = function ushrn (bits) {
+ return this.clone().iushrn(bits);
+ };
+
+ // Test if n bit is set
+ BN.prototype.testn = function testn (bit) {
+ assert(typeof bit === 'number' && bit >= 0);
+ var r = bit % 26;
+ var s = (bit - r) / 26;
+ var q = 1 << r;
+
+ // Fast case: bit is much higher than all existing words
+ if (this.length <= s) return false;
+
+ // Check bit and return
+ var w = this.words[s];
+
+ return !!(w & q);
+ };
+
+ // Return only lowers bits of number (in-place)
+ BN.prototype.imaskn = function imaskn (bits) {
+ assert(typeof bits === 'number' && bits >= 0);
+ var r = bits % 26;
+ var s = (bits - r) / 26;
+
+ assert(this.negative === 0, 'imaskn works only with positive numbers');
+
+ if (this.length <= s) {
+ return this;
+ }
+
+ if (r !== 0) {
+ s++;
+ }
+ this.length = Math.min(s, this.length);
+
+ if (r !== 0) {
+ var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
+ this.words[this.length - 1] &= mask;
+ }
+
+ return this._strip();
+ };
+
+ // Return only lowers bits of number
+ BN.prototype.maskn = function maskn (bits) {
+ return this.clone().imaskn(bits);
+ };
+
+ // Add plain number `num` to `this`
+ BN.prototype.iaddn = function iaddn (num) {
+ assert(typeof num === 'number');
+ assert(num < 0x4000000);
+ if (num < 0) return this.isubn(-num);
+
+ // Possible sign change
+ if (this.negative !== 0) {
+ if (this.length === 1 && (this.words[0] | 0) <= num) {
+ this.words[0] = num - (this.words[0] | 0);
+ this.negative = 0;
+ return this;
+ }
+
+ this.negative = 0;
+ this.isubn(num);
+ this.negative = 1;
+ return this;
+ }
+
+ // Add without checks
+ return this._iaddn(num);
+ };
+
+ BN.prototype._iaddn = function _iaddn (num) {
+ this.words[0] += num;
+
+ // Carry
+ for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {
+ this.words[i] -= 0x4000000;
+ if (i === this.length - 1) {
+ this.words[i + 1] = 1;
+ } else {
+ this.words[i + 1]++;
+ }
+ }
+ this.length = Math.max(this.length, i + 1);
+
+ return this;
+ };
+
+ // Subtract plain number `num` from `this`
+ BN.prototype.isubn = function isubn (num) {
+ assert(typeof num === 'number');
+ assert(num < 0x4000000);
+ if (num < 0) return this.iaddn(-num);
+
+ if (this.negative !== 0) {
+ this.negative = 0;
+ this.iaddn(num);
+ this.negative = 1;
+ return this;
+ }
+
+ this.words[0] -= num;
+
+ if (this.length === 1 && this.words[0] < 0) {
+ this.words[0] = -this.words[0];
+ this.negative = 1;
+ } else {
+ // Carry
+ for (var i = 0; i < this.length && this.words[i] < 0; i++) {
+ this.words[i] += 0x4000000;
+ this.words[i + 1] -= 1;
+ }
+ }
+
+ return this._strip();
+ };
+
+ BN.prototype.addn = function addn (num) {
+ return this.clone().iaddn(num);
+ };
+
+ BN.prototype.subn = function subn (num) {
+ return this.clone().isubn(num);
+ };
+
+ BN.prototype.iabs = function iabs () {
+ this.negative = 0;
+
+ return this;
+ };
+
+ BN.prototype.abs = function abs () {
+ return this.clone().iabs();
+ };
+
+ BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {
+ var len = num.length + shift;
+ var i;
+
+ this._expand(len);
+
+ var w;
+ var carry = 0;
+ for (i = 0; i < num.length; i++) {
+ w = (this.words[i + shift] | 0) + carry;
+ var right = (num.words[i] | 0) * mul;
+ w -= right & 0x3ffffff;
+ carry = (w >> 26) - ((right / 0x4000000) | 0);
+ this.words[i + shift] = w & 0x3ffffff;
+ }
+ for (; i < this.length - shift; i++) {
+ w = (this.words[i + shift] | 0) + carry;
+ carry = w >> 26;
+ this.words[i + shift] = w & 0x3ffffff;
+ }
+
+ if (carry === 0) return this._strip();
+
+ // Subtraction overflow
+ assert(carry === -1);
+ carry = 0;
+ for (i = 0; i < this.length; i++) {
+ w = -(this.words[i] | 0) + carry;
+ carry = w >> 26;
+ this.words[i] = w & 0x3ffffff;
+ }
+ this.negative = 1;
+
+ return this._strip();
+ };
+
+ BN.prototype._wordDiv = function _wordDiv (num, mode) {
+ var shift = this.length - num.length;
+
+ var a = this.clone();
+ var b = num;
+
+ // Normalize
+ var bhi = b.words[b.length - 1] | 0;
+ var bhiBits = this._countBits(bhi);
+ shift = 26 - bhiBits;
+ if (shift !== 0) {
+ b = b.ushln(shift);
+ a.iushln(shift);
+ bhi = b.words[b.length - 1] | 0;
+ }
+
+ // Initialize quotient
+ var m = a.length - b.length;
+ var q;
+
+ if (mode !== 'mod') {
+ q = new BN(null);
+ q.length = m + 1;
+ q.words = new Array(q.length);
+ for (var i = 0; i < q.length; i++) {
+ q.words[i] = 0;
+ }
+ }
+
+ var diff = a.clone()._ishlnsubmul(b, 1, m);
+ if (diff.negative === 0) {
+ a = diff;
+ if (q) {
+ q.words[m] = 1;
+ }
+ }
+
+ for (var j = m - 1; j >= 0; j--) {
+ var qj = (a.words[b.length + j] | 0) * 0x4000000 +
+ (a.words[b.length + j - 1] | 0);
+
+ // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max
+ // (0x7ffffff)
+ qj = Math.min((qj / bhi) | 0, 0x3ffffff);
+
+ a._ishlnsubmul(b, qj, j);
+ while (a.negative !== 0) {
+ qj--;
+ a.negative = 0;
+ a._ishlnsubmul(b, 1, j);
+ if (!a.isZero()) {
+ a.negative ^= 1;
+ }
+ }
+ if (q) {
+ q.words[j] = qj;
+ }
+ }
+ if (q) {
+ q._strip();
+ }
+ a._strip();
+
+ // Denormalize
+ if (mode !== 'div' && shift !== 0) {
+ a.iushrn(shift);
+ }
+
+ return {
+ div: q || null,
+ mod: a
+ };
+ };
+
+ // NOTE: 1) `mode` can be set to `mod` to request mod only,
+ // to `div` to request div only, or be absent to
+ // request both div & mod
+ // 2) `positive` is true if unsigned mod is requested
+ BN.prototype.divmod = function divmod (num, mode, positive) {
+ assert(!num.isZero());
+
+ if (this.isZero()) {
+ return {
+ div: new BN(0),
+ mod: new BN(0)
+ };
+ }
+
+ var div, mod, res;
+ if (this.negative !== 0 && num.negative === 0) {
+ res = this.neg().divmod(num, mode);
+
+ if (mode !== 'mod') {
+ div = res.div.neg();
+ }
+
+ if (mode !== 'div') {
+ mod = res.mod.neg();
+ if (positive && mod.negative !== 0) {
+ mod.iadd(num);
+ }
+ }
+
+ return {
+ div: div,
+ mod: mod
+ };
+ }
+
+ if (this.negative === 0 && num.negative !== 0) {
+ res = this.divmod(num.neg(), mode);
+
+ if (mode !== 'mod') {
+ div = res.div.neg();
+ }
+
+ return {
+ div: div,
+ mod: res.mod
+ };
+ }
+
+ if ((this.negative & num.negative) !== 0) {
+ res = this.neg().divmod(num.neg(), mode);
+
+ if (mode !== 'div') {
+ mod = res.mod.neg();
+ if (positive && mod.negative !== 0) {
+ mod.isub(num);
+ }
+ }
+
+ return {
+ div: res.div,
+ mod: mod
+ };
+ }
+
+ // Both numbers are positive at this point
+
+ // Strip both numbers to approximate shift value
+ if (num.length > this.length || this.cmp(num) < 0) {
+ return {
+ div: new BN(0),
+ mod: this
+ };
+ }
+
+ // Very short reduction
+ if (num.length === 1) {
+ if (mode === 'div') {
+ return {
+ div: this.divn(num.words[0]),
+ mod: null
+ };
+ }
+
+ if (mode === 'mod') {
+ return {
+ div: null,
+ mod: new BN(this.modrn(num.words[0]))
+ };
+ }
+
+ return {
+ div: this.divn(num.words[0]),
+ mod: new BN(this.modrn(num.words[0]))
+ };
+ }
+
+ return this._wordDiv(num, mode);
+ };
+
+ // Find `this` / `num`
+ BN.prototype.div = function div (num) {
+ return this.divmod(num, 'div', false).div;
+ };
+
+ // Find `this` % `num`
+ BN.prototype.mod = function mod (num) {
+ return this.divmod(num, 'mod', false).mod;
+ };
+
+ BN.prototype.umod = function umod (num) {
+ return this.divmod(num, 'mod', true).mod;
+ };
+
+ // Find Round(`this` / `num`)
+ BN.prototype.divRound = function divRound (num) {
+ var dm = this.divmod(num);
+
+ // Fast case - exact division
+ if (dm.mod.isZero()) return dm.div;
+
+ var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
+
+ var half = num.ushrn(1);
+ var r2 = num.andln(1);
+ var cmp = mod.cmp(half);
+
+ // Round down
+ if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;
+
+ // Round up
+ return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
+ };
+
+ BN.prototype.modrn = function modrn (num) {
+ var isNegNum = num < 0;
+ if (isNegNum) num = -num;
+
+ assert(num <= 0x3ffffff);
+ var p = (1 << 26) % num;
+
+ var acc = 0;
+ for (var i = this.length - 1; i >= 0; i--) {
+ acc = (p * acc + (this.words[i] | 0)) % num;
+ }
+
+ return isNegNum ? -acc : acc;
+ };
+
+ // WARNING: DEPRECATED
+ BN.prototype.modn = function modn (num) {
+ return this.modrn(num);
+ };
+
+ // In-place division by number
+ BN.prototype.idivn = function idivn (num) {
+ var isNegNum = num < 0;
+ if (isNegNum) num = -num;
+
+ assert(num <= 0x3ffffff);
+
+ var carry = 0;
+ for (var i = this.length - 1; i >= 0; i--) {
+ var w = (this.words[i] | 0) + carry * 0x4000000;
+ this.words[i] = (w / num) | 0;
+ carry = w % num;
+ }
+
+ this._strip();
+ return isNegNum ? this.ineg() : this;
+ };
+
+ BN.prototype.divn = function divn (num) {
+ return this.clone().idivn(num);
+ };
+
+ BN.prototype.egcd = function egcd (p) {
+ assert(p.negative === 0);
+ assert(!p.isZero());
+
+ var x = this;
+ var y = p.clone();
+
+ if (x.negative !== 0) {
+ x = x.umod(p);
+ } else {
+ x = x.clone();
+ }
+
+ // A * x + B * y = x
+ var A = new BN(1);
+ var B = new BN(0);
+
+ // C * x + D * y = y
+ var C = new BN(0);
+ var D = new BN(1);
+
+ var g = 0;
+
+ while (x.isEven() && y.isEven()) {
+ x.iushrn(1);
+ y.iushrn(1);
+ ++g;
+ }
+
+ var yp = y.clone();
+ var xp = x.clone();
+
+ while (!x.isZero()) {
+ for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
+ if (i > 0) {
+ x.iushrn(i);
+ while (i-- > 0) {
+ if (A.isOdd() || B.isOdd()) {
+ A.iadd(yp);
+ B.isub(xp);
+ }
+
+ A.iushrn(1);
+ B.iushrn(1);
+ }
+ }
+
+ for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
+ if (j > 0) {
+ y.iushrn(j);
+ while (j-- > 0) {
+ if (C.isOdd() || D.isOdd()) {
+ C.iadd(yp);
+ D.isub(xp);
+ }
+
+ C.iushrn(1);
+ D.iushrn(1);
+ }
+ }
+
+ if (x.cmp(y) >= 0) {
+ x.isub(y);
+ A.isub(C);
+ B.isub(D);
+ } else {
+ y.isub(x);
+ C.isub(A);
+ D.isub(B);
+ }
+ }
+
+ return {
+ a: C,
+ b: D,
+ gcd: y.iushln(g)
+ };
+ };
+
+ // This is reduced incarnation of the binary EEA
+ // above, designated to invert members of the
+ // _prime_ fields F(p) at a maximal speed
+ BN.prototype._invmp = function _invmp (p) {
+ assert(p.negative === 0);
+ assert(!p.isZero());
+
+ var a = this;
+ var b = p.clone();
+
+ if (a.negative !== 0) {
+ a = a.umod(p);
+ } else {
+ a = a.clone();
+ }
+
+ var x1 = new BN(1);
+ var x2 = new BN(0);
+
+ var delta = b.clone();
+
+ while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
+ for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
+ if (i > 0) {
+ a.iushrn(i);
+ while (i-- > 0) {
+ if (x1.isOdd()) {
+ x1.iadd(delta);
+ }
+
+ x1.iushrn(1);
+ }
+ }
+
+ for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
+ if (j > 0) {
+ b.iushrn(j);
+ while (j-- > 0) {
+ if (x2.isOdd()) {
+ x2.iadd(delta);
+ }
+
+ x2.iushrn(1);
+ }
+ }
+
+ if (a.cmp(b) >= 0) {
+ a.isub(b);
+ x1.isub(x2);
+ } else {
+ b.isub(a);
+ x2.isub(x1);
+ }
+ }
+
+ var res;
+ if (a.cmpn(1) === 0) {
+ res = x1;
+ } else {
+ res = x2;
+ }
+
+ if (res.cmpn(0) < 0) {
+ res.iadd(p);
+ }
+
+ return res;
+ };
+
+ BN.prototype.gcd = function gcd (num) {
+ if (this.isZero()) return num.abs();
+ if (num.isZero()) return this.abs();
+
+ var a = this.clone();
+ var b = num.clone();
+ a.negative = 0;
+ b.negative = 0;
+
+ // Remove common factor of two
+ for (var shift = 0; a.isEven() && b.isEven(); shift++) {
+ a.iushrn(1);
+ b.iushrn(1);
+ }
+
+ do {
+ while (a.isEven()) {
+ a.iushrn(1);
+ }
+ while (b.isEven()) {
+ b.iushrn(1);
+ }
+
+ var r = a.cmp(b);
+ if (r < 0) {
+ // Swap `a` and `b` to make `a` always bigger than `b`
+ var t = a;
+ a = b;
+ b = t;
+ } else if (r === 0 || b.cmpn(1) === 0) {
+ break;
+ }
+
+ a.isub(b);
+ } while (true);
+
+ return b.iushln(shift);
+ };
+
+ // Invert number in the field F(num)
+ BN.prototype.invm = function invm (num) {
+ return this.egcd(num).a.umod(num);
+ };
+
+ BN.prototype.isEven = function isEven () {
+ return (this.words[0] & 1) === 0;
+ };
+
+ BN.prototype.isOdd = function isOdd () {
+ return (this.words[0] & 1) === 1;
+ };
+
+ // And first word and num
+ BN.prototype.andln = function andln (num) {
+ return this.words[0] & num;
+ };
+
+ // Increment at the bit position in-line
+ BN.prototype.bincn = function bincn (bit) {
+ assert(typeof bit === 'number');
+ var r = bit % 26;
+ var s = (bit - r) / 26;
+ var q = 1 << r;
+
+ // Fast case: bit is much higher than all existing words
+ if (this.length <= s) {
+ this._expand(s + 1);
+ this.words[s] |= q;
+ return this;
+ }
+
+ // Add bit and propagate, if needed
+ var carry = q;
+ for (var i = s; carry !== 0 && i < this.length; i++) {
+ var w = this.words[i] | 0;
+ w += carry;
+ carry = w >>> 26;
+ w &= 0x3ffffff;
+ this.words[i] = w;
+ }
+ if (carry !== 0) {
+ this.words[i] = carry;
+ this.length++;
+ }
+ return this;
+ };
+
+ BN.prototype.isZero = function isZero () {
+ return this.length === 1 && this.words[0] === 0;
+ };
+
+ BN.prototype.cmpn = function cmpn (num) {
+ var negative = num < 0;
+
+ if (this.negative !== 0 && !negative) return -1;
+ if (this.negative === 0 && negative) return 1;
+
+ this._strip();
+
+ var res;
+ if (this.length > 1) {
+ res = 1;
+ } else {
+ if (negative) {
+ num = -num;
+ }
+
+ assert(num <= 0x3ffffff, 'Number is too big');
+
+ var w = this.words[0] | 0;
+ res = w === num ? 0 : w < num ? -1 : 1;
+ }
+ if (this.negative !== 0) return -res | 0;
+ return res;
+ };
+
+ // Compare two numbers and return:
+ // 1 - if `this` > `num`
+ // 0 - if `this` == `num`
+ // -1 - if `this` < `num`
+ BN.prototype.cmp = function cmp (num) {
+ if (this.negative !== 0 && num.negative === 0) return -1;
+ if (this.negative === 0 && num.negative !== 0) return 1;
+
+ var res = this.ucmp(num);
+ if (this.negative !== 0) return -res | 0;
+ return res;
+ };
+
+ // Unsigned comparison
+ BN.prototype.ucmp = function ucmp (num) {
+ // At this point both numbers have the same sign
+ if (this.length > num.length) return 1;
+ if (this.length < num.length) return -1;
+
+ var res = 0;
+ for (var i = this.length - 1; i >= 0; i--) {
+ var a = this.words[i] | 0;
+ var b = num.words[i] | 0;
+
+ if (a === b) continue;
+ if (a < b) {
+ res = -1;
+ } else if (a > b) {
+ res = 1;
+ }
+ break;
+ }
+ return res;
+ };
+
+ BN.prototype.gtn = function gtn (num) {
+ return this.cmpn(num) === 1;
+ };
+
+ BN.prototype.gt = function gt (num) {
+ return this.cmp(num) === 1;
+ };
+
+ BN.prototype.gten = function gten (num) {
+ return this.cmpn(num) >= 0;
+ };
+
+ BN.prototype.gte = function gte (num) {
+ return this.cmp(num) >= 0;
+ };
+
+ BN.prototype.ltn = function ltn (num) {
+ return this.cmpn(num) === -1;
+ };
+
+ BN.prototype.lt = function lt (num) {
+ return this.cmp(num) === -1;
+ };
+
+ BN.prototype.lten = function lten (num) {
+ return this.cmpn(num) <= 0;
+ };
+
+ BN.prototype.lte = function lte (num) {
+ return this.cmp(num) <= 0;
+ };
+
+ BN.prototype.eqn = function eqn (num) {
+ return this.cmpn(num) === 0;
+ };
+
+ BN.prototype.eq = function eq (num) {
+ return this.cmp(num) === 0;
+ };
+
+ //
+ // A reduce context, could be using montgomery or something better, depending
+ // on the `m` itself.
+ //
+ BN.red = function red (num) {
+ return new Red(num);
+ };
+
+ BN.prototype.toRed = function toRed (ctx) {
+ assert(!this.red, 'Already a number in reduction context');
+ assert(this.negative === 0, 'red works only with positives');
+ return ctx.convertTo(this)._forceRed(ctx);
+ };
+
+ BN.prototype.fromRed = function fromRed () {
+ assert(this.red, 'fromRed works only with numbers in reduction context');
+ return this.red.convertFrom(this);
+ };
+
+ BN.prototype._forceRed = function _forceRed (ctx) {
+ this.red = ctx;
+ return this;
+ };
+
+ BN.prototype.forceRed = function forceRed (ctx) {
+ assert(!this.red, 'Already a number in reduction context');
+ return this._forceRed(ctx);
+ };
+
+ BN.prototype.redAdd = function redAdd (num) {
+ assert(this.red, 'redAdd works only with red numbers');
+ return this.red.add(this, num);
+ };
+
+ BN.prototype.redIAdd = function redIAdd (num) {
+ assert(this.red, 'redIAdd works only with red numbers');
+ return this.red.iadd(this, num);
+ };
+
+ BN.prototype.redSub = function redSub (num) {
+ assert(this.red, 'redSub works only with red numbers');
+ return this.red.sub(this, num);
+ };
+
+ BN.prototype.redISub = function redISub (num) {
+ assert(this.red, 'redISub works only with red numbers');
+ return this.red.isub(this, num);
+ };
+
+ BN.prototype.redShl = function redShl (num) {
+ assert(this.red, 'redShl works only with red numbers');
+ return this.red.shl(this, num);
+ };
+
+ BN.prototype.redMul = function redMul (num) {
+ assert(this.red, 'redMul works only with red numbers');
+ this.red._verify2(this, num);
+ return this.red.mul(this, num);
+ };
+
+ BN.prototype.redIMul = function redIMul (num) {
+ assert(this.red, 'redMul works only with red numbers');
+ this.red._verify2(this, num);
+ return this.red.imul(this, num);
+ };
+
+ BN.prototype.redSqr = function redSqr () {
+ assert(this.red, 'redSqr works only with red numbers');
+ this.red._verify1(this);
+ return this.red.sqr(this);
+ };
+
+ BN.prototype.redISqr = function redISqr () {
+ assert(this.red, 'redISqr works only with red numbers');
+ this.red._verify1(this);
+ return this.red.isqr(this);
+ };
+
+ // Square root over p
+ BN.prototype.redSqrt = function redSqrt () {
+ assert(this.red, 'redSqrt works only with red numbers');
+ this.red._verify1(this);
+ return this.red.sqrt(this);
+ };
+
+ BN.prototype.redInvm = function redInvm () {
+ assert(this.red, 'redInvm works only with red numbers');
+ this.red._verify1(this);
+ return this.red.invm(this);
+ };
+
+ // Return negative clone of `this` % `red modulo`
+ BN.prototype.redNeg = function redNeg () {
+ assert(this.red, 'redNeg works only with red numbers');
+ this.red._verify1(this);
+ return this.red.neg(this);
+ };
+
+ BN.prototype.redPow = function redPow (num) {
+ assert(this.red && !num.red, 'redPow(normalNum)');
+ this.red._verify1(this);
+ return this.red.pow(this, num);
+ };
+
+ // Prime numbers with efficient reduction
+ var primes = {
+ k256: null,
+ p224: null,
+ p192: null,
+ p25519: null
+ };
+
+ // Pseudo-Mersenne prime
+ function MPrime (name, p) {
+ // P = 2 ^ N - K
+ this.name = name;
+ this.p = new BN(p, 16);
+ this.n = this.p.bitLength();
+ this.k = new BN(1).iushln(this.n).isub(this.p);
+
+ this.tmp = this._tmp();
+ }
+
+ MPrime.prototype._tmp = function _tmp () {
+ var tmp = new BN(null);
+ tmp.words = new Array(Math.ceil(this.n / 13));
+ return tmp;
+ };
+
+ MPrime.prototype.ireduce = function ireduce (num) {
+ // Assumes that `num` is less than `P^2`
+ // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)
+ var r = num;
+ var rlen;
+
+ do {
+ this.split(r, this.tmp);
+ r = this.imulK(r);
+ r = r.iadd(this.tmp);
+ rlen = r.bitLength();
+ } while (rlen > this.n);
+
+ var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
+ if (cmp === 0) {
+ r.words[0] = 0;
+ r.length = 1;
+ } else if (cmp > 0) {
+ r.isub(this.p);
+ } else {
+ if (r.strip !== undefined) {
+ // r is a BN v4 instance
+ r.strip();
+ } else {
+ // r is a BN v5 instance
+ r._strip();
+ }
+ }
+
+ return r;
+ };
+
+ MPrime.prototype.split = function split (input, out) {
+ input.iushrn(this.n, 0, out);
+ };
+
+ MPrime.prototype.imulK = function imulK (num) {
+ return num.imul(this.k);
+ };
+
+ function K256 () {
+ MPrime.call(
+ this,
+ 'k256',
+ 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');
+ }
+ inherits(K256, MPrime);
+
+ K256.prototype.split = function split (input, output) {
+ // 256 = 9 * 26 + 22
+ var mask = 0x3fffff;
+
+ var outLen = Math.min(input.length, 9);
+ for (var i = 0; i < outLen; i++) {
+ output.words[i] = input.words[i];
+ }
+ output.length = outLen;
+
+ if (input.length <= 9) {
+ input.words[0] = 0;
+ input.length = 1;
+ return;
+ }
+
+ // Shift by 9 limbs
+ var prev = input.words[9];
+ output.words[output.length++] = prev & mask;
+
+ for (i = 10; i < input.length; i++) {
+ var next = input.words[i] | 0;
+ input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);
+ prev = next;
+ }
+ prev >>>= 22;
+ input.words[i - 10] = prev;
+ if (prev === 0 && input.length > 10) {
+ input.length -= 10;
+ } else {
+ input.length -= 9;
+ }
+ };
+
+ K256.prototype.imulK = function imulK (num) {
+ // K = 0x1000003d1 = [ 0x40, 0x3d1 ]
+ num.words[num.length] = 0;
+ num.words[num.length + 1] = 0;
+ num.length += 2;
+
+ // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390
+ var lo = 0;
+ for (var i = 0; i < num.length; i++) {
+ var w = num.words[i] | 0;
+ lo += w * 0x3d1;
+ num.words[i] = lo & 0x3ffffff;
+ lo = w * 0x40 + ((lo / 0x4000000) | 0);
+ }
+
+ // Fast length reduction
+ if (num.words[num.length - 1] === 0) {
+ num.length--;
+ if (num.words[num.length - 1] === 0) {
+ num.length--;
+ }
+ }
+ return num;
+ };
+
+ function P224 () {
+ MPrime.call(
+ this,
+ 'p224',
+ 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');
+ }
+ inherits(P224, MPrime);
+
+ function P192 () {
+ MPrime.call(
+ this,
+ 'p192',
+ 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');
+ }
+ inherits(P192, MPrime);
+
+ function P25519 () {
+ // 2 ^ 255 - 19
+ MPrime.call(
+ this,
+ '25519',
+ '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');
+ }
+ inherits(P25519, MPrime);
+
+ P25519.prototype.imulK = function imulK (num) {
+ // K = 0x13
+ var carry = 0;
+ for (var i = 0; i < num.length; i++) {
+ var hi = (num.words[i] | 0) * 0x13 + carry;
+ var lo = hi & 0x3ffffff;
+ hi >>>= 26;
+
+ num.words[i] = lo;
+ carry = hi;
+ }
+ if (carry !== 0) {
+ num.words[num.length++] = carry;
+ }
+ return num;
+ };
+
+ // Exported mostly for testing purposes, use plain name instead
+ BN._prime = function prime (name) {
+ // Cached version of prime
+ if (primes[name]) return primes[name];
+
+ var prime;
+ if (name === 'k256') {
+ prime = new K256();
+ } else if (name === 'p224') {
+ prime = new P224();
+ } else if (name === 'p192') {
+ prime = new P192();
+ } else if (name === 'p25519') {
+ prime = new P25519();
+ } else {
+ throw new Error('Unknown prime ' + name);
+ }
+ primes[name] = prime;
+
+ return prime;
+ };
+
+ //
+ // Base reduction engine
+ //
+ function Red (m) {
+ if (typeof m === 'string') {
+ var prime = BN._prime(m);
+ this.m = prime.p;
+ this.prime = prime;
+ } else {
+ assert(m.gtn(1), 'modulus must be greater than 1');
+ this.m = m;
+ this.prime = null;
+ }
+ }
+
+ Red.prototype._verify1 = function _verify1 (a) {
+ assert(a.negative === 0, 'red works only with positives');
+ assert(a.red, 'red works only with red numbers');
+ };
+
+ Red.prototype._verify2 = function _verify2 (a, b) {
+ assert((a.negative | b.negative) === 0, 'red works only with positives');
+ assert(a.red && a.red === b.red,
+ 'red works only with red numbers');
+ };
+
+ Red.prototype.imod = function imod (a) {
+ if (this.prime) return this.prime.ireduce(a)._forceRed(this);
+
+ move(a, a.umod(this.m)._forceRed(this));
+ return a;
+ };
+
+ Red.prototype.neg = function neg (a) {
+ if (a.isZero()) {
+ return a.clone();
+ }
+
+ return this.m.sub(a)._forceRed(this);
+ };
+
+ Red.prototype.add = function add (a, b) {
+ this._verify2(a, b);
+
+ var res = a.add(b);
+ if (res.cmp(this.m) >= 0) {
+ res.isub(this.m);
+ }
+ return res._forceRed(this);
+ };
+
+ Red.prototype.iadd = function iadd (a, b) {
+ this._verify2(a, b);
+
+ var res = a.iadd(b);
+ if (res.cmp(this.m) >= 0) {
+ res.isub(this.m);
+ }
+ return res;
+ };
+
+ Red.prototype.sub = function sub (a, b) {
+ this._verify2(a, b);
+
+ var res = a.sub(b);
+ if (res.cmpn(0) < 0) {
+ res.iadd(this.m);
+ }
+ return res._forceRed(this);
+ };
+
+ Red.prototype.isub = function isub (a, b) {
+ this._verify2(a, b);
+
+ var res = a.isub(b);
+ if (res.cmpn(0) < 0) {
+ res.iadd(this.m);
+ }
+ return res;
+ };
+
+ Red.prototype.shl = function shl (a, num) {
+ this._verify1(a);
+ return this.imod(a.ushln(num));
+ };
+
+ Red.prototype.imul = function imul (a, b) {
+ this._verify2(a, b);
+ return this.imod(a.imul(b));
+ };
+
+ Red.prototype.mul = function mul (a, b) {
+ this._verify2(a, b);
+ return this.imod(a.mul(b));
+ };
+
+ Red.prototype.isqr = function isqr (a) {
+ return this.imul(a, a.clone());
+ };
+
+ Red.prototype.sqr = function sqr (a) {
+ return this.mul(a, a);
+ };
+
+ Red.prototype.sqrt = function sqrt (a) {
+ if (a.isZero()) return a.clone();
+
+ var mod3 = this.m.andln(3);
+ assert(mod3 % 2 === 1);
+
+ // Fast case
+ if (mod3 === 3) {
+ var pow = this.m.add(new BN(1)).iushrn(2);
+ return this.pow(a, pow);
+ }
+
+ // Tonelli-Shanks algorithm (Totally unoptimized and slow)
+ //
+ // Find Q and S, that Q * 2 ^ S = (P - 1)
+ var q = this.m.subn(1);
+ var s = 0;
+ while (!q.isZero() && q.andln(1) === 0) {
+ s++;
+ q.iushrn(1);
+ }
+ assert(!q.isZero());
+
+ var one = new BN(1).toRed(this);
+ var nOne = one.redNeg();
+
+ // Find quadratic non-residue
+ // NOTE: Max is such because of generalized Riemann hypothesis.
+ var lpow = this.m.subn(1).iushrn(1);
+ var z = this.m.bitLength();
+ z = new BN(2 * z * z).toRed(this);
+
+ while (this.pow(z, lpow).cmp(nOne) !== 0) {
+ z.redIAdd(nOne);
+ }
+
+ var c = this.pow(z, q);
+ var r = this.pow(a, q.addn(1).iushrn(1));
+ var t = this.pow(a, q);
+ var m = s;
+ while (t.cmp(one) !== 0) {
+ var tmp = t;
+ for (var i = 0; tmp.cmp(one) !== 0; i++) {
+ tmp = tmp.redSqr();
+ }
+ assert(i < m);
+ var b = this.pow(c, new BN(1).iushln(m - i - 1));
+
+ r = r.redMul(b);
+ c = b.redSqr();
+ t = t.redMul(c);
+ m = i;
+ }
+
+ return r;
+ };
+
+ Red.prototype.invm = function invm (a) {
+ var inv = a._invmp(this.m);
+ if (inv.negative !== 0) {
+ inv.negative = 0;
+ return this.imod(inv).redNeg();
+ } else {
+ return this.imod(inv);
+ }
+ };
+
+ Red.prototype.pow = function pow (a, num) {
+ if (num.isZero()) return new BN(1).toRed(this);
+ if (num.cmpn(1) === 0) return a.clone();
+
+ var windowSize = 4;
+ var wnd = new Array(1 << windowSize);
+ wnd[0] = new BN(1).toRed(this);
+ wnd[1] = a;
+ for (var i = 2; i < wnd.length; i++) {
+ wnd[i] = this.mul(wnd[i - 1], a);
+ }
+
+ var res = wnd[0];
+ var current = 0;
+ var currentLen = 0;
+ var start = num.bitLength() % 26;
+ if (start === 0) {
+ start = 26;
+ }
+
+ for (i = num.length - 1; i >= 0; i--) {
+ var word = num.words[i];
+ for (var j = start - 1; j >= 0; j--) {
+ var bit = (word >> j) & 1;
+ if (res !== wnd[0]) {
+ res = this.sqr(res);
+ }
+
+ if (bit === 0 && current === 0) {
+ currentLen = 0;
+ continue;
+ }
+
+ current <<= 1;
+ current |= bit;
+ currentLen++;
+ if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;
+
+ res = this.mul(res, wnd[current]);
+ currentLen = 0;
+ current = 0;
+ }
+ start = 26;
+ }
+
+ return res;
+ };
+
+ Red.prototype.convertTo = function convertTo (num) {
+ var r = num.umod(this.m);
+
+ return r === num ? r.clone() : r;
+ };
+
+ Red.prototype.convertFrom = function convertFrom (num) {
+ var res = num.clone();
+ res.red = null;
+ return res;
+ };
+
+ //
+ // Montgomery method engine
+ //
+
+ BN.mont = function mont (num) {
+ return new Mont(num);
+ };
+
+ function Mont (m) {
+ Red.call(this, m);
+
+ this.shift = this.m.bitLength();
+ if (this.shift % 26 !== 0) {
+ this.shift += 26 - (this.shift % 26);
+ }
+
+ this.r = new BN(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);
+ }
+ inherits(Mont, Red);
+
+ Mont.prototype.convertTo = function convertTo (num) {
+ return this.imod(num.ushln(this.shift));
+ };
+
+ Mont.prototype.convertFrom = function convertFrom (num) {
+ var r = this.imod(num.mul(this.rinv));
+ r.red = null;
+ return r;
+ };
+
+ Mont.prototype.imul = function imul (a, b) {
+ if (a.isZero() || b.isZero()) {
+ a.words[0] = 0;
+ a.length = 1;
+ return a;
+ }
+
+ var t = a.imul(b);
+ var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
+ var u = t.isub(c).iushrn(this.shift);
+ var res = u;
+
+ if (u.cmp(this.m) >= 0) {
+ res = u.isub(this.m);
+ } else if (u.cmpn(0) < 0) {
+ res = u.iadd(this.m);
+ }
+
+ return res._forceRed(this);
+ };
+
+ Mont.prototype.mul = function mul (a, b) {
+ if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);
+
+ var t = a.mul(b);
+ var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
+ var u = t.isub(c).iushrn(this.shift);
+ var res = u;
+ if (u.cmp(this.m) >= 0) {
+ res = u.isub(this.m);
+ } else if (u.cmpn(0) < 0) {
+ res = u.iadd(this.m);
+ }
+
+ return res._forceRed(this);
+ };
+
+ Mont.prototype.invm = function invm (a) {
+ // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R
+ var res = this.imod(a._invmp(this.m).mul(this.r2));
+ return res._forceRed(this);
+ };
+})(typeof module === 'undefined' || module, this);
+
+},{"buffer":119}],119:[function(require,module,exports){
+
+},{}],120:[function(require,module,exports){
+(function (Buffer){(function (){
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh
+ * @license MIT
+ */
+/* eslint-disable no-proto */
+
+'use strict'
+
+var base64 = require('base64-js')
+var ieee754 = require('ieee754')
+
+exports.Buffer = Buffer
+exports.SlowBuffer = SlowBuffer
+exports.INSPECT_MAX_BYTES = 50
+
+var K_MAX_LENGTH = 0x7fffffff
+exports.kMaxLength = K_MAX_LENGTH
+
+/**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ * === true Use Uint8Array implementation (fastest)
+ * === false Print warning and recommend using `buffer` v4.x which has an Object
+ * implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * We report that the browser does not support typed arrays if the are not subclassable
+ * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
+ * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
+ * for __proto__ and has a buggy typed array implementation.
+ */
+Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
+
+if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
+ typeof console.error === 'function') {
+ console.error(
+ 'This browser lacks typed array (Uint8Array) support which is required by ' +
+ '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
+ )
+}
+
+function typedArraySupport () {
+ // Can typed array instances can be augmented?
+ try {
+ var arr = new Uint8Array(1)
+ arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }
+ return arr.foo() === 42
+ } catch (e) {
+ return false
+ }
+}
+
+Object.defineProperty(Buffer.prototype, 'parent', {
+ enumerable: true,
+ get: function () {
+ if (!Buffer.isBuffer(this)) return undefined
+ return this.buffer
+ }
+})
+
+Object.defineProperty(Buffer.prototype, 'offset', {
+ enumerable: true,
+ get: function () {
+ if (!Buffer.isBuffer(this)) return undefined
+ return this.byteOffset
+ }
+})
+
+function createBuffer (length) {
+ if (length > K_MAX_LENGTH) {
+ throw new RangeError('The value "' + length + '" is invalid for option "size"')
+ }
+ // Return an augmented `Uint8Array` instance
+ var buf = new Uint8Array(length)
+ buf.__proto__ = Buffer.prototype
+ return buf
+}
+
+/**
+ * The Buffer constructor returns instances of `Uint8Array` that have their
+ * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
+ * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
+ * and the `Uint8Array` methods. Square bracket notation works as expected -- it
+ * returns a single octet.
+ *
+ * The `Uint8Array` prototype remains unmodified.
+ */
+
+function Buffer (arg, encodingOrOffset, length) {
+ // Common case.
+ if (typeof arg === 'number') {
+ if (typeof encodingOrOffset === 'string') {
+ throw new TypeError(
+ 'The "string" argument must be of type string. Received type number'
+ )
+ }
+ return allocUnsafe(arg)
+ }
+ return from(arg, encodingOrOffset, length)
+}
+
+// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
+if (typeof Symbol !== 'undefined' && Symbol.species != null &&
+ Buffer[Symbol.species] === Buffer) {
+ Object.defineProperty(Buffer, Symbol.species, {
+ value: null,
+ configurable: true,
+ enumerable: false,
+ writable: false
+ })
+}
+
+Buffer.poolSize = 8192 // not used by this implementation
+
+function from (value, encodingOrOffset, length) {
+ if (typeof value === 'string') {
+ return fromString(value, encodingOrOffset)
+ }
+
+ if (ArrayBuffer.isView(value)) {
+ return fromArrayLike(value)
+ }
+
+ if (value == null) {
+ throw TypeError(
+ 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
+ 'or Array-like Object. Received type ' + (typeof value)
+ )
+ }
+
+ if (isInstance(value, ArrayBuffer) ||
+ (value && isInstance(value.buffer, ArrayBuffer))) {
+ return fromArrayBuffer(value, encodingOrOffset, length)
+ }
+
+ if (typeof value === 'number') {
+ throw new TypeError(
+ 'The "value" argument must not be of type number. Received type number'
+ )
+ }
+
+ var valueOf = value.valueOf && value.valueOf()
+ if (valueOf != null && valueOf !== value) {
+ return Buffer.from(valueOf, encodingOrOffset, length)
+ }
+
+ var b = fromObject(value)
+ if (b) return b
+
+ if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
+ typeof value[Symbol.toPrimitive] === 'function') {
+ return Buffer.from(
+ value[Symbol.toPrimitive]('string'), encodingOrOffset, length
+ )
+ }
+
+ throw new TypeError(
+ 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
+ 'or Array-like Object. Received type ' + (typeof value)
+ )
+}
+
+/**
+ * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
+ * if value is a number.
+ * Buffer.from(str[, encoding])
+ * Buffer.from(array)
+ * Buffer.from(buffer)
+ * Buffer.from(arrayBuffer[, byteOffset[, length]])
+ **/
+Buffer.from = function (value, encodingOrOffset, length) {
+ return from(value, encodingOrOffset, length)
+}
+
+// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
+// https://github.com/feross/buffer/pull/148
+Buffer.prototype.__proto__ = Uint8Array.prototype
+Buffer.__proto__ = Uint8Array
+
+function assertSize (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('"size" argument must be of type number')
+ } else if (size < 0) {
+ throw new RangeError('The value "' + size + '" is invalid for option "size"')
+ }
+}
+
+function alloc (size, fill, encoding) {
+ assertSize(size)
+ if (size <= 0) {
+ return createBuffer(size)
+ }
+ if (fill !== undefined) {
+ // Only pay attention to encoding if it's a string. This
+ // prevents accidentally sending in a number that would
+ // be interpretted as a start offset.
+ return typeof encoding === 'string'
+ ? createBuffer(size).fill(fill, encoding)
+ : createBuffer(size).fill(fill)
+ }
+ return createBuffer(size)
+}
+
+/**
+ * Creates a new filled Buffer instance.
+ * alloc(size[, fill[, encoding]])
+ **/
+Buffer.alloc = function (size, fill, encoding) {
+ return alloc(size, fill, encoding)
+}
+
+function allocUnsafe (size) {
+ assertSize(size)
+ return createBuffer(size < 0 ? 0 : checked(size) | 0)
+}
+
+/**
+ * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
+ * */
+Buffer.allocUnsafe = function (size) {
+ return allocUnsafe(size)
+}
+/**
+ * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
+ */
+Buffer.allocUnsafeSlow = function (size) {
+ return allocUnsafe(size)
+}
+
+function fromString (string, encoding) {
+ if (typeof encoding !== 'string' || encoding === '') {
+ encoding = 'utf8'
+ }
+
+ if (!Buffer.isEncoding(encoding)) {
+ throw new TypeError('Unknown encoding: ' + encoding)
+ }
+
+ var length = byteLength(string, encoding) | 0
+ var buf = createBuffer(length)
+
+ var actual = buf.write(string, encoding)
+
+ if (actual !== length) {
+ // Writing a hex string, for example, that contains invalid characters will
+ // cause everything after the first invalid character to be ignored. (e.g.
+ // 'abxxcd' will be treated as 'ab')
+ buf = buf.slice(0, actual)
+ }
+
+ return buf
+}
+
+function fromArrayLike (array) {
+ var length = array.length < 0 ? 0 : checked(array.length) | 0
+ var buf = createBuffer(length)
+ for (var i = 0; i < length; i += 1) {
+ buf[i] = array[i] & 255
+ }
+ return buf
+}
+
+function fromArrayBuffer (array, byteOffset, length) {
+ if (byteOffset < 0 || array.byteLength < byteOffset) {
+ throw new RangeError('"offset" is outside of buffer bounds')
+ }
+
+ if (array.byteLength < byteOffset + (length || 0)) {
+ throw new RangeError('"length" is outside of buffer bounds')
+ }
+
+ var buf
+ if (byteOffset === undefined && length === undefined) {
+ buf = new Uint8Array(array)
+ } else if (length === undefined) {
+ buf = new Uint8Array(array, byteOffset)
+ } else {
+ buf = new Uint8Array(array, byteOffset, length)
+ }
+
+ // Return an augmented `Uint8Array` instance
+ buf.__proto__ = Buffer.prototype
+ return buf
+}
+
+function fromObject (obj) {
+ if (Buffer.isBuffer(obj)) {
+ var len = checked(obj.length) | 0
+ var buf = createBuffer(len)
+
+ if (buf.length === 0) {
+ return buf
+ }
+
+ obj.copy(buf, 0, 0, len)
+ return buf
+ }
+
+ if (obj.length !== undefined) {
+ if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
+ return createBuffer(0)
+ }
+ return fromArrayLike(obj)
+ }
+
+ if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
+ return fromArrayLike(obj.data)
+ }
+}
+
+function checked (length) {
+ // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
+ // length is NaN (which is otherwise coerced to zero.)
+ if (length >= K_MAX_LENGTH) {
+ throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
+ 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
+ }
+ return length | 0
+}
+
+function SlowBuffer (length) {
+ if (+length != length) { // eslint-disable-line eqeqeq
+ length = 0
+ }
+ return Buffer.alloc(+length)
+}
+
+Buffer.isBuffer = function isBuffer (b) {
+ return b != null && b._isBuffer === true &&
+ b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
+}
+
+Buffer.compare = function compare (a, b) {
+ if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
+ if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
+ if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
+ throw new TypeError(
+ 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
+ )
+ }
+
+ if (a === b) return 0
+
+ var x = a.length
+ var y = b.length
+
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+ if (a[i] !== b[i]) {
+ x = a[i]
+ y = b[i]
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+}
+
+Buffer.isEncoding = function isEncoding (encoding) {
+ switch (String(encoding).toLowerCase()) {
+ case 'hex':
+ case 'utf8':
+ case 'utf-8':
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ case 'base64':
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return true
+ default:
+ return false
+ }
+}
+
+Buffer.concat = function concat (list, length) {
+ if (!Array.isArray(list)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+
+ if (list.length === 0) {
+ return Buffer.alloc(0)
+ }
+
+ var i
+ if (length === undefined) {
+ length = 0
+ for (i = 0; i < list.length; ++i) {
+ length += list[i].length
+ }
+ }
+
+ var buffer = Buffer.allocUnsafe(length)
+ var pos = 0
+ for (i = 0; i < list.length; ++i) {
+ var buf = list[i]
+ if (isInstance(buf, Uint8Array)) {
+ buf = Buffer.from(buf)
+ }
+ if (!Buffer.isBuffer(buf)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+ buf.copy(buffer, pos)
+ pos += buf.length
+ }
+ return buffer
+}
+
+function byteLength (string, encoding) {
+ if (Buffer.isBuffer(string)) {
+ return string.length
+ }
+ if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
+ return string.byteLength
+ }
+ if (typeof string !== 'string') {
+ throw new TypeError(
+ 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
+ 'Received type ' + typeof string
+ )
+ }
+
+ var len = string.length
+ var mustMatch = (arguments.length > 2 && arguments[2] === true)
+ if (!mustMatch && len === 0) return 0
+
+ // Use a for loop to avoid recursion
+ var loweredCase = false
+ for (;;) {
+ switch (encoding) {
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ return len
+ case 'utf8':
+ case 'utf-8':
+ return utf8ToBytes(string).length
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return len * 2
+ case 'hex':
+ return len >>> 1
+ case 'base64':
+ return base64ToBytes(string).length
+ default:
+ if (loweredCase) {
+ return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
+ }
+ encoding = ('' + encoding).toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+Buffer.byteLength = byteLength
+
+function slowToString (encoding, start, end) {
+ var loweredCase = false
+
+ // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
+ // property of a typed array.
+
+ // This behaves neither like String nor Uint8Array in that we set start/end
+ // to their upper/lower bounds if the value passed is out of range.
+ // undefined is handled specially as per ECMA-262 6th Edition,
+ // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
+ if (start === undefined || start < 0) {
+ start = 0
+ }
+ // Return early if start > this.length. Done here to prevent potential uint32
+ // coercion fail below.
+ if (start > this.length) {
+ return ''
+ }
+
+ if (end === undefined || end > this.length) {
+ end = this.length
+ }
+
+ if (end <= 0) {
+ return ''
+ }
+
+ // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
+ end >>>= 0
+ start >>>= 0
+
+ if (end <= start) {
+ return ''
+ }
+
+ if (!encoding) encoding = 'utf8'
+
+ while (true) {
+ switch (encoding) {
+ case 'hex':
+ return hexSlice(this, start, end)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Slice(this, start, end)
+
+ case 'ascii':
+ return asciiSlice(this, start, end)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Slice(this, start, end)
+
+ case 'base64':
+ return base64Slice(this, start, end)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return utf16leSlice(this, start, end)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = (encoding + '').toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+
+// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
+// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
+// reliably in a browserify context because there could be multiple different
+// copies of the 'buffer' package in use. This method works even for Buffer
+// instances that were created from another copy of the `buffer` package.
+// See: https://github.com/feross/buffer/issues/154
+Buffer.prototype._isBuffer = true
+
+function swap (b, n, m) {
+ var i = b[n]
+ b[n] = b[m]
+ b[m] = i
+}
+
+Buffer.prototype.swap16 = function swap16 () {
+ var len = this.length
+ if (len % 2 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 16-bits')
+ }
+ for (var i = 0; i < len; i += 2) {
+ swap(this, i, i + 1)
+ }
+ return this
+}
+
+Buffer.prototype.swap32 = function swap32 () {
+ var len = this.length
+ if (len % 4 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 32-bits')
+ }
+ for (var i = 0; i < len; i += 4) {
+ swap(this, i, i + 3)
+ swap(this, i + 1, i + 2)
+ }
+ return this
+}
+
+Buffer.prototype.swap64 = function swap64 () {
+ var len = this.length
+ if (len % 8 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 64-bits')
+ }
+ for (var i = 0; i < len; i += 8) {
+ swap(this, i, i + 7)
+ swap(this, i + 1, i + 6)
+ swap(this, i + 2, i + 5)
+ swap(this, i + 3, i + 4)
+ }
+ return this
+}
+
+Buffer.prototype.toString = function toString () {
+ var length = this.length
+ if (length === 0) return ''
+ if (arguments.length === 0) return utf8Slice(this, 0, length)
+ return slowToString.apply(this, arguments)
+}
+
+Buffer.prototype.toLocaleString = Buffer.prototype.toString
+
+Buffer.prototype.equals = function equals (b) {
+ if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
+ if (this === b) return true
+ return Buffer.compare(this, b) === 0
+}
+
+Buffer.prototype.inspect = function inspect () {
+ var str = ''
+ var max = exports.INSPECT_MAX_BYTES
+ str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
+ if (this.length > max) str += ' ... '
+ return ''
+}
+
+Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
+ if (isInstance(target, Uint8Array)) {
+ target = Buffer.from(target, target.offset, target.byteLength)
+ }
+ if (!Buffer.isBuffer(target)) {
+ throw new TypeError(
+ 'The "target" argument must be one of type Buffer or Uint8Array. ' +
+ 'Received type ' + (typeof target)
+ )
+ }
+
+ if (start === undefined) {
+ start = 0
+ }
+ if (end === undefined) {
+ end = target ? target.length : 0
+ }
+ if (thisStart === undefined) {
+ thisStart = 0
+ }
+ if (thisEnd === undefined) {
+ thisEnd = this.length
+ }
+
+ if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
+ throw new RangeError('out of range index')
+ }
+
+ if (thisStart >= thisEnd && start >= end) {
+ return 0
+ }
+ if (thisStart >= thisEnd) {
+ return -1
+ }
+ if (start >= end) {
+ return 1
+ }
+
+ start >>>= 0
+ end >>>= 0
+ thisStart >>>= 0
+ thisEnd >>>= 0
+
+ if (this === target) return 0
+
+ var x = thisEnd - thisStart
+ var y = end - start
+ var len = Math.min(x, y)
+
+ var thisCopy = this.slice(thisStart, thisEnd)
+ var targetCopy = target.slice(start, end)
+
+ for (var i = 0; i < len; ++i) {
+ if (thisCopy[i] !== targetCopy[i]) {
+ x = thisCopy[i]
+ y = targetCopy[i]
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+}
+
+// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
+// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
+//
+// Arguments:
+// - buffer - a Buffer to search
+// - val - a string, Buffer, or number
+// - byteOffset - an index into `buffer`; will be clamped to an int32
+// - encoding - an optional encoding, relevant is val is a string
+// - dir - true for indexOf, false for lastIndexOf
+function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
+ // Empty buffer means no match
+ if (buffer.length === 0) return -1
+
+ // Normalize byteOffset
+ if (typeof byteOffset === 'string') {
+ encoding = byteOffset
+ byteOffset = 0
+ } else if (byteOffset > 0x7fffffff) {
+ byteOffset = 0x7fffffff
+ } else if (byteOffset < -0x80000000) {
+ byteOffset = -0x80000000
+ }
+ byteOffset = +byteOffset // Coerce to Number.
+ if (numberIsNaN(byteOffset)) {
+ // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
+ byteOffset = dir ? 0 : (buffer.length - 1)
+ }
+
+ // Normalize byteOffset: negative offsets start from the end of the buffer
+ if (byteOffset < 0) byteOffset = buffer.length + byteOffset
+ if (byteOffset >= buffer.length) {
+ if (dir) return -1
+ else byteOffset = buffer.length - 1
+ } else if (byteOffset < 0) {
+ if (dir) byteOffset = 0
+ else return -1
+ }
+
+ // Normalize val
+ if (typeof val === 'string') {
+ val = Buffer.from(val, encoding)
+ }
+
+ // Finally, search either indexOf (if dir is true) or lastIndexOf
+ if (Buffer.isBuffer(val)) {
+ // Special case: looking for empty string/buffer always fails
+ if (val.length === 0) {
+ return -1
+ }
+ return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
+ } else if (typeof val === 'number') {
+ val = val & 0xFF // Search for a byte value [0-255]
+ if (typeof Uint8Array.prototype.indexOf === 'function') {
+ if (dir) {
+ return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
+ } else {
+ return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
+ }
+ }
+ return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
+ }
+
+ throw new TypeError('val must be string, number or Buffer')
+}
+
+function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
+ var indexSize = 1
+ var arrLength = arr.length
+ var valLength = val.length
+
+ if (encoding !== undefined) {
+ encoding = String(encoding).toLowerCase()
+ if (encoding === 'ucs2' || encoding === 'ucs-2' ||
+ encoding === 'utf16le' || encoding === 'utf-16le') {
+ if (arr.length < 2 || val.length < 2) {
+ return -1
+ }
+ indexSize = 2
+ arrLength /= 2
+ valLength /= 2
+ byteOffset /= 2
+ }
+ }
+
+ function read (buf, i) {
+ if (indexSize === 1) {
+ return buf[i]
+ } else {
+ return buf.readUInt16BE(i * indexSize)
+ }
+ }
+
+ var i
+ if (dir) {
+ var foundIndex = -1
+ for (i = byteOffset; i < arrLength; i++) {
+ if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
+ if (foundIndex === -1) foundIndex = i
+ if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
+ } else {
+ if (foundIndex !== -1) i -= i - foundIndex
+ foundIndex = -1
+ }
+ }
+ } else {
+ if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
+ for (i = byteOffset; i >= 0; i--) {
+ var found = true
+ for (var j = 0; j < valLength; j++) {
+ if (read(arr, i + j) !== read(val, j)) {
+ found = false
+ break
+ }
+ }
+ if (found) return i
+ }
+ }
+
+ return -1
+}
+
+Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
+ return this.indexOf(val, byteOffset, encoding) !== -1
+}
+
+Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
+}
+
+Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
+}
+
+function hexWrite (buf, string, offset, length) {
+ offset = Number(offset) || 0
+ var remaining = buf.length - offset
+ if (!length) {
+ length = remaining
+ } else {
+ length = Number(length)
+ if (length > remaining) {
+ length = remaining
+ }
+ }
+
+ var strLen = string.length
+
+ if (length > strLen / 2) {
+ length = strLen / 2
+ }
+ for (var i = 0; i < length; ++i) {
+ var parsed = parseInt(string.substr(i * 2, 2), 16)
+ if (numberIsNaN(parsed)) return i
+ buf[offset + i] = parsed
+ }
+ return i
+}
+
+function utf8Write (buf, string, offset, length) {
+ return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+function asciiWrite (buf, string, offset, length) {
+ return blitBuffer(asciiToBytes(string), buf, offset, length)
+}
+
+function latin1Write (buf, string, offset, length) {
+ return asciiWrite(buf, string, offset, length)
+}
+
+function base64Write (buf, string, offset, length) {
+ return blitBuffer(base64ToBytes(string), buf, offset, length)
+}
+
+function ucs2Write (buf, string, offset, length) {
+ return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+Buffer.prototype.write = function write (string, offset, length, encoding) {
+ // Buffer#write(string)
+ if (offset === undefined) {
+ encoding = 'utf8'
+ length = this.length
+ offset = 0
+ // Buffer#write(string, encoding)
+ } else if (length === undefined && typeof offset === 'string') {
+ encoding = offset
+ length = this.length
+ offset = 0
+ // Buffer#write(string, offset[, length][, encoding])
+ } else if (isFinite(offset)) {
+ offset = offset >>> 0
+ if (isFinite(length)) {
+ length = length >>> 0
+ if (encoding === undefined) encoding = 'utf8'
+ } else {
+ encoding = length
+ length = undefined
+ }
+ } else {
+ throw new Error(
+ 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
+ )
+ }
+
+ var remaining = this.length - offset
+ if (length === undefined || length > remaining) length = remaining
+
+ if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
+ throw new RangeError('Attempt to write outside buffer bounds')
+ }
+
+ if (!encoding) encoding = 'utf8'
+
+ var loweredCase = false
+ for (;;) {
+ switch (encoding) {
+ case 'hex':
+ return hexWrite(this, string, offset, length)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Write(this, string, offset, length)
+
+ case 'ascii':
+ return asciiWrite(this, string, offset, length)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Write(this, string, offset, length)
+
+ case 'base64':
+ // Warning: maxLength not taken into account in base64Write
+ return base64Write(this, string, offset, length)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return ucs2Write(this, string, offset, length)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = ('' + encoding).toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+
+Buffer.prototype.toJSON = function toJSON () {
+ return {
+ type: 'Buffer',
+ data: Array.prototype.slice.call(this._arr || this, 0)
+ }
+}
+
+function base64Slice (buf, start, end) {
+ if (start === 0 && end === buf.length) {
+ return base64.fromByteArray(buf)
+ } else {
+ return base64.fromByteArray(buf.slice(start, end))
+ }
+}
+
+function utf8Slice (buf, start, end) {
+ end = Math.min(buf.length, end)
+ var res = []
+
+ var i = start
+ while (i < end) {
+ var firstByte = buf[i]
+ var codePoint = null
+ var bytesPerSequence = (firstByte > 0xEF) ? 4
+ : (firstByte > 0xDF) ? 3
+ : (firstByte > 0xBF) ? 2
+ : 1
+
+ if (i + bytesPerSequence <= end) {
+ var secondByte, thirdByte, fourthByte, tempCodePoint
+
+ switch (bytesPerSequence) {
+ case 1:
+ if (firstByte < 0x80) {
+ codePoint = firstByte
+ }
+ break
+ case 2:
+ secondByte = buf[i + 1]
+ if ((secondByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
+ if (tempCodePoint > 0x7F) {
+ codePoint = tempCodePoint
+ }
+ }
+ break
+ case 3:
+ secondByte = buf[i + 1]
+ thirdByte = buf[i + 2]
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
+ if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
+ codePoint = tempCodePoint
+ }
+ }
+ break
+ case 4:
+ secondByte = buf[i + 1]
+ thirdByte = buf[i + 2]
+ fourthByte = buf[i + 3]
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
+ if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
+ codePoint = tempCodePoint
+ }
+ }
+ }
+ }
+
+ if (codePoint === null) {
+ // we did not generate a valid codePoint so insert a
+ // replacement char (U+FFFD) and advance only 1 byte
+ codePoint = 0xFFFD
+ bytesPerSequence = 1
+ } else if (codePoint > 0xFFFF) {
+ // encode to utf16 (surrogate pair dance)
+ codePoint -= 0x10000
+ res.push(codePoint >>> 10 & 0x3FF | 0xD800)
+ codePoint = 0xDC00 | codePoint & 0x3FF
+ }
+
+ res.push(codePoint)
+ i += bytesPerSequence
+ }
+
+ return decodeCodePointsArray(res)
+}
+
+// Based on http://stackoverflow.com/a/22747272/680742, the browser with
+// the lowest limit is Chrome, with 0x10000 args.
+// We go 1 magnitude less, for safety
+var MAX_ARGUMENTS_LENGTH = 0x1000
+
+function decodeCodePointsArray (codePoints) {
+ var len = codePoints.length
+ if (len <= MAX_ARGUMENTS_LENGTH) {
+ return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
+ }
+
+ // Decode in chunks to avoid "call stack size exceeded".
+ var res = ''
+ var i = 0
+ while (i < len) {
+ res += String.fromCharCode.apply(
+ String,
+ codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
+ )
+ }
+ return res
+}
+
+function asciiSlice (buf, start, end) {
+ var ret = ''
+ end = Math.min(buf.length, end)
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i] & 0x7F)
+ }
+ return ret
+}
+
+function latin1Slice (buf, start, end) {
+ var ret = ''
+ end = Math.min(buf.length, end)
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i])
+ }
+ return ret
+}
+
+function hexSlice (buf, start, end) {
+ var len = buf.length
+
+ if (!start || start < 0) start = 0
+ if (!end || end < 0 || end > len) end = len
+
+ var out = ''
+ for (var i = start; i < end; ++i) {
+ out += toHex(buf[i])
+ }
+ return out
+}
+
+function utf16leSlice (buf, start, end) {
+ var bytes = buf.slice(start, end)
+ var res = ''
+ for (var i = 0; i < bytes.length; i += 2) {
+ res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
+ }
+ return res
+}
+
+Buffer.prototype.slice = function slice (start, end) {
+ var len = this.length
+ start = ~~start
+ end = end === undefined ? len : ~~end
+
+ if (start < 0) {
+ start += len
+ if (start < 0) start = 0
+ } else if (start > len) {
+ start = len
+ }
+
+ if (end < 0) {
+ end += len
+ if (end < 0) end = 0
+ } else if (end > len) {
+ end = len
+ }
+
+ if (end < start) end = start
+
+ var newBuf = this.subarray(start, end)
+ // Return an augmented `Uint8Array` instance
+ newBuf.__proto__ = Buffer.prototype
+ return newBuf
+}
+
+/*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+function checkOffset (offset, ext, length) {
+ if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
+ if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
+}
+
+Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var val = this[offset]
+ var mul = 1
+ var i = 0
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul
+ }
+
+ return val
+}
+
+Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) {
+ checkOffset(offset, byteLength, this.length)
+ }
+
+ var val = this[offset + --byteLength]
+ var mul = 1
+ while (byteLength > 0 && (mul *= 0x100)) {
+ val += this[offset + --byteLength] * mul
+ }
+
+ return val
+}
+
+Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 1, this.length)
+ return this[offset]
+}
+
+Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ return this[offset] | (this[offset + 1] << 8)
+}
+
+Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ return (this[offset] << 8) | this[offset + 1]
+}
+
+Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return ((this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16)) +
+ (this[offset + 3] * 0x1000000)
+}
+
+Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset] * 0x1000000) +
+ ((this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ this[offset + 3])
+}
+
+Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var val = this[offset]
+ var mul = 1
+ var i = 0
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul
+ }
+ mul *= 0x80
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+ return val
+}
+
+Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var i = byteLength
+ var mul = 1
+ var val = this[offset + --i]
+ while (i > 0 && (mul *= 0x100)) {
+ val += this[offset + --i] * mul
+ }
+ mul *= 0x80
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+ return val
+}
+
+Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 1, this.length)
+ if (!(this[offset] & 0x80)) return (this[offset])
+ return ((0xff - this[offset] + 1) * -1)
+}
+
+Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ var val = this[offset] | (this[offset + 1] << 8)
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ var val = this[offset + 1] | (this[offset] << 8)
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16) |
+ (this[offset + 3] << 24)
+}
+
+Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset] << 24) |
+ (this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ (this[offset + 3])
+}
+
+Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+ return ieee754.read(this, offset, true, 23, 4)
+}
+
+Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+ return ieee754.read(this, offset, false, 23, 4)
+}
+
+Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 8, this.length)
+ return ieee754.read(this, offset, true, 52, 8)
+}
+
+Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 8, this.length)
+ return ieee754.read(this, offset, false, 52, 8)
+}
+
+function checkInt (buf, value, offset, ext, max, min) {
+ if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
+ if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+}
+
+Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
+ }
+
+ var mul = 1
+ var i = 0
+ this[offset] = value & 0xFF
+ while (++i < byteLength && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
+ }
+
+ var i = byteLength - 1
+ var mul = 1
+ this[offset + i] = value & 0xFF
+ while (--i >= 0 && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
+ this[offset] = (value & 0xff)
+ return offset + 1
+}
+
+Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ return offset + 2
+}
+
+Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+ this[offset] = (value >>> 8)
+ this[offset + 1] = (value & 0xff)
+ return offset + 2
+}
+
+Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+ this[offset + 3] = (value >>> 24)
+ this[offset + 2] = (value >>> 16)
+ this[offset + 1] = (value >>> 8)
+ this[offset] = (value & 0xff)
+ return offset + 4
+}
+
+Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+ this[offset] = (value >>> 24)
+ this[offset + 1] = (value >>> 16)
+ this[offset + 2] = (value >>> 8)
+ this[offset + 3] = (value & 0xff)
+ return offset + 4
+}
+
+Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) {
+ var limit = Math.pow(2, (8 * byteLength) - 1)
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
+ }
+
+ var i = 0
+ var mul = 1
+ var sub = 0
+ this[offset] = value & 0xFF
+ while (++i < byteLength && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
+ sub = 1
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) {
+ var limit = Math.pow(2, (8 * byteLength) - 1)
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
+ }
+
+ var i = byteLength - 1
+ var mul = 1
+ var sub = 0
+ this[offset + i] = value & 0xFF
+ while (--i >= 0 && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
+ sub = 1
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
+ if (value < 0) value = 0xff + value + 1
+ this[offset] = (value & 0xff)
+ return offset + 1
+}
+
+Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ return offset + 2
+}
+
+Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+ this[offset] = (value >>> 8)
+ this[offset + 1] = (value & 0xff)
+ return offset + 2
+}
+
+Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ this[offset + 2] = (value >>> 16)
+ this[offset + 3] = (value >>> 24)
+ return offset + 4
+}
+
+Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+ if (value < 0) value = 0xffffffff + value + 1
+ this[offset] = (value >>> 24)
+ this[offset + 1] = (value >>> 16)
+ this[offset + 2] = (value >>> 8)
+ this[offset + 3] = (value & 0xff)
+ return offset + 4
+}
+
+function checkIEEE754 (buf, value, offset, ext, max, min) {
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+ if (offset < 0) throw new RangeError('Index out of range')
+}
+
+function writeFloat (buf, value, offset, littleEndian, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
+ }
+ ieee754.write(buf, value, offset, littleEndian, 23, 4)
+ return offset + 4
+}
+
+Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, false, noAssert)
+}
+
+function writeDouble (buf, value, offset, littleEndian, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
+ }
+ ieee754.write(buf, value, offset, littleEndian, 52, 8)
+ return offset + 8
+}
+
+Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, false, noAssert)
+}
+
+// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+Buffer.prototype.copy = function copy (target, targetStart, start, end) {
+ if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
+ if (!start) start = 0
+ if (!end && end !== 0) end = this.length
+ if (targetStart >= target.length) targetStart = target.length
+ if (!targetStart) targetStart = 0
+ if (end > 0 && end < start) end = start
+
+ // Copy 0 bytes; we're done
+ if (end === start) return 0
+ if (target.length === 0 || this.length === 0) return 0
+
+ // Fatal error conditions
+ if (targetStart < 0) {
+ throw new RangeError('targetStart out of bounds')
+ }
+ if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
+ if (end < 0) throw new RangeError('sourceEnd out of bounds')
+
+ // Are we oob?
+ if (end > this.length) end = this.length
+ if (target.length - targetStart < end - start) {
+ end = target.length - targetStart + start
+ }
+
+ var len = end - start
+
+ if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
+ // Use built-in when available, missing from IE11
+ this.copyWithin(targetStart, start, end)
+ } else if (this === target && start < targetStart && targetStart < end) {
+ // descending copy from end
+ for (var i = len - 1; i >= 0; --i) {
+ target[i + targetStart] = this[i + start]
+ }
+ } else {
+ Uint8Array.prototype.set.call(
+ target,
+ this.subarray(start, end),
+ targetStart
+ )
+ }
+
+ return len
+}
+
+// Usage:
+// buffer.fill(number[, offset[, end]])
+// buffer.fill(buffer[, offset[, end]])
+// buffer.fill(string[, offset[, end]][, encoding])
+Buffer.prototype.fill = function fill (val, start, end, encoding) {
+ // Handle string cases:
+ if (typeof val === 'string') {
+ if (typeof start === 'string') {
+ encoding = start
+ start = 0
+ end = this.length
+ } else if (typeof end === 'string') {
+ encoding = end
+ end = this.length
+ }
+ if (encoding !== undefined && typeof encoding !== 'string') {
+ throw new TypeError('encoding must be a string')
+ }
+ if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
+ throw new TypeError('Unknown encoding: ' + encoding)
+ }
+ if (val.length === 1) {
+ var code = val.charCodeAt(0)
+ if ((encoding === 'utf8' && code < 128) ||
+ encoding === 'latin1') {
+ // Fast path: If `val` fits into a single byte, use that numeric value.
+ val = code
+ }
+ }
+ } else if (typeof val === 'number') {
+ val = val & 255
+ }
+
+ // Invalid ranges are not set to a default, so can range check early.
+ if (start < 0 || this.length < start || this.length < end) {
+ throw new RangeError('Out of range index')
+ }
+
+ if (end <= start) {
+ return this
+ }
+
+ start = start >>> 0
+ end = end === undefined ? this.length : end >>> 0
+
+ if (!val) val = 0
+
+ var i
+ if (typeof val === 'number') {
+ for (i = start; i < end; ++i) {
+ this[i] = val
+ }
+ } else {
+ var bytes = Buffer.isBuffer(val)
+ ? val
+ : Buffer.from(val, encoding)
+ var len = bytes.length
+ if (len === 0) {
+ throw new TypeError('The value "' + val +
+ '" is invalid for argument "value"')
+ }
+ for (i = 0; i < end - start; ++i) {
+ this[i + start] = bytes[i % len]
+ }
+ }
+
+ return this
+}
+
+// HELPER FUNCTIONS
+// ================
+
+var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
+
+function base64clean (str) {
+ // Node takes equal signs as end of the Base64 encoding
+ str = str.split('=')[0]
+ // Node strips out invalid characters like \n and \t from the string, base64-js does not
+ str = str.trim().replace(INVALID_BASE64_RE, '')
+ // Node converts strings with length < 2 to ''
+ if (str.length < 2) return ''
+ // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+ while (str.length % 4 !== 0) {
+ str = str + '='
+ }
+ return str
+}
+
+function toHex (n) {
+ if (n < 16) return '0' + n.toString(16)
+ return n.toString(16)
+}
+
+function utf8ToBytes (string, units) {
+ units = units || Infinity
+ var codePoint
+ var length = string.length
+ var leadSurrogate = null
+ var bytes = []
+
+ for (var i = 0; i < length; ++i) {
+ codePoint = string.charCodeAt(i)
+
+ // is surrogate component
+ if (codePoint > 0xD7FF && codePoint < 0xE000) {
+ // last char was a lead
+ if (!leadSurrogate) {
+ // no lead yet
+ if (codePoint > 0xDBFF) {
+ // unexpected trail
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ continue
+ } else if (i + 1 === length) {
+ // unpaired lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ continue
+ }
+
+ // valid lead
+ leadSurrogate = codePoint
+
+ continue
+ }
+
+ // 2 leads in a row
+ if (codePoint < 0xDC00) {
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ leadSurrogate = codePoint
+ continue
+ }
+
+ // valid surrogate pair
+ codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
+ } else if (leadSurrogate) {
+ // valid bmp char, but last char was a lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ }
+
+ leadSurrogate = null
+
+ // encode utf8
+ if (codePoint < 0x80) {
+ if ((units -= 1) < 0) break
+ bytes.push(codePoint)
+ } else if (codePoint < 0x800) {
+ if ((units -= 2) < 0) break
+ bytes.push(
+ codePoint >> 0x6 | 0xC0,
+ codePoint & 0x3F | 0x80
+ )
+ } else if (codePoint < 0x10000) {
+ if ((units -= 3) < 0) break
+ bytes.push(
+ codePoint >> 0xC | 0xE0,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ )
+ } else if (codePoint < 0x110000) {
+ if ((units -= 4) < 0) break
+ bytes.push(
+ codePoint >> 0x12 | 0xF0,
+ codePoint >> 0xC & 0x3F | 0x80,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ )
+ } else {
+ throw new Error('Invalid code point')
+ }
+ }
+
+ return bytes
+}
+
+function asciiToBytes (str) {
+ var byteArray = []
+ for (var i = 0; i < str.length; ++i) {
+ // Node's code seems to be doing this and not & 0x7F..
+ byteArray.push(str.charCodeAt(i) & 0xFF)
+ }
+ return byteArray
+}
+
+function utf16leToBytes (str, units) {
+ var c, hi, lo
+ var byteArray = []
+ for (var i = 0; i < str.length; ++i) {
+ if ((units -= 2) < 0) break
+
+ c = str.charCodeAt(i)
+ hi = c >> 8
+ lo = c % 256
+ byteArray.push(lo)
+ byteArray.push(hi)
+ }
+
+ return byteArray
+}
+
+function base64ToBytes (str) {
+ return base64.toByteArray(base64clean(str))
+}
+
+function blitBuffer (src, dst, offset, length) {
+ for (var i = 0; i < length; ++i) {
+ if ((i + offset >= dst.length) || (i >= src.length)) break
+ dst[i + offset] = src[i]
+ }
+ return i
+}
+
+// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
+// the `instanceof` check but they should be treated as of that type.
+// See: https://github.com/feross/buffer/issues/166
+function isInstance (obj, type) {
+ return obj instanceof type ||
+ (obj != null && obj.constructor != null && obj.constructor.name != null &&
+ obj.constructor.name === type.name)
+}
+function numberIsNaN (obj) {
+ // For IE11 support
+ return obj !== obj // eslint-disable-line no-self-compare
+}
+
+}).call(this)}).call(this,require("buffer").Buffer)
+},{"base64-js":117,"buffer":120,"ieee754":155}],121:[function(require,module,exports){
+(function (process){(function (){
+/* eslint-env browser */
+
+/**
+ * This is the web browser implementation of `debug()`.
+ */
+
+exports.formatArgs = formatArgs;
+exports.save = save;
+exports.load = load;
+exports.useColors = useColors;
+exports.storage = localstorage();
+exports.destroy = (() => {
+ let warned = false;
+
+ return () => {
+ if (!warned) {
+ warned = true;
+ console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+ }
+ };
+})();
+
+/**
+ * Colors.
+ */
+
+exports.colors = [
+ '#0000CC',
+ '#0000FF',
+ '#0033CC',
+ '#0033FF',
+ '#0066CC',
+ '#0066FF',
+ '#0099CC',
+ '#0099FF',
+ '#00CC00',
+ '#00CC33',
+ '#00CC66',
+ '#00CC99',
+ '#00CCCC',
+ '#00CCFF',
+ '#3300CC',
+ '#3300FF',
+ '#3333CC',
+ '#3333FF',
+ '#3366CC',
+ '#3366FF',
+ '#3399CC',
+ '#3399FF',
+ '#33CC00',
+ '#33CC33',
+ '#33CC66',
+ '#33CC99',
+ '#33CCCC',
+ '#33CCFF',
+ '#6600CC',
+ '#6600FF',
+ '#6633CC',
+ '#6633FF',
+ '#66CC00',
+ '#66CC33',
+ '#9900CC',
+ '#9900FF',
+ '#9933CC',
+ '#9933FF',
+ '#99CC00',
+ '#99CC33',
+ '#CC0000',
+ '#CC0033',
+ '#CC0066',
+ '#CC0099',
+ '#CC00CC',
+ '#CC00FF',
+ '#CC3300',
+ '#CC3333',
+ '#CC3366',
+ '#CC3399',
+ '#CC33CC',
+ '#CC33FF',
+ '#CC6600',
+ '#CC6633',
+ '#CC9900',
+ '#CC9933',
+ '#CCCC00',
+ '#CCCC33',
+ '#FF0000',
+ '#FF0033',
+ '#FF0066',
+ '#FF0099',
+ '#FF00CC',
+ '#FF00FF',
+ '#FF3300',
+ '#FF3333',
+ '#FF3366',
+ '#FF3399',
+ '#FF33CC',
+ '#FF33FF',
+ '#FF6600',
+ '#FF6633',
+ '#FF9900',
+ '#FF9933',
+ '#FFCC00',
+ '#FFCC33'
+];
+
+/**
+ * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+ * and the Firebug extension (any Firefox version) are known
+ * to support "%c" CSS customizations.
+ *
+ * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ */
+
+// eslint-disable-next-line complexity
+function useColors() {
+ // NB: In an Electron preload script, document will be defined but not fully
+ // initialized. Since we know we're in Chrome, we'll just detect this case
+ // explicitly
+ if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
+ return true;
+ }
+
+ // Internet Explorer and Edge do not support colors.
+ if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
+ return false;
+ }
+
+ // Is webkit? http://stackoverflow.com/a/16459606/376773
+ // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
+ return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
+ // Is firebug? http://stackoverflow.com/a/398120/376773
+ (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
+ // Is firefox >= v31?
+ // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+ (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
+ // Double check webkit in userAgent just in case we are in a worker
+ (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
+}
+
+/**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
+
+function formatArgs(args) {
+ args[0] = (this.useColors ? '%c' : '') +
+ this.namespace +
+ (this.useColors ? ' %c' : ' ') +
+ args[0] +
+ (this.useColors ? '%c ' : ' ') +
+ '+' + module.exports.humanize(this.diff);
+
+ if (!this.useColors) {
+ return;
+ }
+
+ const c = 'color: ' + this.color;
+ args.splice(1, 0, c, 'color: inherit');
+
+ // The final "%c" is somewhat tricky, because there could be other
+ // arguments passed either before or after the %c, so we need to
+ // figure out the correct index to insert the CSS into
+ let index = 0;
+ let lastC = 0;
+ args[0].replace(/%[a-zA-Z%]/g, match => {
+ if (match === '%%') {
+ return;
+ }
+ index++;
+ if (match === '%c') {
+ // We only are interested in the *last* %c
+ // (the user may have provided their own)
+ lastC = index;
+ }
+ });
+
+ args.splice(lastC, 0, c);
+}
+
+/**
+ * Invokes `console.debug()` when available.
+ * No-op when `console.debug` is not a "function".
+ * If `console.debug` is not available, falls back
+ * to `console.log`.
+ *
+ * @api public
+ */
+exports.log = console.debug || console.log || (() => {});
+
+/**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+function save(namespaces) {
+ try {
+ if (namespaces) {
+ exports.storage.setItem('debug', namespaces);
+ } else {
+ exports.storage.removeItem('debug');
+ }
+ } catch (error) {
+ // Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+}
+
+/**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+function load() {
+ let r;
+ try {
+ r = exports.storage.getItem('debug');
+ } catch (error) {
+ // Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+
+ // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
+ if (!r && typeof process !== 'undefined' && 'env' in process) {
+ r = process.env.DEBUG;
+ }
+
+ return r;
+}
+
+/**
+ * Localstorage attempts to return the localstorage.
+ *
+ * This is necessary because safari throws
+ * when a user disables cookies/localstorage
+ * and you attempt to access it.
+ *
+ * @return {LocalStorage}
+ * @api private
+ */
+
+function localstorage() {
+ try {
+ // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
+ // The Browser also has localStorage in the global context.
+ return localStorage;
+ } catch (error) {
+ // Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+}
+
+module.exports = require('./common')(exports);
+
+const {formatters} = module.exports;
+
+/**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
+
+formatters.j = function (v) {
+ try {
+ return JSON.stringify(v);
+ } catch (error) {
+ return '[UnexpectedJSONParseError]: ' + error.message;
+ }
+};
+
+}).call(this)}).call(this,require('_process'))
+},{"./common":122,"_process":168}],122:[function(require,module,exports){
+
+/**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ */
+
+function setup(env) {
+ createDebug.debug = createDebug;
+ createDebug.default = createDebug;
+ createDebug.coerce = coerce;
+ createDebug.disable = disable;
+ createDebug.enable = enable;
+ createDebug.enabled = enabled;
+ createDebug.humanize = require('ms');
+ createDebug.destroy = destroy;
+
+ Object.keys(env).forEach(key => {
+ createDebug[key] = env[key];
+ });
+
+ /**
+ * The currently active debug mode names, and names to skip.
+ */
+
+ createDebug.names = [];
+ createDebug.skips = [];
+
+ /**
+ * Map of special "%n" handling functions, for the debug "format" argument.
+ *
+ * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
+ */
+ createDebug.formatters = {};
+
+ /**
+ * Selects a color for a debug namespace
+ * @param {String} namespace The namespace string for the debug instance to be colored
+ * @return {Number|String} An ANSI color code for the given namespace
+ * @api private
+ */
+ function selectColor(namespace) {
+ let hash = 0;
+
+ for (let i = 0; i < namespace.length; i++) {
+ hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
+ hash |= 0; // Convert to 32bit integer
+ }
+
+ return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
+ }
+ createDebug.selectColor = selectColor;
+
+ /**
+ * Create a debugger with the given `namespace`.
+ *
+ * @param {String} namespace
+ * @return {Function}
+ * @api public
+ */
+ function createDebug(namespace) {
+ let prevTime;
+ let enableOverride = null;
+ let namespacesCache;
+ let enabledCache;
+
+ function debug(...args) {
+ // Disabled?
+ if (!debug.enabled) {
+ return;
+ }
+
+ const self = debug;
+
+ // Set `diff` timestamp
+ const curr = Number(new Date());
+ const ms = curr - (prevTime || curr);
+ self.diff = ms;
+ self.prev = prevTime;
+ self.curr = curr;
+ prevTime = curr;
+
+ args[0] = createDebug.coerce(args[0]);
+
+ if (typeof args[0] !== 'string') {
+ // Anything else let's inspect with %O
+ args.unshift('%O');
+ }
+
+ // Apply any `formatters` transformations
+ let index = 0;
+ args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {
+ // If we encounter an escaped % then don't increase the array index
+ if (match === '%%') {
+ return '%';
+ }
+ index++;
+ const formatter = createDebug.formatters[format];
+ if (typeof formatter === 'function') {
+ const val = args[index];
+ match = formatter.call(self, val);
+
+ // Now we need to remove `args[index]` since it's inlined in the `format`
+ args.splice(index, 1);
+ index--;
+ }
+ return match;
+ });
+
+ // Apply env-specific formatting (colors, etc.)
+ createDebug.formatArgs.call(self, args);
+
+ const logFn = self.log || createDebug.log;
+ logFn.apply(self, args);
+ }
+
+ debug.namespace = namespace;
+ debug.useColors = createDebug.useColors();
+ debug.color = createDebug.selectColor(namespace);
+ debug.extend = extend;
+ debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
+
+ Object.defineProperty(debug, 'enabled', {
+ enumerable: true,
+ configurable: false,
+ get: () => {
+ if (enableOverride !== null) {
+ return enableOverride;
+ }
+ if (namespacesCache !== createDebug.namespaces) {
+ namespacesCache = createDebug.namespaces;
+ enabledCache = createDebug.enabled(namespace);
+ }
+
+ return enabledCache;
+ },
+ set: v => {
+ enableOverride = v;
+ }
+ });
+
+ // Env-specific initialization logic for debug instances
+ if (typeof createDebug.init === 'function') {
+ createDebug.init(debug);
+ }
+
+ return debug;
+ }
+
+ function extend(namespace, delimiter) {
+ const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
+ newDebug.log = this.log;
+ return newDebug;
+ }
+
+ /**
+ * Enables a debug mode by namespaces. This can include modes
+ * separated by a colon and wildcards.
+ *
+ * @param {String} namespaces
+ * @api public
+ */
+ function enable(namespaces) {
+ createDebug.save(namespaces);
+ createDebug.namespaces = namespaces;
+
+ createDebug.names = [];
+ createDebug.skips = [];
+
+ let i;
+ const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
+ const len = split.length;
+
+ for (i = 0; i < len; i++) {
+ if (!split[i]) {
+ // ignore empty strings
+ continue;
+ }
+
+ namespaces = split[i].replace(/\*/g, '.*?');
+
+ if (namespaces[0] === '-') {
+ createDebug.skips.push(new RegExp('^' + namespaces.slice(1) + '$'));
+ } else {
+ createDebug.names.push(new RegExp('^' + namespaces + '$'));
+ }
+ }
+ }
+
+ /**
+ * Disable debug output.
+ *
+ * @return {String} namespaces
+ * @api public
+ */
+ function disable() {
+ const namespaces = [
+ ...createDebug.names.map(toNamespace),
+ ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace)
+ ].join(',');
+ createDebug.enable('');
+ return namespaces;
+ }
+
+ /**
+ * Returns true if the given mode name is enabled, false otherwise.
+ *
+ * @param {String} name
+ * @return {Boolean}
+ * @api public
+ */
+ function enabled(name) {
+ if (name[name.length - 1] === '*') {
+ return true;
+ }
+
+ let i;
+ let len;
+
+ for (i = 0, len = createDebug.skips.length; i < len; i++) {
+ if (createDebug.skips[i].test(name)) {
+ return false;
+ }
+ }
+
+ for (i = 0, len = createDebug.names.length; i < len; i++) {
+ if (createDebug.names[i].test(name)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Convert regexp to namespace
+ *
+ * @param {RegExp} regxep
+ * @return {String} namespace
+ * @api private
+ */
+ function toNamespace(regexp) {
+ return regexp.toString()
+ .substring(2, regexp.toString().length - 2)
+ .replace(/\.\*\?$/, '*');
+ }
+
+ /**
+ * Coerce `val`.
+ *
+ * @param {Mixed} val
+ * @return {Mixed}
+ * @api private
+ */
+ function coerce(val) {
+ if (val instanceof Error) {
+ return val.stack || val.message;
+ }
+ return val;
+ }
+
+ /**
+ * XXX DO NOT USE. This is a temporary stub function.
+ * XXX It WILL be removed in the next major release.
+ */
+ function destroy() {
+ console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+ }
+
+ createDebug.enable(createDebug.load());
+
+ return createDebug;
+}
+
+module.exports = setup;
+
+},{"ms":161}],123:[function(require,module,exports){
+(function (process){(function (){
+"use strict";
+var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+ if (ar || !(i in from)) {
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+ ar[i] = from[i];
+ }
+ }
+ return to.concat(ar || Array.prototype.slice.call(from));
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.getNodeVersion = exports.detectOS = exports.parseUserAgent = exports.browserName = exports.detect = exports.ReactNativeInfo = exports.BotInfo = exports.SearchBotDeviceInfo = exports.NodeInfo = exports.BrowserInfo = void 0;
+var BrowserInfo = /** @class */ (function () {
+ function BrowserInfo(name, version, os) {
+ this.name = name;
+ this.version = version;
+ this.os = os;
+ this.type = 'browser';
+ }
+ return BrowserInfo;
+}());
+exports.BrowserInfo = BrowserInfo;
+var NodeInfo = /** @class */ (function () {
+ function NodeInfo(version) {
+ this.version = version;
+ this.type = 'node';
+ this.name = 'node';
+ this.os = process.platform;
+ }
+ return NodeInfo;
+}());
+exports.NodeInfo = NodeInfo;
+var SearchBotDeviceInfo = /** @class */ (function () {
+ function SearchBotDeviceInfo(name, version, os, bot) {
+ this.name = name;
+ this.version = version;
+ this.os = os;
+ this.bot = bot;
+ this.type = 'bot-device';
+ }
+ return SearchBotDeviceInfo;
+}());
+exports.SearchBotDeviceInfo = SearchBotDeviceInfo;
+var BotInfo = /** @class */ (function () {
+ function BotInfo() {
+ this.type = 'bot';
+ this.bot = true; // NOTE: deprecated test name instead
+ this.name = 'bot';
+ this.version = null;
+ this.os = null;
+ }
+ return BotInfo;
+}());
+exports.BotInfo = BotInfo;
+var ReactNativeInfo = /** @class */ (function () {
+ function ReactNativeInfo() {
+ this.type = 'react-native';
+ this.name = 'react-native';
+ this.version = null;
+ this.os = null;
+ }
+ return ReactNativeInfo;
+}());
+exports.ReactNativeInfo = ReactNativeInfo;
+// tslint:disable-next-line:max-line-length
+var SEARCHBOX_UA_REGEX = /alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/;
+var SEARCHBOT_OS_REGEX = /(nuhk|curl|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\ Jeeves\/Teoma|ia_archiver)/;
+var REQUIRED_VERSION_PARTS = 3;
+var userAgentRules = [
+ ['aol', /AOLShield\/([0-9\._]+)/],
+ ['edge', /Edge\/([0-9\._]+)/],
+ ['edge-ios', /EdgiOS\/([0-9\._]+)/],
+ ['yandexbrowser', /YaBrowser\/([0-9\._]+)/],
+ ['kakaotalk', /KAKAOTALK\s([0-9\.]+)/],
+ ['samsung', /SamsungBrowser\/([0-9\.]+)/],
+ ['silk', /\bSilk\/([0-9._-]+)\b/],
+ ['miui', /MiuiBrowser\/([0-9\.]+)$/],
+ ['beaker', /BeakerBrowser\/([0-9\.]+)/],
+ ['edge-chromium', /EdgA?\/([0-9\.]+)/],
+ [
+ 'chromium-webview',
+ /(?!Chrom.*OPR)wv\).*Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/,
+ ],
+ ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],
+ ['phantomjs', /PhantomJS\/([0-9\.]+)(:?\s|$)/],
+ ['crios', /CriOS\/([0-9\.]+)(:?\s|$)/],
+ ['firefox', /Firefox\/([0-9\.]+)(?:\s|$)/],
+ ['fxios', /FxiOS\/([0-9\.]+)/],
+ ['opera-mini', /Opera Mini.*Version\/([0-9\.]+)/],
+ ['opera', /Opera\/([0-9\.]+)(?:\s|$)/],
+ ['opera', /OPR\/([0-9\.]+)(:?\s|$)/],
+ ['pie', /^Microsoft Pocket Internet Explorer\/(\d+\.\d+)$/],
+ ['pie', /^Mozilla\/\d\.\d+\s\(compatible;\s(?:MSP?IE|MSInternet Explorer) (\d+\.\d+);.*Windows CE.*\)$/],
+ ['netfront', /^Mozilla\/\d\.\d+.*NetFront\/(\d.\d)/],
+ ['ie', /Trident\/7\.0.*rv\:([0-9\.]+).*\).*Gecko$/],
+ ['ie', /MSIE\s([0-9\.]+);.*Trident\/[4-7].0/],
+ ['ie', /MSIE\s(7\.0)/],
+ ['bb10', /BB10;\sTouch.*Version\/([0-9\.]+)/],
+ ['android', /Android\s([0-9\.]+)/],
+ ['ios', /Version\/([0-9\._]+).*Mobile.*Safari.*/],
+ ['safari', /Version\/([0-9\._]+).*Safari/],
+ ['facebook', /FB[AS]V\/([0-9\.]+)/],
+ ['instagram', /Instagram\s([0-9\.]+)/],
+ ['ios-webview', /AppleWebKit\/([0-9\.]+).*Mobile/],
+ ['ios-webview', /AppleWebKit\/([0-9\.]+).*Gecko\)$/],
+ ['curl', /^curl\/([0-9\.]+)$/],
+ ['searchbot', SEARCHBOX_UA_REGEX],
+];
+var operatingSystemRules = [
+ ['iOS', /iP(hone|od|ad)/],
+ ['Android OS', /Android/],
+ ['BlackBerry OS', /BlackBerry|BB10/],
+ ['Windows Mobile', /IEMobile/],
+ ['Amazon OS', /Kindle/],
+ ['Windows 3.11', /Win16/],
+ ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/],
+ ['Windows 98', /(Windows 98)|(Win98)/],
+ ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/],
+ ['Windows XP', /(Windows NT 5.1)|(Windows XP)/],
+ ['Windows Server 2003', /(Windows NT 5.2)/],
+ ['Windows Vista', /(Windows NT 6.0)/],
+ ['Windows 7', /(Windows NT 6.1)/],
+ ['Windows 8', /(Windows NT 6.2)/],
+ ['Windows 8.1', /(Windows NT 6.3)/],
+ ['Windows 10', /(Windows NT 10.0)/],
+ ['Windows ME', /Windows ME/],
+ ['Windows CE', /Windows CE|WinCE|Microsoft Pocket Internet Explorer/],
+ ['Open BSD', /OpenBSD/],
+ ['Sun OS', /SunOS/],
+ ['Chrome OS', /CrOS/],
+ ['Linux', /(Linux)|(X11)/],
+ ['Mac OS', /(Mac_PowerPC)|(Macintosh)/],
+ ['QNX', /QNX/],
+ ['BeOS', /BeOS/],
+ ['OS/2', /OS\/2/],
+];
+function detect(userAgent) {
+ if (!!userAgent) {
+ return parseUserAgent(userAgent);
+ }
+ if (typeof document === 'undefined' &&
+ typeof navigator !== 'undefined' &&
+ navigator.product === 'ReactNative') {
+ return new ReactNativeInfo();
+ }
+ if (typeof navigator !== 'undefined') {
+ return parseUserAgent(navigator.userAgent);
+ }
+ return getNodeVersion();
+}
+exports.detect = detect;
+function matchUserAgent(ua) {
+ // opted for using reduce here rather than Array#first with a regex.test call
+ // this is primarily because using the reduce we only perform the regex
+ // execution once rather than once for the test and for the exec again below
+ // probably something that needs to be benchmarked though
+ return (ua !== '' &&
+ userAgentRules.reduce(function (matched, _a) {
+ var browser = _a[0], regex = _a[1];
+ if (matched) {
+ return matched;
+ }
+ var uaMatch = regex.exec(ua);
+ return !!uaMatch && [browser, uaMatch];
+ }, false));
+}
+function browserName(ua) {
+ var data = matchUserAgent(ua);
+ return data ? data[0] : null;
+}
+exports.browserName = browserName;
+function parseUserAgent(ua) {
+ var matchedRule = matchUserAgent(ua);
+ if (!matchedRule) {
+ return null;
+ }
+ var name = matchedRule[0], match = matchedRule[1];
+ if (name === 'searchbot') {
+ return new BotInfo();
+ }
+ // Do not use RegExp for split operation as some browser do not support it (See: http://blog.stevenlevithan.com/archives/cross-browser-split)
+ var versionParts = match[1] && match[1].split('.').join('_').split('_').slice(0, 3);
+ if (versionParts) {
+ if (versionParts.length < REQUIRED_VERSION_PARTS) {
+ versionParts = __spreadArray(__spreadArray([], versionParts, true), createVersionParts(REQUIRED_VERSION_PARTS - versionParts.length), true);
+ }
+ }
+ else {
+ versionParts = [];
+ }
+ var version = versionParts.join('.');
+ var os = detectOS(ua);
+ var searchBotMatch = SEARCHBOT_OS_REGEX.exec(ua);
+ if (searchBotMatch && searchBotMatch[1]) {
+ return new SearchBotDeviceInfo(name, version, os, searchBotMatch[1]);
+ }
+ return new BrowserInfo(name, version, os);
+}
+exports.parseUserAgent = parseUserAgent;
+function detectOS(ua) {
+ for (var ii = 0, count = operatingSystemRules.length; ii < count; ii++) {
+ var _a = operatingSystemRules[ii], os = _a[0], regex = _a[1];
+ var match = regex.exec(ua);
+ if (match) {
+ return os;
+ }
+ }
+ return null;
+}
+exports.detectOS = detectOS;
+function getNodeVersion() {
+ var isNode = typeof process !== 'undefined' && process.version;
+ return isNode ? new NodeInfo(process.version.slice(1)) : null;
+}
+exports.getNodeVersion = getNodeVersion;
+function createVersionParts(count) {
+ var output = [];
+ for (var ii = 0; ii < count; ii++) {
+ output.push('0');
+ }
+ return output;
+}
+
+}).call(this)}).call(this,require('_process'))
+},{"_process":168}],124:[function(require,module,exports){
+(function (Buffer){(function (){
+'use strict';
+
+/* eslint-disable */
+
+var utils = require('./utils/index.js');
+var uint256Coder = utils.uint256Coder;
+var coderBoolean = utils.coderBoolean;
+var coderFixedBytes = utils.coderFixedBytes;
+var coderAddress = utils.coderAddress;
+var coderDynamicBytes = utils.coderDynamicBytes;
+var coderString = utils.coderString;
+var coderArray = utils.coderArray;
+var paramTypePart = utils.paramTypePart;
+var getParamCoder = utils.getParamCoder;
+
+function Result() {}
+
+function encodeParams(types, values) {
+ if (types.length !== values.length) {
+ throw new Error('[ethjs-abi] while encoding params, types/values mismatch, Your contract requires ' + types.length + ' types (arguments), and you passed in ' + values.length);
+ }
+
+ var parts = [];
+
+ types.forEach(function (type, index) {
+ var coder = getParamCoder(type);
+ parts.push({ dynamic: coder.dynamic, value: coder.encode(values[index]) });
+ });
+
+ function alignSize(size) {
+ return parseInt(32 * Math.ceil(size / 32));
+ }
+
+ var staticSize = 0,
+ dynamicSize = 0;
+ parts.forEach(function (part) {
+ if (part.dynamic) {
+ staticSize += 32;
+ dynamicSize += alignSize(part.value.length);
+ } else {
+ staticSize += alignSize(part.value.length);
+ }
+ });
+
+ var offset = 0,
+ dynamicOffset = staticSize;
+ var data = new Buffer(staticSize + dynamicSize);
+
+ parts.forEach(function (part, index) {
+ if (part.dynamic) {
+ uint256Coder.encode(dynamicOffset).copy(data, offset);
+ offset += 32;
+
+ part.value.copy(data, dynamicOffset);
+ dynamicOffset += alignSize(part.value.length);
+ } else {
+ part.value.copy(data, offset);
+ offset += alignSize(part.value.length);
+ }
+ });
+
+ return '0x' + data.toString('hex');
+}
+
+// decode bytecode data from output names and types
+function decodeParams(names, types, data) {
+ var useNumberedParams = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+
+ // Names is optional, so shift over all the parameters if not provided
+ if (arguments.length < 3) {
+ data = types;
+ types = names;
+ names = [];
+ }
+
+ data = utils.hexOrBuffer(data);
+ var values = new Result();
+
+ var offset = 0;
+ types.forEach(function (type, index) {
+ var coder = getParamCoder(type);
+
+ if (coder.dynamic) {
+ var dynamicOffset = uint256Coder.decode(data, offset);
+ var result = coder.decode(data, dynamicOffset.value.toNumber());
+ offset += dynamicOffset.consumed;
+ } else {
+ var result = coder.decode(data, offset);
+ offset += result.consumed;
+ }
+
+ if (useNumberedParams) {
+ values[index] = result.value;
+ }
+
+ if (names[index]) {
+ values[names[index]] = result.value;
+ }
+ });
+ return values;
+}
+
+// create an encoded method signature from an ABI object
+function encodeSignature(method) {
+ var signature = method.name + '(' + utils.getKeys(method.inputs, 'type').join(',') + ')';
+ var signatureEncoded = '0x' + new Buffer(utils.keccak256(signature), 'hex').slice(0, 4).toString('hex');
+
+ return signatureEncoded;
+}
+
+// encode method ABI object with values in an array, output bytecode
+function encodeMethod(method, values) {
+ var paramsEncoded = encodeParams(utils.getKeys(method.inputs, 'type'), values).substring(2);
+
+ return '' + encodeSignature(method) + paramsEncoded;
+}
+
+// decode method data bytecode, from method ABI object
+function decodeMethod(method, data) {
+ var outputNames = utils.getKeys(method.outputs, 'name', true);
+ var outputTypes = utils.getKeys(method.outputs, 'type');
+
+ return decodeParams(outputNames, outputTypes, utils.hexOrBuffer(data));
+}
+
+// decode method data bytecode, from method ABI object
+function encodeEvent(eventObject, values) {
+ return encodeMethod(eventObject, values);
+}
+
+function eventSignature(eventObject) {
+ var signature = eventObject.name + '(' + utils.getKeys(eventObject.inputs, 'type').join(',') + ')';
+
+ return '0x' + utils.keccak256(signature);
+}
+
+// decode method data bytecode, from method ABI object
+function decodeEvent(eventObject, data, topics) {
+ var useNumberedParams = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
+
+ var nonIndexed = eventObject.inputs.filter(function (input) {
+ return !input.indexed;
+ });
+ var nonIndexedNames = utils.getKeys(nonIndexed, 'name', true);
+ var nonIndexedTypes = utils.getKeys(nonIndexed, 'type');
+ var event = decodeParams(nonIndexedNames, nonIndexedTypes, utils.hexOrBuffer(data), useNumberedParams);
+ var topicOffset = eventObject.anonymous ? 0 : 1;
+
+ eventObject.inputs.filter(function (input) {
+ return input.indexed;
+ }).map(function (input, i) {
+ var topic = new Buffer(topics[i + topicOffset].slice(2), 'hex');
+ var coder = getParamCoder(input.type);
+ event[input.name] = coder.decode(topic, 0).value;
+ });
+
+ event._eventName = eventObject.name;
+
+ return event;
+}
+
+// Decode a specific log item with a specific event abi
+function decodeLogItem(eventObject, log) {
+ var useNumberedParams = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
+
+ if (eventObject && log.topics[0] === eventSignature(eventObject)) {
+ return decodeEvent(eventObject, log.data, log.topics, useNumberedParams);
+ }
+}
+
+// Create a decoder for all events defined in an abi. It returns a function which is called
+// on an array of log entries such as received from getLogs or getTransactionReceipt and parses
+// any matching log entries
+function logDecoder(abi) {
+ var useNumberedParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
+
+ var eventMap = {};
+ abi.filter(function (item) {
+ return item.type === 'event';
+ }).map(function (item) {
+ eventMap[eventSignature(item)] = item;
+ });
+ return function (logItems) {
+ return logItems.map(function (log) {
+ return decodeLogItem(eventMap[log.topics[0]], log, useNumberedParams);
+ }).filter(function (i) {
+ return i;
+ });
+ };
+}
+
+module.exports = {
+ encodeParams: encodeParams,
+ decodeParams: decodeParams,
+ encodeMethod: encodeMethod,
+ decodeMethod: decodeMethod,
+ encodeEvent: encodeEvent,
+ decodeEvent: decodeEvent,
+ decodeLogItem: decodeLogItem,
+ logDecoder: logDecoder,
+ eventSignature: eventSignature,
+ encodeSignature: encodeSignature
+};
+}).call(this)}).call(this,require("buffer").Buffer)
+},{"./utils/index.js":125,"buffer":120}],125:[function(require,module,exports){
+(function (Buffer){(function (){
+'use strict';
+
+var BN = require('bn.js');
+var numberToBN = require('number-to-bn');
+var keccak256 = require('js-sha3').keccak_256;
+
+// from ethereumjs-util
+function stripZeros(aInput) {
+ var a = aInput; // eslint-disable-line
+ var first = a[0]; // eslint-disable-line
+ while (a.length > 0 && first.toString() === '0') {
+ a = a.slice(1);
+ first = a[0];
+ }
+ return a;
+}
+
+function bnToBuffer(bnInput) {
+ var bn = bnInput; // eslint-disable-line
+ var hex = bn.toString(16); // eslint-disable-line
+ if (hex.length % 2) {
+ hex = '0' + hex;
+ }
+ return stripZeros(new Buffer(hex, 'hex'));
+}
+
+function isHexString(value, length) {
+ if (typeof value !== 'string' || !value.match(/^0x[0-9A-Fa-f]*$/)) {
+ return false;
+ }
+ if (length && value.length !== 2 + 2 * length) {
+ return false;
+ }
+ return true;
+}
+
+function hexOrBuffer(valueInput, name) {
+ var value = valueInput; // eslint-disable-line
+ if (!Buffer.isBuffer(value)) {
+ if (!isHexString(value)) {
+ var error = new Error(name ? '[ethjs-abi] invalid ' + name : '[ethjs-abi] invalid hex or buffer, must be a prefixed alphanumeric even length hex string');
+ error.reason = '[ethjs-abi] invalid hex string, hex must be prefixed and alphanumeric (e.g. 0x023..)';
+ error.value = value;
+ throw error;
+ }
+
+ value = value.substring(2);
+ if (value.length % 2) {
+ value = '0' + value;
+ }
+ value = new Buffer(value, 'hex');
+ }
+
+ return value;
+}
+
+function hexlify(value) {
+ if (typeof value === 'number') {
+ return '0x' + bnToBuffer(new BN(value)).toString('hex');
+ } else if (value.mod || value.modulo) {
+ return '0x' + bnToBuffer(value).toString('hex');
+ } else {
+ // eslint-disable-line
+ return '0x' + hexOrBuffer(value).toString('hex');
+ }
+}
+
+// getKeys([{a: 1, b: 2}, {a: 3, b: 4}], 'a') => [1, 3]
+function getKeys(params, key, allowEmpty) {
+ var result = []; // eslint-disable-line
+
+ if (!Array.isArray(params)) {
+ throw new Error('[ethjs-abi] while getting keys, invalid params value ' + JSON.stringify(params));
+ }
+
+ for (var i = 0; i < params.length; i++) {
+ // eslint-disable-line
+ var value = params[i][key]; // eslint-disable-line
+ if (allowEmpty && !value) {
+ value = '';
+ } else if (typeof value !== 'string') {
+ throw new Error('[ethjs-abi] while getKeys found invalid ABI data structure, type value not string');
+ }
+ result.push(value);
+ }
+
+ return result;
+}
+
+function coderNumber(size, signed) {
+ return {
+ encode: function encodeNumber(valueInput) {
+ var value = valueInput; // eslint-disable-line
+
+ if (typeof value === 'object' && value.toString && (value.toTwos || value.dividedToIntegerBy)) {
+ value = value.toString(10).split('.')[0];
+ }
+
+ if (typeof value === 'string' || typeof value === 'number') {
+ value = String(value).split('.')[0];
+ }
+
+ value = numberToBN(value);
+ value = value.toTwos(size * 8).maskn(size * 8);
+ if (signed) {
+ value = value.fromTwos(size * 8).toTwos(256);
+ }
+ return value.toArrayLike(Buffer, 'be', 32);
+ },
+ decode: function decodeNumber(data, offset) {
+ var junkLength = 32 - size; // eslint-disable-line
+ var value = new BN(data.slice(offset + junkLength, offset + 32)); // eslint-disable-line
+ if (signed) {
+ value = value.fromTwos(size * 8);
+ } else {
+ value = value.maskn(size * 8);
+ }
+ return {
+ consumed: 32,
+ value: new BN(value.toString(10))
+ };
+ }
+ };
+}
+var uint256Coder = coderNumber(32, false);
+
+var coderBoolean = {
+ encode: function encodeBoolean(value) {
+ return uint256Coder.encode(value ? 1 : 0);
+ },
+ decode: function decodeBoolean(data, offset) {
+ var result = uint256Coder.decode(data, offset); // eslint-disable-line
+ return {
+ consumed: result.consumed,
+ value: !result.value.isZero()
+ };
+ }
+};
+
+function coderFixedBytes(length) {
+ return {
+ encode: function encodeFixedBytes(valueInput) {
+ var value = valueInput; // eslint-disable-line
+ value = hexOrBuffer(value);
+
+ if (value.length === 32) {
+ return value;
+ }
+
+ var result = new Buffer(32); // eslint-disable-line
+ result.fill(0);
+ value.copy(result);
+ return result;
+ },
+ decode: function decodeFixedBytes(data, offset) {
+ if (data.length !== 0 && data.length < offset + 32) {
+ throw new Error('[ethjs-abi] while decoding fixed bytes, invalid bytes data length: ' + length);
+ }
+
+ return {
+ consumed: 32,
+ value: '0x' + data.slice(offset, offset + length).toString('hex')
+ };
+ }
+ };
+}
+
+var coderAddress = {
+ encode: function encodeAddress(valueInput) {
+ var value = valueInput; // eslint-disable-line
+ var result = new Buffer(32); // eslint-disable-line
+ if (!isHexString(value, 20)) {
+ throw new Error('[ethjs-abi] while encoding address, invalid address value, not alphanumeric 20 byte hex string');
+ }
+ value = hexOrBuffer(value);
+ result.fill(0);
+ value.copy(result, 12);
+ return result;
+ },
+ decode: function decodeAddress(data, offset) {
+ if (data.length === 0) {
+ return {
+ consumed: 32,
+ value: '0x'
+ };
+ }
+ if (data.length !== 0 && data.length < offset + 32) {
+ throw new Error('[ethjs-abi] while decoding address data, invalid address data, invalid byte length ' + data.length);
+ }
+ return {
+ consumed: 32,
+ value: '0x' + data.slice(offset + 12, offset + 32).toString('hex')
+ };
+ }
+};
+
+function encodeDynamicBytesHelper(value) {
+ var dataLength = parseInt(32 * Math.ceil(value.length / 32)); // eslint-disable-line
+ var padding = new Buffer(dataLength - value.length); // eslint-disable-line
+ padding.fill(0);
+
+ return Buffer.concat([uint256Coder.encode(value.length), value, padding]);
+}
+
+function decodeDynamicBytesHelper(data, offset) {
+ if (data.length !== 0 && data.length < offset + 32) {
+ throw new Error('[ethjs-abi] while decoding dynamic bytes data, invalid bytes length: ' + data.length + ' should be less than ' + (offset + 32));
+ }
+
+ var length = uint256Coder.decode(data, offset).value; // eslint-disable-line
+ length = length.toNumber();
+ if (data.length !== 0 && data.length < offset + 32 + length) {
+ throw new Error('[ethjs-abi] while decoding dynamic bytes data, invalid bytes length: ' + data.length + ' should be less than ' + (offset + 32 + length));
+ }
+
+ return {
+ consumed: parseInt(32 + 32 * Math.ceil(length / 32), 10),
+ value: data.slice(offset + 32, offset + 32 + length)
+ };
+}
+
+var coderDynamicBytes = {
+ encode: function encodeDynamicBytes(value) {
+ return encodeDynamicBytesHelper(hexOrBuffer(value));
+ },
+ decode: function decodeDynamicBytes(data, offset) {
+ var result = decodeDynamicBytesHelper(data, offset); // eslint-disable-line
+ result.value = '0x' + result.value.toString('hex');
+ return result;
+ },
+ dynamic: true
+};
+
+var coderString = {
+ encode: function encodeString(value) {
+ return encodeDynamicBytesHelper(new Buffer(value, 'utf8'));
+ },
+ decode: function decodeString(data, offset) {
+ var result = decodeDynamicBytesHelper(data, offset); // eslint-disable-line
+ result.value = result.value.toString('utf8');
+ return result;
+ },
+ dynamic: true
+};
+
+function coderArray(coder, lengthInput) {
+ return {
+ encode: function encodeArray(value) {
+ var result = new Buffer(0); // eslint-disable-line
+ var length = lengthInput; // eslint-disable-line
+
+ if (!Array.isArray(value)) {
+ throw new Error('[ethjs-abi] while encoding array, invalid array data, not type Object (Array)');
+ }
+
+ if (length === -1) {
+ length = value.length;
+ result = uint256Coder.encode(length);
+ }
+
+ if (length !== value.length) {
+ throw new Error('[ethjs-abi] while encoding array, size mismatch array length ' + length + ' does not equal ' + value.length);
+ }
+
+ value.forEach(function (resultValue) {
+ result = Buffer.concat([result, coder.encode(resultValue)]);
+ });
+
+ return result;
+ },
+ decode: function decodeArray(data, offsetInput) {
+ var length = lengthInput; // eslint-disable-line
+ var offset = offsetInput; // eslint-disable-line
+ // @TODO:
+ // if (data.length < offset + length * 32) { throw new Error('invalid array'); }
+
+ var consumed = 0; // eslint-disable-line
+ var decodeResult; // eslint-disable-line
+
+ if (length === -1) {
+ decodeResult = uint256Coder.decode(data, offset);
+ length = decodeResult.value.toNumber();
+ consumed += decodeResult.consumed;
+ offset += decodeResult.consumed;
+ }
+
+ var value = []; // eslint-disable-line
+
+ for (var i = 0; i < length; i++) {
+ // eslint-disable-line
+ var loopResult = coder.decode(data, offset);
+ consumed += loopResult.consumed;
+ offset += loopResult.consumed;
+ value.push(loopResult.value);
+ }
+
+ return {
+ consumed: consumed,
+ value: value
+ };
+ },
+ dynamic: lengthInput === -1
+ };
+}
+
+// Break the type up into [staticType][staticArray]*[dynamicArray]? | [dynamicType] and
+// build the coder up from its parts
+var paramTypePart = new RegExp(/^((u?int|bytes)([0-9]*)|(address|bool|string)|(\[([0-9]*)\]))/);
+
+function getParamCoder(typeInput) {
+ var type = typeInput; // eslint-disable-line
+ var coder = null; // eslint-disable-line
+ var invalidTypeErrorMessage = '[ethjs-abi] while getting param coder (getParamCoder) type value ' + JSON.stringify(type) + ' is either invalid or unsupported by ethjs-abi.';
+
+ while (type) {
+ var part = type.match(paramTypePart); // eslint-disable-line
+ if (!part) {
+ throw new Error(invalidTypeErrorMessage);
+ }
+ type = type.substring(part[0].length);
+
+ var prefix = part[2] || part[4] || part[5]; // eslint-disable-line
+ switch (prefix) {
+ case 'int':case 'uint':
+ if (coder) {
+ throw new Error(invalidTypeErrorMessage);
+ }
+ var intSize = parseInt(part[3] || 256); // eslint-disable-line
+ if (intSize === 0 || intSize > 256 || intSize % 8 !== 0) {
+ throw new Error('[ethjs-abi] while getting param coder for type ' + type + ', invalid ' + prefix + ' width: ' + type);
+ }
+
+ coder = coderNumber(intSize / 8, prefix === 'int');
+ break;
+
+ case 'bool':
+ if (coder) {
+ throw new Error(invalidTypeErrorMessage);
+ }
+ coder = coderBoolean;
+ break;
+
+ case 'string':
+ if (coder) {
+ throw new Error(invalidTypeErrorMessage);
+ }
+ coder = coderString;
+ break;
+
+ case 'bytes':
+ if (coder) {
+ throw new Error(invalidTypeErrorMessage);
+ }
+ if (part[3]) {
+ var size = parseInt(part[3]); // eslint-disable-line
+ if (size === 0 || size > 32) {
+ throw new Error('[ethjs-abi] while getting param coder for prefix bytes, invalid type ' + type + ', size ' + size + ' should be 0 or greater than 32');
+ }
+ coder = coderFixedBytes(size);
+ } else {
+ coder = coderDynamicBytes;
+ }
+ break;
+
+ case 'address':
+ if (coder) {
+ throw new Error(invalidTypeErrorMessage);
+ }
+ coder = coderAddress;
+ break;
+
+ case '[]':
+ if (!coder || coder.dynamic) {
+ throw new Error(invalidTypeErrorMessage);
+ }
+ coder = coderArray(coder, -1);
+ break;
+
+ // "[0-9+]"
+ default:
+ if (!coder || coder.dynamic) {
+ throw new Error(invalidTypeErrorMessage);
+ }
+ var defaultSize = parseInt(part[6]); // eslint-disable-line
+ coder = coderArray(coder, defaultSize);
+ }
+ }
+
+ if (!coder) {
+ throw new Error(invalidTypeErrorMessage);
+ }
+ return coder;
+}
+
+module.exports = {
+ BN: BN,
+ bnToBuffer: bnToBuffer,
+ isHexString: isHexString,
+ hexOrBuffer: hexOrBuffer,
+ hexlify: hexlify,
+ stripZeros: stripZeros,
+
+ keccak256: keccak256,
+
+ getKeys: getKeys,
+ numberToBN: numberToBN,
+ coderNumber: coderNumber,
+ uint256Coder: uint256Coder,
+ coderBoolean: coderBoolean,
+ coderFixedBytes: coderFixedBytes,
+ coderAddress: coderAddress,
+ coderDynamicBytes: coderDynamicBytes,
+ coderString: coderString,
+ coderArray: coderArray,
+ paramTypePart: paramTypePart,
+ getParamCoder: getParamCoder
+};
+}).call(this)}).call(this,require("buffer").Buffer)
+},{"bn.js":126,"buffer":120,"js-sha3":160,"number-to-bn":163}],126:[function(require,module,exports){
+(function (module, exports) {
+ 'use strict';
+
+ // Utils
+ function assert (val, msg) {
+ if (!val) throw new Error(msg || 'Assertion failed');
+ }
+
+ // Could use `inherits` module, but don't want to move from single file
+ // architecture yet.
+ function inherits (ctor, superCtor) {
+ ctor.super_ = superCtor;
+ var TempCtor = function () {};
+ TempCtor.prototype = superCtor.prototype;
+ ctor.prototype = new TempCtor();
+ ctor.prototype.constructor = ctor;
+ }
+
+ // BN
+
+ function BN (number, base, endian) {
+ if (BN.isBN(number)) {
+ return number;
+ }
+
+ this.negative = 0;
+ this.words = null;
+ this.length = 0;
+
+ // Reduction context
+ this.red = null;
+
+ if (number !== null) {
+ if (base === 'le' || base === 'be') {
+ endian = base;
+ base = 10;
+ }
+
+ this._init(number || 0, base || 10, endian || 'be');
+ }
+ }
+ if (typeof module === 'object') {
+ module.exports = BN;
+ } else {
+ exports.BN = BN;
+ }
+
+ BN.BN = BN;
+ BN.wordSize = 26;
+
+ var Buffer;
+ try {
+ Buffer = require('buf' + 'fer').Buffer;
+ } catch (e) {
+ }
+
+ BN.isBN = function isBN (num) {
+ if (num instanceof BN) {
+ return true;
+ }
+
+ return num !== null && typeof num === 'object' &&
+ num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);
+ };
+
+ BN.max = function max (left, right) {
+ if (left.cmp(right) > 0) return left;
+ return right;
+ };
+
+ BN.min = function min (left, right) {
+ if (left.cmp(right) < 0) return left;
+ return right;
+ };
+
+ BN.prototype._init = function init (number, base, endian) {
+ if (typeof number === 'number') {
+ return this._initNumber(number, base, endian);
+ }
+
+ if (typeof number === 'object') {
+ return this._initArray(number, base, endian);
+ }
+
+ if (base === 'hex') {
+ base = 16;
+ }
+ assert(base === (base | 0) && base >= 2 && base <= 36);
+
+ number = number.toString().replace(/\s+/g, '');
+ var start = 0;
+ if (number[0] === '-') {
+ start++;
+ }
+
+ if (base === 16) {
+ this._parseHex(number, start);
+ } else {
+ this._parseBase(number, base, start);
+ }
+
+ if (number[0] === '-') {
+ this.negative = 1;
+ }
+
+ this.strip();
+
+ if (endian !== 'le') return;
+
+ this._initArray(this.toArray(), base, endian);
+ };
+
+ BN.prototype._initNumber = function _initNumber (number, base, endian) {
+ if (number < 0) {
+ this.negative = 1;
+ number = -number;
+ }
+ if (number < 0x4000000) {
+ this.words = [ number & 0x3ffffff ];
+ this.length = 1;
+ } else if (number < 0x10000000000000) {
+ this.words = [
+ number & 0x3ffffff,
+ (number / 0x4000000) & 0x3ffffff
+ ];
+ this.length = 2;
+ } else {
+ assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)
+ this.words = [
+ number & 0x3ffffff,
+ (number / 0x4000000) & 0x3ffffff,
+ 1
+ ];
+ this.length = 3;
+ }
+
+ if (endian !== 'le') return;
+
+ // Reverse the bytes
+ this._initArray(this.toArray(), base, endian);
+ };
+
+ BN.prototype._initArray = function _initArray (number, base, endian) {
+ // Perhaps a Uint8Array
+ assert(typeof number.length === 'number');
+ if (number.length <= 0) {
+ this.words = [ 0 ];
+ this.length = 1;
+ return this;
+ }
+
+ this.length = Math.ceil(number.length / 3);
+ this.words = new Array(this.length);
+ for (var i = 0; i < this.length; i++) {
+ this.words[i] = 0;
+ }
+
+ var j, w;
+ var off = 0;
+ if (endian === 'be') {
+ for (i = number.length - 1, j = 0; i >= 0; i -= 3) {
+ w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);
+ this.words[j] |= (w << off) & 0x3ffffff;
+ this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
+ off += 24;
+ if (off >= 26) {
+ off -= 26;
+ j++;
+ }
+ }
+ } else if (endian === 'le') {
+ for (i = 0, j = 0; i < number.length; i += 3) {
+ w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);
+ this.words[j] |= (w << off) & 0x3ffffff;
+ this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;
+ off += 24;
+ if (off >= 26) {
+ off -= 26;
+ j++;
+ }
+ }
+ }
+ return this.strip();
+ };
+
+ function parseHex (str, start, end) {
+ var r = 0;
+ var len = Math.min(str.length, end);
+ for (var i = start; i < len; i++) {
+ var c = str.charCodeAt(i) - 48;
+
+ r <<= 4;
+
+ // 'a' - 'f'
+ if (c >= 49 && c <= 54) {
+ r |= c - 49 + 0xa;
+
+ // 'A' - 'F'
+ } else if (c >= 17 && c <= 22) {
+ r |= c - 17 + 0xa;
+
+ // '0' - '9'
+ } else {
+ r |= c & 0xf;
+ }
+ }
+ return r;
+ }
+
+ BN.prototype._parseHex = function _parseHex (number, start) {
+ // Create possibly bigger array to ensure that it fits the number
+ this.length = Math.ceil((number.length - start) / 6);
+ this.words = new Array(this.length);
+ for (var i = 0; i < this.length; i++) {
+ this.words[i] = 0;
+ }
+
+ var j, w;
+ // Scan 24-bit chunks and add them to the number
+ var off = 0;
+ for (i = number.length - 6, j = 0; i >= start; i -= 6) {
+ w = parseHex(number, i, i + 6);
+ this.words[j] |= (w << off) & 0x3ffffff;
+ // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb
+ this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;
+ off += 24;
+ if (off >= 26) {
+ off -= 26;
+ j++;
+ }
+ }
+ if (i + 6 !== start) {
+ w = parseHex(number, start, i + 6);
+ this.words[j] |= (w << off) & 0x3ffffff;
+ this.words[j + 1] |= w >>> (26 - off) & 0x3fffff;
+ }
+ this.strip();
+ };
+
+ function parseBase (str, start, end, mul) {
+ var r = 0;
+ var len = Math.min(str.length, end);
+ for (var i = start; i < len; i++) {
+ var c = str.charCodeAt(i) - 48;
+
+ r *= mul;
+
+ // 'a'
+ if (c >= 49) {
+ r += c - 49 + 0xa;
+
+ // 'A'
+ } else if (c >= 17) {
+ r += c - 17 + 0xa;
+
+ // '0' - '9'
+ } else {
+ r += c;
+ }
+ }
+ return r;
+ }
+
+ BN.prototype._parseBase = function _parseBase (number, base, start) {
+ // Initialize as zero
+ this.words = [ 0 ];
+ this.length = 1;
+
+ // Find length of limb in base
+ for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {
+ limbLen++;
+ }
+ limbLen--;
+ limbPow = (limbPow / base) | 0;
+
+ var total = number.length - start;
+ var mod = total % limbLen;
+ var end = Math.min(total, total - mod) + start;
+
+ var word = 0;
+ for (var i = start; i < end; i += limbLen) {
+ word = parseBase(number, i, i + limbLen, base);
+
+ this.imuln(limbPow);
+ if (this.words[0] + word < 0x4000000) {
+ this.words[0] += word;
+ } else {
+ this._iaddn(word);
+ }
+ }
+
+ if (mod !== 0) {
+ var pow = 1;
+ word = parseBase(number, i, number.length, base);
+
+ for (i = 0; i < mod; i++) {
+ pow *= base;
+ }
+
+ this.imuln(pow);
+ if (this.words[0] + word < 0x4000000) {
+ this.words[0] += word;
+ } else {
+ this._iaddn(word);
+ }
+ }
+ };
+
+ BN.prototype.copy = function copy (dest) {
+ dest.words = new Array(this.length);
+ for (var i = 0; i < this.length; i++) {
+ dest.words[i] = this.words[i];
+ }
+ dest.length = this.length;
+ dest.negative = this.negative;
+ dest.red = this.red;
+ };
+
+ BN.prototype.clone = function clone () {
+ var r = new BN(null);
+ this.copy(r);
+ return r;
+ };
+
+ BN.prototype._expand = function _expand (size) {
+ while (this.length < size) {
+ this.words[this.length++] = 0;
+ }
+ return this;
+ };
+
+ // Remove leading `0` from `this`
+ BN.prototype.strip = function strip () {
+ while (this.length > 1 && this.words[this.length - 1] === 0) {
+ this.length--;
+ }
+ return this._normSign();
+ };
+
+ BN.prototype._normSign = function _normSign () {
+ // -0 = 0
+ if (this.length === 1 && this.words[0] === 0) {
+ this.negative = 0;
+ }
+ return this;
+ };
+
+ BN.prototype.inspect = function inspect () {
+ return (this.red ? '';
+ };
+
+ /*
+
+ var zeros = [];
+ var groupSizes = [];
+ var groupBases = [];
+
+ var s = '';
+ var i = -1;
+ while (++i < BN.wordSize) {
+ zeros[i] = s;
+ s += '0';
+ }
+ groupSizes[0] = 0;
+ groupSizes[1] = 0;
+ groupBases[0] = 0;
+ groupBases[1] = 0;
+ var base = 2 - 1;
+ while (++base < 36 + 1) {
+ var groupSize = 0;
+ var groupBase = 1;
+ while (groupBase < (1 << BN.wordSize) / base) {
+ groupBase *= base;
+ groupSize += 1;
+ }
+ groupSizes[base] = groupSize;
+ groupBases[base] = groupBase;
+ }
+
+ */
+
+ var zeros = [
+ '',
+ '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'
+ ];
+
+ var groupSizes = [
+ 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
+ ];
+
+ var groupBases = [
+ 0, 0,
+ 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,
+ 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,
+ 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,
+ 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,
+ 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176
+ ];
+
+ BN.prototype.toString = function toString (base, padding) {
+ base = base || 10;
+ padding = padding | 0 || 1;
+
+ var out;
+ if (base === 16 || base === 'hex') {
+ out = '';
+ var off = 0;
+ var carry = 0;
+ for (var i = 0; i < this.length; i++) {
+ var w = this.words[i];
+ var word = (((w << off) | carry) & 0xffffff).toString(16);
+ carry = (w >>> (24 - off)) & 0xffffff;
+ if (carry !== 0 || i !== this.length - 1) {
+ out = zeros[6 - word.length] + word + out;
+ } else {
+ out = word + out;
+ }
+ off += 2;
+ if (off >= 26) {
+ off -= 26;
+ i--;
+ }
+ }
+ if (carry !== 0) {
+ out = carry.toString(16) + out;
+ }
+ while (out.length % padding !== 0) {
+ out = '0' + out;
+ }
+ if (this.negative !== 0) {
+ out = '-' + out;
+ }
+ return out;
+ }
+
+ if (base === (base | 0) && base >= 2 && base <= 36) {
+ // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));
+ var groupSize = groupSizes[base];
+ // var groupBase = Math.pow(base, groupSize);
+ var groupBase = groupBases[base];
+ out = '';
+ var c = this.clone();
+ c.negative = 0;
+ while (!c.isZero()) {
+ var r = c.modn(groupBase).toString(base);
+ c = c.idivn(groupBase);
+
+ if (!c.isZero()) {
+ out = zeros[groupSize - r.length] + r + out;
+ } else {
+ out = r + out;
+ }
+ }
+ if (this.isZero()) {
+ out = '0' + out;
+ }
+ while (out.length % padding !== 0) {
+ out = '0' + out;
+ }
+ if (this.negative !== 0) {
+ out = '-' + out;
+ }
+ return out;
+ }
+
+ assert(false, 'Base should be between 2 and 36');
+ };
+
+ BN.prototype.toNumber = function toNumber () {
+ var ret = this.words[0];
+ if (this.length === 2) {
+ ret += this.words[1] * 0x4000000;
+ } else if (this.length === 3 && this.words[2] === 0x01) {
+ // NOTE: at this stage it is known that the top bit is set
+ ret += 0x10000000000000 + (this.words[1] * 0x4000000);
+ } else if (this.length > 2) {
+ assert(false, 'Number can only safely store up to 53 bits');
+ }
+ return (this.negative !== 0) ? -ret : ret;
+ };
+
+ BN.prototype.toJSON = function toJSON () {
+ return this.toString(16);
+ };
+
+ BN.prototype.toBuffer = function toBuffer (endian, length) {
+ assert(typeof Buffer !== 'undefined');
+ return this.toArrayLike(Buffer, endian, length);
+ };
+
+ BN.prototype.toArray = function toArray (endian, length) {
+ return this.toArrayLike(Array, endian, length);
+ };
+
+ BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {
+ var byteLength = this.byteLength();
+ var reqLength = length || Math.max(1, byteLength);
+ assert(byteLength <= reqLength, 'byte array longer than desired length');
+ assert(reqLength > 0, 'Requested array length <= 0');
+
+ this.strip();
+ var littleEndian = endian === 'le';
+ var res = new ArrayType(reqLength);
+
+ var b, i;
+ var q = this.clone();
+ if (!littleEndian) {
+ // Assume big-endian
+ for (i = 0; i < reqLength - byteLength; i++) {
+ res[i] = 0;
+ }
+
+ for (i = 0; !q.isZero(); i++) {
+ b = q.andln(0xff);
+ q.iushrn(8);
+
+ res[reqLength - i - 1] = b;
+ }
+ } else {
+ for (i = 0; !q.isZero(); i++) {
+ b = q.andln(0xff);
+ q.iushrn(8);
+
+ res[i] = b;
+ }
+
+ for (; i < reqLength; i++) {
+ res[i] = 0;
+ }
+ }
+
+ return res;
+ };
+
+ if (Math.clz32) {
+ BN.prototype._countBits = function _countBits (w) {
+ return 32 - Math.clz32(w);
+ };
+ } else {
+ BN.prototype._countBits = function _countBits (w) {
+ var t = w;
+ var r = 0;
+ if (t >= 0x1000) {
+ r += 13;
+ t >>>= 13;
+ }
+ if (t >= 0x40) {
+ r += 7;
+ t >>>= 7;
+ }
+ if (t >= 0x8) {
+ r += 4;
+ t >>>= 4;
+ }
+ if (t >= 0x02) {
+ r += 2;
+ t >>>= 2;
+ }
+ return r + t;
+ };
+ }
+
+ BN.prototype._zeroBits = function _zeroBits (w) {
+ // Short-cut
+ if (w === 0) return 26;
+
+ var t = w;
+ var r = 0;
+ if ((t & 0x1fff) === 0) {
+ r += 13;
+ t >>>= 13;
+ }
+ if ((t & 0x7f) === 0) {
+ r += 7;
+ t >>>= 7;
+ }
+ if ((t & 0xf) === 0) {
+ r += 4;
+ t >>>= 4;
+ }
+ if ((t & 0x3) === 0) {
+ r += 2;
+ t >>>= 2;
+ }
+ if ((t & 0x1) === 0) {
+ r++;
+ }
+ return r;
+ };
+
+ // Return number of used bits in a BN
+ BN.prototype.bitLength = function bitLength () {
+ var w = this.words[this.length - 1];
+ var hi = this._countBits(w);
+ return (this.length - 1) * 26 + hi;
+ };
+
+ function toBitArray (num) {
+ var w = new Array(num.bitLength());
+
+ for (var bit = 0; bit < w.length; bit++) {
+ var off = (bit / 26) | 0;
+ var wbit = bit % 26;
+
+ w[bit] = (num.words[off] & (1 << wbit)) >>> wbit;
+ }
+
+ return w;
+ }
+
+ // Number of trailing zero bits
+ BN.prototype.zeroBits = function zeroBits () {
+ if (this.isZero()) return 0;
+
+ var r = 0;
+ for (var i = 0; i < this.length; i++) {
+ var b = this._zeroBits(this.words[i]);
+ r += b;
+ if (b !== 26) break;
+ }
+ return r;
+ };
+
+ BN.prototype.byteLength = function byteLength () {
+ return Math.ceil(this.bitLength() / 8);
+ };
+
+ BN.prototype.toTwos = function toTwos (width) {
+ if (this.negative !== 0) {
+ return this.abs().inotn(width).iaddn(1);
+ }
+ return this.clone();
+ };
+
+ BN.prototype.fromTwos = function fromTwos (width) {
+ if (this.testn(width - 1)) {
+ return this.notn(width).iaddn(1).ineg();
+ }
+ return this.clone();
+ };
+
+ BN.prototype.isNeg = function isNeg () {
+ return this.negative !== 0;
+ };
+
+ // Return negative clone of `this`
+ BN.prototype.neg = function neg () {
+ return this.clone().ineg();
+ };
+
+ BN.prototype.ineg = function ineg () {
+ if (!this.isZero()) {
+ this.negative ^= 1;
+ }
+
+ return this;
+ };
+
+ // Or `num` with `this` in-place
+ BN.prototype.iuor = function iuor (num) {
+ while (this.length < num.length) {
+ this.words[this.length++] = 0;
+ }
+
+ for (var i = 0; i < num.length; i++) {
+ this.words[i] = this.words[i] | num.words[i];
+ }
+
+ return this.strip();
+ };
+
+ BN.prototype.ior = function ior (num) {
+ assert((this.negative | num.negative) === 0);
+ return this.iuor(num);
+ };
+
+ // Or `num` with `this`
+ BN.prototype.or = function or (num) {
+ if (this.length > num.length) return this.clone().ior(num);
+ return num.clone().ior(this);
+ };
+
+ BN.prototype.uor = function uor (num) {
+ if (this.length > num.length) return this.clone().iuor(num);
+ return num.clone().iuor(this);
+ };
+
+ // And `num` with `this` in-place
+ BN.prototype.iuand = function iuand (num) {
+ // b = min-length(num, this)
+ var b;
+ if (this.length > num.length) {
+ b = num;
+ } else {
+ b = this;
+ }
+
+ for (var i = 0; i < b.length; i++) {
+ this.words[i] = this.words[i] & num.words[i];
+ }
+
+ this.length = b.length;
+
+ return this.strip();
+ };
+
+ BN.prototype.iand = function iand (num) {
+ assert((this.negative | num.negative) === 0);
+ return this.iuand(num);
+ };
+
+ // And `num` with `this`
+ BN.prototype.and = function and (num) {
+ if (this.length > num.length) return this.clone().iand(num);
+ return num.clone().iand(this);
+ };
+
+ BN.prototype.uand = function uand (num) {
+ if (this.length > num.length) return this.clone().iuand(num);
+ return num.clone().iuand(this);
+ };
+
+ // Xor `num` with `this` in-place
+ BN.prototype.iuxor = function iuxor (num) {
+ // a.length > b.length
+ var a;
+ var b;
+ if (this.length > num.length) {
+ a = this;
+ b = num;
+ } else {
+ a = num;
+ b = this;
+ }
+
+ for (var i = 0; i < b.length; i++) {
+ this.words[i] = a.words[i] ^ b.words[i];
+ }
+
+ if (this !== a) {
+ for (; i < a.length; i++) {
+ this.words[i] = a.words[i];
+ }
+ }
+
+ this.length = a.length;
+
+ return this.strip();
+ };
+
+ BN.prototype.ixor = function ixor (num) {
+ assert((this.negative | num.negative) === 0);
+ return this.iuxor(num);
+ };
+
+ // Xor `num` with `this`
+ BN.prototype.xor = function xor (num) {
+ if (this.length > num.length) return this.clone().ixor(num);
+ return num.clone().ixor(this);
+ };
+
+ BN.prototype.uxor = function uxor (num) {
+ if (this.length > num.length) return this.clone().iuxor(num);
+ return num.clone().iuxor(this);
+ };
+
+ // Not ``this`` with ``width`` bitwidth
+ BN.prototype.inotn = function inotn (width) {
+ assert(typeof width === 'number' && width >= 0);
+
+ var bytesNeeded = Math.ceil(width / 26) | 0;
+ var bitsLeft = width % 26;
+
+ // Extend the buffer with leading zeroes
+ this._expand(bytesNeeded);
+
+ if (bitsLeft > 0) {
+ bytesNeeded--;
+ }
+
+ // Handle complete words
+ for (var i = 0; i < bytesNeeded; i++) {
+ this.words[i] = ~this.words[i] & 0x3ffffff;
+ }
+
+ // Handle the residue
+ if (bitsLeft > 0) {
+ this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));
+ }
+
+ // And remove leading zeroes
+ return this.strip();
+ };
+
+ BN.prototype.notn = function notn (width) {
+ return this.clone().inotn(width);
+ };
+
+ // Set `bit` of `this`
+ BN.prototype.setn = function setn (bit, val) {
+ assert(typeof bit === 'number' && bit >= 0);
+
+ var off = (bit / 26) | 0;
+ var wbit = bit % 26;
+
+ this._expand(off + 1);
+
+ if (val) {
+ this.words[off] = this.words[off] | (1 << wbit);
+ } else {
+ this.words[off] = this.words[off] & ~(1 << wbit);
+ }
+
+ return this.strip();
+ };
+
+ // Add `num` to `this` in-place
+ BN.prototype.iadd = function iadd (num) {
+ var r;
+
+ // negative + positive
+ if (this.negative !== 0 && num.negative === 0) {
+ this.negative = 0;
+ r = this.isub(num);
+ this.negative ^= 1;
+ return this._normSign();
+
+ // positive + negative
+ } else if (this.negative === 0 && num.negative !== 0) {
+ num.negative = 0;
+ r = this.isub(num);
+ num.negative = 1;
+ return r._normSign();
+ }
+
+ // a.length > b.length
+ var a, b;
+ if (this.length > num.length) {
+ a = this;
+ b = num;
+ } else {
+ a = num;
+ b = this;
+ }
+
+ var carry = 0;
+ for (var i = 0; i < b.length; i++) {
+ r = (a.words[i] | 0) + (b.words[i] | 0) + carry;
+ this.words[i] = r & 0x3ffffff;
+ carry = r >>> 26;
+ }
+ for (; carry !== 0 && i < a.length; i++) {
+ r = (a.words[i] | 0) + carry;
+ this.words[i] = r & 0x3ffffff;
+ carry = r >>> 26;
+ }
+
+ this.length = a.length;
+ if (carry !== 0) {
+ this.words[this.length] = carry;
+ this.length++;
+ // Copy the rest of the words
+ } else if (a !== this) {
+ for (; i < a.length; i++) {
+ this.words[i] = a.words[i];
+ }
+ }
+
+ return this;
+ };
+
+ // Add `num` to `this`
+ BN.prototype.add = function add (num) {
+ var res;
+ if (num.negative !== 0 && this.negative === 0) {
+ num.negative = 0;
+ res = this.sub(num);
+ num.negative ^= 1;
+ return res;
+ } else if (num.negative === 0 && this.negative !== 0) {
+ this.negative = 0;
+ res = num.sub(this);
+ this.negative = 1;
+ return res;
+ }
+
+ if (this.length > num.length) return this.clone().iadd(num);
+
+ return num.clone().iadd(this);
+ };
+
+ // Subtract `num` from `this` in-place
+ BN.prototype.isub = function isub (num) {
+ // this - (-num) = this + num
+ if (num.negative !== 0) {
+ num.negative = 0;
+ var r = this.iadd(num);
+ num.negative = 1;
+ return r._normSign();
+
+ // -this - num = -(this + num)
+ } else if (this.negative !== 0) {
+ this.negative = 0;
+ this.iadd(num);
+ this.negative = 1;
+ return this._normSign();
+ }
+
+ // At this point both numbers are positive
+ var cmp = this.cmp(num);
+
+ // Optimization - zeroify
+ if (cmp === 0) {
+ this.negative = 0;
+ this.length = 1;
+ this.words[0] = 0;
+ return this;
+ }
+
+ // a > b
+ var a, b;
+ if (cmp > 0) {
+ a = this;
+ b = num;
+ } else {
+ a = num;
+ b = this;
+ }
+
+ var carry = 0;
+ for (var i = 0; i < b.length; i++) {
+ r = (a.words[i] | 0) - (b.words[i] | 0) + carry;
+ carry = r >> 26;
+ this.words[i] = r & 0x3ffffff;
+ }
+ for (; carry !== 0 && i < a.length; i++) {
+ r = (a.words[i] | 0) + carry;
+ carry = r >> 26;
+ this.words[i] = r & 0x3ffffff;
+ }
+
+ // Copy rest of the words
+ if (carry === 0 && i < a.length && a !== this) {
+ for (; i < a.length; i++) {
+ this.words[i] = a.words[i];
+ }
+ }
+
+ this.length = Math.max(this.length, i);
+
+ if (a !== this) {
+ this.negative = 1;
+ }
+
+ return this.strip();
+ };
+
+ // Subtract `num` from `this`
+ BN.prototype.sub = function sub (num) {
+ return this.clone().isub(num);
+ };
+
+ function smallMulTo (self, num, out) {
+ out.negative = num.negative ^ self.negative;
+ var len = (self.length + num.length) | 0;
+ out.length = len;
+ len = (len - 1) | 0;
+
+ // Peel one iteration (compiler can't do it, because of code complexity)
+ var a = self.words[0] | 0;
+ var b = num.words[0] | 0;
+ var r = a * b;
+
+ var lo = r & 0x3ffffff;
+ var carry = (r / 0x4000000) | 0;
+ out.words[0] = lo;
+
+ for (var k = 1; k < len; k++) {
+ // Sum all words with the same `i + j = k` and accumulate `ncarry`,
+ // note that ncarry could be >= 0x3ffffff
+ var ncarry = carry >>> 26;
+ var rword = carry & 0x3ffffff;
+ var maxJ = Math.min(k, num.length - 1);
+ for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
+ var i = (k - j) | 0;
+ a = self.words[i] | 0;
+ b = num.words[j] | 0;
+ r = a * b + rword;
+ ncarry += (r / 0x4000000) | 0;
+ rword = r & 0x3ffffff;
+ }
+ out.words[k] = rword | 0;
+ carry = ncarry | 0;
+ }
+ if (carry !== 0) {
+ out.words[k] = carry | 0;
+ } else {
+ out.length--;
+ }
+
+ return out.strip();
+ }
+
+ // TODO(indutny): it may be reasonable to omit it for users who don't need
+ // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit
+ // multiplication (like elliptic secp256k1).
+ var comb10MulTo = function comb10MulTo (self, num, out) {
+ var a = self.words;
+ var b = num.words;
+ var o = out.words;
+ var c = 0;
+ var lo;
+ var mid;
+ var hi;
+ var a0 = a[0] | 0;
+ var al0 = a0 & 0x1fff;
+ var ah0 = a0 >>> 13;
+ var a1 = a[1] | 0;
+ var al1 = a1 & 0x1fff;
+ var ah1 = a1 >>> 13;
+ var a2 = a[2] | 0;
+ var al2 = a2 & 0x1fff;
+ var ah2 = a2 >>> 13;
+ var a3 = a[3] | 0;
+ var al3 = a3 & 0x1fff;
+ var ah3 = a3 >>> 13;
+ var a4 = a[4] | 0;
+ var al4 = a4 & 0x1fff;
+ var ah4 = a4 >>> 13;
+ var a5 = a[5] | 0;
+ var al5 = a5 & 0x1fff;
+ var ah5 = a5 >>> 13;
+ var a6 = a[6] | 0;
+ var al6 = a6 & 0x1fff;
+ var ah6 = a6 >>> 13;
+ var a7 = a[7] | 0;
+ var al7 = a7 & 0x1fff;
+ var ah7 = a7 >>> 13;
+ var a8 = a[8] | 0;
+ var al8 = a8 & 0x1fff;
+ var ah8 = a8 >>> 13;
+ var a9 = a[9] | 0;
+ var al9 = a9 & 0x1fff;
+ var ah9 = a9 >>> 13;
+ var b0 = b[0] | 0;
+ var bl0 = b0 & 0x1fff;
+ var bh0 = b0 >>> 13;
+ var b1 = b[1] | 0;
+ var bl1 = b1 & 0x1fff;
+ var bh1 = b1 >>> 13;
+ var b2 = b[2] | 0;
+ var bl2 = b2 & 0x1fff;
+ var bh2 = b2 >>> 13;
+ var b3 = b[3] | 0;
+ var bl3 = b3 & 0x1fff;
+ var bh3 = b3 >>> 13;
+ var b4 = b[4] | 0;
+ var bl4 = b4 & 0x1fff;
+ var bh4 = b4 >>> 13;
+ var b5 = b[5] | 0;
+ var bl5 = b5 & 0x1fff;
+ var bh5 = b5 >>> 13;
+ var b6 = b[6] | 0;
+ var bl6 = b6 & 0x1fff;
+ var bh6 = b6 >>> 13;
+ var b7 = b[7] | 0;
+ var bl7 = b7 & 0x1fff;
+ var bh7 = b7 >>> 13;
+ var b8 = b[8] | 0;
+ var bl8 = b8 & 0x1fff;
+ var bh8 = b8 >>> 13;
+ var b9 = b[9] | 0;
+ var bl9 = b9 & 0x1fff;
+ var bh9 = b9 >>> 13;
+
+ out.negative = self.negative ^ num.negative;
+ out.length = 19;
+ /* k = 0 */
+ lo = Math.imul(al0, bl0);
+ mid = Math.imul(al0, bh0);
+ mid = (mid + Math.imul(ah0, bl0)) | 0;
+ hi = Math.imul(ah0, bh0);
+ var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;
+ w0 &= 0x3ffffff;
+ /* k = 1 */
+ lo = Math.imul(al1, bl0);
+ mid = Math.imul(al1, bh0);
+ mid = (mid + Math.imul(ah1, bl0)) | 0;
+ hi = Math.imul(ah1, bh0);
+ lo = (lo + Math.imul(al0, bl1)) | 0;
+ mid = (mid + Math.imul(al0, bh1)) | 0;
+ mid = (mid + Math.imul(ah0, bl1)) | 0;
+ hi = (hi + Math.imul(ah0, bh1)) | 0;
+ var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;
+ w1 &= 0x3ffffff;
+ /* k = 2 */
+ lo = Math.imul(al2, bl0);
+ mid = Math.imul(al2, bh0);
+ mid = (mid + Math.imul(ah2, bl0)) | 0;
+ hi = Math.imul(ah2, bh0);
+ lo = (lo + Math.imul(al1, bl1)) | 0;
+ mid = (mid + Math.imul(al1, bh1)) | 0;
+ mid = (mid + Math.imul(ah1, bl1)) | 0;
+ hi = (hi + Math.imul(ah1, bh1)) | 0;
+ lo = (lo + Math.imul(al0, bl2)) | 0;
+ mid = (mid + Math.imul(al0, bh2)) | 0;
+ mid = (mid + Math.imul(ah0, bl2)) | 0;
+ hi = (hi + Math.imul(ah0, bh2)) | 0;
+ var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;
+ w2 &= 0x3ffffff;
+ /* k = 3 */
+ lo = Math.imul(al3, bl0);
+ mid = Math.imul(al3, bh0);
+ mid = (mid + Math.imul(ah3, bl0)) | 0;
+ hi = Math.imul(ah3, bh0);
+ lo = (lo + Math.imul(al2, bl1)) | 0;
+ mid = (mid + Math.imul(al2, bh1)) | 0;
+ mid = (mid + Math.imul(ah2, bl1)) | 0;
+ hi = (hi + Math.imul(ah2, bh1)) | 0;
+ lo = (lo + Math.imul(al1, bl2)) | 0;
+ mid = (mid + Math.imul(al1, bh2)) | 0;
+ mid = (mid + Math.imul(ah1, bl2)) | 0;
+ hi = (hi + Math.imul(ah1, bh2)) | 0;
+ lo = (lo + Math.imul(al0, bl3)) | 0;
+ mid = (mid + Math.imul(al0, bh3)) | 0;
+ mid = (mid + Math.imul(ah0, bl3)) | 0;
+ hi = (hi + Math.imul(ah0, bh3)) | 0;
+ var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;
+ w3 &= 0x3ffffff;
+ /* k = 4 */
+ lo = Math.imul(al4, bl0);
+ mid = Math.imul(al4, bh0);
+ mid = (mid + Math.imul(ah4, bl0)) | 0;
+ hi = Math.imul(ah4, bh0);
+ lo = (lo + Math.imul(al3, bl1)) | 0;
+ mid = (mid + Math.imul(al3, bh1)) | 0;
+ mid = (mid + Math.imul(ah3, bl1)) | 0;
+ hi = (hi + Math.imul(ah3, bh1)) | 0;
+ lo = (lo + Math.imul(al2, bl2)) | 0;
+ mid = (mid + Math.imul(al2, bh2)) | 0;
+ mid = (mid + Math.imul(ah2, bl2)) | 0;
+ hi = (hi + Math.imul(ah2, bh2)) | 0;
+ lo = (lo + Math.imul(al1, bl3)) | 0;
+ mid = (mid + Math.imul(al1, bh3)) | 0;
+ mid = (mid + Math.imul(ah1, bl3)) | 0;
+ hi = (hi + Math.imul(ah1, bh3)) | 0;
+ lo = (lo + Math.imul(al0, bl4)) | 0;
+ mid = (mid + Math.imul(al0, bh4)) | 0;
+ mid = (mid + Math.imul(ah0, bl4)) | 0;
+ hi = (hi + Math.imul(ah0, bh4)) | 0;
+ var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;
+ w4 &= 0x3ffffff;
+ /* k = 5 */
+ lo = Math.imul(al5, bl0);
+ mid = Math.imul(al5, bh0);
+ mid = (mid + Math.imul(ah5, bl0)) | 0;
+ hi = Math.imul(ah5, bh0);
+ lo = (lo + Math.imul(al4, bl1)) | 0;
+ mid = (mid + Math.imul(al4, bh1)) | 0;
+ mid = (mid + Math.imul(ah4, bl1)) | 0;
+ hi = (hi + Math.imul(ah4, bh1)) | 0;
+ lo = (lo + Math.imul(al3, bl2)) | 0;
+ mid = (mid + Math.imul(al3, bh2)) | 0;
+ mid = (mid + Math.imul(ah3, bl2)) | 0;
+ hi = (hi + Math.imul(ah3, bh2)) | 0;
+ lo = (lo + Math.imul(al2, bl3)) | 0;
+ mid = (mid + Math.imul(al2, bh3)) | 0;
+ mid = (mid + Math.imul(ah2, bl3)) | 0;
+ hi = (hi + Math.imul(ah2, bh3)) | 0;
+ lo = (lo + Math.imul(al1, bl4)) | 0;
+ mid = (mid + Math.imul(al1, bh4)) | 0;
+ mid = (mid + Math.imul(ah1, bl4)) | 0;
+ hi = (hi + Math.imul(ah1, bh4)) | 0;
+ lo = (lo + Math.imul(al0, bl5)) | 0;
+ mid = (mid + Math.imul(al0, bh5)) | 0;
+ mid = (mid + Math.imul(ah0, bl5)) | 0;
+ hi = (hi + Math.imul(ah0, bh5)) | 0;
+ var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;
+ w5 &= 0x3ffffff;
+ /* k = 6 */
+ lo = Math.imul(al6, bl0);
+ mid = Math.imul(al6, bh0);
+ mid = (mid + Math.imul(ah6, bl0)) | 0;
+ hi = Math.imul(ah6, bh0);
+ lo = (lo + Math.imul(al5, bl1)) | 0;
+ mid = (mid + Math.imul(al5, bh1)) | 0;
+ mid = (mid + Math.imul(ah5, bl1)) | 0;
+ hi = (hi + Math.imul(ah5, bh1)) | 0;
+ lo = (lo + Math.imul(al4, bl2)) | 0;
+ mid = (mid + Math.imul(al4, bh2)) | 0;
+ mid = (mid + Math.imul(ah4, bl2)) | 0;
+ hi = (hi + Math.imul(ah4, bh2)) | 0;
+ lo = (lo + Math.imul(al3, bl3)) | 0;
+ mid = (mid + Math.imul(al3, bh3)) | 0;
+ mid = (mid + Math.imul(ah3, bl3)) | 0;
+ hi = (hi + Math.imul(ah3, bh3)) | 0;
+ lo = (lo + Math.imul(al2, bl4)) | 0;
+ mid = (mid + Math.imul(al2, bh4)) | 0;
+ mid = (mid + Math.imul(ah2, bl4)) | 0;
+ hi = (hi + Math.imul(ah2, bh4)) | 0;
+ lo = (lo + Math.imul(al1, bl5)) | 0;
+ mid = (mid + Math.imul(al1, bh5)) | 0;
+ mid = (mid + Math.imul(ah1, bl5)) | 0;
+ hi = (hi + Math.imul(ah1, bh5)) | 0;
+ lo = (lo + Math.imul(al0, bl6)) | 0;
+ mid = (mid + Math.imul(al0, bh6)) | 0;
+ mid = (mid + Math.imul(ah0, bl6)) | 0;
+ hi = (hi + Math.imul(ah0, bh6)) | 0;
+ var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;
+ w6 &= 0x3ffffff;
+ /* k = 7 */
+ lo = Math.imul(al7, bl0);
+ mid = Math.imul(al7, bh0);
+ mid = (mid + Math.imul(ah7, bl0)) | 0;
+ hi = Math.imul(ah7, bh0);
+ lo = (lo + Math.imul(al6, bl1)) | 0;
+ mid = (mid + Math.imul(al6, bh1)) | 0;
+ mid = (mid + Math.imul(ah6, bl1)) | 0;
+ hi = (hi + Math.imul(ah6, bh1)) | 0;
+ lo = (lo + Math.imul(al5, bl2)) | 0;
+ mid = (mid + Math.imul(al5, bh2)) | 0;
+ mid = (mid + Math.imul(ah5, bl2)) | 0;
+ hi = (hi + Math.imul(ah5, bh2)) | 0;
+ lo = (lo + Math.imul(al4, bl3)) | 0;
+ mid = (mid + Math.imul(al4, bh3)) | 0;
+ mid = (mid + Math.imul(ah4, bl3)) | 0;
+ hi = (hi + Math.imul(ah4, bh3)) | 0;
+ lo = (lo + Math.imul(al3, bl4)) | 0;
+ mid = (mid + Math.imul(al3, bh4)) | 0;
+ mid = (mid + Math.imul(ah3, bl4)) | 0;
+ hi = (hi + Math.imul(ah3, bh4)) | 0;
+ lo = (lo + Math.imul(al2, bl5)) | 0;
+ mid = (mid + Math.imul(al2, bh5)) | 0;
+ mid = (mid + Math.imul(ah2, bl5)) | 0;
+ hi = (hi + Math.imul(ah2, bh5)) | 0;
+ lo = (lo + Math.imul(al1, bl6)) | 0;
+ mid = (mid + Math.imul(al1, bh6)) | 0;
+ mid = (mid + Math.imul(ah1, bl6)) | 0;
+ hi = (hi + Math.imul(ah1, bh6)) | 0;
+ lo = (lo + Math.imul(al0, bl7)) | 0;
+ mid = (mid + Math.imul(al0, bh7)) | 0;
+ mid = (mid + Math.imul(ah0, bl7)) | 0;
+ hi = (hi + Math.imul(ah0, bh7)) | 0;
+ var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;
+ w7 &= 0x3ffffff;
+ /* k = 8 */
+ lo = Math.imul(al8, bl0);
+ mid = Math.imul(al8, bh0);
+ mid = (mid + Math.imul(ah8, bl0)) | 0;
+ hi = Math.imul(ah8, bh0);
+ lo = (lo + Math.imul(al7, bl1)) | 0;
+ mid = (mid + Math.imul(al7, bh1)) | 0;
+ mid = (mid + Math.imul(ah7, bl1)) | 0;
+ hi = (hi + Math.imul(ah7, bh1)) | 0;
+ lo = (lo + Math.imul(al6, bl2)) | 0;
+ mid = (mid + Math.imul(al6, bh2)) | 0;
+ mid = (mid + Math.imul(ah6, bl2)) | 0;
+ hi = (hi + Math.imul(ah6, bh2)) | 0;
+ lo = (lo + Math.imul(al5, bl3)) | 0;
+ mid = (mid + Math.imul(al5, bh3)) | 0;
+ mid = (mid + Math.imul(ah5, bl3)) | 0;
+ hi = (hi + Math.imul(ah5, bh3)) | 0;
+ lo = (lo + Math.imul(al4, bl4)) | 0;
+ mid = (mid + Math.imul(al4, bh4)) | 0;
+ mid = (mid + Math.imul(ah4, bl4)) | 0;
+ hi = (hi + Math.imul(ah4, bh4)) | 0;
+ lo = (lo + Math.imul(al3, bl5)) | 0;
+ mid = (mid + Math.imul(al3, bh5)) | 0;
+ mid = (mid + Math.imul(ah3, bl5)) | 0;
+ hi = (hi + Math.imul(ah3, bh5)) | 0;
+ lo = (lo + Math.imul(al2, bl6)) | 0;
+ mid = (mid + Math.imul(al2, bh6)) | 0;
+ mid = (mid + Math.imul(ah2, bl6)) | 0;
+ hi = (hi + Math.imul(ah2, bh6)) | 0;
+ lo = (lo + Math.imul(al1, bl7)) | 0;
+ mid = (mid + Math.imul(al1, bh7)) | 0;
+ mid = (mid + Math.imul(ah1, bl7)) | 0;
+ hi = (hi + Math.imul(ah1, bh7)) | 0;
+ lo = (lo + Math.imul(al0, bl8)) | 0;
+ mid = (mid + Math.imul(al0, bh8)) | 0;
+ mid = (mid + Math.imul(ah0, bl8)) | 0;
+ hi = (hi + Math.imul(ah0, bh8)) | 0;
+ var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;
+ w8 &= 0x3ffffff;
+ /* k = 9 */
+ lo = Math.imul(al9, bl0);
+ mid = Math.imul(al9, bh0);
+ mid = (mid + Math.imul(ah9, bl0)) | 0;
+ hi = Math.imul(ah9, bh0);
+ lo = (lo + Math.imul(al8, bl1)) | 0;
+ mid = (mid + Math.imul(al8, bh1)) | 0;
+ mid = (mid + Math.imul(ah8, bl1)) | 0;
+ hi = (hi + Math.imul(ah8, bh1)) | 0;
+ lo = (lo + Math.imul(al7, bl2)) | 0;
+ mid = (mid + Math.imul(al7, bh2)) | 0;
+ mid = (mid + Math.imul(ah7, bl2)) | 0;
+ hi = (hi + Math.imul(ah7, bh2)) | 0;
+ lo = (lo + Math.imul(al6, bl3)) | 0;
+ mid = (mid + Math.imul(al6, bh3)) | 0;
+ mid = (mid + Math.imul(ah6, bl3)) | 0;
+ hi = (hi + Math.imul(ah6, bh3)) | 0;
+ lo = (lo + Math.imul(al5, bl4)) | 0;
+ mid = (mid + Math.imul(al5, bh4)) | 0;
+ mid = (mid + Math.imul(ah5, bl4)) | 0;
+ hi = (hi + Math.imul(ah5, bh4)) | 0;
+ lo = (lo + Math.imul(al4, bl5)) | 0;
+ mid = (mid + Math.imul(al4, bh5)) | 0;
+ mid = (mid + Math.imul(ah4, bl5)) | 0;
+ hi = (hi + Math.imul(ah4, bh5)) | 0;
+ lo = (lo + Math.imul(al3, bl6)) | 0;
+ mid = (mid + Math.imul(al3, bh6)) | 0;
+ mid = (mid + Math.imul(ah3, bl6)) | 0;
+ hi = (hi + Math.imul(ah3, bh6)) | 0;
+ lo = (lo + Math.imul(al2, bl7)) | 0;
+ mid = (mid + Math.imul(al2, bh7)) | 0;
+ mid = (mid + Math.imul(ah2, bl7)) | 0;
+ hi = (hi + Math.imul(ah2, bh7)) | 0;
+ lo = (lo + Math.imul(al1, bl8)) | 0;
+ mid = (mid + Math.imul(al1, bh8)) | 0;
+ mid = (mid + Math.imul(ah1, bl8)) | 0;
+ hi = (hi + Math.imul(ah1, bh8)) | 0;
+ lo = (lo + Math.imul(al0, bl9)) | 0;
+ mid = (mid + Math.imul(al0, bh9)) | 0;
+ mid = (mid + Math.imul(ah0, bl9)) | 0;
+ hi = (hi + Math.imul(ah0, bh9)) | 0;
+ var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;
+ w9 &= 0x3ffffff;
+ /* k = 10 */
+ lo = Math.imul(al9, bl1);
+ mid = Math.imul(al9, bh1);
+ mid = (mid + Math.imul(ah9, bl1)) | 0;
+ hi = Math.imul(ah9, bh1);
+ lo = (lo + Math.imul(al8, bl2)) | 0;
+ mid = (mid + Math.imul(al8, bh2)) | 0;
+ mid = (mid + Math.imul(ah8, bl2)) | 0;
+ hi = (hi + Math.imul(ah8, bh2)) | 0;
+ lo = (lo + Math.imul(al7, bl3)) | 0;
+ mid = (mid + Math.imul(al7, bh3)) | 0;
+ mid = (mid + Math.imul(ah7, bl3)) | 0;
+ hi = (hi + Math.imul(ah7, bh3)) | 0;
+ lo = (lo + Math.imul(al6, bl4)) | 0;
+ mid = (mid + Math.imul(al6, bh4)) | 0;
+ mid = (mid + Math.imul(ah6, bl4)) | 0;
+ hi = (hi + Math.imul(ah6, bh4)) | 0;
+ lo = (lo + Math.imul(al5, bl5)) | 0;
+ mid = (mid + Math.imul(al5, bh5)) | 0;
+ mid = (mid + Math.imul(ah5, bl5)) | 0;
+ hi = (hi + Math.imul(ah5, bh5)) | 0;
+ lo = (lo + Math.imul(al4, bl6)) | 0;
+ mid = (mid + Math.imul(al4, bh6)) | 0;
+ mid = (mid + Math.imul(ah4, bl6)) | 0;
+ hi = (hi + Math.imul(ah4, bh6)) | 0;
+ lo = (lo + Math.imul(al3, bl7)) | 0;
+ mid = (mid + Math.imul(al3, bh7)) | 0;
+ mid = (mid + Math.imul(ah3, bl7)) | 0;
+ hi = (hi + Math.imul(ah3, bh7)) | 0;
+ lo = (lo + Math.imul(al2, bl8)) | 0;
+ mid = (mid + Math.imul(al2, bh8)) | 0;
+ mid = (mid + Math.imul(ah2, bl8)) | 0;
+ hi = (hi + Math.imul(ah2, bh8)) | 0;
+ lo = (lo + Math.imul(al1, bl9)) | 0;
+ mid = (mid + Math.imul(al1, bh9)) | 0;
+ mid = (mid + Math.imul(ah1, bl9)) | 0;
+ hi = (hi + Math.imul(ah1, bh9)) | 0;
+ var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;
+ w10 &= 0x3ffffff;
+ /* k = 11 */
+ lo = Math.imul(al9, bl2);
+ mid = Math.imul(al9, bh2);
+ mid = (mid + Math.imul(ah9, bl2)) | 0;
+ hi = Math.imul(ah9, bh2);
+ lo = (lo + Math.imul(al8, bl3)) | 0;
+ mid = (mid + Math.imul(al8, bh3)) | 0;
+ mid = (mid + Math.imul(ah8, bl3)) | 0;
+ hi = (hi + Math.imul(ah8, bh3)) | 0;
+ lo = (lo + Math.imul(al7, bl4)) | 0;
+ mid = (mid + Math.imul(al7, bh4)) | 0;
+ mid = (mid + Math.imul(ah7, bl4)) | 0;
+ hi = (hi + Math.imul(ah7, bh4)) | 0;
+ lo = (lo + Math.imul(al6, bl5)) | 0;
+ mid = (mid + Math.imul(al6, bh5)) | 0;
+ mid = (mid + Math.imul(ah6, bl5)) | 0;
+ hi = (hi + Math.imul(ah6, bh5)) | 0;
+ lo = (lo + Math.imul(al5, bl6)) | 0;
+ mid = (mid + Math.imul(al5, bh6)) | 0;
+ mid = (mid + Math.imul(ah5, bl6)) | 0;
+ hi = (hi + Math.imul(ah5, bh6)) | 0;
+ lo = (lo + Math.imul(al4, bl7)) | 0;
+ mid = (mid + Math.imul(al4, bh7)) | 0;
+ mid = (mid + Math.imul(ah4, bl7)) | 0;
+ hi = (hi + Math.imul(ah4, bh7)) | 0;
+ lo = (lo + Math.imul(al3, bl8)) | 0;
+ mid = (mid + Math.imul(al3, bh8)) | 0;
+ mid = (mid + Math.imul(ah3, bl8)) | 0;
+ hi = (hi + Math.imul(ah3, bh8)) | 0;
+ lo = (lo + Math.imul(al2, bl9)) | 0;
+ mid = (mid + Math.imul(al2, bh9)) | 0;
+ mid = (mid + Math.imul(ah2, bl9)) | 0;
+ hi = (hi + Math.imul(ah2, bh9)) | 0;
+ var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;
+ w11 &= 0x3ffffff;
+ /* k = 12 */
+ lo = Math.imul(al9, bl3);
+ mid = Math.imul(al9, bh3);
+ mid = (mid + Math.imul(ah9, bl3)) | 0;
+ hi = Math.imul(ah9, bh3);
+ lo = (lo + Math.imul(al8, bl4)) | 0;
+ mid = (mid + Math.imul(al8, bh4)) | 0;
+ mid = (mid + Math.imul(ah8, bl4)) | 0;
+ hi = (hi + Math.imul(ah8, bh4)) | 0;
+ lo = (lo + Math.imul(al7, bl5)) | 0;
+ mid = (mid + Math.imul(al7, bh5)) | 0;
+ mid = (mid + Math.imul(ah7, bl5)) | 0;
+ hi = (hi + Math.imul(ah7, bh5)) | 0;
+ lo = (lo + Math.imul(al6, bl6)) | 0;
+ mid = (mid + Math.imul(al6, bh6)) | 0;
+ mid = (mid + Math.imul(ah6, bl6)) | 0;
+ hi = (hi + Math.imul(ah6, bh6)) | 0;
+ lo = (lo + Math.imul(al5, bl7)) | 0;
+ mid = (mid + Math.imul(al5, bh7)) | 0;
+ mid = (mid + Math.imul(ah5, bl7)) | 0;
+ hi = (hi + Math.imul(ah5, bh7)) | 0;
+ lo = (lo + Math.imul(al4, bl8)) | 0;
+ mid = (mid + Math.imul(al4, bh8)) | 0;
+ mid = (mid + Math.imul(ah4, bl8)) | 0;
+ hi = (hi + Math.imul(ah4, bh8)) | 0;
+ lo = (lo + Math.imul(al3, bl9)) | 0;
+ mid = (mid + Math.imul(al3, bh9)) | 0;
+ mid = (mid + Math.imul(ah3, bl9)) | 0;
+ hi = (hi + Math.imul(ah3, bh9)) | 0;
+ var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;
+ w12 &= 0x3ffffff;
+ /* k = 13 */
+ lo = Math.imul(al9, bl4);
+ mid = Math.imul(al9, bh4);
+ mid = (mid + Math.imul(ah9, bl4)) | 0;
+ hi = Math.imul(ah9, bh4);
+ lo = (lo + Math.imul(al8, bl5)) | 0;
+ mid = (mid + Math.imul(al8, bh5)) | 0;
+ mid = (mid + Math.imul(ah8, bl5)) | 0;
+ hi = (hi + Math.imul(ah8, bh5)) | 0;
+ lo = (lo + Math.imul(al7, bl6)) | 0;
+ mid = (mid + Math.imul(al7, bh6)) | 0;
+ mid = (mid + Math.imul(ah7, bl6)) | 0;
+ hi = (hi + Math.imul(ah7, bh6)) | 0;
+ lo = (lo + Math.imul(al6, bl7)) | 0;
+ mid = (mid + Math.imul(al6, bh7)) | 0;
+ mid = (mid + Math.imul(ah6, bl7)) | 0;
+ hi = (hi + Math.imul(ah6, bh7)) | 0;
+ lo = (lo + Math.imul(al5, bl8)) | 0;
+ mid = (mid + Math.imul(al5, bh8)) | 0;
+ mid = (mid + Math.imul(ah5, bl8)) | 0;
+ hi = (hi + Math.imul(ah5, bh8)) | 0;
+ lo = (lo + Math.imul(al4, bl9)) | 0;
+ mid = (mid + Math.imul(al4, bh9)) | 0;
+ mid = (mid + Math.imul(ah4, bl9)) | 0;
+ hi = (hi + Math.imul(ah4, bh9)) | 0;
+ var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;
+ w13 &= 0x3ffffff;
+ /* k = 14 */
+ lo = Math.imul(al9, bl5);
+ mid = Math.imul(al9, bh5);
+ mid = (mid + Math.imul(ah9, bl5)) | 0;
+ hi = Math.imul(ah9, bh5);
+ lo = (lo + Math.imul(al8, bl6)) | 0;
+ mid = (mid + Math.imul(al8, bh6)) | 0;
+ mid = (mid + Math.imul(ah8, bl6)) | 0;
+ hi = (hi + Math.imul(ah8, bh6)) | 0;
+ lo = (lo + Math.imul(al7, bl7)) | 0;
+ mid = (mid + Math.imul(al7, bh7)) | 0;
+ mid = (mid + Math.imul(ah7, bl7)) | 0;
+ hi = (hi + Math.imul(ah7, bh7)) | 0;
+ lo = (lo + Math.imul(al6, bl8)) | 0;
+ mid = (mid + Math.imul(al6, bh8)) | 0;
+ mid = (mid + Math.imul(ah6, bl8)) | 0;
+ hi = (hi + Math.imul(ah6, bh8)) | 0;
+ lo = (lo + Math.imul(al5, bl9)) | 0;
+ mid = (mid + Math.imul(al5, bh9)) | 0;
+ mid = (mid + Math.imul(ah5, bl9)) | 0;
+ hi = (hi + Math.imul(ah5, bh9)) | 0;
+ var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;
+ w14 &= 0x3ffffff;
+ /* k = 15 */
+ lo = Math.imul(al9, bl6);
+ mid = Math.imul(al9, bh6);
+ mid = (mid + Math.imul(ah9, bl6)) | 0;
+ hi = Math.imul(ah9, bh6);
+ lo = (lo + Math.imul(al8, bl7)) | 0;
+ mid = (mid + Math.imul(al8, bh7)) | 0;
+ mid = (mid + Math.imul(ah8, bl7)) | 0;
+ hi = (hi + Math.imul(ah8, bh7)) | 0;
+ lo = (lo + Math.imul(al7, bl8)) | 0;
+ mid = (mid + Math.imul(al7, bh8)) | 0;
+ mid = (mid + Math.imul(ah7, bl8)) | 0;
+ hi = (hi + Math.imul(ah7, bh8)) | 0;
+ lo = (lo + Math.imul(al6, bl9)) | 0;
+ mid = (mid + Math.imul(al6, bh9)) | 0;
+ mid = (mid + Math.imul(ah6, bl9)) | 0;
+ hi = (hi + Math.imul(ah6, bh9)) | 0;
+ var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;
+ w15 &= 0x3ffffff;
+ /* k = 16 */
+ lo = Math.imul(al9, bl7);
+ mid = Math.imul(al9, bh7);
+ mid = (mid + Math.imul(ah9, bl7)) | 0;
+ hi = Math.imul(ah9, bh7);
+ lo = (lo + Math.imul(al8, bl8)) | 0;
+ mid = (mid + Math.imul(al8, bh8)) | 0;
+ mid = (mid + Math.imul(ah8, bl8)) | 0;
+ hi = (hi + Math.imul(ah8, bh8)) | 0;
+ lo = (lo + Math.imul(al7, bl9)) | 0;
+ mid = (mid + Math.imul(al7, bh9)) | 0;
+ mid = (mid + Math.imul(ah7, bl9)) | 0;
+ hi = (hi + Math.imul(ah7, bh9)) | 0;
+ var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;
+ w16 &= 0x3ffffff;
+ /* k = 17 */
+ lo = Math.imul(al9, bl8);
+ mid = Math.imul(al9, bh8);
+ mid = (mid + Math.imul(ah9, bl8)) | 0;
+ hi = Math.imul(ah9, bh8);
+ lo = (lo + Math.imul(al8, bl9)) | 0;
+ mid = (mid + Math.imul(al8, bh9)) | 0;
+ mid = (mid + Math.imul(ah8, bl9)) | 0;
+ hi = (hi + Math.imul(ah8, bh9)) | 0;
+ var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;
+ w17 &= 0x3ffffff;
+ /* k = 18 */
+ lo = Math.imul(al9, bl9);
+ mid = Math.imul(al9, bh9);
+ mid = (mid + Math.imul(ah9, bl9)) | 0;
+ hi = Math.imul(ah9, bh9);
+ var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;
+ c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;
+ w18 &= 0x3ffffff;
+ o[0] = w0;
+ o[1] = w1;
+ o[2] = w2;
+ o[3] = w3;
+ o[4] = w4;
+ o[5] = w5;
+ o[6] = w6;
+ o[7] = w7;
+ o[8] = w8;
+ o[9] = w9;
+ o[10] = w10;
+ o[11] = w11;
+ o[12] = w12;
+ o[13] = w13;
+ o[14] = w14;
+ o[15] = w15;
+ o[16] = w16;
+ o[17] = w17;
+ o[18] = w18;
+ if (c !== 0) {
+ o[19] = c;
+ out.length++;
+ }
+ return out;
+ };
+
+ // Polyfill comb
+ if (!Math.imul) {
+ comb10MulTo = smallMulTo;
+ }
+
+ function bigMulTo (self, num, out) {
+ out.negative = num.negative ^ self.negative;
+ out.length = self.length + num.length;
+
+ var carry = 0;
+ var hncarry = 0;
+ for (var k = 0; k < out.length - 1; k++) {
+ // Sum all words with the same `i + j = k` and accumulate `ncarry`,
+ // note that ncarry could be >= 0x3ffffff
+ var ncarry = hncarry;
+ hncarry = 0;
+ var rword = carry & 0x3ffffff;
+ var maxJ = Math.min(k, num.length - 1);
+ for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {
+ var i = k - j;
+ var a = self.words[i] | 0;
+ var b = num.words[j] | 0;
+ var r = a * b;
+
+ var lo = r & 0x3ffffff;
+ ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;
+ lo = (lo + rword) | 0;
+ rword = lo & 0x3ffffff;
+ ncarry = (ncarry + (lo >>> 26)) | 0;
+
+ hncarry += ncarry >>> 26;
+ ncarry &= 0x3ffffff;
+ }
+ out.words[k] = rword;
+ carry = ncarry;
+ ncarry = hncarry;
+ }
+ if (carry !== 0) {
+ out.words[k] = carry;
+ } else {
+ out.length--;
+ }
+
+ return out.strip();
+ }
+
+ function jumboMulTo (self, num, out) {
+ var fftm = new FFTM();
+ return fftm.mulp(self, num, out);
+ }
+
+ BN.prototype.mulTo = function mulTo (num, out) {
+ var res;
+ var len = this.length + num.length;
+ if (this.length === 10 && num.length === 10) {
+ res = comb10MulTo(this, num, out);
+ } else if (len < 63) {
+ res = smallMulTo(this, num, out);
+ } else if (len < 1024) {
+ res = bigMulTo(this, num, out);
+ } else {
+ res = jumboMulTo(this, num, out);
+ }
+
+ return res;
+ };
+
+ // Cooley-Tukey algorithm for FFT
+ // slightly revisited to rely on looping instead of recursion
+
+ function FFTM (x, y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ FFTM.prototype.makeRBT = function makeRBT (N) {
+ var t = new Array(N);
+ var l = BN.prototype._countBits(N) - 1;
+ for (var i = 0; i < N; i++) {
+ t[i] = this.revBin(i, l, N);
+ }
+
+ return t;
+ };
+
+ // Returns binary-reversed representation of `x`
+ FFTM.prototype.revBin = function revBin (x, l, N) {
+ if (x === 0 || x === N - 1) return x;
+
+ var rb = 0;
+ for (var i = 0; i < l; i++) {
+ rb |= (x & 1) << (l - i - 1);
+ x >>= 1;
+ }
+
+ return rb;
+ };
+
+ // Performs "tweedling" phase, therefore 'emulating'
+ // behaviour of the recursive algorithm
+ FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {
+ for (var i = 0; i < N; i++) {
+ rtws[i] = rws[rbt[i]];
+ itws[i] = iws[rbt[i]];
+ }
+ };
+
+ FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {
+ this.permute(rbt, rws, iws, rtws, itws, N);
+
+ for (var s = 1; s < N; s <<= 1) {
+ var l = s << 1;
+
+ var rtwdf = Math.cos(2 * Math.PI / l);
+ var itwdf = Math.sin(2 * Math.PI / l);
+
+ for (var p = 0; p < N; p += l) {
+ var rtwdf_ = rtwdf;
+ var itwdf_ = itwdf;
+
+ for (var j = 0; j < s; j++) {
+ var re = rtws[p + j];
+ var ie = itws[p + j];
+
+ var ro = rtws[p + j + s];
+ var io = itws[p + j + s];
+
+ var rx = rtwdf_ * ro - itwdf_ * io;
+
+ io = rtwdf_ * io + itwdf_ * ro;
+ ro = rx;
+
+ rtws[p + j] = re + ro;
+ itws[p + j] = ie + io;
+
+ rtws[p + j + s] = re - ro;
+ itws[p + j + s] = ie - io;
+
+ /* jshint maxdepth : false */
+ if (j !== l) {
+ rx = rtwdf * rtwdf_ - itwdf * itwdf_;
+
+ itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;
+ rtwdf_ = rx;
+ }
+ }
+ }
+ }
+ };
+
+ FFTM.prototype.guessLen13b = function guessLen13b (n, m) {
+ var N = Math.max(m, n) | 1;
+ var odd = N & 1;
+ var i = 0;
+ for (N = N / 2 | 0; N; N = N >>> 1) {
+ i++;
+ }
+
+ return 1 << i + 1 + odd;
+ };
+
+ FFTM.prototype.conjugate = function conjugate (rws, iws, N) {
+ if (N <= 1) return;
+
+ for (var i = 0; i < N / 2; i++) {
+ var t = rws[i];
+
+ rws[i] = rws[N - i - 1];
+ rws[N - i - 1] = t;
+
+ t = iws[i];
+
+ iws[i] = -iws[N - i - 1];
+ iws[N - i - 1] = -t;
+ }
+ };
+
+ FFTM.prototype.normalize13b = function normalize13b (ws, N) {
+ var carry = 0;
+ for (var i = 0; i < N / 2; i++) {
+ var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +
+ Math.round(ws[2 * i] / N) +
+ carry;
+
+ ws[i] = w & 0x3ffffff;
+
+ if (w < 0x4000000) {
+ carry = 0;
+ } else {
+ carry = w / 0x4000000 | 0;
+ }
+ }
+
+ return ws;
+ };
+
+ FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {
+ var carry = 0;
+ for (var i = 0; i < len; i++) {
+ carry = carry + (ws[i] | 0);
+
+ rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;
+ rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;
+ }
+
+ // Pad with zeroes
+ for (i = 2 * len; i < N; ++i) {
+ rws[i] = 0;
+ }
+
+ assert(carry === 0);
+ assert((carry & ~0x1fff) === 0);
+ };
+
+ FFTM.prototype.stub = function stub (N) {
+ var ph = new Array(N);
+ for (var i = 0; i < N; i++) {
+ ph[i] = 0;
+ }
+
+ return ph;
+ };
+
+ FFTM.prototype.mulp = function mulp (x, y, out) {
+ var N = 2 * this.guessLen13b(x.length, y.length);
+
+ var rbt = this.makeRBT(N);
+
+ var _ = this.stub(N);
+
+ var rws = new Array(N);
+ var rwst = new Array(N);
+ var iwst = new Array(N);
+
+ var nrws = new Array(N);
+ var nrwst = new Array(N);
+ var niwst = new Array(N);
+
+ var rmws = out.words;
+ rmws.length = N;
+
+ this.convert13b(x.words, x.length, rws, N);
+ this.convert13b(y.words, y.length, nrws, N);
+
+ this.transform(rws, _, rwst, iwst, N, rbt);
+ this.transform(nrws, _, nrwst, niwst, N, rbt);
+
+ for (var i = 0; i < N; i++) {
+ var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];
+ iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];
+ rwst[i] = rx;
+ }
+
+ this.conjugate(rwst, iwst, N);
+ this.transform(rwst, iwst, rmws, _, N, rbt);
+ this.conjugate(rmws, _, N);
+ this.normalize13b(rmws, N);
+
+ out.negative = x.negative ^ y.negative;
+ out.length = x.length + y.length;
+ return out.strip();
+ };
+
+ // Multiply `this` by `num`
+ BN.prototype.mul = function mul (num) {
+ var out = new BN(null);
+ out.words = new Array(this.length + num.length);
+ return this.mulTo(num, out);
+ };
+
+ // Multiply employing FFT
+ BN.prototype.mulf = function mulf (num) {
+ var out = new BN(null);
+ out.words = new Array(this.length + num.length);
+ return jumboMulTo(this, num, out);
+ };
+
+ // In-place Multiplication
+ BN.prototype.imul = function imul (num) {
+ return this.clone().mulTo(num, this);
+ };
+
+ BN.prototype.imuln = function imuln (num) {
+ assert(typeof num === 'number');
+ assert(num < 0x4000000);
+
+ // Carry
+ var carry = 0;
+ for (var i = 0; i < this.length; i++) {
+ var w = (this.words[i] | 0) * num;
+ var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);
+ carry >>= 26;
+ carry += (w / 0x4000000) | 0;
+ // NOTE: lo is 27bit maximum
+ carry += lo >>> 26;
+ this.words[i] = lo & 0x3ffffff;
+ }
+
+ if (carry !== 0) {
+ this.words[i] = carry;
+ this.length++;
+ }
+
+ return this;
+ };
+
+ BN.prototype.muln = function muln (num) {
+ return this.clone().imuln(num);
+ };
+
+ // `this` * `this`
+ BN.prototype.sqr = function sqr () {
+ return this.mul(this);
+ };
+
+ // `this` * `this` in-place
+ BN.prototype.isqr = function isqr () {
+ return this.imul(this.clone());
+ };
+
+ // Math.pow(`this`, `num`)
+ BN.prototype.pow = function pow (num) {
+ var w = toBitArray(num);
+ if (w.length === 0) return new BN(1);
+
+ // Skip leading zeroes
+ var res = this;
+ for (var i = 0; i < w.length; i++, res = res.sqr()) {
+ if (w[i] !== 0) break;
+ }
+
+ if (++i < w.length) {
+ for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {
+ if (w[i] === 0) continue;
+
+ res = res.mul(q);
+ }
+ }
+
+ return res;
+ };
+
+ // Shift-left in-place
+ BN.prototype.iushln = function iushln (bits) {
+ assert(typeof bits === 'number' && bits >= 0);
+ var r = bits % 26;
+ var s = (bits - r) / 26;
+ var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);
+ var i;
+
+ if (r !== 0) {
+ var carry = 0;
+
+ for (i = 0; i < this.length; i++) {
+ var newCarry = this.words[i] & carryMask;
+ var c = ((this.words[i] | 0) - newCarry) << r;
+ this.words[i] = c | carry;
+ carry = newCarry >>> (26 - r);
+ }
+
+ if (carry) {
+ this.words[i] = carry;
+ this.length++;
+ }
+ }
+
+ if (s !== 0) {
+ for (i = this.length - 1; i >= 0; i--) {
+ this.words[i + s] = this.words[i];
+ }
+
+ for (i = 0; i < s; i++) {
+ this.words[i] = 0;
+ }
+
+ this.length += s;
+ }
+
+ return this.strip();
+ };
+
+ BN.prototype.ishln = function ishln (bits) {
+ // TODO(indutny): implement me
+ assert(this.negative === 0);
+ return this.iushln(bits);
+ };
+
+ // Shift-right in-place
+ // NOTE: `hint` is a lowest bit before trailing zeroes
+ // NOTE: if `extended` is present - it will be filled with destroyed bits
+ BN.prototype.iushrn = function iushrn (bits, hint, extended) {
+ assert(typeof bits === 'number' && bits >= 0);
+ var h;
+ if (hint) {
+ h = (hint - (hint % 26)) / 26;
+ } else {
+ h = 0;
+ }
+
+ var r = bits % 26;
+ var s = Math.min((bits - r) / 26, this.length);
+ var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
+ var maskedWords = extended;
+
+ h -= s;
+ h = Math.max(0, h);
+
+ // Extended mode, copy masked part
+ if (maskedWords) {
+ for (var i = 0; i < s; i++) {
+ maskedWords.words[i] = this.words[i];
+ }
+ maskedWords.length = s;
+ }
+
+ if (s === 0) {
+ // No-op, we should not move anything at all
+ } else if (this.length > s) {
+ this.length -= s;
+ for (i = 0; i < this.length; i++) {
+ this.words[i] = this.words[i + s];
+ }
+ } else {
+ this.words[0] = 0;
+ this.length = 1;
+ }
+
+ var carry = 0;
+ for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {
+ var word = this.words[i] | 0;
+ this.words[i] = (carry << (26 - r)) | (word >>> r);
+ carry = word & mask;
+ }
+
+ // Push carried bits as a mask
+ if (maskedWords && carry !== 0) {
+ maskedWords.words[maskedWords.length++] = carry;
+ }
+
+ if (this.length === 0) {
+ this.words[0] = 0;
+ this.length = 1;
+ }
+
+ return this.strip();
+ };
+
+ BN.prototype.ishrn = function ishrn (bits, hint, extended) {
+ // TODO(indutny): implement me
+ assert(this.negative === 0);
+ return this.iushrn(bits, hint, extended);
+ };
+
+ // Shift-left
+ BN.prototype.shln = function shln (bits) {
+ return this.clone().ishln(bits);
+ };
+
+ BN.prototype.ushln = function ushln (bits) {
+ return this.clone().iushln(bits);
+ };
+
+ // Shift-right
+ BN.prototype.shrn = function shrn (bits) {
+ return this.clone().ishrn(bits);
+ };
+
+ BN.prototype.ushrn = function ushrn (bits) {
+ return this.clone().iushrn(bits);
+ };
+
+ // Test if n bit is set
+ BN.prototype.testn = function testn (bit) {
+ assert(typeof bit === 'number' && bit >= 0);
+ var r = bit % 26;
+ var s = (bit - r) / 26;
+ var q = 1 << r;
+
+ // Fast case: bit is much higher than all existing words
+ if (this.length <= s) return false;
+
+ // Check bit and return
+ var w = this.words[s];
+
+ return !!(w & q);
+ };
+
+ // Return only lowers bits of number (in-place)
+ BN.prototype.imaskn = function imaskn (bits) {
+ assert(typeof bits === 'number' && bits >= 0);
+ var r = bits % 26;
+ var s = (bits - r) / 26;
+
+ assert(this.negative === 0, 'imaskn works only with positive numbers');
+
+ if (this.length <= s) {
+ return this;
+ }
+
+ if (r !== 0) {
+ s++;
+ }
+ this.length = Math.min(s, this.length);
+
+ if (r !== 0) {
+ var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);
+ this.words[this.length - 1] &= mask;
+ }
+
+ return this.strip();
+ };
+
+ // Return only lowers bits of number
+ BN.prototype.maskn = function maskn (bits) {
+ return this.clone().imaskn(bits);
+ };
+
+ // Add plain number `num` to `this`
+ BN.prototype.iaddn = function iaddn (num) {
+ assert(typeof num === 'number');
+ assert(num < 0x4000000);
+ if (num < 0) return this.isubn(-num);
+
+ // Possible sign change
+ if (this.negative !== 0) {
+ if (this.length === 1 && (this.words[0] | 0) < num) {
+ this.words[0] = num - (this.words[0] | 0);
+ this.negative = 0;
+ return this;
+ }
+
+ this.negative = 0;
+ this.isubn(num);
+ this.negative = 1;
+ return this;
+ }
+
+ // Add without checks
+ return this._iaddn(num);
+ };
+
+ BN.prototype._iaddn = function _iaddn (num) {
+ this.words[0] += num;
+
+ // Carry
+ for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {
+ this.words[i] -= 0x4000000;
+ if (i === this.length - 1) {
+ this.words[i + 1] = 1;
+ } else {
+ this.words[i + 1]++;
+ }
+ }
+ this.length = Math.max(this.length, i + 1);
+
+ return this;
+ };
+
+ // Subtract plain number `num` from `this`
+ BN.prototype.isubn = function isubn (num) {
+ assert(typeof num === 'number');
+ assert(num < 0x4000000);
+ if (num < 0) return this.iaddn(-num);
+
+ if (this.negative !== 0) {
+ this.negative = 0;
+ this.iaddn(num);
+ this.negative = 1;
+ return this;
+ }
+
+ this.words[0] -= num;
+
+ if (this.length === 1 && this.words[0] < 0) {
+ this.words[0] = -this.words[0];
+ this.negative = 1;
+ } else {
+ // Carry
+ for (var i = 0; i < this.length && this.words[i] < 0; i++) {
+ this.words[i] += 0x4000000;
+ this.words[i + 1] -= 1;
+ }
+ }
+
+ return this.strip();
+ };
+
+ BN.prototype.addn = function addn (num) {
+ return this.clone().iaddn(num);
+ };
+
+ BN.prototype.subn = function subn (num) {
+ return this.clone().isubn(num);
+ };
+
+ BN.prototype.iabs = function iabs () {
+ this.negative = 0;
+
+ return this;
+ };
+
+ BN.prototype.abs = function abs () {
+ return this.clone().iabs();
+ };
+
+ BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {
+ var len = num.length + shift;
+ var i;
+
+ this._expand(len);
+
+ var w;
+ var carry = 0;
+ for (i = 0; i < num.length; i++) {
+ w = (this.words[i + shift] | 0) + carry;
+ var right = (num.words[i] | 0) * mul;
+ w -= right & 0x3ffffff;
+ carry = (w >> 26) - ((right / 0x4000000) | 0);
+ this.words[i + shift] = w & 0x3ffffff;
+ }
+ for (; i < this.length - shift; i++) {
+ w = (this.words[i + shift] | 0) + carry;
+ carry = w >> 26;
+ this.words[i + shift] = w & 0x3ffffff;
+ }
+
+ if (carry === 0) return this.strip();
+
+ // Subtraction overflow
+ assert(carry === -1);
+ carry = 0;
+ for (i = 0; i < this.length; i++) {
+ w = -(this.words[i] | 0) + carry;
+ carry = w >> 26;
+ this.words[i] = w & 0x3ffffff;
+ }
+ this.negative = 1;
+
+ return this.strip();
+ };
+
+ BN.prototype._wordDiv = function _wordDiv (num, mode) {
+ var shift = this.length - num.length;
+
+ var a = this.clone();
+ var b = num;
+
+ // Normalize
+ var bhi = b.words[b.length - 1] | 0;
+ var bhiBits = this._countBits(bhi);
+ shift = 26 - bhiBits;
+ if (shift !== 0) {
+ b = b.ushln(shift);
+ a.iushln(shift);
+ bhi = b.words[b.length - 1] | 0;
+ }
+
+ // Initialize quotient
+ var m = a.length - b.length;
+ var q;
+
+ if (mode !== 'mod') {
+ q = new BN(null);
+ q.length = m + 1;
+ q.words = new Array(q.length);
+ for (var i = 0; i < q.length; i++) {
+ q.words[i] = 0;
+ }
+ }
+
+ var diff = a.clone()._ishlnsubmul(b, 1, m);
+ if (diff.negative === 0) {
+ a = diff;
+ if (q) {
+ q.words[m] = 1;
+ }
+ }
+
+ for (var j = m - 1; j >= 0; j--) {
+ var qj = (a.words[b.length + j] | 0) * 0x4000000 +
+ (a.words[b.length + j - 1] | 0);
+
+ // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max
+ // (0x7ffffff)
+ qj = Math.min((qj / bhi) | 0, 0x3ffffff);
+
+ a._ishlnsubmul(b, qj, j);
+ while (a.negative !== 0) {
+ qj--;
+ a.negative = 0;
+ a._ishlnsubmul(b, 1, j);
+ if (!a.isZero()) {
+ a.negative ^= 1;
+ }
+ }
+ if (q) {
+ q.words[j] = qj;
+ }
+ }
+ if (q) {
+ q.strip();
+ }
+ a.strip();
+
+ // Denormalize
+ if (mode !== 'div' && shift !== 0) {
+ a.iushrn(shift);
+ }
+
+ return {
+ div: q || null,
+ mod: a
+ };
+ };
+
+ // NOTE: 1) `mode` can be set to `mod` to request mod only,
+ // to `div` to request div only, or be absent to
+ // request both div & mod
+ // 2) `positive` is true if unsigned mod is requested
+ BN.prototype.divmod = function divmod (num, mode, positive) {
+ assert(!num.isZero());
+
+ if (this.isZero()) {
+ return {
+ div: new BN(0),
+ mod: new BN(0)
+ };
+ }
+
+ var div, mod, res;
+ if (this.negative !== 0 && num.negative === 0) {
+ res = this.neg().divmod(num, mode);
+
+ if (mode !== 'mod') {
+ div = res.div.neg();
+ }
+
+ if (mode !== 'div') {
+ mod = res.mod.neg();
+ if (positive && mod.negative !== 0) {
+ mod.iadd(num);
+ }
+ }
+
+ return {
+ div: div,
+ mod: mod
+ };
+ }
+
+ if (this.negative === 0 && num.negative !== 0) {
+ res = this.divmod(num.neg(), mode);
+
+ if (mode !== 'mod') {
+ div = res.div.neg();
+ }
+
+ return {
+ div: div,
+ mod: res.mod
+ };
+ }
+
+ if ((this.negative & num.negative) !== 0) {
+ res = this.neg().divmod(num.neg(), mode);
+
+ if (mode !== 'div') {
+ mod = res.mod.neg();
+ if (positive && mod.negative !== 0) {
+ mod.isub(num);
+ }
+ }
+
+ return {
+ div: res.div,
+ mod: mod
+ };
+ }
+
+ // Both numbers are positive at this point
+
+ // Strip both numbers to approximate shift value
+ if (num.length > this.length || this.cmp(num) < 0) {
+ return {
+ div: new BN(0),
+ mod: this
+ };
+ }
+
+ // Very short reduction
+ if (num.length === 1) {
+ if (mode === 'div') {
+ return {
+ div: this.divn(num.words[0]),
+ mod: null
+ };
+ }
+
+ if (mode === 'mod') {
+ return {
+ div: null,
+ mod: new BN(this.modn(num.words[0]))
+ };
+ }
+
+ return {
+ div: this.divn(num.words[0]),
+ mod: new BN(this.modn(num.words[0]))
+ };
+ }
+
+ return this._wordDiv(num, mode);
+ };
+
+ // Find `this` / `num`
+ BN.prototype.div = function div (num) {
+ return this.divmod(num, 'div', false).div;
+ };
+
+ // Find `this` % `num`
+ BN.prototype.mod = function mod (num) {
+ return this.divmod(num, 'mod', false).mod;
+ };
+
+ BN.prototype.umod = function umod (num) {
+ return this.divmod(num, 'mod', true).mod;
+ };
+
+ // Find Round(`this` / `num`)
+ BN.prototype.divRound = function divRound (num) {
+ var dm = this.divmod(num);
+
+ // Fast case - exact division
+ if (dm.mod.isZero()) return dm.div;
+
+ var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;
+
+ var half = num.ushrn(1);
+ var r2 = num.andln(1);
+ var cmp = mod.cmp(half);
+
+ // Round down
+ if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div;
+
+ // Round up
+ return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);
+ };
+
+ BN.prototype.modn = function modn (num) {
+ assert(num <= 0x3ffffff);
+ var p = (1 << 26) % num;
+
+ var acc = 0;
+ for (var i = this.length - 1; i >= 0; i--) {
+ acc = (p * acc + (this.words[i] | 0)) % num;
+ }
+
+ return acc;
+ };
+
+ // In-place division by number
+ BN.prototype.idivn = function idivn (num) {
+ assert(num <= 0x3ffffff);
+
+ var carry = 0;
+ for (var i = this.length - 1; i >= 0; i--) {
+ var w = (this.words[i] | 0) + carry * 0x4000000;
+ this.words[i] = (w / num) | 0;
+ carry = w % num;
+ }
+
+ return this.strip();
+ };
+
+ BN.prototype.divn = function divn (num) {
+ return this.clone().idivn(num);
+ };
+
+ BN.prototype.egcd = function egcd (p) {
+ assert(p.negative === 0);
+ assert(!p.isZero());
+
+ var x = this;
+ var y = p.clone();
+
+ if (x.negative !== 0) {
+ x = x.umod(p);
+ } else {
+ x = x.clone();
+ }
+
+ // A * x + B * y = x
+ var A = new BN(1);
+ var B = new BN(0);
+
+ // C * x + D * y = y
+ var C = new BN(0);
+ var D = new BN(1);
+
+ var g = 0;
+
+ while (x.isEven() && y.isEven()) {
+ x.iushrn(1);
+ y.iushrn(1);
+ ++g;
+ }
+
+ var yp = y.clone();
+ var xp = x.clone();
+
+ while (!x.isZero()) {
+ for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
+ if (i > 0) {
+ x.iushrn(i);
+ while (i-- > 0) {
+ if (A.isOdd() || B.isOdd()) {
+ A.iadd(yp);
+ B.isub(xp);
+ }
+
+ A.iushrn(1);
+ B.iushrn(1);
+ }
+ }
+
+ for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
+ if (j > 0) {
+ y.iushrn(j);
+ while (j-- > 0) {
+ if (C.isOdd() || D.isOdd()) {
+ C.iadd(yp);
+ D.isub(xp);
+ }
+
+ C.iushrn(1);
+ D.iushrn(1);
+ }
+ }
+
+ if (x.cmp(y) >= 0) {
+ x.isub(y);
+ A.isub(C);
+ B.isub(D);
+ } else {
+ y.isub(x);
+ C.isub(A);
+ D.isub(B);
+ }
+ }
+
+ return {
+ a: C,
+ b: D,
+ gcd: y.iushln(g)
+ };
+ };
+
+ // This is reduced incarnation of the binary EEA
+ // above, designated to invert members of the
+ // _prime_ fields F(p) at a maximal speed
+ BN.prototype._invmp = function _invmp (p) {
+ assert(p.negative === 0);
+ assert(!p.isZero());
+
+ var a = this;
+ var b = p.clone();
+
+ if (a.negative !== 0) {
+ a = a.umod(p);
+ } else {
+ a = a.clone();
+ }
+
+ var x1 = new BN(1);
+ var x2 = new BN(0);
+
+ var delta = b.clone();
+
+ while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {
+ for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);
+ if (i > 0) {
+ a.iushrn(i);
+ while (i-- > 0) {
+ if (x1.isOdd()) {
+ x1.iadd(delta);
+ }
+
+ x1.iushrn(1);
+ }
+ }
+
+ for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);
+ if (j > 0) {
+ b.iushrn(j);
+ while (j-- > 0) {
+ if (x2.isOdd()) {
+ x2.iadd(delta);
+ }
+
+ x2.iushrn(1);
+ }
+ }
+
+ if (a.cmp(b) >= 0) {
+ a.isub(b);
+ x1.isub(x2);
+ } else {
+ b.isub(a);
+ x2.isub(x1);
+ }
+ }
+
+ var res;
+ if (a.cmpn(1) === 0) {
+ res = x1;
+ } else {
+ res = x2;
+ }
+
+ if (res.cmpn(0) < 0) {
+ res.iadd(p);
+ }
+
+ return res;
+ };
+
+ BN.prototype.gcd = function gcd (num) {
+ if (this.isZero()) return num.abs();
+ if (num.isZero()) return this.abs();
+
+ var a = this.clone();
+ var b = num.clone();
+ a.negative = 0;
+ b.negative = 0;
+
+ // Remove common factor of two
+ for (var shift = 0; a.isEven() && b.isEven(); shift++) {
+ a.iushrn(1);
+ b.iushrn(1);
+ }
+
+ do {
+ while (a.isEven()) {
+ a.iushrn(1);
+ }
+ while (b.isEven()) {
+ b.iushrn(1);
+ }
+
+ var r = a.cmp(b);
+ if (r < 0) {
+ // Swap `a` and `b` to make `a` always bigger than `b`
+ var t = a;
+ a = b;
+ b = t;
+ } else if (r === 0 || b.cmpn(1) === 0) {
+ break;
+ }
+
+ a.isub(b);
+ } while (true);
+
+ return b.iushln(shift);
+ };
+
+ // Invert number in the field F(num)
+ BN.prototype.invm = function invm (num) {
+ return this.egcd(num).a.umod(num);
+ };
+
+ BN.prototype.isEven = function isEven () {
+ return (this.words[0] & 1) === 0;
+ };
+
+ BN.prototype.isOdd = function isOdd () {
+ return (this.words[0] & 1) === 1;
+ };
+
+ // And first word and num
+ BN.prototype.andln = function andln (num) {
+ return this.words[0] & num;
+ };
+
+ // Increment at the bit position in-line
+ BN.prototype.bincn = function bincn (bit) {
+ assert(typeof bit === 'number');
+ var r = bit % 26;
+ var s = (bit - r) / 26;
+ var q = 1 << r;
+
+ // Fast case: bit is much higher than all existing words
+ if (this.length <= s) {
+ this._expand(s + 1);
+ this.words[s] |= q;
+ return this;
+ }
+
+ // Add bit and propagate, if needed
+ var carry = q;
+ for (var i = s; carry !== 0 && i < this.length; i++) {
+ var w = this.words[i] | 0;
+ w += carry;
+ carry = w >>> 26;
+ w &= 0x3ffffff;
+ this.words[i] = w;
+ }
+ if (carry !== 0) {
+ this.words[i] = carry;
+ this.length++;
+ }
+ return this;
+ };
+
+ BN.prototype.isZero = function isZero () {
+ return this.length === 1 && this.words[0] === 0;
+ };
+
+ BN.prototype.cmpn = function cmpn (num) {
+ var negative = num < 0;
+
+ if (this.negative !== 0 && !negative) return -1;
+ if (this.negative === 0 && negative) return 1;
+
+ this.strip();
+
+ var res;
+ if (this.length > 1) {
+ res = 1;
+ } else {
+ if (negative) {
+ num = -num;
+ }
+
+ assert(num <= 0x3ffffff, 'Number is too big');
+
+ var w = this.words[0] | 0;
+ res = w === num ? 0 : w < num ? -1 : 1;
+ }
+ if (this.negative !== 0) return -res | 0;
+ return res;
+ };
+
+ // Compare two numbers and return:
+ // 1 - if `this` > `num`
+ // 0 - if `this` == `num`
+ // -1 - if `this` < `num`
+ BN.prototype.cmp = function cmp (num) {
+ if (this.negative !== 0 && num.negative === 0) return -1;
+ if (this.negative === 0 && num.negative !== 0) return 1;
+
+ var res = this.ucmp(num);
+ if (this.negative !== 0) return -res | 0;
+ return res;
+ };
+
+ // Unsigned comparison
+ BN.prototype.ucmp = function ucmp (num) {
+ // At this point both numbers have the same sign
+ if (this.length > num.length) return 1;
+ if (this.length < num.length) return -1;
+
+ var res = 0;
+ for (var i = this.length - 1; i >= 0; i--) {
+ var a = this.words[i] | 0;
+ var b = num.words[i] | 0;
+
+ if (a === b) continue;
+ if (a < b) {
+ res = -1;
+ } else if (a > b) {
+ res = 1;
+ }
+ break;
+ }
+ return res;
+ };
+
+ BN.prototype.gtn = function gtn (num) {
+ return this.cmpn(num) === 1;
+ };
+
+ BN.prototype.gt = function gt (num) {
+ return this.cmp(num) === 1;
+ };
+
+ BN.prototype.gten = function gten (num) {
+ return this.cmpn(num) >= 0;
+ };
+
+ BN.prototype.gte = function gte (num) {
+ return this.cmp(num) >= 0;
+ };
+
+ BN.prototype.ltn = function ltn (num) {
+ return this.cmpn(num) === -1;
+ };
+
+ BN.prototype.lt = function lt (num) {
+ return this.cmp(num) === -1;
+ };
+
+ BN.prototype.lten = function lten (num) {
+ return this.cmpn(num) <= 0;
+ };
+
+ BN.prototype.lte = function lte (num) {
+ return this.cmp(num) <= 0;
+ };
+
+ BN.prototype.eqn = function eqn (num) {
+ return this.cmpn(num) === 0;
+ };
+
+ BN.prototype.eq = function eq (num) {
+ return this.cmp(num) === 0;
+ };
+
+ //
+ // A reduce context, could be using montgomery or something better, depending
+ // on the `m` itself.
+ //
+ BN.red = function red (num) {
+ return new Red(num);
+ };
+
+ BN.prototype.toRed = function toRed (ctx) {
+ assert(!this.red, 'Already a number in reduction context');
+ assert(this.negative === 0, 'red works only with positives');
+ return ctx.convertTo(this)._forceRed(ctx);
+ };
+
+ BN.prototype.fromRed = function fromRed () {
+ assert(this.red, 'fromRed works only with numbers in reduction context');
+ return this.red.convertFrom(this);
+ };
+
+ BN.prototype._forceRed = function _forceRed (ctx) {
+ this.red = ctx;
+ return this;
+ };
+
+ BN.prototype.forceRed = function forceRed (ctx) {
+ assert(!this.red, 'Already a number in reduction context');
+ return this._forceRed(ctx);
+ };
+
+ BN.prototype.redAdd = function redAdd (num) {
+ assert(this.red, 'redAdd works only with red numbers');
+ return this.red.add(this, num);
+ };
+
+ BN.prototype.redIAdd = function redIAdd (num) {
+ assert(this.red, 'redIAdd works only with red numbers');
+ return this.red.iadd(this, num);
+ };
+
+ BN.prototype.redSub = function redSub (num) {
+ assert(this.red, 'redSub works only with red numbers');
+ return this.red.sub(this, num);
+ };
+
+ BN.prototype.redISub = function redISub (num) {
+ assert(this.red, 'redISub works only with red numbers');
+ return this.red.isub(this, num);
+ };
+
+ BN.prototype.redShl = function redShl (num) {
+ assert(this.red, 'redShl works only with red numbers');
+ return this.red.shl(this, num);
+ };
+
+ BN.prototype.redMul = function redMul (num) {
+ assert(this.red, 'redMul works only with red numbers');
+ this.red._verify2(this, num);
+ return this.red.mul(this, num);
+ };
+
+ BN.prototype.redIMul = function redIMul (num) {
+ assert(this.red, 'redMul works only with red numbers');
+ this.red._verify2(this, num);
+ return this.red.imul(this, num);
+ };
+
+ BN.prototype.redSqr = function redSqr () {
+ assert(this.red, 'redSqr works only with red numbers');
+ this.red._verify1(this);
+ return this.red.sqr(this);
+ };
+
+ BN.prototype.redISqr = function redISqr () {
+ assert(this.red, 'redISqr works only with red numbers');
+ this.red._verify1(this);
+ return this.red.isqr(this);
+ };
+
+ // Square root over p
+ BN.prototype.redSqrt = function redSqrt () {
+ assert(this.red, 'redSqrt works only with red numbers');
+ this.red._verify1(this);
+ return this.red.sqrt(this);
+ };
+
+ BN.prototype.redInvm = function redInvm () {
+ assert(this.red, 'redInvm works only with red numbers');
+ this.red._verify1(this);
+ return this.red.invm(this);
+ };
+
+ // Return negative clone of `this` % `red modulo`
+ BN.prototype.redNeg = function redNeg () {
+ assert(this.red, 'redNeg works only with red numbers');
+ this.red._verify1(this);
+ return this.red.neg(this);
+ };
+
+ BN.prototype.redPow = function redPow (num) {
+ assert(this.red && !num.red, 'redPow(normalNum)');
+ this.red._verify1(this);
+ return this.red.pow(this, num);
+ };
+
+ // Prime numbers with efficient reduction
+ var primes = {
+ k256: null,
+ p224: null,
+ p192: null,
+ p25519: null
+ };
+
+ // Pseudo-Mersenne prime
+ function MPrime (name, p) {
+ // P = 2 ^ N - K
+ this.name = name;
+ this.p = new BN(p, 16);
+ this.n = this.p.bitLength();
+ this.k = new BN(1).iushln(this.n).isub(this.p);
+
+ this.tmp = this._tmp();
+ }
+
+ MPrime.prototype._tmp = function _tmp () {
+ var tmp = new BN(null);
+ tmp.words = new Array(Math.ceil(this.n / 13));
+ return tmp;
+ };
+
+ MPrime.prototype.ireduce = function ireduce (num) {
+ // Assumes that `num` is less than `P^2`
+ // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)
+ var r = num;
+ var rlen;
+
+ do {
+ this.split(r, this.tmp);
+ r = this.imulK(r);
+ r = r.iadd(this.tmp);
+ rlen = r.bitLength();
+ } while (rlen > this.n);
+
+ var cmp = rlen < this.n ? -1 : r.ucmp(this.p);
+ if (cmp === 0) {
+ r.words[0] = 0;
+ r.length = 1;
+ } else if (cmp > 0) {
+ r.isub(this.p);
+ } else {
+ r.strip();
+ }
+
+ return r;
+ };
+
+ MPrime.prototype.split = function split (input, out) {
+ input.iushrn(this.n, 0, out);
+ };
+
+ MPrime.prototype.imulK = function imulK (num) {
+ return num.imul(this.k);
+ };
+
+ function K256 () {
+ MPrime.call(
+ this,
+ 'k256',
+ 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');
+ }
+ inherits(K256, MPrime);
+
+ K256.prototype.split = function split (input, output) {
+ // 256 = 9 * 26 + 22
+ var mask = 0x3fffff;
+
+ var outLen = Math.min(input.length, 9);
+ for (var i = 0; i < outLen; i++) {
+ output.words[i] = input.words[i];
+ }
+ output.length = outLen;
+
+ if (input.length <= 9) {
+ input.words[0] = 0;
+ input.length = 1;
+ return;
+ }
+
+ // Shift by 9 limbs
+ var prev = input.words[9];
+ output.words[output.length++] = prev & mask;
+
+ for (i = 10; i < input.length; i++) {
+ var next = input.words[i] | 0;
+ input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);
+ prev = next;
+ }
+ prev >>>= 22;
+ input.words[i - 10] = prev;
+ if (prev === 0 && input.length > 10) {
+ input.length -= 10;
+ } else {
+ input.length -= 9;
+ }
+ };
+
+ K256.prototype.imulK = function imulK (num) {
+ // K = 0x1000003d1 = [ 0x40, 0x3d1 ]
+ num.words[num.length] = 0;
+ num.words[num.length + 1] = 0;
+ num.length += 2;
+
+ // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390
+ var lo = 0;
+ for (var i = 0; i < num.length; i++) {
+ var w = num.words[i] | 0;
+ lo += w * 0x3d1;
+ num.words[i] = lo & 0x3ffffff;
+ lo = w * 0x40 + ((lo / 0x4000000) | 0);
+ }
+
+ // Fast length reduction
+ if (num.words[num.length - 1] === 0) {
+ num.length--;
+ if (num.words[num.length - 1] === 0) {
+ num.length--;
+ }
+ }
+ return num;
+ };
+
+ function P224 () {
+ MPrime.call(
+ this,
+ 'p224',
+ 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');
+ }
+ inherits(P224, MPrime);
+
+ function P192 () {
+ MPrime.call(
+ this,
+ 'p192',
+ 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');
+ }
+ inherits(P192, MPrime);
+
+ function P25519 () {
+ // 2 ^ 255 - 19
+ MPrime.call(
+ this,
+ '25519',
+ '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');
+ }
+ inherits(P25519, MPrime);
+
+ P25519.prototype.imulK = function imulK (num) {
+ // K = 0x13
+ var carry = 0;
+ for (var i = 0; i < num.length; i++) {
+ var hi = (num.words[i] | 0) * 0x13 + carry;
+ var lo = hi & 0x3ffffff;
+ hi >>>= 26;
+
+ num.words[i] = lo;
+ carry = hi;
+ }
+ if (carry !== 0) {
+ num.words[num.length++] = carry;
+ }
+ return num;
+ };
+
+ // Exported mostly for testing purposes, use plain name instead
+ BN._prime = function prime (name) {
+ // Cached version of prime
+ if (primes[name]) return primes[name];
+
+ var prime;
+ if (name === 'k256') {
+ prime = new K256();
+ } else if (name === 'p224') {
+ prime = new P224();
+ } else if (name === 'p192') {
+ prime = new P192();
+ } else if (name === 'p25519') {
+ prime = new P25519();
+ } else {
+ throw new Error('Unknown prime ' + name);
+ }
+ primes[name] = prime;
+
+ return prime;
+ };
+
+ //
+ // Base reduction engine
+ //
+ function Red (m) {
+ if (typeof m === 'string') {
+ var prime = BN._prime(m);
+ this.m = prime.p;
+ this.prime = prime;
+ } else {
+ assert(m.gtn(1), 'modulus must be greater than 1');
+ this.m = m;
+ this.prime = null;
+ }
+ }
+
+ Red.prototype._verify1 = function _verify1 (a) {
+ assert(a.negative === 0, 'red works only with positives');
+ assert(a.red, 'red works only with red numbers');
+ };
+
+ Red.prototype._verify2 = function _verify2 (a, b) {
+ assert((a.negative | b.negative) === 0, 'red works only with positives');
+ assert(a.red && a.red === b.red,
+ 'red works only with red numbers');
+ };
+
+ Red.prototype.imod = function imod (a) {
+ if (this.prime) return this.prime.ireduce(a)._forceRed(this);
+ return a.umod(this.m)._forceRed(this);
+ };
+
+ Red.prototype.neg = function neg (a) {
+ if (a.isZero()) {
+ return a.clone();
+ }
+
+ return this.m.sub(a)._forceRed(this);
+ };
+
+ Red.prototype.add = function add (a, b) {
+ this._verify2(a, b);
+
+ var res = a.add(b);
+ if (res.cmp(this.m) >= 0) {
+ res.isub(this.m);
+ }
+ return res._forceRed(this);
+ };
+
+ Red.prototype.iadd = function iadd (a, b) {
+ this._verify2(a, b);
+
+ var res = a.iadd(b);
+ if (res.cmp(this.m) >= 0) {
+ res.isub(this.m);
+ }
+ return res;
+ };
+
+ Red.prototype.sub = function sub (a, b) {
+ this._verify2(a, b);
+
+ var res = a.sub(b);
+ if (res.cmpn(0) < 0) {
+ res.iadd(this.m);
+ }
+ return res._forceRed(this);
+ };
+
+ Red.prototype.isub = function isub (a, b) {
+ this._verify2(a, b);
+
+ var res = a.isub(b);
+ if (res.cmpn(0) < 0) {
+ res.iadd(this.m);
+ }
+ return res;
+ };
+
+ Red.prototype.shl = function shl (a, num) {
+ this._verify1(a);
+ return this.imod(a.ushln(num));
+ };
+
+ Red.prototype.imul = function imul (a, b) {
+ this._verify2(a, b);
+ return this.imod(a.imul(b));
+ };
+
+ Red.prototype.mul = function mul (a, b) {
+ this._verify2(a, b);
+ return this.imod(a.mul(b));
+ };
+
+ Red.prototype.isqr = function isqr (a) {
+ return this.imul(a, a.clone());
+ };
+
+ Red.prototype.sqr = function sqr (a) {
+ return this.mul(a, a);
+ };
+
+ Red.prototype.sqrt = function sqrt (a) {
+ if (a.isZero()) return a.clone();
+
+ var mod3 = this.m.andln(3);
+ assert(mod3 % 2 === 1);
+
+ // Fast case
+ if (mod3 === 3) {
+ var pow = this.m.add(new BN(1)).iushrn(2);
+ return this.pow(a, pow);
+ }
+
+ // Tonelli-Shanks algorithm (Totally unoptimized and slow)
+ //
+ // Find Q and S, that Q * 2 ^ S = (P - 1)
+ var q = this.m.subn(1);
+ var s = 0;
+ while (!q.isZero() && q.andln(1) === 0) {
+ s++;
+ q.iushrn(1);
+ }
+ assert(!q.isZero());
+
+ var one = new BN(1).toRed(this);
+ var nOne = one.redNeg();
+
+ // Find quadratic non-residue
+ // NOTE: Max is such because of generalized Riemann hypothesis.
+ var lpow = this.m.subn(1).iushrn(1);
+ var z = this.m.bitLength();
+ z = new BN(2 * z * z).toRed(this);
+
+ while (this.pow(z, lpow).cmp(nOne) !== 0) {
+ z.redIAdd(nOne);
+ }
+
+ var c = this.pow(z, q);
+ var r = this.pow(a, q.addn(1).iushrn(1));
+ var t = this.pow(a, q);
+ var m = s;
+ while (t.cmp(one) !== 0) {
+ var tmp = t;
+ for (var i = 0; tmp.cmp(one) !== 0; i++) {
+ tmp = tmp.redSqr();
+ }
+ assert(i < m);
+ var b = this.pow(c, new BN(1).iushln(m - i - 1));
+
+ r = r.redMul(b);
+ c = b.redSqr();
+ t = t.redMul(c);
+ m = i;
+ }
+
+ return r;
+ };
+
+ Red.prototype.invm = function invm (a) {
+ var inv = a._invmp(this.m);
+ if (inv.negative !== 0) {
+ inv.negative = 0;
+ return this.imod(inv).redNeg();
+ } else {
+ return this.imod(inv);
+ }
+ };
+
+ Red.prototype.pow = function pow (a, num) {
+ if (num.isZero()) return new BN(1);
+ if (num.cmpn(1) === 0) return a.clone();
+
+ var windowSize = 4;
+ var wnd = new Array(1 << windowSize);
+ wnd[0] = new BN(1).toRed(this);
+ wnd[1] = a;
+ for (var i = 2; i < wnd.length; i++) {
+ wnd[i] = this.mul(wnd[i - 1], a);
+ }
+
+ var res = wnd[0];
+ var current = 0;
+ var currentLen = 0;
+ var start = num.bitLength() % 26;
+ if (start === 0) {
+ start = 26;
+ }
+
+ for (i = num.length - 1; i >= 0; i--) {
+ var word = num.words[i];
+ for (var j = start - 1; j >= 0; j--) {
+ var bit = (word >> j) & 1;
+ if (res !== wnd[0]) {
+ res = this.sqr(res);
+ }
+
+ if (bit === 0 && current === 0) {
+ currentLen = 0;
+ continue;
+ }
+
+ current <<= 1;
+ current |= bit;
+ currentLen++;
+ if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;
+
+ res = this.mul(res, wnd[current]);
+ currentLen = 0;
+ current = 0;
+ }
+ start = 26;
+ }
+
+ return res;
+ };
+
+ Red.prototype.convertTo = function convertTo (num) {
+ var r = num.umod(this.m);
+
+ return r === num ? r.clone() : r;
+ };
+
+ Red.prototype.convertFrom = function convertFrom (num) {
+ var res = num.clone();
+ res.red = null;
+ return res;
+ };
+
+ //
+ // Montgomery method engine
+ //
+
+ BN.mont = function mont (num) {
+ return new Mont(num);
+ };
+
+ function Mont (m) {
+ Red.call(this, m);
+
+ this.shift = this.m.bitLength();
+ if (this.shift % 26 !== 0) {
+ this.shift += 26 - (this.shift % 26);
+ }
+
+ this.r = new BN(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);
+ }
+ inherits(Mont, Red);
+
+ Mont.prototype.convertTo = function convertTo (num) {
+ return this.imod(num.ushln(this.shift));
+ };
+
+ Mont.prototype.convertFrom = function convertFrom (num) {
+ var r = this.imod(num.mul(this.rinv));
+ r.red = null;
+ return r;
+ };
+
+ Mont.prototype.imul = function imul (a, b) {
+ if (a.isZero() || b.isZero()) {
+ a.words[0] = 0;
+ a.length = 1;
+ return a;
+ }
+
+ var t = a.imul(b);
+ var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
+ var u = t.isub(c).iushrn(this.shift);
+ var res = u;
+
+ if (u.cmp(this.m) >= 0) {
+ res = u.isub(this.m);
+ } else if (u.cmpn(0) < 0) {
+ res = u.iadd(this.m);
+ }
+
+ return res._forceRed(this);
+ };
+
+ Mont.prototype.mul = function mul (a, b) {
+ if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);
+
+ var t = a.mul(b);
+ var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);
+ var u = t.isub(c).iushrn(this.shift);
+ var res = u;
+ if (u.cmp(this.m) >= 0) {
+ res = u.isub(this.m);
+ } else if (u.cmpn(0) < 0) {
+ res = u.iadd(this.m);
+ }
+
+ return res._forceRed(this);
+ };
+
+ Mont.prototype.invm = function invm (a) {
+ // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R
+ var res = this.imod(a._invmp(this.m).mul(this.r2));
+ return res._forceRed(this);
+ };
+})(typeof module === 'undefined' || module, this);
+
+},{}],127:[function(require,module,exports){
+module.exports={
+ "methods": {
+ "web3_clientVersion": [[], "S"],
+ "web3_sha3": [["S"], "D", 1],
+ "net_version": [[], "S"],
+ "net_peerCount": [[], "Q"],
+ "net_listening": [[], "B"],
+ "personal_sign": [["D", "D20", "S"], "D", 2],
+ "personal_ecRecover": [["D", "D"], "D20", 2],
+ "eth_protocolVersion": [[], "S"],
+ "eth_syncing": [[], "B|EthSyncing"],
+ "eth_coinbase": [[], "D20"],
+ "eth_mining": [[], "B"],
+ "eth_hashrate": [[], "Q"],
+ "eth_gasPrice": [[], "Q"],
+ "eth_accounts": [[], ["D20"]],
+ "eth_blockNumber": [[], "Q"],
+ "eth_getBalance": [["D20", "Q|T"], "Q", 1, 2],
+ "eth_getStorageAt": [["D20", "Q", "Q|T"], "D", 2, 2],
+ "eth_getTransactionCount": [["D20", "Q|T"], "Q", 1, 2],
+ "eth_getBlockTransactionCountByHash": [["D32"], "Q", 1],
+ "eth_getBlockTransactionCountByNumber": [["Q|T"], "Q", 1],
+ "eth_getUncleCountByBlockHash": [["D32"], "Q", 1],
+ "eth_getUncleCountByBlockNumber": [["Q"], "Q", 1],
+ "eth_getCode": [["D20", "Q|T"], "D", 1, 2],
+ "eth_sign": [["D20", "D"], "D", 2],
+ "eth_signTypedData": [["Array|DATA", "D20"], "D", 1],
+ "eth_sendTransaction": [["SendTransaction"], "D", 1],
+ "eth_sendRawTransaction": [["D"], "D32", 1],
+ "eth_call": [["CallTransaction", "Q|T"], "D", 1, 2],
+ "eth_estimateGas": [["EstimateTransaction", "Q|T"], "Q", 1],
+ "eth_getBlockByHash": [["D32", "B"], "Block", 2],
+ "eth_getBlockByNumber": [["Q|T", "B"], "Block", 2],
+ "eth_getTransactionByHash": [["D32"], "Transaction", 1],
+ "eth_getTransactionByBlockHashAndIndex": [["D32", "Q"], "Transaction", 2],
+ "eth_getTransactionByBlockNumberAndIndex": [["Q|T", "Q"], "Transaction", 2],
+ "eth_getTransactionReceipt": [["D32"], "Receipt", 1],
+ "eth_getUncleByBlockHashAndIndex": [["D32", "Q"], "Block", 1],
+ "eth_getUncleByBlockNumberAndIndex": [["Q|T", "Q"], "Block", 2],
+ "eth_getCompilers": [[], ["S"]],
+ "eth_compileLLL": [["S"], "D", 1],
+ "eth_compileSolidity": [["S"], "D", 1],
+ "eth_compileSerpent": [["S"], "D", 1],
+ "eth_newFilter": [["Filter"], "Q", 1],
+ "eth_newBlockFilter": [[], "Q"],
+ "eth_newPendingTransactionFilter": [[], "Q"],
+ "eth_uninstallFilter": [["QP"], "B", 1],
+ "eth_getFilterChanges": [["QP"], ["FilterChange"], 1],
+ "eth_getFilterLogs": [["QP"], ["FilterChange"], 1],
+ "eth_getLogs": [["Filter"], ["FilterChange"], 1],
+ "eth_getWork": [[], ["D"]],
+ "eth_submitWork": [["D", "D32", "D32"], "B", 3],
+ "eth_submitHashrate": [["D", "D"], "B", 2],
+ "db_putString": [["S", "S", "S"], "B", 2],
+ "db_getString": [["S", "S"], "S", 2],
+ "db_putHex": [["S", "S", "D"], "B", 2],
+ "db_getHex": [["S", "S"], "D", 2],
+ "shh_post": [["SHHPost"], "B", 1],
+ "shh_version": [[], "S"],
+ "shh_newIdentity": [[], "D"],
+ "shh_hasIdentity": [["D"], "B"],
+ "shh_newGroup": [[], "D"],
+ "shh_addToGroup": [["D"], "B", 1],
+ "shh_newFilter": [["SHHFilter"], "Q", 1],
+ "shh_uninstallFilter": [["Q"], "B", 1],
+ "shh_getFilterChanges": [["Q"], ["SHHFilterChange"], 1],
+ "shh_getMessages": [["Q"], ["SHHFilterChange"], 1]
+ },
+ "tags": ["latest", "earliest", "pending"],
+ "objects": {
+ "EthSyncing": {
+ "__required": [],
+ "startingBlock": "Q",
+ "currentBlock": "Q",
+ "highestBlock": "Q"
+ },
+ "SendTransaction": {
+ "__required": ["from", "data"],
+ "from": "D20",
+ "to": "D20",
+ "gas": "Q",
+ "gasPrice": "Q",
+ "value": "Q",
+ "data": "D",
+ "nonce": "Q"
+ },
+ "EstimateTransaction": {
+ "__required": [],
+ "from": "D20",
+ "to": "D20",
+ "gas": "Q",
+ "gasPrice": "Q",
+ "value": "Q",
+ "data": "D",
+ "nonce": "Q"
+ },
+ "CallTransaction": {
+ "__required": ["to"],
+ "from": "D20",
+ "to": "D20",
+ "gas": "Q",
+ "gasPrice": "Q",
+ "value": "Q",
+ "data": "D",
+ "nonce": "Q"
+ },
+ "Block": {
+ "__required": [],
+ "number": "Q",
+ "hash": "D32",
+ "parentHash": "D32",
+ "nonce": "D",
+ "sha3Uncles": "D",
+ "logsBloom": "D",
+ "transactionsRoot": "D",
+ "stateRoot": "D",
+ "receiptsRoot": "D",
+ "miner": "D",
+ "difficulty": "Q",
+ "totalDifficulty": "Q",
+ "extraData": "D",
+ "size": "Q",
+ "gasLimit": "Q",
+ "gasUsed": "Q",
+ "timestamp": "Q",
+ "transactions": ["DATA|Transaction"],
+ "uncles": ["D"]
+ },
+ "Transaction": {
+ "__required": [],
+ "hash": "D32",
+ "nonce": "Q",
+ "blockHash": "D32",
+ "blockNumber": "Q",
+ "transactionIndex": "Q",
+ "from": "D20",
+ "to": "D20",
+ "value": "Q",
+ "gasPrice": "Q",
+ "gas": "Q",
+ "input": "D"
+ },
+ "Receipt": {
+ "__required": [],
+ "transactionHash": "D32",
+ "transactionIndex": "Q",
+ "blockHash": "D32",
+ "blockNumber": "Q",
+ "cumulativeGasUsed": "Q",
+ "gasUsed": "Q",
+ "contractAddress": "D20",
+ "logs": ["FilterChange"]
+ },
+ "Filter": {
+ "__required": [],
+ "fromBlock": "Q|T",
+ "toBlock": "Q|T",
+ "address": "D20",
+ "topics": ["D"]
+ },
+ "FilterChange": {
+ "__required": [],
+ "removed": "B",
+ "logIndex": "Q",
+ "transactionIndex": "Q",
+ "transactionHash": "D32",
+ "blockHash": "D32",
+ "blockNumber": "Q",
+ "address": "D20",
+ "data": "Array|DATA",
+ "topics": ["D"]
+ },
+ "SHHPost": {
+ "__required": ["topics", "payload", "priority", "ttl"],
+ "from": "D",
+ "to": "D",
+ "topics": ["D"],
+ "payload": "D",
+ "priority": "Q",
+ "ttl": "Q"
+ },
+ "SHHFilter": {
+ "__required": ["topics"],
+ "to": "D",
+ "topics": ["D"]
+ },
+ "SHHFilterChange": {
+ "__required": [],
+ "hash": "D",
+ "from": "D",
+ "to": "D",
+ "expiry": "Q",
+ "ttl": "Q",
+ "sent": "Q",
+ "topics": ["D"],
+ "payload": "D",
+ "workProved": "Q"
+ },
+ "SHHMessage": {
+ "__required": [],
+ "hash": "D",
+ "from": "D",
+ "to": "D",
+ "expiry": "Q",
+ "ttl": "Q",
+ "sent": "Q",
+ "topics": ["D"],
+ "payload": "D",
+ "workProved": "Q"
+ }
+ }
+}
+
+},{}],128:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+'use strict';
+
+var R = typeof Reflect === 'object' ? Reflect : null
+var ReflectApply = R && typeof R.apply === 'function'
+ ? R.apply
+ : function ReflectApply(target, receiver, args) {
+ return Function.prototype.apply.call(target, receiver, args);
+ }
+
+var ReflectOwnKeys
+if (R && typeof R.ownKeys === 'function') {
+ ReflectOwnKeys = R.ownKeys
+} else if (Object.getOwnPropertySymbols) {
+ ReflectOwnKeys = function ReflectOwnKeys(target) {
+ return Object.getOwnPropertyNames(target)
+ .concat(Object.getOwnPropertySymbols(target));
+ };
+} else {
+ ReflectOwnKeys = function ReflectOwnKeys(target) {
+ return Object.getOwnPropertyNames(target);
+ };
+}
+
+function ProcessEmitWarning(warning) {
+ if (console && console.warn) console.warn(warning);
+}
+
+var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {
+ return value !== value;
+}
+
+function EventEmitter() {
+ EventEmitter.init.call(this);
+}
+module.exports = EventEmitter;
+module.exports.once = once;
+
+// Backwards-compat with node 0.10.x
+EventEmitter.EventEmitter = EventEmitter;
+
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._eventsCount = 0;
+EventEmitter.prototype._maxListeners = undefined;
+
+// By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+var defaultMaxListeners = 10;
+
+function checkListener(listener) {
+ if (typeof listener !== 'function') {
+ throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener);
+ }
+}
+
+Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
+ enumerable: true,
+ get: function() {
+ return defaultMaxListeners;
+ },
+ set: function(arg) {
+ if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {
+ throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.');
+ }
+ defaultMaxListeners = arg;
+ }
+});
+
+EventEmitter.init = function() {
+
+ if (this._events === undefined ||
+ this._events === Object.getPrototypeOf(this)._events) {
+ this._events = Object.create(null);
+ this._eventsCount = 0;
+ }
+
+ this._maxListeners = this._maxListeners || undefined;
+};
+
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
+ if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {
+ throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.');
+ }
+ this._maxListeners = n;
+ return this;
+};
+
+function _getMaxListeners(that) {
+ if (that._maxListeners === undefined)
+ return EventEmitter.defaultMaxListeners;
+ return that._maxListeners;
+}
+
+EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
+ return _getMaxListeners(this);
+};
+
+EventEmitter.prototype.emit = function emit(type) {
+ var args = [];
+ for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);
+ var doError = (type === 'error');
+
+ var events = this._events;
+ if (events !== undefined)
+ doError = (doError && events.error === undefined);
+ else if (!doError)
+ return false;
+
+ // If there is no 'error' event listener then throw.
+ if (doError) {
+ var er;
+ if (args.length > 0)
+ er = args[0];
+ if (er instanceof Error) {
+ // Note: The comments on the `throw` lines are intentional, they show
+ // up in Node's output if this results in an unhandled exception.
+ throw er; // Unhandled 'error' event
+ }
+ // At least give some kind of context to the user
+ var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));
+ err.context = er;
+ throw err; // Unhandled 'error' event
+ }
+
+ var handler = events[type];
+
+ if (handler === undefined)
+ return false;
+
+ if (typeof handler === 'function') {
+ ReflectApply(handler, this, args);
+ } else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+ for (var i = 0; i < len; ++i)
+ ReflectApply(listeners[i], this, args);
+ }
+
+ return true;
+};
+
+function _addListener(target, type, listener, prepend) {
+ var m;
+ var events;
+ var existing;
+
+ checkListener(listener);
+
+ events = target._events;
+ if (events === undefined) {
+ events = target._events = Object.create(null);
+ target._eventsCount = 0;
+ } else {
+ // To avoid recursion in the case that type === "newListener"! Before
+ // adding it to the listeners, first emit "newListener".
+ if (events.newListener !== undefined) {
+ target.emit('newListener', type,
+ listener.listener ? listener.listener : listener);
+
+ // Re-assign `events` because a newListener handler could have caused the
+ // this._events to be assigned to a new object
+ events = target._events;
+ }
+ existing = events[type];
+ }
+
+ if (existing === undefined) {
+ // Optimize the case of one listener. Don't need the extra array object.
+ existing = events[type] = listener;
+ ++target._eventsCount;
+ } else {
+ if (typeof existing === 'function') {
+ // Adding the second element, need to change to array.
+ existing = events[type] =
+ prepend ? [listener, existing] : [existing, listener];
+ // If we've already got an array, just append.
+ } else if (prepend) {
+ existing.unshift(listener);
+ } else {
+ existing.push(listener);
+ }
+
+ // Check for listener leak
+ m = _getMaxListeners(target);
+ if (m > 0 && existing.length > m && !existing.warned) {
+ existing.warned = true;
+ // No error code for this since it is a Warning
+ // eslint-disable-next-line no-restricted-syntax
+ var w = new Error('Possible EventEmitter memory leak detected. ' +
+ existing.length + ' ' + String(type) + ' listeners ' +
+ 'added. Use emitter.setMaxListeners() to ' +
+ 'increase limit');
+ w.name = 'MaxListenersExceededWarning';
+ w.emitter = target;
+ w.type = type;
+ w.count = existing.length;
+ ProcessEmitWarning(w);
+ }
+ }
+
+ return target;
+}
+
+EventEmitter.prototype.addListener = function addListener(type, listener) {
+ return _addListener(this, type, listener, false);
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.prependListener =
+ function prependListener(type, listener) {
+ return _addListener(this, type, listener, true);
+ };
+
+function onceWrapper() {
+ if (!this.fired) {
+ this.target.removeListener(this.type, this.wrapFn);
+ this.fired = true;
+ if (arguments.length === 0)
+ return this.listener.call(this.target);
+ return this.listener.apply(this.target, arguments);
+ }
+}
+
+function _onceWrap(target, type, listener) {
+ var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
+ var wrapped = onceWrapper.bind(state);
+ wrapped.listener = listener;
+ state.wrapFn = wrapped;
+ return wrapped;
+}
+
+EventEmitter.prototype.once = function once(type, listener) {
+ checkListener(listener);
+ this.on(type, _onceWrap(this, type, listener));
+ return this;
+};
+
+EventEmitter.prototype.prependOnceListener =
+ function prependOnceListener(type, listener) {
+ checkListener(listener);
+ this.prependListener(type, _onceWrap(this, type, listener));
+ return this;
+ };
+
+// Emits a 'removeListener' event if and only if the listener was removed.
+EventEmitter.prototype.removeListener =
+ function removeListener(type, listener) {
+ var list, events, position, i, originalListener;
+
+ checkListener(listener);
+
+ events = this._events;
+ if (events === undefined)
+ return this;
+
+ list = events[type];
+ if (list === undefined)
+ return this;
+
+ if (list === listener || list.listener === listener) {
+ if (--this._eventsCount === 0)
+ this._events = Object.create(null);
+ else {
+ delete events[type];
+ if (events.removeListener)
+ this.emit('removeListener', type, list.listener || listener);
+ }
+ } else if (typeof list !== 'function') {
+ position = -1;
+
+ for (i = list.length - 1; i >= 0; i--) {
+ if (list[i] === listener || list[i].listener === listener) {
+ originalListener = list[i].listener;
+ position = i;
+ break;
+ }
+ }
+
+ if (position < 0)
+ return this;
+
+ if (position === 0)
+ list.shift();
+ else {
+ spliceOne(list, position);
+ }
+
+ if (list.length === 1)
+ events[type] = list[0];
+
+ if (events.removeListener !== undefined)
+ this.emit('removeListener', type, originalListener || listener);
+ }
+
+ return this;
+ };
+
+EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
+
+EventEmitter.prototype.removeAllListeners =
+ function removeAllListeners(type) {
+ var listeners, events, i;
+
+ events = this._events;
+ if (events === undefined)
+ return this;
+
+ // not listening for removeListener, no need to emit
+ if (events.removeListener === undefined) {
+ if (arguments.length === 0) {
+ this._events = Object.create(null);
+ this._eventsCount = 0;
+ } else if (events[type] !== undefined) {
+ if (--this._eventsCount === 0)
+ this._events = Object.create(null);
+ else
+ delete events[type];
+ }
+ return this;
+ }
+
+ // emit removeListener for all listeners on all events
+ if (arguments.length === 0) {
+ var keys = Object.keys(events);
+ var key;
+ for (i = 0; i < keys.length; ++i) {
+ key = keys[i];
+ if (key === 'removeListener') continue;
+ this.removeAllListeners(key);
+ }
+ this.removeAllListeners('removeListener');
+ this._events = Object.create(null);
+ this._eventsCount = 0;
+ return this;
+ }
+
+ listeners = events[type];
+
+ if (typeof listeners === 'function') {
+ this.removeListener(type, listeners);
+ } else if (listeners !== undefined) {
+ // LIFO order
+ for (i = listeners.length - 1; i >= 0; i--) {
+ this.removeListener(type, listeners[i]);
+ }
+ }
+
+ return this;
+ };
+
+function _listeners(target, type, unwrap) {
+ var events = target._events;
+
+ if (events === undefined)
+ return [];
+
+ var evlistener = events[type];
+ if (evlistener === undefined)
+ return [];
+
+ if (typeof evlistener === 'function')
+ return unwrap ? [evlistener.listener || evlistener] : [evlistener];
+
+ return unwrap ?
+ unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
+}
+
+EventEmitter.prototype.listeners = function listeners(type) {
+ return _listeners(this, type, true);
+};
+
+EventEmitter.prototype.rawListeners = function rawListeners(type) {
+ return _listeners(this, type, false);
+};
+
+EventEmitter.listenerCount = function(emitter, type) {
+ if (typeof emitter.listenerCount === 'function') {
+ return emitter.listenerCount(type);
+ } else {
+ return listenerCount.call(emitter, type);
+ }
+};
+
+EventEmitter.prototype.listenerCount = listenerCount;
+function listenerCount(type) {
+ var events = this._events;
+
+ if (events !== undefined) {
+ var evlistener = events[type];
+
+ if (typeof evlistener === 'function') {
+ return 1;
+ } else if (evlistener !== undefined) {
+ return evlistener.length;
+ }
+ }
+
+ return 0;
+}
+
+EventEmitter.prototype.eventNames = function eventNames() {
+ return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];
+};
+
+function arrayClone(arr, n) {
+ var copy = new Array(n);
+ for (var i = 0; i < n; ++i)
+ copy[i] = arr[i];
+ return copy;
+}
+
+function spliceOne(list, index) {
+ for (; index + 1 < list.length; index++)
+ list[index] = list[index + 1];
+ list.pop();
+}
+
+function unwrapListeners(arr) {
+ var ret = new Array(arr.length);
+ for (var i = 0; i < ret.length; ++i) {
+ ret[i] = arr[i].listener || arr[i];
+ }
+ return ret;
+}
+
+function once(emitter, name) {
+ return new Promise(function (resolve, reject) {
+ function errorListener(err) {
+ emitter.removeListener(name, resolver);
+ reject(err);
+ }
+
+ function resolver() {
+ if (typeof emitter.removeListener === 'function') {
+ emitter.removeListener('error', errorListener);
+ }
+ resolve([].slice.call(arguments));
+ };
+
+ eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });
+ if (name !== 'error') {
+ addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });
+ }
+ });
+}
+
+function addErrorHandlerIfEventEmitter(emitter, handler, flags) {
+ if (typeof emitter.on === 'function') {
+ eventTargetAgnosticAddListener(emitter, 'error', handler, flags);
+ }
+}
+
+function eventTargetAgnosticAddListener(emitter, name, listener, flags) {
+ if (typeof emitter.on === 'function') {
+ if (flags.once) {
+ emitter.once(name, listener);
+ } else {
+ emitter.on(name, listener);
+ }
+ } else if (typeof emitter.addEventListener === 'function') {
+ // EventTarget does not have `error` event semantics like Node
+ // EventEmitters, we do not listen for `error` events here.
+ emitter.addEventListener(name, function wrapListener(arg) {
+ // IE does not have builtin `{ once: true }` support so we
+ // have to do it manually.
+ if (flags.once) {
+ emitter.removeEventListener(name, wrapListener);
+ }
+ listener(arg);
+ });
+ } else {
+ throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter);
+ }
+}
+
+},{}],129:[function(require,module,exports){
+(function (Buffer){(function (){
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const readable_stream_1 = require("readable-stream");
+class PortDuplexStream extends readable_stream_1.Duplex {
+ /**
+ * @param port - An instance of WebExtensions Runtime.Port. See:
+ * {@link https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/Port}
+ */
+ constructor(port) {
+ super({ objectMode: true });
+ this._port = port;
+ this._port.onMessage.addListener((msg) => this._onMessage(msg));
+ this._port.onDisconnect.addListener(() => this._onDisconnect());
+ this._log = () => null;
+ }
+ /**
+ * Callback triggered when a message is received from
+ * the remote Port associated with this Stream.
+ *
+ * @param msg - Payload from the onMessage listener of the port
+ */
+ _onMessage(msg) {
+ if (Buffer.isBuffer(msg)) {
+ const data = Buffer.from(msg);
+ this._log(data, false);
+ this.push(data);
+ }
+ else {
+ this._log(msg, false);
+ this.push(msg);
+ }
+ }
+ /**
+ * Callback triggered when the remote Port associated with this Stream
+ * disconnects.
+ */
+ _onDisconnect() {
+ this.destroy();
+ }
+ /**
+ * Explicitly sets read operations to a no-op.
+ */
+ _read() {
+ return undefined;
+ }
+ /**
+ * Called internally when data should be written to this writable stream.
+ *
+ * @param msg - Arbitrary object to write
+ * @param encoding - Encoding to use when writing payload
+ * @param cb - Called when writing is complete or an error occurs
+ */
+ _write(msg, _encoding, cb) {
+ try {
+ if (Buffer.isBuffer(msg)) {
+ const data = msg.toJSON();
+ data._isBuffer = true;
+ this._log(data, true);
+ this._port.postMessage(data);
+ }
+ else {
+ this._log(msg, true);
+ this._port.postMessage(msg);
+ }
+ }
+ catch (error) {
+ return cb(new Error('PortDuplexStream - disconnected'));
+ }
+ return cb();
+ }
+ /**
+ * Call to set a custom logger for incoming/outgoing messages
+ *
+ * @param log - the logger function
+ */
+ _setLogger(log) {
+ this._log = log;
+ }
+}
+exports.default = PortDuplexStream;
+
+}).call(this)}).call(this,require("buffer").Buffer)
+},{"buffer":120,"readable-stream":148}],130:[function(require,module,exports){
+'use strict'
+
+const { SymbolDispose } = require('../../ours/primordials')
+const { AbortError, codes } = require('../../ours/errors')
+const { isNodeStream, isWebStream, kControllerErrorFunction } = require('./utils')
+const eos = require('./end-of-stream')
+const { ERR_INVALID_ARG_TYPE } = codes
+let addAbortListener
+
+// This method is inlined here for readable-stream
+// It also does not allow for signal to not exist on the stream
+// https://github.com/nodejs/node/pull/36061#discussion_r533718029
+const validateAbortSignal = (signal, name) => {
+ if (typeof signal !== 'object' || !('aborted' in signal)) {
+ throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)
+ }
+}
+module.exports.addAbortSignal = function addAbortSignal(signal, stream) {
+ validateAbortSignal(signal, 'signal')
+ if (!isNodeStream(stream) && !isWebStream(stream)) {
+ throw new ERR_INVALID_ARG_TYPE('stream', ['ReadableStream', 'WritableStream', 'Stream'], stream)
+ }
+ return module.exports.addAbortSignalNoValidate(signal, stream)
+}
+module.exports.addAbortSignalNoValidate = function (signal, stream) {
+ if (typeof signal !== 'object' || !('aborted' in signal)) {
+ return stream
+ }
+ const onAbort = isNodeStream(stream)
+ ? () => {
+ stream.destroy(
+ new AbortError(undefined, {
+ cause: signal.reason
+ })
+ )
+ }
+ : () => {
+ stream[kControllerErrorFunction](
+ new AbortError(undefined, {
+ cause: signal.reason
+ })
+ )
+ }
+ if (signal.aborted) {
+ onAbort()
+ } else {
+ addAbortListener = addAbortListener || require('../../ours/util').addAbortListener
+ const disposable = addAbortListener(signal, onAbort)
+ eos(stream, disposable[SymbolDispose])
+ }
+ return stream
+}
+
+},{"../../ours/errors":149,"../../ours/primordials":150,"../../ours/util":151,"./end-of-stream":136,"./utils":145}],131:[function(require,module,exports){
+'use strict'
+
+const { StringPrototypeSlice, SymbolIterator, TypedArrayPrototypeSet, Uint8Array } = require('../../ours/primordials')
+const { Buffer } = require('buffer')
+const { inspect } = require('../../ours/util')
+module.exports = class BufferList {
+ constructor() {
+ this.head = null
+ this.tail = null
+ this.length = 0
+ }
+ push(v) {
+ const entry = {
+ data: v,
+ next: null
+ }
+ if (this.length > 0) this.tail.next = entry
+ else this.head = entry
+ this.tail = entry
+ ++this.length
+ }
+ unshift(v) {
+ const entry = {
+ data: v,
+ next: this.head
+ }
+ if (this.length === 0) this.tail = entry
+ this.head = entry
+ ++this.length
+ }
+ shift() {
+ if (this.length === 0) return
+ const ret = this.head.data
+ if (this.length === 1) this.head = this.tail = null
+ else this.head = this.head.next
+ --this.length
+ return ret
+ }
+ clear() {
+ this.head = this.tail = null
+ this.length = 0
+ }
+ join(s) {
+ if (this.length === 0) return ''
+ let p = this.head
+ let ret = '' + p.data
+ while ((p = p.next) !== null) ret += s + p.data
+ return ret
+ }
+ concat(n) {
+ if (this.length === 0) return Buffer.alloc(0)
+ const ret = Buffer.allocUnsafe(n >>> 0)
+ let p = this.head
+ let i = 0
+ while (p) {
+ TypedArrayPrototypeSet(ret, p.data, i)
+ i += p.data.length
+ p = p.next
+ }
+ return ret
+ }
+
+ // Consumes a specified amount of bytes or characters from the buffered data.
+ consume(n, hasStrings) {
+ const data = this.head.data
+ if (n < data.length) {
+ // `slice` is the same for buffers and strings.
+ const slice = data.slice(0, n)
+ this.head.data = data.slice(n)
+ return slice
+ }
+ if (n === data.length) {
+ // First chunk is a perfect match.
+ return this.shift()
+ }
+ // Result spans more than one buffer.
+ return hasStrings ? this._getString(n) : this._getBuffer(n)
+ }
+ first() {
+ return this.head.data
+ }
+ *[SymbolIterator]() {
+ for (let p = this.head; p; p = p.next) {
+ yield p.data
+ }
+ }
+
+ // Consumes a specified amount of characters from the buffered data.
+ _getString(n) {
+ let ret = ''
+ let p = this.head
+ let c = 0
+ do {
+ const str = p.data
+ if (n > str.length) {
+ ret += str
+ n -= str.length
+ } else {
+ if (n === str.length) {
+ ret += str
+ ++c
+ if (p.next) this.head = p.next
+ else this.head = this.tail = null
+ } else {
+ ret += StringPrototypeSlice(str, 0, n)
+ this.head = p
+ p.data = StringPrototypeSlice(str, n)
+ }
+ break
+ }
+ ++c
+ } while ((p = p.next) !== null)
+ this.length -= c
+ return ret
+ }
+
+ // Consumes a specified amount of bytes from the buffered data.
+ _getBuffer(n) {
+ const ret = Buffer.allocUnsafe(n)
+ const retLen = n
+ let p = this.head
+ let c = 0
+ do {
+ const buf = p.data
+ if (n > buf.length) {
+ TypedArrayPrototypeSet(ret, buf, retLen - n)
+ n -= buf.length
+ } else {
+ if (n === buf.length) {
+ TypedArrayPrototypeSet(ret, buf, retLen - n)
+ ++c
+ if (p.next) this.head = p.next
+ else this.head = this.tail = null
+ } else {
+ TypedArrayPrototypeSet(ret, new Uint8Array(buf.buffer, buf.byteOffset, n), retLen - n)
+ this.head = p
+ p.data = buf.slice(n)
+ }
+ break
+ }
+ ++c
+ } while ((p = p.next) !== null)
+ this.length -= c
+ return ret
+ }
+
+ // Make sure the linked list only shows the minimal necessary information.
+ [Symbol.for('nodejs.util.inspect.custom')](_, options) {
+ return inspect(this, {
+ ...options,
+ // Only inspect one level.
+ depth: 0,
+ // It should not recurse.
+ customInspect: false
+ })
+ }
+}
+
+},{"../../ours/primordials":150,"../../ours/util":151,"buffer":120}],132:[function(require,module,exports){
+'use strict'
+
+const { pipeline } = require('./pipeline')
+const Duplex = require('./duplex')
+const { destroyer } = require('./destroy')
+const {
+ isNodeStream,
+ isReadable,
+ isWritable,
+ isWebStream,
+ isTransformStream,
+ isWritableStream,
+ isReadableStream
+} = require('./utils')
+const {
+ AbortError,
+ codes: { ERR_INVALID_ARG_VALUE, ERR_MISSING_ARGS }
+} = require('../../ours/errors')
+const eos = require('./end-of-stream')
+module.exports = function compose(...streams) {
+ if (streams.length === 0) {
+ throw new ERR_MISSING_ARGS('streams')
+ }
+ if (streams.length === 1) {
+ return Duplex.from(streams[0])
+ }
+ const orgStreams = [...streams]
+ if (typeof streams[0] === 'function') {
+ streams[0] = Duplex.from(streams[0])
+ }
+ if (typeof streams[streams.length - 1] === 'function') {
+ const idx = streams.length - 1
+ streams[idx] = Duplex.from(streams[idx])
+ }
+ for (let n = 0; n < streams.length; ++n) {
+ if (!isNodeStream(streams[n]) && !isWebStream(streams[n])) {
+ // TODO(ronag): Add checks for non streams.
+ continue
+ }
+ if (
+ n < streams.length - 1 &&
+ !(isReadable(streams[n]) || isReadableStream(streams[n]) || isTransformStream(streams[n]))
+ ) {
+ throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be readable')
+ }
+ if (n > 0 && !(isWritable(streams[n]) || isWritableStream(streams[n]) || isTransformStream(streams[n]))) {
+ throw new ERR_INVALID_ARG_VALUE(`streams[${n}]`, orgStreams[n], 'must be writable')
+ }
+ }
+ let ondrain
+ let onfinish
+ let onreadable
+ let onclose
+ let d
+ function onfinished(err) {
+ const cb = onclose
+ onclose = null
+ if (cb) {
+ cb(err)
+ } else if (err) {
+ d.destroy(err)
+ } else if (!readable && !writable) {
+ d.destroy()
+ }
+ }
+ const head = streams[0]
+ const tail = pipeline(streams, onfinished)
+ const writable = !!(isWritable(head) || isWritableStream(head) || isTransformStream(head))
+ const readable = !!(isReadable(tail) || isReadableStream(tail) || isTransformStream(tail))
+
+ // TODO(ronag): Avoid double buffering.
+ // Implement Writable/Readable/Duplex traits.
+ // See, https://github.com/nodejs/node/pull/33515.
+ d = new Duplex({
+ // TODO (ronag): highWaterMark?
+ writableObjectMode: !!(head !== null && head !== undefined && head.writableObjectMode),
+ readableObjectMode: !!(tail !== null && tail !== undefined && tail.readableObjectMode),
+ writable,
+ readable
+ })
+ if (writable) {
+ if (isNodeStream(head)) {
+ d._write = function (chunk, encoding, callback) {
+ if (head.write(chunk, encoding)) {
+ callback()
+ } else {
+ ondrain = callback
+ }
+ }
+ d._final = function (callback) {
+ head.end()
+ onfinish = callback
+ }
+ head.on('drain', function () {
+ if (ondrain) {
+ const cb = ondrain
+ ondrain = null
+ cb()
+ }
+ })
+ } else if (isWebStream(head)) {
+ const writable = isTransformStream(head) ? head.writable : head
+ const writer = writable.getWriter()
+ d._write = async function (chunk, encoding, callback) {
+ try {
+ await writer.ready
+ writer.write(chunk).catch(() => {})
+ callback()
+ } catch (err) {
+ callback(err)
+ }
+ }
+ d._final = async function (callback) {
+ try {
+ await writer.ready
+ writer.close().catch(() => {})
+ onfinish = callback
+ } catch (err) {
+ callback(err)
+ }
+ }
+ }
+ const toRead = isTransformStream(tail) ? tail.readable : tail
+ eos(toRead, () => {
+ if (onfinish) {
+ const cb = onfinish
+ onfinish = null
+ cb()
+ }
+ })
+ }
+ if (readable) {
+ if (isNodeStream(tail)) {
+ tail.on('readable', function () {
+ if (onreadable) {
+ const cb = onreadable
+ onreadable = null
+ cb()
+ }
+ })
+ tail.on('end', function () {
+ d.push(null)
+ })
+ d._read = function () {
+ while (true) {
+ const buf = tail.read()
+ if (buf === null) {
+ onreadable = d._read
+ return
+ }
+ if (!d.push(buf)) {
+ return
+ }
+ }
+ }
+ } else if (isWebStream(tail)) {
+ const readable = isTransformStream(tail) ? tail.readable : tail
+ const reader = readable.getReader()
+ d._read = async function () {
+ while (true) {
+ try {
+ const { value, done } = await reader.read()
+ if (!d.push(value)) {
+ return
+ }
+ if (done) {
+ d.push(null)
+ return
+ }
+ } catch {
+ return
+ }
+ }
+ }
+ }
+ }
+ d._destroy = function (err, callback) {
+ if (!err && onclose !== null) {
+ err = new AbortError()
+ }
+ onreadable = null
+ ondrain = null
+ onfinish = null
+ if (onclose === null) {
+ callback(err)
+ } else {
+ onclose = callback
+ if (isNodeStream(tail)) {
+ destroyer(tail, err)
+ }
+ }
+ }
+ return d
+}
+
+},{"../../ours/errors":149,"./destroy":133,"./duplex":134,"./end-of-stream":136,"./pipeline":141,"./utils":145}],133:[function(require,module,exports){
+'use strict'
+
+/* replacement start */
+
+const process = require('process/')
+
+/* replacement end */
+
+const {
+ aggregateTwoErrors,
+ codes: { ERR_MULTIPLE_CALLBACK },
+ AbortError
+} = require('../../ours/errors')
+const { Symbol } = require('../../ours/primordials')
+const { kIsDestroyed, isDestroyed, isFinished, isServerRequest } = require('./utils')
+const kDestroy = Symbol('kDestroy')
+const kConstruct = Symbol('kConstruct')
+function checkError(err, w, r) {
+ if (err) {
+ // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
+ err.stack // eslint-disable-line no-unused-expressions
+
+ if (w && !w.errored) {
+ w.errored = err
+ }
+ if (r && !r.errored) {
+ r.errored = err
+ }
+ }
+}
+
+// Backwards compat. cb() is undocumented and unused in core but
+// unfortunately might be used by modules.
+function destroy(err, cb) {
+ const r = this._readableState
+ const w = this._writableState
+ // With duplex streams we use the writable side for state.
+ const s = w || r
+ if ((w !== null && w !== undefined && w.destroyed) || (r !== null && r !== undefined && r.destroyed)) {
+ if (typeof cb === 'function') {
+ cb()
+ }
+ return this
+ }
+
+ // We set destroyed to true before firing error callbacks in order
+ // to make it re-entrance safe in case destroy() is called within callbacks
+ checkError(err, w, r)
+ if (w) {
+ w.destroyed = true
+ }
+ if (r) {
+ r.destroyed = true
+ }
+
+ // If still constructing then defer calling _destroy.
+ if (!s.constructed) {
+ this.once(kDestroy, function (er) {
+ _destroy(this, aggregateTwoErrors(er, err), cb)
+ })
+ } else {
+ _destroy(this, err, cb)
+ }
+ return this
+}
+function _destroy(self, err, cb) {
+ let called = false
+ function onDestroy(err) {
+ if (called) {
+ return
+ }
+ called = true
+ const r = self._readableState
+ const w = self._writableState
+ checkError(err, w, r)
+ if (w) {
+ w.closed = true
+ }
+ if (r) {
+ r.closed = true
+ }
+ if (typeof cb === 'function') {
+ cb(err)
+ }
+ if (err) {
+ process.nextTick(emitErrorCloseNT, self, err)
+ } else {
+ process.nextTick(emitCloseNT, self)
+ }
+ }
+ try {
+ self._destroy(err || null, onDestroy)
+ } catch (err) {
+ onDestroy(err)
+ }
+}
+function emitErrorCloseNT(self, err) {
+ emitErrorNT(self, err)
+ emitCloseNT(self)
+}
+function emitCloseNT(self) {
+ const r = self._readableState
+ const w = self._writableState
+ if (w) {
+ w.closeEmitted = true
+ }
+ if (r) {
+ r.closeEmitted = true
+ }
+ if ((w !== null && w !== undefined && w.emitClose) || (r !== null && r !== undefined && r.emitClose)) {
+ self.emit('close')
+ }
+}
+function emitErrorNT(self, err) {
+ const r = self._readableState
+ const w = self._writableState
+ if ((w !== null && w !== undefined && w.errorEmitted) || (r !== null && r !== undefined && r.errorEmitted)) {
+ return
+ }
+ if (w) {
+ w.errorEmitted = true
+ }
+ if (r) {
+ r.errorEmitted = true
+ }
+ self.emit('error', err)
+}
+function undestroy() {
+ const r = this._readableState
+ const w = this._writableState
+ if (r) {
+ r.constructed = true
+ r.closed = false
+ r.closeEmitted = false
+ r.destroyed = false
+ r.errored = null
+ r.errorEmitted = false
+ r.reading = false
+ r.ended = r.readable === false
+ r.endEmitted = r.readable === false
+ }
+ if (w) {
+ w.constructed = true
+ w.destroyed = false
+ w.closed = false
+ w.closeEmitted = false
+ w.errored = null
+ w.errorEmitted = false
+ w.finalCalled = false
+ w.prefinished = false
+ w.ended = w.writable === false
+ w.ending = w.writable === false
+ w.finished = w.writable === false
+ }
+}
+function errorOrDestroy(stream, err, sync) {
+ // We have tests that rely on errors being emitted
+ // in the same tick, so changing this is semver major.
+ // For now when you opt-in to autoDestroy we allow
+ // the error to be emitted nextTick. In a future
+ // semver major update we should change the default to this.
+
+ const r = stream._readableState
+ const w = stream._writableState
+ if ((w !== null && w !== undefined && w.destroyed) || (r !== null && r !== undefined && r.destroyed)) {
+ return this
+ }
+ if ((r !== null && r !== undefined && r.autoDestroy) || (w !== null && w !== undefined && w.autoDestroy))
+ stream.destroy(err)
+ else if (err) {
+ // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
+ err.stack // eslint-disable-line no-unused-expressions
+
+ if (w && !w.errored) {
+ w.errored = err
+ }
+ if (r && !r.errored) {
+ r.errored = err
+ }
+ if (sync) {
+ process.nextTick(emitErrorNT, stream, err)
+ } else {
+ emitErrorNT(stream, err)
+ }
+ }
+}
+function construct(stream, cb) {
+ if (typeof stream._construct !== 'function') {
+ return
+ }
+ const r = stream._readableState
+ const w = stream._writableState
+ if (r) {
+ r.constructed = false
+ }
+ if (w) {
+ w.constructed = false
+ }
+ stream.once(kConstruct, cb)
+ if (stream.listenerCount(kConstruct) > 1) {
+ // Duplex
+ return
+ }
+ process.nextTick(constructNT, stream)
+}
+function constructNT(stream) {
+ let called = false
+ function onConstruct(err) {
+ if (called) {
+ errorOrDestroy(stream, err !== null && err !== undefined ? err : new ERR_MULTIPLE_CALLBACK())
+ return
+ }
+ called = true
+ const r = stream._readableState
+ const w = stream._writableState
+ const s = w || r
+ if (r) {
+ r.constructed = true
+ }
+ if (w) {
+ w.constructed = true
+ }
+ if (s.destroyed) {
+ stream.emit(kDestroy, err)
+ } else if (err) {
+ errorOrDestroy(stream, err, true)
+ } else {
+ process.nextTick(emitConstructNT, stream)
+ }
+ }
+ try {
+ stream._construct((err) => {
+ process.nextTick(onConstruct, err)
+ })
+ } catch (err) {
+ process.nextTick(onConstruct, err)
+ }
+}
+function emitConstructNT(stream) {
+ stream.emit(kConstruct)
+}
+function isRequest(stream) {
+ return (stream === null || stream === undefined ? undefined : stream.setHeader) && typeof stream.abort === 'function'
+}
+function emitCloseLegacy(stream) {
+ stream.emit('close')
+}
+function emitErrorCloseLegacy(stream, err) {
+ stream.emit('error', err)
+ process.nextTick(emitCloseLegacy, stream)
+}
+
+// Normalize destroy for legacy.
+function destroyer(stream, err) {
+ if (!stream || isDestroyed(stream)) {
+ return
+ }
+ if (!err && !isFinished(stream)) {
+ err = new AbortError()
+ }
+
+ // TODO: Remove isRequest branches.
+ if (isServerRequest(stream)) {
+ stream.socket = null
+ stream.destroy(err)
+ } else if (isRequest(stream)) {
+ stream.abort()
+ } else if (isRequest(stream.req)) {
+ stream.req.abort()
+ } else if (typeof stream.destroy === 'function') {
+ stream.destroy(err)
+ } else if (typeof stream.close === 'function') {
+ // TODO: Don't lose err?
+ stream.close()
+ } else if (err) {
+ process.nextTick(emitErrorCloseLegacy, stream, err)
+ } else {
+ process.nextTick(emitCloseLegacy, stream)
+ }
+ if (!stream.destroyed) {
+ stream[kIsDestroyed] = true
+ }
+}
+module.exports = {
+ construct,
+ destroyer,
+ destroy,
+ undestroy,
+ errorOrDestroy
+}
+
+},{"../../ours/errors":149,"../../ours/primordials":150,"./utils":145,"process/":168}],134:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototype inheritance, this class
+// prototypically inherits from Readable, and then parasitically from
+// Writable.
+
+'use strict'
+
+const {
+ ObjectDefineProperties,
+ ObjectGetOwnPropertyDescriptor,
+ ObjectKeys,
+ ObjectSetPrototypeOf
+} = require('../../ours/primordials')
+module.exports = Duplex
+const Readable = require('./readable')
+const Writable = require('./writable')
+ObjectSetPrototypeOf(Duplex.prototype, Readable.prototype)
+ObjectSetPrototypeOf(Duplex, Readable)
+{
+ const keys = ObjectKeys(Writable.prototype)
+ // Allow the keys array to be GC'ed.
+ for (let i = 0; i < keys.length; i++) {
+ const method = keys[i]
+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]
+ }
+}
+function Duplex(options) {
+ if (!(this instanceof Duplex)) return new Duplex(options)
+ Readable.call(this, options)
+ Writable.call(this, options)
+ if (options) {
+ this.allowHalfOpen = options.allowHalfOpen !== false
+ if (options.readable === false) {
+ this._readableState.readable = false
+ this._readableState.ended = true
+ this._readableState.endEmitted = true
+ }
+ if (options.writable === false) {
+ this._writableState.writable = false
+ this._writableState.ending = true
+ this._writableState.ended = true
+ this._writableState.finished = true
+ }
+ } else {
+ this.allowHalfOpen = true
+ }
+}
+ObjectDefineProperties(Duplex.prototype, {
+ writable: {
+ __proto__: null,
+ ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writable')
+ },
+ writableHighWaterMark: {
+ __proto__: null,
+ ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableHighWaterMark')
+ },
+ writableObjectMode: {
+ __proto__: null,
+ ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableObjectMode')
+ },
+ writableBuffer: {
+ __proto__: null,
+ ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableBuffer')
+ },
+ writableLength: {
+ __proto__: null,
+ ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableLength')
+ },
+ writableFinished: {
+ __proto__: null,
+ ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableFinished')
+ },
+ writableCorked: {
+ __proto__: null,
+ ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableCorked')
+ },
+ writableEnded: {
+ __proto__: null,
+ ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableEnded')
+ },
+ writableNeedDrain: {
+ __proto__: null,
+ ...ObjectGetOwnPropertyDescriptor(Writable.prototype, 'writableNeedDrain')
+ },
+ destroyed: {
+ __proto__: null,
+ get() {
+ if (this._readableState === undefined || this._writableState === undefined) {
+ return false
+ }
+ return this._readableState.destroyed && this._writableState.destroyed
+ },
+ set(value) {
+ // Backward compatibility, the user is explicitly
+ // managing destroyed.
+ if (this._readableState && this._writableState) {
+ this._readableState.destroyed = value
+ this._writableState.destroyed = value
+ }
+ }
+ }
+})
+let webStreamsAdapters
+
+// Lazy to avoid circular references
+function lazyWebStreams() {
+ if (webStreamsAdapters === undefined) webStreamsAdapters = {}
+ return webStreamsAdapters
+}
+Duplex.fromWeb = function (pair, options) {
+ return lazyWebStreams().newStreamDuplexFromReadableWritablePair(pair, options)
+}
+Duplex.toWeb = function (duplex) {
+ return lazyWebStreams().newReadableWritablePairFromDuplex(duplex)
+}
+let duplexify
+Duplex.from = function (body) {
+ if (!duplexify) {
+ duplexify = require('./duplexify')
+ }
+ return duplexify(body, 'body')
+}
+
+},{"../../ours/primordials":150,"./duplexify":135,"./readable":142,"./writable":146}],135:[function(require,module,exports){
+/* replacement start */
+
+const process = require('process/')
+
+/* replacement end */
+
+;('use strict')
+const bufferModule = require('buffer')
+const {
+ isReadable,
+ isWritable,
+ isIterable,
+ isNodeStream,
+ isReadableNodeStream,
+ isWritableNodeStream,
+ isDuplexNodeStream,
+ isReadableStream,
+ isWritableStream
+} = require('./utils')
+const eos = require('./end-of-stream')
+const {
+ AbortError,
+ codes: { ERR_INVALID_ARG_TYPE, ERR_INVALID_RETURN_VALUE }
+} = require('../../ours/errors')
+const { destroyer } = require('./destroy')
+const Duplex = require('./duplex')
+const Readable = require('./readable')
+const Writable = require('./writable')
+const { createDeferredPromise } = require('../../ours/util')
+const from = require('./from')
+const Blob = globalThis.Blob || bufferModule.Blob
+const isBlob =
+ typeof Blob !== 'undefined'
+ ? function isBlob(b) {
+ return b instanceof Blob
+ }
+ : function isBlob(b) {
+ return false
+ }
+const AbortController = globalThis.AbortController || require('abort-controller').AbortController
+const { FunctionPrototypeCall } = require('../../ours/primordials')
+
+// This is needed for pre node 17.
+class Duplexify extends Duplex {
+ constructor(options) {
+ super(options)
+
+ // https://github.com/nodejs/node/pull/34385
+
+ if ((options === null || options === undefined ? undefined : options.readable) === false) {
+ this._readableState.readable = false
+ this._readableState.ended = true
+ this._readableState.endEmitted = true
+ }
+ if ((options === null || options === undefined ? undefined : options.writable) === false) {
+ this._writableState.writable = false
+ this._writableState.ending = true
+ this._writableState.ended = true
+ this._writableState.finished = true
+ }
+ }
+}
+module.exports = function duplexify(body, name) {
+ if (isDuplexNodeStream(body)) {
+ return body
+ }
+ if (isReadableNodeStream(body)) {
+ return _duplexify({
+ readable: body
+ })
+ }
+ if (isWritableNodeStream(body)) {
+ return _duplexify({
+ writable: body
+ })
+ }
+ if (isNodeStream(body)) {
+ return _duplexify({
+ writable: false,
+ readable: false
+ })
+ }
+ if (isReadableStream(body)) {
+ return _duplexify({
+ readable: Readable.fromWeb(body)
+ })
+ }
+ if (isWritableStream(body)) {
+ return _duplexify({
+ writable: Writable.fromWeb(body)
+ })
+ }
+ if (typeof body === 'function') {
+ const { value, write, final, destroy } = fromAsyncGen(body)
+ if (isIterable(value)) {
+ return from(Duplexify, value, {
+ // TODO (ronag): highWaterMark?
+ objectMode: true,
+ write,
+ final,
+ destroy
+ })
+ }
+ const then = value === null || value === undefined ? undefined : value.then
+ if (typeof then === 'function') {
+ let d
+ const promise = FunctionPrototypeCall(
+ then,
+ value,
+ (val) => {
+ if (val != null) {
+ throw new ERR_INVALID_RETURN_VALUE('nully', 'body', val)
+ }
+ },
+ (err) => {
+ destroyer(d, err)
+ }
+ )
+ return (d = new Duplexify({
+ // TODO (ronag): highWaterMark?
+ objectMode: true,
+ readable: false,
+ write,
+ final(cb) {
+ final(async () => {
+ try {
+ await promise
+ process.nextTick(cb, null)
+ } catch (err) {
+ process.nextTick(cb, err)
+ }
+ })
+ },
+ destroy
+ }))
+ }
+ throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or AsyncFunction', name, value)
+ }
+ if (isBlob(body)) {
+ return duplexify(body.arrayBuffer())
+ }
+ if (isIterable(body)) {
+ return from(Duplexify, body, {
+ // TODO (ronag): highWaterMark?
+ objectMode: true,
+ writable: false
+ })
+ }
+ if (
+ isReadableStream(body === null || body === undefined ? undefined : body.readable) &&
+ isWritableStream(body === null || body === undefined ? undefined : body.writable)
+ ) {
+ return Duplexify.fromWeb(body)
+ }
+ if (
+ typeof (body === null || body === undefined ? undefined : body.writable) === 'object' ||
+ typeof (body === null || body === undefined ? undefined : body.readable) === 'object'
+ ) {
+ const readable =
+ body !== null && body !== undefined && body.readable
+ ? isReadableNodeStream(body === null || body === undefined ? undefined : body.readable)
+ ? body === null || body === undefined
+ ? undefined
+ : body.readable
+ : duplexify(body.readable)
+ : undefined
+ const writable =
+ body !== null && body !== undefined && body.writable
+ ? isWritableNodeStream(body === null || body === undefined ? undefined : body.writable)
+ ? body === null || body === undefined
+ ? undefined
+ : body.writable
+ : duplexify(body.writable)
+ : undefined
+ return _duplexify({
+ readable,
+ writable
+ })
+ }
+ const then = body === null || body === undefined ? undefined : body.then
+ if (typeof then === 'function') {
+ let d
+ FunctionPrototypeCall(
+ then,
+ body,
+ (val) => {
+ if (val != null) {
+ d.push(val)
+ }
+ d.push(null)
+ },
+ (err) => {
+ destroyer(d, err)
+ }
+ )
+ return (d = new Duplexify({
+ objectMode: true,
+ writable: false,
+ read() {}
+ }))
+ }
+ throw new ERR_INVALID_ARG_TYPE(
+ name,
+ [
+ 'Blob',
+ 'ReadableStream',
+ 'WritableStream',
+ 'Stream',
+ 'Iterable',
+ 'AsyncIterable',
+ 'Function',
+ '{ readable, writable } pair',
+ 'Promise'
+ ],
+ body
+ )
+}
+function fromAsyncGen(fn) {
+ let { promise, resolve } = createDeferredPromise()
+ const ac = new AbortController()
+ const signal = ac.signal
+ const value = fn(
+ (async function* () {
+ while (true) {
+ const _promise = promise
+ promise = null
+ const { chunk, done, cb } = await _promise
+ process.nextTick(cb)
+ if (done) return
+ if (signal.aborted)
+ throw new AbortError(undefined, {
+ cause: signal.reason
+ })
+ ;({ promise, resolve } = createDeferredPromise())
+ yield chunk
+ }
+ })(),
+ {
+ signal
+ }
+ )
+ return {
+ value,
+ write(chunk, encoding, cb) {
+ const _resolve = resolve
+ resolve = null
+ _resolve({
+ chunk,
+ done: false,
+ cb
+ })
+ },
+ final(cb) {
+ const _resolve = resolve
+ resolve = null
+ _resolve({
+ done: true,
+ cb
+ })
+ },
+ destroy(err, cb) {
+ ac.abort()
+ cb(err)
+ }
+ }
+}
+function _duplexify(pair) {
+ const r = pair.readable && typeof pair.readable.read !== 'function' ? Readable.wrap(pair.readable) : pair.readable
+ const w = pair.writable
+ let readable = !!isReadable(r)
+ let writable = !!isWritable(w)
+ let ondrain
+ let onfinish
+ let onreadable
+ let onclose
+ let d
+ function onfinished(err) {
+ const cb = onclose
+ onclose = null
+ if (cb) {
+ cb(err)
+ } else if (err) {
+ d.destroy(err)
+ }
+ }
+
+ // TODO(ronag): Avoid double buffering.
+ // Implement Writable/Readable/Duplex traits.
+ // See, https://github.com/nodejs/node/pull/33515.
+ d = new Duplexify({
+ // TODO (ronag): highWaterMark?
+ readableObjectMode: !!(r !== null && r !== undefined && r.readableObjectMode),
+ writableObjectMode: !!(w !== null && w !== undefined && w.writableObjectMode),
+ readable,
+ writable
+ })
+ if (writable) {
+ eos(w, (err) => {
+ writable = false
+ if (err) {
+ destroyer(r, err)
+ }
+ onfinished(err)
+ })
+ d._write = function (chunk, encoding, callback) {
+ if (w.write(chunk, encoding)) {
+ callback()
+ } else {
+ ondrain = callback
+ }
+ }
+ d._final = function (callback) {
+ w.end()
+ onfinish = callback
+ }
+ w.on('drain', function () {
+ if (ondrain) {
+ const cb = ondrain
+ ondrain = null
+ cb()
+ }
+ })
+ w.on('finish', function () {
+ if (onfinish) {
+ const cb = onfinish
+ onfinish = null
+ cb()
+ }
+ })
+ }
+ if (readable) {
+ eos(r, (err) => {
+ readable = false
+ if (err) {
+ destroyer(r, err)
+ }
+ onfinished(err)
+ })
+ r.on('readable', function () {
+ if (onreadable) {
+ const cb = onreadable
+ onreadable = null
+ cb()
+ }
+ })
+ r.on('end', function () {
+ d.push(null)
+ })
+ d._read = function () {
+ while (true) {
+ const buf = r.read()
+ if (buf === null) {
+ onreadable = d._read
+ return
+ }
+ if (!d.push(buf)) {
+ return
+ }
+ }
+ }
+ }
+ d._destroy = function (err, callback) {
+ if (!err && onclose !== null) {
+ err = new AbortError()
+ }
+ onreadable = null
+ ondrain = null
+ onfinish = null
+ if (onclose === null) {
+ callback(err)
+ } else {
+ onclose = callback
+ destroyer(w, err)
+ destroyer(r, err)
+ }
+ }
+ return d
+}
+
+},{"../../ours/errors":149,"../../ours/primordials":150,"../../ours/util":151,"./destroy":133,"./duplex":134,"./end-of-stream":136,"./from":137,"./readable":142,"./utils":145,"./writable":146,"abort-controller":116,"buffer":120,"process/":168}],136:[function(require,module,exports){
+/* replacement start */
+
+const process = require('process/')
+
+/* replacement end */
+// Ported from https://github.com/mafintosh/end-of-stream with
+// permission from the author, Mathias Buus (@mafintosh).
+
+;('use strict')
+const { AbortError, codes } = require('../../ours/errors')
+const { ERR_INVALID_ARG_TYPE, ERR_STREAM_PREMATURE_CLOSE } = codes
+const { kEmptyObject, once } = require('../../ours/util')
+const { validateAbortSignal, validateFunction, validateObject, validateBoolean } = require('../validators')
+const { Promise, PromisePrototypeThen, SymbolDispose } = require('../../ours/primordials')
+const {
+ isClosed,
+ isReadable,
+ isReadableNodeStream,
+ isReadableStream,
+ isReadableFinished,
+ isReadableErrored,
+ isWritable,
+ isWritableNodeStream,
+ isWritableStream,
+ isWritableFinished,
+ isWritableErrored,
+ isNodeStream,
+ willEmitClose: _willEmitClose,
+ kIsClosedPromise
+} = require('./utils')
+let addAbortListener
+function isRequest(stream) {
+ return stream.setHeader && typeof stream.abort === 'function'
+}
+const nop = () => {}
+function eos(stream, options, callback) {
+ var _options$readable, _options$writable
+ if (arguments.length === 2) {
+ callback = options
+ options = kEmptyObject
+ } else if (options == null) {
+ options = kEmptyObject
+ } else {
+ validateObject(options, 'options')
+ }
+ validateFunction(callback, 'callback')
+ validateAbortSignal(options.signal, 'options.signal')
+ callback = once(callback)
+ if (isReadableStream(stream) || isWritableStream(stream)) {
+ return eosWeb(stream, options, callback)
+ }
+ if (!isNodeStream(stream)) {
+ throw new ERR_INVALID_ARG_TYPE('stream', ['ReadableStream', 'WritableStream', 'Stream'], stream)
+ }
+ const readable =
+ (_options$readable = options.readable) !== null && _options$readable !== undefined
+ ? _options$readable
+ : isReadableNodeStream(stream)
+ const writable =
+ (_options$writable = options.writable) !== null && _options$writable !== undefined
+ ? _options$writable
+ : isWritableNodeStream(stream)
+ const wState = stream._writableState
+ const rState = stream._readableState
+ const onlegacyfinish = () => {
+ if (!stream.writable) {
+ onfinish()
+ }
+ }
+
+ // TODO (ronag): Improve soft detection to include core modules and
+ // common ecosystem modules that do properly emit 'close' but fail
+ // this generic check.
+ let willEmitClose =
+ _willEmitClose(stream) && isReadableNodeStream(stream) === readable && isWritableNodeStream(stream) === writable
+ let writableFinished = isWritableFinished(stream, false)
+ const onfinish = () => {
+ writableFinished = true
+ // Stream should not be destroyed here. If it is that
+ // means that user space is doing something differently and
+ // we cannot trust willEmitClose.
+ if (stream.destroyed) {
+ willEmitClose = false
+ }
+ if (willEmitClose && (!stream.readable || readable)) {
+ return
+ }
+ if (!readable || readableFinished) {
+ callback.call(stream)
+ }
+ }
+ let readableFinished = isReadableFinished(stream, false)
+ const onend = () => {
+ readableFinished = true
+ // Stream should not be destroyed here. If it is that
+ // means that user space is doing something differently and
+ // we cannot trust willEmitClose.
+ if (stream.destroyed) {
+ willEmitClose = false
+ }
+ if (willEmitClose && (!stream.writable || writable)) {
+ return
+ }
+ if (!writable || writableFinished) {
+ callback.call(stream)
+ }
+ }
+ const onerror = (err) => {
+ callback.call(stream, err)
+ }
+ let closed = isClosed(stream)
+ const onclose = () => {
+ closed = true
+ const errored = isWritableErrored(stream) || isReadableErrored(stream)
+ if (errored && typeof errored !== 'boolean') {
+ return callback.call(stream, errored)
+ }
+ if (readable && !readableFinished && isReadableNodeStream(stream, true)) {
+ if (!isReadableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE())
+ }
+ if (writable && !writableFinished) {
+ if (!isWritableFinished(stream, false)) return callback.call(stream, new ERR_STREAM_PREMATURE_CLOSE())
+ }
+ callback.call(stream)
+ }
+ const onclosed = () => {
+ closed = true
+ const errored = isWritableErrored(stream) || isReadableErrored(stream)
+ if (errored && typeof errored !== 'boolean') {
+ return callback.call(stream, errored)
+ }
+ callback.call(stream)
+ }
+ const onrequest = () => {
+ stream.req.on('finish', onfinish)
+ }
+ if (isRequest(stream)) {
+ stream.on('complete', onfinish)
+ if (!willEmitClose) {
+ stream.on('abort', onclose)
+ }
+ if (stream.req) {
+ onrequest()
+ } else {
+ stream.on('request', onrequest)
+ }
+ } else if (writable && !wState) {
+ // legacy streams
+ stream.on('end', onlegacyfinish)
+ stream.on('close', onlegacyfinish)
+ }
+
+ // Not all streams will emit 'close' after 'aborted'.
+ if (!willEmitClose && typeof stream.aborted === 'boolean') {
+ stream.on('aborted', onclose)
+ }
+ stream.on('end', onend)
+ stream.on('finish', onfinish)
+ if (options.error !== false) {
+ stream.on('error', onerror)
+ }
+ stream.on('close', onclose)
+ if (closed) {
+ process.nextTick(onclose)
+ } else if (
+ (wState !== null && wState !== undefined && wState.errorEmitted) ||
+ (rState !== null && rState !== undefined && rState.errorEmitted)
+ ) {
+ if (!willEmitClose) {
+ process.nextTick(onclosed)
+ }
+ } else if (
+ !readable &&
+ (!willEmitClose || isReadable(stream)) &&
+ (writableFinished || isWritable(stream) === false)
+ ) {
+ process.nextTick(onclosed)
+ } else if (
+ !writable &&
+ (!willEmitClose || isWritable(stream)) &&
+ (readableFinished || isReadable(stream) === false)
+ ) {
+ process.nextTick(onclosed)
+ } else if (rState && stream.req && stream.aborted) {
+ process.nextTick(onclosed)
+ }
+ const cleanup = () => {
+ callback = nop
+ stream.removeListener('aborted', onclose)
+ stream.removeListener('complete', onfinish)
+ stream.removeListener('abort', onclose)
+ stream.removeListener('request', onrequest)
+ if (stream.req) stream.req.removeListener('finish', onfinish)
+ stream.removeListener('end', onlegacyfinish)
+ stream.removeListener('close', onlegacyfinish)
+ stream.removeListener('finish', onfinish)
+ stream.removeListener('end', onend)
+ stream.removeListener('error', onerror)
+ stream.removeListener('close', onclose)
+ }
+ if (options.signal && !closed) {
+ const abort = () => {
+ // Keep it because cleanup removes it.
+ const endCallback = callback
+ cleanup()
+ endCallback.call(
+ stream,
+ new AbortError(undefined, {
+ cause: options.signal.reason
+ })
+ )
+ }
+ if (options.signal.aborted) {
+ process.nextTick(abort)
+ } else {
+ addAbortListener = addAbortListener || require('../../ours/util').addAbortListener
+ const disposable = addAbortListener(options.signal, abort)
+ const originalCallback = callback
+ callback = once((...args) => {
+ disposable[SymbolDispose]()
+ originalCallback.apply(stream, args)
+ })
+ }
+ }
+ return cleanup
+}
+function eosWeb(stream, options, callback) {
+ let isAborted = false
+ let abort = nop
+ if (options.signal) {
+ abort = () => {
+ isAborted = true
+ callback.call(
+ stream,
+ new AbortError(undefined, {
+ cause: options.signal.reason
+ })
+ )
+ }
+ if (options.signal.aborted) {
+ process.nextTick(abort)
+ } else {
+ addAbortListener = addAbortListener || require('../../ours/util').addAbortListener
+ const disposable = addAbortListener(options.signal, abort)
+ const originalCallback = callback
+ callback = once((...args) => {
+ disposable[SymbolDispose]()
+ originalCallback.apply(stream, args)
+ })
+ }
+ }
+ const resolverFn = (...args) => {
+ if (!isAborted) {
+ process.nextTick(() => callback.apply(stream, args))
+ }
+ }
+ PromisePrototypeThen(stream[kIsClosedPromise].promise, resolverFn, resolverFn)
+ return nop
+}
+function finished(stream, opts) {
+ var _opts
+ let autoCleanup = false
+ if (opts === null) {
+ opts = kEmptyObject
+ }
+ if ((_opts = opts) !== null && _opts !== undefined && _opts.cleanup) {
+ validateBoolean(opts.cleanup, 'cleanup')
+ autoCleanup = opts.cleanup
+ }
+ return new Promise((resolve, reject) => {
+ const cleanup = eos(stream, opts, (err) => {
+ if (autoCleanup) {
+ cleanup()
+ }
+ if (err) {
+ reject(err)
+ } else {
+ resolve()
+ }
+ })
+ })
+}
+module.exports = eos
+module.exports.finished = finished
+
+},{"../../ours/errors":149,"../../ours/primordials":150,"../../ours/util":151,"../validators":147,"./utils":145,"process/":168}],137:[function(require,module,exports){
+'use strict'
+
+/* replacement start */
+
+const process = require('process/')
+
+/* replacement end */
+
+const { PromisePrototypeThen, SymbolAsyncIterator, SymbolIterator } = require('../../ours/primordials')
+const { Buffer } = require('buffer')
+const { ERR_INVALID_ARG_TYPE, ERR_STREAM_NULL_VALUES } = require('../../ours/errors').codes
+function from(Readable, iterable, opts) {
+ let iterator
+ if (typeof iterable === 'string' || iterable instanceof Buffer) {
+ return new Readable({
+ objectMode: true,
+ ...opts,
+ read() {
+ this.push(iterable)
+ this.push(null)
+ }
+ })
+ }
+ let isAsync
+ if (iterable && iterable[SymbolAsyncIterator]) {
+ isAsync = true
+ iterator = iterable[SymbolAsyncIterator]()
+ } else if (iterable && iterable[SymbolIterator]) {
+ isAsync = false
+ iterator = iterable[SymbolIterator]()
+ } else {
+ throw new ERR_INVALID_ARG_TYPE('iterable', ['Iterable'], iterable)
+ }
+ const readable = new Readable({
+ objectMode: true,
+ highWaterMark: 1,
+ // TODO(ronag): What options should be allowed?
+ ...opts
+ })
+
+ // Flag to protect against _read
+ // being called before last iteration completion.
+ let reading = false
+ readable._read = function () {
+ if (!reading) {
+ reading = true
+ next()
+ }
+ }
+ readable._destroy = function (error, cb) {
+ PromisePrototypeThen(
+ close(error),
+ () => process.nextTick(cb, error),
+ // nextTick is here in case cb throws
+ (e) => process.nextTick(cb, e || error)
+ )
+ }
+ async function close(error) {
+ const hadError = error !== undefined && error !== null
+ const hasThrow = typeof iterator.throw === 'function'
+ if (hadError && hasThrow) {
+ const { value, done } = await iterator.throw(error)
+ await value
+ if (done) {
+ return
+ }
+ }
+ if (typeof iterator.return === 'function') {
+ const { value } = await iterator.return()
+ await value
+ }
+ }
+ async function next() {
+ for (;;) {
+ try {
+ const { value, done } = isAsync ? await iterator.next() : iterator.next()
+ if (done) {
+ readable.push(null)
+ } else {
+ const res = value && typeof value.then === 'function' ? await value : value
+ if (res === null) {
+ reading = false
+ throw new ERR_STREAM_NULL_VALUES()
+ } else if (readable.push(res)) {
+ continue
+ } else {
+ reading = false
+ }
+ }
+ } catch (err) {
+ readable.destroy(err)
+ }
+ break
+ }
+ }
+ return readable
+}
+module.exports = from
+
+},{"../../ours/errors":149,"../../ours/primordials":150,"buffer":120,"process/":168}],138:[function(require,module,exports){
+'use strict'
+
+const { ArrayIsArray, ObjectSetPrototypeOf } = require('../../ours/primordials')
+const { EventEmitter: EE } = require('events')
+function Stream(opts) {
+ EE.call(this, opts)
+}
+ObjectSetPrototypeOf(Stream.prototype, EE.prototype)
+ObjectSetPrototypeOf(Stream, EE)
+Stream.prototype.pipe = function (dest, options) {
+ const source = this
+ function ondata(chunk) {
+ if (dest.writable && dest.write(chunk) === false && source.pause) {
+ source.pause()
+ }
+ }
+ source.on('data', ondata)
+ function ondrain() {
+ if (source.readable && source.resume) {
+ source.resume()
+ }
+ }
+ dest.on('drain', ondrain)
+
+ // If the 'end' option is not supplied, dest.end() will be called when
+ // source gets the 'end' or 'close' events. Only dest.end() once.
+ if (!dest._isStdio && (!options || options.end !== false)) {
+ source.on('end', onend)
+ source.on('close', onclose)
+ }
+ let didOnEnd = false
+ function onend() {
+ if (didOnEnd) return
+ didOnEnd = true
+ dest.end()
+ }
+ function onclose() {
+ if (didOnEnd) return
+ didOnEnd = true
+ if (typeof dest.destroy === 'function') dest.destroy()
+ }
+
+ // Don't leave dangling pipes when there are errors.
+ function onerror(er) {
+ cleanup()
+ if (EE.listenerCount(this, 'error') === 0) {
+ this.emit('error', er)
+ }
+ }
+ prependListener(source, 'error', onerror)
+ prependListener(dest, 'error', onerror)
+
+ // Remove all the event listeners that were added.
+ function cleanup() {
+ source.removeListener('data', ondata)
+ dest.removeListener('drain', ondrain)
+ source.removeListener('end', onend)
+ source.removeListener('close', onclose)
+ source.removeListener('error', onerror)
+ dest.removeListener('error', onerror)
+ source.removeListener('end', cleanup)
+ source.removeListener('close', cleanup)
+ dest.removeListener('close', cleanup)
+ }
+ source.on('end', cleanup)
+ source.on('close', cleanup)
+ dest.on('close', cleanup)
+ dest.emit('pipe', source)
+
+ // Allow for unix-like usage: A.pipe(B).pipe(C)
+ return dest
+}
+function prependListener(emitter, event, fn) {
+ // Sadly this is not cacheable as some libraries bundle their own
+ // event emitter implementation with them.
+ if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn)
+
+ // This is a hack to make sure that our error handler is attached before any
+ // userland ones. NEVER DO THIS. This is here only because this code needs
+ // to continue to work with older versions of Node.js that do not include
+ // the prependListener() method. The goal is to eventually remove this hack.
+ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn)
+ else if (ArrayIsArray(emitter._events[event])) emitter._events[event].unshift(fn)
+ else emitter._events[event] = [fn, emitter._events[event]]
+}
+module.exports = {
+ Stream,
+ prependListener
+}
+
+},{"../../ours/primordials":150,"events":128}],139:[function(require,module,exports){
+'use strict'
+
+const AbortController = globalThis.AbortController || require('abort-controller').AbortController
+const {
+ codes: { ERR_INVALID_ARG_VALUE, ERR_INVALID_ARG_TYPE, ERR_MISSING_ARGS, ERR_OUT_OF_RANGE },
+ AbortError
+} = require('../../ours/errors')
+const { validateAbortSignal, validateInteger, validateObject } = require('../validators')
+const kWeakHandler = require('../../ours/primordials').Symbol('kWeak')
+const kResistStopPropagation = require('../../ours/primordials').Symbol('kResistStopPropagation')
+const { finished } = require('./end-of-stream')
+const staticCompose = require('./compose')
+const { addAbortSignalNoValidate } = require('./add-abort-signal')
+const { isWritable, isNodeStream } = require('./utils')
+const { deprecate } = require('../../ours/util')
+const {
+ ArrayPrototypePush,
+ Boolean,
+ MathFloor,
+ Number,
+ NumberIsNaN,
+ Promise,
+ PromiseReject,
+ PromiseResolve,
+ PromisePrototypeThen,
+ Symbol
+} = require('../../ours/primordials')
+const kEmpty = Symbol('kEmpty')
+const kEof = Symbol('kEof')
+function compose(stream, options) {
+ if (options != null) {
+ validateObject(options, 'options')
+ }
+ if ((options === null || options === undefined ? undefined : options.signal) != null) {
+ validateAbortSignal(options.signal, 'options.signal')
+ }
+ if (isNodeStream(stream) && !isWritable(stream)) {
+ throw new ERR_INVALID_ARG_VALUE('stream', stream, 'must be writable')
+ }
+ const composedStream = staticCompose(this, stream)
+ if (options !== null && options !== undefined && options.signal) {
+ // Not validating as we already validated before
+ addAbortSignalNoValidate(options.signal, composedStream)
+ }
+ return composedStream
+}
+function map(fn, options) {
+ if (typeof fn !== 'function') {
+ throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
+ }
+ if (options != null) {
+ validateObject(options, 'options')
+ }
+ if ((options === null || options === undefined ? undefined : options.signal) != null) {
+ validateAbortSignal(options.signal, 'options.signal')
+ }
+ let concurrency = 1
+ if ((options === null || options === undefined ? undefined : options.concurrency) != null) {
+ concurrency = MathFloor(options.concurrency)
+ }
+ let highWaterMark = concurrency - 1
+ if ((options === null || options === undefined ? undefined : options.highWaterMark) != null) {
+ highWaterMark = MathFloor(options.highWaterMark)
+ }
+ validateInteger(concurrency, 'options.concurrency', 1)
+ validateInteger(highWaterMark, 'options.highWaterMark', 0)
+ highWaterMark += concurrency
+ return async function* map() {
+ const signal = require('../../ours/util').AbortSignalAny(
+ [options === null || options === undefined ? undefined : options.signal].filter(Boolean)
+ )
+ const stream = this
+ const queue = []
+ const signalOpt = {
+ signal
+ }
+ let next
+ let resume
+ let done = false
+ let cnt = 0
+ function onCatch() {
+ done = true
+ afterItemProcessed()
+ }
+ function afterItemProcessed() {
+ cnt -= 1
+ maybeResume()
+ }
+ function maybeResume() {
+ if (resume && !done && cnt < concurrency && queue.length < highWaterMark) {
+ resume()
+ resume = null
+ }
+ }
+ async function pump() {
+ try {
+ for await (let val of stream) {
+ if (done) {
+ return
+ }
+ if (signal.aborted) {
+ throw new AbortError()
+ }
+ try {
+ val = fn(val, signalOpt)
+ if (val === kEmpty) {
+ continue
+ }
+ val = PromiseResolve(val)
+ } catch (err) {
+ val = PromiseReject(err)
+ }
+ cnt += 1
+ PromisePrototypeThen(val, afterItemProcessed, onCatch)
+ queue.push(val)
+ if (next) {
+ next()
+ next = null
+ }
+ if (!done && (queue.length >= highWaterMark || cnt >= concurrency)) {
+ await new Promise((resolve) => {
+ resume = resolve
+ })
+ }
+ }
+ queue.push(kEof)
+ } catch (err) {
+ const val = PromiseReject(err)
+ PromisePrototypeThen(val, afterItemProcessed, onCatch)
+ queue.push(val)
+ } finally {
+ done = true
+ if (next) {
+ next()
+ next = null
+ }
+ }
+ }
+ pump()
+ try {
+ while (true) {
+ while (queue.length > 0) {
+ const val = await queue[0]
+ if (val === kEof) {
+ return
+ }
+ if (signal.aborted) {
+ throw new AbortError()
+ }
+ if (val !== kEmpty) {
+ yield val
+ }
+ queue.shift()
+ maybeResume()
+ }
+ await new Promise((resolve) => {
+ next = resolve
+ })
+ }
+ } finally {
+ done = true
+ if (resume) {
+ resume()
+ resume = null
+ }
+ }
+ }.call(this)
+}
+function asIndexedPairs(options = undefined) {
+ if (options != null) {
+ validateObject(options, 'options')
+ }
+ if ((options === null || options === undefined ? undefined : options.signal) != null) {
+ validateAbortSignal(options.signal, 'options.signal')
+ }
+ return async function* asIndexedPairs() {
+ let index = 0
+ for await (const val of this) {
+ var _options$signal
+ if (
+ options !== null &&
+ options !== undefined &&
+ (_options$signal = options.signal) !== null &&
+ _options$signal !== undefined &&
+ _options$signal.aborted
+ ) {
+ throw new AbortError({
+ cause: options.signal.reason
+ })
+ }
+ yield [index++, val]
+ }
+ }.call(this)
+}
+async function some(fn, options = undefined) {
+ for await (const unused of filter.call(this, fn, options)) {
+ return true
+ }
+ return false
+}
+async function every(fn, options = undefined) {
+ if (typeof fn !== 'function') {
+ throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
+ }
+ // https://en.wikipedia.org/wiki/De_Morgan%27s_laws
+ return !(await some.call(
+ this,
+ async (...args) => {
+ return !(await fn(...args))
+ },
+ options
+ ))
+}
+async function find(fn, options) {
+ for await (const result of filter.call(this, fn, options)) {
+ return result
+ }
+ return undefined
+}
+async function forEach(fn, options) {
+ if (typeof fn !== 'function') {
+ throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
+ }
+ async function forEachFn(value, options) {
+ await fn(value, options)
+ return kEmpty
+ }
+ // eslint-disable-next-line no-unused-vars
+ for await (const unused of map.call(this, forEachFn, options));
+}
+function filter(fn, options) {
+ if (typeof fn !== 'function') {
+ throw new ERR_INVALID_ARG_TYPE('fn', ['Function', 'AsyncFunction'], fn)
+ }
+ async function filterFn(value, options) {
+ if (await fn(value, options)) {
+ return value
+ }
+ return kEmpty
+ }
+ return map.call(this, filterFn, options)
+}
+
+// Specific to provide better error to reduce since the argument is only
+// missing if the stream has no items in it - but the code is still appropriate
+class ReduceAwareErrMissingArgs extends ERR_MISSING_ARGS {
+ constructor() {
+ super('reduce')
+ this.message = 'Reduce of an empty stream requires an initial value'
+ }
+}
+async function reduce(reducer, initialValue, options) {
+ var _options$signal2
+ if (typeof reducer !== 'function') {
+ throw new ERR_INVALID_ARG_TYPE('reducer', ['Function', 'AsyncFunction'], reducer)
+ }
+ if (options != null) {
+ validateObject(options, 'options')
+ }
+ if ((options === null || options === undefined ? undefined : options.signal) != null) {
+ validateAbortSignal(options.signal, 'options.signal')
+ }
+ let hasInitialValue = arguments.length > 1
+ if (
+ options !== null &&
+ options !== undefined &&
+ (_options$signal2 = options.signal) !== null &&
+ _options$signal2 !== undefined &&
+ _options$signal2.aborted
+ ) {
+ const err = new AbortError(undefined, {
+ cause: options.signal.reason
+ })
+ this.once('error', () => {}) // The error is already propagated
+ await finished(this.destroy(err))
+ throw err
+ }
+ const ac = new AbortController()
+ const signal = ac.signal
+ if (options !== null && options !== undefined && options.signal) {
+ const opts = {
+ once: true,
+ [kWeakHandler]: this,
+ [kResistStopPropagation]: true
+ }
+ options.signal.addEventListener('abort', () => ac.abort(), opts)
+ }
+ let gotAnyItemFromStream = false
+ try {
+ for await (const value of this) {
+ var _options$signal3
+ gotAnyItemFromStream = true
+ if (
+ options !== null &&
+ options !== undefined &&
+ (_options$signal3 = options.signal) !== null &&
+ _options$signal3 !== undefined &&
+ _options$signal3.aborted
+ ) {
+ throw new AbortError()
+ }
+ if (!hasInitialValue) {
+ initialValue = value
+ hasInitialValue = true
+ } else {
+ initialValue = await reducer(initialValue, value, {
+ signal
+ })
+ }
+ }
+ if (!gotAnyItemFromStream && !hasInitialValue) {
+ throw new ReduceAwareErrMissingArgs()
+ }
+ } finally {
+ ac.abort()
+ }
+ return initialValue
+}
+async function toArray(options) {
+ if (options != null) {
+ validateObject(options, 'options')
+ }
+ if ((options === null || options === undefined ? undefined : options.signal) != null) {
+ validateAbortSignal(options.signal, 'options.signal')
+ }
+ const result = []
+ for await (const val of this) {
+ var _options$signal4
+ if (
+ options !== null &&
+ options !== undefined &&
+ (_options$signal4 = options.signal) !== null &&
+ _options$signal4 !== undefined &&
+ _options$signal4.aborted
+ ) {
+ throw new AbortError(undefined, {
+ cause: options.signal.reason
+ })
+ }
+ ArrayPrototypePush(result, val)
+ }
+ return result
+}
+function flatMap(fn, options) {
+ const values = map.call(this, fn, options)
+ return async function* flatMap() {
+ for await (const val of values) {
+ yield* val
+ }
+ }.call(this)
+}
+function toIntegerOrInfinity(number) {
+ // We coerce here to align with the spec
+ // https://github.com/tc39/proposal-iterator-helpers/issues/169
+ number = Number(number)
+ if (NumberIsNaN(number)) {
+ return 0
+ }
+ if (number < 0) {
+ throw new ERR_OUT_OF_RANGE('number', '>= 0', number)
+ }
+ return number
+}
+function drop(number, options = undefined) {
+ if (options != null) {
+ validateObject(options, 'options')
+ }
+ if ((options === null || options === undefined ? undefined : options.signal) != null) {
+ validateAbortSignal(options.signal, 'options.signal')
+ }
+ number = toIntegerOrInfinity(number)
+ return async function* drop() {
+ var _options$signal5
+ if (
+ options !== null &&
+ options !== undefined &&
+ (_options$signal5 = options.signal) !== null &&
+ _options$signal5 !== undefined &&
+ _options$signal5.aborted
+ ) {
+ throw new AbortError()
+ }
+ for await (const val of this) {
+ var _options$signal6
+ if (
+ options !== null &&
+ options !== undefined &&
+ (_options$signal6 = options.signal) !== null &&
+ _options$signal6 !== undefined &&
+ _options$signal6.aborted
+ ) {
+ throw new AbortError()
+ }
+ if (number-- <= 0) {
+ yield val
+ }
+ }
+ }.call(this)
+}
+function take(number, options = undefined) {
+ if (options != null) {
+ validateObject(options, 'options')
+ }
+ if ((options === null || options === undefined ? undefined : options.signal) != null) {
+ validateAbortSignal(options.signal, 'options.signal')
+ }
+ number = toIntegerOrInfinity(number)
+ return async function* take() {
+ var _options$signal7
+ if (
+ options !== null &&
+ options !== undefined &&
+ (_options$signal7 = options.signal) !== null &&
+ _options$signal7 !== undefined &&
+ _options$signal7.aborted
+ ) {
+ throw new AbortError()
+ }
+ for await (const val of this) {
+ var _options$signal8
+ if (
+ options !== null &&
+ options !== undefined &&
+ (_options$signal8 = options.signal) !== null &&
+ _options$signal8 !== undefined &&
+ _options$signal8.aborted
+ ) {
+ throw new AbortError()
+ }
+ if (number-- > 0) {
+ yield val
+ }
+
+ // Don't get another item from iterator in case we reached the end
+ if (number <= 0) {
+ return
+ }
+ }
+ }.call(this)
+}
+module.exports.streamReturningOperators = {
+ asIndexedPairs: deprecate(asIndexedPairs, 'readable.asIndexedPairs will be removed in a future version.'),
+ drop,
+ filter,
+ flatMap,
+ map,
+ take,
+ compose
+}
+module.exports.promiseReturningOperators = {
+ every,
+ forEach,
+ reduce,
+ toArray,
+ some,
+ find
+}
+
+},{"../../ours/errors":149,"../../ours/primordials":150,"../../ours/util":151,"../validators":147,"./add-abort-signal":130,"./compose":132,"./end-of-stream":136,"./utils":145,"abort-controller":116}],140:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+
+'use strict'
+
+const { ObjectSetPrototypeOf } = require('../../ours/primordials')
+module.exports = PassThrough
+const Transform = require('./transform')
+ObjectSetPrototypeOf(PassThrough.prototype, Transform.prototype)
+ObjectSetPrototypeOf(PassThrough, Transform)
+function PassThrough(options) {
+ if (!(this instanceof PassThrough)) return new PassThrough(options)
+ Transform.call(this, options)
+}
+PassThrough.prototype._transform = function (chunk, encoding, cb) {
+ cb(null, chunk)
+}
+
+},{"../../ours/primordials":150,"./transform":144}],141:[function(require,module,exports){
+/* replacement start */
+
+const process = require('process/')
+
+/* replacement end */
+// Ported from https://github.com/mafintosh/pump with
+// permission from the author, Mathias Buus (@mafintosh).
+
+;('use strict')
+const { ArrayIsArray, Promise, SymbolAsyncIterator, SymbolDispose } = require('../../ours/primordials')
+const eos = require('./end-of-stream')
+const { once } = require('../../ours/util')
+const destroyImpl = require('./destroy')
+const Duplex = require('./duplex')
+const {
+ aggregateTwoErrors,
+ codes: {
+ ERR_INVALID_ARG_TYPE,
+ ERR_INVALID_RETURN_VALUE,
+ ERR_MISSING_ARGS,
+ ERR_STREAM_DESTROYED,
+ ERR_STREAM_PREMATURE_CLOSE
+ },
+ AbortError
+} = require('../../ours/errors')
+const { validateFunction, validateAbortSignal } = require('../validators')
+const {
+ isIterable,
+ isReadable,
+ isReadableNodeStream,
+ isNodeStream,
+ isTransformStream,
+ isWebStream,
+ isReadableStream,
+ isReadableFinished
+} = require('./utils')
+const AbortController = globalThis.AbortController || require('abort-controller').AbortController
+let PassThrough
+let Readable
+let addAbortListener
+function destroyer(stream, reading, writing) {
+ let finished = false
+ stream.on('close', () => {
+ finished = true
+ })
+ const cleanup = eos(
+ stream,
+ {
+ readable: reading,
+ writable: writing
+ },
+ (err) => {
+ finished = !err
+ }
+ )
+ return {
+ destroy: (err) => {
+ if (finished) return
+ finished = true
+ destroyImpl.destroyer(stream, err || new ERR_STREAM_DESTROYED('pipe'))
+ },
+ cleanup
+ }
+}
+function popCallback(streams) {
+ // Streams should never be an empty array. It should always contain at least
+ // a single stream. Therefore optimize for the average case instead of
+ // checking for length === 0 as well.
+ validateFunction(streams[streams.length - 1], 'streams[stream.length - 1]')
+ return streams.pop()
+}
+function makeAsyncIterable(val) {
+ if (isIterable(val)) {
+ return val
+ } else if (isReadableNodeStream(val)) {
+ // Legacy streams are not Iterable.
+ return fromReadable(val)
+ }
+ throw new ERR_INVALID_ARG_TYPE('val', ['Readable', 'Iterable', 'AsyncIterable'], val)
+}
+async function* fromReadable(val) {
+ if (!Readable) {
+ Readable = require('./readable')
+ }
+ yield* Readable.prototype[SymbolAsyncIterator].call(val)
+}
+async function pumpToNode(iterable, writable, finish, { end }) {
+ let error
+ let onresolve = null
+ const resume = (err) => {
+ if (err) {
+ error = err
+ }
+ if (onresolve) {
+ const callback = onresolve
+ onresolve = null
+ callback()
+ }
+ }
+ const wait = () =>
+ new Promise((resolve, reject) => {
+ if (error) {
+ reject(error)
+ } else {
+ onresolve = () => {
+ if (error) {
+ reject(error)
+ } else {
+ resolve()
+ }
+ }
+ }
+ })
+ writable.on('drain', resume)
+ const cleanup = eos(
+ writable,
+ {
+ readable: false
+ },
+ resume
+ )
+ try {
+ if (writable.writableNeedDrain) {
+ await wait()
+ }
+ for await (const chunk of iterable) {
+ if (!writable.write(chunk)) {
+ await wait()
+ }
+ }
+ if (end) {
+ writable.end()
+ await wait()
+ }
+ finish()
+ } catch (err) {
+ finish(error !== err ? aggregateTwoErrors(error, err) : err)
+ } finally {
+ cleanup()
+ writable.off('drain', resume)
+ }
+}
+async function pumpToWeb(readable, writable, finish, { end }) {
+ if (isTransformStream(writable)) {
+ writable = writable.writable
+ }
+ // https://streams.spec.whatwg.org/#example-manual-write-with-backpressure
+ const writer = writable.getWriter()
+ try {
+ for await (const chunk of readable) {
+ await writer.ready
+ writer.write(chunk).catch(() => {})
+ }
+ await writer.ready
+ if (end) {
+ await writer.close()
+ }
+ finish()
+ } catch (err) {
+ try {
+ await writer.abort(err)
+ finish(err)
+ } catch (err) {
+ finish(err)
+ }
+ }
+}
+function pipeline(...streams) {
+ return pipelineImpl(streams, once(popCallback(streams)))
+}
+function pipelineImpl(streams, callback, opts) {
+ if (streams.length === 1 && ArrayIsArray(streams[0])) {
+ streams = streams[0]
+ }
+ if (streams.length < 2) {
+ throw new ERR_MISSING_ARGS('streams')
+ }
+ const ac = new AbortController()
+ const signal = ac.signal
+ const outerSignal = opts === null || opts === undefined ? undefined : opts.signal
+
+ // Need to cleanup event listeners if last stream is readable
+ // https://github.com/nodejs/node/issues/35452
+ const lastStreamCleanup = []
+ validateAbortSignal(outerSignal, 'options.signal')
+ function abort() {
+ finishImpl(new AbortError())
+ }
+ addAbortListener = addAbortListener || require('../../ours/util').addAbortListener
+ let disposable
+ if (outerSignal) {
+ disposable = addAbortListener(outerSignal, abort)
+ }
+ let error
+ let value
+ const destroys = []
+ let finishCount = 0
+ function finish(err) {
+ finishImpl(err, --finishCount === 0)
+ }
+ function finishImpl(err, final) {
+ var _disposable
+ if (err && (!error || error.code === 'ERR_STREAM_PREMATURE_CLOSE')) {
+ error = err
+ }
+ if (!error && !final) {
+ return
+ }
+ while (destroys.length) {
+ destroys.shift()(error)
+ }
+ ;(_disposable = disposable) === null || _disposable === undefined ? undefined : _disposable[SymbolDispose]()
+ ac.abort()
+ if (final) {
+ if (!error) {
+ lastStreamCleanup.forEach((fn) => fn())
+ }
+ process.nextTick(callback, error, value)
+ }
+ }
+ let ret
+ for (let i = 0; i < streams.length; i++) {
+ const stream = streams[i]
+ const reading = i < streams.length - 1
+ const writing = i > 0
+ const end = reading || (opts === null || opts === undefined ? undefined : opts.end) !== false
+ const isLastStream = i === streams.length - 1
+ if (isNodeStream(stream)) {
+ if (end) {
+ const { destroy, cleanup } = destroyer(stream, reading, writing)
+ destroys.push(destroy)
+ if (isReadable(stream) && isLastStream) {
+ lastStreamCleanup.push(cleanup)
+ }
+ }
+
+ // Catch stream errors that occur after pipe/pump has completed.
+ function onError(err) {
+ if (err && err.name !== 'AbortError' && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
+ finish(err)
+ }
+ }
+ stream.on('error', onError)
+ if (isReadable(stream) && isLastStream) {
+ lastStreamCleanup.push(() => {
+ stream.removeListener('error', onError)
+ })
+ }
+ }
+ if (i === 0) {
+ if (typeof stream === 'function') {
+ ret = stream({
+ signal
+ })
+ if (!isIterable(ret)) {
+ throw new ERR_INVALID_RETURN_VALUE('Iterable, AsyncIterable or Stream', 'source', ret)
+ }
+ } else if (isIterable(stream) || isReadableNodeStream(stream) || isTransformStream(stream)) {
+ ret = stream
+ } else {
+ ret = Duplex.from(stream)
+ }
+ } else if (typeof stream === 'function') {
+ if (isTransformStream(ret)) {
+ var _ret
+ ret = makeAsyncIterable((_ret = ret) === null || _ret === undefined ? undefined : _ret.readable)
+ } else {
+ ret = makeAsyncIterable(ret)
+ }
+ ret = stream(ret, {
+ signal
+ })
+ if (reading) {
+ if (!isIterable(ret, true)) {
+ throw new ERR_INVALID_RETURN_VALUE('AsyncIterable', `transform[${i - 1}]`, ret)
+ }
+ } else {
+ var _ret2
+ if (!PassThrough) {
+ PassThrough = require('./passthrough')
+ }
+
+ // If the last argument to pipeline is not a stream
+ // we must create a proxy stream so that pipeline(...)
+ // always returns a stream which can be further
+ // composed through `.pipe(stream)`.
+
+ const pt = new PassThrough({
+ objectMode: true
+ })
+
+ // Handle Promises/A+ spec, `then` could be a getter that throws on
+ // second use.
+ const then = (_ret2 = ret) === null || _ret2 === undefined ? undefined : _ret2.then
+ if (typeof then === 'function') {
+ finishCount++
+ then.call(
+ ret,
+ (val) => {
+ value = val
+ if (val != null) {
+ pt.write(val)
+ }
+ if (end) {
+ pt.end()
+ }
+ process.nextTick(finish)
+ },
+ (err) => {
+ pt.destroy(err)
+ process.nextTick(finish, err)
+ }
+ )
+ } else if (isIterable(ret, true)) {
+ finishCount++
+ pumpToNode(ret, pt, finish, {
+ end
+ })
+ } else if (isReadableStream(ret) || isTransformStream(ret)) {
+ const toRead = ret.readable || ret
+ finishCount++
+ pumpToNode(toRead, pt, finish, {
+ end
+ })
+ } else {
+ throw new ERR_INVALID_RETURN_VALUE('AsyncIterable or Promise', 'destination', ret)
+ }
+ ret = pt
+ const { destroy, cleanup } = destroyer(ret, false, true)
+ destroys.push(destroy)
+ if (isLastStream) {
+ lastStreamCleanup.push(cleanup)
+ }
+ }
+ } else if (isNodeStream(stream)) {
+ if (isReadableNodeStream(ret)) {
+ finishCount += 2
+ const cleanup = pipe(ret, stream, finish, {
+ end
+ })
+ if (isReadable(stream) && isLastStream) {
+ lastStreamCleanup.push(cleanup)
+ }
+ } else if (isTransformStream(ret) || isReadableStream(ret)) {
+ const toRead = ret.readable || ret
+ finishCount++
+ pumpToNode(toRead, stream, finish, {
+ end
+ })
+ } else if (isIterable(ret)) {
+ finishCount++
+ pumpToNode(ret, stream, finish, {
+ end
+ })
+ } else {
+ throw new ERR_INVALID_ARG_TYPE(
+ 'val',
+ ['Readable', 'Iterable', 'AsyncIterable', 'ReadableStream', 'TransformStream'],
+ ret
+ )
+ }
+ ret = stream
+ } else if (isWebStream(stream)) {
+ if (isReadableNodeStream(ret)) {
+ finishCount++
+ pumpToWeb(makeAsyncIterable(ret), stream, finish, {
+ end
+ })
+ } else if (isReadableStream(ret) || isIterable(ret)) {
+ finishCount++
+ pumpToWeb(ret, stream, finish, {
+ end
+ })
+ } else if (isTransformStream(ret)) {
+ finishCount++
+ pumpToWeb(ret.readable, stream, finish, {
+ end
+ })
+ } else {
+ throw new ERR_INVALID_ARG_TYPE(
+ 'val',
+ ['Readable', 'Iterable', 'AsyncIterable', 'ReadableStream', 'TransformStream'],
+ ret
+ )
+ }
+ ret = stream
+ } else {
+ ret = Duplex.from(stream)
+ }
+ }
+ if (
+ (signal !== null && signal !== undefined && signal.aborted) ||
+ (outerSignal !== null && outerSignal !== undefined && outerSignal.aborted)
+ ) {
+ process.nextTick(abort)
+ }
+ return ret
+}
+function pipe(src, dst, finish, { end }) {
+ let ended = false
+ dst.on('close', () => {
+ if (!ended) {
+ // Finish if the destination closes before the source has completed.
+ finish(new ERR_STREAM_PREMATURE_CLOSE())
+ }
+ })
+ src.pipe(dst, {
+ end: false
+ }) // If end is true we already will have a listener to end dst.
+
+ if (end) {
+ // Compat. Before node v10.12.0 stdio used to throw an error so
+ // pipe() did/does not end() stdio destinations.
+ // Now they allow it but "secretly" don't close the underlying fd.
+
+ function endFn() {
+ ended = true
+ dst.end()
+ }
+ if (isReadableFinished(src)) {
+ // End the destination if the source has already ended.
+ process.nextTick(endFn)
+ } else {
+ src.once('end', endFn)
+ }
+ } else {
+ finish()
+ }
+ eos(
+ src,
+ {
+ readable: true,
+ writable: false
+ },
+ (err) => {
+ const rState = src._readableState
+ if (
+ err &&
+ err.code === 'ERR_STREAM_PREMATURE_CLOSE' &&
+ rState &&
+ rState.ended &&
+ !rState.errored &&
+ !rState.errorEmitted
+ ) {
+ // Some readable streams will emit 'close' before 'end'. However, since
+ // this is on the readable side 'end' should still be emitted if the
+ // stream has been ended and no error emitted. This should be allowed in
+ // favor of backwards compatibility. Since the stream is piped to a
+ // destination this should not result in any observable difference.
+ // We don't need to check if this is a writable premature close since
+ // eos will only fail with premature close on the reading side for
+ // duplex streams.
+ src.once('end', finish).once('error', finish)
+ } else {
+ finish(err)
+ }
+ }
+ )
+ return eos(
+ dst,
+ {
+ readable: false,
+ writable: true
+ },
+ finish
+ )
+}
+module.exports = {
+ pipelineImpl,
+ pipeline
+}
+
+},{"../../ours/errors":149,"../../ours/primordials":150,"../../ours/util":151,"../validators":147,"./destroy":133,"./duplex":134,"./end-of-stream":136,"./passthrough":140,"./readable":142,"./utils":145,"abort-controller":116,"process/":168}],142:[function(require,module,exports){
+/* replacement start */
+
+const process = require('process/')
+
+/* replacement end */
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+;('use strict')
+const {
+ ArrayPrototypeIndexOf,
+ NumberIsInteger,
+ NumberIsNaN,
+ NumberParseInt,
+ ObjectDefineProperties,
+ ObjectKeys,
+ ObjectSetPrototypeOf,
+ Promise,
+ SafeSet,
+ SymbolAsyncDispose,
+ SymbolAsyncIterator,
+ Symbol
+} = require('../../ours/primordials')
+module.exports = Readable
+Readable.ReadableState = ReadableState
+const { EventEmitter: EE } = require('events')
+const { Stream, prependListener } = require('./legacy')
+const { Buffer } = require('buffer')
+const { addAbortSignal } = require('./add-abort-signal')
+const eos = require('./end-of-stream')
+let debug = require('../../ours/util').debuglog('stream', (fn) => {
+ debug = fn
+})
+const BufferList = require('./buffer_list')
+const destroyImpl = require('./destroy')
+const { getHighWaterMark, getDefaultHighWaterMark } = require('./state')
+const {
+ aggregateTwoErrors,
+ codes: {
+ ERR_INVALID_ARG_TYPE,
+ ERR_METHOD_NOT_IMPLEMENTED,
+ ERR_OUT_OF_RANGE,
+ ERR_STREAM_PUSH_AFTER_EOF,
+ ERR_STREAM_UNSHIFT_AFTER_END_EVENT
+ },
+ AbortError
+} = require('../../ours/errors')
+const { validateObject } = require('../validators')
+const kPaused = Symbol('kPaused')
+const { StringDecoder } = require('string_decoder')
+const from = require('./from')
+ObjectSetPrototypeOf(Readable.prototype, Stream.prototype)
+ObjectSetPrototypeOf(Readable, Stream)
+const nop = () => {}
+const { errorOrDestroy } = destroyImpl
+const kObjectMode = 1 << 0
+const kEnded = 1 << 1
+const kEndEmitted = 1 << 2
+const kReading = 1 << 3
+const kConstructed = 1 << 4
+const kSync = 1 << 5
+const kNeedReadable = 1 << 6
+const kEmittedReadable = 1 << 7
+const kReadableListening = 1 << 8
+const kResumeScheduled = 1 << 9
+const kErrorEmitted = 1 << 10
+const kEmitClose = 1 << 11
+const kAutoDestroy = 1 << 12
+const kDestroyed = 1 << 13
+const kClosed = 1 << 14
+const kCloseEmitted = 1 << 15
+const kMultiAwaitDrain = 1 << 16
+const kReadingMore = 1 << 17
+const kDataEmitted = 1 << 18
+
+// TODO(benjamingr) it is likely slower to do it this way than with free functions
+function makeBitMapDescriptor(bit) {
+ return {
+ enumerable: false,
+ get() {
+ return (this.state & bit) !== 0
+ },
+ set(value) {
+ if (value) this.state |= bit
+ else this.state &= ~bit
+ }
+ }
+}
+ObjectDefineProperties(ReadableState.prototype, {
+ objectMode: makeBitMapDescriptor(kObjectMode),
+ ended: makeBitMapDescriptor(kEnded),
+ endEmitted: makeBitMapDescriptor(kEndEmitted),
+ reading: makeBitMapDescriptor(kReading),
+ // Stream is still being constructed and cannot be
+ // destroyed until construction finished or failed.
+ // Async construction is opt in, therefore we start as
+ // constructed.
+ constructed: makeBitMapDescriptor(kConstructed),
+ // A flag to be able to tell if the event 'readable'/'data' is emitted
+ // immediately, or on a later tick. We set this to true at first, because
+ // any actions that shouldn't happen until "later" should generally also
+ // not happen before the first read call.
+ sync: makeBitMapDescriptor(kSync),
+ // Whenever we return null, then we set a flag to say
+ // that we're awaiting a 'readable' event emission.
+ needReadable: makeBitMapDescriptor(kNeedReadable),
+ emittedReadable: makeBitMapDescriptor(kEmittedReadable),
+ readableListening: makeBitMapDescriptor(kReadableListening),
+ resumeScheduled: makeBitMapDescriptor(kResumeScheduled),
+ // True if the error was already emitted and should not be thrown again.
+ errorEmitted: makeBitMapDescriptor(kErrorEmitted),
+ emitClose: makeBitMapDescriptor(kEmitClose),
+ autoDestroy: makeBitMapDescriptor(kAutoDestroy),
+ // Has it been destroyed.
+ destroyed: makeBitMapDescriptor(kDestroyed),
+ // Indicates whether the stream has finished destroying.
+ closed: makeBitMapDescriptor(kClosed),
+ // True if close has been emitted or would have been emitted
+ // depending on emitClose.
+ closeEmitted: makeBitMapDescriptor(kCloseEmitted),
+ multiAwaitDrain: makeBitMapDescriptor(kMultiAwaitDrain),
+ // If true, a maybeReadMore has been scheduled.
+ readingMore: makeBitMapDescriptor(kReadingMore),
+ dataEmitted: makeBitMapDescriptor(kDataEmitted)
+})
+function ReadableState(options, stream, isDuplex) {
+ // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream.
+ // These options can be provided separately as readableXXX and writableXXX.
+ if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof require('./duplex')
+
+ // Bit map field to store ReadableState more effciently with 1 bit per field
+ // instead of a V8 slot per field.
+ this.state = kEmitClose | kAutoDestroy | kConstructed | kSync
+ // Object stream flag. Used to make read(n) ignore n and to
+ // make all the buffer merging and length checks go away.
+ if (options && options.objectMode) this.state |= kObjectMode
+ if (isDuplex && options && options.readableObjectMode) this.state |= kObjectMode
+
+ // The point at which it stops calling _read() to fill the buffer
+ // Note: 0 is a valid value, means "don't call _read preemptively ever"
+ this.highWaterMark = options
+ ? getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex)
+ : getDefaultHighWaterMark(false)
+
+ // A linked list is used to store data chunks instead of an array because the
+ // linked list can remove elements from the beginning faster than
+ // array.shift().
+ this.buffer = new BufferList()
+ this.length = 0
+ this.pipes = []
+ this.flowing = null
+ this[kPaused] = null
+
+ // Should close be emitted on destroy. Defaults to true.
+ if (options && options.emitClose === false) this.state &= ~kEmitClose
+
+ // Should .destroy() be called after 'end' (and potentially 'finish').
+ if (options && options.autoDestroy === false) this.state &= ~kAutoDestroy
+
+ // Indicates whether the stream has errored. When true no further
+ // _read calls, 'data' or 'readable' events should occur. This is needed
+ // since when autoDestroy is disabled we need a way to tell whether the
+ // stream has failed.
+ this.errored = null
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = (options && options.defaultEncoding) || 'utf8'
+
+ // Ref the piped dest which we need a drain event on it
+ // type: null | Writable | Set.
+ this.awaitDrainWriters = null
+ this.decoder = null
+ this.encoding = null
+ if (options && options.encoding) {
+ this.decoder = new StringDecoder(options.encoding)
+ this.encoding = options.encoding
+ }
+}
+function Readable(options) {
+ if (!(this instanceof Readable)) return new Readable(options)
+
+ // Checking for a Stream.Duplex instance is faster here instead of inside
+ // the ReadableState constructor, at least with V8 6.5.
+ const isDuplex = this instanceof require('./duplex')
+ this._readableState = new ReadableState(options, this, isDuplex)
+ if (options) {
+ if (typeof options.read === 'function') this._read = options.read
+ if (typeof options.destroy === 'function') this._destroy = options.destroy
+ if (typeof options.construct === 'function') this._construct = options.construct
+ if (options.signal && !isDuplex) addAbortSignal(options.signal, this)
+ }
+ Stream.call(this, options)
+ destroyImpl.construct(this, () => {
+ if (this._readableState.needReadable) {
+ maybeReadMore(this, this._readableState)
+ }
+ })
+}
+Readable.prototype.destroy = destroyImpl.destroy
+Readable.prototype._undestroy = destroyImpl.undestroy
+Readable.prototype._destroy = function (err, cb) {
+ cb(err)
+}
+Readable.prototype[EE.captureRejectionSymbol] = function (err) {
+ this.destroy(err)
+}
+Readable.prototype[SymbolAsyncDispose] = function () {
+ let error
+ if (!this.destroyed) {
+ error = this.readableEnded ? null : new AbortError()
+ this.destroy(error)
+ }
+ return new Promise((resolve, reject) => eos(this, (err) => (err && err !== error ? reject(err) : resolve(null))))
+}
+
+// Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+Readable.prototype.push = function (chunk, encoding) {
+ return readableAddChunk(this, chunk, encoding, false)
+}
+
+// Unshift should *always* be something directly out of read().
+Readable.prototype.unshift = function (chunk, encoding) {
+ return readableAddChunk(this, chunk, encoding, true)
+}
+function readableAddChunk(stream, chunk, encoding, addToFront) {
+ debug('readableAddChunk', chunk)
+ const state = stream._readableState
+ let err
+ if ((state.state & kObjectMode) === 0) {
+ if (typeof chunk === 'string') {
+ encoding = encoding || state.defaultEncoding
+ if (state.encoding !== encoding) {
+ if (addToFront && state.encoding) {
+ // When unshifting, if state.encoding is set, we have to save
+ // the string in the BufferList with the state encoding.
+ chunk = Buffer.from(chunk, encoding).toString(state.encoding)
+ } else {
+ chunk = Buffer.from(chunk, encoding)
+ encoding = ''
+ }
+ }
+ } else if (chunk instanceof Buffer) {
+ encoding = ''
+ } else if (Stream._isUint8Array(chunk)) {
+ chunk = Stream._uint8ArrayToBuffer(chunk)
+ encoding = ''
+ } else if (chunk != null) {
+ err = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk)
+ }
+ }
+ if (err) {
+ errorOrDestroy(stream, err)
+ } else if (chunk === null) {
+ state.state &= ~kReading
+ onEofChunk(stream, state)
+ } else if ((state.state & kObjectMode) !== 0 || (chunk && chunk.length > 0)) {
+ if (addToFront) {
+ if ((state.state & kEndEmitted) !== 0) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT())
+ else if (state.destroyed || state.errored) return false
+ else addChunk(stream, state, chunk, true)
+ } else if (state.ended) {
+ errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF())
+ } else if (state.destroyed || state.errored) {
+ return false
+ } else {
+ state.state &= ~kReading
+ if (state.decoder && !encoding) {
+ chunk = state.decoder.write(chunk)
+ if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false)
+ else maybeReadMore(stream, state)
+ } else {
+ addChunk(stream, state, chunk, false)
+ }
+ }
+ } else if (!addToFront) {
+ state.state &= ~kReading
+ maybeReadMore(stream, state)
+ }
+
+ // We can push more data if we are below the highWaterMark.
+ // Also, if we have no data yet, we can stand some more bytes.
+ // This is to work around cases where hwm=0, such as the repl.
+ return !state.ended && (state.length < state.highWaterMark || state.length === 0)
+}
+function addChunk(stream, state, chunk, addToFront) {
+ if (state.flowing && state.length === 0 && !state.sync && stream.listenerCount('data') > 0) {
+ // Use the guard to avoid creating `Set()` repeatedly
+ // when we have multiple pipes.
+ if ((state.state & kMultiAwaitDrain) !== 0) {
+ state.awaitDrainWriters.clear()
+ } else {
+ state.awaitDrainWriters = null
+ }
+ state.dataEmitted = true
+ stream.emit('data', chunk)
+ } else {
+ // Update the buffer info.
+ state.length += state.objectMode ? 1 : chunk.length
+ if (addToFront) state.buffer.unshift(chunk)
+ else state.buffer.push(chunk)
+ if ((state.state & kNeedReadable) !== 0) emitReadable(stream)
+ }
+ maybeReadMore(stream, state)
+}
+Readable.prototype.isPaused = function () {
+ const state = this._readableState
+ return state[kPaused] === true || state.flowing === false
+}
+
+// Backwards compatibility.
+Readable.prototype.setEncoding = function (enc) {
+ const decoder = new StringDecoder(enc)
+ this._readableState.decoder = decoder
+ // If setEncoding(null), decoder.encoding equals utf8.
+ this._readableState.encoding = this._readableState.decoder.encoding
+ const buffer = this._readableState.buffer
+ // Iterate over current buffer to convert already stored Buffers:
+ let content = ''
+ for (const data of buffer) {
+ content += decoder.write(data)
+ }
+ buffer.clear()
+ if (content !== '') buffer.push(content)
+ this._readableState.length = content.length
+ return this
+}
+
+// Don't raise the hwm > 1GB.
+const MAX_HWM = 0x40000000
+function computeNewHighWaterMark(n) {
+ if (n > MAX_HWM) {
+ throw new ERR_OUT_OF_RANGE('size', '<= 1GiB', n)
+ } else {
+ // Get the next highest power of 2 to prevent increasing hwm excessively in
+ // tiny amounts.
+ n--
+ n |= n >>> 1
+ n |= n >>> 2
+ n |= n >>> 4
+ n |= n >>> 8
+ n |= n >>> 16
+ n++
+ }
+ return n
+}
+
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function howMuchToRead(n, state) {
+ if (n <= 0 || (state.length === 0 && state.ended)) return 0
+ if ((state.state & kObjectMode) !== 0) return 1
+ if (NumberIsNaN(n)) {
+ // Only flow one buffer at a time.
+ if (state.flowing && state.length) return state.buffer.first().length
+ return state.length
+ }
+ if (n <= state.length) return n
+ return state.ended ? state.length : 0
+}
+
+// You can override either this method, or the async _read(n) below.
+Readable.prototype.read = function (n) {
+ debug('read', n)
+ // Same as parseInt(undefined, 10), however V8 7.3 performance regressed
+ // in this scenario, so we are doing it manually.
+ if (n === undefined) {
+ n = NaN
+ } else if (!NumberIsInteger(n)) {
+ n = NumberParseInt(n, 10)
+ }
+ const state = this._readableState
+ const nOrig = n
+
+ // If we're asking for more than the current hwm, then raise the hwm.
+ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n)
+ if (n !== 0) state.state &= ~kEmittedReadable
+
+ // If we're doing read(0) to trigger a readable event, but we
+ // already have a bunch of data in the buffer, then just trigger
+ // the 'readable' event and move on.
+ if (
+ n === 0 &&
+ state.needReadable &&
+ ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)
+ ) {
+ debug('read: emitReadable', state.length, state.ended)
+ if (state.length === 0 && state.ended) endReadable(this)
+ else emitReadable(this)
+ return null
+ }
+ n = howMuchToRead(n, state)
+
+ // If we've ended, and we're now clear, then finish it up.
+ if (n === 0 && state.ended) {
+ if (state.length === 0) endReadable(this)
+ return null
+ }
+
+ // All the actual chunk generation logic needs to be
+ // *below* the call to _read. The reason is that in certain
+ // synthetic stream cases, such as passthrough streams, _read
+ // may be a completely synchronous operation which may change
+ // the state of the read buffer, providing enough data when
+ // before there was *not* enough.
+ //
+ // So, the steps are:
+ // 1. Figure out what the state of things will be after we do
+ // a read from the buffer.
+ //
+ // 2. If that resulting state will trigger a _read, then call _read.
+ // Note that this may be asynchronous, or synchronous. Yes, it is
+ // deeply ugly to write APIs this way, but that still doesn't mean
+ // that the Readable class should behave improperly, as streams are
+ // designed to be sync/async agnostic.
+ // Take note if the _read call is sync or async (ie, if the read call
+ // has returned yet), so that we know whether or not it's safe to emit
+ // 'readable' etc.
+ //
+ // 3. Actually pull the requested chunks out of the buffer and return.
+
+ // if we need a readable event, then we need to do some reading.
+ let doRead = (state.state & kNeedReadable) !== 0
+ debug('need readable', doRead)
+
+ // If we currently have less than the highWaterMark, then also read some.
+ if (state.length === 0 || state.length - n < state.highWaterMark) {
+ doRead = true
+ debug('length less than watermark', doRead)
+ }
+
+ // However, if we've ended, then there's no point, if we're already
+ // reading, then it's unnecessary, if we're constructing we have to wait,
+ // and if we're destroyed or errored, then it's not allowed,
+ if (state.ended || state.reading || state.destroyed || state.errored || !state.constructed) {
+ doRead = false
+ debug('reading, ended or constructing', doRead)
+ } else if (doRead) {
+ debug('do read')
+ state.state |= kReading | kSync
+ // If the length is currently zero, then we *need* a readable event.
+ if (state.length === 0) state.state |= kNeedReadable
+
+ // Call internal read method
+ try {
+ this._read(state.highWaterMark)
+ } catch (err) {
+ errorOrDestroy(this, err)
+ }
+ state.state &= ~kSync
+
+ // If _read pushed data synchronously, then `reading` will be false,
+ // and we need to re-evaluate how much data we can return to the user.
+ if (!state.reading) n = howMuchToRead(nOrig, state)
+ }
+ let ret
+ if (n > 0) ret = fromList(n, state)
+ else ret = null
+ if (ret === null) {
+ state.needReadable = state.length <= state.highWaterMark
+ n = 0
+ } else {
+ state.length -= n
+ if (state.multiAwaitDrain) {
+ state.awaitDrainWriters.clear()
+ } else {
+ state.awaitDrainWriters = null
+ }
+ }
+ if (state.length === 0) {
+ // If we have nothing in the buffer, then we want to know
+ // as soon as we *do* get something into the buffer.
+ if (!state.ended) state.needReadable = true
+
+ // If we tried to read() past the EOF, then emit end on the next tick.
+ if (nOrig !== n && state.ended) endReadable(this)
+ }
+ if (ret !== null && !state.errorEmitted && !state.closeEmitted) {
+ state.dataEmitted = true
+ this.emit('data', ret)
+ }
+ return ret
+}
+function onEofChunk(stream, state) {
+ debug('onEofChunk')
+ if (state.ended) return
+ if (state.decoder) {
+ const chunk = state.decoder.end()
+ if (chunk && chunk.length) {
+ state.buffer.push(chunk)
+ state.length += state.objectMode ? 1 : chunk.length
+ }
+ }
+ state.ended = true
+ if (state.sync) {
+ // If we are sync, wait until next tick to emit the data.
+ // Otherwise we risk emitting data in the flow()
+ // the readable code triggers during a read() call.
+ emitReadable(stream)
+ } else {
+ // Emit 'readable' now to make sure it gets picked up.
+ state.needReadable = false
+ state.emittedReadable = true
+ // We have to emit readable now that we are EOF. Modules
+ // in the ecosystem (e.g. dicer) rely on this event being sync.
+ emitReadable_(stream)
+ }
+}
+
+// Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow. This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+function emitReadable(stream) {
+ const state = stream._readableState
+ debug('emitReadable', state.needReadable, state.emittedReadable)
+ state.needReadable = false
+ if (!state.emittedReadable) {
+ debug('emitReadable', state.flowing)
+ state.emittedReadable = true
+ process.nextTick(emitReadable_, stream)
+ }
+}
+function emitReadable_(stream) {
+ const state = stream._readableState
+ debug('emitReadable_', state.destroyed, state.length, state.ended)
+ if (!state.destroyed && !state.errored && (state.length || state.ended)) {
+ stream.emit('readable')
+ state.emittedReadable = false
+ }
+
+ // The stream needs another readable event if:
+ // 1. It is not flowing, as the flow mechanism will take
+ // care of it.
+ // 2. It is not ended.
+ // 3. It is below the highWaterMark, so we can schedule
+ // another readable later.
+ state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark
+ flow(stream)
+}
+
+// At this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data. that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+function maybeReadMore(stream, state) {
+ if (!state.readingMore && state.constructed) {
+ state.readingMore = true
+ process.nextTick(maybeReadMore_, stream, state)
+ }
+}
+function maybeReadMore_(stream, state) {
+ // Attempt to read more data if we should.
+ //
+ // The conditions for reading more data are (one of):
+ // - Not enough data buffered (state.length < state.highWaterMark). The loop
+ // is responsible for filling the buffer with enough data if such data
+ // is available. If highWaterMark is 0 and we are not in the flowing mode
+ // we should _not_ attempt to buffer any extra data. We'll get more data
+ // when the stream consumer calls read() instead.
+ // - No data in the buffer, and the stream is in flowing mode. In this mode
+ // the loop below is responsible for ensuring read() is called. Failing to
+ // call read here would abort the flow and there's no other mechanism for
+ // continuing the flow if the stream consumer has just subscribed to the
+ // 'data' event.
+ //
+ // In addition to the above conditions to keep reading data, the following
+ // conditions prevent the data from being read:
+ // - The stream has ended (state.ended).
+ // - There is already a pending 'read' operation (state.reading). This is a
+ // case where the stream has called the implementation defined _read()
+ // method, but they are processing the call asynchronously and have _not_
+ // called push() with new data. In this case we skip performing more
+ // read()s. The execution ends in this method again after the _read() ends
+ // up calling push() with more data.
+ while (
+ !state.reading &&
+ !state.ended &&
+ (state.length < state.highWaterMark || (state.flowing && state.length === 0))
+ ) {
+ const len = state.length
+ debug('maybeReadMore read 0')
+ stream.read(0)
+ if (len === state.length)
+ // Didn't get any data, stop spinning.
+ break
+ }
+ state.readingMore = false
+}
+
+// Abstract method. to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+Readable.prototype._read = function (n) {
+ throw new ERR_METHOD_NOT_IMPLEMENTED('_read()')
+}
+Readable.prototype.pipe = function (dest, pipeOpts) {
+ const src = this
+ const state = this._readableState
+ if (state.pipes.length === 1) {
+ if (!state.multiAwaitDrain) {
+ state.multiAwaitDrain = true
+ state.awaitDrainWriters = new SafeSet(state.awaitDrainWriters ? [state.awaitDrainWriters] : [])
+ }
+ }
+ state.pipes.push(dest)
+ debug('pipe count=%d opts=%j', state.pipes.length, pipeOpts)
+ const doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr
+ const endFn = doEnd ? onend : unpipe
+ if (state.endEmitted) process.nextTick(endFn)
+ else src.once('end', endFn)
+ dest.on('unpipe', onunpipe)
+ function onunpipe(readable, unpipeInfo) {
+ debug('onunpipe')
+ if (readable === src) {
+ if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
+ unpipeInfo.hasUnpiped = true
+ cleanup()
+ }
+ }
+ }
+ function onend() {
+ debug('onend')
+ dest.end()
+ }
+ let ondrain
+ let cleanedUp = false
+ function cleanup() {
+ debug('cleanup')
+ // Cleanup event handlers once the pipe is broken.
+ dest.removeListener('close', onclose)
+ dest.removeListener('finish', onfinish)
+ if (ondrain) {
+ dest.removeListener('drain', ondrain)
+ }
+ dest.removeListener('error', onerror)
+ dest.removeListener('unpipe', onunpipe)
+ src.removeListener('end', onend)
+ src.removeListener('end', unpipe)
+ src.removeListener('data', ondata)
+ cleanedUp = true
+
+ // If the reader is waiting for a drain event from this
+ // specific writer, then it would cause it to never start
+ // flowing again.
+ // So, if this is awaiting a drain, then we just call it now.
+ // If we don't know, then assume that we are waiting for one.
+ if (ondrain && state.awaitDrainWriters && (!dest._writableState || dest._writableState.needDrain)) ondrain()
+ }
+ function pause() {
+ // If the user unpiped during `dest.write()`, it is possible
+ // to get stuck in a permanently paused state if that write
+ // also returned false.
+ // => Check whether `dest` is still a piping destination.
+ if (!cleanedUp) {
+ if (state.pipes.length === 1 && state.pipes[0] === dest) {
+ debug('false write response, pause', 0)
+ state.awaitDrainWriters = dest
+ state.multiAwaitDrain = false
+ } else if (state.pipes.length > 1 && state.pipes.includes(dest)) {
+ debug('false write response, pause', state.awaitDrainWriters.size)
+ state.awaitDrainWriters.add(dest)
+ }
+ src.pause()
+ }
+ if (!ondrain) {
+ // When the dest drains, it reduces the awaitDrain counter
+ // on the source. This would be more elegant with a .once()
+ // handler in flow(), but adding and removing repeatedly is
+ // too slow.
+ ondrain = pipeOnDrain(src, dest)
+ dest.on('drain', ondrain)
+ }
+ }
+ src.on('data', ondata)
+ function ondata(chunk) {
+ debug('ondata')
+ const ret = dest.write(chunk)
+ debug('dest.write', ret)
+ if (ret === false) {
+ pause()
+ }
+ }
+
+ // If the dest has an error, then stop piping into it.
+ // However, don't suppress the throwing behavior for this.
+ function onerror(er) {
+ debug('onerror', er)
+ unpipe()
+ dest.removeListener('error', onerror)
+ if (dest.listenerCount('error') === 0) {
+ const s = dest._writableState || dest._readableState
+ if (s && !s.errorEmitted) {
+ // User incorrectly emitted 'error' directly on the stream.
+ errorOrDestroy(dest, er)
+ } else {
+ dest.emit('error', er)
+ }
+ }
+ }
+
+ // Make sure our error handler is attached before userland ones.
+ prependListener(dest, 'error', onerror)
+
+ // Both close and finish should trigger unpipe, but only once.
+ function onclose() {
+ dest.removeListener('finish', onfinish)
+ unpipe()
+ }
+ dest.once('close', onclose)
+ function onfinish() {
+ debug('onfinish')
+ dest.removeListener('close', onclose)
+ unpipe()
+ }
+ dest.once('finish', onfinish)
+ function unpipe() {
+ debug('unpipe')
+ src.unpipe(dest)
+ }
+
+ // Tell the dest that it's being piped to.
+ dest.emit('pipe', src)
+
+ // Start the flow if it hasn't been started already.
+
+ if (dest.writableNeedDrain === true) {
+ pause()
+ } else if (!state.flowing) {
+ debug('pipe resume')
+ src.resume()
+ }
+ return dest
+}
+function pipeOnDrain(src, dest) {
+ return function pipeOnDrainFunctionResult() {
+ const state = src._readableState
+
+ // `ondrain` will call directly,
+ // `this` maybe not a reference to dest,
+ // so we use the real dest here.
+ if (state.awaitDrainWriters === dest) {
+ debug('pipeOnDrain', 1)
+ state.awaitDrainWriters = null
+ } else if (state.multiAwaitDrain) {
+ debug('pipeOnDrain', state.awaitDrainWriters.size)
+ state.awaitDrainWriters.delete(dest)
+ }
+ if ((!state.awaitDrainWriters || state.awaitDrainWriters.size === 0) && src.listenerCount('data')) {
+ src.resume()
+ }
+ }
+}
+Readable.prototype.unpipe = function (dest) {
+ const state = this._readableState
+ const unpipeInfo = {
+ hasUnpiped: false
+ }
+
+ // If we're not piping anywhere, then do nothing.
+ if (state.pipes.length === 0) return this
+ if (!dest) {
+ // remove all.
+ const dests = state.pipes
+ state.pipes = []
+ this.pause()
+ for (let i = 0; i < dests.length; i++)
+ dests[i].emit('unpipe', this, {
+ hasUnpiped: false
+ })
+ return this
+ }
+
+ // Try to find the right one.
+ const index = ArrayPrototypeIndexOf(state.pipes, dest)
+ if (index === -1) return this
+ state.pipes.splice(index, 1)
+ if (state.pipes.length === 0) this.pause()
+ dest.emit('unpipe', this, unpipeInfo)
+ return this
+}
+
+// Set up data events if they are asked for
+// Ensure readable listeners eventually get something.
+Readable.prototype.on = function (ev, fn) {
+ const res = Stream.prototype.on.call(this, ev, fn)
+ const state = this._readableState
+ if (ev === 'data') {
+ // Update readableListening so that resume() may be a no-op
+ // a few lines down. This is needed to support once('readable').
+ state.readableListening = this.listenerCount('readable') > 0
+
+ // Try start flowing on next tick if stream isn't explicitly paused.
+ if (state.flowing !== false) this.resume()
+ } else if (ev === 'readable') {
+ if (!state.endEmitted && !state.readableListening) {
+ state.readableListening = state.needReadable = true
+ state.flowing = false
+ state.emittedReadable = false
+ debug('on readable', state.length, state.reading)
+ if (state.length) {
+ emitReadable(this)
+ } else if (!state.reading) {
+ process.nextTick(nReadingNextTick, this)
+ }
+ }
+ }
+ return res
+}
+Readable.prototype.addListener = Readable.prototype.on
+Readable.prototype.removeListener = function (ev, fn) {
+ const res = Stream.prototype.removeListener.call(this, ev, fn)
+ if (ev === 'readable') {
+ // We need to check if there is someone still listening to
+ // readable and reset the state. However this needs to happen
+ // after readable has been emitted but before I/O (nextTick) to
+ // support once('readable', fn) cycles. This means that calling
+ // resume within the same tick will have no
+ // effect.
+ process.nextTick(updateReadableListening, this)
+ }
+ return res
+}
+Readable.prototype.off = Readable.prototype.removeListener
+Readable.prototype.removeAllListeners = function (ev) {
+ const res = Stream.prototype.removeAllListeners.apply(this, arguments)
+ if (ev === 'readable' || ev === undefined) {
+ // We need to check if there is someone still listening to
+ // readable and reset the state. However this needs to happen
+ // after readable has been emitted but before I/O (nextTick) to
+ // support once('readable', fn) cycles. This means that calling
+ // resume within the same tick will have no
+ // effect.
+ process.nextTick(updateReadableListening, this)
+ }
+ return res
+}
+function updateReadableListening(self) {
+ const state = self._readableState
+ state.readableListening = self.listenerCount('readable') > 0
+ if (state.resumeScheduled && state[kPaused] === false) {
+ // Flowing needs to be set to true now, otherwise
+ // the upcoming resume will not flow.
+ state.flowing = true
+
+ // Crude way to check if we should resume.
+ } else if (self.listenerCount('data') > 0) {
+ self.resume()
+ } else if (!state.readableListening) {
+ state.flowing = null
+ }
+}
+function nReadingNextTick(self) {
+ debug('readable nexttick read 0')
+ self.read(0)
+}
+
+// pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+Readable.prototype.resume = function () {
+ const state = this._readableState
+ if (!state.flowing) {
+ debug('resume')
+ // We flow only if there is no one listening
+ // for readable, but we still have to call
+ // resume().
+ state.flowing = !state.readableListening
+ resume(this, state)
+ }
+ state[kPaused] = false
+ return this
+}
+function resume(stream, state) {
+ if (!state.resumeScheduled) {
+ state.resumeScheduled = true
+ process.nextTick(resume_, stream, state)
+ }
+}
+function resume_(stream, state) {
+ debug('resume', state.reading)
+ if (!state.reading) {
+ stream.read(0)
+ }
+ state.resumeScheduled = false
+ stream.emit('resume')
+ flow(stream)
+ if (state.flowing && !state.reading) stream.read(0)
+}
+Readable.prototype.pause = function () {
+ debug('call pause flowing=%j', this._readableState.flowing)
+ if (this._readableState.flowing !== false) {
+ debug('pause')
+ this._readableState.flowing = false
+ this.emit('pause')
+ }
+ this._readableState[kPaused] = true
+ return this
+}
+function flow(stream) {
+ const state = stream._readableState
+ debug('flow', state.flowing)
+ while (state.flowing && stream.read() !== null);
+}
+
+// Wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+Readable.prototype.wrap = function (stream) {
+ let paused = false
+
+ // TODO (ronag): Should this.destroy(err) emit
+ // 'error' on the wrapped stream? Would require
+ // a static factory method, e.g. Readable.wrap(stream).
+
+ stream.on('data', (chunk) => {
+ if (!this.push(chunk) && stream.pause) {
+ paused = true
+ stream.pause()
+ }
+ })
+ stream.on('end', () => {
+ this.push(null)
+ })
+ stream.on('error', (err) => {
+ errorOrDestroy(this, err)
+ })
+ stream.on('close', () => {
+ this.destroy()
+ })
+ stream.on('destroy', () => {
+ this.destroy()
+ })
+ this._read = () => {
+ if (paused && stream.resume) {
+ paused = false
+ stream.resume()
+ }
+ }
+
+ // Proxy all the other methods. Important when wrapping filters and duplexes.
+ const streamKeys = ObjectKeys(stream)
+ for (let j = 1; j < streamKeys.length; j++) {
+ const i = streamKeys[j]
+ if (this[i] === undefined && typeof stream[i] === 'function') {
+ this[i] = stream[i].bind(stream)
+ }
+ }
+ return this
+}
+Readable.prototype[SymbolAsyncIterator] = function () {
+ return streamToAsyncIterator(this)
+}
+Readable.prototype.iterator = function (options) {
+ if (options !== undefined) {
+ validateObject(options, 'options')
+ }
+ return streamToAsyncIterator(this, options)
+}
+function streamToAsyncIterator(stream, options) {
+ if (typeof stream.read !== 'function') {
+ stream = Readable.wrap(stream, {
+ objectMode: true
+ })
+ }
+ const iter = createAsyncIterator(stream, options)
+ iter.stream = stream
+ return iter
+}
+async function* createAsyncIterator(stream, options) {
+ let callback = nop
+ function next(resolve) {
+ if (this === stream) {
+ callback()
+ callback = nop
+ } else {
+ callback = resolve
+ }
+ }
+ stream.on('readable', next)
+ let error
+ const cleanup = eos(
+ stream,
+ {
+ writable: false
+ },
+ (err) => {
+ error = err ? aggregateTwoErrors(error, err) : null
+ callback()
+ callback = nop
+ }
+ )
+ try {
+ while (true) {
+ const chunk = stream.destroyed ? null : stream.read()
+ if (chunk !== null) {
+ yield chunk
+ } else if (error) {
+ throw error
+ } else if (error === null) {
+ return
+ } else {
+ await new Promise(next)
+ }
+ }
+ } catch (err) {
+ error = aggregateTwoErrors(error, err)
+ throw error
+ } finally {
+ if (
+ (error || (options === null || options === undefined ? undefined : options.destroyOnReturn) !== false) &&
+ (error === undefined || stream._readableState.autoDestroy)
+ ) {
+ destroyImpl.destroyer(stream, null)
+ } else {
+ stream.off('readable', next)
+ cleanup()
+ }
+ }
+}
+
+// Making it explicit these properties are not enumerable
+// because otherwise some prototype manipulation in
+// userland will fail.
+ObjectDefineProperties(Readable.prototype, {
+ readable: {
+ __proto__: null,
+ get() {
+ const r = this._readableState
+ // r.readable === false means that this is part of a Duplex stream
+ // where the readable side was disabled upon construction.
+ // Compat. The user might manually disable readable side through
+ // deprecated setter.
+ return !!r && r.readable !== false && !r.destroyed && !r.errorEmitted && !r.endEmitted
+ },
+ set(val) {
+ // Backwards compat.
+ if (this._readableState) {
+ this._readableState.readable = !!val
+ }
+ }
+ },
+ readableDidRead: {
+ __proto__: null,
+ enumerable: false,
+ get: function () {
+ return this._readableState.dataEmitted
+ }
+ },
+ readableAborted: {
+ __proto__: null,
+ enumerable: false,
+ get: function () {
+ return !!(
+ this._readableState.readable !== false &&
+ (this._readableState.destroyed || this._readableState.errored) &&
+ !this._readableState.endEmitted
+ )
+ }
+ },
+ readableHighWaterMark: {
+ __proto__: null,
+ enumerable: false,
+ get: function () {
+ return this._readableState.highWaterMark
+ }
+ },
+ readableBuffer: {
+ __proto__: null,
+ enumerable: false,
+ get: function () {
+ return this._readableState && this._readableState.buffer
+ }
+ },
+ readableFlowing: {
+ __proto__: null,
+ enumerable: false,
+ get: function () {
+ return this._readableState.flowing
+ },
+ set: function (state) {
+ if (this._readableState) {
+ this._readableState.flowing = state
+ }
+ }
+ },
+ readableLength: {
+ __proto__: null,
+ enumerable: false,
+ get() {
+ return this._readableState.length
+ }
+ },
+ readableObjectMode: {
+ __proto__: null,
+ enumerable: false,
+ get() {
+ return this._readableState ? this._readableState.objectMode : false
+ }
+ },
+ readableEncoding: {
+ __proto__: null,
+ enumerable: false,
+ get() {
+ return this._readableState ? this._readableState.encoding : null
+ }
+ },
+ errored: {
+ __proto__: null,
+ enumerable: false,
+ get() {
+ return this._readableState ? this._readableState.errored : null
+ }
+ },
+ closed: {
+ __proto__: null,
+ get() {
+ return this._readableState ? this._readableState.closed : false
+ }
+ },
+ destroyed: {
+ __proto__: null,
+ enumerable: false,
+ get() {
+ return this._readableState ? this._readableState.destroyed : false
+ },
+ set(value) {
+ // We ignore the value if the stream
+ // has not been initialized yet.
+ if (!this._readableState) {
+ return
+ }
+
+ // Backward compatibility, the user is explicitly
+ // managing destroyed.
+ this._readableState.destroyed = value
+ }
+ },
+ readableEnded: {
+ __proto__: null,
+ enumerable: false,
+ get() {
+ return this._readableState ? this._readableState.endEmitted : false
+ }
+ }
+})
+ObjectDefineProperties(ReadableState.prototype, {
+ // Legacy getter for `pipesCount`.
+ pipesCount: {
+ __proto__: null,
+ get() {
+ return this.pipes.length
+ }
+ },
+ // Legacy property for `paused`.
+ paused: {
+ __proto__: null,
+ get() {
+ return this[kPaused] !== false
+ },
+ set(value) {
+ this[kPaused] = !!value
+ }
+ }
+})
+
+// Exposed for testing purposes only.
+Readable._fromList = fromList
+
+// Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromList(n, state) {
+ // nothing buffered.
+ if (state.length === 0) return null
+ let ret
+ if (state.objectMode) ret = state.buffer.shift()
+ else if (!n || n >= state.length) {
+ // Read it all, truncate the list.
+ if (state.decoder) ret = state.buffer.join('')
+ else if (state.buffer.length === 1) ret = state.buffer.first()
+ else ret = state.buffer.concat(state.length)
+ state.buffer.clear()
+ } else {
+ // read part of list.
+ ret = state.buffer.consume(n, state.decoder)
+ }
+ return ret
+}
+function endReadable(stream) {
+ const state = stream._readableState
+ debug('endReadable', state.endEmitted)
+ if (!state.endEmitted) {
+ state.ended = true
+ process.nextTick(endReadableNT, state, stream)
+ }
+}
+function endReadableNT(state, stream) {
+ debug('endReadableNT', state.endEmitted, state.length)
+
+ // Check that we didn't get one last unshift.
+ if (!state.errored && !state.closeEmitted && !state.endEmitted && state.length === 0) {
+ state.endEmitted = true
+ stream.emit('end')
+ if (stream.writable && stream.allowHalfOpen === false) {
+ process.nextTick(endWritableNT, stream)
+ } else if (state.autoDestroy) {
+ // In case of duplex streams we need a way to detect
+ // if the writable side is ready for autoDestroy as well.
+ const wState = stream._writableState
+ const autoDestroy =
+ !wState ||
+ (wState.autoDestroy &&
+ // We don't expect the writable to ever 'finish'
+ // if writable is explicitly set to false.
+ (wState.finished || wState.writable === false))
+ if (autoDestroy) {
+ stream.destroy()
+ }
+ }
+ }
+}
+function endWritableNT(stream) {
+ const writable = stream.writable && !stream.writableEnded && !stream.destroyed
+ if (writable) {
+ stream.end()
+ }
+}
+Readable.from = function (iterable, opts) {
+ return from(Readable, iterable, opts)
+}
+let webStreamsAdapters
+
+// Lazy to avoid circular references
+function lazyWebStreams() {
+ if (webStreamsAdapters === undefined) webStreamsAdapters = {}
+ return webStreamsAdapters
+}
+Readable.fromWeb = function (readableStream, options) {
+ return lazyWebStreams().newStreamReadableFromReadableStream(readableStream, options)
+}
+Readable.toWeb = function (streamReadable, options) {
+ return lazyWebStreams().newReadableStreamFromStreamReadable(streamReadable, options)
+}
+Readable.wrap = function (src, options) {
+ var _ref, _src$readableObjectMo
+ return new Readable({
+ objectMode:
+ (_ref =
+ (_src$readableObjectMo = src.readableObjectMode) !== null && _src$readableObjectMo !== undefined
+ ? _src$readableObjectMo
+ : src.objectMode) !== null && _ref !== undefined
+ ? _ref
+ : true,
+ ...options,
+ destroy(err, callback) {
+ destroyImpl.destroyer(src, err)
+ callback(err)
+ }
+ }).wrap(src)
+}
+
+},{"../../ours/errors":149,"../../ours/primordials":150,"../../ours/util":151,"../validators":147,"./add-abort-signal":130,"./buffer_list":131,"./destroy":133,"./duplex":134,"./end-of-stream":136,"./from":137,"./legacy":138,"./state":143,"buffer":120,"events":128,"process/":168,"string_decoder":217}],143:[function(require,module,exports){
+'use strict'
+
+const { MathFloor, NumberIsInteger } = require('../../ours/primordials')
+const { validateInteger } = require('../validators')
+const { ERR_INVALID_ARG_VALUE } = require('../../ours/errors').codes
+let defaultHighWaterMarkBytes = 16 * 1024
+let defaultHighWaterMarkObjectMode = 16
+function highWaterMarkFrom(options, isDuplex, duplexKey) {
+ return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null
+}
+function getDefaultHighWaterMark(objectMode) {
+ return objectMode ? defaultHighWaterMarkObjectMode : defaultHighWaterMarkBytes
+}
+function setDefaultHighWaterMark(objectMode, value) {
+ validateInteger(value, 'value', 0)
+ if (objectMode) {
+ defaultHighWaterMarkObjectMode = value
+ } else {
+ defaultHighWaterMarkBytes = value
+ }
+}
+function getHighWaterMark(state, options, duplexKey, isDuplex) {
+ const hwm = highWaterMarkFrom(options, isDuplex, duplexKey)
+ if (hwm != null) {
+ if (!NumberIsInteger(hwm) || hwm < 0) {
+ const name = isDuplex ? `options.${duplexKey}` : 'options.highWaterMark'
+ throw new ERR_INVALID_ARG_VALUE(name, hwm)
+ }
+ return MathFloor(hwm)
+ }
+
+ // Default value
+ return getDefaultHighWaterMark(state.objectMode)
+}
+module.exports = {
+ getHighWaterMark,
+ getDefaultHighWaterMark,
+ setDefaultHighWaterMark
+}
+
+},{"../../ours/errors":149,"../../ours/primordials":150,"../validators":147}],144:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a transform stream is a readable/writable stream where you do
+// something with the data. Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored. (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation. For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes. When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up. When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer. When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks. If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk. However,
+// a pathological inflate type of transform can cause excessive buffering
+// here. For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output. In this case, you could write a very small
+// amount of input, and end up with a very large amount of output. In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform. A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+
+'use strict'
+
+const { ObjectSetPrototypeOf, Symbol } = require('../../ours/primordials')
+module.exports = Transform
+const { ERR_METHOD_NOT_IMPLEMENTED } = require('../../ours/errors').codes
+const Duplex = require('./duplex')
+const { getHighWaterMark } = require('./state')
+ObjectSetPrototypeOf(Transform.prototype, Duplex.prototype)
+ObjectSetPrototypeOf(Transform, Duplex)
+const kCallback = Symbol('kCallback')
+function Transform(options) {
+ if (!(this instanceof Transform)) return new Transform(options)
+
+ // TODO (ronag): This should preferably always be
+ // applied but would be semver-major. Or even better;
+ // make Transform a Readable with the Writable interface.
+ const readableHighWaterMark = options ? getHighWaterMark(this, options, 'readableHighWaterMark', true) : null
+ if (readableHighWaterMark === 0) {
+ // A Duplex will buffer both on the writable and readable side while
+ // a Transform just wants to buffer hwm number of elements. To avoid
+ // buffering twice we disable buffering on the writable side.
+ options = {
+ ...options,
+ highWaterMark: null,
+ readableHighWaterMark,
+ // TODO (ronag): 0 is not optimal since we have
+ // a "bug" where we check needDrain before calling _write and not after.
+ // Refs: https://github.com/nodejs/node/pull/32887
+ // Refs: https://github.com/nodejs/node/pull/35941
+ writableHighWaterMark: options.writableHighWaterMark || 0
+ }
+ }
+ Duplex.call(this, options)
+
+ // We have implemented the _read method, and done the other things
+ // that Readable wants before the first _read call, so unset the
+ // sync guard flag.
+ this._readableState.sync = false
+ this[kCallback] = null
+ if (options) {
+ if (typeof options.transform === 'function') this._transform = options.transform
+ if (typeof options.flush === 'function') this._flush = options.flush
+ }
+
+ // When the writable side finishes, then flush out anything remaining.
+ // Backwards compat. Some Transform streams incorrectly implement _final
+ // instead of or in addition to _flush. By using 'prefinish' instead of
+ // implementing _final we continue supporting this unfortunate use case.
+ this.on('prefinish', prefinish)
+}
+function final(cb) {
+ if (typeof this._flush === 'function' && !this.destroyed) {
+ this._flush((er, data) => {
+ if (er) {
+ if (cb) {
+ cb(er)
+ } else {
+ this.destroy(er)
+ }
+ return
+ }
+ if (data != null) {
+ this.push(data)
+ }
+ this.push(null)
+ if (cb) {
+ cb()
+ }
+ })
+ } else {
+ this.push(null)
+ if (cb) {
+ cb()
+ }
+ }
+}
+function prefinish() {
+ if (this._final !== final) {
+ final.call(this)
+ }
+}
+Transform.prototype._final = final
+Transform.prototype._transform = function (chunk, encoding, callback) {
+ throw new ERR_METHOD_NOT_IMPLEMENTED('_transform()')
+}
+Transform.prototype._write = function (chunk, encoding, callback) {
+ const rState = this._readableState
+ const wState = this._writableState
+ const length = rState.length
+ this._transform(chunk, encoding, (err, val) => {
+ if (err) {
+ callback(err)
+ return
+ }
+ if (val != null) {
+ this.push(val)
+ }
+ if (
+ wState.ended ||
+ // Backwards compat.
+ length === rState.length ||
+ // Backwards compat.
+ rState.length < rState.highWaterMark
+ ) {
+ callback()
+ } else {
+ this[kCallback] = callback
+ }
+ })
+}
+Transform.prototype._read = function () {
+ if (this[kCallback]) {
+ const callback = this[kCallback]
+ this[kCallback] = null
+ callback()
+ }
+}
+
+},{"../../ours/errors":149,"../../ours/primordials":150,"./duplex":134,"./state":143}],145:[function(require,module,exports){
+'use strict'
+
+const { SymbolAsyncIterator, SymbolIterator, SymbolFor } = require('../../ours/primordials')
+
+// We need to use SymbolFor to make these globally available
+// for interopt with readable-stream, i.e. readable-stream
+// and node core needs to be able to read/write private state
+// from each other for proper interoperability.
+const kIsDestroyed = SymbolFor('nodejs.stream.destroyed')
+const kIsErrored = SymbolFor('nodejs.stream.errored')
+const kIsReadable = SymbolFor('nodejs.stream.readable')
+const kIsWritable = SymbolFor('nodejs.stream.writable')
+const kIsDisturbed = SymbolFor('nodejs.stream.disturbed')
+const kIsClosedPromise = SymbolFor('nodejs.webstream.isClosedPromise')
+const kControllerErrorFunction = SymbolFor('nodejs.webstream.controllerErrorFunction')
+function isReadableNodeStream(obj, strict = false) {
+ var _obj$_readableState
+ return !!(
+ (
+ obj &&
+ typeof obj.pipe === 'function' &&
+ typeof obj.on === 'function' &&
+ (!strict || (typeof obj.pause === 'function' && typeof obj.resume === 'function')) &&
+ (!obj._writableState ||
+ ((_obj$_readableState = obj._readableState) === null || _obj$_readableState === undefined
+ ? undefined
+ : _obj$_readableState.readable) !== false) &&
+ // Duplex
+ (!obj._writableState || obj._readableState)
+ ) // Writable has .pipe.
+ )
+}
+
+function isWritableNodeStream(obj) {
+ var _obj$_writableState
+ return !!(
+ (
+ obj &&
+ typeof obj.write === 'function' &&
+ typeof obj.on === 'function' &&
+ (!obj._readableState ||
+ ((_obj$_writableState = obj._writableState) === null || _obj$_writableState === undefined
+ ? undefined
+ : _obj$_writableState.writable) !== false)
+ ) // Duplex
+ )
+}
+
+function isDuplexNodeStream(obj) {
+ return !!(
+ obj &&
+ typeof obj.pipe === 'function' &&
+ obj._readableState &&
+ typeof obj.on === 'function' &&
+ typeof obj.write === 'function'
+ )
+}
+function isNodeStream(obj) {
+ return (
+ obj &&
+ (obj._readableState ||
+ obj._writableState ||
+ (typeof obj.write === 'function' && typeof obj.on === 'function') ||
+ (typeof obj.pipe === 'function' && typeof obj.on === 'function'))
+ )
+}
+function isReadableStream(obj) {
+ return !!(
+ obj &&
+ !isNodeStream(obj) &&
+ typeof obj.pipeThrough === 'function' &&
+ typeof obj.getReader === 'function' &&
+ typeof obj.cancel === 'function'
+ )
+}
+function isWritableStream(obj) {
+ return !!(obj && !isNodeStream(obj) && typeof obj.getWriter === 'function' && typeof obj.abort === 'function')
+}
+function isTransformStream(obj) {
+ return !!(obj && !isNodeStream(obj) && typeof obj.readable === 'object' && typeof obj.writable === 'object')
+}
+function isWebStream(obj) {
+ return isReadableStream(obj) || isWritableStream(obj) || isTransformStream(obj)
+}
+function isIterable(obj, isAsync) {
+ if (obj == null) return false
+ if (isAsync === true) return typeof obj[SymbolAsyncIterator] === 'function'
+ if (isAsync === false) return typeof obj[SymbolIterator] === 'function'
+ return typeof obj[SymbolAsyncIterator] === 'function' || typeof obj[SymbolIterator] === 'function'
+}
+function isDestroyed(stream) {
+ if (!isNodeStream(stream)) return null
+ const wState = stream._writableState
+ const rState = stream._readableState
+ const state = wState || rState
+ return !!(stream.destroyed || stream[kIsDestroyed] || (state !== null && state !== undefined && state.destroyed))
+}
+
+// Have been end():d.
+function isWritableEnded(stream) {
+ if (!isWritableNodeStream(stream)) return null
+ if (stream.writableEnded === true) return true
+ const wState = stream._writableState
+ if (wState !== null && wState !== undefined && wState.errored) return false
+ if (typeof (wState === null || wState === undefined ? undefined : wState.ended) !== 'boolean') return null
+ return wState.ended
+}
+
+// Have emitted 'finish'.
+function isWritableFinished(stream, strict) {
+ if (!isWritableNodeStream(stream)) return null
+ if (stream.writableFinished === true) return true
+ const wState = stream._writableState
+ if (wState !== null && wState !== undefined && wState.errored) return false
+ if (typeof (wState === null || wState === undefined ? undefined : wState.finished) !== 'boolean') return null
+ return !!(wState.finished || (strict === false && wState.ended === true && wState.length === 0))
+}
+
+// Have been push(null):d.
+function isReadableEnded(stream) {
+ if (!isReadableNodeStream(stream)) return null
+ if (stream.readableEnded === true) return true
+ const rState = stream._readableState
+ if (!rState || rState.errored) return false
+ if (typeof (rState === null || rState === undefined ? undefined : rState.ended) !== 'boolean') return null
+ return rState.ended
+}
+
+// Have emitted 'end'.
+function isReadableFinished(stream, strict) {
+ if (!isReadableNodeStream(stream)) return null
+ const rState = stream._readableState
+ if (rState !== null && rState !== undefined && rState.errored) return false
+ if (typeof (rState === null || rState === undefined ? undefined : rState.endEmitted) !== 'boolean') return null
+ return !!(rState.endEmitted || (strict === false && rState.ended === true && rState.length === 0))
+}
+function isReadable(stream) {
+ if (stream && stream[kIsReadable] != null) return stream[kIsReadable]
+ if (typeof (stream === null || stream === undefined ? undefined : stream.readable) !== 'boolean') return null
+ if (isDestroyed(stream)) return false
+ return isReadableNodeStream(stream) && stream.readable && !isReadableFinished(stream)
+}
+function isWritable(stream) {
+ if (stream && stream[kIsWritable] != null) return stream[kIsWritable]
+ if (typeof (stream === null || stream === undefined ? undefined : stream.writable) !== 'boolean') return null
+ if (isDestroyed(stream)) return false
+ return isWritableNodeStream(stream) && stream.writable && !isWritableEnded(stream)
+}
+function isFinished(stream, opts) {
+ if (!isNodeStream(stream)) {
+ return null
+ }
+ if (isDestroyed(stream)) {
+ return true
+ }
+ if ((opts === null || opts === undefined ? undefined : opts.readable) !== false && isReadable(stream)) {
+ return false
+ }
+ if ((opts === null || opts === undefined ? undefined : opts.writable) !== false && isWritable(stream)) {
+ return false
+ }
+ return true
+}
+function isWritableErrored(stream) {
+ var _stream$_writableStat, _stream$_writableStat2
+ if (!isNodeStream(stream)) {
+ return null
+ }
+ if (stream.writableErrored) {
+ return stream.writableErrored
+ }
+ return (_stream$_writableStat =
+ (_stream$_writableStat2 = stream._writableState) === null || _stream$_writableStat2 === undefined
+ ? undefined
+ : _stream$_writableStat2.errored) !== null && _stream$_writableStat !== undefined
+ ? _stream$_writableStat
+ : null
+}
+function isReadableErrored(stream) {
+ var _stream$_readableStat, _stream$_readableStat2
+ if (!isNodeStream(stream)) {
+ return null
+ }
+ if (stream.readableErrored) {
+ return stream.readableErrored
+ }
+ return (_stream$_readableStat =
+ (_stream$_readableStat2 = stream._readableState) === null || _stream$_readableStat2 === undefined
+ ? undefined
+ : _stream$_readableStat2.errored) !== null && _stream$_readableStat !== undefined
+ ? _stream$_readableStat
+ : null
+}
+function isClosed(stream) {
+ if (!isNodeStream(stream)) {
+ return null
+ }
+ if (typeof stream.closed === 'boolean') {
+ return stream.closed
+ }
+ const wState = stream._writableState
+ const rState = stream._readableState
+ if (
+ typeof (wState === null || wState === undefined ? undefined : wState.closed) === 'boolean' ||
+ typeof (rState === null || rState === undefined ? undefined : rState.closed) === 'boolean'
+ ) {
+ return (
+ (wState === null || wState === undefined ? undefined : wState.closed) ||
+ (rState === null || rState === undefined ? undefined : rState.closed)
+ )
+ }
+ if (typeof stream._closed === 'boolean' && isOutgoingMessage(stream)) {
+ return stream._closed
+ }
+ return null
+}
+function isOutgoingMessage(stream) {
+ return (
+ typeof stream._closed === 'boolean' &&
+ typeof stream._defaultKeepAlive === 'boolean' &&
+ typeof stream._removedConnection === 'boolean' &&
+ typeof stream._removedContLen === 'boolean'
+ )
+}
+function isServerResponse(stream) {
+ return typeof stream._sent100 === 'boolean' && isOutgoingMessage(stream)
+}
+function isServerRequest(stream) {
+ var _stream$req
+ return (
+ typeof stream._consuming === 'boolean' &&
+ typeof stream._dumped === 'boolean' &&
+ ((_stream$req = stream.req) === null || _stream$req === undefined ? undefined : _stream$req.upgradeOrConnect) ===
+ undefined
+ )
+}
+function willEmitClose(stream) {
+ if (!isNodeStream(stream)) return null
+ const wState = stream._writableState
+ const rState = stream._readableState
+ const state = wState || rState
+ return (
+ (!state && isServerResponse(stream)) || !!(state && state.autoDestroy && state.emitClose && state.closed === false)
+ )
+}
+function isDisturbed(stream) {
+ var _stream$kIsDisturbed
+ return !!(
+ stream &&
+ ((_stream$kIsDisturbed = stream[kIsDisturbed]) !== null && _stream$kIsDisturbed !== undefined
+ ? _stream$kIsDisturbed
+ : stream.readableDidRead || stream.readableAborted)
+ )
+}
+function isErrored(stream) {
+ var _ref,
+ _ref2,
+ _ref3,
+ _ref4,
+ _ref5,
+ _stream$kIsErrored,
+ _stream$_readableStat3,
+ _stream$_writableStat3,
+ _stream$_readableStat4,
+ _stream$_writableStat4
+ return !!(
+ stream &&
+ ((_ref =
+ (_ref2 =
+ (_ref3 =
+ (_ref4 =
+ (_ref5 =
+ (_stream$kIsErrored = stream[kIsErrored]) !== null && _stream$kIsErrored !== undefined
+ ? _stream$kIsErrored
+ : stream.readableErrored) !== null && _ref5 !== undefined
+ ? _ref5
+ : stream.writableErrored) !== null && _ref4 !== undefined
+ ? _ref4
+ : (_stream$_readableStat3 = stream._readableState) === null || _stream$_readableStat3 === undefined
+ ? undefined
+ : _stream$_readableStat3.errorEmitted) !== null && _ref3 !== undefined
+ ? _ref3
+ : (_stream$_writableStat3 = stream._writableState) === null || _stream$_writableStat3 === undefined
+ ? undefined
+ : _stream$_writableStat3.errorEmitted) !== null && _ref2 !== undefined
+ ? _ref2
+ : (_stream$_readableStat4 = stream._readableState) === null || _stream$_readableStat4 === undefined
+ ? undefined
+ : _stream$_readableStat4.errored) !== null && _ref !== undefined
+ ? _ref
+ : (_stream$_writableStat4 = stream._writableState) === null || _stream$_writableStat4 === undefined
+ ? undefined
+ : _stream$_writableStat4.errored)
+ )
+}
+module.exports = {
+ isDestroyed,
+ kIsDestroyed,
+ isDisturbed,
+ kIsDisturbed,
+ isErrored,
+ kIsErrored,
+ isReadable,
+ kIsReadable,
+ kIsClosedPromise,
+ kControllerErrorFunction,
+ kIsWritable,
+ isClosed,
+ isDuplexNodeStream,
+ isFinished,
+ isIterable,
+ isReadableNodeStream,
+ isReadableStream,
+ isReadableEnded,
+ isReadableFinished,
+ isReadableErrored,
+ isNodeStream,
+ isWebStream,
+ isWritable,
+ isWritableNodeStream,
+ isWritableStream,
+ isWritableEnded,
+ isWritableFinished,
+ isWritableErrored,
+ isServerRequest,
+ isServerResponse,
+ willEmitClose,
+ isTransformStream
+}
+
+},{"../../ours/primordials":150}],146:[function(require,module,exports){
+/* replacement start */
+
+const process = require('process/')
+
+/* replacement end */
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
+
+;('use strict')
+const {
+ ArrayPrototypeSlice,
+ Error,
+ FunctionPrototypeSymbolHasInstance,
+ ObjectDefineProperty,
+ ObjectDefineProperties,
+ ObjectSetPrototypeOf,
+ StringPrototypeToLowerCase,
+ Symbol,
+ SymbolHasInstance
+} = require('../../ours/primordials')
+module.exports = Writable
+Writable.WritableState = WritableState
+const { EventEmitter: EE } = require('events')
+const Stream = require('./legacy').Stream
+const { Buffer } = require('buffer')
+const destroyImpl = require('./destroy')
+const { addAbortSignal } = require('./add-abort-signal')
+const { getHighWaterMark, getDefaultHighWaterMark } = require('./state')
+const {
+ ERR_INVALID_ARG_TYPE,
+ ERR_METHOD_NOT_IMPLEMENTED,
+ ERR_MULTIPLE_CALLBACK,
+ ERR_STREAM_CANNOT_PIPE,
+ ERR_STREAM_DESTROYED,
+ ERR_STREAM_ALREADY_FINISHED,
+ ERR_STREAM_NULL_VALUES,
+ ERR_STREAM_WRITE_AFTER_END,
+ ERR_UNKNOWN_ENCODING
+} = require('../../ours/errors').codes
+const { errorOrDestroy } = destroyImpl
+ObjectSetPrototypeOf(Writable.prototype, Stream.prototype)
+ObjectSetPrototypeOf(Writable, Stream)
+function nop() {}
+const kOnFinished = Symbol('kOnFinished')
+function WritableState(options, stream, isDuplex) {
+ // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream,
+ // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.
+ if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof require('./duplex')
+
+ // Object stream flag to indicate whether or not this stream
+ // contains buffers or objects.
+ this.objectMode = !!(options && options.objectMode)
+ if (isDuplex) this.objectMode = this.objectMode || !!(options && options.writableObjectMode)
+
+ // The point at which write() starts returning false
+ // Note: 0 is a valid value, means that we always return false if
+ // the entire buffer is not flushed immediately on write().
+ this.highWaterMark = options
+ ? getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex)
+ : getDefaultHighWaterMark(false)
+
+ // if _final has been called.
+ this.finalCalled = false
+
+ // drain event flag.
+ this.needDrain = false
+ // At the start of calling end()
+ this.ending = false
+ // When end() has been called, and returned.
+ this.ended = false
+ // When 'finish' is emitted.
+ this.finished = false
+
+ // Has it been destroyed
+ this.destroyed = false
+
+ // Should we decode strings into buffers before passing to _write?
+ // this is here so that some node-core streams can optimize string
+ // handling at a lower level.
+ const noDecode = !!(options && options.decodeStrings === false)
+ this.decodeStrings = !noDecode
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = (options && options.defaultEncoding) || 'utf8'
+
+ // Not an actual buffer we keep track of, but a measurement
+ // of how much we're waiting to get pushed to some underlying
+ // socket or file.
+ this.length = 0
+
+ // A flag to see when we're in the middle of a write.
+ this.writing = false
+
+ // When true all writes will be buffered until .uncork() call.
+ this.corked = 0
+
+ // A flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+ this.sync = true
+
+ // A flag to know if we're processing previously buffered items, which
+ // may call the _write() callback in the same tick, so that we don't
+ // end up in an overlapped onwrite situation.
+ this.bufferProcessing = false
+
+ // The callback that's passed to _write(chunk, cb).
+ this.onwrite = onwrite.bind(undefined, stream)
+
+ // The callback that the user supplies to write(chunk, encoding, cb).
+ this.writecb = null
+
+ // The amount that is being written when _write is called.
+ this.writelen = 0
+
+ // Storage for data passed to the afterWrite() callback in case of
+ // synchronous _write() completion.
+ this.afterWriteTickInfo = null
+ resetBuffer(this)
+
+ // Number of pending user-supplied write callbacks
+ // this must be 0 before 'finish' can be emitted.
+ this.pendingcb = 0
+
+ // Stream is still being constructed and cannot be
+ // destroyed until construction finished or failed.
+ // Async construction is opt in, therefore we start as
+ // constructed.
+ this.constructed = true
+
+ // Emit prefinish if the only thing we're waiting for is _write cbs
+ // This is relevant for synchronous Transform streams.
+ this.prefinished = false
+
+ // True if the error was already emitted and should not be thrown again.
+ this.errorEmitted = false
+
+ // Should close be emitted on destroy. Defaults to true.
+ this.emitClose = !options || options.emitClose !== false
+
+ // Should .destroy() be called after 'finish' (and potentially 'end').
+ this.autoDestroy = !options || options.autoDestroy !== false
+
+ // Indicates whether the stream has errored. When true all write() calls
+ // should return false. This is needed since when autoDestroy
+ // is disabled we need a way to tell whether the stream has failed.
+ this.errored = null
+
+ // Indicates whether the stream has finished destroying.
+ this.closed = false
+
+ // True if close has been emitted or would have been emitted
+ // depending on emitClose.
+ this.closeEmitted = false
+ this[kOnFinished] = []
+}
+function resetBuffer(state) {
+ state.buffered = []
+ state.bufferedIndex = 0
+ state.allBuffers = true
+ state.allNoop = true
+}
+WritableState.prototype.getBuffer = function getBuffer() {
+ return ArrayPrototypeSlice(this.buffered, this.bufferedIndex)
+}
+ObjectDefineProperty(WritableState.prototype, 'bufferedRequestCount', {
+ __proto__: null,
+ get() {
+ return this.buffered.length - this.bufferedIndex
+ }
+})
+function Writable(options) {
+ // Writable ctor is applied to Duplexes, too.
+ // `realHasInstance` is necessary because using plain `instanceof`
+ // would return false, as no `_writableState` property is attached.
+
+ // Trying to use the custom `instanceof` for Writable here will also break the
+ // Node.js LazyTransform implementation, which has a non-trivial getter for
+ // `_writableState` that would lead to infinite recursion.
+
+ // Checking for a Stream.Duplex instance is faster here instead of inside
+ // the WritableState constructor, at least with V8 6.5.
+ const isDuplex = this instanceof require('./duplex')
+ if (!isDuplex && !FunctionPrototypeSymbolHasInstance(Writable, this)) return new Writable(options)
+ this._writableState = new WritableState(options, this, isDuplex)
+ if (options) {
+ if (typeof options.write === 'function') this._write = options.write
+ if (typeof options.writev === 'function') this._writev = options.writev
+ if (typeof options.destroy === 'function') this._destroy = options.destroy
+ if (typeof options.final === 'function') this._final = options.final
+ if (typeof options.construct === 'function') this._construct = options.construct
+ if (options.signal) addAbortSignal(options.signal, this)
+ }
+ Stream.call(this, options)
+ destroyImpl.construct(this, () => {
+ const state = this._writableState
+ if (!state.writing) {
+ clearBuffer(this, state)
+ }
+ finishMaybe(this, state)
+ })
+}
+ObjectDefineProperty(Writable, SymbolHasInstance, {
+ __proto__: null,
+ value: function (object) {
+ if (FunctionPrototypeSymbolHasInstance(this, object)) return true
+ if (this !== Writable) return false
+ return object && object._writableState instanceof WritableState
+ }
+})
+
+// Otherwise people can pipe Writable streams, which is just wrong.
+Writable.prototype.pipe = function () {
+ errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE())
+}
+function _write(stream, chunk, encoding, cb) {
+ const state = stream._writableState
+ if (typeof encoding === 'function') {
+ cb = encoding
+ encoding = state.defaultEncoding
+ } else {
+ if (!encoding) encoding = state.defaultEncoding
+ else if (encoding !== 'buffer' && !Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding)
+ if (typeof cb !== 'function') cb = nop
+ }
+ if (chunk === null) {
+ throw new ERR_STREAM_NULL_VALUES()
+ } else if (!state.objectMode) {
+ if (typeof chunk === 'string') {
+ if (state.decodeStrings !== false) {
+ chunk = Buffer.from(chunk, encoding)
+ encoding = 'buffer'
+ }
+ } else if (chunk instanceof Buffer) {
+ encoding = 'buffer'
+ } else if (Stream._isUint8Array(chunk)) {
+ chunk = Stream._uint8ArrayToBuffer(chunk)
+ encoding = 'buffer'
+ } else {
+ throw new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk)
+ }
+ }
+ let err
+ if (state.ending) {
+ err = new ERR_STREAM_WRITE_AFTER_END()
+ } else if (state.destroyed) {
+ err = new ERR_STREAM_DESTROYED('write')
+ }
+ if (err) {
+ process.nextTick(cb, err)
+ errorOrDestroy(stream, err, true)
+ return err
+ }
+ state.pendingcb++
+ return writeOrBuffer(stream, state, chunk, encoding, cb)
+}
+Writable.prototype.write = function (chunk, encoding, cb) {
+ return _write(this, chunk, encoding, cb) === true
+}
+Writable.prototype.cork = function () {
+ this._writableState.corked++
+}
+Writable.prototype.uncork = function () {
+ const state = this._writableState
+ if (state.corked) {
+ state.corked--
+ if (!state.writing) clearBuffer(this, state)
+ }
+}
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+ // node::ParseEncoding() requires lower case.
+ if (typeof encoding === 'string') encoding = StringPrototypeToLowerCase(encoding)
+ if (!Buffer.isEncoding(encoding)) throw new ERR_UNKNOWN_ENCODING(encoding)
+ this._writableState.defaultEncoding = encoding
+ return this
+}
+
+// If we're already writing something, then just put this
+// in the queue, and wait our turn. Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+function writeOrBuffer(stream, state, chunk, encoding, callback) {
+ const len = state.objectMode ? 1 : chunk.length
+ state.length += len
+
+ // stream._write resets state.length
+ const ret = state.length < state.highWaterMark
+ // We must ensure that previous needDrain will not be reset to false.
+ if (!ret) state.needDrain = true
+ if (state.writing || state.corked || state.errored || !state.constructed) {
+ state.buffered.push({
+ chunk,
+ encoding,
+ callback
+ })
+ if (state.allBuffers && encoding !== 'buffer') {
+ state.allBuffers = false
+ }
+ if (state.allNoop && callback !== nop) {
+ state.allNoop = false
+ }
+ } else {
+ state.writelen = len
+ state.writecb = callback
+ state.writing = true
+ state.sync = true
+ stream._write(chunk, encoding, state.onwrite)
+ state.sync = false
+ }
+
+ // Return false if errored or destroyed in order to break
+ // any synchronous while(stream.write(data)) loops.
+ return ret && !state.errored && !state.destroyed
+}
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+ state.writelen = len
+ state.writecb = cb
+ state.writing = true
+ state.sync = true
+ if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'))
+ else if (writev) stream._writev(chunk, state.onwrite)
+ else stream._write(chunk, encoding, state.onwrite)
+ state.sync = false
+}
+function onwriteError(stream, state, er, cb) {
+ --state.pendingcb
+ cb(er)
+ // Ensure callbacks are invoked even when autoDestroy is
+ // not enabled. Passing `er` here doesn't make sense since
+ // it's related to one specific write, not to the buffered
+ // writes.
+ errorBuffer(state)
+ // This can emit error, but error must always follow cb.
+ errorOrDestroy(stream, er)
+}
+function onwrite(stream, er) {
+ const state = stream._writableState
+ const sync = state.sync
+ const cb = state.writecb
+ if (typeof cb !== 'function') {
+ errorOrDestroy(stream, new ERR_MULTIPLE_CALLBACK())
+ return
+ }
+ state.writing = false
+ state.writecb = null
+ state.length -= state.writelen
+ state.writelen = 0
+ if (er) {
+ // Avoid V8 leak, https://github.com/nodejs/node/pull/34103#issuecomment-652002364
+ er.stack // eslint-disable-line no-unused-expressions
+
+ if (!state.errored) {
+ state.errored = er
+ }
+
+ // In case of duplex streams we need to notify the readable side of the
+ // error.
+ if (stream._readableState && !stream._readableState.errored) {
+ stream._readableState.errored = er
+ }
+ if (sync) {
+ process.nextTick(onwriteError, stream, state, er, cb)
+ } else {
+ onwriteError(stream, state, er, cb)
+ }
+ } else {
+ if (state.buffered.length > state.bufferedIndex) {
+ clearBuffer(stream, state)
+ }
+ if (sync) {
+ // It is a common case that the callback passed to .write() is always
+ // the same. In that case, we do not schedule a new nextTick(), but
+ // rather just increase a counter, to improve performance and avoid
+ // memory allocations.
+ if (state.afterWriteTickInfo !== null && state.afterWriteTickInfo.cb === cb) {
+ state.afterWriteTickInfo.count++
+ } else {
+ state.afterWriteTickInfo = {
+ count: 1,
+ cb,
+ stream,
+ state
+ }
+ process.nextTick(afterWriteTick, state.afterWriteTickInfo)
+ }
+ } else {
+ afterWrite(stream, state, 1, cb)
+ }
+ }
+}
+function afterWriteTick({ stream, state, count, cb }) {
+ state.afterWriteTickInfo = null
+ return afterWrite(stream, state, count, cb)
+}
+function afterWrite(stream, state, count, cb) {
+ const needDrain = !state.ending && !stream.destroyed && state.length === 0 && state.needDrain
+ if (needDrain) {
+ state.needDrain = false
+ stream.emit('drain')
+ }
+ while (count-- > 0) {
+ state.pendingcb--
+ cb()
+ }
+ if (state.destroyed) {
+ errorBuffer(state)
+ }
+ finishMaybe(stream, state)
+}
+
+// If there's something in the buffer waiting, then invoke callbacks.
+function errorBuffer(state) {
+ if (state.writing) {
+ return
+ }
+ for (let n = state.bufferedIndex; n < state.buffered.length; ++n) {
+ var _state$errored
+ const { chunk, callback } = state.buffered[n]
+ const len = state.objectMode ? 1 : chunk.length
+ state.length -= len
+ callback(
+ (_state$errored = state.errored) !== null && _state$errored !== undefined
+ ? _state$errored
+ : new ERR_STREAM_DESTROYED('write')
+ )
+ }
+ const onfinishCallbacks = state[kOnFinished].splice(0)
+ for (let i = 0; i < onfinishCallbacks.length; i++) {
+ var _state$errored2
+ onfinishCallbacks[i](
+ (_state$errored2 = state.errored) !== null && _state$errored2 !== undefined
+ ? _state$errored2
+ : new ERR_STREAM_DESTROYED('end')
+ )
+ }
+ resetBuffer(state)
+}
+
+// If there's something in the buffer waiting, then process it.
+function clearBuffer(stream, state) {
+ if (state.corked || state.bufferProcessing || state.destroyed || !state.constructed) {
+ return
+ }
+ const { buffered, bufferedIndex, objectMode } = state
+ const bufferedLength = buffered.length - bufferedIndex
+ if (!bufferedLength) {
+ return
+ }
+ let i = bufferedIndex
+ state.bufferProcessing = true
+ if (bufferedLength > 1 && stream._writev) {
+ state.pendingcb -= bufferedLength - 1
+ const callback = state.allNoop
+ ? nop
+ : (err) => {
+ for (let n = i; n < buffered.length; ++n) {
+ buffered[n].callback(err)
+ }
+ }
+ // Make a copy of `buffered` if it's going to be used by `callback` above,
+ // since `doWrite` will mutate the array.
+ const chunks = state.allNoop && i === 0 ? buffered : ArrayPrototypeSlice(buffered, i)
+ chunks.allBuffers = state.allBuffers
+ doWrite(stream, state, true, state.length, chunks, '', callback)
+ resetBuffer(state)
+ } else {
+ do {
+ const { chunk, encoding, callback } = buffered[i]
+ buffered[i++] = null
+ const len = objectMode ? 1 : chunk.length
+ doWrite(stream, state, false, len, chunk, encoding, callback)
+ } while (i < buffered.length && !state.writing)
+ if (i === buffered.length) {
+ resetBuffer(state)
+ } else if (i > 256) {
+ buffered.splice(0, i)
+ state.bufferedIndex = 0
+ } else {
+ state.bufferedIndex = i
+ }
+ }
+ state.bufferProcessing = false
+}
+Writable.prototype._write = function (chunk, encoding, cb) {
+ if (this._writev) {
+ this._writev(
+ [
+ {
+ chunk,
+ encoding
+ }
+ ],
+ cb
+ )
+ } else {
+ throw new ERR_METHOD_NOT_IMPLEMENTED('_write()')
+ }
+}
+Writable.prototype._writev = null
+Writable.prototype.end = function (chunk, encoding, cb) {
+ const state = this._writableState
+ if (typeof chunk === 'function') {
+ cb = chunk
+ chunk = null
+ encoding = null
+ } else if (typeof encoding === 'function') {
+ cb = encoding
+ encoding = null
+ }
+ let err
+ if (chunk !== null && chunk !== undefined) {
+ const ret = _write(this, chunk, encoding)
+ if (ret instanceof Error) {
+ err = ret
+ }
+ }
-}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"_process":101}],87:[function(require,module,exports){
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.JsonRpcEngine = void 0;
-const safe_event_emitter_1 = __importDefault(require("@metamask/safe-event-emitter"));
-const eth_rpc_errors_1 = require("eth-rpc-errors");
-/**
- * A JSON-RPC request and response processor.
- * Give it a stack of middleware, pass it requests, and get back responses.
- */
-class JsonRpcEngine extends safe_event_emitter_1.default {
- constructor() {
- super();
- this._middleware = [];
+ // .end() fully uncorks.
+ if (state.corked) {
+ state.corked = 1
+ this.uncork()
+ }
+ if (err) {
+ // Do nothing...
+ } else if (!state.errored && !state.ending) {
+ // This is forgiving in terms of unnecessary calls to end() and can hide
+ // logic errors. However, usually such errors are harmless and causing a
+ // hard error can be disproportionately destructive. It is not always
+ // trivial for the user to determine whether end() needs to be called
+ // or not.
+
+ state.ending = true
+ finishMaybe(this, state, true)
+ state.ended = true
+ } else if (state.finished) {
+ err = new ERR_STREAM_ALREADY_FINISHED('end')
+ } else if (state.destroyed) {
+ err = new ERR_STREAM_DESTROYED('end')
+ }
+ if (typeof cb === 'function') {
+ if (err || state.finished) {
+ process.nextTick(cb, err)
+ } else {
+ state[kOnFinished].push(cb)
}
- /**
- * Add a middleware function to the engine's middleware stack.
- *
- * @param middleware - The middleware function to add.
- */
- push(middleware) {
- this._middleware.push(middleware);
+ }
+ return this
+}
+function needFinish(state) {
+ return (
+ state.ending &&
+ !state.destroyed &&
+ state.constructed &&
+ state.length === 0 &&
+ !state.errored &&
+ state.buffered.length === 0 &&
+ !state.finished &&
+ !state.writing &&
+ !state.errorEmitted &&
+ !state.closeEmitted
+ )
+}
+function callFinal(stream, state) {
+ let called = false
+ function onFinish(err) {
+ if (called) {
+ errorOrDestroy(stream, err !== null && err !== undefined ? err : ERR_MULTIPLE_CALLBACK())
+ return
}
- handle(req, cb) {
- if (cb && typeof cb !== 'function') {
- throw new Error('"callback" must be a function if provided.');
- }
- if (Array.isArray(req)) {
- if (cb) {
- return this._handleBatch(req, cb);
- }
- return this._handleBatch(req);
- }
- if (cb) {
- return this._handle(req, cb);
- }
- return this._promiseHandle(req);
+ called = true
+ state.pendingcb--
+ if (err) {
+ const onfinishCallbacks = state[kOnFinished].splice(0)
+ for (let i = 0; i < onfinishCallbacks.length; i++) {
+ onfinishCallbacks[i](err)
+ }
+ errorOrDestroy(stream, err, state.sync)
+ } else if (needFinish(state)) {
+ state.prefinished = true
+ stream.emit('prefinish')
+ // Backwards compat. Don't check state.sync here.
+ // Some streams assume 'finish' will be emitted
+ // asynchronously relative to _final callback.
+ state.pendingcb++
+ process.nextTick(finish, stream, state)
}
- /**
- * Returns this engine as a middleware function that can be pushed to other
- * engines.
- *
- * @returns This engine as a middleware function.
- */
- asMiddleware() {
- return async (req, res, next, end) => {
- try {
- const [middlewareError, isComplete, returnHandlers,] = await JsonRpcEngine._runAllMiddleware(req, res, this._middleware);
- if (isComplete) {
- await JsonRpcEngine._runReturnHandlers(returnHandlers);
- return end(middlewareError);
- }
- return next(async (handlerCallback) => {
- try {
- await JsonRpcEngine._runReturnHandlers(returnHandlers);
- }
- catch (error) {
- return handlerCallback(error);
- }
- return handlerCallback();
- });
- }
- catch (error) {
- return end(error);
- }
- };
+ }
+ state.sync = true
+ state.pendingcb++
+ try {
+ stream._final(onFinish)
+ } catch (err) {
+ onFinish(err)
+ }
+ state.sync = false
+}
+function prefinish(stream, state) {
+ if (!state.prefinished && !state.finalCalled) {
+ if (typeof stream._final === 'function' && !state.destroyed) {
+ state.finalCalled = true
+ callFinal(stream, state)
+ } else {
+ state.prefinished = true
+ stream.emit('prefinish')
}
- async _handleBatch(reqs, cb) {
- // The order here is important
- try {
- // 2. Wait for all requests to finish, or throw on some kind of fatal
- // error
- const responses = await Promise.all(
- // 1. Begin executing each request in the order received
- reqs.map(this._promiseHandle.bind(this)));
- // 3. Return batch response
- if (cb) {
- return cb(null, responses);
- }
- return responses;
- }
- catch (error) {
- if (cb) {
- return cb(error);
+ }
+}
+function finishMaybe(stream, state, sync) {
+ if (needFinish(state)) {
+ prefinish(stream, state)
+ if (state.pendingcb === 0) {
+ if (sync) {
+ state.pendingcb++
+ process.nextTick(
+ (stream, state) => {
+ if (needFinish(state)) {
+ finish(stream, state)
+ } else {
+ state.pendingcb--
}
- throw error;
- }
+ },
+ stream,
+ state
+ )
+ } else if (needFinish(state)) {
+ state.pendingcb++
+ finish(stream, state)
+ }
+ }
+ }
+}
+function finish(stream, state) {
+ state.pendingcb--
+ state.finished = true
+ const onfinishCallbacks = state[kOnFinished].splice(0)
+ for (let i = 0; i < onfinishCallbacks.length; i++) {
+ onfinishCallbacks[i]()
+ }
+ stream.emit('finish')
+ if (state.autoDestroy) {
+ // In case of duplex streams we need a way to detect
+ // if the readable side is ready for autoDestroy as well.
+ const rState = stream._readableState
+ const autoDestroy =
+ !rState ||
+ (rState.autoDestroy &&
+ // We don't expect the readable to ever 'end'
+ // if readable is explicitly set to false.
+ (rState.endEmitted || rState.readable === false))
+ if (autoDestroy) {
+ stream.destroy()
+ }
+ }
+}
+ObjectDefineProperties(Writable.prototype, {
+ closed: {
+ __proto__: null,
+ get() {
+ return this._writableState ? this._writableState.closed : false
+ }
+ },
+ destroyed: {
+ __proto__: null,
+ get() {
+ return this._writableState ? this._writableState.destroyed : false
+ },
+ set(value) {
+ // Backward compatibility, the user is explicitly managing destroyed.
+ if (this._writableState) {
+ this._writableState.destroyed = value
+ }
+ }
+ },
+ writable: {
+ __proto__: null,
+ get() {
+ const w = this._writableState
+ // w.writable === false means that this is part of a Duplex stream
+ // where the writable side was disabled upon construction.
+ // Compat. The user might manually disable writable side through
+ // deprecated setter.
+ return !!w && w.writable !== false && !w.destroyed && !w.errored && !w.ending && !w.ended
+ },
+ set(val) {
+ // Backwards compatible.
+ if (this._writableState) {
+ this._writableState.writable = !!val
+ }
+ }
+ },
+ writableFinished: {
+ __proto__: null,
+ get() {
+ return this._writableState ? this._writableState.finished : false
+ }
+ },
+ writableObjectMode: {
+ __proto__: null,
+ get() {
+ return this._writableState ? this._writableState.objectMode : false
+ }
+ },
+ writableBuffer: {
+ __proto__: null,
+ get() {
+ return this._writableState && this._writableState.getBuffer()
}
- /**
- * A promise-wrapped _handle.
- */
- _promiseHandle(req) {
- return new Promise((resolve) => {
- this._handle(req, (_err, res) => {
- // There will always be a response, and it will always have any error
- // that is caught and propagated.
- resolve(res);
- });
- });
+ },
+ writableEnded: {
+ __proto__: null,
+ get() {
+ return this._writableState ? this._writableState.ending : false
}
- /**
- * Ensures that the request object is valid, processes it, and passes any
- * error and the response object to the given callback.
- *
- * Does not reject.
- */
- async _handle(callerReq, cb) {
- if (!callerReq ||
- Array.isArray(callerReq) ||
- typeof callerReq !== 'object') {
- const error = new eth_rpc_errors_1.EthereumRpcError(eth_rpc_errors_1.errorCodes.rpc.invalidRequest, `Requests must be plain objects. Received: ${typeof callerReq}`, { request: callerReq });
- return cb(error, { id: undefined, jsonrpc: '2.0', error });
- }
- if (typeof callerReq.method !== 'string') {
- const error = new eth_rpc_errors_1.EthereumRpcError(eth_rpc_errors_1.errorCodes.rpc.invalidRequest, `Must specify a string method. Received: ${typeof callerReq.method}`, { request: callerReq });
- return cb(error, { id: callerReq.id, jsonrpc: '2.0', error });
- }
- const req = Object.assign({}, callerReq);
- const res = {
- id: req.id,
- jsonrpc: req.jsonrpc,
- };
- let error = null;
- try {
- await this._processRequest(req, res);
- }
- catch (_error) {
- // A request handler error, a re-thrown middleware error, or something
- // unexpected.
- error = _error;
- }
- if (error) {
- // Ensure no result is present on an errored response
- delete res.result;
- if (!res.error) {
- res.error = eth_rpc_errors_1.serializeError(error);
- }
- }
- return cb(error, res);
+ },
+ writableNeedDrain: {
+ __proto__: null,
+ get() {
+ const wState = this._writableState
+ if (!wState) return false
+ return !wState.destroyed && !wState.ending && wState.needDrain
}
- /**
- * For the given request and response, runs all middleware and their return
- * handlers, if any, and ensures that internal request processing semantics
- * are satisfied.
- */
- async _processRequest(req, res) {
- const [error, isComplete, returnHandlers,] = await JsonRpcEngine._runAllMiddleware(req, res, this._middleware);
- // Throw if "end" was not called, or if the response has neither a result
- // nor an error.
- JsonRpcEngine._checkForCompletion(req, res, isComplete);
- // The return handlers should run even if an error was encountered during
- // middleware processing.
- await JsonRpcEngine._runReturnHandlers(returnHandlers);
- // Now we re-throw the middleware processing error, if any, to catch it
- // further up the call chain.
- if (error) {
- throw error;
- }
+ },
+ writableHighWaterMark: {
+ __proto__: null,
+ get() {
+ return this._writableState && this._writableState.highWaterMark
}
- /**
- * Serially executes the given stack of middleware.
- *
- * @returns An array of any error encountered during middleware execution,
- * a boolean indicating whether the request was completed, and an array of
- * middleware-defined return handlers.
- */
- static async _runAllMiddleware(req, res, middlewareStack) {
- const returnHandlers = [];
- let error = null;
- let isComplete = false;
- // Go down stack of middleware, call and collect optional returnHandlers
- for (const middleware of middlewareStack) {
- [error, isComplete] = await JsonRpcEngine._runMiddleware(req, res, middleware, returnHandlers);
- if (isComplete) {
- break;
- }
- }
- return [error, isComplete, returnHandlers.reverse()];
+ },
+ writableCorked: {
+ __proto__: null,
+ get() {
+ return this._writableState ? this._writableState.corked : 0
}
- /**
- * Runs an individual middleware.
- *
- * @returns An array of any error encountered during middleware exection,
- * and a boolean indicating whether the request should end.
- */
- static _runMiddleware(req, res, middleware, returnHandlers) {
- return new Promise((resolve) => {
- const end = (err) => {
- const error = err || res.error;
- if (error) {
- res.error = eth_rpc_errors_1.serializeError(error);
- }
- // True indicates that the request should end
- resolve([error, true]);
- };
- const next = (returnHandler) => {
- if (res.error) {
- end(res.error);
- }
- else {
- if (returnHandler) {
- if (typeof returnHandler !== 'function') {
- end(new eth_rpc_errors_1.EthereumRpcError(eth_rpc_errors_1.errorCodes.rpc.internal, `JsonRpcEngine: "next" return handlers must be functions. ` +
- `Received "${typeof returnHandler}" for request:\n${jsonify(req)}`, { request: req }));
- }
- returnHandlers.push(returnHandler);
- }
- // False indicates that the request should not end
- resolve([null, false]);
- }
- };
- try {
- middleware(req, res, next, end);
- }
- catch (error) {
- end(error);
- }
- });
+ },
+ writableLength: {
+ __proto__: null,
+ get() {
+ return this._writableState && this._writableState.length
}
- /**
- * Serially executes array of return handlers. The request and response are
- * assumed to be in their scope.
- */
- static async _runReturnHandlers(handlers) {
- for (const handler of handlers) {
- await new Promise((resolve, reject) => {
- handler((err) => (err ? reject(err) : resolve()));
- });
- }
+ },
+ errored: {
+ __proto__: null,
+ enumerable: false,
+ get() {
+ return this._writableState ? this._writableState.errored : null
}
- /**
- * Throws an error if the response has neither a result nor an error, or if
- * the "isComplete" flag is falsy.
- */
- static _checkForCompletion(req, res, isComplete) {
- if (!('result' in res) && !('error' in res)) {
- throw new eth_rpc_errors_1.EthereumRpcError(eth_rpc_errors_1.errorCodes.rpc.internal, `JsonRpcEngine: Response has no error or result for request:\n${jsonify(req)}`, { request: req });
- }
- if (!isComplete) {
- throw new eth_rpc_errors_1.EthereumRpcError(eth_rpc_errors_1.errorCodes.rpc.internal, `JsonRpcEngine: Nothing ended request:\n${jsonify(req)}`, { request: req });
- }
+ },
+ writableAborted: {
+ __proto__: null,
+ enumerable: false,
+ get: function () {
+ return !!(
+ this._writableState.writable !== false &&
+ (this._writableState.destroyed || this._writableState.errored) &&
+ !this._writableState.finished
+ )
}
+ }
+})
+const destroy = destroyImpl.destroy
+Writable.prototype.destroy = function (err, cb) {
+ const state = this._writableState
+
+ // Invoke pending callbacks.
+ if (!state.destroyed && (state.bufferedIndex < state.buffered.length || state[kOnFinished].length)) {
+ process.nextTick(errorBuffer, state)
+ }
+ destroy.call(this, err, cb)
+ return this
}
-exports.JsonRpcEngine = JsonRpcEngine;
-function jsonify(request) {
- return JSON.stringify(request, null, 2);
+Writable.prototype._undestroy = destroyImpl.undestroy
+Writable.prototype._destroy = function (err, cb) {
+ cb(err)
}
-
-},{"@metamask/safe-event-emitter":33,"eth-rpc-errors":45}],88:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.createAsyncMiddleware = void 0;
-/**
- * JsonRpcEngine only accepts callback-based middleware directly.
- * createAsyncMiddleware exists to enable consumers to pass in async middleware
- * functions.
- *
- * Async middleware have no "end" function. Instead, they "end" if they return
- * without calling "next". Rather than passing in explicit return handlers,
- * async middleware can simply await "next", and perform operations on the
- * response object when execution resumes.
- *
- * To accomplish this, createAsyncMiddleware passes the async middleware a
- * wrapped "next" function. That function calls the internal JsonRpcEngine
- * "next" function with a return handler that resolves a promise when called.
- *
- * The return handler will always be called. Its resolution of the promise
- * enables the control flow described above.
- */
-function createAsyncMiddleware(asyncMiddleware) {
- return async (req, res, next, end) => {
- // nextPromise is the key to the implementation
- // it is resolved by the return handler passed to the
- // "next" function
- let resolveNextPromise;
- const nextPromise = new Promise((resolve) => {
- resolveNextPromise = resolve;
- });
- let returnHandlerCallback = null;
- let nextWasCalled = false;
- // This will be called by the consumer's async middleware.
- const asyncNext = async () => {
- nextWasCalled = true;
- // We pass a return handler to next(). When it is called by the engine,
- // the consumer's async middleware will resume executing.
- // eslint-disable-next-line node/callback-return
- next((runReturnHandlersCallback) => {
- // This callback comes from JsonRpcEngine._runReturnHandlers
- returnHandlerCallback = runReturnHandlersCallback;
- resolveNextPromise();
- });
- await nextPromise;
- };
- try {
- await asyncMiddleware(req, res, asyncNext);
- if (nextWasCalled) {
- await nextPromise; // we must wait until the return handler is called
- returnHandlerCallback(null);
- }
- else {
- end(null);
- }
- }
- catch (error) {
- if (returnHandlerCallback) {
- returnHandlerCallback(error);
- }
- else {
- end(error);
- }
- }
- };
+Writable.prototype[EE.captureRejectionSymbol] = function (err) {
+ this.destroy(err)
}
-exports.createAsyncMiddleware = createAsyncMiddleware;
+let webStreamsAdapters
-},{}],89:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.createScaffoldMiddleware = void 0;
-function createScaffoldMiddleware(handlers) {
- return (req, res, next, end) => {
- const handler = handlers[req.method];
- // if no handler, return
- if (handler === undefined) {
- return next();
- }
- // if handler is fn, call as middleware
- if (typeof handler === 'function') {
- return handler(req, res, next, end);
- }
- // if handler is some other value, use as result
- res.result = handler;
- return end();
- };
+// Lazy to avoid circular references
+function lazyWebStreams() {
+ if (webStreamsAdapters === undefined) webStreamsAdapters = {}
+ return webStreamsAdapters
}
-exports.createScaffoldMiddleware = createScaffoldMiddleware;
-
-},{}],90:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getUniqueId = void 0;
-// uint32 (two's complement) max
-// more conservative than Number.MAX_SAFE_INTEGER
-const MAX = 4294967295;
-let idCounter = Math.floor(Math.random() * MAX);
-function getUniqueId() {
- idCounter = (idCounter + 1) % MAX;
- return idCounter;
+Writable.fromWeb = function (writableStream, options) {
+ return lazyWebStreams().newStreamWritableFromWritableStream(writableStream, options)
}
-exports.getUniqueId = getUniqueId;
-
-},{}],91:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.createIdRemapMiddleware = void 0;
-const getUniqueId_1 = require("./getUniqueId");
-function createIdRemapMiddleware() {
- return (req, res, next, _end) => {
- const originalId = req.id;
- const newId = getUniqueId_1.getUniqueId();
- req.id = newId;
- res.id = newId;
- next((done) => {
- req.id = originalId;
- res.id = originalId;
- done();
- });
- };
+Writable.toWeb = function (streamWritable) {
+ return lazyWebStreams().newWritableStreamFromStreamWritable(streamWritable)
}
-exports.createIdRemapMiddleware = createIdRemapMiddleware;
-},{"./getUniqueId":90}],92:[function(require,module,exports){
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-__exportStar(require("./idRemapMiddleware"), exports);
-__exportStar(require("./createAsyncMiddleware"), exports);
-__exportStar(require("./createScaffoldMiddleware"), exports);
-__exportStar(require("./getUniqueId"), exports);
-__exportStar(require("./JsonRpcEngine"), exports);
-__exportStar(require("./mergeMiddleware"), exports);
-
-},{"./JsonRpcEngine":87,"./createAsyncMiddleware":88,"./createScaffoldMiddleware":89,"./getUniqueId":90,"./idRemapMiddleware":91,"./mergeMiddleware":93}],93:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.mergeMiddleware = void 0;
-const JsonRpcEngine_1 = require("./JsonRpcEngine");
-function mergeMiddleware(middlewareStack) {
- const engine = new JsonRpcEngine_1.JsonRpcEngine();
- middlewareStack.forEach((middleware) => engine.push(middleware));
- return engine.asMiddleware();
+},{"../../ours/errors":149,"../../ours/primordials":150,"./add-abort-signal":130,"./destroy":133,"./duplex":134,"./legacy":138,"./state":143,"buffer":120,"events":128,"process/":168}],147:[function(require,module,exports){
+/* eslint jsdoc/require-jsdoc: "error" */
+
+'use strict'
+
+const {
+ ArrayIsArray,
+ ArrayPrototypeIncludes,
+ ArrayPrototypeJoin,
+ ArrayPrototypeMap,
+ NumberIsInteger,
+ NumberIsNaN,
+ NumberMAX_SAFE_INTEGER,
+ NumberMIN_SAFE_INTEGER,
+ NumberParseInt,
+ ObjectPrototypeHasOwnProperty,
+ RegExpPrototypeExec,
+ String,
+ StringPrototypeToUpperCase,
+ StringPrototypeTrim
+} = require('../ours/primordials')
+const {
+ hideStackFrames,
+ codes: { ERR_SOCKET_BAD_PORT, ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_VALUE, ERR_OUT_OF_RANGE, ERR_UNKNOWN_SIGNAL }
+} = require('../ours/errors')
+const { normalizeEncoding } = require('../ours/util')
+const { isAsyncFunction, isArrayBufferView } = require('../ours/util').types
+const signals = {}
+
+/**
+ * @param {*} value
+ * @returns {boolean}
+ */
+function isInt32(value) {
+ return value === (value | 0)
}
-exports.mergeMiddleware = mergeMiddleware;
-},{"./JsonRpcEngine":87}],94:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const readable_stream_1 = require("readable-stream");
/**
- * Takes a JsonRpcEngine and returns a Duplex stream wrapping it.
- *
- * @param opts - Options bag.
- * @param opts.engine - The JsonRpcEngine to wrap in a stream.
- * @returns The stream wrapping the engine.
+ * @param {*} value
+ * @returns {boolean}
*/
-function createEngineStream(opts) {
- if (!opts || !opts.engine) {
- throw new Error('Missing engine parameter!');
- }
- const { engine } = opts;
- const stream = new readable_stream_1.Duplex({ objectMode: true, read, write });
- // forward notifications
- if (engine.on) {
- engine.on('notification', (message) => {
- stream.push(message);
- });
- }
- return stream;
- function read() {
- return undefined;
- }
- function write(req, _encoding, cb) {
- engine.handle(req, (_err, res) => {
- stream.push(res);
- });
- cb();
- }
+function isUint32(value) {
+ return value === value >>> 0
}
-exports.default = createEngineStream;
+const octalReg = /^[0-7]+$/
+const modeDesc = 'must be a 32-bit unsigned integer or an octal string'
-},{"readable-stream":112}],95:[function(require,module,exports){
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const safe_event_emitter_1 = __importDefault(require("@metamask/safe-event-emitter"));
-const readable_stream_1 = require("readable-stream");
/**
- * Creates a JsonRpcEngine middleware with an associated Duplex stream and
- * EventEmitter. The middleware, and by extension stream, assume that middleware
- * parameters are properly formatted. No runtime type checking or validation is
- * performed.
- *
- * @returns The event emitter, middleware, and stream.
+ * Parse and validate values that will be converted into mode_t (the S_*
+ * constants). Only valid numbers and octal strings are allowed. They could be
+ * converted to 32-bit unsigned integers or non-negative signed integers in the
+ * C++ land, but any value higher than 0o777 will result in platform-specific
+ * behaviors.
+ * @param {*} value Values to be validated
+ * @param {string} name Name of the argument
+ * @param {number} [def] If specified, will be returned for invalid values
+ * @returns {number}
*/
-function createStreamMiddleware() {
- const idMap = {};
- const stream = new readable_stream_1.Duplex({
- objectMode: true,
- read: readNoop,
- write: processMessage,
- });
- const events = new safe_event_emitter_1.default();
- const middleware = (req, res, next, end) => {
- // write req to stream
- stream.push(req);
- // register request on id map
- idMap[req.id] = { req, res, next, end };
- };
- return { events, middleware, stream };
- function readNoop() {
- return false;
- }
- function processMessage(res, _encoding, cb) {
- let err;
- try {
- const isNotification = !res.id;
- if (isNotification) {
- processNotification(res);
- }
- else {
- processResponse(res);
- }
- }
- catch (_err) {
- err = _err;
- }
- // continue processing stream
- cb(err);
- }
- function processResponse(res) {
- const context = idMap[res.id];
- if (!context) {
- throw new Error(`StreamMiddleware - Unknown response id "${res.id}"`);
- }
- delete idMap[res.id];
- // copy whole res onto original res
- Object.assign(context.res, res);
- // run callback on empty stack,
- // prevent internal stream-handler from catching errors
- setTimeout(context.end);
- }
- function processNotification(res) {
- events.emit('notification', res);
+function parseFileMode(value, name, def) {
+ if (typeof value === 'undefined') {
+ value = def
+ }
+ if (typeof value === 'string') {
+ if (RegExpPrototypeExec(octalReg, value) === null) {
+ throw new ERR_INVALID_ARG_VALUE(name, value, modeDesc)
}
+ value = NumberParseInt(value, 8)
+ }
+ validateUint32(value, name)
+ return value
}
-exports.default = createStreamMiddleware;
-},{"@metamask/safe-event-emitter":33,"readable-stream":112}],96:[function(require,module,exports){
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.createStreamMiddleware = exports.createEngineStream = void 0;
-const createEngineStream_1 = __importDefault(require("./createEngineStream"));
-exports.createEngineStream = createEngineStream_1.default;
-const createStreamMiddleware_1 = __importDefault(require("./createStreamMiddleware"));
-exports.createStreamMiddleware = createStreamMiddleware_1.default;
+/**
+ * @callback validateInteger
+ * @param {*} value
+ * @param {string} name
+ * @param {number} [min]
+ * @param {number} [max]
+ * @returns {asserts value is number}
+ */
-},{"./createEngineStream":94,"./createStreamMiddleware":95}],97:[function(require,module,exports){
-arguments[4][49][0].apply(exports,arguments)
-},{"dup":49}],98:[function(require,module,exports){
-arguments[4][29][0].apply(exports,arguments)
-},{"bn.js":97,"dup":29,"strip-hex-prefix":116}],99:[function(require,module,exports){
-var wrappy = require('wrappy')
-module.exports = wrappy(once)
-module.exports.strict = wrappy(onceStrict)
+/** @type {validateInteger} */
+const validateInteger = hideStackFrames((value, name, min = NumberMIN_SAFE_INTEGER, max = NumberMAX_SAFE_INTEGER) => {
+ if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
+ if (!NumberIsInteger(value)) throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
+ if (value < min || value > max) throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
+})
-once.proto = once(function () {
- Object.defineProperty(Function.prototype, 'once', {
- value: function () {
- return once(this)
- },
- configurable: true
- })
+/**
+ * @callback validateInt32
+ * @param {*} value
+ * @param {string} name
+ * @param {number} [min]
+ * @param {number} [max]
+ * @returns {asserts value is number}
+ */
- Object.defineProperty(Function.prototype, 'onceStrict', {
- value: function () {
- return onceStrict(this)
- },
- configurable: true
- })
+/** @type {validateInt32} */
+const validateInt32 = hideStackFrames((value, name, min = -2147483648, max = 2147483647) => {
+ // The defaults for min and max correspond to the limits of 32-bit integers.
+ if (typeof value !== 'number') {
+ throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
+ }
+ if (!NumberIsInteger(value)) {
+ throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
+ }
+ if (value < min || value > max) {
+ throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
+ }
})
-function once (fn) {
- var f = function () {
- if (f.called) return f.value
- f.called = true
- return f.value = fn.apply(this, arguments)
- }
- f.called = false
- return f
-}
+/**
+ * @callback validateUint32
+ * @param {*} value
+ * @param {string} name
+ * @param {number|boolean} [positive=false]
+ * @returns {asserts value is number}
+ */
-function onceStrict (fn) {
- var f = function () {
- if (f.called)
- throw new Error(f.onceError)
- f.called = true
- return f.value = fn.apply(this, arguments)
+/** @type {validateUint32} */
+const validateUint32 = hideStackFrames((value, name, positive = false) => {
+ if (typeof value !== 'number') {
+ throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
}
- var name = fn.name || 'Function wrapped with `once`'
- f.onceError = name + " shouldn't be called more than once"
- f.called = false
- return f
-}
+ if (!NumberIsInteger(value)) {
+ throw new ERR_OUT_OF_RANGE(name, 'an integer', value)
+ }
+ const min = positive ? 1 : 0
+ // 2 ** 32 === 4294967296
+ const max = 4294967295
+ if (value < min || value > max) {
+ throw new ERR_OUT_OF_RANGE(name, `>= ${min} && <= ${max}`, value)
+ }
+})
-},{"wrappy":119}],100:[function(require,module,exports){
-(function (process){(function (){
-'use strict';
+/**
+ * @callback validateString
+ * @param {*} value
+ * @param {string} name
+ * @returns {asserts value is string}
+ */
-if (!process.version ||
- process.version.indexOf('v0.') === 0 ||
- process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
- module.exports = { nextTick: nextTick };
-} else {
- module.exports = process
+/** @type {validateString} */
+function validateString(value, name) {
+ if (typeof value !== 'string') throw new ERR_INVALID_ARG_TYPE(name, 'string', value)
}
-function nextTick(fn, arg1, arg2, arg3) {
- if (typeof fn !== 'function') {
- throw new TypeError('"callback" argument must be a function');
- }
- var len = arguments.length;
- var args, i;
- switch (len) {
- case 0:
- case 1:
- return process.nextTick(fn);
- case 2:
- return process.nextTick(function afterTickOne() {
- fn.call(null, arg1);
- });
- case 3:
- return process.nextTick(function afterTickTwo() {
- fn.call(null, arg1, arg2);
- });
- case 4:
- return process.nextTick(function afterTickThree() {
- fn.call(null, arg1, arg2, arg3);
- });
- default:
- args = new Array(len - 1);
- i = 0;
- while (i < args.length) {
- args[i++] = arguments[i];
- }
- return process.nextTick(function afterTick() {
- fn.apply(null, args);
- });
+/**
+ * @callback validateNumber
+ * @param {*} value
+ * @param {string} name
+ * @param {number} [min]
+ * @param {number} [max]
+ * @returns {asserts value is number}
+ */
+
+/** @type {validateNumber} */
+function validateNumber(value, name, min = undefined, max) {
+ if (typeof value !== 'number') throw new ERR_INVALID_ARG_TYPE(name, 'number', value)
+ if (
+ (min != null && value < min) ||
+ (max != null && value > max) ||
+ ((min != null || max != null) && NumberIsNaN(value))
+ ) {
+ throw new ERR_OUT_OF_RANGE(
+ name,
+ `${min != null ? `>= ${min}` : ''}${min != null && max != null ? ' && ' : ''}${max != null ? `<= ${max}` : ''}`,
+ value
+ )
}
}
+/**
+ * @callback validateOneOf
+ * @template T
+ * @param {T} value
+ * @param {string} name
+ * @param {T[]} oneOf
+ */
-}).call(this)}).call(this,require('_process'))
-},{"_process":101}],101:[function(require,module,exports){
-// shim for using process in browser
-var process = module.exports = {};
-
-// cached from whatever global is present so that test runners that stub it
-// don't break things. But we need to wrap it in a try catch in case it is
-// wrapped in strict mode code which doesn't define any globals. It's inside a
-// function because try/catches deoptimize in certain engines.
+/** @type {validateOneOf} */
+const validateOneOf = hideStackFrames((value, name, oneOf) => {
+ if (!ArrayPrototypeIncludes(oneOf, value)) {
+ const allowed = ArrayPrototypeJoin(
+ ArrayPrototypeMap(oneOf, (v) => (typeof v === 'string' ? `'${v}'` : String(v))),
+ ', '
+ )
+ const reason = 'must be one of: ' + allowed
+ throw new ERR_INVALID_ARG_VALUE(name, value, reason)
+ }
+})
-var cachedSetTimeout;
-var cachedClearTimeout;
+/**
+ * @callback validateBoolean
+ * @param {*} value
+ * @param {string} name
+ * @returns {asserts value is boolean}
+ */
-function defaultSetTimout() {
- throw new Error('setTimeout has not been defined');
+/** @type {validateBoolean} */
+function validateBoolean(value, name) {
+ if (typeof value !== 'boolean') throw new ERR_INVALID_ARG_TYPE(name, 'boolean', value)
}
-function defaultClearTimeout () {
- throw new Error('clearTimeout has not been defined');
+
+/**
+ * @param {any} options
+ * @param {string} key
+ * @param {boolean} defaultValue
+ * @returns {boolean}
+ */
+function getOwnPropertyValueOrDefault(options, key, defaultValue) {
+ return options == null || !ObjectPrototypeHasOwnProperty(options, key) ? defaultValue : options[key]
}
-(function () {
- try {
- if (typeof setTimeout === 'function') {
- cachedSetTimeout = setTimeout;
- } else {
- cachedSetTimeout = defaultSetTimout;
- }
- } catch (e) {
- cachedSetTimeout = defaultSetTimout;
- }
- try {
- if (typeof clearTimeout === 'function') {
- cachedClearTimeout = clearTimeout;
- } else {
- cachedClearTimeout = defaultClearTimeout;
- }
- } catch (e) {
- cachedClearTimeout = defaultClearTimeout;
- }
-} ())
-function runTimeout(fun) {
- if (cachedSetTimeout === setTimeout) {
- //normal enviroments in sane situations
- return setTimeout(fun, 0);
- }
- // if setTimeout wasn't available but was latter defined
- if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
- cachedSetTimeout = setTimeout;
- return setTimeout(fun, 0);
- }
- try {
- // when when somebody has screwed with setTimeout but no I.E. maddness
- return cachedSetTimeout(fun, 0);
- } catch(e){
- try {
- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
- return cachedSetTimeout.call(null, fun, 0);
- } catch(e){
- // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
- return cachedSetTimeout.call(this, fun, 0);
- }
- }
+/**
+ * @callback validateObject
+ * @param {*} value
+ * @param {string} name
+ * @param {{
+ * allowArray?: boolean,
+ * allowFunction?: boolean,
+ * nullable?: boolean
+ * }} [options]
+ */
+
+/** @type {validateObject} */
+const validateObject = hideStackFrames((value, name, options = null) => {
+ const allowArray = getOwnPropertyValueOrDefault(options, 'allowArray', false)
+ const allowFunction = getOwnPropertyValueOrDefault(options, 'allowFunction', false)
+ const nullable = getOwnPropertyValueOrDefault(options, 'nullable', false)
+ if (
+ (!nullable && value === null) ||
+ (!allowArray && ArrayIsArray(value)) ||
+ (typeof value !== 'object' && (!allowFunction || typeof value !== 'function'))
+ ) {
+ throw new ERR_INVALID_ARG_TYPE(name, 'Object', value)
+ }
+})
+
+/**
+ * @callback validateDictionary - We are using the Web IDL Standard definition
+ * of "dictionary" here, which means any value
+ * whose Type is either Undefined, Null, or
+ * Object (which includes functions).
+ * @param {*} value
+ * @param {string} name
+ * @see https://webidl.spec.whatwg.org/#es-dictionary
+ * @see https://tc39.es/ecma262/#table-typeof-operator-results
+ */
-}
-function runClearTimeout(marker) {
- if (cachedClearTimeout === clearTimeout) {
- //normal enviroments in sane situations
- return clearTimeout(marker);
- }
- // if clearTimeout wasn't available but was latter defined
- if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
- cachedClearTimeout = clearTimeout;
- return clearTimeout(marker);
- }
- try {
- // when when somebody has screwed with setTimeout but no I.E. maddness
- return cachedClearTimeout(marker);
- } catch (e){
- try {
- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
- return cachedClearTimeout.call(null, marker);
- } catch (e){
- // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
- // Some versions of I.E. have different rules for clearTimeout vs setTimeout
- return cachedClearTimeout.call(this, marker);
- }
- }
+/** @type {validateDictionary} */
+const validateDictionary = hideStackFrames((value, name) => {
+ if (value != null && typeof value !== 'object' && typeof value !== 'function') {
+ throw new ERR_INVALID_ARG_TYPE(name, 'a dictionary', value)
+ }
+})
+
+/**
+ * @callback validateArray
+ * @param {*} value
+ * @param {string} name
+ * @param {number} [minLength]
+ * @returns {asserts value is any[]}
+ */
+/** @type {validateArray} */
+const validateArray = hideStackFrames((value, name, minLength = 0) => {
+ if (!ArrayIsArray(value)) {
+ throw new ERR_INVALID_ARG_TYPE(name, 'Array', value)
+ }
+ if (value.length < minLength) {
+ const reason = `must be longer than ${minLength}`
+ throw new ERR_INVALID_ARG_VALUE(name, value, reason)
+ }
+})
+/**
+ * @callback validateStringArray
+ * @param {*} value
+ * @param {string} name
+ * @returns {asserts value is string[]}
+ */
+/** @type {validateStringArray} */
+function validateStringArray(value, name) {
+ validateArray(value, name)
+ for (let i = 0; i < value.length; i++) {
+ validateString(value[i], `${name}[${i}]`)
+ }
}
-var queue = [];
-var draining = false;
-var currentQueue;
-var queueIndex = -1;
-function cleanUpNextTick() {
- if (!draining || !currentQueue) {
- return;
- }
- draining = false;
- if (currentQueue.length) {
- queue = currentQueue.concat(queue);
- } else {
- queueIndex = -1;
- }
- if (queue.length) {
- drainQueue();
- }
+/**
+ * @callback validateBooleanArray
+ * @param {*} value
+ * @param {string} name
+ * @returns {asserts value is boolean[]}
+ */
+
+/** @type {validateBooleanArray} */
+function validateBooleanArray(value, name) {
+ validateArray(value, name)
+ for (let i = 0; i < value.length; i++) {
+ validateBoolean(value[i], `${name}[${i}]`)
+ }
}
-function drainQueue() {
- if (draining) {
- return;
- }
- var timeout = runTimeout(cleanUpNextTick);
- draining = true;
+/**
+ * @callback validateAbortSignalArray
+ * @param {*} value
+ * @param {string} name
+ * @returns {asserts value is AbortSignal[]}
+ */
- var len = queue.length;
- while(len) {
- currentQueue = queue;
- queue = [];
- while (++queueIndex < len) {
- if (currentQueue) {
- currentQueue[queueIndex].run();
- }
- }
- queueIndex = -1;
- len = queue.length;
+/** @type {validateAbortSignalArray} */
+function validateAbortSignalArray(value, name) {
+ validateArray(value, name)
+ for (let i = 0; i < value.length; i++) {
+ const signal = value[i]
+ const indexedName = `${name}[${i}]`
+ if (signal == null) {
+ throw new ERR_INVALID_ARG_TYPE(indexedName, 'AbortSignal', signal)
}
- currentQueue = null;
- draining = false;
- runClearTimeout(timeout);
+ validateAbortSignal(signal, indexedName)
+ }
}
-process.nextTick = function (fun) {
- var args = new Array(arguments.length - 1);
- if (arguments.length > 1) {
- for (var i = 1; i < arguments.length; i++) {
- args[i - 1] = arguments[i];
- }
- }
- queue.push(new Item(fun, args));
- if (queue.length === 1 && !draining) {
- runTimeout(drainQueue);
+/**
+ * @param {*} signal
+ * @param {string} [name='signal']
+ * @returns {asserts signal is keyof signals}
+ */
+function validateSignalName(signal, name = 'signal') {
+ validateString(signal, name)
+ if (signals[signal] === undefined) {
+ if (signals[StringPrototypeToUpperCase(signal)] !== undefined) {
+ throw new ERR_UNKNOWN_SIGNAL(signal + ' (signals must use all capital letters)')
}
-};
-
-// v8 likes predictible objects
-function Item(fun, array) {
- this.fun = fun;
- this.array = array;
+ throw new ERR_UNKNOWN_SIGNAL(signal)
+ }
}
-Item.prototype.run = function () {
- this.fun.apply(null, this.array);
-};
-process.title = 'browser';
-process.browser = true;
-process.env = {};
-process.argv = [];
-process.version = ''; // empty string to avoid regexp issues
-process.versions = {};
-
-function noop() {}
-
-process.on = noop;
-process.addListener = noop;
-process.once = noop;
-process.off = noop;
-process.removeListener = noop;
-process.removeAllListeners = noop;
-process.emit = noop;
-process.prependListener = noop;
-process.prependOnceListener = noop;
-
-process.listeners = function (name) { return [] }
-
-process.binding = function (name) {
- throw new Error('process.binding is not supported');
-};
-
-process.cwd = function () { return '/' };
-process.chdir = function (dir) {
- throw new Error('process.chdir is not supported');
-};
-process.umask = function() { return 0; };
-
-},{}],102:[function(require,module,exports){
-'use strict';
-var isFn = require('is-fn');
-var setImmediate = require('set-immediate-shim');
-
-module.exports = function (promise) {
- if (!isFn(promise.then)) {
- throw new TypeError('Expected a promise');
- }
- return function (cb) {
- promise.then(function (data) {
- setImmediate(cb, null, data);
- }, function (err) {
- setImmediate(cb, err);
- });
- };
-};
+/**
+ * @callback validateBuffer
+ * @param {*} buffer
+ * @param {string} [name='buffer']
+ * @returns {asserts buffer is ArrayBufferView}
+ */
-},{"is-fn":82,"set-immediate-shim":114}],103:[function(require,module,exports){
-(function (process){(function (){
-var once = require('once')
-var eos = require('end-of-stream')
-var fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes
+/** @type {validateBuffer} */
+const validateBuffer = hideStackFrames((buffer, name = 'buffer') => {
+ if (!isArrayBufferView(buffer)) {
+ throw new ERR_INVALID_ARG_TYPE(name, ['Buffer', 'TypedArray', 'DataView'], buffer)
+ }
+})
-var noop = function () {}
-var ancient = /^v?\.0/.test(process.version)
+/**
+ * @param {string} data
+ * @param {string} encoding
+ */
+function validateEncoding(data, encoding) {
+ const normalizedEncoding = normalizeEncoding(encoding)
+ const length = data.length
+ if (normalizedEncoding === 'hex' && length % 2 !== 0) {
+ throw new ERR_INVALID_ARG_VALUE('encoding', encoding, `is invalid for data of length ${length}`)
+ }
+}
-var isFn = function (fn) {
- return typeof fn === 'function'
+/**
+ * Check that the port number is not NaN when coerced to a number,
+ * is an integer and that it falls within the legal range of port numbers.
+ * @param {*} port
+ * @param {string} [name='Port']
+ * @param {boolean} [allowZero=true]
+ * @returns {number}
+ */
+function validatePort(port, name = 'Port', allowZero = true) {
+ if (
+ (typeof port !== 'number' && typeof port !== 'string') ||
+ (typeof port === 'string' && StringPrototypeTrim(port).length === 0) ||
+ +port !== +port >>> 0 ||
+ port > 0xffff ||
+ (port === 0 && !allowZero)
+ ) {
+ throw new ERR_SOCKET_BAD_PORT(name, port, allowZero)
+ }
+ return port | 0
}
-var isFS = function (stream) {
- if (!ancient) return false // newer node version do not need to care about fs is a special way
- if (!fs) return false // browser
- return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)
-}
+/**
+ * @callback validateAbortSignal
+ * @param {*} signal
+ * @param {string} name
+ */
-var isRequest = function (stream) {
- return stream.setHeader && isFn(stream.abort)
-}
+/** @type {validateAbortSignal} */
+const validateAbortSignal = hideStackFrames((signal, name) => {
+ if (signal !== undefined && (signal === null || typeof signal !== 'object' || !('aborted' in signal))) {
+ throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)
+ }
+})
-var destroyer = function (stream, reading, writing, callback) {
- callback = once(callback)
+/**
+ * @callback validateFunction
+ * @param {*} value
+ * @param {string} name
+ * @returns {asserts value is Function}
+ */
- var closed = false
- stream.on('close', function () {
- closed = true
- })
+/** @type {validateFunction} */
+const validateFunction = hideStackFrames((value, name) => {
+ if (typeof value !== 'function') throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)
+})
- eos(stream, {readable: reading, writable: writing}, function (err) {
- if (err) return callback(err)
- closed = true
- callback()
- })
+/**
+ * @callback validatePlainFunction
+ * @param {*} value
+ * @param {string} name
+ * @returns {asserts value is Function}
+ */
- var destroyed = false
- return function (err) {
- if (closed) return
- if (destroyed) return
- destroyed = true
+/** @type {validatePlainFunction} */
+const validatePlainFunction = hideStackFrames((value, name) => {
+ if (typeof value !== 'function' || isAsyncFunction(value)) throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)
+})
- if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks
- if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want
+/**
+ * @callback validateUndefined
+ * @param {*} value
+ * @param {string} name
+ * @returns {asserts value is undefined}
+ */
- if (isFn(stream.destroy)) return stream.destroy()
+/** @type {validateUndefined} */
+const validateUndefined = hideStackFrames((value, name) => {
+ if (value !== undefined) throw new ERR_INVALID_ARG_TYPE(name, 'undefined', value)
+})
- callback(err || new Error('stream was destroyed'))
+/**
+ * @template T
+ * @param {T} value
+ * @param {string} name
+ * @param {T[]} union
+ */
+function validateUnion(value, name, union) {
+ if (!ArrayPrototypeIncludes(union, value)) {
+ throw new ERR_INVALID_ARG_TYPE(name, `('${ArrayPrototypeJoin(union, '|')}')`, value)
}
}
-var call = function (fn) {
- fn()
-}
-
-var pipe = function (from, to) {
- return from.pipe(to)
-}
-
-var pump = function () {
- var streams = Array.prototype.slice.call(arguments)
- var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop
-
- if (Array.isArray(streams[0])) streams = streams[0]
- if (streams.length < 2) throw new Error('pump requires two streams per minimum')
+/*
+ The rules for the Link header field are described here:
+ https://www.rfc-editor.org/rfc/rfc8288.html#section-3
- var error
- var destroys = streams.map(function (stream, i) {
- var reading = i < streams.length - 1
- var writing = i > 0
- return destroyer(stream, reading, writing, function (err) {
- if (!error) error = err
- if (err) destroys.forEach(call)
- if (reading) return
- destroys.forEach(call)
- callback(error)
- })
- })
+ This regex validates any string surrounded by angle brackets
+ (not necessarily a valid URI reference) followed by zero or more
+ link-params separated by semicolons.
+*/
+const linkValueRegExp = /^(?:<[^>]*>)(?:\s*;\s*[^;"\s]+(?:=(")?[^;"\s]*\1)?)*$/
- return streams.reduce(pipe)
+/**
+ * @param {any} value
+ * @param {string} name
+ */
+function validateLinkHeaderFormat(value, name) {
+ if (typeof value === 'undefined' || !RegExpPrototypeExec(linkValueRegExp, value)) {
+ throw new ERR_INVALID_ARG_VALUE(
+ name,
+ value,
+ 'must be an array or string of format "; rel=preload; as=style"'
+ )
+ }
}
-module.exports = pump
-
-}).call(this)}).call(this,require('_process'))
-},{"_process":101,"end-of-stream":41,"fs":37,"once":99}],104:[function(require,module,exports){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
+/**
+ * @param {any} hints
+ * @return {string}
+ */
+function validateLinkHeaderValue(hints) {
+ if (typeof hints === 'string') {
+ validateLinkHeaderFormat(hints, 'hints')
+ return hints
+ } else if (ArrayIsArray(hints)) {
+ const hintsLength = hints.length
+ let result = ''
+ if (hintsLength === 0) {
+ return result
+ }
+ for (let i = 0; i < hintsLength; i++) {
+ const link = hints[i]
+ validateLinkHeaderFormat(link, 'hints')
+ result += link
+ if (i !== hintsLength - 1) {
+ result += ', '
+ }
+ }
+ return result
+ }
+ throw new ERR_INVALID_ARG_VALUE(
+ 'hints',
+ hints,
+ 'must be an array or string of format "; rel=preload; as=style"'
+ )
+}
+module.exports = {
+ isInt32,
+ isUint32,
+ parseFileMode,
+ validateArray,
+ validateStringArray,
+ validateBooleanArray,
+ validateAbortSignalArray,
+ validateBoolean,
+ validateBuffer,
+ validateDictionary,
+ validateEncoding,
+ validateFunction,
+ validateInt32,
+ validateInteger,
+ validateNumber,
+ validateObject,
+ validateOneOf,
+ validatePlainFunction,
+ validatePort,
+ validateSignalName,
+ validateString,
+ validateUint32,
+ validateUndefined,
+ validateUnion,
+ validateAbortSignal,
+ validateLinkHeaderValue
+}
-// a duplex stream is just a stream that is both readable and writable.
-// Since JS doesn't have multiple prototypal inheritance, this class
-// prototypally inherits from Readable, and then parasitically from
-// Writable.
+},{"../ours/errors":149,"../ours/primordials":150,"../ours/util":151}],148:[function(require,module,exports){
+'use strict'
-'use strict';
+const CustomStream = require('../stream')
+const promises = require('../stream/promises')
+const originalDestroy = CustomStream.Readable.destroy
+module.exports = CustomStream.Readable
-/**/
+// Explicit export naming is needed for ESM
+module.exports._uint8ArrayToBuffer = CustomStream._uint8ArrayToBuffer
+module.exports._isUint8Array = CustomStream._isUint8Array
+module.exports.isDisturbed = CustomStream.isDisturbed
+module.exports.isErrored = CustomStream.isErrored
+module.exports.isReadable = CustomStream.isReadable
+module.exports.Readable = CustomStream.Readable
+module.exports.Writable = CustomStream.Writable
+module.exports.Duplex = CustomStream.Duplex
+module.exports.Transform = CustomStream.Transform
+module.exports.PassThrough = CustomStream.PassThrough
+module.exports.addAbortSignal = CustomStream.addAbortSignal
+module.exports.finished = CustomStream.finished
+module.exports.destroy = CustomStream.destroy
+module.exports.destroy = originalDestroy
+module.exports.pipeline = CustomStream.pipeline
+module.exports.compose = CustomStream.compose
+Object.defineProperty(CustomStream, 'promises', {
+ configurable: true,
+ enumerable: true,
+ get() {
+ return promises
+ }
+})
+module.exports.Stream = CustomStream.Stream
-var pna = require('process-nextick-args');
-/**/
+// Allow default importing
+module.exports.default = module.exports
-/**/
-var objectKeys = Object.keys || function (obj) {
- var keys = [];
- for (var key in obj) {
- keys.push(key);
- }return keys;
-};
-/**/
+},{"../stream":152,"../stream/promises":153}],149:[function(require,module,exports){
+'use strict'
-module.exports = Duplex;
+const { format, inspect, AggregateError: CustomAggregateError } = require('./util')
-/**/
-var util = Object.create(require('core-util-is'));
-util.inherits = require('inherits');
-/**/
+/*
+ This file is a reduced and adapted version of the main lib/internal/errors.js file defined at
-var Readable = require('./_stream_readable');
-var Writable = require('./_stream_writable');
+ https://github.com/nodejs/node/blob/master/lib/internal/errors.js
-util.inherits(Duplex, Readable);
+ Don't try to replace with the original file and keep it up to date (starting from E(...) definitions)
+ with the upstream file.
+*/
-{
- // avoid scope creep, the keys array can then be collected
- var keys = objectKeys(Writable.prototype);
- for (var v = 0; v < keys.length; v++) {
- var method = keys[v];
- if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+const AggregateError = globalThis.AggregateError || CustomAggregateError
+const kIsNodeError = Symbol('kIsNodeError')
+const kTypes = [
+ 'string',
+ 'function',
+ 'number',
+ 'object',
+ // Accept 'Function' and 'Object' as alternative to the lower cased version.
+ 'Function',
+ 'Object',
+ 'boolean',
+ 'bigint',
+ 'symbol'
+]
+const classRegExp = /^([A-Z][a-z0-9]*)+$/
+const nodeInternalPrefix = '__node_internal_'
+const codes = {}
+function assert(value, message) {
+ if (!value) {
+ throw new codes.ERR_INTERNAL_ASSERTION(message)
}
}
-function Duplex(options) {
- if (!(this instanceof Duplex)) return new Duplex(options);
-
- Readable.call(this, options);
- Writable.call(this, options);
-
- if (options && options.readable === false) this.readable = false;
-
- if (options && options.writable === false) this.writable = false;
-
- this.allowHalfOpen = true;
- if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
-
- this.once('end', onend);
+// Only use this for integers! Decimal numbers do not work with this function.
+function addNumericalSeparator(val) {
+ let res = ''
+ let i = val.length
+ const start = val[0] === '-' ? 1 : 0
+ for (; i >= start + 4; i -= 3) {
+ res = `_${val.slice(i - 3, i)}${res}`
+ }
+ return `${val.slice(0, i)}${res}`
}
-
-Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
- // making it explicit this property is not enumerable
- // because otherwise some prototype manipulation in
- // userland will fail
- enumerable: false,
- get: function () {
- return this._writableState.highWaterMark;
+function getMessage(key, msg, args) {
+ if (typeof msg === 'function') {
+ assert(
+ msg.length <= args.length,
+ // Default options do not count.
+ `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${msg.length}).`
+ )
+ return msg(...args)
}
-});
-
-// the no-half-open enforcer
-function onend() {
- // if we allow half-open state, or if the writable side ended,
- // then we're ok.
- if (this.allowHalfOpen || this._writableState.ended) return;
-
- // no more data can be written.
- // But allow more writes to happen in this tick.
- pna.nextTick(onEndNT, this);
+ const expectedLength = (msg.match(/%[dfijoOs]/g) || []).length
+ assert(
+ expectedLength === args.length,
+ `Code: ${key}; The provided arguments length (${args.length}) does not match the required ones (${expectedLength}).`
+ )
+ if (args.length === 0) {
+ return msg
+ }
+ return format(msg, ...args)
}
-
-function onEndNT(self) {
- self.end();
+function E(code, message, Base) {
+ if (!Base) {
+ Base = Error
+ }
+ class NodeError extends Base {
+ constructor(...args) {
+ super(getMessage(code, message, args))
+ }
+ toString() {
+ return `${this.name} [${code}]: ${this.message}`
+ }
+ }
+ Object.defineProperties(NodeError.prototype, {
+ name: {
+ value: Base.name,
+ writable: true,
+ enumerable: false,
+ configurable: true
+ },
+ toString: {
+ value() {
+ return `${this.name} [${code}]: ${this.message}`
+ },
+ writable: true,
+ enumerable: false,
+ configurable: true
+ }
+ })
+ NodeError.prototype.code = code
+ NodeError.prototype[kIsNodeError] = true
+ codes[code] = NodeError
+}
+function hideStackFrames(fn) {
+ // We rename the functions that will be hidden to cut off the stacktrace
+ // at the outermost one
+ const hidden = nodeInternalPrefix + fn.name
+ Object.defineProperty(fn, 'name', {
+ value: hidden
+ })
+ return fn
+}
+function aggregateTwoErrors(innerError, outerError) {
+ if (innerError && outerError && innerError !== outerError) {
+ if (Array.isArray(outerError.errors)) {
+ // If `outerError` is already an `AggregateError`.
+ outerError.errors.push(innerError)
+ return outerError
+ }
+ const err = new AggregateError([outerError, innerError], outerError.message)
+ err.code = outerError.code
+ return err
+ }
+ return innerError || outerError
}
+class AbortError extends Error {
+ constructor(message = 'The operation was aborted', options = undefined) {
+ if (options !== undefined && typeof options !== 'object') {
+ throw new codes.ERR_INVALID_ARG_TYPE('options', 'Object', options)
+ }
+ super(message, options)
+ this.code = 'ABORT_ERR'
+ this.name = 'AbortError'
+ }
+}
+E('ERR_ASSERTION', '%s', Error)
+E(
+ 'ERR_INVALID_ARG_TYPE',
+ (name, expected, actual) => {
+ assert(typeof name === 'string', "'name' must be a string")
+ if (!Array.isArray(expected)) {
+ expected = [expected]
+ }
+ let msg = 'The '
+ if (name.endsWith(' argument')) {
+ // For cases like 'first argument'
+ msg += `${name} `
+ } else {
+ msg += `"${name}" ${name.includes('.') ? 'property' : 'argument'} `
+ }
+ msg += 'must be '
+ const types = []
+ const instances = []
+ const other = []
+ for (const value of expected) {
+ assert(typeof value === 'string', 'All expected entries have to be of type string')
+ if (kTypes.includes(value)) {
+ types.push(value.toLowerCase())
+ } else if (classRegExp.test(value)) {
+ instances.push(value)
+ } else {
+ assert(value !== 'object', 'The value "object" should be written as "Object"')
+ other.push(value)
+ }
+ }
-Object.defineProperty(Duplex.prototype, 'destroyed', {
- get: function () {
- if (this._readableState === undefined || this._writableState === undefined) {
- return false;
+ // Special handle `object` in case other instances are allowed to outline
+ // the differences between each other.
+ if (instances.length > 0) {
+ const pos = types.indexOf('object')
+ if (pos !== -1) {
+ types.splice(types, pos, 1)
+ instances.push('Object')
+ }
+ }
+ if (types.length > 0) {
+ switch (types.length) {
+ case 1:
+ msg += `of type ${types[0]}`
+ break
+ case 2:
+ msg += `one of type ${types[0]} or ${types[1]}`
+ break
+ default: {
+ const last = types.pop()
+ msg += `one of type ${types.join(', ')}, or ${last}`
+ }
+ }
+ if (instances.length > 0 || other.length > 0) {
+ msg += ' or '
+ }
+ }
+ if (instances.length > 0) {
+ switch (instances.length) {
+ case 1:
+ msg += `an instance of ${instances[0]}`
+ break
+ case 2:
+ msg += `an instance of ${instances[0]} or ${instances[1]}`
+ break
+ default: {
+ const last = instances.pop()
+ msg += `an instance of ${instances.join(', ')}, or ${last}`
+ }
+ }
+ if (other.length > 0) {
+ msg += ' or '
+ }
+ }
+ switch (other.length) {
+ case 0:
+ break
+ case 1:
+ if (other[0].toLowerCase() !== other[0]) {
+ msg += 'an '
+ }
+ msg += `${other[0]}`
+ break
+ case 2:
+ msg += `one of ${other[0]} or ${other[1]}`
+ break
+ default: {
+ const last = other.pop()
+ msg += `one of ${other.join(', ')}, or ${last}`
+ }
+ }
+ if (actual == null) {
+ msg += `. Received ${actual}`
+ } else if (typeof actual === 'function' && actual.name) {
+ msg += `. Received function ${actual.name}`
+ } else if (typeof actual === 'object') {
+ var _actual$constructor
+ if (
+ (_actual$constructor = actual.constructor) !== null &&
+ _actual$constructor !== undefined &&
+ _actual$constructor.name
+ ) {
+ msg += `. Received an instance of ${actual.constructor.name}`
+ } else {
+ const inspected = inspect(actual, {
+ depth: -1
+ })
+ msg += `. Received ${inspected}`
+ }
+ } else {
+ let inspected = inspect(actual, {
+ colors: false
+ })
+ if (inspected.length > 25) {
+ inspected = `${inspected.slice(0, 25)}...`
+ }
+ msg += `. Received type ${typeof actual} (${inspected})`
+ }
+ return msg
+ },
+ TypeError
+)
+E(
+ 'ERR_INVALID_ARG_VALUE',
+ (name, value, reason = 'is invalid') => {
+ let inspected = inspect(value)
+ if (inspected.length > 128) {
+ inspected = inspected.slice(0, 128) + '...'
+ }
+ const type = name.includes('.') ? 'property' : 'argument'
+ return `The ${type} '${name}' ${reason}. Received ${inspected}`
+ },
+ TypeError
+)
+E(
+ 'ERR_INVALID_RETURN_VALUE',
+ (input, name, value) => {
+ var _value$constructor
+ const type =
+ value !== null &&
+ value !== undefined &&
+ (_value$constructor = value.constructor) !== null &&
+ _value$constructor !== undefined &&
+ _value$constructor.name
+ ? `instance of ${value.constructor.name}`
+ : `type ${typeof value}`
+ return `Expected ${input} to be returned from the "${name}"` + ` function but got ${type}.`
+ },
+ TypeError
+)
+E(
+ 'ERR_MISSING_ARGS',
+ (...args) => {
+ assert(args.length > 0, 'At least one arg needs to be specified')
+ let msg
+ const len = args.length
+ args = (Array.isArray(args) ? args : [args]).map((a) => `"${a}"`).join(' or ')
+ switch (len) {
+ case 1:
+ msg += `The ${args[0]} argument`
+ break
+ case 2:
+ msg += `The ${args[0]} and ${args[1]} arguments`
+ break
+ default:
+ {
+ const last = args.pop()
+ msg += `The ${args.join(', ')}, and ${last} arguments`
+ }
+ break
}
- return this._readableState.destroyed && this._writableState.destroyed;
+ return `${msg} must be specified`
},
- set: function (value) {
- // we ignore the value if the stream
- // has not been initialized yet
- if (this._readableState === undefined || this._writableState === undefined) {
- return;
+ TypeError
+)
+E(
+ 'ERR_OUT_OF_RANGE',
+ (str, range, input) => {
+ assert(range, 'Missing "range" argument')
+ let received
+ if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {
+ received = addNumericalSeparator(String(input))
+ } else if (typeof input === 'bigint') {
+ received = String(input)
+ if (input > 2n ** 32n || input < -(2n ** 32n)) {
+ received = addNumericalSeparator(received)
+ }
+ received += 'n'
+ } else {
+ received = inspect(input)
}
-
- // backward compatibility, the user is explicitly
- // managing destroyed
- this._readableState.destroyed = value;
- this._writableState.destroyed = value;
- }
-});
-
-Duplex.prototype._destroy = function (err, cb) {
- this.push(null);
- this.end();
-
- pna.nextTick(cb, err);
-};
-},{"./_stream_readable":106,"./_stream_writable":108,"core-util-is":39,"inherits":80,"process-nextick-args":100}],105:[function(require,module,exports){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// a passthrough stream.
-// basically just the most minimal sort of Transform stream.
-// Every written chunk gets output as-is.
-
-'use strict';
-
-module.exports = PassThrough;
-
-var Transform = require('./_stream_transform');
-
-/**/
-var util = Object.create(require('core-util-is'));
-util.inherits = require('inherits');
-/**/
-
-util.inherits(PassThrough, Transform);
-
-function PassThrough(options) {
- if (!(this instanceof PassThrough)) return new PassThrough(options);
-
- Transform.call(this, options);
+ return `The value of "${str}" is out of range. It must be ${range}. Received ${received}`
+ },
+ RangeError
+)
+E('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times', Error)
+E('ERR_METHOD_NOT_IMPLEMENTED', 'The %s method is not implemented', Error)
+E('ERR_STREAM_ALREADY_FINISHED', 'Cannot call %s after a stream was finished', Error)
+E('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable', Error)
+E('ERR_STREAM_DESTROYED', 'Cannot call %s after a stream was destroyed', Error)
+E('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError)
+E('ERR_STREAM_PREMATURE_CLOSE', 'Premature close', Error)
+E('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF', Error)
+E('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event', Error)
+E('ERR_STREAM_WRITE_AFTER_END', 'write after end', Error)
+E('ERR_UNKNOWN_ENCODING', 'Unknown encoding: %s', TypeError)
+module.exports = {
+ AbortError,
+ aggregateTwoErrors: hideStackFrames(aggregateTwoErrors),
+ hideStackFrames,
+ codes
}
-PassThrough.prototype._transform = function (chunk, encoding, cb) {
- cb(null, chunk);
-};
-},{"./_stream_transform":107,"core-util-is":39,"inherits":80}],106:[function(require,module,exports){
-(function (process,global){(function (){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-'use strict';
-
-/**/
-
-var pna = require('process-nextick-args');
-/**/
-
-module.exports = Readable;
-
-/**/
-var isArray = require('isarray');
-/**/
-
-/**/
-var Duplex;
-/**/
-
-Readable.ReadableState = ReadableState;
-
-/**/
-var EE = require('events').EventEmitter;
-
-var EElistenerCount = function (emitter, type) {
- return emitter.listeners(type).length;
-};
-/**/
+},{"./util":151}],150:[function(require,module,exports){
+'use strict'
-/**/
-var Stream = require('./internal/streams/stream');
-/**/
+/*
+ This file is a reduced and adapted version of the main lib/internal/per_context/primordials.js file defined at
-/**/
+ https://github.com/nodejs/node/blob/master/lib/internal/per_context/primordials.js
-var Buffer = require('safe-buffer').Buffer;
-var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
-function _uint8ArrayToBuffer(chunk) {
- return Buffer.from(chunk);
-}
-function _isUint8Array(obj) {
- return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+ Don't try to replace with the original file and keep it up to date with the upstream file.
+*/
+module.exports = {
+ ArrayIsArray(self) {
+ return Array.isArray(self)
+ },
+ ArrayPrototypeIncludes(self, el) {
+ return self.includes(el)
+ },
+ ArrayPrototypeIndexOf(self, el) {
+ return self.indexOf(el)
+ },
+ ArrayPrototypeJoin(self, sep) {
+ return self.join(sep)
+ },
+ ArrayPrototypeMap(self, fn) {
+ return self.map(fn)
+ },
+ ArrayPrototypePop(self, el) {
+ return self.pop(el)
+ },
+ ArrayPrototypePush(self, el) {
+ return self.push(el)
+ },
+ ArrayPrototypeSlice(self, start, end) {
+ return self.slice(start, end)
+ },
+ Error,
+ FunctionPrototypeCall(fn, thisArgs, ...args) {
+ return fn.call(thisArgs, ...args)
+ },
+ FunctionPrototypeSymbolHasInstance(self, instance) {
+ return Function.prototype[Symbol.hasInstance].call(self, instance)
+ },
+ MathFloor: Math.floor,
+ Number,
+ NumberIsInteger: Number.isInteger,
+ NumberIsNaN: Number.isNaN,
+ NumberMAX_SAFE_INTEGER: Number.MAX_SAFE_INTEGER,
+ NumberMIN_SAFE_INTEGER: Number.MIN_SAFE_INTEGER,
+ NumberParseInt: Number.parseInt,
+ ObjectDefineProperties(self, props) {
+ return Object.defineProperties(self, props)
+ },
+ ObjectDefineProperty(self, name, prop) {
+ return Object.defineProperty(self, name, prop)
+ },
+ ObjectGetOwnPropertyDescriptor(self, name) {
+ return Object.getOwnPropertyDescriptor(self, name)
+ },
+ ObjectKeys(obj) {
+ return Object.keys(obj)
+ },
+ ObjectSetPrototypeOf(target, proto) {
+ return Object.setPrototypeOf(target, proto)
+ },
+ Promise,
+ PromisePrototypeCatch(self, fn) {
+ return self.catch(fn)
+ },
+ PromisePrototypeThen(self, thenFn, catchFn) {
+ return self.then(thenFn, catchFn)
+ },
+ PromiseReject(err) {
+ return Promise.reject(err)
+ },
+ PromiseResolve(val) {
+ return Promise.resolve(val)
+ },
+ ReflectApply: Reflect.apply,
+ RegExpPrototypeTest(self, value) {
+ return self.test(value)
+ },
+ SafeSet: Set,
+ String,
+ StringPrototypeSlice(self, start, end) {
+ return self.slice(start, end)
+ },
+ StringPrototypeToLowerCase(self) {
+ return self.toLowerCase()
+ },
+ StringPrototypeToUpperCase(self) {
+ return self.toUpperCase()
+ },
+ StringPrototypeTrim(self) {
+ return self.trim()
+ },
+ Symbol,
+ SymbolFor: Symbol.for,
+ SymbolAsyncIterator: Symbol.asyncIterator,
+ SymbolHasInstance: Symbol.hasInstance,
+ SymbolIterator: Symbol.iterator,
+ SymbolDispose: Symbol.dispose || Symbol('Symbol.dispose'),
+ SymbolAsyncDispose: Symbol.asyncDispose || Symbol('Symbol.asyncDispose'),
+ TypedArrayPrototypeSet(self, buf, len) {
+ return self.set(buf, len)
+ },
+ Boolean: Boolean,
+ Uint8Array
}
-/**/
+},{}],151:[function(require,module,exports){
+'use strict'
-/**/
-var util = Object.create(require('core-util-is'));
-util.inherits = require('inherits');
-/**/
+const bufferModule = require('buffer')
+const { kResistStopPropagation, SymbolDispose } = require('./primordials')
+const AbortSignal = globalThis.AbortSignal || require('abort-controller').AbortSignal
+const AbortController = globalThis.AbortController || require('abort-controller').AbortController
+const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor
+const Blob = globalThis.Blob || bufferModule.Blob
+/* eslint-disable indent */
+const isBlob =
+ typeof Blob !== 'undefined'
+ ? function isBlob(b) {
+ // eslint-disable-next-line indent
+ return b instanceof Blob
+ }
+ : function isBlob(b) {
+ return false
+ }
+/* eslint-enable indent */
-/**/
-var debugUtil = require('util');
-var debug = void 0;
-if (debugUtil && debugUtil.debuglog) {
- debug = debugUtil.debuglog('stream');
-} else {
- debug = function () {};
+const validateAbortSignal = (signal, name) => {
+ if (signal !== undefined && (signal === null || typeof signal !== 'object' || !('aborted' in signal))) {
+ throw new ERR_INVALID_ARG_TYPE(name, 'AbortSignal', signal)
+ }
}
-/**/
-
-var BufferList = require('./internal/streams/BufferList');
-var destroyImpl = require('./internal/streams/destroy');
-var StringDecoder;
-
-util.inherits(Readable, Stream);
-
-var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
-
-function prependListener(emitter, event, fn) {
- // Sadly this is not cacheable as some libraries bundle their own
- // event emitter implementation with them.
- if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
-
- // This is a hack to make sure that our error handler is attached before any
- // userland ones. NEVER DO THIS. This is here only because this code needs
- // to continue to work with older versions of Node.js that do not include
- // the prependListener() method. The goal is to eventually remove this hack.
- if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+const validateFunction = (value, name) => {
+ if (typeof value !== 'function') throw new ERR_INVALID_ARG_TYPE(name, 'Function', value)
}
-function ReadableState(options, stream) {
- Duplex = Duplex || require('./_stream_duplex');
-
- options = options || {};
-
- // Duplex streams are both readable and writable, but share
- // the same options object.
- // However, some cases require setting options to different
- // values for the readable and the writable sides of the duplex stream.
- // These options can be provided separately as readableXXX and writableXXX.
- var isDuplex = stream instanceof Duplex;
-
- // object stream flag. Used to make read(n) ignore n and to
- // make all the buffer merging and length checks go away
- this.objectMode = !!options.objectMode;
-
- if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
-
- // the point at which it stops calling _read() to fill the buffer
- // Note: 0 is a valid value, means "don't call _read preemptively ever"
- var hwm = options.highWaterMark;
- var readableHwm = options.readableHighWaterMark;
- var defaultHwm = this.objectMode ? 16 : 16 * 1024;
-
- if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;
-
- // cast to ints.
- this.highWaterMark = Math.floor(this.highWaterMark);
-
- // A linked list is used to store data chunks instead of an array because the
- // linked list can remove elements from the beginning faster than
- // array.shift()
- this.buffer = new BufferList();
- this.length = 0;
- this.pipes = null;
- this.pipesCount = 0;
- this.flowing = null;
- this.ended = false;
- this.endEmitted = false;
- this.reading = false;
-
- // a flag to be able to tell if the event 'readable'/'data' is emitted
- // immediately, or on a later tick. We set this to true at first, because
- // any actions that shouldn't happen until "later" should generally also
- // not happen before the first read call.
- this.sync = true;
-
- // whenever we return null, then we set a flag to say
- // that we're awaiting a 'readable' event emission.
- this.needReadable = false;
- this.emittedReadable = false;
- this.readableListening = false;
- this.resumeScheduled = false;
-
- // has it been destroyed
- this.destroyed = false;
-
- // Crypto is kind of old and crusty. Historically, its default string
- // encoding is 'binary' so we have to make this configurable.
- // Everything else in the universe uses 'utf8', though.
- this.defaultEncoding = options.defaultEncoding || 'utf8';
-
- // the number of writers that are awaiting a drain event in .pipe()s
- this.awaitDrain = 0;
-
- // if true, a maybeReadMore has been scheduled
- this.readingMore = false;
-
- this.decoder = null;
- this.encoding = null;
- if (options.encoding) {
- if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
- this.decoder = new StringDecoder(options.encoding);
- this.encoding = options.encoding;
+// This is a simplified version of AggregateError
+class AggregateError extends Error {
+ constructor(errors) {
+ if (!Array.isArray(errors)) {
+ throw new TypeError(`Expected input to be an Array, got ${typeof errors}`)
+ }
+ let message = ''
+ for (let i = 0; i < errors.length; i++) {
+ message += ` ${errors[i].stack}\n`
+ }
+ super(message)
+ this.name = 'AggregateError'
+ this.errors = errors
}
}
+module.exports = {
+ AggregateError,
+ kEmptyObject: Object.freeze({}),
+ once(callback) {
+ let called = false
+ return function (...args) {
+ if (called) {
+ return
+ }
+ called = true
+ callback.apply(this, args)
+ }
+ },
+ createDeferredPromise: function () {
+ let resolve
+ let reject
+
+ // eslint-disable-next-line promise/param-names
+ const promise = new Promise((res, rej) => {
+ resolve = res
+ reject = rej
+ })
+ return {
+ promise,
+ resolve,
+ reject
+ }
+ },
+ promisify(fn) {
+ return new Promise((resolve, reject) => {
+ fn((err, ...args) => {
+ if (err) {
+ return reject(err)
+ }
+ return resolve(...args)
+ })
+ })
+ },
+ debuglog() {
+ return function () {}
+ },
+ format(format, ...args) {
+ // Simplified version of https://nodejs.org/api/util.html#utilformatformat-args
+ return format.replace(/%([sdifj])/g, function (...[_unused, type]) {
+ const replacement = args.shift()
+ if (type === 'f') {
+ return replacement.toFixed(6)
+ } else if (type === 'j') {
+ return JSON.stringify(replacement)
+ } else if (type === 's' && typeof replacement === 'object') {
+ const ctor = replacement.constructor !== Object ? replacement.constructor.name : ''
+ return `${ctor} {}`.trim()
+ } else {
+ return replacement.toString()
+ }
+ })
+ },
+ inspect(value) {
+ // Vastly simplified version of https://nodejs.org/api/util.html#utilinspectobject-options
+ switch (typeof value) {
+ case 'string':
+ if (value.includes("'")) {
+ if (!value.includes('"')) {
+ return `"${value}"`
+ } else if (!value.includes('`') && !value.includes('${')) {
+ return `\`${value}\``
+ }
+ }
+ return `'${value}'`
+ case 'number':
+ if (isNaN(value)) {
+ return 'NaN'
+ } else if (Object.is(value, -0)) {
+ return String(value)
+ }
+ return value
+ case 'bigint':
+ return `${String(value)}n`
+ case 'boolean':
+ case 'undefined':
+ return String(value)
+ case 'object':
+ return '{}'
+ }
+ },
+ types: {
+ isAsyncFunction(fn) {
+ return fn instanceof AsyncFunction
+ },
+ isArrayBufferView(arr) {
+ return ArrayBuffer.isView(arr)
+ }
+ },
+ isBlob,
+ deprecate(fn, message) {
+ return fn
+ },
+ addAbortListener:
+ require('events').addAbortListener ||
+ function addAbortListener(signal, listener) {
+ if (signal === undefined) {
+ throw new ERR_INVALID_ARG_TYPE('signal', 'AbortSignal', signal)
+ }
+ validateAbortSignal(signal, 'signal')
+ validateFunction(listener, 'listener')
+ let removeEventListener
+ if (signal.aborted) {
+ queueMicrotask(() => listener())
+ } else {
+ signal.addEventListener('abort', listener, {
+ __proto__: null,
+ once: true,
+ [kResistStopPropagation]: true
+ })
+ removeEventListener = () => {
+ signal.removeEventListener('abort', listener)
+ }
+ }
+ return {
+ __proto__: null,
+ [SymbolDispose]() {
+ var _removeEventListener
+ ;(_removeEventListener = removeEventListener) === null || _removeEventListener === undefined
+ ? undefined
+ : _removeEventListener()
+ }
+ }
+ },
+ AbortSignalAny:
+ AbortSignal.any ||
+ function AbortSignalAny(signals) {
+ // Fast path if there is only one signal.
+ if (signals.length === 1) {
+ return signals[0]
+ }
+ const ac = new AbortController()
+ const abort = () => ac.abort()
+ signals.forEach((signal) => {
+ validateAbortSignal(signal, 'signals')
+ signal.addEventListener('abort', abort, {
+ once: true
+ })
+ })
+ ac.signal.addEventListener(
+ 'abort',
+ () => {
+ signals.forEach((signal) => signal.removeEventListener('abort', abort))
+ },
+ {
+ once: true
+ }
+ )
+ return ac.signal
+ }
+}
+module.exports.promisify.custom = Symbol.for('nodejs.util.promisify.custom')
-function Readable(options) {
- Duplex = Duplex || require('./_stream_duplex');
-
- if (!(this instanceof Readable)) return new Readable(options);
-
- this._readableState = new ReadableState(options, this);
+},{"./primordials":150,"abort-controller":116,"buffer":120,"events":128}],152:[function(require,module,exports){
+/* replacement start */
- // legacy
- this.readable = true;
+const { Buffer } = require('buffer')
- if (options) {
- if (typeof options.read === 'function') this._read = options.read;
+/* replacement end */
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
- if (typeof options.destroy === 'function') this._destroy = options.destroy;
+;('use strict')
+const { ObjectDefineProperty, ObjectKeys, ReflectApply } = require('./ours/primordials')
+const {
+ promisify: { custom: customPromisify }
+} = require('./ours/util')
+const { streamReturningOperators, promiseReturningOperators } = require('./internal/streams/operators')
+const {
+ codes: { ERR_ILLEGAL_CONSTRUCTOR }
+} = require('./ours/errors')
+const compose = require('./internal/streams/compose')
+const { setDefaultHighWaterMark, getDefaultHighWaterMark } = require('./internal/streams/state')
+const { pipeline } = require('./internal/streams/pipeline')
+const { destroyer } = require('./internal/streams/destroy')
+const eos = require('./internal/streams/end-of-stream')
+const internalBuffer = {}
+const promises = require('./stream/promises')
+const utils = require('./internal/streams/utils')
+const Stream = (module.exports = require('./internal/streams/legacy').Stream)
+Stream.isDestroyed = utils.isDestroyed
+Stream.isDisturbed = utils.isDisturbed
+Stream.isErrored = utils.isErrored
+Stream.isReadable = utils.isReadable
+Stream.isWritable = utils.isWritable
+Stream.Readable = require('./internal/streams/readable')
+for (const key of ObjectKeys(streamReturningOperators)) {
+ const op = streamReturningOperators[key]
+ function fn(...args) {
+ if (new.target) {
+ throw ERR_ILLEGAL_CONSTRUCTOR()
+ }
+ return Stream.Readable.from(ReflectApply(op, this, args))
}
-
- Stream.call(this);
+ ObjectDefineProperty(fn, 'name', {
+ __proto__: null,
+ value: op.name
+ })
+ ObjectDefineProperty(fn, 'length', {
+ __proto__: null,
+ value: op.length
+ })
+ ObjectDefineProperty(Stream.Readable.prototype, key, {
+ __proto__: null,
+ value: fn,
+ enumerable: false,
+ configurable: true,
+ writable: true
+ })
}
-
-Object.defineProperty(Readable.prototype, 'destroyed', {
- get: function () {
- if (this._readableState === undefined) {
- return false;
- }
- return this._readableState.destroyed;
- },
- set: function (value) {
- // we ignore the value if the stream
- // has not been initialized yet
- if (!this._readableState) {
- return;
+for (const key of ObjectKeys(promiseReturningOperators)) {
+ const op = promiseReturningOperators[key]
+ function fn(...args) {
+ if (new.target) {
+ throw ERR_ILLEGAL_CONSTRUCTOR()
}
-
- // backward compatibility, the user is explicitly
- // managing destroyed
- this._readableState.destroyed = value;
+ return ReflectApply(op, this, args)
}
-});
+ ObjectDefineProperty(fn, 'name', {
+ __proto__: null,
+ value: op.name
+ })
+ ObjectDefineProperty(fn, 'length', {
+ __proto__: null,
+ value: op.length
+ })
+ ObjectDefineProperty(Stream.Readable.prototype, key, {
+ __proto__: null,
+ value: fn,
+ enumerable: false,
+ configurable: true,
+ writable: true
+ })
+}
+Stream.Writable = require('./internal/streams/writable')
+Stream.Duplex = require('./internal/streams/duplex')
+Stream.Transform = require('./internal/streams/transform')
+Stream.PassThrough = require('./internal/streams/passthrough')
+Stream.pipeline = pipeline
+const { addAbortSignal } = require('./internal/streams/add-abort-signal')
+Stream.addAbortSignal = addAbortSignal
+Stream.finished = eos
+Stream.destroy = destroyer
+Stream.compose = compose
+Stream.setDefaultHighWaterMark = setDefaultHighWaterMark
+Stream.getDefaultHighWaterMark = getDefaultHighWaterMark
+ObjectDefineProperty(Stream, 'promises', {
+ __proto__: null,
+ configurable: true,
+ enumerable: true,
+ get() {
+ return promises
+ }
+})
+ObjectDefineProperty(pipeline, customPromisify, {
+ __proto__: null,
+ enumerable: true,
+ get() {
+ return promises.pipeline
+ }
+})
+ObjectDefineProperty(eos, customPromisify, {
+ __proto__: null,
+ enumerable: true,
+ get() {
+ return promises.finished
+ }
+})
-Readable.prototype.destroy = destroyImpl.destroy;
-Readable.prototype._undestroy = destroyImpl.undestroy;
-Readable.prototype._destroy = function (err, cb) {
- this.push(null);
- cb(err);
-};
+// Backwards-compat with node 0.4.x
+Stream.Stream = Stream
+Stream._isUint8Array = function isUint8Array(value) {
+ return value instanceof Uint8Array
+}
+Stream._uint8ArrayToBuffer = function _uint8ArrayToBuffer(chunk) {
+ return Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength)
+}
-// Manually shove something into the read() buffer.
-// This returns true if the highWaterMark has not been hit yet,
-// similar to how Writable.write() returns true if you should
-// write() some more.
-Readable.prototype.push = function (chunk, encoding) {
- var state = this._readableState;
- var skipChunkCheck;
+},{"./internal/streams/add-abort-signal":130,"./internal/streams/compose":132,"./internal/streams/destroy":133,"./internal/streams/duplex":134,"./internal/streams/end-of-stream":136,"./internal/streams/legacy":138,"./internal/streams/operators":139,"./internal/streams/passthrough":140,"./internal/streams/pipeline":141,"./internal/streams/readable":142,"./internal/streams/state":143,"./internal/streams/transform":144,"./internal/streams/utils":145,"./internal/streams/writable":146,"./ours/errors":149,"./ours/primordials":150,"./ours/util":151,"./stream/promises":153,"buffer":120}],153:[function(require,module,exports){
+'use strict'
- if (!state.objectMode) {
- if (typeof chunk === 'string') {
- encoding = encoding || state.defaultEncoding;
- if (encoding !== state.encoding) {
- chunk = Buffer.from(chunk, encoding);
- encoding = '';
- }
- skipChunkCheck = true;
+const { ArrayPrototypePop, Promise } = require('../ours/primordials')
+const { isIterable, isNodeStream, isWebStream } = require('../internal/streams/utils')
+const { pipelineImpl: pl } = require('../internal/streams/pipeline')
+const { finished } = require('../internal/streams/end-of-stream')
+require('../../lib/stream.js')
+function pipeline(...streams) {
+ return new Promise((resolve, reject) => {
+ let signal
+ let end
+ const lastArg = streams[streams.length - 1]
+ if (
+ lastArg &&
+ typeof lastArg === 'object' &&
+ !isNodeStream(lastArg) &&
+ !isIterable(lastArg) &&
+ !isWebStream(lastArg)
+ ) {
+ const options = ArrayPrototypePop(streams)
+ signal = options.signal
+ end = options.end
}
- } else {
- skipChunkCheck = true;
- }
+ pl(
+ streams,
+ (err, value) => {
+ if (err) {
+ reject(err)
+ } else {
+ resolve(value)
+ }
+ },
+ {
+ signal,
+ end
+ }
+ )
+ })
+}
+module.exports = {
+ finished,
+ pipeline
+}
- return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
-};
+},{"../../lib/stream.js":152,"../internal/streams/end-of-stream":136,"../internal/streams/pipeline":141,"../internal/streams/utils":145,"../ours/primordials":150}],154:[function(require,module,exports){
+module.exports = stringify
+stringify.default = stringify
+stringify.stable = deterministicStringify
+stringify.stableStringify = deterministicStringify
-// Unshift should *always* be something directly out of read()
-Readable.prototype.unshift = function (chunk) {
- return readableAddChunk(this, chunk, null, true, false);
-};
+var arr = []
+var replacerStack = []
-function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
- var state = stream._readableState;
- if (chunk === null) {
- state.reading = false;
- onEofChunk(stream, state);
+// Regular stringify
+function stringify (obj, replacer, spacer) {
+ decirc(obj, '', [], undefined)
+ var res
+ if (replacerStack.length === 0) {
+ res = JSON.stringify(obj, replacer, spacer)
} else {
- var er;
- if (!skipChunkCheck) er = chunkInvalid(state, chunk);
- if (er) {
- stream.emit('error', er);
- } else if (state.objectMode || chunk && chunk.length > 0) {
- if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
- chunk = _uint8ArrayToBuffer(chunk);
- }
-
- if (addToFront) {
- if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
- } else if (state.ended) {
- stream.emit('error', new Error('stream.push() after EOF'));
- } else {
- state.reading = false;
- if (state.decoder && !encoding) {
- chunk = state.decoder.write(chunk);
- if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
+ res = JSON.stringify(obj, replaceGetterValues(replacer), spacer)
+ }
+ while (arr.length !== 0) {
+ var part = arr.pop()
+ if (part.length === 4) {
+ Object.defineProperty(part[0], part[1], part[3])
+ } else {
+ part[0][part[1]] = part[2]
+ }
+ }
+ return res
+}
+function decirc (val, k, stack, parent) {
+ var i
+ if (typeof val === 'object' && val !== null) {
+ for (i = 0; i < stack.length; i++) {
+ if (stack[i] === val) {
+ var propertyDescriptor = Object.getOwnPropertyDescriptor(parent, k)
+ if (propertyDescriptor.get !== undefined) {
+ if (propertyDescriptor.configurable) {
+ Object.defineProperty(parent, k, { value: '[Circular]' })
+ arr.push([parent, k, val, propertyDescriptor])
+ } else {
+ replacerStack.push([val, k])
+ }
} else {
- addChunk(stream, state, chunk, false);
+ parent[k] = '[Circular]'
+ arr.push([parent, k, val])
}
+ return
+ }
+ }
+ stack.push(val)
+ // Optimize for Arrays. Big arrays could kill the performance otherwise!
+ if (Array.isArray(val)) {
+ for (i = 0; i < val.length; i++) {
+ decirc(val[i], i, stack, val)
+ }
+ } else {
+ var keys = Object.keys(val)
+ for (i = 0; i < keys.length; i++) {
+ var key = keys[i]
+ decirc(val[key], key, stack, val)
}
- } else if (!addToFront) {
- state.reading = false;
}
+ stack.pop()
}
-
- return needMoreData(state);
}
-function addChunk(stream, state, chunk, addToFront) {
- if (state.flowing && state.length === 0 && !state.sync) {
- stream.emit('data', chunk);
- stream.read(0);
- } else {
- // update the buffer info.
- state.length += state.objectMode ? 1 : chunk.length;
- if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
-
- if (state.needReadable) emitReadable(stream);
+// Stable-stringify
+function compareFunction (a, b) {
+ if (a < b) {
+ return -1
}
- maybeReadMore(stream, state);
-}
-
-function chunkInvalid(state, chunk) {
- var er;
- if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
- er = new TypeError('Invalid non-string/buffer chunk');
+ if (a > b) {
+ return 1
}
- return er;
-}
-
-// if it's past the high water mark, we can push in some more.
-// Also, if we have no data yet, we can stand some
-// more bytes. This is to work around cases where hwm=0,
-// such as the repl. Also, if the push() triggered a
-// readable event, and the user called read(largeNumber) such that
-// needReadable was set, then we ought to push more, so that another
-// 'readable' event will be triggered.
-function needMoreData(state) {
- return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
+ return 0
}
-Readable.prototype.isPaused = function () {
- return this._readableState.flowing === false;
-};
-
-// backwards compatibility.
-Readable.prototype.setEncoding = function (enc) {
- if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
- this._readableState.decoder = new StringDecoder(enc);
- this._readableState.encoding = enc;
- return this;
-};
-
-// Don't raise the hwm > 8MB
-var MAX_HWM = 0x800000;
-function computeNewHighWaterMark(n) {
- if (n >= MAX_HWM) {
- n = MAX_HWM;
+function deterministicStringify (obj, replacer, spacer) {
+ var tmp = deterministicDecirc(obj, '', [], undefined) || obj
+ var res
+ if (replacerStack.length === 0) {
+ res = JSON.stringify(tmp, replacer, spacer)
} else {
- // Get the next highest power of 2 to prevent increasing hwm excessively in
- // tiny amounts
- n--;
- n |= n >>> 1;
- n |= n >>> 2;
- n |= n >>> 4;
- n |= n >>> 8;
- n |= n >>> 16;
- n++;
+ res = JSON.stringify(tmp, replaceGetterValues(replacer), spacer)
}
- return n;
+ while (arr.length !== 0) {
+ var part = arr.pop()
+ if (part.length === 4) {
+ Object.defineProperty(part[0], part[1], part[3])
+ } else {
+ part[0][part[1]] = part[2]
+ }
+ }
+ return res
}
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function howMuchToRead(n, state) {
- if (n <= 0 || state.length === 0 && state.ended) return 0;
- if (state.objectMode) return 1;
- if (n !== n) {
- // Only flow one buffer at a time
- if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+function deterministicDecirc (val, k, stack, parent) {
+ var i
+ if (typeof val === 'object' && val !== null) {
+ for (i = 0; i < stack.length; i++) {
+ if (stack[i] === val) {
+ var propertyDescriptor = Object.getOwnPropertyDescriptor(parent, k)
+ if (propertyDescriptor.get !== undefined) {
+ if (propertyDescriptor.configurable) {
+ Object.defineProperty(parent, k, { value: '[Circular]' })
+ arr.push([parent, k, val, propertyDescriptor])
+ } else {
+ replacerStack.push([val, k])
+ }
+ } else {
+ parent[k] = '[Circular]'
+ arr.push([parent, k, val])
+ }
+ return
+ }
+ }
+ if (typeof val.toJSON === 'function') {
+ return
+ }
+ stack.push(val)
+ // Optimize for Arrays. Big arrays could kill the performance otherwise!
+ if (Array.isArray(val)) {
+ for (i = 0; i < val.length; i++) {
+ deterministicDecirc(val[i], i, stack, val)
+ }
+ } else {
+ // Create a temporary object in the required way
+ var tmp = {}
+ var keys = Object.keys(val).sort(compareFunction)
+ for (i = 0; i < keys.length; i++) {
+ var key = keys[i]
+ deterministicDecirc(val[key], key, stack, val)
+ tmp[key] = val[key]
+ }
+ if (parent !== undefined) {
+ arr.push([parent, k, val])
+ parent[k] = tmp
+ } else {
+ return tmp
+ }
+ }
+ stack.pop()
}
- // If we're asking for more than the current hwm, then raise the hwm.
- if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
- if (n <= state.length) return n;
- // Don't have enough
- if (!state.ended) {
- state.needReadable = true;
- return 0;
+}
+
+// wraps replacer function to handle values we couldn't replace
+// and mark them as [Circular]
+function replaceGetterValues (replacer) {
+ replacer = replacer !== undefined ? replacer : function (k, v) { return v }
+ return function (key, val) {
+ if (replacerStack.length > 0) {
+ for (var i = 0; i < replacerStack.length; i++) {
+ var part = replacerStack[i]
+ if (part[1] === key && part[0] === val) {
+ val = '[Circular]'
+ replacerStack.splice(i, 1)
+ break
+ }
+ }
+ }
+ return replacer.call(this, key, val)
}
- return state.length;
}
-// you can override either this method, or the async _read(n) below.
-Readable.prototype.read = function (n) {
- debug('read', n);
- n = parseInt(n, 10);
- var state = this._readableState;
- var nOrig = n;
+},{}],155:[function(require,module,exports){
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */
+exports.read = function (buffer, offset, isLE, mLen, nBytes) {
+ var e, m
+ var eLen = (nBytes * 8) - mLen - 1
+ var eMax = (1 << eLen) - 1
+ var eBias = eMax >> 1
+ var nBits = -7
+ var i = isLE ? (nBytes - 1) : 0
+ var d = isLE ? -1 : 1
+ var s = buffer[offset + i]
- if (n !== 0) state.emittedReadable = false;
+ i += d
- // if we're doing read(0) to trigger a readable event, but we
- // already have a bunch of data in the buffer, then just trigger
- // the 'readable' event and move on.
- if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
- debug('read: emitReadable', state.length, state.ended);
- if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
- return null;
- }
+ e = s & ((1 << (-nBits)) - 1)
+ s >>= (-nBits)
+ nBits += eLen
+ for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
- n = howMuchToRead(n, state);
+ m = e & ((1 << (-nBits)) - 1)
+ e >>= (-nBits)
+ nBits += mLen
+ for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
- // if we've ended, and we're now clear, then finish it up.
- if (n === 0 && state.ended) {
- if (state.length === 0) endReadable(this);
- return null;
+ if (e === 0) {
+ e = 1 - eBias
+ } else if (e === eMax) {
+ return m ? NaN : ((s ? -1 : 1) * Infinity)
+ } else {
+ m = m + Math.pow(2, mLen)
+ e = e - eBias
}
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
+}
- // All the actual chunk generation logic needs to be
- // *below* the call to _read. The reason is that in certain
- // synthetic stream cases, such as passthrough streams, _read
- // may be a completely synchronous operation which may change
- // the state of the read buffer, providing enough data when
- // before there was *not* enough.
- //
- // So, the steps are:
- // 1. Figure out what the state of things will be after we do
- // a read from the buffer.
- //
- // 2. If that resulting state will trigger a _read, then call _read.
- // Note that this may be asynchronous, or synchronous. Yes, it is
- // deeply ugly to write APIs this way, but that still doesn't mean
- // that the Readable class should behave improperly, as streams are
- // designed to be sync/async agnostic.
- // Take note if the _read call is sync or async (ie, if the read call
- // has returned yet), so that we know whether or not it's safe to emit
- // 'readable' etc.
- //
- // 3. Actually pull the requested chunks out of the buffer and return.
+exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
+ var e, m, c
+ var eLen = (nBytes * 8) - mLen - 1
+ var eMax = (1 << eLen) - 1
+ var eBias = eMax >> 1
+ var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
+ var i = isLE ? 0 : (nBytes - 1)
+ var d = isLE ? 1 : -1
+ var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
- // if we need a readable event, then we need to do some reading.
- var doRead = state.needReadable;
- debug('need readable', doRead);
+ value = Math.abs(value)
- // if we currently have less than the highWaterMark, then also read some
- if (state.length === 0 || state.length - n < state.highWaterMark) {
- doRead = true;
- debug('length less than watermark', doRead);
- }
+ if (isNaN(value) || value === Infinity) {
+ m = isNaN(value) ? 1 : 0
+ e = eMax
+ } else {
+ e = Math.floor(Math.log(value) / Math.LN2)
+ if (value * (c = Math.pow(2, -e)) < 1) {
+ e--
+ c *= 2
+ }
+ if (e + eBias >= 1) {
+ value += rt / c
+ } else {
+ value += rt * Math.pow(2, 1 - eBias)
+ }
+ if (value * c >= 2) {
+ e++
+ c /= 2
+ }
- // however, if we've ended, then there's no point, and if we're already
- // reading, then it's unnecessary.
- if (state.ended || state.reading) {
- doRead = false;
- debug('reading or ended', doRead);
- } else if (doRead) {
- debug('do read');
- state.reading = true;
- state.sync = true;
- // if the length is currently zero, then we *need* a readable event.
- if (state.length === 0) state.needReadable = true;
- // call internal read method
- this._read(state.highWaterMark);
- state.sync = false;
- // If _read pushed data synchronously, then `reading` will be false,
- // and we need to re-evaluate how much data we can return to the user.
- if (!state.reading) n = howMuchToRead(nOrig, state);
+ if (e + eBias >= eMax) {
+ m = 0
+ e = eMax
+ } else if (e + eBias >= 1) {
+ m = ((value * c) - 1) * Math.pow(2, mLen)
+ e = e + eBias
+ } else {
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
+ e = 0
+ }
}
- var ret;
- if (n > 0) ret = fromList(n, state);else ret = null;
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
- if (ret === null) {
- state.needReadable = true;
- n = 0;
- } else {
- state.length -= n;
- }
+ e = (e << mLen) | m
+ eLen += mLen
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
- if (state.length === 0) {
- // If we have nothing in the buffer, then we want to know
- // as soon as we *do* get something into the buffer.
- if (!state.ended) state.needReadable = true;
+ buffer[offset + i - d] |= s * 128
+}
- // If we tried to read() past the EOF, then emit end on the next tick.
- if (nOrig !== n && state.ended) endReadable(this);
+},{}],156:[function(require,module,exports){
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ var TempCtor = function () {}
+ TempCtor.prototype = superCtor.prototype
+ ctor.prototype = new TempCtor()
+ ctor.prototype.constructor = ctor
}
+}
- if (ret !== null) this.emit('data', ret);
+},{}],157:[function(require,module,exports){
+'use strict';
+var toString = Object.prototype.toString;
- return ret;
+module.exports = function (x) {
+ return toString.call(x) === '[object Function]';
};
-function onEofChunk(stream, state) {
- if (state.ended) return;
- if (state.decoder) {
- var chunk = state.decoder.end();
- if (chunk && chunk.length) {
- state.buffer.push(chunk);
- state.length += state.objectMode ? 1 : chunk.length;
- }
+},{}],158:[function(require,module,exports){
+/**
+ * Returns a `Boolean` on whether or not the a `String` starts with '0x'
+ * @param {String} str the string input value
+ * @return {Boolean} a boolean if it is or is not hex prefixed
+ * @throws if the str input is not a string
+ */
+module.exports = function isHexPrefixed(str) {
+ if (typeof str !== 'string') {
+ throw new Error("[is-hex-prefixed] value must be type 'string', is currently type " + (typeof str) + ", while checking isHexPrefixed.");
}
- state.ended = true;
- // emit 'readable' now to make sure it gets picked up.
- emitReadable(stream);
-}
-
-// Don't emit readable right away in sync mode, because this can trigger
-// another read() call => stack overflow. This way, it might trigger
-// a nextTick recursion warning, but that's not so bad.
-function emitReadable(stream) {
- var state = stream._readableState;
- state.needReadable = false;
- if (!state.emittedReadable) {
- debug('emitReadable', state.flowing);
- state.emittedReadable = true;
- if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
- }
+ return str.slice(0, 2) === '0x';
}
-function emitReadable_(stream) {
- debug('emit readable');
- stream.emit('readable');
- flow(stream);
-}
+},{}],159:[function(require,module,exports){
+'use strict';
-// at this point, the user has presumably seen the 'readable' event,
-// and called read() to consume some data. that may have triggered
-// in turn another _read(n) call, in which case reading = true if
-// it's in progress.
-// However, if we're not ended, or reading, and the length < hwm,
-// then go ahead and try to read some more preemptively.
-function maybeReadMore(stream, state) {
- if (!state.readingMore) {
- state.readingMore = true;
- pna.nextTick(maybeReadMore_, stream, state);
- }
-}
+const isStream = stream =>
+ stream !== null &&
+ typeof stream === 'object' &&
+ typeof stream.pipe === 'function';
-function maybeReadMore_(stream, state) {
- var len = state.length;
- while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
- debug('maybeReadMore read 0');
- stream.read(0);
- if (len === state.length)
- // didn't get any data, stop spinning.
- break;else len = state.length;
- }
- state.readingMore = false;
-}
+isStream.writable = stream =>
+ isStream(stream) &&
+ stream.writable !== false &&
+ typeof stream._write === 'function' &&
+ typeof stream._writableState === 'object';
-// abstract method. to be overridden in specific implementation classes.
-// call cb(er, data) where data is <= n in length.
-// for virtual (non-string, non-buffer) streams, "length" is somewhat
-// arbitrary, and perhaps not very meaningful.
-Readable.prototype._read = function (n) {
- this.emit('error', new Error('_read() is not implemented'));
-};
+isStream.readable = stream =>
+ isStream(stream) &&
+ stream.readable !== false &&
+ typeof stream._read === 'function' &&
+ typeof stream._readableState === 'object';
-Readable.prototype.pipe = function (dest, pipeOpts) {
- var src = this;
- var state = this._readableState;
+isStream.duplex = stream =>
+ isStream.writable(stream) &&
+ isStream.readable(stream);
- switch (state.pipesCount) {
- case 0:
- state.pipes = dest;
- break;
- case 1:
- state.pipes = [state.pipes, dest];
- break;
- default:
- state.pipes.push(dest);
- break;
- }
- state.pipesCount += 1;
- debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+isStream.transform = stream =>
+ isStream.duplex(stream) &&
+ typeof stream._transform === 'function' &&
+ typeof stream._transformState === 'object';
- var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+module.exports = isStream;
- var endFn = doEnd ? onend : unpipe;
- if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);
+},{}],160:[function(require,module,exports){
+(function (process,global){(function (){
+/**
+ * [js-sha3]{@link https://github.com/emn178/js-sha3}
+ *
+ * @version 0.5.5
+ * @author Chen, Yi-Cyuan [emn178@gmail.com]
+ * @copyright Chen, Yi-Cyuan 2015-2016
+ * @license MIT
+ */
+(function (root) {
+ 'use strict';
+
+ var NODE_JS = typeof process == 'object' && process.versions && process.versions.node;
+ if (NODE_JS) {
+ root = global;
+ }
+ var COMMON_JS = !root.JS_SHA3_TEST && typeof module == 'object' && module.exports;
+ var HEX_CHARS = '0123456789abcdef'.split('');
+ var SHAKE_PADDING = [31, 7936, 2031616, 520093696];
+ var KECCAK_PADDING = [1, 256, 65536, 16777216];
+ var PADDING = [6, 1536, 393216, 100663296];
+ var SHIFT = [0, 8, 16, 24];
+ var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649,
+ 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0,
+ 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771,
+ 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648,
+ 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];
+ var BITS = [224, 256, 384, 512];
+ var SHAKE_BITS = [128, 256];
+ var OUTPUT_TYPES = ['hex', 'buffer', 'arrayBuffer', 'array'];
+
+ var createOutputMethod = function (bits, padding, outputType) {
+ return function (message) {
+ return new Keccak(bits, padding, bits).update(message)[outputType]();
+ }
+ };
+
+ var createShakeOutputMethod = function (bits, padding, outputType) {
+ return function (message, outputBits) {
+ return new Keccak(bits, padding, outputBits).update(message)[outputType]();
+ }
+ };
+
+ var createMethod = function (bits, padding) {
+ var method = createOutputMethod(bits, padding, 'hex');
+ method.create = function () {
+ return new Keccak(bits, padding, bits);
+ };
+ method.update = function (message) {
+ return method.create().update(message);
+ };
+ for (var i = 0;i < OUTPUT_TYPES.length;++i) {
+ var type = OUTPUT_TYPES[i];
+ method[type] = createOutputMethod(bits, padding, type);
+ }
+ return method;
+ };
+
+ var createShakeMethod = function (bits, padding) {
+ var method = createShakeOutputMethod(bits, padding, 'hex');
+ method.create = function (outputBits) {
+ return new Keccak(bits, padding, outputBits);
+ };
+ method.update = function (message, outputBits) {
+ return method.create(outputBits).update(message);
+ };
+ for (var i = 0;i < OUTPUT_TYPES.length;++i) {
+ var type = OUTPUT_TYPES[i];
+ method[type] = createShakeOutputMethod(bits, padding, type);
+ }
+ return method;
+ };
+
+ var algorithms = [
+ {name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod},
+ {name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod},
+ {name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod}
+ ];
+
+ var methods = {};
+
+ for (var i = 0;i < algorithms.length;++i) {
+ var algorithm = algorithms[i];
+ var bits = algorithm.bits;
+ for (var j = 0;j < bits.length;++j) {
+ methods[algorithm.name +'_' + bits[j]] = algorithm.createMethod(bits[j], algorithm.padding);
+ }
+ }
+
+ function Keccak(bits, padding, outputBits) {
+ this.blocks = [];
+ this.s = [];
+ this.padding = padding;
+ this.outputBits = outputBits;
+ this.reset = true;
+ this.block = 0;
+ this.start = 0;
+ this.blockCount = (1600 - (bits << 1)) >> 5;
+ this.byteCount = this.blockCount << 2;
+ this.outputBlocks = outputBits >> 5;
+ this.extraBytes = (outputBits & 31) >> 3;
+
+ for (var i = 0;i < 50;++i) {
+ this.s[i] = 0;
+ }
+ };
+
+ Keccak.prototype.update = function (message) {
+ var notString = typeof message != 'string';
+ if (notString && message.constructor == root.ArrayBuffer) {
+ message = new Uint8Array(message);
+ }
+ var length = message.length, blocks = this.blocks, byteCount = this.byteCount,
+ blockCount = this.blockCount, index = 0, s = this.s, i, code;
+
+ while (index < length) {
+ if (this.reset) {
+ this.reset = false;
+ blocks[0] = this.block;
+ for (i = 1;i < blockCount + 1;++i) {
+ blocks[i] = 0;
+ }
+ }
+ if (notString) {
+ for (i = this.start;index < length && i < byteCount;++index) {
+ blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];
+ }
+ } else {
+ for (i = this.start;index < length && i < byteCount;++index) {
+ code = message.charCodeAt(index);
+ if (code < 0x80) {
+ blocks[i >> 2] |= code << SHIFT[i++ & 3];
+ } else if (code < 0x800) {
+ blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+ } else if (code < 0xd800 || code >= 0xe000) {
+ blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+ } else {
+ code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));
+ blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];
+ blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];
+ }
+ }
+ }
+ this.lastByteIndex = i;
+ if (i >= byteCount) {
+ this.start = i - byteCount;
+ this.block = blocks[blockCount];
+ for (i = 0;i < blockCount;++i) {
+ s[i] ^= blocks[i];
+ }
+ f(s);
+ this.reset = true;
+ } else {
+ this.start = i;
+ }
+ }
+ return this;
+ };
+
+ Keccak.prototype.finalize = function () {
+ var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s;
+ blocks[i >> 2] |= this.padding[i & 3];
+ if (this.lastByteIndex == this.byteCount) {
+ blocks[0] = blocks[blockCount];
+ for (i = 1;i < blockCount + 1;++i) {
+ blocks[i] = 0;
+ }
+ }
+ blocks[blockCount - 1] |= 0x80000000;
+ for (i = 0;i < blockCount;++i) {
+ s[i] ^= blocks[i];
+ }
+ f(s);
+ };
+
+ Keccak.prototype.toString = Keccak.prototype.hex = function () {
+ this.finalize();
+
+ var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
+ extraBytes = this.extraBytes, i = 0, j = 0;
+ var hex = '', block;
+ while (j < outputBlocks) {
+ for (i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
+ block = s[i];
+ hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] +
+ HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] +
+ HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] +
+ HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F];
+ }
+ if (j % blockCount == 0) {
+ f(s);
+ i = 0;
+ }
+ }
+ if (extraBytes) {
+ block = s[i];
+ if (extraBytes > 0) {
+ hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F];
+ }
+ if (extraBytes > 1) {
+ hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F];
+ }
+ if (extraBytes > 2) {
+ hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F];
+ }
+ }
+ return hex;
+ };
+
+ Keccak.prototype.arrayBuffer = function () {
+ this.finalize();
+
+ var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
+ extraBytes = this.extraBytes, i = 0, j = 0;
+ var bytes = this.outputBits >> 3;
+ var buffer;
+ if (extraBytes) {
+ buffer = new ArrayBuffer((outputBlocks + 1) << 2);
+ } else {
+ buffer = new ArrayBuffer(bytes);
+ }
+ var array = new Uint32Array(buffer);
+ while (j < outputBlocks) {
+ for (i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
+ array[j] = s[i];
+ }
+ if (j % blockCount == 0) {
+ f(s);
+ }
+ }
+ if (extraBytes) {
+ array[i] = s[i];
+ buffer = buffer.slice(0, bytes);
+ }
+ return buffer;
+ };
+
+ Keccak.prototype.buffer = Keccak.prototype.arrayBuffer;
+
+ Keccak.prototype.digest = Keccak.prototype.array = function () {
+ this.finalize();
+
+ var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks,
+ extraBytes = this.extraBytes, i = 0, j = 0;
+ var array = [], offset, block;
+ while (j < outputBlocks) {
+ for (i = 0;i < blockCount && j < outputBlocks;++i, ++j) {
+ offset = j << 2;
+ block = s[i];
+ array[offset] = block & 0xFF;
+ array[offset + 1] = (block >> 8) & 0xFF;
+ array[offset + 2] = (block >> 16) & 0xFF;
+ array[offset + 3] = (block >> 24) & 0xFF;
+ }
+ if (j % blockCount == 0) {
+ f(s);
+ }
+ }
+ if (extraBytes) {
+ offset = j << 2;
+ block = s[i];
+ if (extraBytes > 0) {
+ array[offset] = block & 0xFF;
+ }
+ if (extraBytes > 1) {
+ array[offset + 1] = (block >> 8) & 0xFF;
+ }
+ if (extraBytes > 2) {
+ array[offset + 2] = (block >> 16) & 0xFF;
+ }
+ }
+ return array;
+ };
+
+ var f = function (s) {
+ var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9,
+ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17,
+ b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33,
+ b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49;
+ for (n = 0;n < 48;n += 2) {
+ c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];
+ c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];
+ c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];
+ c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];
+ c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];
+ c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];
+ c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];
+ c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];
+ c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];
+ c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
+
+ h = c8 ^ ((c2 << 1) | (c3 >>> 31));
+ l = c9 ^ ((c3 << 1) | (c2 >>> 31));
+ s[0] ^= h;
+ s[1] ^= l;
+ s[10] ^= h;
+ s[11] ^= l;
+ s[20] ^= h;
+ s[21] ^= l;
+ s[30] ^= h;
+ s[31] ^= l;
+ s[40] ^= h;
+ s[41] ^= l;
+ h = c0 ^ ((c4 << 1) | (c5 >>> 31));
+ l = c1 ^ ((c5 << 1) | (c4 >>> 31));
+ s[2] ^= h;
+ s[3] ^= l;
+ s[12] ^= h;
+ s[13] ^= l;
+ s[22] ^= h;
+ s[23] ^= l;
+ s[32] ^= h;
+ s[33] ^= l;
+ s[42] ^= h;
+ s[43] ^= l;
+ h = c2 ^ ((c6 << 1) | (c7 >>> 31));
+ l = c3 ^ ((c7 << 1) | (c6 >>> 31));
+ s[4] ^= h;
+ s[5] ^= l;
+ s[14] ^= h;
+ s[15] ^= l;
+ s[24] ^= h;
+ s[25] ^= l;
+ s[34] ^= h;
+ s[35] ^= l;
+ s[44] ^= h;
+ s[45] ^= l;
+ h = c4 ^ ((c8 << 1) | (c9 >>> 31));
+ l = c5 ^ ((c9 << 1) | (c8 >>> 31));
+ s[6] ^= h;
+ s[7] ^= l;
+ s[16] ^= h;
+ s[17] ^= l;
+ s[26] ^= h;
+ s[27] ^= l;
+ s[36] ^= h;
+ s[37] ^= l;
+ s[46] ^= h;
+ s[47] ^= l;
+ h = c6 ^ ((c0 << 1) | (c1 >>> 31));
+ l = c7 ^ ((c1 << 1) | (c0 >>> 31));
+ s[8] ^= h;
+ s[9] ^= l;
+ s[18] ^= h;
+ s[19] ^= l;
+ s[28] ^= h;
+ s[29] ^= l;
+ s[38] ^= h;
+ s[39] ^= l;
+ s[48] ^= h;
+ s[49] ^= l;
+
+ b0 = s[0];
+ b1 = s[1];
+ b32 = (s[11] << 4) | (s[10] >>> 28);
+ b33 = (s[10] << 4) | (s[11] >>> 28);
+ b14 = (s[20] << 3) | (s[21] >>> 29);
+ b15 = (s[21] << 3) | (s[20] >>> 29);
+ b46 = (s[31] << 9) | (s[30] >>> 23);
+ b47 = (s[30] << 9) | (s[31] >>> 23);
+ b28 = (s[40] << 18) | (s[41] >>> 14);
+ b29 = (s[41] << 18) | (s[40] >>> 14);
+ b20 = (s[2] << 1) | (s[3] >>> 31);
+ b21 = (s[3] << 1) | (s[2] >>> 31);
+ b2 = (s[13] << 12) | (s[12] >>> 20);
+ b3 = (s[12] << 12) | (s[13] >>> 20);
+ b34 = (s[22] << 10) | (s[23] >>> 22);
+ b35 = (s[23] << 10) | (s[22] >>> 22);
+ b16 = (s[33] << 13) | (s[32] >>> 19);
+ b17 = (s[32] << 13) | (s[33] >>> 19);
+ b48 = (s[42] << 2) | (s[43] >>> 30);
+ b49 = (s[43] << 2) | (s[42] >>> 30);
+ b40 = (s[5] << 30) | (s[4] >>> 2);
+ b41 = (s[4] << 30) | (s[5] >>> 2);
+ b22 = (s[14] << 6) | (s[15] >>> 26);
+ b23 = (s[15] << 6) | (s[14] >>> 26);
+ b4 = (s[25] << 11) | (s[24] >>> 21);
+ b5 = (s[24] << 11) | (s[25] >>> 21);
+ b36 = (s[34] << 15) | (s[35] >>> 17);
+ b37 = (s[35] << 15) | (s[34] >>> 17);
+ b18 = (s[45] << 29) | (s[44] >>> 3);
+ b19 = (s[44] << 29) | (s[45] >>> 3);
+ b10 = (s[6] << 28) | (s[7] >>> 4);
+ b11 = (s[7] << 28) | (s[6] >>> 4);
+ b42 = (s[17] << 23) | (s[16] >>> 9);
+ b43 = (s[16] << 23) | (s[17] >>> 9);
+ b24 = (s[26] << 25) | (s[27] >>> 7);
+ b25 = (s[27] << 25) | (s[26] >>> 7);
+ b6 = (s[36] << 21) | (s[37] >>> 11);
+ b7 = (s[37] << 21) | (s[36] >>> 11);
+ b38 = (s[47] << 24) | (s[46] >>> 8);
+ b39 = (s[46] << 24) | (s[47] >>> 8);
+ b30 = (s[8] << 27) | (s[9] >>> 5);
+ b31 = (s[9] << 27) | (s[8] >>> 5);
+ b12 = (s[18] << 20) | (s[19] >>> 12);
+ b13 = (s[19] << 20) | (s[18] >>> 12);
+ b44 = (s[29] << 7) | (s[28] >>> 25);
+ b45 = (s[28] << 7) | (s[29] >>> 25);
+ b26 = (s[38] << 8) | (s[39] >>> 24);
+ b27 = (s[39] << 8) | (s[38] >>> 24);
+ b8 = (s[48] << 14) | (s[49] >>> 18);
+ b9 = (s[49] << 14) | (s[48] >>> 18);
+
+ s[0] = b0 ^ (~b2 & b4);
+ s[1] = b1 ^ (~b3 & b5);
+ s[10] = b10 ^ (~b12 & b14);
+ s[11] = b11 ^ (~b13 & b15);
+ s[20] = b20 ^ (~b22 & b24);
+ s[21] = b21 ^ (~b23 & b25);
+ s[30] = b30 ^ (~b32 & b34);
+ s[31] = b31 ^ (~b33 & b35);
+ s[40] = b40 ^ (~b42 & b44);
+ s[41] = b41 ^ (~b43 & b45);
+ s[2] = b2 ^ (~b4 & b6);
+ s[3] = b3 ^ (~b5 & b7);
+ s[12] = b12 ^ (~b14 & b16);
+ s[13] = b13 ^ (~b15 & b17);
+ s[22] = b22 ^ (~b24 & b26);
+ s[23] = b23 ^ (~b25 & b27);
+ s[32] = b32 ^ (~b34 & b36);
+ s[33] = b33 ^ (~b35 & b37);
+ s[42] = b42 ^ (~b44 & b46);
+ s[43] = b43 ^ (~b45 & b47);
+ s[4] = b4 ^ (~b6 & b8);
+ s[5] = b5 ^ (~b7 & b9);
+ s[14] = b14 ^ (~b16 & b18);
+ s[15] = b15 ^ (~b17 & b19);
+ s[24] = b24 ^ (~b26 & b28);
+ s[25] = b25 ^ (~b27 & b29);
+ s[34] = b34 ^ (~b36 & b38);
+ s[35] = b35 ^ (~b37 & b39);
+ s[44] = b44 ^ (~b46 & b48);
+ s[45] = b45 ^ (~b47 & b49);
+ s[6] = b6 ^ (~b8 & b0);
+ s[7] = b7 ^ (~b9 & b1);
+ s[16] = b16 ^ (~b18 & b10);
+ s[17] = b17 ^ (~b19 & b11);
+ s[26] = b26 ^ (~b28 & b20);
+ s[27] = b27 ^ (~b29 & b21);
+ s[36] = b36 ^ (~b38 & b30);
+ s[37] = b37 ^ (~b39 & b31);
+ s[46] = b46 ^ (~b48 & b40);
+ s[47] = b47 ^ (~b49 & b41);
+ s[8] = b8 ^ (~b0 & b2);
+ s[9] = b9 ^ (~b1 & b3);
+ s[18] = b18 ^ (~b10 & b12);
+ s[19] = b19 ^ (~b11 & b13);
+ s[28] = b28 ^ (~b20 & b22);
+ s[29] = b29 ^ (~b21 & b23);
+ s[38] = b38 ^ (~b30 & b32);
+ s[39] = b39 ^ (~b31 & b33);
+ s[48] = b48 ^ (~b40 & b42);
+ s[49] = b49 ^ (~b41 & b43);
+
+ s[0] ^= RC[n];
+ s[1] ^= RC[n + 1];
+ }
+ }
+
+ if (COMMON_JS) {
+ module.exports = methods;
+ } else if (root) {
+ for (var key in methods) {
+ root[key] = methods[key];
+ }
+ }
+}(this));
- dest.on('unpipe', onunpipe);
- function onunpipe(readable, unpipeInfo) {
- debug('onunpipe');
- if (readable === src) {
- if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
- unpipeInfo.hasUnpiped = true;
- cleanup();
- }
- }
- }
+}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"_process":168}],161:[function(require,module,exports){
+/**
+ * Helpers.
+ */
- function onend() {
- debug('onend');
- dest.end();
- }
+var s = 1000;
+var m = s * 60;
+var h = m * 60;
+var d = h * 24;
+var w = d * 7;
+var y = d * 365.25;
- // when the dest drains, it reduces the awaitDrain counter
- // on the source. This would be more elegant with a .once()
- // handler in flow(), but adding and removing repeatedly is
- // too slow.
- var ondrain = pipeOnDrain(src);
- dest.on('drain', ondrain);
+/**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} [options]
+ * @throws {Error} throw an error if val is not a non-empty string or a number
+ * @return {String|Number}
+ * @api public
+ */
- var cleanedUp = false;
- function cleanup() {
- debug('cleanup');
- // cleanup event handlers once the pipe is broken
- dest.removeListener('close', onclose);
- dest.removeListener('finish', onfinish);
- dest.removeListener('drain', ondrain);
- dest.removeListener('error', onerror);
- dest.removeListener('unpipe', onunpipe);
- src.removeListener('end', onend);
- src.removeListener('end', unpipe);
- src.removeListener('data', ondata);
+module.exports = function(val, options) {
+ options = options || {};
+ var type = typeof val;
+ if (type === 'string' && val.length > 0) {
+ return parse(val);
+ } else if (type === 'number' && isFinite(val)) {
+ return options.long ? fmtLong(val) : fmtShort(val);
+ }
+ throw new Error(
+ 'val is not a non-empty string or a valid number. val=' +
+ JSON.stringify(val)
+ );
+};
- cleanedUp = true;
+/**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
+ */
- // if the reader is waiting for a drain event from this
- // specific writer, then it would cause it to never start
- // flowing again.
- // So, if this is awaiting a drain, then we just call it now.
- // If we don't know, then assume that we are waiting for one.
- if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+function parse(str) {
+ str = String(str);
+ if (str.length > 100) {
+ return;
}
-
- // If the user pushes more data while we're writing to dest then we'll end up
- // in ondata again. However, we only want to increase awaitDrain once because
- // dest will only emit one 'drain' event for the multiple writes.
- // => Introduce a guard on increasing awaitDrain.
- var increasedAwaitDrain = false;
- src.on('data', ondata);
- function ondata(chunk) {
- debug('ondata');
- increasedAwaitDrain = false;
- var ret = dest.write(chunk);
- if (false === ret && !increasedAwaitDrain) {
- // If the user unpiped during `dest.write()`, it is possible
- // to get stuck in a permanently paused state if that write
- // also returned false.
- // => Check whether `dest` is still a piping destination.
- if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
- debug('false write response, pause', state.awaitDrain);
- state.awaitDrain++;
- increasedAwaitDrain = true;
- }
- src.pause();
- }
+ var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
+ str
+ );
+ if (!match) {
+ return;
}
-
- // if the dest has an error, then stop piping into it.
- // however, don't suppress the throwing behavior for this.
- function onerror(er) {
- debug('onerror', er);
- unpipe();
- dest.removeListener('error', onerror);
- if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
+ var n = parseFloat(match[1]);
+ var type = (match[2] || 'ms').toLowerCase();
+ switch (type) {
+ case 'years':
+ case 'year':
+ case 'yrs':
+ case 'yr':
+ case 'y':
+ return n * y;
+ case 'weeks':
+ case 'week':
+ case 'w':
+ return n * w;
+ case 'days':
+ case 'day':
+ case 'd':
+ return n * d;
+ case 'hours':
+ case 'hour':
+ case 'hrs':
+ case 'hr':
+ case 'h':
+ return n * h;
+ case 'minutes':
+ case 'minute':
+ case 'mins':
+ case 'min':
+ case 'm':
+ return n * m;
+ case 'seconds':
+ case 'second':
+ case 'secs':
+ case 'sec':
+ case 's':
+ return n * s;
+ case 'milliseconds':
+ case 'millisecond':
+ case 'msecs':
+ case 'msec':
+ case 'ms':
+ return n;
+ default:
+ return undefined;
}
+}
- // Make sure our error handler is attached before userland ones.
- prependListener(dest, 'error', onerror);
+/**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
- // Both close and finish should trigger unpipe, but only once.
- function onclose() {
- dest.removeListener('finish', onfinish);
- unpipe();
+function fmtShort(ms) {
+ var msAbs = Math.abs(ms);
+ if (msAbs >= d) {
+ return Math.round(ms / d) + 'd';
}
- dest.once('close', onclose);
- function onfinish() {
- debug('onfinish');
- dest.removeListener('close', onclose);
- unpipe();
+ if (msAbs >= h) {
+ return Math.round(ms / h) + 'h';
}
- dest.once('finish', onfinish);
-
- function unpipe() {
- debug('unpipe');
- src.unpipe(dest);
+ if (msAbs >= m) {
+ return Math.round(ms / m) + 'm';
}
-
- // tell the dest that it's being piped to
- dest.emit('pipe', src);
-
- // start the flow if it hasn't been started already.
- if (!state.flowing) {
- debug('pipe resume');
- src.resume();
+ if (msAbs >= s) {
+ return Math.round(ms / s) + 's';
}
-
- return dest;
-};
-
-function pipeOnDrain(src) {
- return function () {
- var state = src._readableState;
- debug('pipeOnDrain', state.awaitDrain);
- if (state.awaitDrain) state.awaitDrain--;
- if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
- state.flowing = true;
- flow(src);
- }
- };
+ return ms + 'ms';
}
-Readable.prototype.unpipe = function (dest) {
- var state = this._readableState;
- var unpipeInfo = { hasUnpiped: false };
-
- // if we're not piping anywhere, then do nothing.
- if (state.pipesCount === 0) return this;
-
- // just one destination. most common case.
- if (state.pipesCount === 1) {
- // passed in one, but it's not the right one.
- if (dest && dest !== state.pipes) return this;
-
- if (!dest) dest = state.pipes;
+/**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
- // got a match.
- state.pipes = null;
- state.pipesCount = 0;
- state.flowing = false;
- if (dest) dest.emit('unpipe', this, unpipeInfo);
- return this;
+function fmtLong(ms) {
+ var msAbs = Math.abs(ms);
+ if (msAbs >= d) {
+ return plural(ms, msAbs, d, 'day');
}
-
- // slow case. multiple pipe destinations.
-
- if (!dest) {
- // remove all.
- var dests = state.pipes;
- var len = state.pipesCount;
- state.pipes = null;
- state.pipesCount = 0;
- state.flowing = false;
-
- for (var i = 0; i < len; i++) {
- dests[i].emit('unpipe', this, { hasUnpiped: false });
- }return this;
+ if (msAbs >= h) {
+ return plural(ms, msAbs, h, 'hour');
+ }
+ if (msAbs >= m) {
+ return plural(ms, msAbs, m, 'minute');
+ }
+ if (msAbs >= s) {
+ return plural(ms, msAbs, s, 'second');
}
+ return ms + ' ms';
+}
- // try to find the right one.
- var index = indexOf(state.pipes, dest);
- if (index === -1) return this;
+/**
+ * Pluralization helper.
+ */
- state.pipes.splice(index, 1);
- state.pipesCount -= 1;
- if (state.pipesCount === 1) state.pipes = state.pipes[0];
+function plural(ms, msAbs, n, name) {
+ var isPlural = msAbs >= n * 1.5;
+ return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
+}
- dest.emit('unpipe', this, unpipeInfo);
+},{}],162:[function(require,module,exports){
+arguments[4][126][0].apply(exports,arguments)
+},{"dup":126}],163:[function(require,module,exports){
+arguments[4][48][0].apply(exports,arguments)
+},{"bn.js":162,"dup":48,"strip-hex-prefix":218}],164:[function(require,module,exports){
+var wrappy = require('wrappy')
+module.exports = wrappy(once)
+module.exports.strict = wrappy(onceStrict)
- return this;
-};
+once.proto = once(function () {
+ Object.defineProperty(Function.prototype, 'once', {
+ value: function () {
+ return once(this)
+ },
+ configurable: true
+ })
-// set up data events if they are asked for
-// Ensure readable listeners eventually get something
-Readable.prototype.on = function (ev, fn) {
- var res = Stream.prototype.on.call(this, ev, fn);
+ Object.defineProperty(Function.prototype, 'onceStrict', {
+ value: function () {
+ return onceStrict(this)
+ },
+ configurable: true
+ })
+})
- if (ev === 'data') {
- // Start flowing on next tick if stream isn't explicitly paused
- if (this._readableState.flowing !== false) this.resume();
- } else if (ev === 'readable') {
- var state = this._readableState;
- if (!state.endEmitted && !state.readableListening) {
- state.readableListening = state.needReadable = true;
- state.emittedReadable = false;
- if (!state.reading) {
- pna.nextTick(nReadingNextTick, this);
- } else if (state.length) {
- emitReadable(this);
- }
- }
+function once (fn) {
+ var f = function () {
+ if (f.called) return f.value
+ f.called = true
+ return f.value = fn.apply(this, arguments)
}
-
- return res;
-};
-Readable.prototype.addListener = Readable.prototype.on;
-
-function nReadingNextTick(self) {
- debug('readable nexttick read 0');
- self.read(0);
+ f.called = false
+ return f
}
-// pause() and resume() are remnants of the legacy readable stream API
-// If the user uses them, then switch into old mode.
-Readable.prototype.resume = function () {
- var state = this._readableState;
- if (!state.flowing) {
- debug('resume');
- state.flowing = true;
- resume(this, state);
- }
- return this;
-};
-
-function resume(stream, state) {
- if (!state.resumeScheduled) {
- state.resumeScheduled = true;
- pna.nextTick(resume_, stream, state);
+function onceStrict (fn) {
+ var f = function () {
+ if (f.called)
+ throw new Error(f.onceError)
+ f.called = true
+ return f.value = fn.apply(this, arguments)
}
+ var name = fn.name || 'Function wrapped with `once`'
+ f.onceError = name + " shouldn't be called more than once"
+ f.called = false
+ return f
}
-function resume_(stream, state) {
- if (!state.reading) {
- debug('resume read 0');
- stream.read(0);
- }
+},{"wrappy":222}],165:[function(require,module,exports){
+'use strict';
- state.resumeScheduled = false;
- state.awaitDrain = 0;
- stream.emit('resume');
- flow(stream);
- if (state.flowing && !state.reading) stream.read(0);
-}
+const { ErrorWithCause } = require('./lib/error-with-cause'); // linemod-replace-with: export { ErrorWithCause } from './lib/error-with-cause.mjs';
-Readable.prototype.pause = function () {
- debug('call pause flowing=%j', this._readableState.flowing);
- if (false !== this._readableState.flowing) {
- debug('pause');
- this._readableState.flowing = false;
- this.emit('pause');
- }
- return this;
-};
+const { // linemod-replace-with: export {
+ findCauseByReference,
+ getErrorCause,
+ messageWithCauses,
+ stackWithCauses,
+} = require('./lib/helpers'); // linemod-replace-with: } from './lib/helpers.mjs';
+
+module.exports = { // linemod-remove
+ ErrorWithCause, // linemod-remove
+ findCauseByReference, // linemod-remove
+ getErrorCause, // linemod-remove
+ stackWithCauses, // linemod-remove
+ messageWithCauses, // linemod-remove
+}; // linemod-remove
+
+},{"./lib/error-with-cause":166,"./lib/helpers":167}],166:[function(require,module,exports){
+'use strict';
+
+/** @template [T=undefined] */
+class ErrorWithCause extends Error { // linemod-prefix-with: export
+ /**
+ * @param {string} message
+ * @param {{ cause?: T }} options
+ */
+ constructor (message, { cause } = {}) {
+ super(message);
-function flow(stream) {
- var state = stream._readableState;
- debug('flow', state.flowing);
- while (state.flowing && stream.read() !== null) {}
+ /** @type {string} */
+ this.name = ErrorWithCause.name;
+ if (cause) {
+ /** @type {T} */
+ this.cause = cause;
+ }
+ /** @type {string} */
+ this.message = message;
+ }
}
-// wrap an old-style stream as the async data source.
-// This is *not* part of the readable stream interface.
-// It is an ugly unfortunate mess of history.
-Readable.prototype.wrap = function (stream) {
- var _this = this;
+module.exports = { // linemod-remove
+ ErrorWithCause, // linemod-remove
+}; // linemod-remove
- var state = this._readableState;
- var paused = false;
+},{}],167:[function(require,module,exports){
+'use strict';
- stream.on('end', function () {
- debug('wrapped end');
- if (state.decoder && !state.ended) {
- var chunk = state.decoder.end();
- if (chunk && chunk.length) _this.push(chunk);
- }
+/**
+ * @template {Error} T
+ * @param {unknown} err
+ * @param {new(...args: any[]) => T} reference
+ * @returns {T|undefined}
+ */
+const findCauseByReference = (err, reference) => { // linemod-prefix-with: export
+ if (!err || !reference) return;
+ if (!(err instanceof Error)) return;
+ if (
+ !(reference.prototype instanceof Error) &&
+ // @ts-ignore
+ reference !== Error
+ ) return;
- _this.push(null);
- });
+ /**
+ * Ensures we don't go circular
+ *
+ * @type {Set}
+ */
+ const seen = new Set();
- stream.on('data', function (chunk) {
- debug('wrapped data');
- if (state.decoder) chunk = state.decoder.write(chunk);
+ /** @type {Error|undefined} */
+ let currentErr = err;
- // don't skip over falsy values in objectMode
- if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+ while (currentErr && !seen.has(currentErr)) {
+ seen.add(currentErr);
- var ret = _this.push(chunk);
- if (!ret) {
- paused = true;
- stream.pause();
+ if (currentErr instanceof reference) {
+ return currentErr;
}
- });
- // proxy all the other methods.
- // important when wrapping filters and duplexes.
- for (var i in stream) {
- if (this[i] === undefined && typeof stream[i] === 'function') {
- this[i] = function (method) {
- return function () {
- return stream[method].apply(stream, arguments);
- };
- }(i);
- }
+ currentErr = getErrorCause(currentErr);
}
+};
- // proxy certain important events.
- for (var n = 0; n < kProxyEvents.length; n++) {
- stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
+/**
+ * @param {Error|{ cause?: unknown|(()=>err)}} err
+ * @returns {Error|undefined}
+ */
+const getErrorCause = (err) => { // linemod-prefix-with: export
+ if (!err || typeof err !== 'object' || !('cause' in err)) {
+ return;
}
- // when we try to consume some more bytes, simply unpause the
- // underlying stream.
- this._read = function (n) {
- debug('wrapped _read', n);
- if (paused) {
- paused = false;
- stream.resume();
- }
- };
+ // VError / NError style causes
+ if (typeof err.cause === 'function') {
+ const causeResult = err.cause();
- return this;
+ return causeResult instanceof Error
+ ? causeResult
+ : undefined;
+ } else {
+ return err.cause instanceof Error
+ ? err.cause
+ : undefined;
+ }
};
-Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
- // making it explicit this property is not enumerable
- // because otherwise some prototype manipulation in
- // userland will fail
- enumerable: false,
- get: function () {
- return this._readableState.highWaterMark;
+/**
+ * Internal method that keeps a track of which error we have already added, to avoid circular recursion
+ *
+ * @private
+ * @param {Error} err
+ * @param {Set} seen
+ * @returns {string}
+ */
+const _stackWithCauses = (err, seen) => {
+ if (!(err instanceof Error)) return '';
+
+ const stack = err.stack || '';
+
+ // Ensure we don't go circular or crazily deep
+ if (seen.has(err)) {
+ return stack + '\ncauses have become circular...';
}
-});
-// exposed for testing purposes only.
-Readable._fromList = fromList;
+ const cause = getErrorCause(err);
-// Pluck off n bytes from an array of buffers.
-// Length is the combined lengths of all the buffers in the list.
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function fromList(n, state) {
- // nothing buffered
- if (state.length === 0) return null;
+ // TODO: Follow up in https://github.com/nodejs/node/issues/38725#issuecomment-920309092 on how to log stuff
- var ret;
- if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
- // read it all, truncate the list
- if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
- state.buffer.clear();
+ if (cause) {
+ seen.add(err);
+ return (stack + '\ncaused by: ' + _stackWithCauses(cause, seen));
} else {
- // read part of list
- ret = fromListPartial(n, state.buffer, state.decoder);
+ return stack;
}
+};
- return ret;
-}
+/**
+ * @param {Error} err
+ * @returns {string}
+ */
+const stackWithCauses = (err) => _stackWithCauses(err, new Set()); // linemod-prefix-with: export
-// Extracts only enough buffered data to satisfy the amount requested.
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function fromListPartial(n, list, hasStrings) {
- var ret;
- if (n < list.head.data.length) {
- // slice is the same for buffers and strings
- ret = list.head.data.slice(0, n);
- list.head.data = list.head.data.slice(n);
- } else if (n === list.head.data.length) {
- // first chunk is a perfect match
- ret = list.shift();
- } else {
- // result spans more than one buffer
- ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
- }
- return ret;
-}
+/**
+ * Internal method that keeps a track of which error we have already added, to avoid circular recursion
+ *
+ * @private
+ * @param {Error} err
+ * @param {Set} seen
+ * @param {boolean} [skip]
+ * @returns {string}
+ */
+const _messageWithCauses = (err, seen, skip) => {
+ if (!(err instanceof Error)) return '';
-// Copies a specified amount of characters from the list of buffered data
-// chunks.
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function copyFromBufferString(n, list) {
- var p = list.head;
- var c = 1;
- var ret = p.data;
- n -= ret.length;
- while (p = p.next) {
- var str = p.data;
- var nb = n > str.length ? str.length : n;
- if (nb === str.length) ret += str;else ret += str.slice(0, n);
- n -= nb;
- if (n === 0) {
- if (nb === str.length) {
- ++c;
- if (p.next) list.head = p.next;else list.head = list.tail = null;
- } else {
- list.head = p;
- p.data = str.slice(nb);
- }
- break;
- }
- ++c;
- }
- list.length -= c;
- return ret;
-}
+ const message = skip ? '' : (err.message || '');
-// Copies a specified amount of bytes from the list of buffered data chunks.
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function copyFromBuffer(n, list) {
- var ret = Buffer.allocUnsafe(n);
- var p = list.head;
- var c = 1;
- p.data.copy(ret);
- n -= p.data.length;
- while (p = p.next) {
- var buf = p.data;
- var nb = n > buf.length ? buf.length : n;
- buf.copy(ret, ret.length - n, 0, nb);
- n -= nb;
- if (n === 0) {
- if (nb === buf.length) {
- ++c;
- if (p.next) list.head = p.next;else list.head = list.tail = null;
- } else {
- list.head = p;
- p.data = buf.slice(nb);
- }
- break;
- }
- ++c;
+ // Ensure we don't go circular or crazily deep
+ if (seen.has(err)) {
+ return message + ': ...';
}
- list.length -= c;
- return ret;
-}
-function endReadable(stream) {
- var state = stream._readableState;
+ const cause = getErrorCause(err);
- // If we get here before consuming all the bytes, then that is a
- // bug in node. Should never happen.
- if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
+ if (cause) {
+ seen.add(err);
- if (!state.endEmitted) {
- state.ended = true;
- pna.nextTick(endReadableNT, state, stream);
- }
-}
+ const skipIfVErrorStyleCause = 'cause' in err && typeof err.cause === 'function';
-function endReadableNT(state, stream) {
- // Check that we didn't get one last unshift.
- if (!state.endEmitted && state.length === 0) {
- state.endEmitted = true;
- stream.readable = false;
- stream.emit('end');
+ return (message +
+ (skipIfVErrorStyleCause ? '' : ': ') +
+ _messageWithCauses(cause, seen, skipIfVErrorStyleCause));
+ } else {
+ return message;
}
-}
+};
-function indexOf(xs, x) {
- for (var i = 0, l = xs.length; i < l; i++) {
- if (xs[i] === x) return i;
- }
- return -1;
-}
-}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"./_stream_duplex":104,"./internal/streams/BufferList":109,"./internal/streams/destroy":110,"./internal/streams/stream":111,"_process":101,"core-util-is":39,"events":51,"inherits":80,"isarray":85,"process-nextick-args":100,"safe-buffer":113,"string_decoder/":115,"util":37}],107:[function(require,module,exports){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
+/**
+ * @param {Error} err
+ * @returns {string}
+ */
+const messageWithCauses = (err) => _messageWithCauses(err, new Set()); // linemod-prefix-with: export
-// a transform stream is a readable/writable stream where you do
-// something with the data. Sometimes it's called a "filter",
-// but that's not a great name for it, since that implies a thing where
-// some bits pass through, and others are simply ignored. (That would
-// be a valid example of a transform, of course.)
-//
-// While the output is causally related to the input, it's not a
-// necessarily symmetric or synchronous transformation. For example,
-// a zlib stream might take multiple plain-text writes(), and then
-// emit a single compressed chunk some time in the future.
-//
-// Here's how this works:
-//
-// The Transform stream has all the aspects of the readable and writable
-// stream classes. When you write(chunk), that calls _write(chunk,cb)
-// internally, and returns false if there's a lot of pending writes
-// buffered up. When you call read(), that calls _read(n) until
-// there's enough pending readable data buffered up.
-//
-// In a transform stream, the written data is placed in a buffer. When
-// _read(n) is called, it transforms the queued up data, calling the
-// buffered _write cb's as it consumes chunks. If consuming a single
-// written chunk would result in multiple output chunks, then the first
-// outputted bit calls the readcb, and subsequent chunks just go into
-// the read buffer, and will cause it to emit 'readable' if necessary.
-//
-// This way, back-pressure is actually determined by the reading side,
-// since _read has to be called to start processing a new chunk. However,
-// a pathological inflate type of transform can cause excessive buffering
-// here. For example, imagine a stream where every byte of input is
-// interpreted as an integer from 0-255, and then results in that many
-// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
-// 1kb of data being output. In this case, you could write a very small
-// amount of input, and end up with a very large amount of output. In
-// such a pathological inflating mechanism, there'd be no way to tell
-// the system to stop doing the transform. A single 4MB write could
-// cause the system to run out of memory.
-//
-// However, even in such a pathological case, only a single written chunk
-// would be consumed, and then the rest would wait (un-transformed) until
-// the results of the previous transformed chunk were consumed.
+module.exports = { // linemod-remove
+ findCauseByReference, // linemod-remove
+ getErrorCause, // linemod-remove
+ stackWithCauses, // linemod-remove
+ messageWithCauses, // linemod-remove
+}; // linemod-remove
+
+},{}],168:[function(require,module,exports){
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+ throw new Error('clearTimeout has not been defined');
+}
+(function () {
+ try {
+ if (typeof setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ if (typeof clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+} ())
+function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch(e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch(e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
-'use strict';
-module.exports = Transform;
+}
+function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
-var Duplex = require('./_stream_duplex');
-/**/
-var util = Object.create(require('core-util-is'));
-util.inherits = require('inherits');
-/**/
-util.inherits(Transform, Duplex);
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
-function afterTransform(er, data) {
- var ts = this._transformState;
- ts.transforming = false;
+function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+}
- var cb = ts.writecb;
+function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
- if (!cb) {
- return this.emit('error', new Error('write callback called multiple times'));
- }
+ var len = queue.length;
+ while(len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+}
- ts.writechunk = null;
- ts.writecb = null;
+process.nextTick = function (fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+};
- if (data != null) // single equals check for both `null` and `undefined`
- this.push(data);
+// v8 likes predictible objects
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
- cb(er);
+function noop() {}
- var rs = this._readableState;
- rs.reading = false;
- if (rs.needReadable || rs.length < rs.highWaterMark) {
- this._read(rs.highWaterMark);
- }
-}
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
-function Transform(options) {
- if (!(this instanceof Transform)) return new Transform(options);
+process.listeners = function (name) { return [] }
- Duplex.call(this, options);
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+};
- this._transformState = {
- afterTransform: afterTransform.bind(this),
- needTransform: false,
- transforming: false,
- writecb: null,
- writechunk: null,
- writeencoding: null
- };
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
- // start out asking for a readable event once data is transformed.
- this._readableState.needReadable = true;
+},{}],169:[function(require,module,exports){
+'use strict';
+var isFn = require('is-fn');
+var setImmediate = require('set-immediate-shim');
- // we have implemented the _read method, and done the other things
- // that Readable wants before the first _read call, so unset the
- // sync guard flag.
- this._readableState.sync = false;
+module.exports = function (promise) {
+ if (!isFn(promise.then)) {
+ throw new TypeError('Expected a promise');
+ }
- if (options) {
- if (typeof options.transform === 'function') this._transform = options.transform;
+ return function (cb) {
+ promise.then(function (data) {
+ setImmediate(cb, null, data);
+ }, function (err) {
+ setImmediate(cb, err);
+ });
+ };
+};
- if (typeof options.flush === 'function') this._flush = options.flush;
+},{"is-fn":157,"set-immediate-shim":216}],170:[function(require,module,exports){
+/* eslint-disable node/no-deprecated-api */
+var buffer = require('buffer')
+var Buffer = buffer.Buffer
+
+// alternative to using Object.keys for old browsers
+function copyProps (src, dst) {
+ for (var key in src) {
+ dst[key] = src[key]
}
+}
+if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
+ module.exports = buffer
+} else {
+ // Copy properties from require('buffer')
+ copyProps(buffer, exports)
+ exports.Buffer = SafeBuffer
+}
- // When the writable side finishes, then flush out anything remaining.
- this.on('prefinish', prefinish);
+function SafeBuffer (arg, encodingOrOffset, length) {
+ return Buffer(arg, encodingOrOffset, length)
}
-function prefinish() {
- var _this = this;
+// Copy static methods from Buffer
+copyProps(Buffer, SafeBuffer)
- if (typeof this._flush === 'function') {
- this._flush(function (er, data) {
- done(_this, er, data);
- });
- } else {
- done(this, null, null);
+SafeBuffer.from = function (arg, encodingOrOffset, length) {
+ if (typeof arg === 'number') {
+ throw new TypeError('Argument must not be a number')
}
+ return Buffer(arg, encodingOrOffset, length)
}
-Transform.prototype.push = function (chunk, encoding) {
- this._transformState.needTransform = false;
- return Duplex.prototype.push.call(this, chunk, encoding);
-};
-
-// This is the part where you do stuff!
-// override this function in implementation classes.
-// 'chunk' is an input chunk.
-//
-// Call `push(newChunk)` to pass along transformed output
-// to the readable side. You may call 'push' zero or more times.
-//
-// Call `cb(err)` when you are done with this chunk. If you pass
-// an error, then that'll put the hurt on the whole operation. If you
-// never call cb(), then you'll never get another chunk.
-Transform.prototype._transform = function (chunk, encoding, cb) {
- throw new Error('_transform() is not implemented');
-};
+SafeBuffer.alloc = function (size, fill, encoding) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ var buf = Buffer(size)
+ if (fill !== undefined) {
+ if (typeof encoding === 'string') {
+ buf.fill(fill, encoding)
+ } else {
+ buf.fill(fill)
+ }
+ } else {
+ buf.fill(0)
+ }
+ return buf
+}
-Transform.prototype._write = function (chunk, encoding, cb) {
- var ts = this._transformState;
- ts.writecb = cb;
- ts.writechunk = chunk;
- ts.writeencoding = encoding;
- if (!ts.transforming) {
- var rs = this._readableState;
- if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+SafeBuffer.allocUnsafe = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
}
-};
+ return Buffer(size)
+}
-// Doesn't matter what the args are here.
-// _transform does all the work.
-// That we got here means that the readable side wants more data.
-Transform.prototype._read = function (n) {
- var ts = this._transformState;
+SafeBuffer.allocUnsafeSlow = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ return buffer.SlowBuffer(size)
+}
- if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
- ts.transforming = true;
- this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
- } else {
- // mark that we need a transform, so that any data that comes in
- // will get processed, now that we've asked for it.
- ts.needTransform = true;
+},{"buffer":120}],171:[function(require,module,exports){
+const ANY = Symbol('SemVer ANY')
+// hoisted class for cyclic dependency
+class Comparator {
+ static get ANY () {
+ return ANY
}
-};
-Transform.prototype._destroy = function (err, cb) {
- var _this2 = this;
+ constructor (comp, options) {
+ options = parseOptions(options)
- Duplex.prototype._destroy.call(this, err, function (err2) {
- cb(err2);
- _this2.emit('close');
- });
-};
+ if (comp instanceof Comparator) {
+ if (comp.loose === !!options.loose) {
+ return comp
+ } else {
+ comp = comp.value
+ }
+ }
-function done(stream, er, data) {
- if (er) return stream.emit('error', er);
+ comp = comp.trim().split(/\s+/).join(' ')
+ debug('comparator', comp, options)
+ this.options = options
+ this.loose = !!options.loose
+ this.parse(comp)
- if (data != null) // single equals check for both `null` and `undefined`
- stream.push(data);
+ if (this.semver === ANY) {
+ this.value = ''
+ } else {
+ this.value = this.operator + this.semver.version
+ }
- // if there's nothing in the write buffer, then that means
- // that nothing more will ever be provided
- if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');
+ debug('comp', this)
+ }
- if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');
+ parse (comp) {
+ const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]
+ const m = comp.match(r)
- return stream.push(null);
-}
-},{"./_stream_duplex":104,"core-util-is":39,"inherits":80}],108:[function(require,module,exports){
-(function (process,global,setImmediate){(function (){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
+ if (!m) {
+ throw new TypeError(`Invalid comparator: ${comp}`)
+ }
-// A bit simpler than readable streams.
-// Implement an async ._write(chunk, encoding, cb), and it'll handle all
-// the drain event emission and buffering.
+ this.operator = m[1] !== undefined ? m[1] : ''
+ if (this.operator === '=') {
+ this.operator = ''
+ }
-'use strict';
+ // if it literally is just '>' or '' then allow anything.
+ if (!m[2]) {
+ this.semver = ANY
+ } else {
+ this.semver = new SemVer(m[2], this.options.loose)
+ }
+ }
-/**/
+ toString () {
+ return this.value
+ }
-var pna = require('process-nextick-args');
-/**/
+ test (version) {
+ debug('Comparator.test', version, this.options.loose)
-module.exports = Writable;
+ if (this.semver === ANY || version === ANY) {
+ return true
+ }
-/* */
-function WriteReq(chunk, encoding, cb) {
- this.chunk = chunk;
- this.encoding = encoding;
- this.callback = cb;
- this.next = null;
-}
+ if (typeof version === 'string') {
+ try {
+ version = new SemVer(version, this.options)
+ } catch (er) {
+ return false
+ }
+ }
-// It seems a linked list but it is not
-// there will be only 2 of these for each stream
-function CorkedRequest(state) {
- var _this = this;
+ return cmp(version, this.operator, this.semver, this.options)
+ }
- this.next = null;
- this.entry = null;
- this.finish = function () {
- onCorkedFinish(_this, state);
- };
+ intersects (comp, options) {
+ if (!(comp instanceof Comparator)) {
+ throw new TypeError('a Comparator is required')
+ }
+
+ if (this.operator === '') {
+ if (this.value === '') {
+ return true
+ }
+ return new Range(comp.value, options).test(this.value)
+ } else if (comp.operator === '') {
+ if (comp.value === '') {
+ return true
+ }
+ return new Range(this.value, options).test(comp.semver)
+ }
+
+ options = parseOptions(options)
+
+ // Special cases where nothing can possibly be lower
+ if (options.includePrerelease &&
+ (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {
+ return false
+ }
+ if (!options.includePrerelease &&
+ (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {
+ return false
+ }
+
+ // Same direction increasing (> or >=)
+ if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {
+ return true
+ }
+ // Same direction decreasing (< or <=)
+ if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {
+ return true
+ }
+ // same SemVer and both sides are inclusive (<= or >=)
+ if (
+ (this.semver.version === comp.semver.version) &&
+ this.operator.includes('=') && comp.operator.includes('=')) {
+ return true
+ }
+ // opposite directions less than
+ if (cmp(this.semver, '<', comp.semver, options) &&
+ this.operator.startsWith('>') && comp.operator.startsWith('<')) {
+ return true
+ }
+ // opposite directions greater than
+ if (cmp(this.semver, '>', comp.semver, options) &&
+ this.operator.startsWith('<') && comp.operator.startsWith('>')) {
+ return true
+ }
+ return false
+ }
}
-/* */
-/**/
-var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;
-/**/
+module.exports = Comparator
-/**/
-var Duplex;
-/**/
+const parseOptions = require('../internal/parse-options')
+const { safeRe: re, t } = require('../internal/re')
+const cmp = require('../functions/cmp')
+const debug = require('../internal/debug')
+const SemVer = require('./semver')
+const Range = require('./range')
-Writable.WritableState = WritableState;
+},{"../functions/cmp":175,"../internal/debug":200,"../internal/parse-options":203,"../internal/re":204,"./range":172,"./semver":173}],172:[function(require,module,exports){
+// hoisted class for cyclic dependency
+class Range {
+ constructor (range, options) {
+ options = parseOptions(options)
-/**/
-var util = Object.create(require('core-util-is'));
-util.inherits = require('inherits');
-/**/
+ if (range instanceof Range) {
+ if (
+ range.loose === !!options.loose &&
+ range.includePrerelease === !!options.includePrerelease
+ ) {
+ return range
+ } else {
+ return new Range(range.raw, options)
+ }
+ }
+
+ if (range instanceof Comparator) {
+ // just put it in the set and return
+ this.raw = range.value
+ this.set = [[range]]
+ this.format()
+ return this
+ }
+
+ this.options = options
+ this.loose = !!options.loose
+ this.includePrerelease = !!options.includePrerelease
+
+ // First reduce all whitespace as much as possible so we do not have to rely
+ // on potentially slow regexes like \s*. This is then stored and used for
+ // future error messages as well.
+ this.raw = range
+ .trim()
+ .split(/\s+/)
+ .join(' ')
+
+ // First, split on ||
+ this.set = this.raw
+ .split('||')
+ // map the range to a 2d array of comparators
+ .map(r => this.parseRange(r.trim()))
+ // throw out any comparator lists that are empty
+ // this generally means that it was not a valid range, which is allowed
+ // in loose mode, but will still throw if the WHOLE range is invalid.
+ .filter(c => c.length)
+
+ if (!this.set.length) {
+ throw new TypeError(`Invalid SemVer Range: ${this.raw}`)
+ }
+
+ // if we have any that are not the null set, throw out null sets.
+ if (this.set.length > 1) {
+ // keep the first one, in case they're all null sets
+ const first = this.set[0]
+ this.set = this.set.filter(c => !isNullSet(c[0]))
+ if (this.set.length === 0) {
+ this.set = [first]
+ } else if (this.set.length > 1) {
+ // if we have any that are *, then the range is just *
+ for (const c of this.set) {
+ if (c.length === 1 && isAny(c[0])) {
+ this.set = [c]
+ break
+ }
+ }
+ }
+ }
-/**/
-var internalUtil = {
- deprecate: require('util-deprecate')
-};
-/**/
+ this.format()
+ }
-/**/
-var Stream = require('./internal/streams/stream');
-/**/
+ format () {
+ this.range = this.set
+ .map((comps) => comps.join(' ').trim())
+ .join('||')
+ .trim()
+ return this.range
+ }
-/**/
+ toString () {
+ return this.range
+ }
-var Buffer = require('safe-buffer').Buffer;
-var OurUint8Array = (typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : {}).Uint8Array || function () {};
-function _uint8ArrayToBuffer(chunk) {
- return Buffer.from(chunk);
-}
-function _isUint8Array(obj) {
- return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
-}
+ parseRange (range) {
+ // memoize range parsing for performance.
+ // this is a very hot path, and fully deterministic.
+ const memoOpts =
+ (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |
+ (this.options.loose && FLAG_LOOSE)
+ const memoKey = memoOpts + ':' + range
+ const cached = cache.get(memoKey)
+ if (cached) {
+ return cached
+ }
-/**/
+ const loose = this.options.loose
+ // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
+ const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]
+ range = range.replace(hr, hyphenReplace(this.options.includePrerelease))
+ debug('hyphen replace', range)
-var destroyImpl = require('./internal/streams/destroy');
+ // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
+ range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)
+ debug('comparator trim', range)
-util.inherits(Writable, Stream);
+ // `~ 1.2.3` => `~1.2.3`
+ range = range.replace(re[t.TILDETRIM], tildeTrimReplace)
+ debug('tilde trim', range)
-function nop() {}
+ // `^ 1.2.3` => `^1.2.3`
+ range = range.replace(re[t.CARETTRIM], caretTrimReplace)
+ debug('caret trim', range)
-function WritableState(options, stream) {
- Duplex = Duplex || require('./_stream_duplex');
+ // At this point, the range is completely trimmed and
+ // ready to be split into comparators.
- options = options || {};
+ let rangeList = range
+ .split(' ')
+ .map(comp => parseComparator(comp, this.options))
+ .join(' ')
+ .split(/\s+/)
+ // >=0.0.0 is equivalent to *
+ .map(comp => replaceGTE0(comp, this.options))
- // Duplex streams are both readable and writable, but share
- // the same options object.
- // However, some cases require setting options to different
- // values for the readable and the writable sides of the duplex stream.
- // These options can be provided separately as readableXXX and writableXXX.
- var isDuplex = stream instanceof Duplex;
+ if (loose) {
+ // in loose mode, throw out any that are not valid comparators
+ rangeList = rangeList.filter(comp => {
+ debug('loose invalid filter', comp, this.options)
+ return !!comp.match(re[t.COMPARATORLOOSE])
+ })
+ }
+ debug('range list', rangeList)
- // object stream flag to indicate whether or not this stream
- // contains buffers or objects.
- this.objectMode = !!options.objectMode;
+ // if any comparators are the null set, then replace with JUST null set
+ // if more than one comparator, remove any * comparators
+ // also, don't include the same comparator more than once
+ const rangeMap = new Map()
+ const comparators = rangeList.map(comp => new Comparator(comp, this.options))
+ for (const comp of comparators) {
+ if (isNullSet(comp)) {
+ return [comp]
+ }
+ rangeMap.set(comp.value, comp)
+ }
+ if (rangeMap.size > 1 && rangeMap.has('')) {
+ rangeMap.delete('')
+ }
- if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
+ const result = [...rangeMap.values()]
+ cache.set(memoKey, result)
+ return result
+ }
- // the point at which write() starts returning false
- // Note: 0 is a valid value, means that we always return false if
- // the entire buffer is not flushed immediately on write()
- var hwm = options.highWaterMark;
- var writableHwm = options.writableHighWaterMark;
- var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+ intersects (range, options) {
+ if (!(range instanceof Range)) {
+ throw new TypeError('a Range is required')
+ }
- if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;
+ return this.set.some((thisComparators) => {
+ return (
+ isSatisfiable(thisComparators, options) &&
+ range.set.some((rangeComparators) => {
+ return (
+ isSatisfiable(rangeComparators, options) &&
+ thisComparators.every((thisComparator) => {
+ return rangeComparators.every((rangeComparator) => {
+ return thisComparator.intersects(rangeComparator, options)
+ })
+ })
+ )
+ })
+ )
+ })
+ }
- // cast to ints.
- this.highWaterMark = Math.floor(this.highWaterMark);
+ // if ANY of the sets match ALL of its comparators, then pass
+ test (version) {
+ if (!version) {
+ return false
+ }
- // if _final has been called
- this.finalCalled = false;
+ if (typeof version === 'string') {
+ try {
+ version = new SemVer(version, this.options)
+ } catch (er) {
+ return false
+ }
+ }
- // drain event flag.
- this.needDrain = false;
- // at the start of calling end()
- this.ending = false;
- // when end() has been called, and returned
- this.ended = false;
- // when 'finish' is emitted
- this.finished = false;
+ for (let i = 0; i < this.set.length; i++) {
+ if (testSet(this.set[i], version, this.options)) {
+ return true
+ }
+ }
+ return false
+ }
+}
- // has it been destroyed
- this.destroyed = false;
+module.exports = Range
- // should we decode strings into buffers before passing to _write?
- // this is here so that some node-core streams can optimize string
- // handling at a lower level.
- var noDecode = options.decodeStrings === false;
- this.decodeStrings = !noDecode;
+const LRU = require('../internal/lrucache')
+const cache = new LRU()
- // Crypto is kind of old and crusty. Historically, its default string
- // encoding is 'binary' so we have to make this configurable.
- // Everything else in the universe uses 'utf8', though.
- this.defaultEncoding = options.defaultEncoding || 'utf8';
+const parseOptions = require('../internal/parse-options')
+const Comparator = require('./comparator')
+const debug = require('../internal/debug')
+const SemVer = require('./semver')
+const {
+ safeRe: re,
+ t,
+ comparatorTrimReplace,
+ tildeTrimReplace,
+ caretTrimReplace,
+} = require('../internal/re')
+const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')
+
+const isNullSet = c => c.value === '<0.0.0-0'
+const isAny = c => c.value === ''
+
+// take a set of comparators and determine whether there
+// exists a version which can satisfy it
+const isSatisfiable = (comparators, options) => {
+ let result = true
+ const remainingComparators = comparators.slice()
+ let testComparator = remainingComparators.pop()
+
+ while (result && remainingComparators.length) {
+ result = remainingComparators.every((otherComparator) => {
+ return testComparator.intersects(otherComparator, options)
+ })
- // not an actual buffer we keep track of, but a measurement
- // of how much we're waiting to get pushed to some underlying
- // socket or file.
- this.length = 0;
+ testComparator = remainingComparators.pop()
+ }
- // a flag to see when we're in the middle of a write.
- this.writing = false;
+ return result
+}
- // when true all writes will be buffered until .uncork() call
- this.corked = 0;
+// comprised of xranges, tildes, stars, and gtlt's at this point.
+// already replaced the hyphen ranges
+// turn into a set of JUST comparators.
+const parseComparator = (comp, options) => {
+ debug('comp', comp, options)
+ comp = replaceCarets(comp, options)
+ debug('caret', comp)
+ comp = replaceTildes(comp, options)
+ debug('tildes', comp)
+ comp = replaceXRanges(comp, options)
+ debug('xrange', comp)
+ comp = replaceStars(comp, options)
+ debug('stars', comp)
+ return comp
+}
+
+const isX = id => !id || id.toLowerCase() === 'x' || id === '*'
+
+// ~, ~> --> * (any, kinda silly)
+// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0
+// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0
+// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0
+// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0
+// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0
+// ~0.0.1 --> >=0.0.1 <0.1.0-0
+const replaceTildes = (comp, options) => {
+ return comp
+ .trim()
+ .split(/\s+/)
+ .map((c) => replaceTilde(c, options))
+ .join(' ')
+}
+
+const replaceTilde = (comp, options) => {
+ const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]
+ return comp.replace(r, (_, M, m, p, pr) => {
+ debug('tilde', comp, _, M, m, p, pr)
+ let ret
+
+ if (isX(M)) {
+ ret = ''
+ } else if (isX(m)) {
+ ret = `>=${M}.0.0 <${+M + 1}.0.0-0`
+ } else if (isX(p)) {
+ // ~1.2 == >=1.2.0 <1.3.0-0
+ ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`
+ } else if (pr) {
+ debug('replaceTilde pr', pr)
+ ret = `>=${M}.${m}.${p}-${pr
+ } <${M}.${+m + 1}.0-0`
+ } else {
+ // ~1.2.3 == >=1.2.3 <1.3.0-0
+ ret = `>=${M}.${m}.${p
+ } <${M}.${+m + 1}.0-0`
+ }
- // a flag to be able to tell if the onwrite cb is called immediately,
- // or on a later tick. We set this to true at first, because any
- // actions that shouldn't happen until "later" should generally also
- // not happen before the first write call.
- this.sync = true;
+ debug('tilde return', ret)
+ return ret
+ })
+}
- // a flag to know if we're processing previously buffered items, which
- // may call the _write() callback in the same tick, so that we don't
- // end up in an overlapped onwrite situation.
- this.bufferProcessing = false;
+// ^ --> * (any, kinda silly)
+// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0
+// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0
+// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0
+// ^1.2.3 --> >=1.2.3 <2.0.0-0
+// ^1.2.0 --> >=1.2.0 <2.0.0-0
+// ^0.0.1 --> >=0.0.1 <0.0.2-0
+// ^0.1.0 --> >=0.1.0 <0.2.0-0
+const replaceCarets = (comp, options) => {
+ return comp
+ .trim()
+ .split(/\s+/)
+ .map((c) => replaceCaret(c, options))
+ .join(' ')
+}
+
+const replaceCaret = (comp, options) => {
+ debug('caret', comp, options)
+ const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]
+ const z = options.includePrerelease ? '-0' : ''
+ return comp.replace(r, (_, M, m, p, pr) => {
+ debug('caret', comp, _, M, m, p, pr)
+ let ret
+
+ if (isX(M)) {
+ ret = ''
+ } else if (isX(m)) {
+ ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`
+ } else if (isX(p)) {
+ if (M === '0') {
+ ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`
+ } else {
+ ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`
+ }
+ } else if (pr) {
+ debug('replaceCaret pr', pr)
+ if (M === '0') {
+ if (m === '0') {
+ ret = `>=${M}.${m}.${p}-${pr
+ } <${M}.${m}.${+p + 1}-0`
+ } else {
+ ret = `>=${M}.${m}.${p}-${pr
+ } <${M}.${+m + 1}.0-0`
+ }
+ } else {
+ ret = `>=${M}.${m}.${p}-${pr
+ } <${+M + 1}.0.0-0`
+ }
+ } else {
+ debug('no pr')
+ if (M === '0') {
+ if (m === '0') {
+ ret = `>=${M}.${m}.${p
+ }${z} <${M}.${m}.${+p + 1}-0`
+ } else {
+ ret = `>=${M}.${m}.${p
+ }${z} <${M}.${+m + 1}.0-0`
+ }
+ } else {
+ ret = `>=${M}.${m}.${p
+ } <${+M + 1}.0.0-0`
+ }
+ }
- // the callback that's passed to _write(chunk,cb)
- this.onwrite = function (er) {
- onwrite(stream, er);
- };
+ debug('caret return', ret)
+ return ret
+ })
+}
- // the callback that the user supplies to write(chunk,encoding,cb)
- this.writecb = null;
+const replaceXRanges = (comp, options) => {
+ debug('replaceXRanges', comp, options)
+ return comp
+ .split(/\s+/)
+ .map((c) => replaceXRange(c, options))
+ .join(' ')
+}
- // the amount that is being written when _write is called.
- this.writelen = 0;
+const replaceXRange = (comp, options) => {
+ comp = comp.trim()
+ const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]
+ return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
+ debug('xRange', comp, ret, gtlt, M, m, p, pr)
+ const xM = isX(M)
+ const xm = xM || isX(m)
+ const xp = xm || isX(p)
+ const anyX = xp
- this.bufferedRequest = null;
- this.lastBufferedRequest = null;
+ if (gtlt === '=' && anyX) {
+ gtlt = ''
+ }
- // number of pending user-supplied write callbacks
- // this must be 0 before 'finish' can be emitted
- this.pendingcb = 0;
+ // if we're including prereleases in the match, then we need
+ // to fix this to -0, the lowest possible prerelease value
+ pr = options.includePrerelease ? '-0' : ''
- // emit prefinish if the only thing we're waiting for is _write cbs
- // This is relevant for synchronous Transform streams
- this.prefinished = false;
+ if (xM) {
+ if (gtlt === '>' || gtlt === '<') {
+ // nothing is allowed
+ ret = '<0.0.0-0'
+ } else {
+ // nothing is forbidden
+ ret = '*'
+ }
+ } else if (gtlt && anyX) {
+ // we know patch is an x, because we have any x at all.
+ // replace X with 0
+ if (xm) {
+ m = 0
+ }
+ p = 0
+
+ if (gtlt === '>') {
+ // >1 => >=2.0.0
+ // >1.2 => >=1.3.0
+ gtlt = '>='
+ if (xm) {
+ M = +M + 1
+ m = 0
+ p = 0
+ } else {
+ m = +m + 1
+ p = 0
+ }
+ } else if (gtlt === '<=') {
+ // <=0.7.x is actually <0.8.0, since any 0.7.x should
+ // pass. Similarly, <=7.x is actually <8.0.0, etc.
+ gtlt = '<'
+ if (xm) {
+ M = +M + 1
+ } else {
+ m = +m + 1
+ }
+ }
- // True if the error was already emitted and should not be thrown again
- this.errorEmitted = false;
+ if (gtlt === '<') {
+ pr = '-0'
+ }
- // count buffered requests
- this.bufferedRequestCount = 0;
+ ret = `${gtlt + M}.${m}.${p}${pr}`
+ } else if (xm) {
+ ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`
+ } else if (xp) {
+ ret = `>=${M}.${m}.0${pr
+ } <${M}.${+m + 1}.0-0`
+ }
- // allocate the first CorkedRequest, there is always
- // one allocated and free to use, and we maintain at most two
- this.corkedRequestsFree = new CorkedRequest(this);
+ debug('xRange return', ret)
+
+ return ret
+ })
}
-WritableState.prototype.getBuffer = function getBuffer() {
- var current = this.bufferedRequest;
- var out = [];
- while (current) {
- out.push(current);
- current = current.next;
+// Because * is AND-ed with everything else in the comparator,
+// and '' means "any version", just remove the *s entirely.
+const replaceStars = (comp, options) => {
+ debug('replaceStars', comp, options)
+ // Looseness is ignored here. star is always as loose as it gets!
+ return comp
+ .trim()
+ .replace(re[t.STAR], '')
+}
+
+const replaceGTE0 = (comp, options) => {
+ debug('replaceGTE0', comp, options)
+ return comp
+ .trim()
+ .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')
+}
+
+// This function is passed to string.replace(re[t.HYPHENRANGE])
+// M, m, patch, prerelease, build
+// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
+// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do
+// 1.2 - 3.4 => >=1.2.0 <3.5.0-0
+// TODO build?
+const hyphenReplace = incPr => ($0,
+ from, fM, fm, fp, fpr, fb,
+ to, tM, tm, tp, tpr) => {
+ if (isX(fM)) {
+ from = ''
+ } else if (isX(fm)) {
+ from = `>=${fM}.0.0${incPr ? '-0' : ''}`
+ } else if (isX(fp)) {
+ from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`
+ } else if (fpr) {
+ from = `>=${from}`
+ } else {
+ from = `>=${from}${incPr ? '-0' : ''}`
+ }
+
+ if (isX(tM)) {
+ to = ''
+ } else if (isX(tm)) {
+ to = `<${+tM + 1}.0.0-0`
+ } else if (isX(tp)) {
+ to = `<${tM}.${+tm + 1}.0-0`
+ } else if (tpr) {
+ to = `<=${tM}.${tm}.${tp}-${tpr}`
+ } else if (incPr) {
+ to = `<${tM}.${tm}.${+tp + 1}-0`
+ } else {
+ to = `<=${to}`
}
- return out;
-};
-
-(function () {
- try {
- Object.defineProperty(WritableState.prototype, 'buffer', {
- get: internalUtil.deprecate(function () {
- return this.getBuffer();
- }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
- });
- } catch (_) {}
-})();
-// Test _writableState for inheritance to account for Duplex streams,
-// whose prototype chain only points to Readable.
-var realHasInstance;
-if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
- realHasInstance = Function.prototype[Symbol.hasInstance];
- Object.defineProperty(Writable, Symbol.hasInstance, {
- value: function (object) {
- if (realHasInstance.call(this, object)) return true;
- if (this !== Writable) return false;
+ return `${from} ${to}`.trim()
+}
- return object && object._writableState instanceof WritableState;
+const testSet = (set, version, options) => {
+ for (let i = 0; i < set.length; i++) {
+ if (!set[i].test(version)) {
+ return false
}
- });
-} else {
- realHasInstance = function (object) {
- return object instanceof this;
- };
-}
+ }
-function Writable(options) {
- Duplex = Duplex || require('./_stream_duplex');
+ if (version.prerelease.length && !options.includePrerelease) {
+ // Find the set of versions that are allowed to have prereleases
+ // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
+ // That should allow `1.2.3-pr.2` to pass.
+ // However, `1.2.4-alpha.notready` should NOT be allowed,
+ // even though it's within the range set by the comparators.
+ for (let i = 0; i < set.length; i++) {
+ debug(set[i].semver)
+ if (set[i].semver === Comparator.ANY) {
+ continue
+ }
- // Writable ctor is applied to Duplexes, too.
- // `realHasInstance` is necessary because using plain `instanceof`
- // would return false, as no `_writableState` property is attached.
+ if (set[i].semver.prerelease.length > 0) {
+ const allowed = set[i].semver
+ if (allowed.major === version.major &&
+ allowed.minor === version.minor &&
+ allowed.patch === version.patch) {
+ return true
+ }
+ }
+ }
- // Trying to use the custom `instanceof` for Writable here will also break the
- // Node.js LazyTransform implementation, which has a non-trivial getter for
- // `_writableState` that would lead to infinite recursion.
- if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
- return new Writable(options);
+ // Version has a -pre, but it's not one of the ones we like.
+ return false
}
- this._writableState = new WritableState(options, this);
-
- // legacy.
- this.writable = true;
+ return true
+}
- if (options) {
- if (typeof options.write === 'function') this._write = options.write;
+},{"../internal/constants":199,"../internal/debug":200,"../internal/lrucache":202,"../internal/parse-options":203,"../internal/re":204,"./comparator":171,"./semver":173}],173:[function(require,module,exports){
+const debug = require('../internal/debug')
+const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')
+const { safeRe: re, t } = require('../internal/re')
- if (typeof options.writev === 'function') this._writev = options.writev;
+const parseOptions = require('../internal/parse-options')
+const { compareIdentifiers } = require('../internal/identifiers')
+class SemVer {
+ constructor (version, options) {
+ options = parseOptions(options)
- if (typeof options.destroy === 'function') this._destroy = options.destroy;
+ if (version instanceof SemVer) {
+ if (version.loose === !!options.loose &&
+ version.includePrerelease === !!options.includePrerelease) {
+ return version
+ } else {
+ version = version.version
+ }
+ } else if (typeof version !== 'string') {
+ throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`)
+ }
- if (typeof options.final === 'function') this._final = options.final;
- }
+ if (version.length > MAX_LENGTH) {
+ throw new TypeError(
+ `version is longer than ${MAX_LENGTH} characters`
+ )
+ }
- Stream.call(this);
-}
+ debug('SemVer', version, options)
+ this.options = options
+ this.loose = !!options.loose
+ // this isn't actually relevant for versions, but keep it so that we
+ // don't run into trouble passing this.options around.
+ this.includePrerelease = !!options.includePrerelease
-// Otherwise people can pipe Writable streams, which is just wrong.
-Writable.prototype.pipe = function () {
- this.emit('error', new Error('Cannot pipe, not readable'));
-};
+ const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])
-function writeAfterEnd(stream, cb) {
- var er = new Error('write after end');
- // TODO: defer error events consistently everywhere, not just the cb
- stream.emit('error', er);
- pna.nextTick(cb, er);
-}
+ if (!m) {
+ throw new TypeError(`Invalid Version: ${version}`)
+ }
-// Checks that a user-supplied chunk is valid, especially for the particular
-// mode the stream is in. Currently this means that `null` is never accepted
-// and undefined/non-string values are only allowed in object mode.
-function validChunk(stream, state, chunk, cb) {
- var valid = true;
- var er = false;
+ this.raw = version
- if (chunk === null) {
- er = new TypeError('May not write null values to stream');
- } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
- er = new TypeError('Invalid non-string/buffer chunk');
- }
- if (er) {
- stream.emit('error', er);
- pna.nextTick(cb, er);
- valid = false;
- }
- return valid;
-}
+ // these are actually numbers
+ this.major = +m[1]
+ this.minor = +m[2]
+ this.patch = +m[3]
-Writable.prototype.write = function (chunk, encoding, cb) {
- var state = this._writableState;
- var ret = false;
- var isBuf = !state.objectMode && _isUint8Array(chunk);
+ if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
+ throw new TypeError('Invalid major version')
+ }
- if (isBuf && !Buffer.isBuffer(chunk)) {
- chunk = _uint8ArrayToBuffer(chunk);
- }
+ if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
+ throw new TypeError('Invalid minor version')
+ }
- if (typeof encoding === 'function') {
- cb = encoding;
- encoding = null;
- }
+ if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
+ throw new TypeError('Invalid patch version')
+ }
- if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+ // numberify any prerelease numeric ids
+ if (!m[4]) {
+ this.prerelease = []
+ } else {
+ this.prerelease = m[4].split('.').map((id) => {
+ if (/^[0-9]+$/.test(id)) {
+ const num = +id
+ if (num >= 0 && num < MAX_SAFE_INTEGER) {
+ return num
+ }
+ }
+ return id
+ })
+ }
- if (typeof cb !== 'function') cb = nop;
+ this.build = m[5] ? m[5].split('.') : []
+ this.format()
+ }
- if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
- state.pendingcb++;
- ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
+ format () {
+ this.version = `${this.major}.${this.minor}.${this.patch}`
+ if (this.prerelease.length) {
+ this.version += `-${this.prerelease.join('.')}`
+ }
+ return this.version
}
- return ret;
-};
+ toString () {
+ return this.version
+ }
-Writable.prototype.cork = function () {
- var state = this._writableState;
+ compare (other) {
+ debug('SemVer.compare', this.version, this.options, other)
+ if (!(other instanceof SemVer)) {
+ if (typeof other === 'string' && other === this.version) {
+ return 0
+ }
+ other = new SemVer(other, this.options)
+ }
- state.corked++;
-};
+ if (other.version === this.version) {
+ return 0
+ }
-Writable.prototype.uncork = function () {
- var state = this._writableState;
+ return this.compareMain(other) || this.comparePre(other)
+ }
- if (state.corked) {
- state.corked--;
+ compareMain (other) {
+ if (!(other instanceof SemVer)) {
+ other = new SemVer(other, this.options)
+ }
- if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+ return (
+ compareIdentifiers(this.major, other.major) ||
+ compareIdentifiers(this.minor, other.minor) ||
+ compareIdentifiers(this.patch, other.patch)
+ )
}
-};
-Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
- // node::ParseEncoding() requires lower case.
- if (typeof encoding === 'string') encoding = encoding.toLowerCase();
- if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
- this._writableState.defaultEncoding = encoding;
- return this;
-};
+ comparePre (other) {
+ if (!(other instanceof SemVer)) {
+ other = new SemVer(other, this.options)
+ }
-function decodeChunk(state, chunk, encoding) {
- if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
- chunk = Buffer.from(chunk, encoding);
- }
- return chunk;
-}
+ // NOT having a prerelease is > having one
+ if (this.prerelease.length && !other.prerelease.length) {
+ return -1
+ } else if (!this.prerelease.length && other.prerelease.length) {
+ return 1
+ } else if (!this.prerelease.length && !other.prerelease.length) {
+ return 0
+ }
-Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
- // making it explicit this property is not enumerable
- // because otherwise some prototype manipulation in
- // userland will fail
- enumerable: false,
- get: function () {
- return this._writableState.highWaterMark;
+ let i = 0
+ do {
+ const a = this.prerelease[i]
+ const b = other.prerelease[i]
+ debug('prerelease compare', i, a, b)
+ if (a === undefined && b === undefined) {
+ return 0
+ } else if (b === undefined) {
+ return 1
+ } else if (a === undefined) {
+ return -1
+ } else if (a === b) {
+ continue
+ } else {
+ return compareIdentifiers(a, b)
+ }
+ } while (++i)
}
-});
-// if we're already writing something, then just put this
-// in the queue, and wait our turn. Otherwise, call _write
-// If we return false, then we need a drain event, so set that flag.
-function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
- if (!isBuf) {
- var newChunk = decodeChunk(state, chunk, encoding);
- if (chunk !== newChunk) {
- isBuf = true;
- encoding = 'buffer';
- chunk = newChunk;
+ compareBuild (other) {
+ if (!(other instanceof SemVer)) {
+ other = new SemVer(other, this.options)
}
+
+ let i = 0
+ do {
+ const a = this.build[i]
+ const b = other.build[i]
+ debug('build compare', i, a, b)
+ if (a === undefined && b === undefined) {
+ return 0
+ } else if (b === undefined) {
+ return 1
+ } else if (a === undefined) {
+ return -1
+ } else if (a === b) {
+ continue
+ } else {
+ return compareIdentifiers(a, b)
+ }
+ } while (++i)
}
- var len = state.objectMode ? 1 : chunk.length;
- state.length += len;
+ // preminor will bump the version up to the next minor release, and immediately
+ // down to pre-release. premajor and prepatch work the same way.
+ inc (release, identifier, identifierBase) {
+ switch (release) {
+ case 'premajor':
+ this.prerelease.length = 0
+ this.patch = 0
+ this.minor = 0
+ this.major++
+ this.inc('pre', identifier, identifierBase)
+ break
+ case 'preminor':
+ this.prerelease.length = 0
+ this.patch = 0
+ this.minor++
+ this.inc('pre', identifier, identifierBase)
+ break
+ case 'prepatch':
+ // If this is already a prerelease, it will bump to the next version
+ // drop any prereleases that might already exist, since they are not
+ // relevant at this point.
+ this.prerelease.length = 0
+ this.inc('patch', identifier, identifierBase)
+ this.inc('pre', identifier, identifierBase)
+ break
+ // If the input is a non-prerelease version, this acts the same as
+ // prepatch.
+ case 'prerelease':
+ if (this.prerelease.length === 0) {
+ this.inc('patch', identifier, identifierBase)
+ }
+ this.inc('pre', identifier, identifierBase)
+ break
- var ret = state.length < state.highWaterMark;
- // we must ensure that previous needDrain will not be reset to false.
- if (!ret) state.needDrain = true;
+ case 'major':
+ // If this is a pre-major version, bump up to the same major version.
+ // Otherwise increment major.
+ // 1.0.0-5 bumps to 1.0.0
+ // 1.1.0 bumps to 2.0.0
+ if (
+ this.minor !== 0 ||
+ this.patch !== 0 ||
+ this.prerelease.length === 0
+ ) {
+ this.major++
+ }
+ this.minor = 0
+ this.patch = 0
+ this.prerelease = []
+ break
+ case 'minor':
+ // If this is a pre-minor version, bump up to the same minor version.
+ // Otherwise increment minor.
+ // 1.2.0-5 bumps to 1.2.0
+ // 1.2.1 bumps to 1.3.0
+ if (this.patch !== 0 || this.prerelease.length === 0) {
+ this.minor++
+ }
+ this.patch = 0
+ this.prerelease = []
+ break
+ case 'patch':
+ // If this is not a pre-release version, it will increment the patch.
+ // If it is a pre-release it will bump up to the same patch version.
+ // 1.2.0-5 patches to 1.2.0
+ // 1.2.0 patches to 1.2.1
+ if (this.prerelease.length === 0) {
+ this.patch++
+ }
+ this.prerelease = []
+ break
+ // This probably shouldn't be used publicly.
+ // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.
+ case 'pre': {
+ const base = Number(identifierBase) ? 1 : 0
- if (state.writing || state.corked) {
- var last = state.lastBufferedRequest;
- state.lastBufferedRequest = {
- chunk: chunk,
- encoding: encoding,
- isBuf: isBuf,
- callback: cb,
- next: null
- };
- if (last) {
- last.next = state.lastBufferedRequest;
- } else {
- state.bufferedRequest = state.lastBufferedRequest;
+ if (!identifier && identifierBase === false) {
+ throw new Error('invalid increment argument: identifier is empty')
+ }
+
+ if (this.prerelease.length === 0) {
+ this.prerelease = [base]
+ } else {
+ let i = this.prerelease.length
+ while (--i >= 0) {
+ if (typeof this.prerelease[i] === 'number') {
+ this.prerelease[i]++
+ i = -2
+ }
+ }
+ if (i === -1) {
+ // didn't increment anything
+ if (identifier === this.prerelease.join('.') && identifierBase === false) {
+ throw new Error('invalid increment argument: identifier already exists')
+ }
+ this.prerelease.push(base)
+ }
+ }
+ if (identifier) {
+ // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
+ // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
+ let prerelease = [identifier, base]
+ if (identifierBase === false) {
+ prerelease = [identifier]
+ }
+ if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
+ if (isNaN(this.prerelease[1])) {
+ this.prerelease = prerelease
+ }
+ } else {
+ this.prerelease = prerelease
+ }
+ }
+ break
+ }
+ default:
+ throw new Error(`invalid increment argument: ${release}`)
}
- state.bufferedRequestCount += 1;
- } else {
- doWrite(stream, state, false, len, chunk, encoding, cb);
+ this.raw = this.format()
+ if (this.build.length) {
+ this.raw += `+${this.build.join('.')}`
+ }
+ return this
}
-
- return ret;
}
-function doWrite(stream, state, writev, len, chunk, encoding, cb) {
- state.writelen = len;
- state.writecb = cb;
- state.writing = true;
- state.sync = true;
- if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
- state.sync = false;
+module.exports = SemVer
+
+},{"../internal/constants":199,"../internal/debug":200,"../internal/identifiers":201,"../internal/parse-options":203,"../internal/re":204}],174:[function(require,module,exports){
+const parse = require('./parse')
+const clean = (version, options) => {
+ const s = parse(version.trim().replace(/^[=v]+/, ''), options)
+ return s ? s.version : null
}
+module.exports = clean
-function onwriteError(stream, state, sync, er, cb) {
- --state.pendingcb;
+},{"./parse":190}],175:[function(require,module,exports){
+const eq = require('./eq')
+const neq = require('./neq')
+const gt = require('./gt')
+const gte = require('./gte')
+const lt = require('./lt')
+const lte = require('./lte')
- if (sync) {
- // defer the callback if we are being called synchronously
- // to avoid piling up things on the stack
- pna.nextTick(cb, er);
- // this can emit finish, and it will always happen
- // after error
- pna.nextTick(finishMaybe, stream, state);
- stream._writableState.errorEmitted = true;
- stream.emit('error', er);
- } else {
- // the caller expect this to happen before if
- // it is async
- cb(er);
- stream._writableState.errorEmitted = true;
- stream.emit('error', er);
- // this can emit finish, but finish must
- // always follow error
- finishMaybe(stream, state);
+const cmp = (a, op, b, loose) => {
+ switch (op) {
+ case '===':
+ if (typeof a === 'object') {
+ a = a.version
+ }
+ if (typeof b === 'object') {
+ b = b.version
+ }
+ return a === b
+
+ case '!==':
+ if (typeof a === 'object') {
+ a = a.version
+ }
+ if (typeof b === 'object') {
+ b = b.version
+ }
+ return a !== b
+
+ case '':
+ case '=':
+ case '==':
+ return eq(a, b, loose)
+
+ case '!=':
+ return neq(a, b, loose)
+
+ case '>':
+ return gt(a, b, loose)
+
+ case '>=':
+ return gte(a, b, loose)
+
+ case '<':
+ return lt(a, b, loose)
+
+ case '<=':
+ return lte(a, b, loose)
+
+ default:
+ throw new TypeError(`Invalid operator: ${op}`)
}
}
+module.exports = cmp
-function onwriteStateUpdate(state) {
- state.writing = false;
- state.writecb = null;
- state.length -= state.writelen;
- state.writelen = 0;
-}
+},{"./eq":181,"./gt":182,"./gte":183,"./lt":185,"./lte":186,"./neq":189}],176:[function(require,module,exports){
+const SemVer = require('../classes/semver')
+const parse = require('./parse')
+const { safeRe: re, t } = require('../internal/re')
-function onwrite(stream, er) {
- var state = stream._writableState;
- var sync = state.sync;
- var cb = state.writecb;
+const coerce = (version, options) => {
+ if (version instanceof SemVer) {
+ return version
+ }
- onwriteStateUpdate(state);
+ if (typeof version === 'number') {
+ version = String(version)
+ }
- if (er) onwriteError(stream, state, sync, er, cb);else {
- // Check if we're actually ready to finish, but don't emit yet
- var finished = needFinish(state);
+ if (typeof version !== 'string') {
+ return null
+ }
- if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
- clearBuffer(stream, state);
- }
+ options = options || {}
- if (sync) {
- /**/
- asyncWrite(afterWrite, stream, state, finished, cb);
- /**/
- } else {
- afterWrite(stream, state, finished, cb);
+ let match = null
+ if (!options.rtl) {
+ match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])
+ } else {
+ // Find the right-most coercible string that does not share
+ // a terminus with a more left-ward coercible string.
+ // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'
+ // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'
+ //
+ // Walk through the string checking with a /g regexp
+ // Manually set the index so as to pick up overlapping matches.
+ // Stop when we get a match that ends at the string end, since no
+ // coercible string can be more right-ward without the same terminus.
+ const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]
+ let next
+ while ((next = coerceRtlRegex.exec(version)) &&
+ (!match || match.index + match[0].length !== version.length)
+ ) {
+ if (!match ||
+ next.index + next[0].length !== match.index + match[0].length) {
+ match = next
+ }
+ coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length
}
+ // leave it in a clean state
+ coerceRtlRegex.lastIndex = -1
+ }
+
+ if (match === null) {
+ return null
}
+
+ const major = match[2]
+ const minor = match[3] || '0'
+ const patch = match[4] || '0'
+ const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''
+ const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''
+
+ return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)
}
+module.exports = coerce
-function afterWrite(stream, state, finished, cb) {
- if (!finished) onwriteDrain(stream, state);
- state.pendingcb--;
- cb();
- finishMaybe(stream, state);
+},{"../classes/semver":173,"../internal/re":204,"./parse":190}],177:[function(require,module,exports){
+const SemVer = require('../classes/semver')
+const compareBuild = (a, b, loose) => {
+ const versionA = new SemVer(a, loose)
+ const versionB = new SemVer(b, loose)
+ return versionA.compare(versionB) || versionA.compareBuild(versionB)
}
+module.exports = compareBuild
-// Must force callback to be called on nextTick, so that we don't
-// emit 'drain' before the write() consumer gets the 'false' return
-// value, and has a chance to attach a 'drain' listener.
-function onwriteDrain(stream, state) {
- if (state.length === 0 && state.needDrain) {
- state.needDrain = false;
- stream.emit('drain');
+},{"../classes/semver":173}],178:[function(require,module,exports){
+const compare = require('./compare')
+const compareLoose = (a, b) => compare(a, b, true)
+module.exports = compareLoose
+
+},{"./compare":179}],179:[function(require,module,exports){
+const SemVer = require('../classes/semver')
+const compare = (a, b, loose) =>
+ new SemVer(a, loose).compare(new SemVer(b, loose))
+
+module.exports = compare
+
+},{"../classes/semver":173}],180:[function(require,module,exports){
+const parse = require('./parse.js')
+
+const diff = (version1, version2) => {
+ const v1 = parse(version1, null, true)
+ const v2 = parse(version2, null, true)
+ const comparison = v1.compare(v2)
+
+ if (comparison === 0) {
+ return null
}
-}
-// if there's something in the buffer waiting, then process it
-function clearBuffer(stream, state) {
- state.bufferProcessing = true;
- var entry = state.bufferedRequest;
+ const v1Higher = comparison > 0
+ const highVersion = v1Higher ? v1 : v2
+ const lowVersion = v1Higher ? v2 : v1
+ const highHasPre = !!highVersion.prerelease.length
+ const lowHasPre = !!lowVersion.prerelease.length
- if (stream._writev && entry && entry.next) {
- // Fast case, write everything using _writev()
- var l = state.bufferedRequestCount;
- var buffer = new Array(l);
- var holder = state.corkedRequestsFree;
- holder.entry = entry;
+ if (lowHasPre && !highHasPre) {
+ // Going from prerelease -> no prerelease requires some special casing
- var count = 0;
- var allBuffers = true;
- while (entry) {
- buffer[count] = entry;
- if (!entry.isBuf) allBuffers = false;
- entry = entry.next;
- count += 1;
+ // If the low version has only a major, then it will always be a major
+ // Some examples:
+ // 1.0.0-1 -> 1.0.0
+ // 1.0.0-1 -> 1.1.1
+ // 1.0.0-1 -> 2.0.0
+ if (!lowVersion.patch && !lowVersion.minor) {
+ return 'major'
}
- buffer.allBuffers = allBuffers;
- doWrite(stream, state, true, state.length, buffer, '', holder.finish);
+ // Otherwise it can be determined by checking the high version
- // doWrite is almost always async, defer these to save a bit of time
- // as the hot path ends with doWrite
- state.pendingcb++;
- state.lastBufferedRequest = null;
- if (holder.next) {
- state.corkedRequestsFree = holder.next;
- holder.next = null;
- } else {
- state.corkedRequestsFree = new CorkedRequest(state);
+ if (highVersion.patch) {
+ // anything higher than a patch bump would result in the wrong version
+ return 'patch'
}
- state.bufferedRequestCount = 0;
- } else {
- // Slow case, write chunks one-by-one
- while (entry) {
- var chunk = entry.chunk;
- var encoding = entry.encoding;
- var cb = entry.callback;
- var len = state.objectMode ? 1 : chunk.length;
- doWrite(stream, state, false, len, chunk, encoding, cb);
- entry = entry.next;
- state.bufferedRequestCount--;
- // if we didn't call the onwrite immediately, then
- // it means that we need to wait until it does.
- // also, that means that the chunk and cb are currently
- // being processed, so move the buffer counter past them.
- if (state.writing) {
- break;
- }
+ if (highVersion.minor) {
+ // anything higher than a minor bump would result in the wrong version
+ return 'minor'
}
- if (entry === null) state.lastBufferedRequest = null;
+ // bumping major/minor/patch all have same result
+ return 'major'
}
- state.bufferedRequest = entry;
- state.bufferProcessing = false;
+ // add the `pre` prefix if we are going to a prerelease version
+ const prefix = highHasPre ? 'pre' : ''
+
+ if (v1.major !== v2.major) {
+ return prefix + 'major'
+ }
+
+ if (v1.minor !== v2.minor) {
+ return prefix + 'minor'
+ }
+
+ if (v1.patch !== v2.patch) {
+ return prefix + 'patch'
+ }
+
+ // high and low are preleases
+ return 'prerelease'
}
-Writable.prototype._write = function (chunk, encoding, cb) {
- cb(new Error('_write() is not implemented'));
-};
+module.exports = diff
-Writable.prototype._writev = null;
+},{"./parse.js":190}],181:[function(require,module,exports){
+const compare = require('./compare')
+const eq = (a, b, loose) => compare(a, b, loose) === 0
+module.exports = eq
-Writable.prototype.end = function (chunk, encoding, cb) {
- var state = this._writableState;
+},{"./compare":179}],182:[function(require,module,exports){
+const compare = require('./compare')
+const gt = (a, b, loose) => compare(a, b, loose) > 0
+module.exports = gt
- if (typeof chunk === 'function') {
- cb = chunk;
- chunk = null;
- encoding = null;
- } else if (typeof encoding === 'function') {
- cb = encoding;
- encoding = null;
- }
+},{"./compare":179}],183:[function(require,module,exports){
+const compare = require('./compare')
+const gte = (a, b, loose) => compare(a, b, loose) >= 0
+module.exports = gte
- if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
+},{"./compare":179}],184:[function(require,module,exports){
+const SemVer = require('../classes/semver')
- // .end() fully uncorks
- if (state.corked) {
- state.corked = 1;
- this.uncork();
+const inc = (version, release, options, identifier, identifierBase) => {
+ if (typeof (options) === 'string') {
+ identifierBase = identifier
+ identifier = options
+ options = undefined
}
- // ignore unnecessary end() calls.
- if (!state.ending) endWritable(this, state, cb);
-};
-
-function needFinish(state) {
- return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
-}
-function callFinal(stream, state) {
- stream._final(function (err) {
- state.pendingcb--;
- if (err) {
- stream.emit('error', err);
- }
- state.prefinished = true;
- stream.emit('prefinish');
- finishMaybe(stream, state);
- });
+ try {
+ return new SemVer(
+ version instanceof SemVer ? version.version : version,
+ options
+ ).inc(release, identifier, identifierBase).version
+ } catch (er) {
+ return null
+ }
}
-function prefinish(stream, state) {
- if (!state.prefinished && !state.finalCalled) {
- if (typeof stream._final === 'function') {
- state.pendingcb++;
- state.finalCalled = true;
- pna.nextTick(callFinal, stream, state);
- } else {
- state.prefinished = true;
- stream.emit('prefinish');
+module.exports = inc
+
+},{"../classes/semver":173}],185:[function(require,module,exports){
+const compare = require('./compare')
+const lt = (a, b, loose) => compare(a, b, loose) < 0
+module.exports = lt
+
+},{"./compare":179}],186:[function(require,module,exports){
+const compare = require('./compare')
+const lte = (a, b, loose) => compare(a, b, loose) <= 0
+module.exports = lte
+
+},{"./compare":179}],187:[function(require,module,exports){
+const SemVer = require('../classes/semver')
+const major = (a, loose) => new SemVer(a, loose).major
+module.exports = major
+
+},{"../classes/semver":173}],188:[function(require,module,exports){
+const SemVer = require('../classes/semver')
+const minor = (a, loose) => new SemVer(a, loose).minor
+module.exports = minor
+
+},{"../classes/semver":173}],189:[function(require,module,exports){
+const compare = require('./compare')
+const neq = (a, b, loose) => compare(a, b, loose) !== 0
+module.exports = neq
+
+},{"./compare":179}],190:[function(require,module,exports){
+const SemVer = require('../classes/semver')
+const parse = (version, options, throwErrors = false) => {
+ if (version instanceof SemVer) {
+ return version
+ }
+ try {
+ return new SemVer(version, options)
+ } catch (er) {
+ if (!throwErrors) {
+ return null
}
+ throw er
}
}
-function finishMaybe(stream, state) {
- var need = needFinish(state);
- if (need) {
- prefinish(stream, state);
- if (state.pendingcb === 0) {
- state.finished = true;
- stream.emit('finish');
- }
+module.exports = parse
+
+},{"../classes/semver":173}],191:[function(require,module,exports){
+const SemVer = require('../classes/semver')
+const patch = (a, loose) => new SemVer(a, loose).patch
+module.exports = patch
+
+},{"../classes/semver":173}],192:[function(require,module,exports){
+const parse = require('./parse')
+const prerelease = (version, options) => {
+ const parsed = parse(version, options)
+ return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
+}
+module.exports = prerelease
+
+},{"./parse":190}],193:[function(require,module,exports){
+const compare = require('./compare')
+const rcompare = (a, b, loose) => compare(b, a, loose)
+module.exports = rcompare
+
+},{"./compare":179}],194:[function(require,module,exports){
+const compareBuild = require('./compare-build')
+const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))
+module.exports = rsort
+
+},{"./compare-build":177}],195:[function(require,module,exports){
+const Range = require('../classes/range')
+const satisfies = (version, range, options) => {
+ try {
+ range = new Range(range, options)
+ } catch (er) {
+ return false
}
- return need;
+ return range.test(version)
+}
+module.exports = satisfies
+
+},{"../classes/range":172}],196:[function(require,module,exports){
+const compareBuild = require('./compare-build')
+const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))
+module.exports = sort
+
+},{"./compare-build":177}],197:[function(require,module,exports){
+const parse = require('./parse')
+const valid = (version, options) => {
+ const v = parse(version, options)
+ return v ? v.version : null
+}
+module.exports = valid
+
+},{"./parse":190}],198:[function(require,module,exports){
+// just pre-load all the stuff that index.js lazily exports
+const internalRe = require('./internal/re')
+const constants = require('./internal/constants')
+const SemVer = require('./classes/semver')
+const identifiers = require('./internal/identifiers')
+const parse = require('./functions/parse')
+const valid = require('./functions/valid')
+const clean = require('./functions/clean')
+const inc = require('./functions/inc')
+const diff = require('./functions/diff')
+const major = require('./functions/major')
+const minor = require('./functions/minor')
+const patch = require('./functions/patch')
+const prerelease = require('./functions/prerelease')
+const compare = require('./functions/compare')
+const rcompare = require('./functions/rcompare')
+const compareLoose = require('./functions/compare-loose')
+const compareBuild = require('./functions/compare-build')
+const sort = require('./functions/sort')
+const rsort = require('./functions/rsort')
+const gt = require('./functions/gt')
+const lt = require('./functions/lt')
+const eq = require('./functions/eq')
+const neq = require('./functions/neq')
+const gte = require('./functions/gte')
+const lte = require('./functions/lte')
+const cmp = require('./functions/cmp')
+const coerce = require('./functions/coerce')
+const Comparator = require('./classes/comparator')
+const Range = require('./classes/range')
+const satisfies = require('./functions/satisfies')
+const toComparators = require('./ranges/to-comparators')
+const maxSatisfying = require('./ranges/max-satisfying')
+const minSatisfying = require('./ranges/min-satisfying')
+const minVersion = require('./ranges/min-version')
+const validRange = require('./ranges/valid')
+const outside = require('./ranges/outside')
+const gtr = require('./ranges/gtr')
+const ltr = require('./ranges/ltr')
+const intersects = require('./ranges/intersects')
+const simplifyRange = require('./ranges/simplify')
+const subset = require('./ranges/subset')
+module.exports = {
+ parse,
+ valid,
+ clean,
+ inc,
+ diff,
+ major,
+ minor,
+ patch,
+ prerelease,
+ compare,
+ rcompare,
+ compareLoose,
+ compareBuild,
+ sort,
+ rsort,
+ gt,
+ lt,
+ eq,
+ neq,
+ gte,
+ lte,
+ cmp,
+ coerce,
+ Comparator,
+ Range,
+ satisfies,
+ toComparators,
+ maxSatisfying,
+ minSatisfying,
+ minVersion,
+ validRange,
+ outside,
+ gtr,
+ ltr,
+ intersects,
+ simplifyRange,
+ subset,
+ SemVer,
+ re: internalRe.re,
+ src: internalRe.src,
+ tokens: internalRe.t,
+ SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,
+ RELEASE_TYPES: constants.RELEASE_TYPES,
+ compareIdentifiers: identifiers.compareIdentifiers,
+ rcompareIdentifiers: identifiers.rcompareIdentifiers,
+}
+
+},{"./classes/comparator":171,"./classes/range":172,"./classes/semver":173,"./functions/clean":174,"./functions/cmp":175,"./functions/coerce":176,"./functions/compare":179,"./functions/compare-build":177,"./functions/compare-loose":178,"./functions/diff":180,"./functions/eq":181,"./functions/gt":182,"./functions/gte":183,"./functions/inc":184,"./functions/lt":185,"./functions/lte":186,"./functions/major":187,"./functions/minor":188,"./functions/neq":189,"./functions/parse":190,"./functions/patch":191,"./functions/prerelease":192,"./functions/rcompare":193,"./functions/rsort":194,"./functions/satisfies":195,"./functions/sort":196,"./functions/valid":197,"./internal/constants":199,"./internal/identifiers":201,"./internal/re":204,"./ranges/gtr":205,"./ranges/intersects":206,"./ranges/ltr":207,"./ranges/max-satisfying":208,"./ranges/min-satisfying":209,"./ranges/min-version":210,"./ranges/outside":211,"./ranges/simplify":212,"./ranges/subset":213,"./ranges/to-comparators":214,"./ranges/valid":215}],199:[function(require,module,exports){
+// Note: this is the semver.org version of the spec that it implements
+// Not necessarily the package version of this code.
+const SEMVER_SPEC_VERSION = '2.0.0'
+
+const MAX_LENGTH = 256
+const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
+/* istanbul ignore next */ 9007199254740991
+
+// Max safe segment length for coercion.
+const MAX_SAFE_COMPONENT_LENGTH = 16
+
+// Max safe length for a build identifier. The max length minus 6 characters for
+// the shortest version with a build 0.0.0+BUILD.
+const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6
+
+const RELEASE_TYPES = [
+ 'major',
+ 'premajor',
+ 'minor',
+ 'preminor',
+ 'patch',
+ 'prepatch',
+ 'prerelease',
+]
+
+module.exports = {
+ MAX_LENGTH,
+ MAX_SAFE_COMPONENT_LENGTH,
+ MAX_SAFE_BUILD_LENGTH,
+ MAX_SAFE_INTEGER,
+ RELEASE_TYPES,
+ SEMVER_SPEC_VERSION,
+ FLAG_INCLUDE_PRERELEASE: 0b001,
+ FLAG_LOOSE: 0b010,
}
-function endWritable(stream, state, cb) {
- state.ending = true;
- finishMaybe(stream, state);
- if (cb) {
- if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);
+},{}],200:[function(require,module,exports){
+(function (process){(function (){
+const debug = (
+ typeof process === 'object' &&
+ process.env &&
+ process.env.NODE_DEBUG &&
+ /\bsemver\b/i.test(process.env.NODE_DEBUG)
+) ? (...args) => console.error('SEMVER', ...args)
+ : () => {}
+
+module.exports = debug
+
+}).call(this)}).call(this,require('_process'))
+},{"_process":168}],201:[function(require,module,exports){
+const numeric = /^[0-9]+$/
+const compareIdentifiers = (a, b) => {
+ const anum = numeric.test(a)
+ const bnum = numeric.test(b)
+
+ if (anum && bnum) {
+ a = +a
+ b = +b
}
- state.ended = true;
- stream.writable = false;
+
+ return a === b ? 0
+ : (anum && !bnum) ? -1
+ : (bnum && !anum) ? 1
+ : a < b ? -1
+ : 1
}
-function onCorkedFinish(corkReq, state, err) {
- var entry = corkReq.entry;
- corkReq.entry = null;
- while (entry) {
- var cb = entry.callback;
- state.pendingcb--;
- cb(err);
- entry = entry.next;
+const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)
+
+module.exports = {
+ compareIdentifiers,
+ rcompareIdentifiers,
+}
+
+},{}],202:[function(require,module,exports){
+class LRUCache {
+ constructor () {
+ this.max = 1000
+ this.map = new Map()
+ }
+
+ get (key) {
+ const value = this.map.get(key)
+ if (value === undefined) {
+ return undefined
+ } else {
+ // Remove the key from the map and add it to the end
+ this.map.delete(key)
+ this.map.set(key, value)
+ return value
+ }
}
- // reuse the free corkReq.
- state.corkedRequestsFree.next = corkReq;
-}
+ delete (key) {
+ return this.map.delete(key)
+ }
-Object.defineProperty(Writable.prototype, 'destroyed', {
- get: function () {
- if (this._writableState === undefined) {
- return false;
- }
- return this._writableState.destroyed;
- },
- set: function (value) {
- // we ignore the value if the stream
- // has not been initialized yet
- if (!this._writableState) {
- return;
+ set (key, value) {
+ const deleted = this.delete(key)
+
+ if (!deleted && value !== undefined) {
+ // If cache is full, delete the least recently used item
+ if (this.map.size >= this.max) {
+ const firstKey = this.map.keys().next().value
+ this.delete(firstKey)
+ }
+
+ this.map.set(key, value)
}
- // backward compatibility, the user is explicitly
- // managing destroyed
- this._writableState.destroyed = value;
+ return this
}
-});
+}
-Writable.prototype.destroy = destroyImpl.destroy;
-Writable.prototype._undestroy = destroyImpl.undestroy;
-Writable.prototype._destroy = function (err, cb) {
- this.end();
- cb(err);
-};
-}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate)
-},{"./_stream_duplex":104,"./internal/streams/destroy":110,"./internal/streams/stream":111,"_process":101,"core-util-is":39,"inherits":80,"process-nextick-args":100,"safe-buffer":113,"timers":117,"util-deprecate":118}],109:[function(require,module,exports){
-'use strict';
+module.exports = LRUCache
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+},{}],203:[function(require,module,exports){
+// parse out just the options we care about
+const looseOption = Object.freeze({ loose: true })
+const emptyOpts = Object.freeze({ })
+const parseOptions = options => {
+ if (!options) {
+ return emptyOpts
+ }
-var Buffer = require('safe-buffer').Buffer;
-var util = require('util');
+ if (typeof options !== 'object') {
+ return looseOption
+ }
-function copyBuffer(src, target, offset) {
- src.copy(target, offset);
+ return options
}
+module.exports = parseOptions
-module.exports = function () {
- function BufferList() {
- _classCallCheck(this, BufferList);
+},{}],204:[function(require,module,exports){
+const {
+ MAX_SAFE_COMPONENT_LENGTH,
+ MAX_SAFE_BUILD_LENGTH,
+ MAX_LENGTH,
+} = require('./constants')
+const debug = require('./debug')
+exports = module.exports = {}
+
+// The actual regexps go on exports.re
+const re = exports.re = []
+const safeRe = exports.safeRe = []
+const src = exports.src = []
+const t = exports.t = {}
+let R = 0
+
+const LETTERDASHNUMBER = '[a-zA-Z0-9-]'
+
+// Replace some greedy regex tokens to prevent regex dos issues. These regex are
+// used internally via the safeRe object since all inputs in this library get
+// normalized first to trim and collapse all extra whitespace. The original
+// regexes are exported for userland consumption and lower level usage. A
+// future breaking change could export the safer regex only with a note that
+// all input should have extra whitespace removed.
+const safeRegexReplacements = [
+ ['\\s', 1],
+ ['\\d', MAX_LENGTH],
+ [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],
+]
- this.head = null;
- this.tail = null;
- this.length = 0;
+const makeSafeRegex = (value) => {
+ for (const [token, max] of safeRegexReplacements) {
+ value = value
+ .split(`${token}*`).join(`${token}{0,${max}}`)
+ .split(`${token}+`).join(`${token}{1,${max}}`)
}
+ return value
+}
- BufferList.prototype.push = function push(v) {
- var entry = { data: v, next: null };
- if (this.length > 0) this.tail.next = entry;else this.head = entry;
- this.tail = entry;
- ++this.length;
- };
+const createToken = (name, value, isGlobal) => {
+ const safe = makeSafeRegex(value)
+ const index = R++
+ debug(name, index, value)
+ t[name] = index
+ src[index] = value
+ re[index] = new RegExp(value, isGlobal ? 'g' : undefined)
+ safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)
+}
- BufferList.prototype.unshift = function unshift(v) {
- var entry = { data: v, next: this.head };
- if (this.length === 0) this.tail = entry;
- this.head = entry;
- ++this.length;
- };
+// The following Regular Expressions can be used for tokenizing,
+// validating, and parsing SemVer version strings.
- BufferList.prototype.shift = function shift() {
- if (this.length === 0) return;
- var ret = this.head.data;
- if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
- --this.length;
- return ret;
- };
+// ## Numeric Identifier
+// A single `0`, or a non-zero digit followed by zero or more digits.
- BufferList.prototype.clear = function clear() {
- this.head = this.tail = null;
- this.length = 0;
- };
+createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*')
+createToken('NUMERICIDENTIFIERLOOSE', '\\d+')
- BufferList.prototype.join = function join(s) {
- if (this.length === 0) return '';
- var p = this.head;
- var ret = '' + p.data;
- while (p = p.next) {
- ret += s + p.data;
- }return ret;
- };
+// ## Non-numeric Identifier
+// Zero or more digits, followed by a letter or hyphen, and then zero or
+// more letters, digits, or hyphens.
- BufferList.prototype.concat = function concat(n) {
- if (this.length === 0) return Buffer.alloc(0);
- var ret = Buffer.allocUnsafe(n >>> 0);
- var p = this.head;
- var i = 0;
- while (p) {
- copyBuffer(p.data, ret, i);
- i += p.data.length;
- p = p.next;
- }
- return ret;
- };
+createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)
- return BufferList;
-}();
+// ## Main Version
+// Three dot-separated numeric identifiers.
-if (util && util.inspect && util.inspect.custom) {
- module.exports.prototype[util.inspect.custom] = function () {
- var obj = util.inspect({ length: this.length });
- return this.constructor.name + ' ' + obj;
- };
-}
-},{"safe-buffer":113,"util":37}],110:[function(require,module,exports){
-'use strict';
+createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` +
+ `(${src[t.NUMERICIDENTIFIER]})\\.` +
+ `(${src[t.NUMERICIDENTIFIER]})`)
-/**/
+createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
+ `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` +
+ `(${src[t.NUMERICIDENTIFIERLOOSE]})`)
-var pna = require('process-nextick-args');
-/**/
+// ## Pre-release Version Identifier
+// A numeric identifier, or a non-numeric identifier.
-// undocumented cb() API, needed for core, not for public API
-function destroy(err, cb) {
- var _this = this;
+createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]
+}|${src[t.NONNUMERICIDENTIFIER]})`)
- var readableDestroyed = this._readableState && this._readableState.destroyed;
- var writableDestroyed = this._writableState && this._writableState.destroyed;
+createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]
+}|${src[t.NONNUMERICIDENTIFIER]})`)
- if (readableDestroyed || writableDestroyed) {
- if (cb) {
- cb(err);
- } else if (err) {
- if (!this._writableState) {
- pna.nextTick(emitErrorNT, this, err);
- } else if (!this._writableState.errorEmitted) {
- this._writableState.errorEmitted = true;
- pna.nextTick(emitErrorNT, this, err);
+// ## Pre-release Version
+// Hyphen, followed by one or more dot-separated pre-release version
+// identifiers.
+
+createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]
+}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`)
+
+createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]
+}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)
+
+// ## Build Metadata Identifier
+// Any combination of digits, letters, or hyphens.
+
+createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)
+
+// ## Build Metadata
+// Plus sign, followed by one or more period-separated build metadata
+// identifiers.
+
+createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER]
+}(?:\\.${src[t.BUILDIDENTIFIER]})*))`)
+
+// ## Full Version String
+// A main version, followed optionally by a pre-release version and
+// build metadata.
+
+// Note that the only major, minor, patch, and pre-release sections of
+// the version string are capturing groups. The build metadata is not a
+// capturing group, because it should not ever be used in version
+// comparison.
+
+createToken('FULLPLAIN', `v?${src[t.MAINVERSION]
+}${src[t.PRERELEASE]}?${
+ src[t.BUILD]}?`)
+
+createToken('FULL', `^${src[t.FULLPLAIN]}$`)
+
+// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
+// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
+// common in the npm registry.
+createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE]
+}${src[t.PRERELEASELOOSE]}?${
+ src[t.BUILD]}?`)
+
+createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)
+
+createToken('GTLT', '((?:<|>)?=?)')
+
+// Something like "2.*" or "1.2.x".
+// Note that "x.x" is a valid xRange identifer, meaning "any version"
+// Only the first item is strictly required.
+createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`)
+createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`)
+
+createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` +
+ `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
+ `(?:\\.(${src[t.XRANGEIDENTIFIER]})` +
+ `(?:${src[t.PRERELEASE]})?${
+ src[t.BUILD]}?` +
+ `)?)?`)
+
+createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +
+ `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
+ `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +
+ `(?:${src[t.PRERELEASELOOSE]})?${
+ src[t.BUILD]}?` +
+ `)?)?`)
+
+createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`)
+createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`)
+
+// Coercion.
+// Extract anything that could conceivably be a part of a valid semver
+createToken('COERCEPLAIN', `${'(^|[^\\d])' +
+ '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +
+ `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +
+ `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)
+createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`)
+createToken('COERCEFULL', src[t.COERCEPLAIN] +
+ `(?:${src[t.PRERELEASE]})?` +
+ `(?:${src[t.BUILD]})?` +
+ `(?:$|[^\\d])`)
+createToken('COERCERTL', src[t.COERCE], true)
+createToken('COERCERTLFULL', src[t.COERCEFULL], true)
+
+// Tilde ranges.
+// Meaning is "reasonably at or greater than"
+createToken('LONETILDE', '(?:~>?)')
+
+createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true)
+exports.tildeTrimReplace = '$1~'
+
+createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)
+createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)
+
+// Caret ranges.
+// Meaning is "at least and backwards compatible with"
+createToken('LONECARET', '(?:\\^)')
+
+createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true)
+exports.caretTrimReplace = '$1^'
+
+createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)
+createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)
+
+// A simple gt/lt/eq thing, or just "" to indicate "any version"
+createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`)
+createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`)
+
+// An expression to strip any whitespace between the gtlt and the thing
+// it modifies, so that `> 1.2.3` ==> `>1.2.3`
+createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT]
+}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)
+exports.comparatorTrimReplace = '$1$2$3'
+
+// Something like `1.2.3 - 1.2.4`
+// Note that these all use the loose form, because they'll be
+// checked against either the strict or loose comparator form
+// later.
+createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` +
+ `\\s+-\\s+` +
+ `(${src[t.XRANGEPLAIN]})` +
+ `\\s*$`)
+
+createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` +
+ `\\s+-\\s+` +
+ `(${src[t.XRANGEPLAINLOOSE]})` +
+ `\\s*$`)
+
+// Star ranges basically just allow anything at all.
+createToken('STAR', '(<|>)?=?\\s*\\*')
+// >=0.0.0 is like a star
+createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$')
+createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$')
+
+},{"./constants":199,"./debug":200}],205:[function(require,module,exports){
+// Determine if version is greater than all the versions possible in the range.
+const outside = require('./outside')
+const gtr = (version, range, options) => outside(version, range, '>', options)
+module.exports = gtr
+
+},{"./outside":211}],206:[function(require,module,exports){
+const Range = require('../classes/range')
+const intersects = (r1, r2, options) => {
+ r1 = new Range(r1, options)
+ r2 = new Range(r2, options)
+ return r1.intersects(r2, options)
+}
+module.exports = intersects
+
+},{"../classes/range":172}],207:[function(require,module,exports){
+const outside = require('./outside')
+// Determine if version is less than all the versions possible in the range
+const ltr = (version, range, options) => outside(version, range, '<', options)
+module.exports = ltr
+
+},{"./outside":211}],208:[function(require,module,exports){
+const SemVer = require('../classes/semver')
+const Range = require('../classes/range')
+
+const maxSatisfying = (versions, range, options) => {
+ let max = null
+ let maxSV = null
+ let rangeObj = null
+ try {
+ rangeObj = new Range(range, options)
+ } catch (er) {
+ return null
+ }
+ versions.forEach((v) => {
+ if (rangeObj.test(v)) {
+ // satisfies(v, range, options)
+ if (!max || maxSV.compare(v) === -1) {
+ // compare(max, v, true)
+ max = v
+ maxSV = new SemVer(max, options)
}
}
+ })
+ return max
+}
+module.exports = maxSatisfying
- return this;
+},{"../classes/range":172,"../classes/semver":173}],209:[function(require,module,exports){
+const SemVer = require('../classes/semver')
+const Range = require('../classes/range')
+const minSatisfying = (versions, range, options) => {
+ let min = null
+ let minSV = null
+ let rangeObj = null
+ try {
+ rangeObj = new Range(range, options)
+ } catch (er) {
+ return null
}
+ versions.forEach((v) => {
+ if (rangeObj.test(v)) {
+ // satisfies(v, range, options)
+ if (!min || minSV.compare(v) === 1) {
+ // compare(min, v, true)
+ min = v
+ minSV = new SemVer(min, options)
+ }
+ }
+ })
+ return min
+}
+module.exports = minSatisfying
- // we set destroyed to true before firing error callbacks in order
- // to make it re-entrance safe in case destroy() is called within callbacks
+},{"../classes/range":172,"../classes/semver":173}],210:[function(require,module,exports){
+const SemVer = require('../classes/semver')
+const Range = require('../classes/range')
+const gt = require('../functions/gt')
- if (this._readableState) {
- this._readableState.destroyed = true;
+const minVersion = (range, loose) => {
+ range = new Range(range, loose)
+
+ let minver = new SemVer('0.0.0')
+ if (range.test(minver)) {
+ return minver
}
- // if this is a duplex stream mark the writable part as destroyed as well
- if (this._writableState) {
- this._writableState.destroyed = true;
+ minver = new SemVer('0.0.0-0')
+ if (range.test(minver)) {
+ return minver
}
- this._destroy(err || null, function (err) {
- if (!cb && err) {
- if (!_this._writableState) {
- pna.nextTick(emitErrorNT, _this, err);
- } else if (!_this._writableState.errorEmitted) {
- _this._writableState.errorEmitted = true;
- pna.nextTick(emitErrorNT, _this, err);
+ minver = null
+ for (let i = 0; i < range.set.length; ++i) {
+ const comparators = range.set[i]
+
+ let setMin = null
+ comparators.forEach((comparator) => {
+ // Clone to avoid manipulating the comparator's semver object.
+ const compver = new SemVer(comparator.semver.version)
+ switch (comparator.operator) {
+ case '>':
+ if (compver.prerelease.length === 0) {
+ compver.patch++
+ } else {
+ compver.prerelease.push(0)
+ }
+ compver.raw = compver.format()
+ /* fallthrough */
+ case '':
+ case '>=':
+ if (!setMin || gt(compver, setMin)) {
+ setMin = compver
+ }
+ break
+ case '<':
+ case '<=':
+ /* Ignore maximum versions */
+ break
+ /* istanbul ignore next */
+ default:
+ throw new Error(`Unexpected operation: ${comparator.operator}`)
}
- } else if (cb) {
- cb(err);
+ })
+ if (setMin && (!minver || gt(minver, setMin))) {
+ minver = setMin
}
- });
+ }
- return this;
+ if (minver && range.test(minver)) {
+ return minver
+ }
+
+ return null
}
+module.exports = minVersion
+
+},{"../classes/range":172,"../classes/semver":173,"../functions/gt":182}],211:[function(require,module,exports){
+const SemVer = require('../classes/semver')
+const Comparator = require('../classes/comparator')
+const { ANY } = Comparator
+const Range = require('../classes/range')
+const satisfies = require('../functions/satisfies')
+const gt = require('../functions/gt')
+const lt = require('../functions/lt')
+const lte = require('../functions/lte')
+const gte = require('../functions/gte')
+
+const outside = (version, range, hilo, options) => {
+ version = new SemVer(version, options)
+ range = new Range(range, options)
+
+ let gtfn, ltefn, ltfn, comp, ecomp
+ switch (hilo) {
+ case '>':
+ gtfn = gt
+ ltefn = lte
+ ltfn = lt
+ comp = '>'
+ ecomp = '>='
+ break
+ case '<':
+ gtfn = lt
+ ltefn = gte
+ ltfn = gt
+ comp = '<'
+ ecomp = '<='
+ break
+ default:
+ throw new TypeError('Must provide a hilo val of "<" or ">"')
+ }
-function undestroy() {
- if (this._readableState) {
- this._readableState.destroyed = false;
- this._readableState.reading = false;
- this._readableState.ended = false;
- this._readableState.endEmitted = false;
+ // If it satisfies the range it is not outside
+ if (satisfies(version, range, options)) {
+ return false
}
- if (this._writableState) {
- this._writableState.destroyed = false;
- this._writableState.ended = false;
- this._writableState.ending = false;
- this._writableState.finalCalled = false;
- this._writableState.prefinished = false;
- this._writableState.finished = false;
- this._writableState.errorEmitted = false;
+ // From now on, variable terms are as if we're in "gtr" mode.
+ // but note that everything is flipped for the "ltr" function.
+
+ for (let i = 0; i < range.set.length; ++i) {
+ const comparators = range.set[i]
+
+ let high = null
+ let low = null
+
+ comparators.forEach((comparator) => {
+ if (comparator.semver === ANY) {
+ comparator = new Comparator('>=0.0.0')
+ }
+ high = high || comparator
+ low = low || comparator
+ if (gtfn(comparator.semver, high.semver, options)) {
+ high = comparator
+ } else if (ltfn(comparator.semver, low.semver, options)) {
+ low = comparator
+ }
+ })
+
+ // If the edge version comparator has a operator then our version
+ // isn't outside it
+ if (high.operator === comp || high.operator === ecomp) {
+ return false
+ }
+
+ // If the lowest version comparator has an operator and our version
+ // is less than it then it isn't higher than the range
+ if ((!low.operator || low.operator === comp) &&
+ ltefn(version, low.semver)) {
+ return false
+ } else if (low.operator === ecomp && ltfn(version, low.semver)) {
+ return false
+ }
}
+ return true
}
-function emitErrorNT(self, err) {
- self.emit('error', err);
+module.exports = outside
+
+},{"../classes/comparator":171,"../classes/range":172,"../classes/semver":173,"../functions/gt":182,"../functions/gte":183,"../functions/lt":185,"../functions/lte":186,"../functions/satisfies":195}],212:[function(require,module,exports){
+// given a set of versions and a range, create a "simplified" range
+// that includes the same versions that the original range does
+// If the original range is shorter than the simplified one, return that.
+const satisfies = require('../functions/satisfies.js')
+const compare = require('../functions/compare.js')
+module.exports = (versions, range, options) => {
+ const set = []
+ let first = null
+ let prev = null
+ const v = versions.sort((a, b) => compare(a, b, options))
+ for (const version of v) {
+ const included = satisfies(version, range, options)
+ if (included) {
+ prev = version
+ if (!first) {
+ first = version
+ }
+ } else {
+ if (prev) {
+ set.push([first, prev])
+ }
+ prev = null
+ first = null
+ }
+ }
+ if (first) {
+ set.push([first, null])
+ }
+
+ const ranges = []
+ for (const [min, max] of set) {
+ if (min === max) {
+ ranges.push(min)
+ } else if (!max && min === v[0]) {
+ ranges.push('*')
+ } else if (!max) {
+ ranges.push(`>=${min}`)
+ } else if (min === v[0]) {
+ ranges.push(`<=${max}`)
+ } else {
+ ranges.push(`${min} - ${max}`)
+ }
+ }
+ const simplified = ranges.join(' || ')
+ const original = typeof range.raw === 'string' ? range.raw : String(range)
+ return simplified.length < original.length ? simplified : range
}
-module.exports = {
- destroy: destroy,
- undestroy: undestroy
-};
-},{"process-nextick-args":100}],111:[function(require,module,exports){
-module.exports = require('events').EventEmitter;
+},{"../functions/compare.js":179,"../functions/satisfies.js":195}],213:[function(require,module,exports){
+const Range = require('../classes/range.js')
+const Comparator = require('../classes/comparator.js')
+const { ANY } = Comparator
+const satisfies = require('../functions/satisfies.js')
+const compare = require('../functions/compare.js')
-},{"events":51}],112:[function(require,module,exports){
-exports = module.exports = require('./lib/_stream_readable.js');
-exports.Stream = exports;
-exports.Readable = exports;
-exports.Writable = require('./lib/_stream_writable.js');
-exports.Duplex = require('./lib/_stream_duplex.js');
-exports.Transform = require('./lib/_stream_transform.js');
-exports.PassThrough = require('./lib/_stream_passthrough.js');
+// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:
+// - Every simple range `r1, r2, ...` is a null set, OR
+// - Every simple range `r1, r2, ...` which is not a null set is a subset of
+// some `R1, R2, ...`
+//
+// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:
+// - If c is only the ANY comparator
+// - If C is only the ANY comparator, return true
+// - Else if in prerelease mode, return false
+// - else replace c with `[>=0.0.0]`
+// - If C is only the ANY comparator
+// - if in prerelease mode, return true
+// - else replace C with `[>=0.0.0]`
+// - Let EQ be the set of = comparators in c
+// - If EQ is more than one, return true (null set)
+// - Let GT be the highest > or >= comparator in c
+// - Let LT be the lowest < or <= comparator in c
+// - If GT and LT, and GT.semver > LT.semver, return true (null set)
+// - If any C is a = range, and GT or LT are set, return false
+// - If EQ
+// - If GT, and EQ does not satisfy GT, return true (null set)
+// - If LT, and EQ does not satisfy LT, return true (null set)
+// - If EQ satisfies every C, return true
+// - Else return false
+// - If GT
+// - If GT.semver is lower than any > or >= comp in C, return false
+// - If GT is >=, and GT.semver does not satisfy every C, return false
+// - If GT.semver has a prerelease, and not in prerelease mode
+// - If no C has a prerelease and the GT.semver tuple, return false
+// - If LT
+// - If LT.semver is greater than any < or <= comp in C, return false
+// - If LT is <=, and LT.semver does not satisfy every C, return false
+// - If GT.semver has a prerelease, and not in prerelease mode
+// - If no C has a prerelease and the LT.semver tuple, return false
+// - Else return true
+
+const subset = (sub, dom, options = {}) => {
+ if (sub === dom) {
+ return true
+ }
-},{"./lib/_stream_duplex.js":104,"./lib/_stream_passthrough.js":105,"./lib/_stream_readable.js":106,"./lib/_stream_transform.js":107,"./lib/_stream_writable.js":108}],113:[function(require,module,exports){
-/* eslint-disable node/no-deprecated-api */
-var buffer = require('buffer')
-var Buffer = buffer.Buffer
+ sub = new Range(sub, options)
+ dom = new Range(dom, options)
+ let sawNonNull = false
-// alternative to using Object.keys for old browsers
-function copyProps (src, dst) {
- for (var key in src) {
- dst[key] = src[key]
+ OUTER: for (const simpleSub of sub.set) {
+ for (const simpleDom of dom.set) {
+ const isSub = simpleSubset(simpleSub, simpleDom, options)
+ sawNonNull = sawNonNull || isSub !== null
+ if (isSub) {
+ continue OUTER
+ }
+ }
+ // the null set is a subset of everything, but null simple ranges in
+ // a complex range should be ignored. so if we saw a non-null range,
+ // then we know this isn't a subset, but if EVERY simple range was null,
+ // then it is a subset.
+ if (sawNonNull) {
+ return false
+ }
}
-}
-if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
- module.exports = buffer
-} else {
- // Copy properties from require('buffer')
- copyProps(buffer, exports)
- exports.Buffer = SafeBuffer
+ return true
}
-function SafeBuffer (arg, encodingOrOffset, length) {
- return Buffer(arg, encodingOrOffset, length)
-}
+const minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]
+const minimumVersion = [new Comparator('>=0.0.0')]
+
+const simpleSubset = (sub, dom, options) => {
+ if (sub === dom) {
+ return true
+ }
+
+ if (sub.length === 1 && sub[0].semver === ANY) {
+ if (dom.length === 1 && dom[0].semver === ANY) {
+ return true
+ } else if (options.includePrerelease) {
+ sub = minimumVersionWithPreRelease
+ } else {
+ sub = minimumVersion
+ }
+ }
+
+ if (dom.length === 1 && dom[0].semver === ANY) {
+ if (options.includePrerelease) {
+ return true
+ } else {
+ dom = minimumVersion
+ }
+ }
+
+ const eqSet = new Set()
+ let gt, lt
+ for (const c of sub) {
+ if (c.operator === '>' || c.operator === '>=') {
+ gt = higherGT(gt, c, options)
+ } else if (c.operator === '<' || c.operator === '<=') {
+ lt = lowerLT(lt, c, options)
+ } else {
+ eqSet.add(c.semver)
+ }
+ }
+
+ if (eqSet.size > 1) {
+ return null
+ }
+
+ let gtltComp
+ if (gt && lt) {
+ gtltComp = compare(gt.semver, lt.semver, options)
+ if (gtltComp > 0) {
+ return null
+ } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {
+ return null
+ }
+ }
+
+ // will iterate one or zero times
+ for (const eq of eqSet) {
+ if (gt && !satisfies(eq, String(gt), options)) {
+ return null
+ }
+
+ if (lt && !satisfies(eq, String(lt), options)) {
+ return null
+ }
+
+ for (const c of dom) {
+ if (!satisfies(eq, String(c), options)) {
+ return false
+ }
+ }
+
+ return true
+ }
+
+ let higher, lower
+ let hasDomLT, hasDomGT
+ // if the subset has a prerelease, we need a comparator in the superset
+ // with the same tuple and a prerelease, or it's not a subset
+ let needDomLTPre = lt &&
+ !options.includePrerelease &&
+ lt.semver.prerelease.length ? lt.semver : false
+ let needDomGTPre = gt &&
+ !options.includePrerelease &&
+ gt.semver.prerelease.length ? gt.semver : false
+ // exception: <1.2.3-0 is the same as <1.2.3
+ if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&
+ lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {
+ needDomLTPre = false
+ }
+
+ for (const c of dom) {
+ hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='
+ hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='
+ if (gt) {
+ if (needDomGTPre) {
+ if (c.semver.prerelease && c.semver.prerelease.length &&
+ c.semver.major === needDomGTPre.major &&
+ c.semver.minor === needDomGTPre.minor &&
+ c.semver.patch === needDomGTPre.patch) {
+ needDomGTPre = false
+ }
+ }
+ if (c.operator === '>' || c.operator === '>=') {
+ higher = higherGT(gt, c, options)
+ if (higher === c && higher !== gt) {
+ return false
+ }
+ } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {
+ return false
+ }
+ }
+ if (lt) {
+ if (needDomLTPre) {
+ if (c.semver.prerelease && c.semver.prerelease.length &&
+ c.semver.major === needDomLTPre.major &&
+ c.semver.minor === needDomLTPre.minor &&
+ c.semver.patch === needDomLTPre.patch) {
+ needDomLTPre = false
+ }
+ }
+ if (c.operator === '<' || c.operator === '<=') {
+ lower = lowerLT(lt, c, options)
+ if (lower === c && lower !== lt) {
+ return false
+ }
+ } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {
+ return false
+ }
+ }
+ if (!c.operator && (lt || gt) && gtltComp !== 0) {
+ return false
+ }
+ }
-// Copy static methods from Buffer
-copyProps(Buffer, SafeBuffer)
+ // if there was a < or >, and nothing in the dom, then must be false
+ // UNLESS it was limited by another range in the other direction.
+ // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0
+ if (gt && hasDomLT && !lt && gtltComp !== 0) {
+ return false
+ }
-SafeBuffer.from = function (arg, encodingOrOffset, length) {
- if (typeof arg === 'number') {
- throw new TypeError('Argument must not be a number')
+ if (lt && hasDomGT && !gt && gtltComp !== 0) {
+ return false
}
- return Buffer(arg, encodingOrOffset, length)
-}
-SafeBuffer.alloc = function (size, fill, encoding) {
- if (typeof size !== 'number') {
- throw new TypeError('Argument must be a number')
+ // we needed a prerelease range in a specific tuple, but didn't get one
+ // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,
+ // because it includes prereleases in the 1.2.3 tuple
+ if (needDomGTPre || needDomLTPre) {
+ return false
}
- var buf = Buffer(size)
- if (fill !== undefined) {
- if (typeof encoding === 'string') {
- buf.fill(fill, encoding)
- } else {
- buf.fill(fill)
- }
- } else {
- buf.fill(0)
+
+ return true
+}
+
+// >=1.2.3 is lower than >1.2.3
+const higherGT = (a, b, options) => {
+ if (!a) {
+ return b
}
- return buf
+ const comp = compare(a.semver, b.semver, options)
+ return comp > 0 ? a
+ : comp < 0 ? b
+ : b.operator === '>' && a.operator === '>=' ? b
+ : a
}
-SafeBuffer.allocUnsafe = function (size) {
- if (typeof size !== 'number') {
- throw new TypeError('Argument must be a number')
+// <=1.2.3 is higher than <1.2.3
+const lowerLT = (a, b, options) => {
+ if (!a) {
+ return b
}
- return Buffer(size)
+ const comp = compare(a.semver, b.semver, options)
+ return comp < 0 ? a
+ : comp > 0 ? b
+ : b.operator === '<' && a.operator === '<=' ? b
+ : a
}
-SafeBuffer.allocUnsafeSlow = function (size) {
- if (typeof size !== 'number') {
- throw new TypeError('Argument must be a number')
+module.exports = subset
+
+},{"../classes/comparator.js":171,"../classes/range.js":172,"../functions/compare.js":179,"../functions/satisfies.js":195}],214:[function(require,module,exports){
+const Range = require('../classes/range')
+
+// Mostly just for testing and legacy API reasons
+const toComparators = (range, options) =>
+ new Range(range, options).set
+ .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))
+
+module.exports = toComparators
+
+},{"../classes/range":172}],215:[function(require,module,exports){
+const Range = require('../classes/range')
+const validRange = (range, options) => {
+ try {
+ // Return '*' instead of '' so that truthiness works.
+ // This will throw if it's invalid anyway
+ return new Range(range, options).range || '*'
+ } catch (er) {
+ return null
}
- return buffer.SlowBuffer(size)
}
+module.exports = validRange
-},{"buffer":38}],114:[function(require,module,exports){
+},{"../classes/range":172}],216:[function(require,module,exports){
(function (setImmediate){(function (){
'use strict';
module.exports = typeof setImmediate === 'function' ? setImmediate :
@@ -25729,7 +32564,7 @@ module.exports = typeof setImmediate === 'function' ? setImmediate :
};
}).call(this)}).call(this,require("timers").setImmediate)
-},{"timers":117}],115:[function(require,module,exports){
+},{"timers":220}],217:[function(require,module,exports){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
@@ -25857,192 +32692,1255 @@ StringDecoder.prototype.end = utf8End;
// Returns only complete characters in a Buffer
StringDecoder.prototype.text = utf8Text;
-// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
-StringDecoder.prototype.fillLast = function (buf) {
- if (this.lastNeed <= buf.length) {
- buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
- return this.lastChar.toString(this.encoding, 0, this.lastTotal);
- }
- buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
- this.lastNeed -= buf.length;
-};
+// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
+StringDecoder.prototype.fillLast = function (buf) {
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
+ this.lastNeed -= buf.length;
+};
+
+// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
+// continuation byte. If an invalid byte is detected, -2 is returned.
+function utf8CheckByte(byte) {
+ if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
+ return byte >> 6 === 0x02 ? -1 : -2;
+}
+
+// Checks at most 3 bytes at the end of a Buffer in order to detect an
+// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
+// needed to complete the UTF-8 character (if applicable) are returned.
+function utf8CheckIncomplete(self, buf, i) {
+ var j = buf.length - 1;
+ if (j < i) return 0;
+ var nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 1;
+ return nb;
+ }
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 2;
+ return nb;
+ }
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) {
+ if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
+ }
+ return nb;
+ }
+ return 0;
+}
+
+// Validates as many continuation bytes for a multi-byte UTF-8 character as
+// needed or are available. If we see a non-continuation byte where we expect
+// one, we "replace" the validated continuation bytes we've seen so far with
+// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
+// behavior. The continuation byte check is included three times in the case
+// where all of the continuation bytes for a character exist in the same buffer.
+// It is also done this way as a slight performance increase instead of using a
+// loop.
+function utf8CheckExtraBytes(self, buf, p) {
+ if ((buf[0] & 0xC0) !== 0x80) {
+ self.lastNeed = 0;
+ return '\ufffd';
+ }
+ if (self.lastNeed > 1 && buf.length > 1) {
+ if ((buf[1] & 0xC0) !== 0x80) {
+ self.lastNeed = 1;
+ return '\ufffd';
+ }
+ if (self.lastNeed > 2 && buf.length > 2) {
+ if ((buf[2] & 0xC0) !== 0x80) {
+ self.lastNeed = 2;
+ return '\ufffd';
+ }
+ }
+ }
+}
+
+// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
+function utf8FillLast(buf) {
+ var p = this.lastTotal - this.lastNeed;
+ var r = utf8CheckExtraBytes(this, buf, p);
+ if (r !== undefined) return r;
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, p, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+ buf.copy(this.lastChar, p, 0, buf.length);
+ this.lastNeed -= buf.length;
+}
+
+// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
+// partial character, the character's bytes are buffered until the required
+// number of bytes are available.
+function utf8Text(buf, i) {
+ var total = utf8CheckIncomplete(this, buf, i);
+ if (!this.lastNeed) return buf.toString('utf8', i);
+ this.lastTotal = total;
+ var end = buf.length - (total - this.lastNeed);
+ buf.copy(this.lastChar, 0, end);
+ return buf.toString('utf8', i, end);
+}
+
+// For UTF-8, a replacement character is added when ending on a partial
+// character.
+function utf8End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + '\ufffd';
+ return r;
+}
+
+// UTF-16LE typically needs two bytes per character, but even if we have an even
+// number of bytes available, we need to check if we end on a leading/high
+// surrogate. In that case, we need to wait for the next two bytes in order to
+// decode the last character properly.
+function utf16Text(buf, i) {
+ if ((buf.length - i) % 2 === 0) {
+ var r = buf.toString('utf16le', i);
+ if (r) {
+ var c = r.charCodeAt(r.length - 1);
+ if (c >= 0xD800 && c <= 0xDBFF) {
+ this.lastNeed = 2;
+ this.lastTotal = 4;
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ return r.slice(0, -1);
+ }
+ }
+ return r;
+ }
+ this.lastNeed = 1;
+ this.lastTotal = 2;
+ this.lastChar[0] = buf[buf.length - 1];
+ return buf.toString('utf16le', i, buf.length - 1);
+}
+
+// For UTF-16LE we do not explicitly append special replacement characters if we
+// end on a partial character, we simply let v8 handle that.
+function utf16End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) {
+ var end = this.lastTotal - this.lastNeed;
+ return r + this.lastChar.toString('utf16le', 0, end);
+ }
+ return r;
+}
+
+function base64Text(buf, i) {
+ var n = (buf.length - i) % 3;
+ if (n === 0) return buf.toString('base64', i);
+ this.lastNeed = 3 - n;
+ this.lastTotal = 3;
+ if (n === 1) {
+ this.lastChar[0] = buf[buf.length - 1];
+ } else {
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ }
+ return buf.toString('base64', i, buf.length - n);
+}
+
+function base64End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
+ return r;
+}
+
+// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
+function simpleWrite(buf) {
+ return buf.toString(this.encoding);
+}
+
+function simpleEnd(buf) {
+ return buf && buf.length ? this.write(buf) : '';
+}
+},{"safe-buffer":170}],218:[function(require,module,exports){
+var isHexPrefixed = require('is-hex-prefixed');
+
+/**
+ * Removes '0x' from a given `String` is present
+ * @param {String} str the string value
+ * @return {String|Optional} a string by pass if necessary
+ */
+module.exports = function stripHexPrefix(str) {
+ if (typeof str !== 'string') {
+ return str;
+ }
+
+ return isHexPrefixed(str) ? str.slice(2) : str;
+}
+
+},{"is-hex-prefixed":158}],219:[function(require,module,exports){
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Superstruct = {}));
+})(this, (function (exports) { 'use strict';
+
+ /**
+ * A `StructFailure` represents a single specific failure in validation.
+ */
+ /**
+ * `StructError` objects are thrown (or returned) when validation fails.
+ *
+ * Validation logic is design to exit early for maximum performance. The error
+ * represents the first error encountered during validation. For more detail,
+ * the `error.failures` property is a generator function that can be run to
+ * continue validation and receive all the failures in the data.
+ */
+ class StructError extends TypeError {
+ constructor(failure, failures) {
+ let cached;
+ const { message, explanation, ...rest } = failure;
+ const { path } = failure;
+ const msg = path.length === 0 ? message : `At path: ${path.join('.')} -- ${message}`;
+ super(explanation ?? msg);
+ if (explanation != null)
+ this.cause = msg;
+ Object.assign(this, rest);
+ this.name = this.constructor.name;
+ this.failures = () => {
+ return (cached ?? (cached = [failure, ...failures()]));
+ };
+ }
+ }
+
+ /**
+ * Check if a value is an iterator.
+ */
+ function isIterable(x) {
+ return isObject(x) && typeof x[Symbol.iterator] === 'function';
+ }
+ /**
+ * Check if a value is a plain object.
+ */
+ function isObject(x) {
+ return typeof x === 'object' && x != null;
+ }
+ /**
+ * Check if a value is a plain object.
+ */
+ function isPlainObject(x) {
+ if (Object.prototype.toString.call(x) !== '[object Object]') {
+ return false;
+ }
+ const prototype = Object.getPrototypeOf(x);
+ return prototype === null || prototype === Object.prototype;
+ }
+ /**
+ * Return a value as a printable string.
+ */
+ function print(value) {
+ if (typeof value === 'symbol') {
+ return value.toString();
+ }
+ return typeof value === 'string' ? JSON.stringify(value) : `${value}`;
+ }
+ /**
+ * Shifts (removes and returns) the first value from the `input` iterator.
+ * Like `Array.prototype.shift()` but for an `Iterator`.
+ */
+ function shiftIterator(input) {
+ const { done, value } = input.next();
+ return done ? undefined : value;
+ }
+ /**
+ * Convert a single validation result to a failure.
+ */
+ function toFailure(result, context, struct, value) {
+ if (result === true) {
+ return;
+ }
+ else if (result === false) {
+ result = {};
+ }
+ else if (typeof result === 'string') {
+ result = { message: result };
+ }
+ const { path, branch } = context;
+ const { type } = struct;
+ const { refinement, message = `Expected a value of type \`${type}\`${refinement ? ` with refinement \`${refinement}\`` : ''}, but received: \`${print(value)}\``, } = result;
+ return {
+ value,
+ type,
+ refinement,
+ key: path[path.length - 1],
+ path,
+ branch,
+ ...result,
+ message,
+ };
+ }
+ /**
+ * Convert a validation result to an iterable of failures.
+ */
+ function* toFailures(result, context, struct, value) {
+ if (!isIterable(result)) {
+ result = [result];
+ }
+ for (const r of result) {
+ const failure = toFailure(r, context, struct, value);
+ if (failure) {
+ yield failure;
+ }
+ }
+ }
+ /**
+ * Check a value against a struct, traversing deeply into nested values, and
+ * returning an iterator of failures or success.
+ */
+ function* run(value, struct, options = {}) {
+ const { path = [], branch = [value], coerce = false, mask = false } = options;
+ const ctx = { path, branch };
+ if (coerce) {
+ value = struct.coercer(value, ctx);
+ if (mask &&
+ struct.type !== 'type' &&
+ isObject(struct.schema) &&
+ isObject(value) &&
+ !Array.isArray(value)) {
+ for (const key in value) {
+ if (struct.schema[key] === undefined) {
+ delete value[key];
+ }
+ }
+ }
+ }
+ let status = 'valid';
+ for (const failure of struct.validator(value, ctx)) {
+ failure.explanation = options.message;
+ status = 'not_valid';
+ yield [failure, undefined];
+ }
+ for (let [k, v, s] of struct.entries(value, ctx)) {
+ const ts = run(v, s, {
+ path: k === undefined ? path : [...path, k],
+ branch: k === undefined ? branch : [...branch, v],
+ coerce,
+ mask,
+ message: options.message,
+ });
+ for (const t of ts) {
+ if (t[0]) {
+ status = t[0].refinement != null ? 'not_refined' : 'not_valid';
+ yield [t[0], undefined];
+ }
+ else if (coerce) {
+ v = t[1];
+ if (k === undefined) {
+ value = v;
+ }
+ else if (value instanceof Map) {
+ value.set(k, v);
+ }
+ else if (value instanceof Set) {
+ value.add(v);
+ }
+ else if (isObject(value)) {
+ if (v !== undefined || k in value)
+ value[k] = v;
+ }
+ }
+ }
+ }
+ if (status !== 'not_valid') {
+ for (const failure of struct.refiner(value, ctx)) {
+ failure.explanation = options.message;
+ status = 'not_refined';
+ yield [failure, undefined];
+ }
+ }
+ if (status === 'valid') {
+ yield [undefined, value];
+ }
+ }
+
+ /**
+ * `Struct` objects encapsulate the validation logic for a specific type of
+ * values. Once constructed, you use the `assert`, `is` or `validate` helpers to
+ * validate unknown input data against the struct.
+ */
+ class Struct {
+ constructor(props) {
+ const { type, schema, validator, refiner, coercer = (value) => value, entries = function* () { }, } = props;
+ this.type = type;
+ this.schema = schema;
+ this.entries = entries;
+ this.coercer = coercer;
+ if (validator) {
+ this.validator = (value, context) => {
+ const result = validator(value, context);
+ return toFailures(result, context, this, value);
+ };
+ }
+ else {
+ this.validator = () => [];
+ }
+ if (refiner) {
+ this.refiner = (value, context) => {
+ const result = refiner(value, context);
+ return toFailures(result, context, this, value);
+ };
+ }
+ else {
+ this.refiner = () => [];
+ }
+ }
+ /**
+ * Assert that a value passes the struct's validation, throwing if it doesn't.
+ */
+ assert(value, message) {
+ return assert(value, this, message);
+ }
+ /**
+ * Create a value with the struct's coercion logic, then validate it.
+ */
+ create(value, message) {
+ return create(value, this, message);
+ }
+ /**
+ * Check if a value passes the struct's validation.
+ */
+ is(value) {
+ return is(value, this);
+ }
+ /**
+ * Mask a value, coercing and validating it, but returning only the subset of
+ * properties defined by the struct's schema.
+ */
+ mask(value, message) {
+ return mask(value, this, message);
+ }
+ /**
+ * Validate a value with the struct's validation logic, returning a tuple
+ * representing the result.
+ *
+ * You may optionally pass `true` for the `withCoercion` argument to coerce
+ * the value before attempting to validate it. If you do, the result will
+ * contain the coerced result when successful.
+ */
+ validate(value, options = {}) {
+ return validate(value, this, options);
+ }
+ }
+ /**
+ * Assert that a value passes a struct, throwing if it doesn't.
+ */
+ function assert(value, struct, message) {
+ const result = validate(value, struct, { message });
+ if (result[0]) {
+ throw result[0];
+ }
+ }
+ /**
+ * Create a value with the coercion logic of struct and validate it.
+ */
+ function create(value, struct, message) {
+ const result = validate(value, struct, { coerce: true, message });
+ if (result[0]) {
+ throw result[0];
+ }
+ else {
+ return result[1];
+ }
+ }
+ /**
+ * Mask a value, returning only the subset of properties defined by a struct.
+ */
+ function mask(value, struct, message) {
+ const result = validate(value, struct, { coerce: true, mask: true, message });
+ if (result[0]) {
+ throw result[0];
+ }
+ else {
+ return result[1];
+ }
+ }
+ /**
+ * Check if a value passes a struct.
+ */
+ function is(value, struct) {
+ const result = validate(value, struct);
+ return !result[0];
+ }
+ /**
+ * Validate a value against a struct, returning an error if invalid, or the
+ * value (with potential coercion) if valid.
+ */
+ function validate(value, struct, options = {}) {
+ const tuples = run(value, struct, options);
+ const tuple = shiftIterator(tuples);
+ if (tuple[0]) {
+ const error = new StructError(tuple[0], function* () {
+ for (const t of tuples) {
+ if (t[0]) {
+ yield t[0];
+ }
+ }
+ });
+ return [error, undefined];
+ }
+ else {
+ const v = tuple[1];
+ return [undefined, v];
+ }
+ }
-// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
-// continuation byte. If an invalid byte is detected, -2 is returned.
-function utf8CheckByte(byte) {
- if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
- return byte >> 6 === 0x02 ? -1 : -2;
-}
+ function assign(...Structs) {
+ const isType = Structs[0].type === 'type';
+ const schemas = Structs.map((s) => s.schema);
+ const schema = Object.assign({}, ...schemas);
+ return isType ? type(schema) : object(schema);
+ }
+ /**
+ * Define a new struct type with a custom validation function.
+ */
+ function define(name, validator) {
+ return new Struct({ type: name, schema: null, validator });
+ }
+ /**
+ * Create a new struct based on an existing struct, but the value is allowed to
+ * be `undefined`. `log` will be called if the value is not `undefined`.
+ */
+ function deprecated(struct, log) {
+ return new Struct({
+ ...struct,
+ refiner: (value, ctx) => value === undefined || struct.refiner(value, ctx),
+ validator(value, ctx) {
+ if (value === undefined) {
+ return true;
+ }
+ else {
+ log(value, ctx);
+ return struct.validator(value, ctx);
+ }
+ },
+ });
+ }
+ /**
+ * Create a struct with dynamic validation logic.
+ *
+ * The callback will receive the value currently being validated, and must
+ * return a struct object to validate it with. This can be useful to model
+ * validation logic that changes based on its input.
+ */
+ function dynamic(fn) {
+ return new Struct({
+ type: 'dynamic',
+ schema: null,
+ *entries(value, ctx) {
+ const struct = fn(value, ctx);
+ yield* struct.entries(value, ctx);
+ },
+ validator(value, ctx) {
+ const struct = fn(value, ctx);
+ return struct.validator(value, ctx);
+ },
+ coercer(value, ctx) {
+ const struct = fn(value, ctx);
+ return struct.coercer(value, ctx);
+ },
+ refiner(value, ctx) {
+ const struct = fn(value, ctx);
+ return struct.refiner(value, ctx);
+ },
+ });
+ }
+ /**
+ * Create a struct with lazily evaluated validation logic.
+ *
+ * The first time validation is run with the struct, the callback will be called
+ * and must return a struct object to use. This is useful for cases where you
+ * want to have self-referential structs for nested data structures to avoid a
+ * circular definition problem.
+ */
+ function lazy(fn) {
+ let struct;
+ return new Struct({
+ type: 'lazy',
+ schema: null,
+ *entries(value, ctx) {
+ struct ?? (struct = fn());
+ yield* struct.entries(value, ctx);
+ },
+ validator(value, ctx) {
+ struct ?? (struct = fn());
+ return struct.validator(value, ctx);
+ },
+ coercer(value, ctx) {
+ struct ?? (struct = fn());
+ return struct.coercer(value, ctx);
+ },
+ refiner(value, ctx) {
+ struct ?? (struct = fn());
+ return struct.refiner(value, ctx);
+ },
+ });
+ }
+ /**
+ * Create a new struct based on an existing object struct, but excluding
+ * specific properties.
+ *
+ * Like TypeScript's `Omit` utility.
+ */
+ function omit(struct, keys) {
+ const { schema } = struct;
+ const subschema = { ...schema };
+ for (const key of keys) {
+ delete subschema[key];
+ }
+ switch (struct.type) {
+ case 'type':
+ return type(subschema);
+ default:
+ return object(subschema);
+ }
+ }
+ /**
+ * Create a new struct based on an existing object struct, but with all of its
+ * properties allowed to be `undefined`.
+ *
+ * Like TypeScript's `Partial` utility.
+ */
+ function partial(struct) {
+ const isStruct = struct instanceof Struct;
+ const schema = isStruct ? { ...struct.schema } : { ...struct };
+ for (const key in schema) {
+ schema[key] = optional(schema[key]);
+ }
+ if (isStruct && struct.type === 'type') {
+ return type(schema);
+ }
+ return object(schema);
+ }
+ /**
+ * Create a new struct based on an existing object struct, but only including
+ * specific properties.
+ *
+ * Like TypeScript's `Pick` utility.
+ */
+ function pick(struct, keys) {
+ const { schema } = struct;
+ const subschema = {};
+ for (const key of keys) {
+ subschema[key] = schema[key];
+ }
+ switch (struct.type) {
+ case 'type':
+ return type(subschema);
+ default:
+ return object(subschema);
+ }
+ }
+ /**
+ * Define a new struct type with a custom validation function.
+ *
+ * @deprecated This function has been renamed to `define`.
+ */
+ function struct(name, validator) {
+ console.warn('superstruct@0.11 - The `struct` helper has been renamed to `define`.');
+ return define(name, validator);
+ }
-// Checks at most 3 bytes at the end of a Buffer in order to detect an
-// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
-// needed to complete the UTF-8 character (if applicable) are returned.
-function utf8CheckIncomplete(self, buf, i) {
- var j = buf.length - 1;
- if (j < i) return 0;
- var nb = utf8CheckByte(buf[j]);
- if (nb >= 0) {
- if (nb > 0) self.lastNeed = nb - 1;
- return nb;
- }
- if (--j < i || nb === -2) return 0;
- nb = utf8CheckByte(buf[j]);
- if (nb >= 0) {
- if (nb > 0) self.lastNeed = nb - 2;
- return nb;
- }
- if (--j < i || nb === -2) return 0;
- nb = utf8CheckByte(buf[j]);
- if (nb >= 0) {
- if (nb > 0) {
- if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
+ /**
+ * Ensure that any value passes validation.
+ */
+ function any() {
+ return define('any', () => true);
+ }
+ function array(Element) {
+ return new Struct({
+ type: 'array',
+ schema: Element,
+ *entries(value) {
+ if (Element && Array.isArray(value)) {
+ for (const [i, v] of value.entries()) {
+ yield [i, v, Element];
+ }
+ }
+ },
+ coercer(value) {
+ return Array.isArray(value) ? value.slice() : value;
+ },
+ validator(value) {
+ return (Array.isArray(value) ||
+ `Expected an array value, but received: ${print(value)}`);
+ },
+ });
+ }
+ /**
+ * Ensure that a value is a bigint.
+ */
+ function bigint() {
+ return define('bigint', (value) => {
+ return typeof value === 'bigint';
+ });
+ }
+ /**
+ * Ensure that a value is a boolean.
+ */
+ function boolean() {
+ return define('boolean', (value) => {
+ return typeof value === 'boolean';
+ });
+ }
+ /**
+ * Ensure that a value is a valid `Date`.
+ *
+ * Note: this also ensures that the value is *not* an invalid `Date` object,
+ * which can occur when parsing a date fails but still returns a `Date`.
+ */
+ function date() {
+ return define('date', (value) => {
+ return ((value instanceof Date && !isNaN(value.getTime())) ||
+ `Expected a valid \`Date\` object, but received: ${print(value)}`);
+ });
+ }
+ function enums(values) {
+ const schema = {};
+ const description = values.map((v) => print(v)).join();
+ for (const key of values) {
+ schema[key] = key;
+ }
+ return new Struct({
+ type: 'enums',
+ schema,
+ validator(value) {
+ return (values.includes(value) ||
+ `Expected one of \`${description}\`, but received: ${print(value)}`);
+ },
+ });
+ }
+ /**
+ * Ensure that a value is a function.
+ */
+ function func() {
+ return define('func', (value) => {
+ return (typeof value === 'function' ||
+ `Expected a function, but received: ${print(value)}`);
+ });
+ }
+ /**
+ * Ensure that a value is an instance of a specific class.
+ */
+ function instance(Class) {
+ return define('instance', (value) => {
+ return (value instanceof Class ||
+ `Expected a \`${Class.name}\` instance, but received: ${print(value)}`);
+ });
+ }
+ /**
+ * Ensure that a value is an integer.
+ */
+ function integer() {
+ return define('integer', (value) => {
+ return ((typeof value === 'number' && !isNaN(value) && Number.isInteger(value)) ||
+ `Expected an integer, but received: ${print(value)}`);
+ });
+ }
+ /**
+ * Ensure that a value matches all of a set of types.
+ */
+ function intersection(Structs) {
+ return new Struct({
+ type: 'intersection',
+ schema: null,
+ *entries(value, ctx) {
+ for (const S of Structs) {
+ yield* S.entries(value, ctx);
+ }
+ },
+ *validator(value, ctx) {
+ for (const S of Structs) {
+ yield* S.validator(value, ctx);
+ }
+ },
+ *refiner(value, ctx) {
+ for (const S of Structs) {
+ yield* S.refiner(value, ctx);
+ }
+ },
+ });
+ }
+ function literal(constant) {
+ const description = print(constant);
+ const t = typeof constant;
+ return new Struct({
+ type: 'literal',
+ schema: t === 'string' || t === 'number' || t === 'boolean' ? constant : null,
+ validator(value) {
+ return (value === constant ||
+ `Expected the literal \`${description}\`, but received: ${print(value)}`);
+ },
+ });
+ }
+ function map(Key, Value) {
+ return new Struct({
+ type: 'map',
+ schema: null,
+ *entries(value) {
+ if (Key && Value && value instanceof Map) {
+ for (const [k, v] of value.entries()) {
+ yield [k, k, Key];
+ yield [k, v, Value];
+ }
+ }
+ },
+ coercer(value) {
+ return value instanceof Map ? new Map(value) : value;
+ },
+ validator(value) {
+ return (value instanceof Map ||
+ `Expected a \`Map\` object, but received: ${print(value)}`);
+ },
+ });
+ }
+ /**
+ * Ensure that no value ever passes validation.
+ */
+ function never() {
+ return define('never', () => false);
+ }
+ /**
+ * Augment an existing struct to allow `null` values.
+ */
+ function nullable(struct) {
+ return new Struct({
+ ...struct,
+ validator: (value, ctx) => value === null || struct.validator(value, ctx),
+ refiner: (value, ctx) => value === null || struct.refiner(value, ctx),
+ });
+ }
+ /**
+ * Ensure that a value is a number.
+ */
+ function number() {
+ return define('number', (value) => {
+ return ((typeof value === 'number' && !isNaN(value)) ||
+ `Expected a number, but received: ${print(value)}`);
+ });
+ }
+ function object(schema) {
+ const knowns = schema ? Object.keys(schema) : [];
+ const Never = never();
+ return new Struct({
+ type: 'object',
+ schema: schema ? schema : null,
+ *entries(value) {
+ if (schema && isObject(value)) {
+ const unknowns = new Set(Object.keys(value));
+ for (const key of knowns) {
+ unknowns.delete(key);
+ yield [key, value[key], schema[key]];
+ }
+ for (const key of unknowns) {
+ yield [key, value[key], Never];
+ }
+ }
+ },
+ validator(value) {
+ return (isObject(value) || `Expected an object, but received: ${print(value)}`);
+ },
+ coercer(value) {
+ return isObject(value) ? { ...value } : value;
+ },
+ });
}
- return nb;
- }
- return 0;
-}
-
-// Validates as many continuation bytes for a multi-byte UTF-8 character as
-// needed or are available. If we see a non-continuation byte where we expect
-// one, we "replace" the validated continuation bytes we've seen so far with
-// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
-// behavior. The continuation byte check is included three times in the case
-// where all of the continuation bytes for a character exist in the same buffer.
-// It is also done this way as a slight performance increase instead of using a
-// loop.
-function utf8CheckExtraBytes(self, buf, p) {
- if ((buf[0] & 0xC0) !== 0x80) {
- self.lastNeed = 0;
- return '\ufffd';
- }
- if (self.lastNeed > 1 && buf.length > 1) {
- if ((buf[1] & 0xC0) !== 0x80) {
- self.lastNeed = 1;
- return '\ufffd';
+ /**
+ * Augment a struct to allow `undefined` values.
+ */
+ function optional(struct) {
+ return new Struct({
+ ...struct,
+ validator: (value, ctx) => value === undefined || struct.validator(value, ctx),
+ refiner: (value, ctx) => value === undefined || struct.refiner(value, ctx),
+ });
}
- if (self.lastNeed > 2 && buf.length > 2) {
- if ((buf[2] & 0xC0) !== 0x80) {
- self.lastNeed = 2;
- return '\ufffd';
- }
+ /**
+ * Ensure that a value is an object with keys and values of specific types, but
+ * without ensuring any specific shape of properties.
+ *
+ * Like TypeScript's `Record` utility.
+ */
+ function record(Key, Value) {
+ return new Struct({
+ type: 'record',
+ schema: null,
+ *entries(value) {
+ if (isObject(value)) {
+ for (const k in value) {
+ const v = value[k];
+ yield [k, k, Key];
+ yield [k, v, Value];
+ }
+ }
+ },
+ validator(value) {
+ return (isObject(value) || `Expected an object, but received: ${print(value)}`);
+ },
+ });
}
- }
-}
-
-// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
-function utf8FillLast(buf) {
- var p = this.lastTotal - this.lastNeed;
- var r = utf8CheckExtraBytes(this, buf, p);
- if (r !== undefined) return r;
- if (this.lastNeed <= buf.length) {
- buf.copy(this.lastChar, p, 0, this.lastNeed);
- return this.lastChar.toString(this.encoding, 0, this.lastTotal);
- }
- buf.copy(this.lastChar, p, 0, buf.length);
- this.lastNeed -= buf.length;
-}
-
-// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
-// partial character, the character's bytes are buffered until the required
-// number of bytes are available.
-function utf8Text(buf, i) {
- var total = utf8CheckIncomplete(this, buf, i);
- if (!this.lastNeed) return buf.toString('utf8', i);
- this.lastTotal = total;
- var end = buf.length - (total - this.lastNeed);
- buf.copy(this.lastChar, 0, end);
- return buf.toString('utf8', i, end);
-}
-
-// For UTF-8, a replacement character is added when ending on a partial
-// character.
-function utf8End(buf) {
- var r = buf && buf.length ? this.write(buf) : '';
- if (this.lastNeed) return r + '\ufffd';
- return r;
-}
-
-// UTF-16LE typically needs two bytes per character, but even if we have an even
-// number of bytes available, we need to check if we end on a leading/high
-// surrogate. In that case, we need to wait for the next two bytes in order to
-// decode the last character properly.
-function utf16Text(buf, i) {
- if ((buf.length - i) % 2 === 0) {
- var r = buf.toString('utf16le', i);
- if (r) {
- var c = r.charCodeAt(r.length - 1);
- if (c >= 0xD800 && c <= 0xDBFF) {
- this.lastNeed = 2;
- this.lastTotal = 4;
- this.lastChar[0] = buf[buf.length - 2];
- this.lastChar[1] = buf[buf.length - 1];
- return r.slice(0, -1);
- }
+ /**
+ * Ensure that a value is a `RegExp`.
+ *
+ * Note: this does not test the value against the regular expression! For that
+ * you need to use the `pattern()` refinement.
+ */
+ function regexp() {
+ return define('regexp', (value) => {
+ return value instanceof RegExp;
+ });
+ }
+ function set(Element) {
+ return new Struct({
+ type: 'set',
+ schema: null,
+ *entries(value) {
+ if (Element && value instanceof Set) {
+ for (const v of value) {
+ yield [v, v, Element];
+ }
+ }
+ },
+ coercer(value) {
+ return value instanceof Set ? new Set(value) : value;
+ },
+ validator(value) {
+ return (value instanceof Set ||
+ `Expected a \`Set\` object, but received: ${print(value)}`);
+ },
+ });
+ }
+ /**
+ * Ensure that a value is a string.
+ */
+ function string() {
+ return define('string', (value) => {
+ return (typeof value === 'string' ||
+ `Expected a string, but received: ${print(value)}`);
+ });
+ }
+ /**
+ * Ensure that a value is a tuple of a specific length, and that each of its
+ * elements is of a specific type.
+ */
+ function tuple(Structs) {
+ const Never = never();
+ return new Struct({
+ type: 'tuple',
+ schema: null,
+ *entries(value) {
+ if (Array.isArray(value)) {
+ const length = Math.max(Structs.length, value.length);
+ for (let i = 0; i < length; i++) {
+ yield [i, value[i], Structs[i] || Never];
+ }
+ }
+ },
+ validator(value) {
+ return (Array.isArray(value) ||
+ `Expected an array, but received: ${print(value)}`);
+ },
+ });
+ }
+ /**
+ * Ensure that a value has a set of known properties of specific types.
+ *
+ * Note: Unrecognized properties are allowed and untouched. This is similar to
+ * how TypeScript's structural typing works.
+ */
+ function type(schema) {
+ const keys = Object.keys(schema);
+ return new Struct({
+ type: 'type',
+ schema,
+ *entries(value) {
+ if (isObject(value)) {
+ for (const k of keys) {
+ yield [k, value[k], schema[k]];
+ }
+ }
+ },
+ validator(value) {
+ return (isObject(value) || `Expected an object, but received: ${print(value)}`);
+ },
+ coercer(value) {
+ return isObject(value) ? { ...value } : value;
+ },
+ });
+ }
+ /**
+ * Ensure that a value matches one of a set of types.
+ */
+ function union(Structs) {
+ const description = Structs.map((s) => s.type).join(' | ');
+ return new Struct({
+ type: 'union',
+ schema: null,
+ coercer(value) {
+ for (const S of Structs) {
+ const [error, coerced] = S.validate(value, { coerce: true });
+ if (!error) {
+ return coerced;
+ }
+ }
+ return value;
+ },
+ validator(value, ctx) {
+ const failures = [];
+ for (const S of Structs) {
+ const [...tuples] = run(value, S, ctx);
+ const [first] = tuples;
+ if (!first[0]) {
+ return [];
+ }
+ else {
+ for (const [failure] of tuples) {
+ if (failure) {
+ failures.push(failure);
+ }
+ }
+ }
+ }
+ return [
+ `Expected the value to satisfy a union of \`${description}\`, but received: ${print(value)}`,
+ ...failures,
+ ];
+ },
+ });
+ }
+ /**
+ * Ensure that any value passes validation, without widening its type to `any`.
+ */
+ function unknown() {
+ return define('unknown', () => true);
}
- return r;
- }
- this.lastNeed = 1;
- this.lastTotal = 2;
- this.lastChar[0] = buf[buf.length - 1];
- return buf.toString('utf16le', i, buf.length - 1);
-}
-
-// For UTF-16LE we do not explicitly append special replacement characters if we
-// end on a partial character, we simply let v8 handle that.
-function utf16End(buf) {
- var r = buf && buf.length ? this.write(buf) : '';
- if (this.lastNeed) {
- var end = this.lastTotal - this.lastNeed;
- return r + this.lastChar.toString('utf16le', 0, end);
- }
- return r;
-}
-
-function base64Text(buf, i) {
- var n = (buf.length - i) % 3;
- if (n === 0) return buf.toString('base64', i);
- this.lastNeed = 3 - n;
- this.lastTotal = 3;
- if (n === 1) {
- this.lastChar[0] = buf[buf.length - 1];
- } else {
- this.lastChar[0] = buf[buf.length - 2];
- this.lastChar[1] = buf[buf.length - 1];
- }
- return buf.toString('base64', i, buf.length - n);
-}
-function base64End(buf) {
- var r = buf && buf.length ? this.write(buf) : '';
- if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
- return r;
-}
+ /**
+ * Augment a `Struct` to add an additional coercion step to its input.
+ *
+ * This allows you to transform input data before validating it, to increase the
+ * likelihood that it passes validation—for example for default values, parsing
+ * different formats, etc.
+ *
+ * Note: You must use `create(value, Struct)` on the value to have the coercion
+ * take effect! Using simply `assert()` or `is()` will not use coercion.
+ */
+ function coerce(struct, condition, coercer) {
+ return new Struct({
+ ...struct,
+ coercer: (value, ctx) => {
+ return is(value, condition)
+ ? struct.coercer(coercer(value, ctx), ctx)
+ : struct.coercer(value, ctx);
+ },
+ });
+ }
+ /**
+ * Augment a struct to replace `undefined` values with a default.
+ *
+ * Note: You must use `create(value, Struct)` on the value to have the coercion
+ * take effect! Using simply `assert()` or `is()` will not use coercion.
+ */
+ function defaulted(struct, fallback, options = {}) {
+ return coerce(struct, unknown(), (x) => {
+ const f = typeof fallback === 'function' ? fallback() : fallback;
+ if (x === undefined) {
+ return f;
+ }
+ if (!options.strict && isPlainObject(x) && isPlainObject(f)) {
+ const ret = { ...x };
+ let changed = false;
+ for (const key in f) {
+ if (ret[key] === undefined) {
+ ret[key] = f[key];
+ changed = true;
+ }
+ }
+ if (changed) {
+ return ret;
+ }
+ }
+ return x;
+ });
+ }
+ /**
+ * Augment a struct to trim string inputs.
+ *
+ * Note: You must use `create(value, Struct)` on the value to have the coercion
+ * take effect! Using simply `assert()` or `is()` will not use coercion.
+ */
+ function trimmed(struct) {
+ return coerce(struct, string(), (x) => x.trim());
+ }
-// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
-function simpleWrite(buf) {
- return buf.toString(this.encoding);
-}
+ /**
+ * Ensure that a string, array, map, or set is empty.
+ */
+ function empty(struct) {
+ return refine(struct, 'empty', (value) => {
+ const size = getSize(value);
+ return (size === 0 ||
+ `Expected an empty ${struct.type} but received one with a size of \`${size}\``);
+ });
+ }
+ function getSize(value) {
+ if (value instanceof Map || value instanceof Set) {
+ return value.size;
+ }
+ else {
+ return value.length;
+ }
+ }
+ /**
+ * Ensure that a number or date is below a threshold.
+ */
+ function max(struct, threshold, options = {}) {
+ const { exclusive } = options;
+ return refine(struct, 'max', (value) => {
+ return exclusive
+ ? value < threshold
+ : value <= threshold ||
+ `Expected a ${struct.type} less than ${exclusive ? '' : 'or equal to '}${threshold} but received \`${value}\``;
+ });
+ }
+ /**
+ * Ensure that a number or date is above a threshold.
+ */
+ function min(struct, threshold, options = {}) {
+ const { exclusive } = options;
+ return refine(struct, 'min', (value) => {
+ return exclusive
+ ? value > threshold
+ : value >= threshold ||
+ `Expected a ${struct.type} greater than ${exclusive ? '' : 'or equal to '}${threshold} but received \`${value}\``;
+ });
+ }
+ /**
+ * Ensure that a string, array, map or set is not empty.
+ */
+ function nonempty(struct) {
+ return refine(struct, 'nonempty', (value) => {
+ const size = getSize(value);
+ return (size > 0 || `Expected a nonempty ${struct.type} but received an empty one`);
+ });
+ }
+ /**
+ * Ensure that a string matches a regular expression.
+ */
+ function pattern(struct, regexp) {
+ return refine(struct, 'pattern', (value) => {
+ return (regexp.test(value) ||
+ `Expected a ${struct.type} matching \`/${regexp.source}/\` but received "${value}"`);
+ });
+ }
+ /**
+ * Ensure that a string, array, number, date, map, or set has a size (or length, or time) between `min` and `max`.
+ */
+ function size(struct, min, max = min) {
+ const expected = `Expected a ${struct.type}`;
+ const of = min === max ? `of \`${min}\`` : `between \`${min}\` and \`${max}\``;
+ return refine(struct, 'size', (value) => {
+ if (typeof value === 'number' || value instanceof Date) {
+ return ((min <= value && value <= max) ||
+ `${expected} ${of} but received \`${value}\``);
+ }
+ else if (value instanceof Map || value instanceof Set) {
+ const { size } = value;
+ return ((min <= size && size <= max) ||
+ `${expected} with a size ${of} but received one with a size of \`${size}\``);
+ }
+ else {
+ const { length } = value;
+ return ((min <= length && length <= max) ||
+ `${expected} with a length ${of} but received one with a length of \`${length}\``);
+ }
+ });
+ }
+ /**
+ * Augment a `Struct` to add an additional refinement to the validation.
+ *
+ * The refiner function is guaranteed to receive a value of the struct's type,
+ * because the struct's existing validation will already have passed. This
+ * allows you to layer additional validation on top of existing structs.
+ */
+ function refine(struct, name, refiner) {
+ return new Struct({
+ ...struct,
+ *refiner(value, ctx) {
+ yield* struct.refiner(value, ctx);
+ const result = refiner(value, ctx);
+ const failures = toFailures(result, ctx, struct, value);
+ for (const failure of failures) {
+ yield { ...failure, refinement: name };
+ }
+ },
+ });
+ }
-function simpleEnd(buf) {
- return buf && buf.length ? this.write(buf) : '';
-}
-},{"safe-buffer":113}],116:[function(require,module,exports){
-var isHexPrefixed = require('is-hex-prefixed');
+ exports.Struct = Struct;
+ exports.StructError = StructError;
+ exports.any = any;
+ exports.array = array;
+ exports.assert = assert;
+ exports.assign = assign;
+ exports.bigint = bigint;
+ exports.boolean = boolean;
+ exports.coerce = coerce;
+ exports.create = create;
+ exports.date = date;
+ exports.defaulted = defaulted;
+ exports.define = define;
+ exports.deprecated = deprecated;
+ exports.dynamic = dynamic;
+ exports.empty = empty;
+ exports.enums = enums;
+ exports.func = func;
+ exports.instance = instance;
+ exports.integer = integer;
+ exports.intersection = intersection;
+ exports.is = is;
+ exports.lazy = lazy;
+ exports.literal = literal;
+ exports.map = map;
+ exports.mask = mask;
+ exports.max = max;
+ exports.min = min;
+ exports.never = never;
+ exports.nonempty = nonempty;
+ exports.nullable = nullable;
+ exports.number = number;
+ exports.object = object;
+ exports.omit = omit;
+ exports.optional = optional;
+ exports.partial = partial;
+ exports.pattern = pattern;
+ exports.pick = pick;
+ exports.record = record;
+ exports.refine = refine;
+ exports.regexp = regexp;
+ exports.set = set;
+ exports.size = size;
+ exports.string = string;
+ exports.struct = struct;
+ exports.trimmed = trimmed;
+ exports.tuple = tuple;
+ exports.type = type;
+ exports.union = union;
+ exports.unknown = unknown;
+ exports.validate = validate;
-/**
- * Removes '0x' from a given `String` is present
- * @param {String} str the string value
- * @return {String|Optional} a string by pass if necessary
- */
-module.exports = function stripHexPrefix(str) {
- if (typeof str !== 'string') {
- return str;
- }
+}));
- return isHexPrefixed(str) ? str.slice(2) : str;
-}
-},{"is-hex-prefixed":83}],117:[function(require,module,exports){
+},{}],220:[function(require,module,exports){
(function (setImmediate,clearImmediate){(function (){
var nextTick = require('process/browser.js').nextTick;
var apply = Function.prototype.apply;
@@ -26121,7 +34019,7 @@ exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate :
delete immediateIds[id];
};
}).call(this)}).call(this,require("timers").setImmediate,require("timers").clearImmediate)
-},{"process/browser.js":101,"timers":117}],118:[function(require,module,exports){
+},{"process/browser.js":168,"timers":220}],221:[function(require,module,exports){
(function (global){(function (){
/**
@@ -26192,7 +34090,7 @@ function config (name) {
}
}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],119:[function(require,module,exports){
+},{}],222:[function(require,module,exports){
// Returns a wrapper function that returns a wrapped callback
// The wrapper function should do some stuff, and return a
// presumably different callback function.
@@ -26227,10 +34125,10 @@ function wrappy (fn, cb) {
}
}
-},{}],120:[function(require,module,exports){
+},{}],223:[function(require,module,exports){
module.exports = XMLHttpRequest;
-},{}],121:[function(require,module,exports){
+},{}],224:[function(require,module,exports){
const createProvider = require('../')
const Eth = require('@metamask/ethjs')
@@ -26262,4 +34160,4 @@ function renderText (text) {
}
-},{"../":2,"@metamask/ethjs":19}]},{},[121]);
+},{"../":2,"@metamask/ethjs":19}]},{},[224]);