From c89795ba5ad43ec529d63eea15b965eaa5a324da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E5=B3=B0=E2=80=9C?= <3512137118@qq.com> Date: Sun, 17 Mar 2024 23:41:31 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- node/node_modules/.package-lock.json | 205 ++ node/node_modules/agent-base/README.md | 145 + .../agent-base/dist/src/index.d.ts | 78 + .../node_modules/agent-base/dist/src/index.js | 203 ++ .../agent-base/dist/src/index.js.map | 1 + .../agent-base/dist/src/promisify.d.ts | 4 + .../agent-base/dist/src/promisify.js | 18 + .../agent-base/dist/src/promisify.js.map | 1 + .../agent-base/node_modules/debug/LICENSE | 20 + .../agent-base/node_modules/debug/README.md | 481 +++ .../node_modules/debug/package.json | 59 + .../node_modules/debug/src/browser.js | 269 ++ .../node_modules/debug/src/common.js | 274 ++ .../node_modules/debug/src/index.js | 10 + .../agent-base/node_modules/debug/src/node.js | 263 ++ .../agent-base/node_modules/ms/index.js | 162 + .../agent-base/node_modules/ms/license.md | 21 + .../agent-base/node_modules/ms/package.json | 37 + .../agent-base/node_modules/ms/readme.md | 60 + node/node_modules/agent-base/package.json | 64 + node/node_modules/agent-base/src/index.ts | 345 ++ node/node_modules/agent-base/src/promisify.ts | 33 + node/node_modules/asynckit/LICENSE | 21 + node/node_modules/asynckit/README.md | 233 ++ node/node_modules/asynckit/bench.js | 76 + node/node_modules/asynckit/index.js | 6 + node/node_modules/asynckit/lib/abort.js | 29 + node/node_modules/asynckit/lib/async.js | 34 + node/node_modules/asynckit/lib/defer.js | 26 + node/node_modules/asynckit/lib/iterate.js | 75 + .../asynckit/lib/readable_asynckit.js | 91 + .../asynckit/lib/readable_parallel.js | 25 + .../asynckit/lib/readable_serial.js | 25 + .../asynckit/lib/readable_serial_ordered.js | 29 + node/node_modules/asynckit/lib/state.js | 37 + node/node_modules/asynckit/lib/streamify.js | 141 + node/node_modules/asynckit/lib/terminator.js | 29 + node/node_modules/asynckit/package.json | 63 + node/node_modules/asynckit/parallel.js | 43 + node/node_modules/asynckit/serial.js | 17 + node/node_modules/asynckit/serialOrdered.js | 75 + node/node_modules/asynckit/stream.js | 21 + node/node_modules/bignumber.js/CHANGELOG.md | 295 ++ node/node_modules/bignumber.js/LICENCE.md | 26 + node/node_modules/bignumber.js/README.md | 286 ++ node/node_modules/bignumber.js/bignumber.d.ts | 1831 +++++++++++ node/node_modules/bignumber.js/bignumber.js | 2922 +++++++++++++++++ node/node_modules/bignumber.js/bignumber.mjs | 2907 ++++++++++++++++ node/node_modules/bignumber.js/doc/API.html | 2249 +++++++++++++ node/node_modules/bignumber.js/package.json | 50 + node/node_modules/combined-stream/License | 19 + node/node_modules/combined-stream/Readme.md | 138 + .../combined-stream/lib/combined_stream.js | 208 ++ .../node_modules/combined-stream/package.json | 25 + node/node_modules/combined-stream/yarn.lock | 17 + node/node_modules/delayed-stream/.npmignore | 1 + node/node_modules/delayed-stream/License | 19 + node/node_modules/delayed-stream/Makefile | 7 + node/node_modules/delayed-stream/Readme.md | 141 + .../delayed-stream/lib/delayed_stream.js | 107 + node/node_modules/delayed-stream/package.json | 27 + node/node_modules/form-data/License | 19 + node/node_modules/form-data/README.md.bak | 356 ++ node/node_modules/form-data/Readme.md | 356 ++ node/node_modules/form-data/index.d.ts | 62 + node/node_modules/form-data/lib/browser.js | 2 + node/node_modules/form-data/lib/form_data.js | 498 +++ node/node_modules/form-data/lib/populate.js | 10 + node/node_modules/form-data/package.json | 68 + node/node_modules/get-stream/buffer-stream.js | 52 + node/node_modules/get-stream/index.d.ts | 105 + node/node_modules/get-stream/index.js | 61 + node/node_modules/get-stream/license | 9 + node/node_modules/get-stream/package.json | 47 + node/node_modules/get-stream/readme.md | 124 + node/node_modules/https-proxy-agent/README.md | 137 + .../https-proxy-agent/dist/agent.d.ts | 30 + .../https-proxy-agent/dist/agent.js | 177 + .../https-proxy-agent/dist/agent.js.map | 1 + .../https-proxy-agent/dist/index.d.ts | 23 + .../https-proxy-agent/dist/index.js | 14 + .../https-proxy-agent/dist/index.js.map | 1 + .../dist/parse-proxy-response.d.ts | 7 + .../dist/parse-proxy-response.js | 66 + .../dist/parse-proxy-response.js.map | 1 + .../node_modules/debug/LICENSE | 20 + .../node_modules/debug/README.md | 481 +++ .../node_modules/debug/package.json | 59 + .../node_modules/debug/src/browser.js | 269 ++ .../node_modules/debug/src/common.js | 274 ++ .../node_modules/debug/src/index.js | 10 + .../node_modules/debug/src/node.js | 263 ++ .../node_modules/ms/index.js | 162 + .../node_modules/ms/license.md | 21 + .../node_modules/ms/package.json | 37 + .../node_modules/ms/readme.md | 60 + .../https-proxy-agent/package.json | 56 + node/node_modules/is-stream/index.d.ts | 79 + node/node_modules/is-stream/index.js | 28 + node/node_modules/is-stream/license | 9 + node/node_modules/is-stream/package.json | 42 + node/node_modules/is-stream/readme.md | 60 + node/node_modules/json-bigint/LICENSE | 20 + node/node_modules/json-bigint/README.md | 240 ++ node/node_modules/json-bigint/index.js | 12 + node/node_modules/json-bigint/lib/parse.js | 443 +++ .../node_modules/json-bigint/lib/stringify.js | 384 +++ node/node_modules/json-bigint/package.json | 34 + node/node_modules/node-fetch/LICENSE.md | 22 + node/node_modules/node-fetch/README.md | 634 ++++ node/node_modules/node-fetch/browser.js | 25 + node/node_modules/node-fetch/lib/index.es.js | 1777 ++++++++++ node/node_modules/node-fetch/lib/index.js | 1787 ++++++++++ node/node_modules/node-fetch/lib/index.mjs | 1775 ++++++++++ .../node-fetch/node_modules/tr46/.npmignore | 4 + .../node-fetch/node_modules/tr46/index.js | 193 ++ .../node-fetch/node_modules/tr46/lib/.gitkeep | 0 .../node_modules/tr46/lib/mappingTable.json | 1 + .../node-fetch/node_modules/tr46/package.json | 31 + .../webidl-conversions/LICENSE.md | 12 + .../node_modules/webidl-conversions/README.md | 53 + .../webidl-conversions/lib/index.js | 189 ++ .../webidl-conversions/package.json | 23 + .../node_modules/whatwg-url/LICENSE.txt | 21 + .../node_modules/whatwg-url/README.md | 67 + .../node_modules/whatwg-url/lib/URL-impl.js | 200 ++ .../node_modules/whatwg-url/lib/URL.js | 196 ++ .../node_modules/whatwg-url/lib/public-api.js | 11 + .../whatwg-url/lib/url-state-machine.js | 1297 ++++++++ .../node_modules/whatwg-url/lib/utils.js | 20 + .../node_modules/whatwg-url/package.json | 32 + node/node_modules/node-fetch/package.json | 89 + .../tencentcloud-sdk-nodejs-common/LICENSE | 201 ++ .../tencentcloud-sdk-nodejs-common/README.md | 147 + .../tencentcloud-sdk-nodejs-common/index.d.ts | 2 + .../tencentcloud-sdk-nodejs-common/index.js | 6 + .../package.json | 57 + .../prettier.config.js | 38 + .../products.md | 246 ++ .../src/common/abstract_client.ts | 346 ++ .../src/common/common_client.ts | 3 + .../src/common/cvm_role_credential.ts | 62 + .../exception/tencent_cloud_sdk_exception.ts | 52 + .../src/common/http/fetch.ts | 19 + .../src/common/http/http_connection.ts | 232 ++ .../src/common/interface.ts | 121 + .../src/common/sdk_version.ts | 1 + .../src/common/sign.ts | 148 + .../src/common/sse_response_model.ts | 121 + .../src/index.ts | 3 + .../tencentcloud/common/abstract_client.d.ts | 62 + .../tencentcloud/common/abstract_client.js | 260 ++ .../tencentcloud/common/common_client.d.ts | 3 + .../tencentcloud/common/common_client.js | 7 + .../common/cvm_role_credential.d.ts | 17 + .../common/cvm_role_credential.js | 47 + .../tencent_cloud_sdk_exception.d.ts | 22 + .../exception/tencent_cloud_sdk_exception.js | 32 + .../tencentcloud/common/http/fetch.d.ts | 7 + .../tencentcloud/common/http/fetch.js | 13 + .../common/http/http_connection.d.ts | 38 + .../common/http/http_connection.js | 165 + .../tencentcloud/common/interface.d.ts | 117 + .../tencentcloud/common/interface.js | 7 + .../tencentcloud/common/sdk_version.d.ts | 1 + .../tencentcloud/common/sdk_version.js | 4 + .../tencentcloud/common/sign.d.ts | 18 + .../tencentcloud/common/sign.js | 111 + .../common/sse_response_model.d.ts | 32 + .../tencentcloud/common/sse_response_model.js | 96 + .../tencentcloud/index.d.ts | 3 + .../tencentcloud/index.js | 6 + .../tsconfig.json | 33 + .../typings/index.d.ts | 2 + .../tencentcloud-sdk-nodejs-sms/LICENSE | 201 ++ .../tencentcloud-sdk-nodejs-sms/README.md | 147 + .../tencentcloud-sdk-nodejs-sms/index.d.ts | 2 + .../tencentcloud-sdk-nodejs-sms/index.js | 6 + .../tencentcloud-sdk-nodejs-sms/package.json | 47 + .../prettier.config.js | 38 + .../tencentcloud-sdk-nodejs-sms/products.md | 246 ++ .../tencentcloud-sdk-nodejs-sms/src/index.ts | 1 + .../src/services/index.ts | 1 + .../src/services/sms/index.ts | 7 + .../src/services/sms/v20190711/index.ts | 6 + .../src/services/sms/v20190711/sms_client.ts | 280 ++ .../src/services/sms/v20190711/sms_models.ts | 1045 ++++++ .../src/services/sms/v20210111/index.ts | 6 + .../src/services/sms/v20210111/sms_client.ts | 309 ++ .../src/services/sms/v20210111/sms_models.ts | 1154 +++++++ .../tencentcloud/index.d.ts | 1 + .../tencentcloud/index.js | 4 + .../tencentcloud/services/index.d.ts | 1 + .../tencentcloud/services/index.js | 4 + .../tencentcloud/services/sms/index.d.ts | 10 + .../tencentcloud/services/sms/index.js | 9 + .../services/sms/v20190711/index.d.ts | 6 + .../services/sms/v20190711/index.js | 9 + .../services/sms/v20190711/sms_client.d.ts | 117 + .../services/sms/v20190711/sms_client.js | 171 + .../services/sms/v20190711/sms_models.d.ts | 983 ++++++ .../services/sms/v20190711/sms_models.js | 18 + .../services/sms/v20210111/index.d.ts | 6 + .../services/sms/v20210111/index.js | 9 + .../services/sms/v20210111/sms_client.d.ts | 128 + .../services/sms/v20210111/sms_client.js | 186 ++ .../services/sms/v20210111/sms_models.d.ts | 1086 ++++++ .../services/sms/v20210111/sms_models.js | 18 + .../tencentcloud-sdk-nodejs-sms/tsconfig.json | 33 + .../typings/index.d.ts | 2 + node/node_modules/tslib/CopyrightNotice.txt | 15 + node/node_modules/tslib/LICENSE.txt | 12 + node/node_modules/tslib/README.md | 142 + node/node_modules/tslib/package.json | 29 + node/node_modules/tslib/tslib.d.ts | 37 + node/node_modules/tslib/tslib.es6.html | 1 + node/node_modules/tslib/tslib.es6.js | 218 ++ node/node_modules/tslib/tslib.html | 1 + node/node_modules/tslib/tslib.js | 284 ++ node/package-lock.json | 208 +- node/package.json | 3 +- node/routes/llf_api.js | 88 +- vite-project/components.d.ts | 13 +- vite-project/package-lock.json | 6 + vite-project/package.json | 1 + vite-project/public/login.png | Bin 0 -> 800621 bytes .../src/assets/iconfont/demo_index.html | 190 +- vite-project/src/assets/iconfont/iconfont.css | 38 +- vite-project/src/assets/iconfont/iconfont.js | 2 +- .../src/assets/iconfont/iconfont.json | 56 + vite-project/src/assets/iconfont/iconfont.ttf | Bin 8176 -> 11160 bytes .../src/assets/iconfont/iconfont.woff | Bin 5692 -> 7732 bytes .../src/assets/iconfont/iconfont.woff2 | Bin 4852 -> 6676 bytes vite-project/src/router/index.ts | 5 +- vite-project/src/views/Home/HomeAccompany.vue | 98 +- vite-project/src/views/Home/HomeView.vue | 274 +- vite-project/src/views/Home/butlerDetails.vue | 190 -- vite-project/src/views/Home/butlerHotel.vue | 260 -- vite-project/src/views/LoginView.vue | 104 +- vite-project/src/views/home/butlerDetails.vue | 190 -- vite-project/src/views/home/butlerHotel.vue | 260 -- vite-project/src/views/register.vue | 180 + 242 files changed, 39906 insertions(+), 1076 deletions(-) create mode 100644 node/node_modules/agent-base/README.md create mode 100644 node/node_modules/agent-base/dist/src/index.d.ts create mode 100644 node/node_modules/agent-base/dist/src/index.js create mode 100644 node/node_modules/agent-base/dist/src/index.js.map create mode 100644 node/node_modules/agent-base/dist/src/promisify.d.ts create mode 100644 node/node_modules/agent-base/dist/src/promisify.js create mode 100644 node/node_modules/agent-base/dist/src/promisify.js.map create mode 100644 node/node_modules/agent-base/node_modules/debug/LICENSE create mode 100644 node/node_modules/agent-base/node_modules/debug/README.md create mode 100644 node/node_modules/agent-base/node_modules/debug/package.json create mode 100644 node/node_modules/agent-base/node_modules/debug/src/browser.js create mode 100644 node/node_modules/agent-base/node_modules/debug/src/common.js create mode 100644 node/node_modules/agent-base/node_modules/debug/src/index.js create mode 100644 node/node_modules/agent-base/node_modules/debug/src/node.js create mode 100644 node/node_modules/agent-base/node_modules/ms/index.js create mode 100644 node/node_modules/agent-base/node_modules/ms/license.md create mode 100644 node/node_modules/agent-base/node_modules/ms/package.json create mode 100644 node/node_modules/agent-base/node_modules/ms/readme.md create mode 100644 node/node_modules/agent-base/package.json create mode 100644 node/node_modules/agent-base/src/index.ts create mode 100644 node/node_modules/agent-base/src/promisify.ts create mode 100644 node/node_modules/asynckit/LICENSE create mode 100644 node/node_modules/asynckit/README.md create mode 100644 node/node_modules/asynckit/bench.js create mode 100644 node/node_modules/asynckit/index.js create mode 100644 node/node_modules/asynckit/lib/abort.js create mode 100644 node/node_modules/asynckit/lib/async.js create mode 100644 node/node_modules/asynckit/lib/defer.js create mode 100644 node/node_modules/asynckit/lib/iterate.js create mode 100644 node/node_modules/asynckit/lib/readable_asynckit.js create mode 100644 node/node_modules/asynckit/lib/readable_parallel.js create mode 100644 node/node_modules/asynckit/lib/readable_serial.js create mode 100644 node/node_modules/asynckit/lib/readable_serial_ordered.js create mode 100644 node/node_modules/asynckit/lib/state.js create mode 100644 node/node_modules/asynckit/lib/streamify.js create mode 100644 node/node_modules/asynckit/lib/terminator.js create mode 100644 node/node_modules/asynckit/package.json create mode 100644 node/node_modules/asynckit/parallel.js create mode 100644 node/node_modules/asynckit/serial.js create mode 100644 node/node_modules/asynckit/serialOrdered.js create mode 100644 node/node_modules/asynckit/stream.js create mode 100644 node/node_modules/bignumber.js/CHANGELOG.md create mode 100644 node/node_modules/bignumber.js/LICENCE.md create mode 100644 node/node_modules/bignumber.js/README.md create mode 100644 node/node_modules/bignumber.js/bignumber.d.ts create mode 100644 node/node_modules/bignumber.js/bignumber.js create mode 100644 node/node_modules/bignumber.js/bignumber.mjs create mode 100644 node/node_modules/bignumber.js/doc/API.html create mode 100644 node/node_modules/bignumber.js/package.json create mode 100644 node/node_modules/combined-stream/License create mode 100644 node/node_modules/combined-stream/Readme.md create mode 100644 node/node_modules/combined-stream/lib/combined_stream.js create mode 100644 node/node_modules/combined-stream/package.json create mode 100644 node/node_modules/combined-stream/yarn.lock create mode 100644 node/node_modules/delayed-stream/.npmignore create mode 100644 node/node_modules/delayed-stream/License create mode 100644 node/node_modules/delayed-stream/Makefile create mode 100644 node/node_modules/delayed-stream/Readme.md create mode 100644 node/node_modules/delayed-stream/lib/delayed_stream.js create mode 100644 node/node_modules/delayed-stream/package.json create mode 100644 node/node_modules/form-data/License create mode 100644 node/node_modules/form-data/README.md.bak create mode 100644 node/node_modules/form-data/Readme.md create mode 100644 node/node_modules/form-data/index.d.ts create mode 100644 node/node_modules/form-data/lib/browser.js create mode 100644 node/node_modules/form-data/lib/form_data.js create mode 100644 node/node_modules/form-data/lib/populate.js create mode 100644 node/node_modules/form-data/package.json create mode 100644 node/node_modules/get-stream/buffer-stream.js create mode 100644 node/node_modules/get-stream/index.d.ts create mode 100644 node/node_modules/get-stream/index.js create mode 100644 node/node_modules/get-stream/license create mode 100644 node/node_modules/get-stream/package.json create mode 100644 node/node_modules/get-stream/readme.md create mode 100644 node/node_modules/https-proxy-agent/README.md create mode 100644 node/node_modules/https-proxy-agent/dist/agent.d.ts create mode 100644 node/node_modules/https-proxy-agent/dist/agent.js create mode 100644 node/node_modules/https-proxy-agent/dist/agent.js.map create mode 100644 node/node_modules/https-proxy-agent/dist/index.d.ts create mode 100644 node/node_modules/https-proxy-agent/dist/index.js create mode 100644 node/node_modules/https-proxy-agent/dist/index.js.map create mode 100644 node/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts create mode 100644 node/node_modules/https-proxy-agent/dist/parse-proxy-response.js create mode 100644 node/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map create mode 100644 node/node_modules/https-proxy-agent/node_modules/debug/LICENSE create mode 100644 node/node_modules/https-proxy-agent/node_modules/debug/README.md create mode 100644 node/node_modules/https-proxy-agent/node_modules/debug/package.json create mode 100644 node/node_modules/https-proxy-agent/node_modules/debug/src/browser.js create mode 100644 node/node_modules/https-proxy-agent/node_modules/debug/src/common.js create mode 100644 node/node_modules/https-proxy-agent/node_modules/debug/src/index.js create mode 100644 node/node_modules/https-proxy-agent/node_modules/debug/src/node.js create mode 100644 node/node_modules/https-proxy-agent/node_modules/ms/index.js create mode 100644 node/node_modules/https-proxy-agent/node_modules/ms/license.md create mode 100644 node/node_modules/https-proxy-agent/node_modules/ms/package.json create mode 100644 node/node_modules/https-proxy-agent/node_modules/ms/readme.md create mode 100644 node/node_modules/https-proxy-agent/package.json create mode 100644 node/node_modules/is-stream/index.d.ts create mode 100644 node/node_modules/is-stream/index.js create mode 100644 node/node_modules/is-stream/license create mode 100644 node/node_modules/is-stream/package.json create mode 100644 node/node_modules/is-stream/readme.md create mode 100644 node/node_modules/json-bigint/LICENSE create mode 100644 node/node_modules/json-bigint/README.md create mode 100644 node/node_modules/json-bigint/index.js create mode 100644 node/node_modules/json-bigint/lib/parse.js create mode 100644 node/node_modules/json-bigint/lib/stringify.js create mode 100644 node/node_modules/json-bigint/package.json create mode 100644 node/node_modules/node-fetch/LICENSE.md create mode 100644 node/node_modules/node-fetch/README.md create mode 100644 node/node_modules/node-fetch/browser.js create mode 100644 node/node_modules/node-fetch/lib/index.es.js create mode 100644 node/node_modules/node-fetch/lib/index.js create mode 100644 node/node_modules/node-fetch/lib/index.mjs create mode 100644 node/node_modules/node-fetch/node_modules/tr46/.npmignore create mode 100644 node/node_modules/node-fetch/node_modules/tr46/index.js create mode 100644 node/node_modules/node-fetch/node_modules/tr46/lib/.gitkeep create mode 100644 node/node_modules/node-fetch/node_modules/tr46/lib/mappingTable.json create mode 100644 node/node_modules/node-fetch/node_modules/tr46/package.json create mode 100644 node/node_modules/node-fetch/node_modules/webidl-conversions/LICENSE.md create mode 100644 node/node_modules/node-fetch/node_modules/webidl-conversions/README.md create mode 100644 node/node_modules/node-fetch/node_modules/webidl-conversions/lib/index.js create mode 100644 node/node_modules/node-fetch/node_modules/webidl-conversions/package.json create mode 100644 node/node_modules/node-fetch/node_modules/whatwg-url/LICENSE.txt create mode 100644 node/node_modules/node-fetch/node_modules/whatwg-url/README.md create mode 100644 node/node_modules/node-fetch/node_modules/whatwg-url/lib/URL-impl.js create mode 100644 node/node_modules/node-fetch/node_modules/whatwg-url/lib/URL.js create mode 100644 node/node_modules/node-fetch/node_modules/whatwg-url/lib/public-api.js create mode 100644 node/node_modules/node-fetch/node_modules/whatwg-url/lib/url-state-machine.js create mode 100644 node/node_modules/node-fetch/node_modules/whatwg-url/lib/utils.js create mode 100644 node/node_modules/node-fetch/node_modules/whatwg-url/package.json create mode 100644 node/node_modules/node-fetch/package.json create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/LICENSE create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/README.md create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/index.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/index.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/package.json create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/prettier.config.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/products.md create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/src/common/abstract_client.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/src/common/common_client.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/src/common/cvm_role_credential.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/src/common/exception/tencent_cloud_sdk_exception.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/src/common/http/fetch.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/src/common/http/http_connection.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/src/common/interface.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sdk_version.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sign.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sse_response_model.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/src/index.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/abstract_client.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/abstract_client.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/common_client.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/common_client.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/cvm_role_credential.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/cvm_role_credential.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/exception/tencent_cloud_sdk_exception.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/exception/tencent_cloud_sdk_exception.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/fetch.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/fetch.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/http_connection.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/http_connection.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/interface.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/interface.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sdk_version.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sdk_version.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sign.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sign.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sse_response_model.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sse_response_model.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/index.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/index.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/tsconfig.json create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-common/typings/index.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/LICENSE create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/README.md create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/index.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/index.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/package.json create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/prettier.config.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/products.md create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/src/index.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/index.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/index.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/index.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/sms_client.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/sms_models.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/index.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/sms_client.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/sms_models.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/index.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/index.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/index.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/index.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/index.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/index.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/index.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/index.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_client.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_client.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_models.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_models.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/index.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/index.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_client.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_client.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_models.d.ts create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_models.js create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/tsconfig.json create mode 100644 node/node_modules/tencentcloud-sdk-nodejs-sms/typings/index.d.ts create mode 100644 node/node_modules/tslib/CopyrightNotice.txt create mode 100644 node/node_modules/tslib/LICENSE.txt create mode 100644 node/node_modules/tslib/README.md create mode 100644 node/node_modules/tslib/package.json create mode 100644 node/node_modules/tslib/tslib.d.ts create mode 100644 node/node_modules/tslib/tslib.es6.html create mode 100644 node/node_modules/tslib/tslib.es6.js create mode 100644 node/node_modules/tslib/tslib.html create mode 100644 node/node_modules/tslib/tslib.js create mode 100644 vite-project/public/login.png delete mode 100644 vite-project/src/views/Home/butlerDetails.vue delete mode 100644 vite-project/src/views/Home/butlerHotel.vue delete mode 100644 vite-project/src/views/home/butlerDetails.vue delete mode 100644 vite-project/src/views/home/butlerHotel.vue create mode 100644 vite-project/src/views/register.vue diff --git a/node/node_modules/.package-lock.json b/node/node_modules/.package-lock.json index b2cd9c4..a238a92 100644 --- a/node/node_modules/.package-lock.json +++ b/node/node_modules/.package-lock.json @@ -56,6 +56,38 @@ "acorn": "^2.1.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/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/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/align-text": { "version": "0.1.4", "resolved": "https://registry.npmmirror.com/align-text/-/align-text-0.1.4.tgz", @@ -92,6 +124,11 @@ "resolved": "https://registry.npmmirror.com/asap/-/asap-1.0.0.tgz", "integrity": "sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/basic-auth/-/basic-auth-2.0.1.tgz", @@ -103,6 +140,14 @@ "node": ">= 0.8" } }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, "node_modules/body-parser": { "version": "1.18.3", "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.18.3.tgz", @@ -221,6 +266,17 @@ "wordwrap": "0.0.2" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "2.6.0", "resolved": "https://registry.npmmirror.com/commander/-/commander-2.6.0.tgz", @@ -345,6 +401,14 @@ "node": ">=0.10.0" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", @@ -457,6 +521,19 @@ "node": ">= 0.8" } }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", @@ -473,6 +550,14 @@ "node": ">= 0.6" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + } + }, "node_modules/graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz", @@ -492,6 +577,39 @@ "node": ">= 0.6" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/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/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.23.tgz", @@ -526,6 +644,14 @@ "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", @@ -552,6 +678,14 @@ "jade": "bin/jade.js" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmmirror.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -986,6 +1120,44 @@ "node": ">= 0.6" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", @@ -1269,6 +1441,34 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/tencentcloud-sdk-nodejs-common": { + "version": "4.0.813", + "resolved": "https://registry.npmmirror.com/tencentcloud-sdk-nodejs-common/-/tencentcloud-sdk-nodejs-common-4.0.813.tgz", + "integrity": "sha512-eSzYb4ntXNpzUkevy9bEk994NrM3o6OXNOlBFi2nhrxOV3NE0WrcUe/PgGp9+DNocuohsMgn3sX57cPwr1iMeQ==", + "dependencies": { + "form-data": "^3.0.0", + "get-stream": "^6.0.0", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "json-bigint": "^1.0.0", + "node-fetch": "^2.2.0", + "tslib": "1.13.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tencentcloud-sdk-nodejs-sms": { + "version": "4.0.810", + "resolved": "https://registry.npmmirror.com/tencentcloud-sdk-nodejs-sms/-/tencentcloud-sdk-nodejs-sms-4.0.810.tgz", + "integrity": "sha512-vFmqR/KZJdH+FG1Oh5mlU1gDfkJQ0sf1YEQLyuUwuci+eBFtnuuHqyScdk6ftaRiQDP6j2RLaFW+kQKprRc4WQ==", + "dependencies": { + "tencentcloud-sdk-nodejs-common": "^4.0.488" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "license": "MIT", @@ -1337,6 +1537,11 @@ "node": ">=0.4.0" } }, + "node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", diff --git a/node/node_modules/agent-base/README.md b/node/node_modules/agent-base/README.md new file mode 100644 index 0000000..256f1f3 --- /dev/null +++ b/node/node_modules/agent-base/README.md @@ -0,0 +1,145 @@ +agent-base +========== +### Turn a function into an [`http.Agent`][http.Agent] instance +[![Build Status](https://github.com/TooTallNate/node-agent-base/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-agent-base/actions?workflow=Node+CI) + +This module provides an `http.Agent` generator. That is, you pass it an async +callback function, and it returns a new `http.Agent` instance that will invoke the +given callback function when sending outbound HTTP requests. + +#### Some subclasses: + +Here's some more interesting uses of `agent-base`. +Send a pull request to list yours! + + * [`http-proxy-agent`][http-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTP endpoints + * [`https-proxy-agent`][https-proxy-agent]: An HTTP(s) proxy `http.Agent` implementation for HTTPS endpoints + * [`pac-proxy-agent`][pac-proxy-agent]: A PAC file proxy `http.Agent` implementation for HTTP and HTTPS + * [`socks-proxy-agent`][socks-proxy-agent]: A SOCKS proxy `http.Agent` implementation for HTTP and HTTPS + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install agent-base +``` + + +Example +------- + +Here's a minimal example that creates a new `net.Socket` connection to the server +for every HTTP request (i.e. the equivalent of `agent: false` option): + +```js +var net = require('net'); +var tls = require('tls'); +var url = require('url'); +var http = require('http'); +var agent = require('agent-base'); + +var endpoint = 'http://nodejs.org/api/'; +var parsed = url.parse(endpoint); + +// This is the important part! +parsed.agent = agent(function (req, opts) { + var socket; + // `secureEndpoint` is true when using the https module + if (opts.secureEndpoint) { + socket = tls.connect(opts); + } else { + socket = net.connect(opts); + } + return socket; +}); + +// Everything else works just like normal... +http.get(parsed, function (res) { + console.log('"response" event!', res.headers); + res.pipe(process.stdout); +}); +``` + +Returning a Promise or using an `async` function is also supported: + +```js +agent(async function (req, opts) { + await sleep(1000); + // etc… +}); +``` + +Return another `http.Agent` instance to "pass through" the responsibility +for that HTTP request to that agent: + +```js +agent(function (req, opts) { + return opts.secureEndpoint ? https.globalAgent : http.globalAgent; +}); +``` + + +API +--- + +## Agent(Function callback[, Object options]) → [http.Agent][] + +Creates a base `http.Agent` that will execute the callback function `callback` +for every HTTP request that it is used as the `agent` for. The callback function +is responsible for creating a `stream.Duplex` instance of some kind that will be +used as the underlying socket in the HTTP request. + +The `options` object accepts the following properties: + + * `timeout` - Number - Timeout for the `callback()` function in milliseconds. Defaults to Infinity (optional). + +The callback function should have the following signature: + +### callback(http.ClientRequest req, Object options, Function cb) → undefined + +The ClientRequest `req` can be accessed to read request headers and +and the path, etc. The `options` object contains the options passed +to the `http.request()`/`https.request()` function call, and is formatted +to be directly passed to `net.connect()`/`tls.connect()`, or however +else you want a Socket to be created. Pass the created socket to +the callback function `cb` once created, and the HTTP request will +continue to proceed. + +If the `https` module is used to invoke the HTTP request, then the +`secureEndpoint` property on `options` _will be set to `true`_. + + +License +------- + +(The MIT License) + +Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net> + +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. + +[http-proxy-agent]: https://github.com/TooTallNate/node-http-proxy-agent +[https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent +[pac-proxy-agent]: https://github.com/TooTallNate/node-pac-proxy-agent +[socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent +[http.Agent]: https://nodejs.org/api/http.html#http_class_http_agent diff --git a/node/node_modules/agent-base/dist/src/index.d.ts b/node/node_modules/agent-base/dist/src/index.d.ts new file mode 100644 index 0000000..bc4ab74 --- /dev/null +++ b/node/node_modules/agent-base/dist/src/index.d.ts @@ -0,0 +1,78 @@ +/// +import net from 'net'; +import http from 'http'; +import https from 'https'; +import { Duplex } from 'stream'; +import { EventEmitter } from 'events'; +declare function createAgent(opts?: createAgent.AgentOptions): createAgent.Agent; +declare function createAgent(callback: createAgent.AgentCallback, opts?: createAgent.AgentOptions): createAgent.Agent; +declare namespace createAgent { + interface ClientRequest extends http.ClientRequest { + _last?: boolean; + _hadError?: boolean; + method: string; + } + interface AgentRequestOptions { + host?: string; + path?: string; + port: number; + } + interface HttpRequestOptions extends AgentRequestOptions, Omit { + secureEndpoint: false; + } + interface HttpsRequestOptions extends AgentRequestOptions, Omit { + secureEndpoint: true; + } + type RequestOptions = HttpRequestOptions | HttpsRequestOptions; + type AgentLike = Pick | http.Agent; + type AgentCallbackReturn = Duplex | AgentLike; + type AgentCallbackCallback = (err?: Error | null, socket?: createAgent.AgentCallbackReturn) => void; + type AgentCallbackPromise = (req: createAgent.ClientRequest, opts: createAgent.RequestOptions) => createAgent.AgentCallbackReturn | Promise; + type AgentCallback = typeof Agent.prototype.callback; + type AgentOptions = { + timeout?: number; + }; + /** + * Base `http.Agent` implementation. + * No pooling/keep-alive is implemented by default. + * + * @param {Function} callback + * @api public + */ + class Agent extends EventEmitter { + timeout: number | null; + maxFreeSockets: number; + maxTotalSockets: number; + maxSockets: number; + sockets: { + [key: string]: net.Socket[]; + }; + freeSockets: { + [key: string]: net.Socket[]; + }; + requests: { + [key: string]: http.IncomingMessage[]; + }; + options: https.AgentOptions; + private promisifiedCallback?; + private explicitDefaultPort?; + private explicitProtocol?; + constructor(callback?: createAgent.AgentCallback | createAgent.AgentOptions, _opts?: createAgent.AgentOptions); + get defaultPort(): number; + set defaultPort(v: number); + get protocol(): string; + set protocol(v: string); + callback(req: createAgent.ClientRequest, opts: createAgent.RequestOptions, fn: createAgent.AgentCallbackCallback): void; + callback(req: createAgent.ClientRequest, opts: createAgent.RequestOptions): createAgent.AgentCallbackReturn | Promise; + /** + * Called by node-core's "_http_client.js" module when creating + * a new HTTP request with this Agent instance. + * + * @api public + */ + addRequest(req: ClientRequest, _opts: RequestOptions): void; + freeSocket(socket: net.Socket, opts: AgentOptions): void; + destroy(): void; + } +} +export = createAgent; diff --git a/node/node_modules/agent-base/dist/src/index.js b/node/node_modules/agent-base/dist/src/index.js new file mode 100644 index 0000000..bfd9e22 --- /dev/null +++ b/node/node_modules/agent-base/dist/src/index.js @@ -0,0 +1,203 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +const events_1 = require("events"); +const debug_1 = __importDefault(require("debug")); +const promisify_1 = __importDefault(require("./promisify")); +const debug = debug_1.default('agent-base'); +function isAgent(v) { + return Boolean(v) && typeof v.addRequest === 'function'; +} +function isSecureEndpoint() { + const { stack } = new Error(); + if (typeof stack !== 'string') + return false; + return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1 || l.indexOf('node:https:') !== -1); +} +function createAgent(callback, opts) { + return new createAgent.Agent(callback, opts); +} +(function (createAgent) { + /** + * Base `http.Agent` implementation. + * No pooling/keep-alive is implemented by default. + * + * @param {Function} callback + * @api public + */ + class Agent extends events_1.EventEmitter { + constructor(callback, _opts) { + super(); + let opts = _opts; + if (typeof callback === 'function') { + this.callback = callback; + } + else if (callback) { + opts = callback; + } + // Timeout for the socket to be returned from the callback + this.timeout = null; + if (opts && typeof opts.timeout === 'number') { + this.timeout = opts.timeout; + } + // These aren't actually used by `agent-base`, but are required + // for the TypeScript definition files in `@types/node` :/ + this.maxFreeSockets = 1; + this.maxSockets = 1; + this.maxTotalSockets = Infinity; + this.sockets = {}; + this.freeSockets = {}; + this.requests = {}; + this.options = {}; + } + get defaultPort() { + if (typeof this.explicitDefaultPort === 'number') { + return this.explicitDefaultPort; + } + return isSecureEndpoint() ? 443 : 80; + } + set defaultPort(v) { + this.explicitDefaultPort = v; + } + get protocol() { + if (typeof this.explicitProtocol === 'string') { + return this.explicitProtocol; + } + return isSecureEndpoint() ? 'https:' : 'http:'; + } + set protocol(v) { + this.explicitProtocol = v; + } + callback(req, opts, fn) { + throw new Error('"agent-base" has no default implementation, you must subclass and override `callback()`'); + } + /** + * Called by node-core's "_http_client.js" module when creating + * a new HTTP request with this Agent instance. + * + * @api public + */ + addRequest(req, _opts) { + const opts = Object.assign({}, _opts); + if (typeof opts.secureEndpoint !== 'boolean') { + opts.secureEndpoint = isSecureEndpoint(); + } + if (opts.host == null) { + opts.host = 'localhost'; + } + if (opts.port == null) { + opts.port = opts.secureEndpoint ? 443 : 80; + } + if (opts.protocol == null) { + opts.protocol = opts.secureEndpoint ? 'https:' : 'http:'; + } + if (opts.host && opts.path) { + // If both a `host` and `path` are specified then it's most + // likely the result of a `url.parse()` call... we need to + // remove the `path` portion so that `net.connect()` doesn't + // attempt to open that as a unix socket file. + delete opts.path; + } + delete opts.agent; + delete opts.hostname; + delete opts._defaultAgent; + delete opts.defaultPort; + delete opts.createConnection; + // Hint to use "Connection: close" + // XXX: non-documented `http` module API :( + req._last = true; + req.shouldKeepAlive = false; + let timedOut = false; + let timeoutId = null; + const timeoutMs = opts.timeout || this.timeout; + const onerror = (err) => { + if (req._hadError) + return; + req.emit('error', err); + // For Safety. Some additional errors might fire later on + // and we need to make sure we don't double-fire the error event. + req._hadError = true; + }; + const ontimeout = () => { + timeoutId = null; + timedOut = true; + const err = new Error(`A "socket" was not created for HTTP request before ${timeoutMs}ms`); + err.code = 'ETIMEOUT'; + onerror(err); + }; + const callbackError = (err) => { + if (timedOut) + return; + if (timeoutId !== null) { + clearTimeout(timeoutId); + timeoutId = null; + } + onerror(err); + }; + const onsocket = (socket) => { + if (timedOut) + return; + if (timeoutId != null) { + clearTimeout(timeoutId); + timeoutId = null; + } + if (isAgent(socket)) { + // `socket` is actually an `http.Agent` instance, so + // relinquish responsibility for this `req` to the Agent + // from here on + debug('Callback returned another Agent instance %o', socket.constructor.name); + socket.addRequest(req, opts); + return; + } + if (socket) { + socket.once('free', () => { + this.freeSocket(socket, opts); + }); + req.onSocket(socket); + return; + } + const err = new Error(`no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\``); + onerror(err); + }; + if (typeof this.callback !== 'function') { + onerror(new Error('`callback` is not defined')); + return; + } + if (!this.promisifiedCallback) { + if (this.callback.length >= 3) { + debug('Converting legacy callback function to promise'); + this.promisifiedCallback = promisify_1.default(this.callback); + } + else { + this.promisifiedCallback = this.callback; + } + } + if (typeof timeoutMs === 'number' && timeoutMs > 0) { + timeoutId = setTimeout(ontimeout, timeoutMs); + } + if ('port' in opts && typeof opts.port !== 'number') { + opts.port = Number(opts.port); + } + try { + debug('Resolving socket for %o request: %o', opts.protocol, `${req.method} ${req.path}`); + Promise.resolve(this.promisifiedCallback(req, opts)).then(onsocket, callbackError); + } + catch (err) { + Promise.reject(err).catch(callbackError); + } + } + freeSocket(socket, opts) { + debug('Freeing socket %o %o', socket.constructor.name, opts); + socket.destroy(); + } + destroy() { + debug('Destroying agent %o', this.constructor.name); + } + } + createAgent.Agent = Agent; + // So that `instanceof` works correctly + createAgent.prototype = createAgent.Agent.prototype; +})(createAgent || (createAgent = {})); +module.exports = createAgent; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node/node_modules/agent-base/dist/src/index.js.map b/node/node_modules/agent-base/dist/src/index.js.map new file mode 100644 index 0000000..bd118ab --- /dev/null +++ b/node/node_modules/agent-base/dist/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/node_modules/agent-base/dist/src/promisify.d.ts b/node/node_modules/agent-base/dist/src/promisify.d.ts new file mode 100644 index 0000000..0268869 --- /dev/null +++ b/node/node_modules/agent-base/dist/src/promisify.d.ts @@ -0,0 +1,4 @@ +import { ClientRequest, RequestOptions, AgentCallbackCallback, AgentCallbackPromise } from './index'; +declare type LegacyCallback = (req: ClientRequest, opts: RequestOptions, fn: AgentCallbackCallback) => void; +export default function promisify(fn: LegacyCallback): AgentCallbackPromise; +export {}; diff --git a/node/node_modules/agent-base/dist/src/promisify.js b/node/node_modules/agent-base/dist/src/promisify.js new file mode 100644 index 0000000..b2f6132 --- /dev/null +++ b/node/node_modules/agent-base/dist/src/promisify.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function promisify(fn) { + return function (req, opts) { + return new Promise((resolve, reject) => { + fn.call(this, req, opts, (err, rtn) => { + if (err) { + reject(err); + } + else { + resolve(rtn); + } + }); + }); + }; +} +exports.default = promisify; +//# sourceMappingURL=promisify.js.map \ No newline at end of file diff --git a/node/node_modules/agent-base/dist/src/promisify.js.map b/node/node_modules/agent-base/dist/src/promisify.js.map new file mode 100644 index 0000000..4bff9bf --- /dev/null +++ b/node/node_modules/agent-base/dist/src/promisify.js.map @@ -0,0 +1 @@ +{"version":3,"file":"promisify.js","sourceRoot":"","sources":["../../src/promisify.ts"],"names":[],"mappings":";;AAeA,SAAwB,SAAS,CAAC,EAAkB;IACnD,OAAO,UAAsB,GAAkB,EAAE,IAAoB;QACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,EAAE,CAAC,IAAI,CACN,IAAI,EACJ,GAAG,EACH,IAAI,EACJ,CAAC,GAA6B,EAAE,GAAyB,EAAE,EAAE;gBAC5D,IAAI,GAAG,EAAE;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;iBACZ;qBAAM;oBACN,OAAO,CAAC,GAAG,CAAC,CAAC;iBACb;YACF,CAAC,CACD,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC;AAjBD,4BAiBC"} \ No newline at end of file diff --git a/node/node_modules/agent-base/node_modules/debug/LICENSE b/node/node_modules/agent-base/node_modules/debug/LICENSE new file mode 100644 index 0000000..1a9820e --- /dev/null +++ b/node/node_modules/agent-base/node_modules/debug/LICENSE @@ -0,0 +1,20 @@ +(The MIT License) + +Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2018-2021 Josh Junon + +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. + diff --git a/node/node_modules/agent-base/node_modules/debug/README.md b/node/node_modules/agent-base/node_modules/debug/README.md new file mode 100644 index 0000000..e9c3e04 --- /dev/null +++ b/node/node_modules/agent-base/node_modules/debug/README.md @@ -0,0 +1,481 @@ +# debug +[![Build Status](https://travis-ci.org/debug-js/debug.svg?branch=master)](https://travis-ci.org/debug-js/debug) [![Coverage Status](https://coveralls.io/repos/github/debug-js/debug/badge.svg?branch=master)](https://coveralls.io/github/debug-js/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) +[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) + + + +A tiny JavaScript debugging utility modelled after Node.js core's debugging +technique. Works in Node.js and web browsers. + +## Installation + +```bash +$ npm install debug +``` + +## Usage + +`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. + +Example [_app.js_](./examples/node/app.js): + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %o', name); + +http.createServer(function(req, res){ + debug(req.method + ' ' + req.url); + res.end('hello\n'); +}).listen(3000, function(){ + debug('listening'); +}); + +// fake worker of some kind + +require('./worker'); +``` + +Example [_worker.js_](./examples/node/worker.js): + +```js +var a = require('debug')('worker:a') + , b = require('debug')('worker:b'); + +function work() { + a('doing lots of uninteresting work'); + setTimeout(work, Math.random() * 1000); +} + +work(); + +function workb() { + b('doing some work'); + setTimeout(workb, Math.random() * 2000); +} + +workb(); +``` + +The `DEBUG` environment variable is then used to enable these based on space or +comma-delimited names. + +Here are some examples: + +screen shot 2017-08-08 at 12 53 04 pm +screen shot 2017-08-08 at 12 53 38 pm +screen shot 2017-08-08 at 12 53 25 pm + +#### Windows command prompt notes + +##### CMD + +On Windows the environment variable is set using the `set` command. + +```cmd +set DEBUG=*,-not_this +``` + +Example: + +```cmd +set DEBUG=* & node app.js +``` + +##### PowerShell (VS Code default) + +PowerShell uses different syntax to set environment variables. + +```cmd +$env:DEBUG = "*,-not_this" +``` + +Example: + +```cmd +$env:DEBUG='app';node app.js +``` + +Then, run the program to be debugged as usual. + +npm script example: +```js + "windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js", +``` + +## Namespace Colors + +Every debug instance has a color generated for it based on its namespace name. +This helps when visually parsing the debug output to identify which debug instance +a debug line belongs to. + +#### Node.js + +In Node.js, colors are enabled when stderr is a TTY. You also _should_ install +the [`supports-color`](https://npmjs.org/supports-color) module alongside debug, +otherwise debug will only use a small handful of basic colors. + + + +#### Web Browser + +Colors are also enabled on "Web Inspectors" that understand the `%c` formatting +option. These are WebKit web inspectors, Firefox ([since version +31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) +and the Firebug plugin for Firefox (any version). + + + + +## Millisecond diff + +When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. + + + +When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below: + + + + +## Conventions + +If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable. You can then use it for normal output as well as debug output. + +## Wildcards + +The `*` character may be used as a wildcard. Suppose for example your library has +debuggers named "connect:bodyParser", "connect:compress", "connect:session", +instead of listing all three with +`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do +`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. + +You can also exclude specific debuggers by prefixing them with a "-" character. +For example, `DEBUG=*,-connect:*` would include all debuggers except those +starting with "connect:". + +## Environment Variables + +When running through Node.js, you can set a few environment variables that will +change the behavior of the debug logging: + +| Name | Purpose | +|-----------|-------------------------------------------------| +| `DEBUG` | Enables/disables specific debugging namespaces. | +| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY). | +| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | +| `DEBUG_DEPTH` | Object inspection depth. | +| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | + + +__Note:__ The environment variables beginning with `DEBUG_` end up being +converted into an Options object that gets used with `%o`/`%O` formatters. +See the Node.js documentation for +[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) +for the complete list. + +## Formatters + +Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. +Below are the officially supported formatters: + +| Formatter | Representation | +|-----------|----------------| +| `%O` | Pretty-print an Object on multiple lines. | +| `%o` | Pretty-print an Object all on a single line. | +| `%s` | String. | +| `%d` | Number (both integer and float). | +| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | +| `%%` | Single percent sign ('%'). This does not consume an argument. | + + +### Custom formatters + +You can add custom formatters by extending the `debug.formatters` object. +For example, if you wanted to add support for rendering a Buffer as hex with +`%h`, you could do something like: + +```js +const createDebug = require('debug') +createDebug.formatters.h = (v) => { + return v.toString('hex') +} + +// …elsewhere +const debug = createDebug('foo') +debug('this is hex: %h', new Buffer('hello world')) +// foo this is hex: 68656c6c6f20776f726c6421 +0ms +``` + + +## Browser Support + +You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), +or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), +if you don't want to build it yourself. + +Debug's enable state is currently persisted by `localStorage`. +Consider the situation shown below where you have `worker:a` and `worker:b`, +and wish to debug both. You can enable this using `localStorage.debug`: + +```js +localStorage.debug = 'worker:*' +``` + +And then refresh the page. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + b('doing some work'); +}, 1200); +``` + +In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by `debug` if the "Verbose" log level is _enabled_. + + + +## Output streams + + By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: + +Example [_stdout.js_](./examples/node/stdout.js): + +```js +var debug = require('debug'); +var error = debug('app:error'); + +// by default stderr is used +error('goes to stderr!'); + +var log = debug('app:log'); +// set this namespace to log via console.log +log.log = console.log.bind(console); // don't forget to bind to console! +log('goes to stdout'); +error('still goes to stderr!'); + +// set all output to go via console.info +// overrides all per-namespace log settings +debug.log = console.info.bind(console); +error('now goes to stdout via console.info'); +log('still goes to stdout, but via console.info now'); +``` + +## Extend +You can simply extend debugger +```js +const log = require('debug')('auth'); + +//creates new debug instance with extended namespace +const logSign = log.extend('sign'); +const logLogin = log.extend('login'); + +log('hello'); // auth hello +logSign('hello'); //auth:sign hello +logLogin('hello'); //auth:login hello +``` + +## Set dynamically + +You can also enable debug dynamically by calling the `enable()` method : + +```js +let debug = require('debug'); + +console.log(1, debug.enabled('test')); + +debug.enable('test'); +console.log(2, debug.enabled('test')); + +debug.disable(); +console.log(3, debug.enabled('test')); + +``` + +print : +``` +1 false +2 true +3 false +``` + +Usage : +`enable(namespaces)` +`namespaces` can include modes separated by a colon and wildcards. + +Note that calling `enable()` completely overrides previously set DEBUG variable : + +``` +$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))' +=> false +``` + +`disable()` + +Will disable all namespaces. The functions returns the namespaces currently +enabled (and skipped). This can be useful if you want to disable debugging +temporarily without knowing what was enabled to begin with. + +For example: + +```js +let debug = require('debug'); +debug.enable('foo:*,-foo:bar'); +let namespaces = debug.disable(); +debug.enable(namespaces); +``` + +Note: There is no guarantee that the string will be identical to the initial +enable string, but semantically they will be identical. + +## Checking whether a debug target is enabled + +After you've created a debug instance, you can determine whether or not it is +enabled by checking the `enabled` property: + +```javascript +const debug = require('debug')('http'); + +if (debug.enabled) { + // do stuff... +} +``` + +You can also manually toggle this property to force the debug instance to be +enabled or disabled. + +## Usage in child processes + +Due to the way `debug` detects if the output is a TTY or not, colors are not shown in child processes when `stderr` is piped. A solution is to pass the `DEBUG_COLORS=1` environment variable to the child process. +For example: + +```javascript +worker = fork(WORKER_WRAP_PATH, [workerPath], { + stdio: [ + /* stdin: */ 0, + /* stdout: */ 'pipe', + /* stderr: */ 'pipe', + 'ipc', + ], + env: Object.assign({}, process.env, { + DEBUG_COLORS: 1 // without this settings, colors won't be shown + }), +}); + +worker.stderr.pipe(process.stderr, { end: false }); +``` + + +## Authors + + - TJ Holowaychuk + - Nathan Rajlich + - Andrew Rhyne + - Josh Junon + +## Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Sponsors + +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## License + +(The MIT License) + +Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca> +Copyright (c) 2018-2021 Josh Junon + +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. diff --git a/node/node_modules/agent-base/node_modules/debug/package.json b/node/node_modules/agent-base/node_modules/debug/package.json new file mode 100644 index 0000000..3bcdc24 --- /dev/null +++ b/node/node_modules/agent-base/node_modules/debug/package.json @@ -0,0 +1,59 @@ +{ + "name": "debug", + "version": "4.3.4", + "repository": { + "type": "git", + "url": "git://github.com/debug-js/debug.git" + }, + "description": "Lightweight debugging utility for Node.js and the browser", + "keywords": [ + "debug", + "log", + "debugger" + ], + "files": [ + "src", + "LICENSE", + "README.md" + ], + "author": "Josh Junon ", + "contributors": [ + "TJ Holowaychuk ", + "Nathan Rajlich (http://n8.io)", + "Andrew Rhyne " + ], + "license": "MIT", + "scripts": { + "lint": "xo", + "test": "npm run test:node && npm run test:browser && npm run lint", + "test:node": "istanbul cover _mocha -- test.js", + "test:browser": "karma start --single-run", + "test:coverage": "cat ./coverage/lcov.info | coveralls" + }, + "dependencies": { + "ms": "2.1.2" + }, + "devDependencies": { + "brfs": "^2.0.1", + "browserify": "^16.2.3", + "coveralls": "^3.0.2", + "istanbul": "^0.4.5", + "karma": "^3.1.4", + "karma-browserify": "^6.0.0", + "karma-chrome-launcher": "^2.2.0", + "karma-mocha": "^1.3.0", + "mocha": "^5.2.0", + "mocha-lcov-reporter": "^1.2.0", + "xo": "^0.23.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + }, + "main": "./src/index.js", + "browser": "./src/browser.js", + "engines": { + "node": ">=6.0" + } +} diff --git a/node/node_modules/agent-base/node_modules/debug/src/browser.js b/node/node_modules/agent-base/node_modules/debug/src/browser.js new file mode 100644 index 0000000..cd0fc35 --- /dev/null +++ b/node/node_modules/agent-base/node_modules/debug/src/browser.js @@ -0,0 +1,269 @@ +/* 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; + } +}; diff --git a/node/node_modules/agent-base/node_modules/debug/src/common.js b/node/node_modules/agent-base/node_modules/debug/src/common.js new file mode 100644 index 0000000..e3291b2 --- /dev/null +++ b/node/node_modules/agent-base/node_modules/debug/src/common.js @@ -0,0 +1,274 @@ + +/** + * 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; diff --git a/node/node_modules/agent-base/node_modules/debug/src/index.js b/node/node_modules/agent-base/node_modules/debug/src/index.js new file mode 100644 index 0000000..bf4c57f --- /dev/null +++ b/node/node_modules/agent-base/node_modules/debug/src/index.js @@ -0,0 +1,10 @@ +/** + * Detect Electron renderer / nwjs process, which is node, but we should + * treat as a browser. + */ + +if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) { + module.exports = require('./browser.js'); +} else { + module.exports = require('./node.js'); +} diff --git a/node/node_modules/agent-base/node_modules/debug/src/node.js b/node/node_modules/agent-base/node_modules/debug/src/node.js new file mode 100644 index 0000000..79bc085 --- /dev/null +++ b/node/node_modules/agent-base/node_modules/debug/src/node.js @@ -0,0 +1,263 @@ +/** + * Module dependencies. + */ + +const tty = require('tty'); +const util = require('util'); + +/** + * This is the Node.js implementation of `debug()`. + */ + +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.destroy = util.deprecate( + () => {}, + '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 = [6, 2, 3, 4, 5, 1]; + +try { + // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) + // eslint-disable-next-line import/no-extraneous-dependencies + const supportsColor = require('supports-color'); + + if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { + exports.colors = [ + 20, + 21, + 26, + 27, + 32, + 33, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 56, + 57, + 62, + 63, + 68, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 92, + 93, + 98, + 99, + 112, + 113, + 128, + 129, + 134, + 135, + 148, + 149, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 178, + 179, + 184, + 185, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 214, + 215, + 220, + 221 + ]; + } +} catch (error) { + // Swallow - we only care if `supports-color` is available; it doesn't have to be. +} + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(key => { + return /^debug_/i.test(key); +}).reduce((obj, key) => { + // Camel-case + const prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, (_, k) => { + return k.toUpperCase(); + }); + + // Coerce string value into JS value + let val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) { + val = true; + } else if (/^(no|off|false|disabled)$/i.test(val)) { + val = false; + } else if (val === 'null') { + val = null; + } else { + val = Number(val); + } + + obj[prop] = val; + return obj; +}, {}); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts ? + Boolean(exports.inspectOpts.colors) : + tty.isatty(process.stderr.fd); +} + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + const {namespace: name, useColors} = this; + + if (useColors) { + const c = this.color; + const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); + const prefix = ` ${colorCode};1m${name} \u001B[0m`; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); + } else { + args[0] = getDate() + name + ' ' + args[0]; + } +} + +function getDate() { + if (exports.inspectOpts.hideDate) { + return ''; + } + return new Date().toISOString() + ' '; +} + +/** + * Invokes `util.format()` with the specified arguments and writes to stderr. + */ + +function log(...args) { + return process.stderr.write(util.format(...args) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + if (namespaces) { + process.env.DEBUG = namespaces; + } else { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init(debug) { + debug.inspectOpts = {}; + + const keys = Object.keys(exports.inspectOpts); + for (let i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +module.exports = require('./common')(exports); + +const {formatters} = module.exports; + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +formatters.o = function (v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n') + .map(str => str.trim()) + .join(' '); +}; + +/** + * Map %O to `util.inspect()`, allowing multiple lines if needed. + */ + +formatters.O = function (v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; diff --git a/node/node_modules/agent-base/node_modules/ms/index.js b/node/node_modules/agent-base/node_modules/ms/index.js new file mode 100644 index 0000000..c4498bc --- /dev/null +++ b/node/node_modules/agent-base/node_modules/ms/index.js @@ -0,0 +1,162 @@ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * 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 + */ + +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) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + 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; + } + 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; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + 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'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} diff --git a/node/node_modules/agent-base/node_modules/ms/license.md b/node/node_modules/agent-base/node_modules/ms/license.md new file mode 100644 index 0000000..69b6125 --- /dev/null +++ b/node/node_modules/agent-base/node_modules/ms/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +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. diff --git a/node/node_modules/agent-base/node_modules/ms/package.json b/node/node_modules/agent-base/node_modules/ms/package.json new file mode 100644 index 0000000..eea666e --- /dev/null +++ b/node/node_modules/agent-base/node_modules/ms/package.json @@ -0,0 +1,37 @@ +{ + "name": "ms", + "version": "2.1.2", + "description": "Tiny millisecond conversion utility", + "repository": "zeit/ms", + "main": "./index", + "files": [ + "index.js" + ], + "scripts": { + "precommit": "lint-staged", + "lint": "eslint lib/* bin/*", + "test": "mocha tests.js" + }, + "eslintConfig": { + "extends": "eslint:recommended", + "env": { + "node": true, + "es6": true + } + }, + "lint-staged": { + "*.js": [ + "npm run lint", + "prettier --single-quote --write", + "git add" + ] + }, + "license": "MIT", + "devDependencies": { + "eslint": "4.12.1", + "expect.js": "0.3.1", + "husky": "0.14.3", + "lint-staged": "5.0.0", + "mocha": "4.0.1" + } +} diff --git a/node/node_modules/agent-base/node_modules/ms/readme.md b/node/node_modules/agent-base/node_modules/ms/readme.md new file mode 100644 index 0000000..9a1996b --- /dev/null +++ b/node/node_modules/agent-base/node_modules/ms/readme.md @@ -0,0 +1,60 @@ +# ms + +[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms) +[![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/zeit) + +Use this package to easily convert various time formats to milliseconds. + +## Examples + +```js +ms('2 days') // 172800000 +ms('1d') // 86400000 +ms('10h') // 36000000 +ms('2.5 hrs') // 9000000 +ms('2h') // 7200000 +ms('1m') // 60000 +ms('5s') // 5000 +ms('1y') // 31557600000 +ms('100') // 100 +ms('-3 days') // -259200000 +ms('-1h') // -3600000 +ms('-200') // -200 +``` + +### Convert from Milliseconds + +```js +ms(60000) // "1m" +ms(2 * 60000) // "2m" +ms(-3 * 60000) // "-3m" +ms(ms('10 hours')) // "10h" +``` + +### Time Format Written-Out + +```js +ms(60000, { long: true }) // "1 minute" +ms(2 * 60000, { long: true }) // "2 minutes" +ms(-3 * 60000, { long: true }) // "-3 minutes" +ms(ms('10 hours'), { long: true }) // "10 hours" +``` + +## Features + +- Works both in [Node.js](https://nodejs.org) and in the browser +- If a number is supplied to `ms`, a string with a unit is returned +- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`) +- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned + +## Related Packages + +- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time. + +## Caught a Bug? + +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device +2. Link the package to the global module directory: `npm link` +3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms! + +As always, you can run the tests using: `npm test` diff --git a/node/node_modules/agent-base/package.json b/node/node_modules/agent-base/package.json new file mode 100644 index 0000000..fadce3a --- /dev/null +++ b/node/node_modules/agent-base/package.json @@ -0,0 +1,64 @@ +{ + "name": "agent-base", + "version": "6.0.2", + "description": "Turn a function into an `http.Agent` instance", + "main": "dist/src/index", + "typings": "dist/src/index", + "files": [ + "dist/src", + "src" + ], + "scripts": { + "prebuild": "rimraf dist", + "build": "tsc", + "postbuild": "cpy --parents src test '!**/*.ts' dist", + "test": "mocha --reporter spec dist/test/*.js", + "test-lint": "eslint src --ext .js,.ts", + "prepublishOnly": "npm run build" + }, + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/node-agent-base.git" + }, + "keywords": [ + "http", + "agent", + "base", + "barebones", + "https" + ], + "author": "Nathan Rajlich (http://n8.io/)", + "license": "MIT", + "bugs": { + "url": "https://github.com/TooTallNate/node-agent-base/issues" + }, + "dependencies": { + "debug": "4" + }, + "devDependencies": { + "@types/debug": "4", + "@types/mocha": "^5.2.7", + "@types/node": "^14.0.20", + "@types/semver": "^7.1.0", + "@types/ws": "^6.0.3", + "@typescript-eslint/eslint-plugin": "1.6.0", + "@typescript-eslint/parser": "1.1.0", + "async-listen": "^1.2.0", + "cpy-cli": "^2.0.0", + "eslint": "5.16.0", + "eslint-config-airbnb": "17.1.0", + "eslint-config-prettier": "4.1.0", + "eslint-import-resolver-typescript": "1.1.1", + "eslint-plugin-import": "2.16.0", + "eslint-plugin-jsx-a11y": "6.2.1", + "eslint-plugin-react": "7.12.4", + "mocha": "^6.2.0", + "rimraf": "^3.0.0", + "semver": "^7.1.2", + "typescript": "^3.5.3", + "ws": "^3.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } +} diff --git a/node/node_modules/agent-base/src/index.ts b/node/node_modules/agent-base/src/index.ts new file mode 100644 index 0000000..a47ccd4 --- /dev/null +++ b/node/node_modules/agent-base/src/index.ts @@ -0,0 +1,345 @@ +import net from 'net'; +import http from 'http'; +import https from 'https'; +import { Duplex } from 'stream'; +import { EventEmitter } from 'events'; +import createDebug from 'debug'; +import promisify from './promisify'; + +const debug = createDebug('agent-base'); + +function isAgent(v: any): v is createAgent.AgentLike { + return Boolean(v) && typeof v.addRequest === 'function'; +} + +function isSecureEndpoint(): boolean { + const { stack } = new Error(); + if (typeof stack !== 'string') return false; + return stack.split('\n').some(l => l.indexOf('(https.js:') !== -1 || l.indexOf('node:https:') !== -1); +} + +function createAgent(opts?: createAgent.AgentOptions): createAgent.Agent; +function createAgent( + callback: createAgent.AgentCallback, + opts?: createAgent.AgentOptions +): createAgent.Agent; +function createAgent( + callback?: createAgent.AgentCallback | createAgent.AgentOptions, + opts?: createAgent.AgentOptions +) { + return new createAgent.Agent(callback, opts); +} + +namespace createAgent { + export interface ClientRequest extends http.ClientRequest { + _last?: boolean; + _hadError?: boolean; + method: string; + } + + export interface AgentRequestOptions { + host?: string; + path?: string; + // `port` on `http.RequestOptions` can be a string or undefined, + // but `net.TcpNetConnectOpts` expects only a number + port: number; + } + + export interface HttpRequestOptions + extends AgentRequestOptions, + Omit { + secureEndpoint: false; + } + + export interface HttpsRequestOptions + extends AgentRequestOptions, + Omit { + secureEndpoint: true; + } + + export type RequestOptions = HttpRequestOptions | HttpsRequestOptions; + + export type AgentLike = Pick | http.Agent; + + export type AgentCallbackReturn = Duplex | AgentLike; + + export type AgentCallbackCallback = ( + err?: Error | null, + socket?: createAgent.AgentCallbackReturn + ) => void; + + export type AgentCallbackPromise = ( + req: createAgent.ClientRequest, + opts: createAgent.RequestOptions + ) => + | createAgent.AgentCallbackReturn + | Promise; + + export type AgentCallback = typeof Agent.prototype.callback; + + export type AgentOptions = { + timeout?: number; + }; + + /** + * Base `http.Agent` implementation. + * No pooling/keep-alive is implemented by default. + * + * @param {Function} callback + * @api public + */ + export class Agent extends EventEmitter { + public timeout: number | null; + public maxFreeSockets: number; + public maxTotalSockets: number; + public maxSockets: number; + public sockets: { + [key: string]: net.Socket[]; + }; + public freeSockets: { + [key: string]: net.Socket[]; + }; + public requests: { + [key: string]: http.IncomingMessage[]; + }; + public options: https.AgentOptions; + private promisifiedCallback?: createAgent.AgentCallbackPromise; + private explicitDefaultPort?: number; + private explicitProtocol?: string; + + constructor( + callback?: createAgent.AgentCallback | createAgent.AgentOptions, + _opts?: createAgent.AgentOptions + ) { + super(); + + let opts = _opts; + if (typeof callback === 'function') { + this.callback = callback; + } else if (callback) { + opts = callback; + } + + // Timeout for the socket to be returned from the callback + this.timeout = null; + if (opts && typeof opts.timeout === 'number') { + this.timeout = opts.timeout; + } + + // These aren't actually used by `agent-base`, but are required + // for the TypeScript definition files in `@types/node` :/ + this.maxFreeSockets = 1; + this.maxSockets = 1; + this.maxTotalSockets = Infinity; + this.sockets = {}; + this.freeSockets = {}; + this.requests = {}; + this.options = {}; + } + + get defaultPort(): number { + if (typeof this.explicitDefaultPort === 'number') { + return this.explicitDefaultPort; + } + return isSecureEndpoint() ? 443 : 80; + } + + set defaultPort(v: number) { + this.explicitDefaultPort = v; + } + + get protocol(): string { + if (typeof this.explicitProtocol === 'string') { + return this.explicitProtocol; + } + return isSecureEndpoint() ? 'https:' : 'http:'; + } + + set protocol(v: string) { + this.explicitProtocol = v; + } + + callback( + req: createAgent.ClientRequest, + opts: createAgent.RequestOptions, + fn: createAgent.AgentCallbackCallback + ): void; + callback( + req: createAgent.ClientRequest, + opts: createAgent.RequestOptions + ): + | createAgent.AgentCallbackReturn + | Promise; + callback( + req: createAgent.ClientRequest, + opts: createAgent.AgentOptions, + fn?: createAgent.AgentCallbackCallback + ): + | createAgent.AgentCallbackReturn + | Promise + | void { + throw new Error( + '"agent-base" has no default implementation, you must subclass and override `callback()`' + ); + } + + /** + * Called by node-core's "_http_client.js" module when creating + * a new HTTP request with this Agent instance. + * + * @api public + */ + addRequest(req: ClientRequest, _opts: RequestOptions): void { + const opts: RequestOptions = { ..._opts }; + + if (typeof opts.secureEndpoint !== 'boolean') { + opts.secureEndpoint = isSecureEndpoint(); + } + + if (opts.host == null) { + opts.host = 'localhost'; + } + + if (opts.port == null) { + opts.port = opts.secureEndpoint ? 443 : 80; + } + + if (opts.protocol == null) { + opts.protocol = opts.secureEndpoint ? 'https:' : 'http:'; + } + + if (opts.host && opts.path) { + // If both a `host` and `path` are specified then it's most + // likely the result of a `url.parse()` call... we need to + // remove the `path` portion so that `net.connect()` doesn't + // attempt to open that as a unix socket file. + delete opts.path; + } + + delete opts.agent; + delete opts.hostname; + delete opts._defaultAgent; + delete opts.defaultPort; + delete opts.createConnection; + + // Hint to use "Connection: close" + // XXX: non-documented `http` module API :( + req._last = true; + req.shouldKeepAlive = false; + + let timedOut = false; + let timeoutId: ReturnType | null = null; + const timeoutMs = opts.timeout || this.timeout; + + const onerror = (err: NodeJS.ErrnoException) => { + if (req._hadError) return; + req.emit('error', err); + // For Safety. Some additional errors might fire later on + // and we need to make sure we don't double-fire the error event. + req._hadError = true; + }; + + const ontimeout = () => { + timeoutId = null; + timedOut = true; + const err: NodeJS.ErrnoException = new Error( + `A "socket" was not created for HTTP request before ${timeoutMs}ms` + ); + err.code = 'ETIMEOUT'; + onerror(err); + }; + + const callbackError = (err: NodeJS.ErrnoException) => { + if (timedOut) return; + if (timeoutId !== null) { + clearTimeout(timeoutId); + timeoutId = null; + } + onerror(err); + }; + + const onsocket = (socket: AgentCallbackReturn) => { + if (timedOut) return; + if (timeoutId != null) { + clearTimeout(timeoutId); + timeoutId = null; + } + + if (isAgent(socket)) { + // `socket` is actually an `http.Agent` instance, so + // relinquish responsibility for this `req` to the Agent + // from here on + debug( + 'Callback returned another Agent instance %o', + socket.constructor.name + ); + (socket as createAgent.Agent).addRequest(req, opts); + return; + } + + if (socket) { + socket.once('free', () => { + this.freeSocket(socket as net.Socket, opts); + }); + req.onSocket(socket as net.Socket); + return; + } + + const err = new Error( + `no Duplex stream was returned to agent-base for \`${req.method} ${req.path}\`` + ); + onerror(err); + }; + + if (typeof this.callback !== 'function') { + onerror(new Error('`callback` is not defined')); + return; + } + + if (!this.promisifiedCallback) { + if (this.callback.length >= 3) { + debug('Converting legacy callback function to promise'); + this.promisifiedCallback = promisify(this.callback); + } else { + this.promisifiedCallback = this.callback; + } + } + + if (typeof timeoutMs === 'number' && timeoutMs > 0) { + timeoutId = setTimeout(ontimeout, timeoutMs); + } + + if ('port' in opts && typeof opts.port !== 'number') { + opts.port = Number(opts.port); + } + + try { + debug( + 'Resolving socket for %o request: %o', + opts.protocol, + `${req.method} ${req.path}` + ); + Promise.resolve(this.promisifiedCallback(req, opts)).then( + onsocket, + callbackError + ); + } catch (err) { + Promise.reject(err).catch(callbackError); + } + } + + freeSocket(socket: net.Socket, opts: AgentOptions) { + debug('Freeing socket %o %o', socket.constructor.name, opts); + socket.destroy(); + } + + destroy() { + debug('Destroying agent %o', this.constructor.name); + } + } + + // So that `instanceof` works correctly + createAgent.prototype = createAgent.Agent.prototype; +} + +export = createAgent; diff --git a/node/node_modules/agent-base/src/promisify.ts b/node/node_modules/agent-base/src/promisify.ts new file mode 100644 index 0000000..60cc662 --- /dev/null +++ b/node/node_modules/agent-base/src/promisify.ts @@ -0,0 +1,33 @@ +import { + Agent, + ClientRequest, + RequestOptions, + AgentCallbackCallback, + AgentCallbackPromise, + AgentCallbackReturn +} from './index'; + +type LegacyCallback = ( + req: ClientRequest, + opts: RequestOptions, + fn: AgentCallbackCallback +) => void; + +export default function promisify(fn: LegacyCallback): AgentCallbackPromise { + return function(this: Agent, req: ClientRequest, opts: RequestOptions) { + return new Promise((resolve, reject) => { + fn.call( + this, + req, + opts, + (err: Error | null | undefined, rtn?: AgentCallbackReturn) => { + if (err) { + reject(err); + } else { + resolve(rtn); + } + } + ); + }); + }; +} diff --git a/node/node_modules/asynckit/LICENSE b/node/node_modules/asynckit/LICENSE new file mode 100644 index 0000000..c9eca5d --- /dev/null +++ b/node/node_modules/asynckit/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Alex Indigo + +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. diff --git a/node/node_modules/asynckit/README.md b/node/node_modules/asynckit/README.md new file mode 100644 index 0000000..ddcc7e6 --- /dev/null +++ b/node/node_modules/asynckit/README.md @@ -0,0 +1,233 @@ +# asynckit [![NPM Module](https://img.shields.io/npm/v/asynckit.svg?style=flat)](https://www.npmjs.com/package/asynckit) + +Minimal async jobs utility library, with streams support. + +[![PhantomJS Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=browser&style=flat)](https://travis-ci.org/alexindigo/asynckit) +[![Linux Build](https://img.shields.io/travis/alexindigo/asynckit/v0.4.0.svg?label=linux:0.12-6.x&style=flat)](https://travis-ci.org/alexindigo/asynckit) +[![Windows Build](https://img.shields.io/appveyor/ci/alexindigo/asynckit/v0.4.0.svg?label=windows:0.12-6.x&style=flat)](https://ci.appveyor.com/project/alexindigo/asynckit) + +[![Coverage Status](https://img.shields.io/coveralls/alexindigo/asynckit/v0.4.0.svg?label=code+coverage&style=flat)](https://coveralls.io/github/alexindigo/asynckit?branch=master) +[![Dependency Status](https://img.shields.io/david/alexindigo/asynckit/v0.4.0.svg?style=flat)](https://david-dm.org/alexindigo/asynckit) +[![bitHound Overall Score](https://www.bithound.io/github/alexindigo/asynckit/badges/score.svg)](https://www.bithound.io/github/alexindigo/asynckit) + + + +AsyncKit provides harness for `parallel` and `serial` iterators over list of items represented by arrays or objects. +Optionally it accepts abort function (should be synchronously return by iterator for each item), and terminates left over jobs upon an error event. For specific iteration order built-in (`ascending` and `descending`) and custom sort helpers also supported, via `asynckit.serialOrdered` method. + +It ensures async operations to keep behavior more stable and prevent `Maximum call stack size exceeded` errors, from sync iterators. + +| compression | size | +| :----------------- | -------: | +| asynckit.js | 12.34 kB | +| asynckit.min.js | 4.11 kB | +| asynckit.min.js.gz | 1.47 kB | + + +## Install + +```sh +$ npm install --save asynckit +``` + +## Examples + +### Parallel Jobs + +Runs iterator over provided array in parallel. Stores output in the `result` array, +on the matching positions. In unlikely event of an error from one of the jobs, +will terminate rest of the active jobs (if abort function is provided) +and return error along with salvaged data to the main callback function. + +#### Input Array + +```javascript +var parallel = require('asynckit').parallel + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ] + , target = [] + ; + +parallel(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// async job accepts one element from the array +// and a callback function +function asyncJob(item, cb) +{ + // different delays (in ms) per item + var delay = item * 25; + + // pretend different jobs take different time to finish + // and not in consequential order + var timeoutId = setTimeout(function() { + target.push(item); + cb(null, item * 2); + }, delay); + + // allow to cancel "leftover" jobs upon error + // return function, invoking of which will abort this job + return clearTimeout.bind(null, timeoutId); +} +``` + +More examples could be found in [test/test-parallel-array.js](test/test-parallel-array.js). + +#### Input Object + +Also it supports named jobs, listed via object. + +```javascript +var parallel = require('asynckit/parallel') + , assert = require('assert') + ; + +var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 } + , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 } + , expectedTarget = [ 1, 1, 2, 4, 8, 16, 32, 64 ] + , expectedKeys = [ 'first', 'one', 'two', 'four', 'eight', 'sixteen', 'thirtyTwo', 'sixtyFour' ] + , target = [] + , keys = [] + ; + +parallel(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); + assert.deepEqual(keys, expectedKeys); +}); + +// supports full value, key, callback (shortcut) interface +function asyncJob(item, key, cb) +{ + // different delays (in ms) per item + var delay = item * 25; + + // pretend different jobs take different time to finish + // and not in consequential order + var timeoutId = setTimeout(function() { + keys.push(key); + target.push(item); + cb(null, item * 2); + }, delay); + + // allow to cancel "leftover" jobs upon error + // return function, invoking of which will abort this job + return clearTimeout.bind(null, timeoutId); +} +``` + +More examples could be found in [test/test-parallel-object.js](test/test-parallel-object.js). + +### Serial Jobs + +Runs iterator over provided array sequentially. Stores output in the `result` array, +on the matching positions. In unlikely event of an error from one of the jobs, +will not proceed to the rest of the items in the list +and return error along with salvaged data to the main callback function. + +#### Input Array + +```javascript +var serial = require('asynckit/serial') + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ] + , target = [] + ; + +serial(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// extended interface (item, key, callback) +// also supported for arrays +function asyncJob(item, key, cb) +{ + target.push(key); + + // it will be automatically made async + // even it iterator "returns" in the same event loop + cb(null, item * 2); +} +``` + +More examples could be found in [test/test-serial-array.js](test/test-serial-array.js). + +#### Input Object + +Also it supports named jobs, listed via object. + +```javascript +var serial = require('asynckit').serial + , assert = require('assert') + ; + +var source = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , expectedResult = [ 2, 2, 8, 32, 128, 64, 16, 4 ] + , expectedTarget = [ 0, 1, 2, 3, 4, 5, 6, 7 ] + , target = [] + ; + +var source = { first: 1, one: 1, four: 4, sixteen: 16, sixtyFour: 64, thirtyTwo: 32, eight: 8, two: 2 } + , expectedResult = { first: 2, one: 2, four: 8, sixteen: 32, sixtyFour: 128, thirtyTwo: 64, eight: 16, two: 4 } + , expectedTarget = [ 1, 1, 4, 16, 64, 32, 8, 2 ] + , target = [] + ; + + +serial(source, asyncJob, function(err, result) +{ + assert.deepEqual(result, expectedResult); + assert.deepEqual(target, expectedTarget); +}); + +// shortcut interface (item, callback) +// works for object as well as for the arrays +function asyncJob(item, cb) +{ + target.push(item); + + // it will be automatically made async + // even it iterator "returns" in the same event loop + cb(null, item * 2); +} +``` + +More examples could be found in [test/test-serial-object.js](test/test-serial-object.js). + +_Note: Since _object_ is an _unordered_ collection of properties, +it may produce unexpected results with sequential iterations. +Whenever order of the jobs' execution is important please use `serialOrdered` method._ + +### Ordered Serial Iterations + +TBD + +For example [compare-property](compare-property) package. + +### Streaming interface + +TBD + +## Want to Know More? + +More examples can be found in [test folder](test/). + +Or open an [issue](https://github.com/alexindigo/asynckit/issues) with questions and/or suggestions. + +## License + +AsyncKit is licensed under the MIT license. diff --git a/node/node_modules/asynckit/bench.js b/node/node_modules/asynckit/bench.js new file mode 100644 index 0000000..c612f1a --- /dev/null +++ b/node/node_modules/asynckit/bench.js @@ -0,0 +1,76 @@ +/* eslint no-console: "off" */ + +var asynckit = require('./') + , async = require('async') + , assert = require('assert') + , expected = 0 + ; + +var Benchmark = require('benchmark'); +var suite = new Benchmark.Suite; + +var source = []; +for (var z = 1; z < 100; z++) +{ + source.push(z); + expected += z; +} + +suite +// add tests + +.add('async.map', function(deferred) +{ + var total = 0; + + async.map(source, + function(i, cb) + { + setImmediate(function() + { + total += i; + cb(null, total); + }); + }, + function(err, result) + { + assert.ifError(err); + assert.equal(result[result.length - 1], expected); + deferred.resolve(); + }); +}, {'defer': true}) + + +.add('asynckit.parallel', function(deferred) +{ + var total = 0; + + asynckit.parallel(source, + function(i, cb) + { + setImmediate(function() + { + total += i; + cb(null, total); + }); + }, + function(err, result) + { + assert.ifError(err); + assert.equal(result[result.length - 1], expected); + deferred.resolve(); + }); +}, {'defer': true}) + + +// add listeners +.on('cycle', function(ev) +{ + console.log(String(ev.target)); +}) +.on('complete', function() +{ + console.log('Fastest is ' + this.filter('fastest').map('name')); +}) +// run async +.run({ 'async': true }); diff --git a/node/node_modules/asynckit/index.js b/node/node_modules/asynckit/index.js new file mode 100644 index 0000000..455f945 --- /dev/null +++ b/node/node_modules/asynckit/index.js @@ -0,0 +1,6 @@ +module.exports = +{ + parallel : require('./parallel.js'), + serial : require('./serial.js'), + serialOrdered : require('./serialOrdered.js') +}; diff --git a/node/node_modules/asynckit/lib/abort.js b/node/node_modules/asynckit/lib/abort.js new file mode 100644 index 0000000..114367e --- /dev/null +++ b/node/node_modules/asynckit/lib/abort.js @@ -0,0 +1,29 @@ +// API +module.exports = abort; + +/** + * Aborts leftover active jobs + * + * @param {object} state - current state object + */ +function abort(state) +{ + Object.keys(state.jobs).forEach(clean.bind(state)); + + // reset leftover jobs + state.jobs = {}; +} + +/** + * Cleans up leftover job by invoking abort function for the provided job id + * + * @this state + * @param {string|number} key - job id to abort + */ +function clean(key) +{ + if (typeof this.jobs[key] == 'function') + { + this.jobs[key](); + } +} diff --git a/node/node_modules/asynckit/lib/async.js b/node/node_modules/asynckit/lib/async.js new file mode 100644 index 0000000..7f1288a --- /dev/null +++ b/node/node_modules/asynckit/lib/async.js @@ -0,0 +1,34 @@ +var defer = require('./defer.js'); + +// API +module.exports = async; + +/** + * Runs provided callback asynchronously + * even if callback itself is not + * + * @param {function} callback - callback to invoke + * @returns {function} - augmented callback + */ +function async(callback) +{ + var isAsync = false; + + // check if async happened + defer(function() { isAsync = true; }); + + return function async_callback(err, result) + { + if (isAsync) + { + callback(err, result); + } + else + { + defer(function nextTick_callback() + { + callback(err, result); + }); + } + }; +} diff --git a/node/node_modules/asynckit/lib/defer.js b/node/node_modules/asynckit/lib/defer.js new file mode 100644 index 0000000..b67110c --- /dev/null +++ b/node/node_modules/asynckit/lib/defer.js @@ -0,0 +1,26 @@ +module.exports = defer; + +/** + * Runs provided function on next iteration of the event loop + * + * @param {function} fn - function to run + */ +function defer(fn) +{ + var nextTick = typeof setImmediate == 'function' + ? setImmediate + : ( + typeof process == 'object' && typeof process.nextTick == 'function' + ? process.nextTick + : null + ); + + if (nextTick) + { + nextTick(fn); + } + else + { + setTimeout(fn, 0); + } +} diff --git a/node/node_modules/asynckit/lib/iterate.js b/node/node_modules/asynckit/lib/iterate.js new file mode 100644 index 0000000..5d2839a --- /dev/null +++ b/node/node_modules/asynckit/lib/iterate.js @@ -0,0 +1,75 @@ +var async = require('./async.js') + , abort = require('./abort.js') + ; + +// API +module.exports = iterate; + +/** + * Iterates over each job object + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {object} state - current job status + * @param {function} callback - invoked when all elements processed + */ +function iterate(list, iterator, state, callback) +{ + // store current index + var key = state['keyedList'] ? state['keyedList'][state.index] : state.index; + + state.jobs[key] = runJob(iterator, key, list[key], function(error, output) + { + // don't repeat yourself + // skip secondary callbacks + if (!(key in state.jobs)) + { + return; + } + + // clean up jobs + delete state.jobs[key]; + + if (error) + { + // don't process rest of the results + // stop still active jobs + // and reset the list + abort(state); + } + else + { + state.results[key] = output; + } + + // return salvaged results + callback(error, state.results); + }); +} + +/** + * Runs iterator over provided job element + * + * @param {function} iterator - iterator to invoke + * @param {string|number} key - key/index of the element in the list of jobs + * @param {mixed} item - job description + * @param {function} callback - invoked after iterator is done with the job + * @returns {function|mixed} - job abort function or something else + */ +function runJob(iterator, key, item, callback) +{ + var aborter; + + // allow shortcut if iterator expects only two arguments + if (iterator.length == 2) + { + aborter = iterator(item, async(callback)); + } + // otherwise go with full three arguments + else + { + aborter = iterator(item, key, async(callback)); + } + + return aborter; +} diff --git a/node/node_modules/asynckit/lib/readable_asynckit.js b/node/node_modules/asynckit/lib/readable_asynckit.js new file mode 100644 index 0000000..78ad240 --- /dev/null +++ b/node/node_modules/asynckit/lib/readable_asynckit.js @@ -0,0 +1,91 @@ +var streamify = require('./streamify.js') + , defer = require('./defer.js') + ; + +// API +module.exports = ReadableAsyncKit; + +/** + * Base constructor for all streams + * used to hold properties/methods + */ +function ReadableAsyncKit() +{ + ReadableAsyncKit.super_.apply(this, arguments); + + // list of active jobs + this.jobs = {}; + + // add stream methods + this.destroy = destroy; + this._start = _start; + this._read = _read; +} + +/** + * Destroys readable stream, + * by aborting outstanding jobs + * + * @returns {void} + */ +function destroy() +{ + if (this.destroyed) + { + return; + } + + this.destroyed = true; + + if (typeof this.terminator == 'function') + { + this.terminator(); + } +} + +/** + * Starts provided jobs in async manner + * + * @private + */ +function _start() +{ + // first argument – runner function + var runner = arguments[0] + // take away first argument + , args = Array.prototype.slice.call(arguments, 1) + // second argument - input data + , input = args[0] + // last argument - result callback + , endCb = streamify.callback.call(this, args[args.length - 1]) + ; + + args[args.length - 1] = endCb; + // third argument - iterator + args[1] = streamify.iterator.call(this, args[1]); + + // allow time for proper setup + defer(function() + { + if (!this.destroyed) + { + this.terminator = runner.apply(null, args); + } + else + { + endCb(null, Array.isArray(input) ? [] : {}); + } + }.bind(this)); +} + + +/** + * Implement _read to comply with Readable streams + * Doesn't really make sense for flowing object mode + * + * @private + */ +function _read() +{ + +} diff --git a/node/node_modules/asynckit/lib/readable_parallel.js b/node/node_modules/asynckit/lib/readable_parallel.js new file mode 100644 index 0000000..5d2929f --- /dev/null +++ b/node/node_modules/asynckit/lib/readable_parallel.js @@ -0,0 +1,25 @@ +var parallel = require('../parallel.js'); + +// API +module.exports = ReadableParallel; + +/** + * Streaming wrapper to `asynckit.parallel` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableParallel(list, iterator, callback) +{ + if (!(this instanceof ReadableParallel)) + { + return new ReadableParallel(list, iterator, callback); + } + + // turn on object mode + ReadableParallel.super_.call(this, {objectMode: true}); + + this._start(parallel, list, iterator, callback); +} diff --git a/node/node_modules/asynckit/lib/readable_serial.js b/node/node_modules/asynckit/lib/readable_serial.js new file mode 100644 index 0000000..7822698 --- /dev/null +++ b/node/node_modules/asynckit/lib/readable_serial.js @@ -0,0 +1,25 @@ +var serial = require('../serial.js'); + +// API +module.exports = ReadableSerial; + +/** + * Streaming wrapper to `asynckit.serial` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableSerial(list, iterator, callback) +{ + if (!(this instanceof ReadableSerial)) + { + return new ReadableSerial(list, iterator, callback); + } + + // turn on object mode + ReadableSerial.super_.call(this, {objectMode: true}); + + this._start(serial, list, iterator, callback); +} diff --git a/node/node_modules/asynckit/lib/readable_serial_ordered.js b/node/node_modules/asynckit/lib/readable_serial_ordered.js new file mode 100644 index 0000000..3de89c4 --- /dev/null +++ b/node/node_modules/asynckit/lib/readable_serial_ordered.js @@ -0,0 +1,29 @@ +var serialOrdered = require('../serialOrdered.js'); + +// API +module.exports = ReadableSerialOrdered; +// expose sort helpers +module.exports.ascending = serialOrdered.ascending; +module.exports.descending = serialOrdered.descending; + +/** + * Streaming wrapper to `asynckit.serialOrdered` + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} sortMethod - custom sort function + * @param {function} callback - invoked when all elements processed + * @returns {stream.Readable#} + */ +function ReadableSerialOrdered(list, iterator, sortMethod, callback) +{ + if (!(this instanceof ReadableSerialOrdered)) + { + return new ReadableSerialOrdered(list, iterator, sortMethod, callback); + } + + // turn on object mode + ReadableSerialOrdered.super_.call(this, {objectMode: true}); + + this._start(serialOrdered, list, iterator, sortMethod, callback); +} diff --git a/node/node_modules/asynckit/lib/state.js b/node/node_modules/asynckit/lib/state.js new file mode 100644 index 0000000..cbea7ad --- /dev/null +++ b/node/node_modules/asynckit/lib/state.js @@ -0,0 +1,37 @@ +// API +module.exports = state; + +/** + * Creates initial state object + * for iteration over list + * + * @param {array|object} list - list to iterate over + * @param {function|null} sortMethod - function to use for keys sort, + * or `null` to keep them as is + * @returns {object} - initial state object + */ +function state(list, sortMethod) +{ + var isNamedList = !Array.isArray(list) + , initState = + { + index : 0, + keyedList: isNamedList || sortMethod ? Object.keys(list) : null, + jobs : {}, + results : isNamedList ? {} : [], + size : isNamedList ? Object.keys(list).length : list.length + } + ; + + if (sortMethod) + { + // sort array keys based on it's values + // sort object's keys just on own merit + initState.keyedList.sort(isNamedList ? sortMethod : function(a, b) + { + return sortMethod(list[a], list[b]); + }); + } + + return initState; +} diff --git a/node/node_modules/asynckit/lib/streamify.js b/node/node_modules/asynckit/lib/streamify.js new file mode 100644 index 0000000..f56a1c9 --- /dev/null +++ b/node/node_modules/asynckit/lib/streamify.js @@ -0,0 +1,141 @@ +var async = require('./async.js'); + +// API +module.exports = { + iterator: wrapIterator, + callback: wrapCallback +}; + +/** + * Wraps iterators with long signature + * + * @this ReadableAsyncKit# + * @param {function} iterator - function to wrap + * @returns {function} - wrapped function + */ +function wrapIterator(iterator) +{ + var stream = this; + + return function(item, key, cb) + { + var aborter + , wrappedCb = async(wrapIteratorCallback.call(stream, cb, key)) + ; + + stream.jobs[key] = wrappedCb; + + // it's either shortcut (item, cb) + if (iterator.length == 2) + { + aborter = iterator(item, wrappedCb); + } + // or long format (item, key, cb) + else + { + aborter = iterator(item, key, wrappedCb); + } + + return aborter; + }; +} + +/** + * Wraps provided callback function + * allowing to execute snitch function before + * real callback + * + * @this ReadableAsyncKit# + * @param {function} callback - function to wrap + * @returns {function} - wrapped function + */ +function wrapCallback(callback) +{ + var stream = this; + + var wrapped = function(error, result) + { + return finisher.call(stream, error, result, callback); + }; + + return wrapped; +} + +/** + * Wraps provided iterator callback function + * makes sure snitch only called once, + * but passes secondary calls to the original callback + * + * @this ReadableAsyncKit# + * @param {function} callback - callback to wrap + * @param {number|string} key - iteration key + * @returns {function} wrapped callback + */ +function wrapIteratorCallback(callback, key) +{ + var stream = this; + + return function(error, output) + { + // don't repeat yourself + if (!(key in stream.jobs)) + { + callback(error, output); + return; + } + + // clean up jobs + delete stream.jobs[key]; + + return streamer.call(stream, error, {key: key, value: output}, callback); + }; +} + +/** + * Stream wrapper for iterator callback + * + * @this ReadableAsyncKit# + * @param {mixed} error - error response + * @param {mixed} output - iterator output + * @param {function} callback - callback that expects iterator results + */ +function streamer(error, output, callback) +{ + if (error && !this.error) + { + this.error = error; + this.pause(); + this.emit('error', error); + // send back value only, as expected + callback(error, output && output.value); + return; + } + + // stream stuff + this.push(output); + + // back to original track + // send back value only, as expected + callback(error, output && output.value); +} + +/** + * Stream wrapper for finishing callback + * + * @this ReadableAsyncKit# + * @param {mixed} error - error response + * @param {mixed} output - iterator output + * @param {function} callback - callback that expects final results + */ +function finisher(error, output, callback) +{ + // signal end of the stream + // only for successfully finished streams + if (!error) + { + this.push(null); + } + + // back to original track + callback(error, output); +} diff --git a/node/node_modules/asynckit/lib/terminator.js b/node/node_modules/asynckit/lib/terminator.js new file mode 100644 index 0000000..d6eb992 --- /dev/null +++ b/node/node_modules/asynckit/lib/terminator.js @@ -0,0 +1,29 @@ +var abort = require('./abort.js') + , async = require('./async.js') + ; + +// API +module.exports = terminator; + +/** + * Terminates jobs in the attached state context + * + * @this AsyncKitState# + * @param {function} callback - final callback to invoke after termination + */ +function terminator(callback) +{ + if (!Object.keys(this.jobs).length) + { + return; + } + + // fast forward iteration index + this.index = this.size; + + // abort jobs + abort(this); + + // send back results we have so far + async(callback)(null, this.results); +} diff --git a/node/node_modules/asynckit/package.json b/node/node_modules/asynckit/package.json new file mode 100644 index 0000000..51147d6 --- /dev/null +++ b/node/node_modules/asynckit/package.json @@ -0,0 +1,63 @@ +{ + "name": "asynckit", + "version": "0.4.0", + "description": "Minimal async jobs utility library, with streams support", + "main": "index.js", + "scripts": { + "clean": "rimraf coverage", + "lint": "eslint *.js lib/*.js test/*.js", + "test": "istanbul cover --reporter=json tape -- 'test/test-*.js' | tap-spec", + "win-test": "tape test/test-*.js", + "browser": "browserify -t browserify-istanbul test/lib/browserify_adjustment.js test/test-*.js | obake --coverage | tap-spec", + "report": "istanbul report", + "size": "browserify index.js | size-table asynckit", + "debug": "tape test/test-*.js" + }, + "pre-commit": [ + "clean", + "lint", + "test", + "browser", + "report", + "size" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/alexindigo/asynckit.git" + }, + "keywords": [ + "async", + "jobs", + "parallel", + "serial", + "iterator", + "array", + "object", + "stream", + "destroy", + "terminate", + "abort" + ], + "author": "Alex Indigo ", + "license": "MIT", + "bugs": { + "url": "https://github.com/alexindigo/asynckit/issues" + }, + "homepage": "https://github.com/alexindigo/asynckit#readme", + "devDependencies": { + "browserify": "^13.0.0", + "browserify-istanbul": "^2.0.0", + "coveralls": "^2.11.9", + "eslint": "^2.9.0", + "istanbul": "^0.4.3", + "obake": "^0.1.2", + "phantomjs-prebuilt": "^2.1.7", + "pre-commit": "^1.1.3", + "reamde": "^1.1.0", + "rimraf": "^2.5.2", + "size-table": "^0.2.0", + "tap-spec": "^4.1.1", + "tape": "^4.5.1" + }, + "dependencies": {} +} diff --git a/node/node_modules/asynckit/parallel.js b/node/node_modules/asynckit/parallel.js new file mode 100644 index 0000000..3c50344 --- /dev/null +++ b/node/node_modules/asynckit/parallel.js @@ -0,0 +1,43 @@ +var iterate = require('./lib/iterate.js') + , initState = require('./lib/state.js') + , terminator = require('./lib/terminator.js') + ; + +// Public API +module.exports = parallel; + +/** + * Runs iterator over provided array elements in parallel + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function parallel(list, iterator, callback) +{ + var state = initState(list); + + while (state.index < (state['keyedList'] || list).length) + { + iterate(list, iterator, state, function(error, result) + { + if (error) + { + callback(error, result); + return; + } + + // looks like it's the last one + if (Object.keys(state.jobs).length === 0) + { + callback(null, state.results); + return; + } + }); + + state.index++; + } + + return terminator.bind(state, callback); +} diff --git a/node/node_modules/asynckit/serial.js b/node/node_modules/asynckit/serial.js new file mode 100644 index 0000000..6cd949a --- /dev/null +++ b/node/node_modules/asynckit/serial.js @@ -0,0 +1,17 @@ +var serialOrdered = require('./serialOrdered.js'); + +// Public API +module.exports = serial; + +/** + * Runs iterator over provided array elements in series + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function serial(list, iterator, callback) +{ + return serialOrdered(list, iterator, null, callback); +} diff --git a/node/node_modules/asynckit/serialOrdered.js b/node/node_modules/asynckit/serialOrdered.js new file mode 100644 index 0000000..607eafe --- /dev/null +++ b/node/node_modules/asynckit/serialOrdered.js @@ -0,0 +1,75 @@ +var iterate = require('./lib/iterate.js') + , initState = require('./lib/state.js') + , terminator = require('./lib/terminator.js') + ; + +// Public API +module.exports = serialOrdered; +// sorting helpers +module.exports.ascending = ascending; +module.exports.descending = descending; + +/** + * Runs iterator over provided sorted array elements in series + * + * @param {array|object} list - array or object (named list) to iterate over + * @param {function} iterator - iterator to run + * @param {function} sortMethod - custom sort function + * @param {function} callback - invoked when all elements processed + * @returns {function} - jobs terminator + */ +function serialOrdered(list, iterator, sortMethod, callback) +{ + var state = initState(list, sortMethod); + + iterate(list, iterator, state, function iteratorHandler(error, result) + { + if (error) + { + callback(error, result); + return; + } + + state.index++; + + // are we there yet? + if (state.index < (state['keyedList'] || list).length) + { + iterate(list, iterator, state, iteratorHandler); + return; + } + + // done here + callback(null, state.results); + }); + + return terminator.bind(state, callback); +} + +/* + * -- Sort methods + */ + +/** + * sort helper to sort array elements in ascending order + * + * @param {mixed} a - an item to compare + * @param {mixed} b - an item to compare + * @returns {number} - comparison result + */ +function ascending(a, b) +{ + return a < b ? -1 : a > b ? 1 : 0; +} + +/** + * sort helper to sort array elements in descending order + * + * @param {mixed} a - an item to compare + * @param {mixed} b - an item to compare + * @returns {number} - comparison result + */ +function descending(a, b) +{ + return -1 * ascending(a, b); +} diff --git a/node/node_modules/asynckit/stream.js b/node/node_modules/asynckit/stream.js new file mode 100644 index 0000000..d43465f --- /dev/null +++ b/node/node_modules/asynckit/stream.js @@ -0,0 +1,21 @@ +var inherits = require('util').inherits + , Readable = require('stream').Readable + , ReadableAsyncKit = require('./lib/readable_asynckit.js') + , ReadableParallel = require('./lib/readable_parallel.js') + , ReadableSerial = require('./lib/readable_serial.js') + , ReadableSerialOrdered = require('./lib/readable_serial_ordered.js') + ; + +// API +module.exports = +{ + parallel : ReadableParallel, + serial : ReadableSerial, + serialOrdered : ReadableSerialOrdered, +}; + +inherits(ReadableAsyncKit, Readable); + +inherits(ReadableParallel, ReadableAsyncKit); +inherits(ReadableSerial, ReadableAsyncKit); +inherits(ReadableSerialOrdered, ReadableAsyncKit); diff --git a/node/node_modules/bignumber.js/CHANGELOG.md b/node/node_modules/bignumber.js/CHANGELOG.md new file mode 100644 index 0000000..9586720 --- /dev/null +++ b/node/node_modules/bignumber.js/CHANGELOG.md @@ -0,0 +1,295 @@ +#### 9.1.2 +* 28/08/23 +* #354 Amend `round` to avoid bug in v8 Maglev compiler. +* [BUGFIX] #344 `minumum(0, -0)` should be `-0`. + +#### 9.1.1 +* 04/12/22 +* #338 [BUGFIX] `exponentiatedBy`: ensure `0**-n === Infinity` for very large `n`. + +#### 9.1.0 +* 08/08/22 +* #329 Remove `import` example. +* #277 Resolve lint warnings and add number `toString` note. +* Correct `decimalPlaces()` return type in *bignumber.d.ts*. +* Add ES module global `crypto` example. +* #322 Add `exports` field to *package.json*. +* #251 (#308) Amend *bignumber.d.ts* to allow instantiating a BigNumber without `new`. + +#### 9.0.2 +* 12/12/21 +* #250 [BUGFIX] Allow use of user-defined alphabet for base 10. +* #295 Remove *bignumber.min.js* and amend *README.md*. +* Update *.travis.yml* and *LICENCE.md*. + +#### 9.0.1 +* 28/09/20 +* [BUGFIX] #276 Correct `sqrt` initial estimate. +* Update *.travis.yml*, *LICENCE.md* and *README.md*. + +#### 9.0.0 +* 27/05/2019 +* For compatibility with legacy browsers, remove `Symbol` references. + +#### 8.1.1 +* 24/02/2019 +* [BUGFIX] #222 Restore missing `var` to `export BigNumber`. +* Allow any key in BigNumber.Instance in *bignumber.d.ts*. + +#### 8.1.0 +* 23/02/2019 +* [NEW FEATURE] #220 Create a BigNumber using `{s, e, c}`. +* [NEW FEATURE] `isBigNumber`: if `BigNumber.DEBUG` is `true`, also check that the BigNumber instance is well-formed. +* Remove `instanceof` checks; just use `_isBigNumber` to identify a BigNumber instance. +* Add `_isBigNumber` to prototype in *bignumber.mjs*. +* Add tests for BigNumber creation from object. +* Update *API.html*. + +#### 8.0.2 +* 13/01/2019 +* #209 `toPrecision` without argument should follow `toString`. +* Improve *Use* section of *README*. +* Optimise `toString(10)`. +* Add verson number to API doc. + +#### 8.0.1 +* 01/11/2018 +* Rest parameter must be array type in *bignumber.d.ts*. + +#### 8.0.0 +* 01/11/2018 +* [NEW FEATURE] Add `BigNumber.sum` method. +* [NEW FEATURE]`toFormat`: add `prefix` and `suffix` options. +* [NEW FEATURE] #178 Pass custom formatting to `toFormat`. +* [BREAKING CHANGE] #184 `toFraction`: return array of BigNumbers not strings. +* [NEW FEATURE] #185 Enable overwrite of `valueOf` to prevent accidental addition to string. +* #183 Add Node.js `crypto` requirement to documentation. +* [BREAKING CHANGE] #198 Disallow signs and whitespace in custom alphabet. +* [NEW FEATURE] #188 Implement `util.inspect.custom` for Node.js REPL. +* #170 Make `isBigNumber` a type guard in *bignumber.d.ts*. +* [BREAKING CHANGE] `BigNumber.min` and `BigNumber.max`: don't accept an array. +* Update *.travis.yml*. +* Remove *bower.json*. + +#### 7.2.1 +* 24/05/2018 +* Add `browser` field to *package.json*. + +#### 7.2.0 +* 22/05/2018 +* #166 Correct *.mjs* file. Remove extension from `main` field in *package.json*. + +#### 7.1.0 +* 18/05/2018 +* Add `module` field to *package.json* for *bignumber.mjs*. + +#### 7.0.2 +* 17/05/2018 +* #165 Bugfix: upper-case letters for bases 11-36 in a custom alphabet. +* Add note to *README* regarding creating BigNumbers from Number values. + +#### 7.0.1 +* 26/04/2018 +* #158 Fix global object variable name typo. + +#### 7.0.0 +* 26/04/2018 +* #143 Remove global BigNumber from typings. +* #144 Enable compatibility with `Object.freeze(Object.prototype)`. +* #148 #123 #11 Only throw on a number primitive with more than 15 significant digits if `BigNumber.DEBUG` is `true`. +* Only throw on an invalid BigNumber value if `BigNumber.DEBUG` is `true`. Return BigNumber `NaN` instead. +* #154 `exponentiatedBy`: allow BigNumber exponent. +* #156 Prevent Content Security Policy *unsafe-eval* issue. +* `toFraction`: allow `Infinity` maximum denominator. +* Comment-out some excess tests to reduce test time. +* Amend indentation and other spacing. + +#### 6.0.0 +* 26/01/2018 +* #137 Implement `APLHABET` configuration option. +* Remove `ERRORS` configuration option. +* Remove `toDigits` method; extend `precision` method accordingly. +* Remove s`round` method; extend `decimalPlaces` method accordingly. +* Remove methods: `ceil`, `floor`, and `truncated`. +* Remove method aliases: `add`, `cmp`, `isInt`, `isNeg`, `trunc`, `mul`, `neg` and `sub`. +* Rename methods: `shift` to `shiftedBy`, `another` to `clone`, `toPower` to `exponentiatedBy`, and `equals` to `isEqualTo`. +* Rename methods: add `is` prefix to `greaterThan`, `greaterThanOrEqualTo`, `lessThan` and `lessThanOrEqualTo`. +* Add methods: `multipliedBy`, `isBigNumber`, `isPositive`, `integerValue`, `maximum` and `minimum`. +* Refactor test suite. +* Add *CHANGELOG.md*. +* Rewrite *bignumber.d.ts*. +* Redo API image. + +#### 5.0.0 +* 27/11/2017 +* #81 Don't throw on constructor call without `new`. + +#### 4.1.0 +* 26/09/2017 +* Remove node 0.6 from *.travis.yml*. +* Add *bignumber.mjs*. + +#### 4.0.4 +* 03/09/2017 +* Add missing aliases to *bignumber.d.ts*. + +#### 4.0.3 +* 30/08/2017 +* Add types: *bignumber.d.ts*. + +#### 4.0.2 +* 03/05/2017 +* #120 Workaround Safari/Webkit bug. + +#### 4.0.1 +* 05/04/2017 +* #121 BigNumber.default to BigNumber['default']. + +#### 4.0.0 +* 09/01/2017 +* Replace BigNumber.isBigNumber method with isBigNumber prototype property. + +#### 3.1.2 +* 08/01/2017 +* Minor documentation edit. + +#### 3.1.1 +* 08/01/2017 +* Uncomment `isBigNumber` tests. +* Ignore dot files. + +#### 3.1.0 +* 08/01/2017 +* Add `isBigNumber` method. + +#### 3.0.2 +* 08/01/2017 +* Bugfix: Possible incorrect value of `ERRORS` after a `BigNumber.another` call (due to `parseNumeric` declaration in outer scope). + +#### 3.0.1 +* 23/11/2016 +* Apply fix for old ipads with `%` issue, see #57 and #102. +* Correct error message. + +#### 3.0.0 +* 09/11/2016 +* Remove `require('crypto')` - leave it to the user. +* Add `BigNumber.set` as `BigNumber.config` alias. +* Default `POW_PRECISION` to `0`. + +#### 2.4.0 +* 14/07/2016 +* #97 Add exports to support ES6 imports. + +#### 2.3.0 +* 07/03/2016 +* #86 Add modulus parameter to `toPower`. + +#### 2.2.0 +* 03/03/2016 +* #91 Permit larger JS integers. + +#### 2.1.4 +* 15/12/2015 +* Correct UMD. + +#### 2.1.3 +* 13/12/2015 +* Refactor re global object and crypto availability when bundling. + +#### 2.1.2 +* 10/12/2015 +* Bugfix: `window.crypto` not assigned to `crypto`. + +#### 2.1.1 +* 09/12/2015 +* Prevent code bundler from adding `crypto` shim. + +#### 2.1.0 +* 26/10/2015 +* For `valueOf` and `toJSON`, include the minus sign with negative zero. + +#### 2.0.8 +* 2/10/2015 +* Internal round function bugfix. + +#### 2.0.6 +* 31/03/2015 +* Add bower.json. Tweak division after in-depth review. + +#### 2.0.5 +* 25/03/2015 +* Amend README. Remove bitcoin address. + +#### 2.0.4 +* 25/03/2015 +* Critical bugfix #58: division. + +#### 2.0.3 +* 18/02/2015 +* Amend README. Add source map. + +#### 2.0.2 +* 18/02/2015 +* Correct links. + +#### 2.0.1 +* 18/02/2015 +* Add `max`, `min`, `precision`, `random`, `shiftedBy`, `toDigits` and `truncated` methods. +* Add the short-forms: `add`, `mul`, `sd`, `sub` and `trunc`. +* Add an `another` method to enable multiple independent constructors to be created. +* Add support for the base 2, 8 and 16 prefixes `0b`, `0o` and `0x`. +* Enable a rounding mode to be specified as a second parameter to `toExponential`, `toFixed`, `toFormat` and `toPrecision`. +* Add a `CRYPTO` configuration property so cryptographically-secure pseudo-random number generation can be specified. +* Add a `MODULO_MODE` configuration property to enable the rounding mode used by the `modulo` operation to be specified. +* Add a `POW_PRECISION` configuration property to enable the number of significant digits calculated by the power operation to be limited. +* Improve code quality. +* Improve documentation. + +#### 2.0.0 +* 29/12/2014 +* Add `dividedToIntegerBy`, `isInteger` and `toFormat` methods. +* Remove the following short-forms: `isF`, `isZ`, `toE`, `toF`, `toFr`, `toN`, `toP`, `toS`. +* Store a BigNumber's coefficient in base 1e14, rather than base 10. +* Add fast path for integers to BigNumber constructor. +* Incorporate the library into the online documentation. + +#### 1.5.0 +* 13/11/2014 +* Add `toJSON` and `decimalPlaces` methods. + +#### 1.4.1 +* 08/06/2014 +* Amend README. + +#### 1.4.0 +* 08/05/2014 +* Add `toNumber`. + +#### 1.3.0 +* 08/11/2013 +* Ensure correct rounding of `sqrt` in all, rather than almost all, cases. +* Maximum radix to 64. + +#### 1.2.1 +* 17/10/2013 +* Sign of zero when x < 0 and x + (-x) = 0. + +#### 1.2.0 +* 19/9/2013 +* Throw Error objects for stack. + +#### 1.1.1 +* 22/8/2013 +* Show original value in constructor error message. + +#### 1.1.0 +* 1/8/2013 +* Allow numbers with trailing radix point. + +#### 1.0.1 +* Bugfix: error messages with incorrect method name + +#### 1.0.0 +* 8/11/2012 +* Initial release diff --git a/node/node_modules/bignumber.js/LICENCE.md b/node/node_modules/bignumber.js/LICENCE.md new file mode 100644 index 0000000..3c2f6a3 --- /dev/null +++ b/node/node_modules/bignumber.js/LICENCE.md @@ -0,0 +1,26 @@ +The MIT License (MIT) +===================== + +Copyright © `<2023>` `Michael Mclaughlin` + +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. + diff --git a/node/node_modules/bignumber.js/README.md b/node/node_modules/bignumber.js/README.md new file mode 100644 index 0000000..4785443 --- /dev/null +++ b/node/node_modules/bignumber.js/README.md @@ -0,0 +1,286 @@ +![bignumber.js](https://raw.githubusercontent.com/MikeMcl/bignumber.js/gh-pages/bignumberjs.png) + +A JavaScript library for arbitrary-precision decimal and non-decimal arithmetic. + +[![npm version](https://img.shields.io/npm/v/bignumber.js.svg)](https://www.npmjs.com/package/bignumber.js) +[![npm downloads](https://img.shields.io/npm/dw/bignumber.js)](https://www.npmjs.com/package/bignumber.js) + +
+ +## Features + +- Integers and decimals +- Simple API but full-featured +- Faster, smaller, and perhaps easier to use than JavaScript versions of Java's BigDecimal +- 8 KB minified and gzipped +- Replicates the `toExponential`, `toFixed`, `toPrecision` and `toString` methods of JavaScript's Number type +- Includes a `toFraction` and a correctly-rounded `squareRoot` method +- Supports cryptographically-secure pseudo-random number generation +- No dependencies +- Wide platform compatibility: uses JavaScript 1.5 (ECMAScript 3) features only +- Comprehensive [documentation](http://mikemcl.github.io/bignumber.js/) and test set + +![API](https://raw.githubusercontent.com/MikeMcl/bignumber.js/gh-pages/API.png) + +If a smaller and simpler library is required see [big.js](https://github.com/MikeMcl/big.js/). +It's less than half the size but only works with decimal numbers and only has half the methods. +It also has fewer configuration options than this library, and does not allow `NaN` or `Infinity`. + +See also [decimal.js](https://github.com/MikeMcl/decimal.js/), which among other things adds support for non-integer powers, and performs all operations to a specified number of significant digits. + +## Load + +The library is the single JavaScript file *bignumber.js* or ES module *bignumber.mjs*. + +### Browser + +```html + +``` + +> ES module + +```html + +``` + +### [Node.js](http://nodejs.org) + +```bash +npm install bignumber.js +``` + +```javascript +const BigNumber = require('bignumber.js'); +``` + +> ES module + +```javascript +import BigNumber from "bignumber.js"; +import { BigNumber } from "./node_modules/bignumber.js/bignumber.mjs"; +``` + +### [Deno](https://deno.land/) + +```javascript +import BigNumber from 'https://raw.githubusercontent.com/mikemcl/bignumber.js/v9.1.2/bignumber.mjs'; +import BigNumber from 'https://unpkg.com/bignumber.js@latest/bignumber.mjs'; +``` + +## Use + +The library exports a single constructor function, [`BigNumber`](http://mikemcl.github.io/bignumber.js/#bignumber), which accepts a value of type Number, String or BigNumber, + +```javascript +let x = new BigNumber(123.4567); +let y = BigNumber('123456.7e-3'); +let z = new BigNumber(x); +x.isEqualTo(y) && y.isEqualTo(z) && x.isEqualTo(z); // true +``` + +To get the string value of a BigNumber use [`toString()`](http://mikemcl.github.io/bignumber.js/#toS) or [`toFixed()`](http://mikemcl.github.io/bignumber.js/#toFix). Using `toFixed()` prevents exponential notation being returned, no matter how large or small the value. + +```javascript +let x = new BigNumber('1111222233334444555566'); +x.toString(); // "1.111222233334444555566e+21" +x.toFixed(); // "1111222233334444555566" +``` + +If the limited precision of Number values is not well understood, it is recommended to create BigNumbers from String values rather than Number values to avoid a potential loss of precision. + +*In all further examples below, `let`, semicolons and `toString` calls are not shown. If a commented-out value is in quotes it means `toString` has been called on the preceding expression.* + +```javascript +// Precision loss from using numeric literals with more than 15 significant digits. +new BigNumber(1.0000000000000001) // '1' +new BigNumber(88259496234518.57) // '88259496234518.56' +new BigNumber(99999999999999999999) // '100000000000000000000' + +// Precision loss from using numeric literals outside the range of Number values. +new BigNumber(2e+308) // 'Infinity' +new BigNumber(1e-324) // '0' + +// Precision loss from the unexpected result of arithmetic with Number values. +new BigNumber(0.7 + 0.1) // '0.7999999999999999' +``` + +When creating a BigNumber from a Number, note that a BigNumber is created from a Number's decimal `toString()` value not from its underlying binary value. If the latter is required, then pass the Number's `toString(2)` value and specify base 2. + +```javascript +new BigNumber(Number.MAX_VALUE.toString(2), 2) +``` + +BigNumbers can be created from values in bases from 2 to 36. See [`ALPHABET`](http://mikemcl.github.io/bignumber.js/#alphabet) to extend this range. + +```javascript +a = new BigNumber(1011, 2) // "11" +b = new BigNumber('zz.9', 36) // "1295.25" +c = a.plus(b) // "1306.25" +``` + +*Performance is better if base 10 is NOT specified for decimal values. Only specify base 10 when you want to limit the number of decimal places of the input value to the current [`DECIMAL_PLACES`](http://mikemcl.github.io/bignumber.js/#decimal-places) setting.* + +A BigNumber is immutable in the sense that it is not changed by its methods. + +```javascript +0.3 - 0.1 // 0.19999999999999998 +x = new BigNumber(0.3) +x.minus(0.1) // "0.2" +x // "0.3" +``` + +The methods that return a BigNumber can be chained. + +```javascript +x.dividedBy(y).plus(z).times(9) +x.times('1.23456780123456789e+9').plus(9876.5432321).dividedBy('4444562598.111772').integerValue() +``` + +Some of the longer method names have a shorter alias. + +```javascript +x.squareRoot().dividedBy(y).exponentiatedBy(3).isEqualTo(x.sqrt().div(y).pow(3)) // true +x.modulo(y).multipliedBy(z).eq(x.mod(y).times(z)) // true +``` + +As with JavaScript's Number type, there are [`toExponential`](http://mikemcl.github.io/bignumber.js/#toE), [`toFixed`](http://mikemcl.github.io/bignumber.js/#toFix) and [`toPrecision`](http://mikemcl.github.io/bignumber.js/#toP) methods. + +```javascript +x = new BigNumber(255.5) +x.toExponential(5) // "2.55500e+2" +x.toFixed(5) // "255.50000" +x.toPrecision(5) // "255.50" +x.toNumber() // 255.5 +``` + + A base can be specified for [`toString`](http://mikemcl.github.io/bignumber.js/#toS). + +*Performance is better if base 10 is NOT specified, i.e. use `toString()` not `toString(10)`. Only specify base 10 when you want to limit the number of decimal places of the string to the current [`DECIMAL_PLACES`](http://mikemcl.github.io/bignumber.js/#decimal-places) setting.* + + ```javascript + x.toString(16) // "ff.8" + ``` + +There is a [`toFormat`](http://mikemcl.github.io/bignumber.js/#toFor) method which may be useful for internationalisation. + +```javascript +y = new BigNumber('1234567.898765') +y.toFormat(2) // "1,234,567.90" +``` + +The maximum number of decimal places of the result of an operation involving division (i.e. a division, square root, base conversion or negative power operation) is set using the `set` or `config` method of the `BigNumber` constructor. + +The other arithmetic operations always give the exact result. + +```javascript +BigNumber.set({ DECIMAL_PLACES: 10, ROUNDING_MODE: 4 }) + +x = new BigNumber(2) +y = new BigNumber(3) +z = x.dividedBy(y) // "0.6666666667" +z.squareRoot() // "0.8164965809" +z.exponentiatedBy(-3) // "3.3749999995" +z.toString(2) // "0.1010101011" +z.multipliedBy(z) // "0.44444444448888888889" +z.multipliedBy(z).decimalPlaces(10) // "0.4444444445" +``` + +There is a [`toFraction`](http://mikemcl.github.io/bignumber.js/#toFr) method with an optional *maximum denominator* argument + +```javascript +y = new BigNumber(355) +pi = y.dividedBy(113) // "3.1415929204" +pi.toFraction() // [ "7853982301", "2500000000" ] +pi.toFraction(1000) // [ "355", "113" ] +``` + +and [`isNaN`](http://mikemcl.github.io/bignumber.js/#isNaN) and [`isFinite`](http://mikemcl.github.io/bignumber.js/#isF) methods, as `NaN` and `Infinity` are valid `BigNumber` values. + +```javascript +x = new BigNumber(NaN) // "NaN" +y = new BigNumber(Infinity) // "Infinity" +x.isNaN() && !y.isNaN() && !x.isFinite() && !y.isFinite() // true +``` + +The value of a BigNumber is stored in a decimal floating point format in terms of a coefficient, exponent and sign. + +```javascript +x = new BigNumber(-123.456); +x.c // [ 123, 45600000000000 ] coefficient (i.e. significand) +x.e // 2 exponent +x.s // -1 sign +``` + +For advanced usage, multiple BigNumber constructors can be created, each with its own independent configuration. + +```javascript +// Set DECIMAL_PLACES for the original BigNumber constructor +BigNumber.set({ DECIMAL_PLACES: 10 }) + +// Create another BigNumber constructor, optionally passing in a configuration object +BN = BigNumber.clone({ DECIMAL_PLACES: 5 }) + +x = new BigNumber(1) +y = new BN(1) + +x.div(3) // '0.3333333333' +y.div(3) // '0.33333' +``` + +To avoid having to call `toString` or `valueOf` on a BigNumber to get its value in the Node.js REPL or when using `console.log` use + +```javascript +BigNumber.prototype[require('util').inspect.custom] = BigNumber.prototype.valueOf; +``` + +For further information see the [API](http://mikemcl.github.io/bignumber.js/) reference in the *doc* directory. + +## Test + +The *test/modules* directory contains the test scripts for each method. + +The tests can be run with Node.js or a browser. For Node.js use + +```bash +npm test +``` + +or + +```bash +node test/test +``` + +To test a single method, use, for example + +```bash +node test/methods/toFraction +``` + +For the browser, open *test/test.html*. + +## Minify + +To minify using, for example, [terser](https://github.com/terser/terser) + +```bash +npm install -g terser +``` + +```bash +terser big.js -c -m -o big.min.js +``` + +## Licence + +The MIT Licence. + +See [LICENCE](https://github.com/MikeMcl/bignumber.js/blob/master/LICENCE). diff --git a/node/node_modules/bignumber.js/bignumber.d.ts b/node/node_modules/bignumber.js/bignumber.d.ts new file mode 100644 index 0000000..c5a60a8 --- /dev/null +++ b/node/node_modules/bignumber.js/bignumber.d.ts @@ -0,0 +1,1831 @@ +// Type definitions for bignumber.js >=8.1.0 +// Project: https://github.com/MikeMcl/bignumber.js +// Definitions by: Michael Mclaughlin +// Definitions: https://github.com/MikeMcl/bignumber.js + +// Documentation: http://mikemcl.github.io/bignumber.js/ +// +// Exports: +// +// class BigNumber (default export) +// type BigNumber.Constructor +// type BigNumber.ModuloMode +// type BigNumber.RoundingMode +// type BigNumber.Value +// interface BigNumber.Config +// interface BigNumber.Format +// interface BigNumber.Instance +// +// Example: +// +// import {BigNumber} from "bignumber.js" +// //import BigNumber from "bignumber.js" +// +// let rm: BigNumber.RoundingMode = BigNumber.ROUND_UP; +// let f: BigNumber.Format = { decimalSeparator: ',' }; +// let c: BigNumber.Config = { DECIMAL_PLACES: 4, ROUNDING_MODE: rm, FORMAT: f }; +// BigNumber.config(c); +// +// let v: BigNumber.Value = '12345.6789'; +// let b: BigNumber = new BigNumber(v); +// +// The use of compiler option `--strictNullChecks` is recommended. + +export default BigNumber; + +export namespace BigNumber { + + /** See `BigNumber.config` (alias `BigNumber.set`) and `BigNumber.clone`. */ + interface Config { + + /** + * An integer, 0 to 1e+9. Default value: 20. + * + * The maximum number of decimal places of the result of operations involving division, i.e. + * division, square root and base conversion operations, and exponentiation when the exponent is + * negative. + * + * ```ts + * BigNumber.config({ DECIMAL_PLACES: 5 }) + * BigNumber.set({ DECIMAL_PLACES: 5 }) + * ``` + */ + DECIMAL_PLACES?: number; + + /** + * An integer, 0 to 8. Default value: `BigNumber.ROUND_HALF_UP` (4). + * + * The rounding mode used in operations that involve division (see `DECIMAL_PLACES`) and the + * default rounding mode of the `decimalPlaces`, `precision`, `toExponential`, `toFixed`, + * `toFormat` and `toPrecision` methods. + * + * The modes are available as enumerated properties of the BigNumber constructor. + * + * ```ts + * BigNumber.config({ ROUNDING_MODE: 0 }) + * BigNumber.set({ ROUNDING_MODE: BigNumber.ROUND_UP }) + * ``` + */ + ROUNDING_MODE?: BigNumber.RoundingMode; + + /** + * An integer, 0 to 1e+9, or an array, [-1e+9 to 0, 0 to 1e+9]. + * Default value: `[-7, 20]`. + * + * The exponent value(s) at which `toString` returns exponential notation. + * + * If a single number is assigned, the value is the exponent magnitude. + * + * If an array of two numbers is assigned then the first number is the negative exponent value at + * and beneath which exponential notation is used, and the second number is the positive exponent + * value at and above which exponential notation is used. + * + * For example, to emulate JavaScript numbers in terms of the exponent values at which they begin + * to use exponential notation, use `[-7, 20]`. + * + * ```ts + * BigNumber.config({ EXPONENTIAL_AT: 2 }) + * new BigNumber(12.3) // '12.3' e is only 1 + * new BigNumber(123) // '1.23e+2' + * new BigNumber(0.123) // '0.123' e is only -1 + * new BigNumber(0.0123) // '1.23e-2' + * + * BigNumber.config({ EXPONENTIAL_AT: [-7, 20] }) + * new BigNumber(123456789) // '123456789' e is only 8 + * new BigNumber(0.000000123) // '1.23e-7' + * + * // Almost never return exponential notation: + * BigNumber.config({ EXPONENTIAL_AT: 1e+9 }) + * + * // Always return exponential notation: + * BigNumber.config({ EXPONENTIAL_AT: 0 }) + * ``` + * + * Regardless of the value of `EXPONENTIAL_AT`, the `toFixed` method will always return a value in + * normal notation and the `toExponential` method will always return a value in exponential form. + * Calling `toString` with a base argument, e.g. `toString(10)`, will also always return normal + * notation. + */ + EXPONENTIAL_AT?: number | [number, number]; + + /** + * An integer, magnitude 1 to 1e+9, or an array, [-1e+9 to -1, 1 to 1e+9]. + * Default value: `[-1e+9, 1e+9]`. + * + * The exponent value(s) beyond which overflow to Infinity and underflow to zero occurs. + * + * If a single number is assigned, it is the maximum exponent magnitude: values wth a positive + * exponent of greater magnitude become Infinity and those with a negative exponent of greater + * magnitude become zero. + * + * If an array of two numbers is assigned then the first number is the negative exponent limit and + * the second number is the positive exponent limit. + * + * For example, to emulate JavaScript numbers in terms of the exponent values at which they + * become zero and Infinity, use [-324, 308]. + * + * ```ts + * BigNumber.config({ RANGE: 500 }) + * BigNumber.config().RANGE // [ -500, 500 ] + * new BigNumber('9.999e499') // '9.999e+499' + * new BigNumber('1e500') // 'Infinity' + * new BigNumber('1e-499') // '1e-499' + * new BigNumber('1e-500') // '0' + * + * BigNumber.config({ RANGE: [-3, 4] }) + * new BigNumber(99999) // '99999' e is only 4 + * new BigNumber(100000) // 'Infinity' e is 5 + * new BigNumber(0.001) // '0.01' e is only -3 + * new BigNumber(0.0001) // '0' e is -4 + * ``` + * The largest possible magnitude of a finite BigNumber is 9.999...e+1000000000. + * The smallest possible magnitude of a non-zero BigNumber is 1e-1000000000. + */ + RANGE?: number | [number, number]; + + /** + * A boolean: `true` or `false`. Default value: `false`. + * + * The value that determines whether cryptographically-secure pseudo-random number generation is + * used. If `CRYPTO` is set to true then the random method will generate random digits using + * `crypto.getRandomValues` in browsers that support it, or `crypto.randomBytes` if using a + * version of Node.js that supports it. + * + * If neither function is supported by the host environment then attempting to set `CRYPTO` to + * `true` will fail and an exception will be thrown. + * + * If `CRYPTO` is `false` then the source of randomness used will be `Math.random` (which is + * assumed to generate at least 30 bits of randomness). + * + * See `BigNumber.random`. + * + * ```ts + * // Node.js + * global.crypto = require('crypto') + * + * BigNumber.config({ CRYPTO: true }) + * BigNumber.config().CRYPTO // true + * BigNumber.random() // 0.54340758610486147524 + * ``` + */ + CRYPTO?: boolean; + + /** + * An integer, 0, 1, 3, 6 or 9. Default value: `BigNumber.ROUND_DOWN` (1). + * + * The modulo mode used when calculating the modulus: `a mod n`. + * The quotient, `q = a / n`, is calculated according to the `ROUNDING_MODE` that corresponds to + * the chosen `MODULO_MODE`. + * The remainder, `r`, is calculated as: `r = a - n * q`. + * + * The modes that are most commonly used for the modulus/remainder operation are shown in the + * following table. Although the other rounding modes can be used, they may not give useful + * results. + * + * Property | Value | Description + * :------------------|:------|:------------------------------------------------------------------ + * `ROUND_UP` | 0 | The remainder is positive if the dividend is negative. + * `ROUND_DOWN` | 1 | The remainder has the same sign as the dividend. + * | | Uses 'truncating division' and matches JavaScript's `%` operator . + * `ROUND_FLOOR` | 3 | The remainder has the same sign as the divisor. + * | | This matches Python's `%` operator. + * `ROUND_HALF_EVEN` | 6 | The IEEE 754 remainder function. + * `EUCLID` | 9 | The remainder is always positive. + * | | Euclidian division: `q = sign(n) * floor(a / abs(n))` + * + * The rounding/modulo modes are available as enumerated properties of the BigNumber constructor. + * + * See `modulo`. + * + * ```ts + * BigNumber.config({ MODULO_MODE: BigNumber.EUCLID }) + * BigNumber.set({ MODULO_MODE: 9 }) // equivalent + * ``` + */ + MODULO_MODE?: BigNumber.ModuloMode; + + /** + * An integer, 0 to 1e+9. Default value: 0. + * + * The maximum precision, i.e. number of significant digits, of the result of the power operation + * - unless a modulus is specified. + * + * If set to 0, the number of significant digits will not be limited. + * + * See `exponentiatedBy`. + * + * ```ts + * BigNumber.config({ POW_PRECISION: 100 }) + * ``` + */ + POW_PRECISION?: number; + + /** + * An object including any number of the properties shown below. + * + * The object configures the format of the string returned by the `toFormat` method. + * The example below shows the properties of the object that are recognised, and + * their default values. + * + * Unlike the other configuration properties, the values of the properties of the `FORMAT` object + * will not be checked for validity - the existing object will simply be replaced by the object + * that is passed in. + * + * See `toFormat`. + * + * ```ts + * BigNumber.config({ + * FORMAT: { + * // string to prepend + * prefix: '', + * // the decimal separator + * decimalSeparator: '.', + * // the grouping separator of the integer part + * groupSeparator: ',', + * // the primary grouping size of the integer part + * groupSize: 3, + * // the secondary grouping size of the integer part + * secondaryGroupSize: 0, + * // the grouping separator of the fraction part + * fractionGroupSeparator: ' ', + * // the grouping size of the fraction part + * fractionGroupSize: 0, + * // string to append + * suffix: '' + * } + * }) + * ``` + */ + FORMAT?: BigNumber.Format; + + /** + * The alphabet used for base conversion. The length of the alphabet corresponds to the maximum + * value of the base argument that can be passed to the BigNumber constructor or `toString`. + * + * Default value: `'0123456789abcdefghijklmnopqrstuvwxyz'`. + * + * There is no maximum length for the alphabet, but it must be at least 2 characters long, + * and it must not contain whitespace or a repeated character, or the sign indicators '+' and + * '-', or the decimal separator '.'. + * + * ```ts + * // duodecimal (base 12) + * BigNumber.config({ ALPHABET: '0123456789TE' }) + * x = new BigNumber('T', 12) + * x.toString() // '10' + * x.toString(12) // 'T' + * ``` + */ + ALPHABET?: string; + } + + /** See `FORMAT` and `toFormat`. */ + interface Format { + + /** The string to prepend. */ + prefix?: string; + + /** The decimal separator. */ + decimalSeparator?: string; + + /** The grouping separator of the integer part. */ + groupSeparator?: string; + + /** The primary grouping size of the integer part. */ + groupSize?: number; + + /** The secondary grouping size of the integer part. */ + secondaryGroupSize?: number; + + /** The grouping separator of the fraction part. */ + fractionGroupSeparator?: string; + + /** The grouping size of the fraction part. */ + fractionGroupSize?: number; + + /** The string to append. */ + suffix?: string; + } + + interface Instance { + + /** The coefficient of the value of this BigNumber, an array of base 1e14 integer numbers, or null. */ + readonly c: number[] | null; + + /** The exponent of the value of this BigNumber, an integer number, -1000000000 to 1000000000, or null. */ + readonly e: number | null; + + /** The sign of the value of this BigNumber, -1, 1, or null. */ + readonly s: number | null; + + [key: string]: any; + } + + type Constructor = typeof BigNumber; + type ModuloMode = 0 | 1 | 3 | 6 | 9; + type RoundingMode = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8; + type Value = string | number | Instance; +} + +export declare class BigNumber implements BigNumber.Instance { + + /** Used internally to identify a BigNumber instance. */ + private readonly _isBigNumber: true; + + /** The coefficient of the value of this BigNumber, an array of base 1e14 integer numbers, or null. */ + readonly c: number[] | null; + + /** The exponent of the value of this BigNumber, an integer number, -1000000000 to 1000000000, or null. */ + readonly e: number | null; + + /** The sign of the value of this BigNumber, -1, 1, or null. */ + readonly s: number | null; + + /** + * Returns a new instance of a BigNumber object with value `n`, where `n` is a numeric value in + * the specified `base`, or base 10 if `base` is omitted or is `null` or `undefined`. + * + * ```ts + * x = new BigNumber(123.4567) // '123.4567' + * // 'new' is optional + * y = BigNumber(x) // '123.4567' + * ``` + * + * If `n` is a base 10 value it can be in normal (fixed-point) or exponential notation. + * Values in other bases must be in normal notation. Values in any base can have fraction digits, + * i.e. digits after the decimal point. + * + * ```ts + * new BigNumber(43210) // '43210' + * new BigNumber('4.321e+4') // '43210' + * new BigNumber('-735.0918e-430') // '-7.350918e-428' + * new BigNumber('123412421.234324', 5) // '607236.557696' + * ``` + * + * Signed `0`, signed `Infinity` and `NaN` are supported. + * + * ```ts + * new BigNumber('-Infinity') // '-Infinity' + * new BigNumber(NaN) // 'NaN' + * new BigNumber(-0) // '0' + * new BigNumber('.5') // '0.5' + * new BigNumber('+2') // '2' + * ``` + * + * String values in hexadecimal literal form, e.g. `'0xff'`, are valid, as are string values with + * the octal and binary prefixs `'0o'` and `'0b'`. String values in octal literal form without the + * prefix will be interpreted as decimals, e.g. `'011'` is interpreted as 11, not 9. + * + * ```ts + * new BigNumber(-10110100.1, 2) // '-180.5' + * new BigNumber('-0b10110100.1') // '-180.5' + * new BigNumber('ff.8', 16) // '255.5' + * new BigNumber('0xff.8') // '255.5' + * ``` + * + * If a base is specified, `n` is rounded according to the current `DECIMAL_PLACES` and + * `ROUNDING_MODE` settings. This includes base 10, so don't include a `base` parameter for decimal + * values unless this behaviour is desired. + * + * ```ts + * BigNumber.config({ DECIMAL_PLACES: 5 }) + * new BigNumber(1.23456789) // '1.23456789' + * new BigNumber(1.23456789, 10) // '1.23457' + * ``` + * + * An error is thrown if `base` is invalid. + * + * There is no limit to the number of digits of a value of type string (other than that of + * JavaScript's maximum array size). See `RANGE` to set the maximum and minimum possible exponent + * value of a BigNumber. + * + * ```ts + * new BigNumber('5032485723458348569331745.33434346346912144534543') + * new BigNumber('4.321e10000000') + * ``` + * + * BigNumber `NaN` is returned if `n` is invalid (unless `BigNumber.DEBUG` is `true`, see below). + * + * ```ts + * new BigNumber('.1*') // 'NaN' + * new BigNumber('blurgh') // 'NaN' + * new BigNumber(9, 2) // 'NaN' + * ``` + * + * To aid in debugging, if `BigNumber.DEBUG` is `true` then an error will be thrown on an + * invalid `n`. An error will also be thrown if `n` is of type number with more than 15 + * significant digits, as calling `toString` or `valueOf` on these numbers may not result in the + * intended value. + * + * ```ts + * console.log(823456789123456.3) // 823456789123456.2 + * new BigNumber(823456789123456.3) // '823456789123456.2' + * BigNumber.DEBUG = true + * // 'Error: Number has more than 15 significant digits' + * new BigNumber(823456789123456.3) + * // 'Error: Not a base 2 number' + * new BigNumber(9, 2) + * ``` + * + * A BigNumber can also be created from an object literal. + * Use `isBigNumber` to check that it is well-formed. + * + * ```ts + * new BigNumber({ s: 1, e: 2, c: [ 777, 12300000000000 ], _isBigNumber: true }) // '777.123' + * ``` + * + * @param n A numeric value. + * @param base The base of `n`, integer, 2 to 36 (or `ALPHABET.length`, see `ALPHABET`). + */ + constructor(n: BigNumber.Value, base?: number); + + /** + * Returns a BigNumber whose value is the absolute value, i.e. the magnitude, of the value of this + * BigNumber. + * + * The return value is always exact and unrounded. + * + * ```ts + * x = new BigNumber(-0.8) + * x.absoluteValue() // '0.8' + * ``` + */ + absoluteValue(): BigNumber; + + /** + * Returns a BigNumber whose value is the absolute value, i.e. the magnitude, of the value of this + * BigNumber. + * + * The return value is always exact and unrounded. + * + * ```ts + * x = new BigNumber(-0.8) + * x.abs() // '0.8' + * ``` + */ + abs(): BigNumber; + + /** + * Returns | | + * :-------:|:--------------------------------------------------------------| + * 1 | If the value of this BigNumber is greater than the value of `n` + * -1 | If the value of this BigNumber is less than the value of `n` + * 0 | If this BigNumber and `n` have the same value + * `null` | If the value of either this BigNumber or `n` is `NaN` + * + * ```ts + * + * x = new BigNumber(Infinity) + * y = new BigNumber(5) + * x.comparedTo(y) // 1 + * x.comparedTo(x.minus(1)) // 0 + * y.comparedTo(NaN) // null + * y.comparedTo('110', 2) // -1 + * ``` + * @param n A numeric value. + * @param [base] The base of n. + */ + comparedTo(n: BigNumber.Value, base?: number): number; + + /** + * Returns a BigNumber whose value is the value of this BigNumber rounded by rounding mode + * `roundingMode` to a maximum of `decimalPlaces` decimal places. + * + * If `decimalPlaces` is omitted, or is `null` or `undefined`, the return value is the number of + * decimal places of the value of this BigNumber, or `null` if the value of this BigNumber is + * ±`Infinity` or `NaN`. + * + * If `roundingMode` is omitted, or is `null` or `undefined`, `ROUNDING_MODE` is used. + * + * Throws if `decimalPlaces` or `roundingMode` is invalid. + * + * ```ts + * x = new BigNumber(1234.56) + * x.decimalPlaces() // 2 + * x.decimalPlaces(1) // '1234.6' + * x.decimalPlaces(2) // '1234.56' + * x.decimalPlaces(10) // '1234.56' + * x.decimalPlaces(0, 1) // '1234' + * x.decimalPlaces(0, 6) // '1235' + * x.decimalPlaces(1, 1) // '1234.5' + * x.decimalPlaces(1, BigNumber.ROUND_HALF_EVEN) // '1234.6' + * x // '1234.56' + * y = new BigNumber('9.9e-101') + * y.decimalPlaces() // 102 + * ``` + * + * @param [decimalPlaces] Decimal places, integer, 0 to 1e+9. + * @param [roundingMode] Rounding mode, integer, 0 to 8. + */ + decimalPlaces(): number | null; + decimalPlaces(decimalPlaces: number, roundingMode?: BigNumber.RoundingMode): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber rounded by rounding mode + * `roundingMode` to a maximum of `decimalPlaces` decimal places. + * + * If `decimalPlaces` is omitted, or is `null` or `undefined`, the return value is the number of + * decimal places of the value of this BigNumber, or `null` if the value of this BigNumber is + * ±`Infinity` or `NaN`. + * + * If `roundingMode` is omitted, or is `null` or `undefined`, `ROUNDING_MODE` is used. + * + * Throws if `decimalPlaces` or `roundingMode` is invalid. + * + * ```ts + * x = new BigNumber(1234.56) + * x.dp() // 2 + * x.dp(1) // '1234.6' + * x.dp(2) // '1234.56' + * x.dp(10) // '1234.56' + * x.dp(0, 1) // '1234' + * x.dp(0, 6) // '1235' + * x.dp(1, 1) // '1234.5' + * x.dp(1, BigNumber.ROUND_HALF_EVEN) // '1234.6' + * x // '1234.56' + * y = new BigNumber('9.9e-101') + * y.dp() // 102 + * ``` + * + * @param [decimalPlaces] Decimal places, integer, 0 to 1e+9. + * @param [roundingMode] Rounding mode, integer, 0 to 8. + */ + dp(): number | null; + dp(decimalPlaces: number, roundingMode?: BigNumber.RoundingMode): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber divided by `n`, rounded + * according to the current `DECIMAL_PLACES` and `ROUNDING_MODE` settings. + * + * ```ts + * x = new BigNumber(355) + * y = new BigNumber(113) + * x.dividedBy(y) // '3.14159292035398230088' + * x.dividedBy(5) // '71' + * x.dividedBy(47, 16) // '5' + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + dividedBy(n: BigNumber.Value, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber divided by `n`, rounded + * according to the current `DECIMAL_PLACES` and `ROUNDING_MODE` settings. + * + * ```ts + * x = new BigNumber(355) + * y = new BigNumber(113) + * x.div(y) // '3.14159292035398230088' + * x.div(5) // '71' + * x.div(47, 16) // '5' + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + div(n: BigNumber.Value, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the integer part of dividing the value of this BigNumber by + * `n`. + * + * ```ts + * x = new BigNumber(5) + * y = new BigNumber(3) + * x.dividedToIntegerBy(y) // '1' + * x.dividedToIntegerBy(0.7) // '7' + * x.dividedToIntegerBy('0.f', 16) // '5' + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + dividedToIntegerBy(n: BigNumber.Value, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the integer part of dividing the value of this BigNumber by + * `n`. + * + * ```ts + * x = new BigNumber(5) + * y = new BigNumber(3) + * x.idiv(y) // '1' + * x.idiv(0.7) // '7' + * x.idiv('0.f', 16) // '5' + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + idiv(n: BigNumber.Value, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber exponentiated by `n`, i.e. + * raised to the power `n`, and optionally modulo a modulus `m`. + * + * If `n` is negative the result is rounded according to the current `DECIMAL_PLACES` and + * `ROUNDING_MODE` settings. + * + * As the number of digits of the result of the power operation can grow so large so quickly, + * e.g. 123.456**10000 has over 50000 digits, the number of significant digits calculated is + * limited to the value of the `POW_PRECISION` setting (unless a modulus `m` is specified). + * + * By default `POW_PRECISION` is set to 0. This means that an unlimited number of significant + * digits will be calculated, and that the method's performance will decrease dramatically for + * larger exponents. + * + * If `m` is specified and the value of `m`, `n` and this BigNumber are integers and `n` is + * positive, then a fast modular exponentiation algorithm is used, otherwise the operation will + * be performed as `x.exponentiatedBy(n).modulo(m)` with a `POW_PRECISION` of 0. + * + * Throws if `n` is not an integer. + * + * ```ts + * Math.pow(0.7, 2) // 0.48999999999999994 + * x = new BigNumber(0.7) + * x.exponentiatedBy(2) // '0.49' + * BigNumber(3).exponentiatedBy(-2) // '0.11111111111111111111' + * ``` + * + * @param n The exponent, an integer. + * @param [m] The modulus. + */ + exponentiatedBy(n: BigNumber.Value, m?: BigNumber.Value): BigNumber; + exponentiatedBy(n: number, m?: BigNumber.Value): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber exponentiated by `n`, i.e. + * raised to the power `n`, and optionally modulo a modulus `m`. + * + * If `n` is negative the result is rounded according to the current `DECIMAL_PLACES` and + * `ROUNDING_MODE` settings. + * + * As the number of digits of the result of the power operation can grow so large so quickly, + * e.g. 123.456**10000 has over 50000 digits, the number of significant digits calculated is + * limited to the value of the `POW_PRECISION` setting (unless a modulus `m` is specified). + * + * By default `POW_PRECISION` is set to 0. This means that an unlimited number of significant + * digits will be calculated, and that the method's performance will decrease dramatically for + * larger exponents. + * + * If `m` is specified and the value of `m`, `n` and this BigNumber are integers and `n` is + * positive, then a fast modular exponentiation algorithm is used, otherwise the operation will + * be performed as `x.pow(n).modulo(m)` with a `POW_PRECISION` of 0. + * + * Throws if `n` is not an integer. + * + * ```ts + * Math.pow(0.7, 2) // 0.48999999999999994 + * x = new BigNumber(0.7) + * x.pow(2) // '0.49' + * BigNumber(3).pow(-2) // '0.11111111111111111111' + * ``` + * + * @param n The exponent, an integer. + * @param [m] The modulus. + */ + pow(n: BigNumber.Value, m?: BigNumber.Value): BigNumber; + pow(n: number, m?: BigNumber.Value): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber rounded to an integer using + * rounding mode `rm`. + * + * If `rm` is omitted, or is `null` or `undefined`, `ROUNDING_MODE` is used. + * + * Throws if `rm` is invalid. + * + * ```ts + * x = new BigNumber(123.456) + * x.integerValue() // '123' + * x.integerValue(BigNumber.ROUND_CEIL) // '124' + * y = new BigNumber(-12.7) + * y.integerValue() // '-13' + * x.integerValue(BigNumber.ROUND_DOWN) // '-12' + * ``` + * + * @param {BigNumber.RoundingMode} [rm] The roundng mode, an integer, 0 to 8. + */ + integerValue(rm?: BigNumber.RoundingMode): BigNumber; + + /** + * Returns `true` if the value of this BigNumber is equal to the value of `n`, otherwise returns + * `false`. + * + * As with JavaScript, `NaN` does not equal `NaN`. + * + * ```ts + * 0 === 1e-324 // true + * x = new BigNumber(0) + * x.isEqualTo('1e-324') // false + * BigNumber(-0).isEqualTo(x) // true ( -0 === 0 ) + * BigNumber(255).isEqualTo('ff', 16) // true + * + * y = new BigNumber(NaN) + * y.isEqualTo(NaN) // false + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + isEqualTo(n: BigNumber.Value, base?: number): boolean; + + /** + * Returns `true` if the value of this BigNumber is equal to the value of `n`, otherwise returns + * `false`. + * + * As with JavaScript, `NaN` does not equal `NaN`. + * + * ```ts + * 0 === 1e-324 // true + * x = new BigNumber(0) + * x.eq('1e-324') // false + * BigNumber(-0).eq(x) // true ( -0 === 0 ) + * BigNumber(255).eq('ff', 16) // true + * + * y = new BigNumber(NaN) + * y.eq(NaN) // false + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + eq(n: BigNumber.Value, base?: number): boolean; + + /** + * Returns `true` if the value of this BigNumber is a finite number, otherwise returns `false`. + * + * The only possible non-finite values of a BigNumber are `NaN`, `Infinity` and `-Infinity`. + * + * ```ts + * x = new BigNumber(1) + * x.isFinite() // true + * y = new BigNumber(Infinity) + * y.isFinite() // false + * ``` + */ + isFinite(): boolean; + + /** + * Returns `true` if the value of this BigNumber is greater than the value of `n`, otherwise + * returns `false`. + * + * ```ts + * 0.1 > (0.3 - 0.2) // true + * x = new BigNumber(0.1) + * x.isGreaterThan(BigNumber(0.3).minus(0.2)) // false + * BigNumber(0).isGreaterThan(x) // false + * BigNumber(11, 3).isGreaterThan(11.1, 2) // true + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + isGreaterThan(n: BigNumber.Value, base?: number): boolean; + + /** + * Returns `true` if the value of this BigNumber is greater than the value of `n`, otherwise + * returns `false`. + * + * ```ts + * 0.1 > (0.3 - 0 // true + * x = new BigNumber(0.1) + * x.gt(BigNumber(0.3).minus(0.2)) // false + * BigNumber(0).gt(x) // false + * BigNumber(11, 3).gt(11.1, 2) // true + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + gt(n: BigNumber.Value, base?: number): boolean; + + /** + * Returns `true` if the value of this BigNumber is greater than or equal to the value of `n`, + * otherwise returns `false`. + * + * ```ts + * (0.3 - 0.2) >= 0.1 // false + * x = new BigNumber(0.3).minus(0.2) + * x.isGreaterThanOrEqualTo(0.1) // true + * BigNumber(1).isGreaterThanOrEqualTo(x) // true + * BigNumber(10, 18).isGreaterThanOrEqualTo('i', 36) // true + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + isGreaterThanOrEqualTo(n: BigNumber.Value, base?: number): boolean; + + /** + * Returns `true` if the value of this BigNumber is greater than or equal to the value of `n`, + * otherwise returns `false`. + * + * ```ts + * (0.3 - 0.2) >= 0.1 // false + * x = new BigNumber(0.3).minus(0.2) + * x.gte(0.1) // true + * BigNumber(1).gte(x) // true + * BigNumber(10, 18).gte('i', 36) // true + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + gte(n: BigNumber.Value, base?: number): boolean; + + /** + * Returns `true` if the value of this BigNumber is an integer, otherwise returns `false`. + * + * ```ts + * x = new BigNumber(1) + * x.isInteger() // true + * y = new BigNumber(123.456) + * y.isInteger() // false + * ``` + */ + isInteger(): boolean; + + /** + * Returns `true` if the value of this BigNumber is less than the value of `n`, otherwise returns + * `false`. + * + * ```ts + * (0.3 - 0.2) < 0.1 // true + * x = new BigNumber(0.3).minus(0.2) + * x.isLessThan(0.1) // false + * BigNumber(0).isLessThan(x) // true + * BigNumber(11.1, 2).isLessThan(11, 3) // true + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + isLessThan(n: BigNumber.Value, base?: number): boolean; + + /** + * Returns `true` if the value of this BigNumber is less than the value of `n`, otherwise returns + * `false`. + * + * ```ts + * (0.3 - 0.2) < 0.1 // true + * x = new BigNumber(0.3).minus(0.2) + * x.lt(0.1) // false + * BigNumber(0).lt(x) // true + * BigNumber(11.1, 2).lt(11, 3) // true + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + lt(n: BigNumber.Value, base?: number): boolean; + + /** + * Returns `true` if the value of this BigNumber is less than or equal to the value of `n`, + * otherwise returns `false`. + * + * ```ts + * 0.1 <= (0.3 - 0.2) // false + * x = new BigNumber(0.1) + * x.isLessThanOrEqualTo(BigNumber(0.3).minus(0.2)) // true + * BigNumber(-1).isLessThanOrEqualTo(x) // true + * BigNumber(10, 18).isLessThanOrEqualTo('i', 36) // true + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + isLessThanOrEqualTo(n: BigNumber.Value, base?: number): boolean; + + /** + * Returns `true` if the value of this BigNumber is less than or equal to the value of `n`, + * otherwise returns `false`. + * + * ```ts + * 0.1 <= (0.3 - 0.2) // false + * x = new BigNumber(0.1) + * x.lte(BigNumber(0.3).minus(0.2)) // true + * BigNumber(-1).lte(x) // true + * BigNumber(10, 18).lte('i', 36) // true + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + lte(n: BigNumber.Value, base?: number): boolean; + + /** + * Returns `true` if the value of this BigNumber is `NaN`, otherwise returns `false`. + * + * ```ts + * x = new BigNumber(NaN) + * x.isNaN() // true + * y = new BigNumber('Infinity') + * y.isNaN() // false + * ``` + */ + isNaN(): boolean; + + /** + * Returns `true` if the value of this BigNumber is negative, otherwise returns `false`. + * + * ```ts + * x = new BigNumber(-0) + * x.isNegative() // true + * y = new BigNumber(2) + * y.isNegative() // false + * ``` + */ + isNegative(): boolean; + + /** + * Returns `true` if the value of this BigNumber is positive, otherwise returns `false`. + * + * ```ts + * x = new BigNumber(-0) + * x.isPositive() // false + * y = new BigNumber(2) + * y.isPositive() // true + * ``` + */ + isPositive(): boolean; + + /** + * Returns `true` if the value of this BigNumber is zero or minus zero, otherwise returns `false`. + * + * ```ts + * x = new BigNumber(-0) + * x.isZero() // true + * ``` + */ + isZero(): boolean; + + /** + * Returns a BigNumber whose value is the value of this BigNumber minus `n`. + * + * The return value is always exact and unrounded. + * + * ```ts + * 0.3 - 0.1 // 0.19999999999999998 + * x = new BigNumber(0.3) + * x.minus(0.1) // '0.2' + * x.minus(0.6, 20) // '0' + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + minus(n: BigNumber.Value, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber modulo `n`, i.e. the integer + * remainder of dividing this BigNumber by `n`. + * + * The value returned, and in particular its sign, is dependent on the value of the `MODULO_MODE` + * setting of this BigNumber constructor. If it is 1 (default value), the result will have the + * same sign as this BigNumber, and it will match that of Javascript's `%` operator (within the + * limits of double precision) and BigDecimal's `remainder` method. + * + * The return value is always exact and unrounded. + * + * See `MODULO_MODE` for a description of the other modulo modes. + * + * ```ts + * 1 % 0.9 // 0.09999999999999998 + * x = new BigNumber(1) + * x.modulo(0.9) // '0.1' + * y = new BigNumber(33) + * y.modulo('a', 33) // '3' + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + modulo(n: BigNumber.Value, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber modulo `n`, i.e. the integer + * remainder of dividing this BigNumber by `n`. + * + * The value returned, and in particular its sign, is dependent on the value of the `MODULO_MODE` + * setting of this BigNumber constructor. If it is 1 (default value), the result will have the + * same sign as this BigNumber, and it will match that of Javascript's `%` operator (within the + * limits of double precision) and BigDecimal's `remainder` method. + * + * The return value is always exact and unrounded. + * + * See `MODULO_MODE` for a description of the other modulo modes. + * + * ```ts + * 1 % 0.9 // 0.09999999999999998 + * x = new BigNumber(1) + * x.mod(0.9) // '0.1' + * y = new BigNumber(33) + * y.mod('a', 33) // '3' + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + mod(n: BigNumber.Value, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber multiplied by `n`. + * + * The return value is always exact and unrounded. + * + * ```ts + * 0.6 * 3 // 1.7999999999999998 + * x = new BigNumber(0.6) + * y = x.multipliedBy(3) // '1.8' + * BigNumber('7e+500').multipliedBy(y) // '1.26e+501' + * x.multipliedBy('-a', 16) // '-6' + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + multipliedBy(n: BigNumber.Value, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber multiplied by `n`. + * + * The return value is always exact and unrounded. + * + * ```ts + * 0.6 * 3 // 1.7999999999999998 + * x = new BigNumber(0.6) + * y = x.times(3) // '1.8' + * BigNumber('7e+500').times(y) // '1.26e+501' + * x.times('-a', 16) // '-6' + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + times(n: BigNumber.Value, base?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber negated, i.e. multiplied by -1. + * + * ```ts + * x = new BigNumber(1.8) + * x.negated() // '-1.8' + * y = new BigNumber(-1.3) + * y.negated() // '1.3' + * ``` + */ + negated(): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber plus `n`. + * + * The return value is always exact and unrounded. + * + * ```ts + * 0.1 + 0.2 // 0.30000000000000004 + * x = new BigNumber(0.1) + * y = x.plus(0.2) // '0.3' + * BigNumber(0.7).plus(x).plus(y) // '1.1' + * x.plus('0.1', 8) // '0.225' + * ``` + * + * @param n A numeric value. + * @param [base] The base of n. + */ + plus(n: BigNumber.Value, base?: number): BigNumber; + + /** + * Returns the number of significant digits of the value of this BigNumber, or `null` if the value + * of this BigNumber is ±`Infinity` or `NaN`. + * + * If `includeZeros` is true then any trailing zeros of the integer part of the value of this + * BigNumber are counted as significant digits, otherwise they are not. + * + * Throws if `includeZeros` is invalid. + * + * ```ts + * x = new BigNumber(9876.54321) + * x.precision() // 9 + * y = new BigNumber(987000) + * y.precision(false) // 3 + * y.precision(true) // 6 + * ``` + * + * @param [includeZeros] Whether to include integer trailing zeros in the significant digit count. + */ + precision(includeZeros?: boolean): number; + + /** + * Returns a BigNumber whose value is the value of this BigNumber rounded to a precision of + * `significantDigits` significant digits using rounding mode `roundingMode`. + * + * If `roundingMode` is omitted or is `null` or `undefined`, `ROUNDING_MODE` will be used. + * + * Throws if `significantDigits` or `roundingMode` is invalid. + * + * ```ts + * x = new BigNumber(9876.54321) + * x.precision(6) // '9876.54' + * x.precision(6, BigNumber.ROUND_UP) // '9876.55' + * x.precision(2) // '9900' + * x.precision(2, 1) // '9800' + * x // '9876.54321' + * ``` + * + * @param significantDigits Significant digits, integer, 1 to 1e+9. + * @param [roundingMode] Rounding mode, integer, 0 to 8. + */ + precision(significantDigits: number, roundingMode?: BigNumber.RoundingMode): BigNumber; + + /** + * Returns the number of significant digits of the value of this BigNumber, + * or `null` if the value of this BigNumber is ±`Infinity` or `NaN`. + * + * If `includeZeros` is true then any trailing zeros of the integer part of + * the value of this BigNumber are counted as significant digits, otherwise + * they are not. + * + * Throws if `includeZeros` is invalid. + * + * ```ts + * x = new BigNumber(9876.54321) + * x.sd() // 9 + * y = new BigNumber(987000) + * y.sd(false) // 3 + * y.sd(true) // 6 + * ``` + * + * @param [includeZeros] Whether to include integer trailing zeros in the significant digit count. + */ + sd(includeZeros?: boolean): number; + + /** + * Returns a BigNumber whose value is the value of this BigNumber rounded to a precision of + * `significantDigits` significant digits using rounding mode `roundingMode`. + * + * If `roundingMode` is omitted or is `null` or `undefined`, `ROUNDING_MODE` will be used. + * + * Throws if `significantDigits` or `roundingMode` is invalid. + * + * ```ts + * x = new BigNumber(9876.54321) + * x.sd(6) // '9876.54' + * x.sd(6, BigNumber.ROUND_UP) // '9876.55' + * x.sd(2) // '9900' + * x.sd(2, 1) // '9800' + * x // '9876.54321' + * ``` + * + * @param significantDigits Significant digits, integer, 1 to 1e+9. + * @param [roundingMode] Rounding mode, integer, 0 to 8. + */ + sd(significantDigits: number, roundingMode?: BigNumber.RoundingMode): BigNumber; + + /** + * Returns a BigNumber whose value is the value of this BigNumber shifted by `n` places. + * + * The shift is of the decimal point, i.e. of powers of ten, and is to the left if `n` is negative + * or to the right if `n` is positive. + * + * The return value is always exact and unrounded. + * + * Throws if `n` is invalid. + * + * ```ts + * x = new BigNumber(1.23) + * x.shiftedBy(3) // '1230' + * x.shiftedBy(-3) // '0.00123' + * ``` + * + * @param n The shift value, integer, -9007199254740991 to 9007199254740991. + */ + shiftedBy(n: number): BigNumber; + + /** + * Returns a BigNumber whose value is the square root of the value of this BigNumber, rounded + * according to the current `DECIMAL_PLACES` and `ROUNDING_MODE` settings. + * + * The return value will be correctly rounded, i.e. rounded as if the result was first calculated + * to an infinite number of correct digits before rounding. + * + * ```ts + * x = new BigNumber(16) + * x.squareRoot() // '4' + * y = new BigNumber(3) + * y.squareRoot() // '1.73205080756887729353' + * ``` + */ + squareRoot(): BigNumber; + + /** + * Returns a BigNumber whose value is the square root of the value of this BigNumber, rounded + * according to the current `DECIMAL_PLACES` and `ROUNDING_MODE` settings. + * + * The return value will be correctly rounded, i.e. rounded as if the result was first calculated + * to an infinite number of correct digits before rounding. + * + * ```ts + * x = new BigNumber(16) + * x.sqrt() // '4' + * y = new BigNumber(3) + * y.sqrt() // '1.73205080756887729353' + * ``` + */ + sqrt(): BigNumber; + + /** + * Returns a string representing the value of this BigNumber in exponential notation rounded using + * rounding mode `roundingMode` to `decimalPlaces` decimal places, i.e with one digit before the + * decimal point and `decimalPlaces` digits after it. + * + * If the value of this BigNumber in exponential notation has fewer than `decimalPlaces` fraction + * digits, the return value will be appended with zeros accordingly. + * + * If `decimalPlaces` is omitted, or is `null` or `undefined`, the number of digits after the + * decimal point defaults to the minimum number of digits necessary to represent the value + * exactly. + * + * If `roundingMode` is omitted or is `null` or `undefined`, `ROUNDING_MODE` is used. + * + * Throws if `decimalPlaces` or `roundingMode` is invalid. + * + * ```ts + * x = 45.6 + * y = new BigNumber(x) + * x.toExponential() // '4.56e+1' + * y.toExponential() // '4.56e+1' + * x.toExponential(0) // '5e+1' + * y.toExponential(0) // '5e+1' + * x.toExponential(1) // '4.6e+1' + * y.toExponential(1) // '4.6e+1' + * y.toExponential(1, 1) // '4.5e+1' (ROUND_DOWN) + * x.toExponential(3) // '4.560e+1' + * y.toExponential(3) // '4.560e+1' + * ``` + * + * @param [decimalPlaces] Decimal places, integer, 0 to 1e+9. + * @param [roundingMode] Rounding mode, integer, 0 to 8. + */ + toExponential(decimalPlaces: number, roundingMode?: BigNumber.RoundingMode): string; + toExponential(): string; + + /** + * Returns a string representing the value of this BigNumber in normal (fixed-point) notation + * rounded to `decimalPlaces` decimal places using rounding mode `roundingMode`. + * + * If the value of this BigNumber in normal notation has fewer than `decimalPlaces` fraction + * digits, the return value will be appended with zeros accordingly. + * + * Unlike `Number.prototype.toFixed`, which returns exponential notation if a number is greater or + * equal to 10**21, this method will always return normal notation. + * + * If `decimalPlaces` is omitted or is `null` or `undefined`, the return value will be unrounded + * and in normal notation. This is also unlike `Number.prototype.toFixed`, which returns the value + * to zero decimal places. It is useful when normal notation is required and the current + * `EXPONENTIAL_AT` setting causes `toString` to return exponential notation. + * + * If `roundingMode` is omitted or is `null` or `undefined`, `ROUNDING_MODE` is used. + * + * Throws if `decimalPlaces` or `roundingMode` is invalid. + * + * ```ts + * x = 3.456 + * y = new BigNumber(x) + * x.toFixed() // '3' + * y.toFixed() // '3.456' + * y.toFixed(0) // '3' + * x.toFixed(2) // '3.46' + * y.toFixed(2) // '3.46' + * y.toFixed(2, 1) // '3.45' (ROUND_DOWN) + * x.toFixed(5) // '3.45600' + * y.toFixed(5) // '3.45600' + * ``` + * + * @param [decimalPlaces] Decimal places, integer, 0 to 1e+9. + * @param [roundingMode] Rounding mode, integer, 0 to 8. + */ + toFixed(decimalPlaces: number, roundingMode?: BigNumber.RoundingMode): string; + toFixed(): string; + + /** + * Returns a string representing the value of this BigNumber in normal (fixed-point) notation + * rounded to `decimalPlaces` decimal places using rounding mode `roundingMode`, and formatted + * according to the properties of the `format` or `FORMAT` object. + * + * The formatting object may contain some or all of the properties shown in the examples below. + * + * If `decimalPlaces` is omitted or is `null` or `undefined`, then the return value is not + * rounded to a fixed number of decimal places. + * + * If `roundingMode` is omitted or is `null` or `undefined`, `ROUNDING_MODE` is used. + * + * If `format` is omitted or is `null` or `undefined`, `FORMAT` is used. + * + * Throws if `decimalPlaces`, `roundingMode`, or `format` is invalid. + * + * ```ts + * fmt = { + * decimalSeparator: '.', + * groupSeparator: ',', + * groupSize: 3, + * secondaryGroupSize: 0, + * fractionGroupSeparator: ' ', + * fractionGroupSize: 0 + * } + * + * x = new BigNumber('123456789.123456789') + * + * // Set the global formatting options + * BigNumber.config({ FORMAT: fmt }) + * + * x.toFormat() // '123,456,789.123456789' + * x.toFormat(3) // '123,456,789.123' + * + * // If a reference to the object assigned to FORMAT has been retained, + * // the format properties can be changed directly + * fmt.groupSeparator = ' ' + * fmt.fractionGroupSize = 5 + * x.toFormat() // '123 456 789.12345 6789' + * + * // Alternatively, pass the formatting options as an argument + * fmt = { + * decimalSeparator: ',', + * groupSeparator: '.', + * groupSize: 3, + * secondaryGroupSize: 2 + * } + * + * x.toFormat() // '123 456 789.12345 6789' + * x.toFormat(fmt) // '12.34.56.789,123456789' + * x.toFormat(2, fmt) // '12.34.56.789,12' + * x.toFormat(3, BigNumber.ROUND_UP, fmt) // '12.34.56.789,124' + * ``` + * + * @param [decimalPlaces] Decimal places, integer, 0 to 1e+9. + * @param [roundingMode] Rounding mode, integer, 0 to 8. + * @param [format] Formatting options object. See `BigNumber.Format`. + */ + toFormat(decimalPlaces: number, roundingMode: BigNumber.RoundingMode, format?: BigNumber.Format): string; + toFormat(decimalPlaces: number, roundingMode?: BigNumber.RoundingMode): string; + toFormat(decimalPlaces?: number): string; + toFormat(decimalPlaces: number, format: BigNumber.Format): string; + toFormat(format: BigNumber.Format): string; + + /** + * Returns an array of two BigNumbers representing the value of this BigNumber as a simple + * fraction with an integer numerator and an integer denominator. + * The denominator will be a positive non-zero value less than or equal to `max_denominator`. + * If a maximum denominator, `max_denominator`, is not specified, or is `null` or `undefined`, the + * denominator will be the lowest value necessary to represent the number exactly. + * + * Throws if `max_denominator` is invalid. + * + * ```ts + * x = new BigNumber(1.75) + * x.toFraction() // '7, 4' + * + * pi = new BigNumber('3.14159265358') + * pi.toFraction() // '157079632679,50000000000' + * pi.toFraction(100000) // '312689, 99532' + * pi.toFraction(10000) // '355, 113' + * pi.toFraction(100) // '311, 99' + * pi.toFraction(10) // '22, 7' + * pi.toFraction(1) // '3, 1' + * ``` + * + * @param [max_denominator] The maximum denominator, integer > 0, or Infinity. + */ + toFraction(max_denominator?: BigNumber.Value): [BigNumber, BigNumber]; + + /** As `valueOf`. */ + toJSON(): string; + + /** + * Returns the value of this BigNumber as a JavaScript primitive number. + * + * Using the unary plus operator gives the same result. + * + * ```ts + * x = new BigNumber(456.789) + * x.toNumber() // 456.789 + * +x // 456.789 + * + * y = new BigNumber('45987349857634085409857349856430985') + * y.toNumber() // 4.598734985763409e+34 + * + * z = new BigNumber(-0) + * 1 / z.toNumber() // -Infinity + * 1 / +z // -Infinity + * ``` + */ + toNumber(): number; + + /** + * Returns a string representing the value of this BigNumber rounded to `significantDigits` + * significant digits using rounding mode `roundingMode`. + * + * If `significantDigits` is less than the number of digits necessary to represent the integer + * part of the value in normal (fixed-point) notation, then exponential notation is used. + * + * If `significantDigits` is omitted, or is `null` or `undefined`, then the return value is the + * same as `n.toString()`. + * + * If `roundingMode` is omitted or is `null` or `undefined`, `ROUNDING_MODE` is used. + * + * Throws if `significantDigits` or `roundingMode` is invalid. + * + * ```ts + * x = 45.6 + * y = new BigNumber(x) + * x.toPrecision() // '45.6' + * y.toPrecision() // '45.6' + * x.toPrecision(1) // '5e+1' + * y.toPrecision(1) // '5e+1' + * y.toPrecision(2, 0) // '4.6e+1' (ROUND_UP) + * y.toPrecision(2, 1) // '4.5e+1' (ROUND_DOWN) + * x.toPrecision(5) // '45.600' + * y.toPrecision(5) // '45.600' + * ``` + * + * @param [significantDigits] Significant digits, integer, 1 to 1e+9. + * @param [roundingMode] Rounding mode, integer 0 to 8. + */ + toPrecision(significantDigits: number, roundingMode?: BigNumber.RoundingMode): string; + toPrecision(): string; + + /** + * Returns a string representing the value of this BigNumber in base `base`, or base 10 if `base` + * is omitted or is `null` or `undefined`. + * + * For bases above 10, and using the default base conversion alphabet (see `ALPHABET`), values + * from 10 to 35 are represented by a-z (the same as `Number.prototype.toString`). + * + * If a base is specified the value is rounded according to the current `DECIMAL_PLACES` and + * `ROUNDING_MODE` settings, otherwise it is not. + * + * If a base is not specified, and this BigNumber has a positive exponent that is equal to or + * greater than the positive component of the current `EXPONENTIAL_AT` setting, or a negative + * exponent equal to or less than the negative component of the setting, then exponential notation + * is returned. + * + * If `base` is `null` or `undefined` it is ignored. + * + * Throws if `base` is invalid. + * + * ```ts + * x = new BigNumber(750000) + * x.toString() // '750000' + * BigNumber.config({ EXPONENTIAL_AT: 5 }) + * x.toString() // '7.5e+5' + * + * y = new BigNumber(362.875) + * y.toString(2) // '101101010.111' + * y.toString(9) // '442.77777777777777777778' + * y.toString(32) // 'ba.s' + * + * BigNumber.config({ DECIMAL_PLACES: 4 }); + * z = new BigNumber('1.23456789') + * z.toString() // '1.23456789' + * z.toString(10) // '1.2346' + * ``` + * + * @param [base] The base, integer, 2 to 36 (or `ALPHABET.length`, see `ALPHABET`). + */ + toString(base?: number): string; + + /** + * As `toString`, but does not accept a base argument and includes the minus sign for negative + * zero. + * + * ``ts + * x = new BigNumber('-0') + * x.toString() // '0' + * x.valueOf() // '-0' + * y = new BigNumber('1.777e+457') + * y.valueOf() // '1.777e+457' + * ``` + */ + valueOf(): string; + + /** Helps ES6 import. */ + private static readonly default?: BigNumber.Constructor; + + /** Helps ES6 import. */ + private static readonly BigNumber?: BigNumber.Constructor; + + /** Rounds away from zero. */ + static readonly ROUND_UP: 0; + + /** Rounds towards zero. */ + static readonly ROUND_DOWN: 1; + + /** Rounds towards Infinity. */ + static readonly ROUND_CEIL: 2; + + /** Rounds towards -Infinity. */ + static readonly ROUND_FLOOR: 3; + + /** Rounds towards nearest neighbour. If equidistant, rounds away from zero . */ + static readonly ROUND_HALF_UP: 4; + + /** Rounds towards nearest neighbour. If equidistant, rounds towards zero. */ + static readonly ROUND_HALF_DOWN: 5; + + /** Rounds towards nearest neighbour. If equidistant, rounds towards even neighbour. */ + static readonly ROUND_HALF_EVEN: 6; + + /** Rounds towards nearest neighbour. If equidistant, rounds towards Infinity. */ + static readonly ROUND_HALF_CEIL: 7; + + /** Rounds towards nearest neighbour. If equidistant, rounds towards -Infinity. */ + static readonly ROUND_HALF_FLOOR: 8; + + /** See `MODULO_MODE`. */ + static readonly EUCLID: 9; + + /** + * To aid in debugging, if a `BigNumber.DEBUG` property is `true` then an error will be thrown + * if the BigNumber constructor receives an invalid `BigNumber.Value`, or if `BigNumber.isBigNumber` + * receives a BigNumber instance that is malformed. + * + * ```ts + * // No error, and BigNumber NaN is returned. + * new BigNumber('blurgh') // 'NaN' + * new BigNumber(9, 2) // 'NaN' + * BigNumber.DEBUG = true + * new BigNumber('blurgh') // '[BigNumber Error] Not a number' + * new BigNumber(9, 2) // '[BigNumber Error] Not a base 2 number' + * ``` + * + * An error will also be thrown if a `BigNumber.Value` is of type number with more than 15 + * significant digits, as calling `toString` or `valueOf` on such numbers may not result + * in the intended value. + * + * ```ts + * console.log(823456789123456.3) // 823456789123456.2 + * // No error, and the returned BigNumber does not have the same value as the number literal. + * new BigNumber(823456789123456.3) // '823456789123456.2' + * BigNumber.DEBUG = true + * new BigNumber(823456789123456.3) + * // '[BigNumber Error] Number primitive has more than 15 significant digits' + * ``` + * + * Check that a BigNumber instance is well-formed: + * + * ```ts + * x = new BigNumber(10) + * + * BigNumber.DEBUG = false + * // Change x.c to an illegitimate value. + * x.c = NaN + * // No error, as BigNumber.DEBUG is false. + * BigNumber.isBigNumber(x) // true + * + * BigNumber.DEBUG = true + * BigNumber.isBigNumber(x) // '[BigNumber Error] Invalid BigNumber' + * ``` + */ + static DEBUG?: boolean; + + /** + * Returns a new independent BigNumber constructor with configuration as described by `object`, or + * with the default configuration if object is `null` or `undefined`. + * + * Throws if `object` is not an object. + * + * ```ts + * BigNumber.config({ DECIMAL_PLACES: 5 }) + * BN = BigNumber.clone({ DECIMAL_PLACES: 9 }) + * + * x = new BigNumber(1) + * y = new BN(1) + * + * x.div(3) // 0.33333 + * y.div(3) // 0.333333333 + * + * // BN = BigNumber.clone({ DECIMAL_PLACES: 9 }) is equivalent to: + * BN = BigNumber.clone() + * BN.config({ DECIMAL_PLACES: 9 }) + * ``` + * + * @param [object] The configuration object. + */ + static clone(object?: BigNumber.Config): BigNumber.Constructor; + + /** + * Configures the settings that apply to this BigNumber constructor. + * + * The configuration object, `object`, contains any number of the properties shown in the example + * below. + * + * Returns an object with the above properties and their current values. + * + * Throws if `object` is not an object, or if an invalid value is assigned to one or more of the + * properties. + * + * ```ts + * BigNumber.config({ + * DECIMAL_PLACES: 40, + * ROUNDING_MODE: BigNumber.ROUND_HALF_CEIL, + * EXPONENTIAL_AT: [-10, 20], + * RANGE: [-500, 500], + * CRYPTO: true, + * MODULO_MODE: BigNumber.ROUND_FLOOR, + * POW_PRECISION: 80, + * FORMAT: { + * groupSize: 3, + * groupSeparator: ' ', + * decimalSeparator: ',' + * }, + * ALPHABET: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_' + * }); + * + * BigNumber.config().DECIMAL_PLACES // 40 + * ``` + * + * @param object The configuration object. + */ + static config(object?: BigNumber.Config): BigNumber.Config; + + /** + * Returns `true` if `value` is a BigNumber instance, otherwise returns `false`. + * + * If `BigNumber.DEBUG` is `true`, throws if a BigNumber instance is not well-formed. + * + * ```ts + * x = 42 + * y = new BigNumber(x) + * + * BigNumber.isBigNumber(x) // false + * y instanceof BigNumber // true + * BigNumber.isBigNumber(y) // true + * + * BN = BigNumber.clone(); + * z = new BN(x) + * z instanceof BigNumber // false + * BigNumber.isBigNumber(z) // true + * ``` + * + * @param value The value to test. + */ + static isBigNumber(value: any): value is BigNumber; + + /** + * Returns a BigNumber whose value is the maximum of the arguments. + * + * The return value is always exact and unrounded. + * + * ```ts + * x = new BigNumber('3257869345.0378653') + * BigNumber.maximum(4e9, x, '123456789.9') // '4000000000' + * + * arr = [12, '13', new BigNumber(14)] + * BigNumber.maximum.apply(null, arr) // '14' + * ``` + * + * @param n A numeric value. + */ + static maximum(...n: BigNumber.Value[]): BigNumber; + + /** + * Returns a BigNumber whose value is the maximum of the arguments. + * + * The return value is always exact and unrounded. + * + * ```ts + * x = new BigNumber('3257869345.0378653') + * BigNumber.max(4e9, x, '123456789.9') // '4000000000' + * + * arr = [12, '13', new BigNumber(14)] + * BigNumber.max.apply(null, arr) // '14' + * ``` + * + * @param n A numeric value. + */ + static max(...n: BigNumber.Value[]): BigNumber; + + /** + * Returns a BigNumber whose value is the minimum of the arguments. + * + * The return value is always exact and unrounded. + * + * ```ts + * x = new BigNumber('3257869345.0378653') + * BigNumber.minimum(4e9, x, '123456789.9') // '123456789.9' + * + * arr = [2, new BigNumber(-14), '-15.9999', -12] + * BigNumber.minimum.apply(null, arr) // '-15.9999' + * ``` + * + * @param n A numeric value. + */ + static minimum(...n: BigNumber.Value[]): BigNumber; + + /** + * Returns a BigNumber whose value is the minimum of the arguments. + * + * The return value is always exact and unrounded. + * + * ```ts + * x = new BigNumber('3257869345.0378653') + * BigNumber.min(4e9, x, '123456789.9') // '123456789.9' + * + * arr = [2, new BigNumber(-14), '-15.9999', -12] + * BigNumber.min.apply(null, arr) // '-15.9999' + * ``` + * + * @param n A numeric value. + */ + static min(...n: BigNumber.Value[]): BigNumber; + + /** + * Returns a new BigNumber with a pseudo-random value equal to or greater than 0 and less than 1. + * + * The return value will have `decimalPlaces` decimal places, or less if trailing zeros are + * produced. If `decimalPlaces` is omitted, the current `DECIMAL_PLACES` setting will be used. + * + * Depending on the value of this BigNumber constructor's `CRYPTO` setting and the support for the + * `crypto` object in the host environment, the random digits of the return value are generated by + * either `Math.random` (fastest), `crypto.getRandomValues` (Web Cryptography API in recent + * browsers) or `crypto.randomBytes` (Node.js). + * + * To be able to set `CRYPTO` to true when using Node.js, the `crypto` object must be available + * globally: + * + * ```ts + * global.crypto = require('crypto') + * ``` + * + * If `CRYPTO` is true, i.e. one of the `crypto` methods is to be used, the value of a returned + * BigNumber should be cryptographically secure and statistically indistinguishable from a random + * value. + * + * Throws if `decimalPlaces` is invalid. + * + * ```ts + * BigNumber.config({ DECIMAL_PLACES: 10 }) + * BigNumber.random() // '0.4117936847' + * BigNumber.random(20) // '0.78193327636914089009' + * ``` + * + * @param [decimalPlaces] Decimal places, integer, 0 to 1e+9. + */ + static random(decimalPlaces?: number): BigNumber; + + /** + * Returns a BigNumber whose value is the sum of the arguments. + * + * The return value is always exact and unrounded. + * + * ```ts + * x = new BigNumber('3257869345.0378653') + * BigNumber.sum(4e9, x, '123456789.9') // '7381326134.9378653' + * + * arr = [2, new BigNumber(14), '15.9999', 12] + * BigNumber.sum.apply(null, arr) // '43.9999' + * ``` + * + * @param n A numeric value. + */ + static sum(...n: BigNumber.Value[]): BigNumber; + + /** + * Configures the settings that apply to this BigNumber constructor. + * + * The configuration object, `object`, contains any number of the properties shown in the example + * below. + * + * Returns an object with the above properties and their current values. + * + * Throws if `object` is not an object, or if an invalid value is assigned to one or more of the + * properties. + * + * ```ts + * BigNumber.set({ + * DECIMAL_PLACES: 40, + * ROUNDING_MODE: BigNumber.ROUND_HALF_CEIL, + * EXPONENTIAL_AT: [-10, 20], + * RANGE: [-500, 500], + * CRYPTO: true, + * MODULO_MODE: BigNumber.ROUND_FLOOR, + * POW_PRECISION: 80, + * FORMAT: { + * groupSize: 3, + * groupSeparator: ' ', + * decimalSeparator: ',' + * }, + * ALPHABET: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_' + * }); + * + * BigNumber.set().DECIMAL_PLACES // 40 + * ``` + * + * @param object The configuration object. + */ + static set(object?: BigNumber.Config): BigNumber.Config; +} + +export function BigNumber(n: BigNumber.Value, base?: number): BigNumber; diff --git a/node/node_modules/bignumber.js/bignumber.js b/node/node_modules/bignumber.js/bignumber.js new file mode 100644 index 0000000..e5c66c8 --- /dev/null +++ b/node/node_modules/bignumber.js/bignumber.js @@ -0,0 +1,2922 @@ +;(function (globalObject) { + 'use strict'; + +/* + * bignumber.js v9.1.2 + * A JavaScript library for arbitrary-precision arithmetic. + * https://github.com/MikeMcl/bignumber.js + * Copyright (c) 2022 Michael Mclaughlin + * MIT Licensed. + * + * BigNumber.prototype methods | BigNumber methods + * | + * absoluteValue abs | clone + * comparedTo | config set + * decimalPlaces dp | DECIMAL_PLACES + * dividedBy div | ROUNDING_MODE + * dividedToIntegerBy idiv | EXPONENTIAL_AT + * exponentiatedBy pow | RANGE + * integerValue | CRYPTO + * isEqualTo eq | MODULO_MODE + * isFinite | POW_PRECISION + * isGreaterThan gt | FORMAT + * isGreaterThanOrEqualTo gte | ALPHABET + * isInteger | isBigNumber + * isLessThan lt | maximum max + * isLessThanOrEqualTo lte | minimum min + * isNaN | random + * isNegative | sum + * isPositive | + * isZero | + * minus | + * modulo mod | + * multipliedBy times | + * negated | + * plus | + * precision sd | + * shiftedBy | + * squareRoot sqrt | + * toExponential | + * toFixed | + * toFormat | + * toFraction | + * toJSON | + * toNumber | + * toPrecision | + * toString | + * valueOf | + * + */ + + + var BigNumber, + isNumeric = /^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i, + mathceil = Math.ceil, + mathfloor = Math.floor, + + bignumberError = '[BigNumber Error] ', + tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ', + + BASE = 1e14, + LOG_BASE = 14, + MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1 + // MAX_INT32 = 0x7fffffff, // 2^31 - 1 + POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13], + SQRT_BASE = 1e7, + + // EDITABLE + // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and + // the arguments to toExponential, toFixed, toFormat, and toPrecision. + MAX = 1E9; // 0 to MAX_INT32 + + + /* + * Create and return a BigNumber constructor. + */ + function clone(configObject) { + var div, convertBase, parseNumeric, + P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null }, + ONE = new BigNumber(1), + + + //----------------------------- EDITABLE CONFIG DEFAULTS ------------------------------- + + + // The default values below must be integers within the inclusive ranges stated. + // The values can also be changed at run-time using BigNumber.set. + + // The maximum number of decimal places for operations involving division. + DECIMAL_PLACES = 20, // 0 to MAX + + // The rounding mode used when rounding to the above decimal places, and when using + // toExponential, toFixed, toFormat and toPrecision, and round (default value). + // UP 0 Away from zero. + // DOWN 1 Towards zero. + // CEIL 2 Towards +Infinity. + // FLOOR 3 Towards -Infinity. + // HALF_UP 4 Towards nearest neighbour. If equidistant, up. + // HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. + // HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. + // HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. + // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. + ROUNDING_MODE = 4, // 0 to 8 + + // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS] + + // The exponent value at and beneath which toString returns exponential notation. + // Number type: -7 + TO_EXP_NEG = -7, // 0 to -MAX + + // The exponent value at and above which toString returns exponential notation. + // Number type: 21 + TO_EXP_POS = 21, // 0 to MAX + + // RANGE : [MIN_EXP, MAX_EXP] + + // The minimum exponent value, beneath which underflow to zero occurs. + // Number type: -324 (5e-324) + MIN_EXP = -1e7, // -1 to -MAX + + // The maximum exponent value, above which overflow to Infinity occurs. + // Number type: 308 (1.7976931348623157e+308) + // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow. + MAX_EXP = 1e7, // 1 to MAX + + // Whether to use cryptographically-secure random number generation, if available. + CRYPTO = false, // true or false + + // The modulo mode used when calculating the modulus: a mod n. + // The quotient (q = a / n) is calculated according to the corresponding rounding mode. + // The remainder (r) is calculated as: r = a - n * q. + // + // UP 0 The remainder is positive if the dividend is negative, else is negative. + // DOWN 1 The remainder has the same sign as the dividend. + // This modulo mode is commonly known as 'truncated division' and is + // equivalent to (a % n) in JavaScript. + // FLOOR 3 The remainder has the same sign as the divisor (Python %). + // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function. + // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). + // The remainder is always positive. + // + // The truncated division, floored division, Euclidian division and IEEE 754 remainder + // modes are commonly used for the modulus operation. + // Although the other rounding modes can also be used, they may not give useful results. + MODULO_MODE = 1, // 0 to 9 + + // The maximum number of significant digits of the result of the exponentiatedBy operation. + // If POW_PRECISION is 0, there will be unlimited significant digits. + POW_PRECISION = 0, // 0 to MAX + + // The format specification used by the BigNumber.prototype.toFormat method. + FORMAT = { + prefix: '', + groupSize: 3, + secondaryGroupSize: 0, + groupSeparator: ',', + decimalSeparator: '.', + fractionGroupSize: 0, + fractionGroupSeparator: '\xA0', // non-breaking space + suffix: '' + }, + + // The alphabet used for base conversion. It must be at least 2 characters long, with no '+', + // '-', '.', whitespace, or repeated character. + // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_' + ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz', + alphabetHasNormalDecimalDigits = true; + + + //------------------------------------------------------------------------------------------ + + + // CONSTRUCTOR + + + /* + * The BigNumber constructor and exported function. + * Create and return a new instance of a BigNumber object. + * + * v {number|string|BigNumber} A numeric value. + * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive. + */ + function BigNumber(v, b) { + var alphabet, c, caseChanged, e, i, isNum, len, str, + x = this; + + // Enable constructor call without `new`. + if (!(x instanceof BigNumber)) return new BigNumber(v, b); + + if (b == null) { + + if (v && v._isBigNumber === true) { + x.s = v.s; + + if (!v.c || v.e > MAX_EXP) { + x.c = x.e = null; + } else if (v.e < MIN_EXP) { + x.c = [x.e = 0]; + } else { + x.e = v.e; + x.c = v.c.slice(); + } + + return; + } + + if ((isNum = typeof v == 'number') && v * 0 == 0) { + + // Use `1 / n` to handle minus zero also. + x.s = 1 / v < 0 ? (v = -v, -1) : 1; + + // Fast path for integers, where n < 2147483648 (2**31). + if (v === ~~v) { + for (e = 0, i = v; i >= 10; i /= 10, e++); + + if (e > MAX_EXP) { + x.c = x.e = null; + } else { + x.e = e; + x.c = [v]; + } + + return; + } + + str = String(v); + } else { + + if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum); + + x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1; + } + + // Decimal point? + if ((e = str.indexOf('.')) > -1) str = str.replace('.', ''); + + // Exponential form? + if ((i = str.search(/e/i)) > 0) { + + // Determine exponent. + if (e < 0) e = i; + e += +str.slice(i + 1); + str = str.substring(0, i); + } else if (e < 0) { + + // Integer. + e = str.length; + } + + } else { + + // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}' + intCheck(b, 2, ALPHABET.length, 'Base'); + + // Allow exponential notation to be used with base 10 argument, while + // also rounding to DECIMAL_PLACES as with other bases. + if (b == 10 && alphabetHasNormalDecimalDigits) { + x = new BigNumber(v); + return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE); + } + + str = String(v); + + if (isNum = typeof v == 'number') { + + // Avoid potential interpretation of Infinity and NaN as base 44+ values. + if (v * 0 != 0) return parseNumeric(x, str, isNum, b); + + x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1; + + // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}' + if (BigNumber.DEBUG && str.replace(/^0\.0*|\./, '').length > 15) { + throw Error + (tooManyDigits + v); + } + } else { + x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1; + } + + alphabet = ALPHABET.slice(0, b); + e = i = 0; + + // Check that str is a valid base b number. + // Don't use RegExp, so alphabet can contain special characters. + for (len = str.length; i < len; i++) { + if (alphabet.indexOf(c = str.charAt(i)) < 0) { + if (c == '.') { + + // If '.' is not the first character and it has not be found before. + if (i > e) { + e = len; + continue; + } + } else if (!caseChanged) { + + // Allow e.g. hexadecimal 'FF' as well as 'ff'. + if (str == str.toUpperCase() && (str = str.toLowerCase()) || + str == str.toLowerCase() && (str = str.toUpperCase())) { + caseChanged = true; + i = -1; + e = 0; + continue; + } + } + + return parseNumeric(x, String(v), isNum, b); + } + } + + // Prevent later check for length on converted number. + isNum = false; + str = convertBase(str, b, 10, x.s); + + // Decimal point? + if ((e = str.indexOf('.')) > -1) str = str.replace('.', ''); + else e = str.length; + } + + // Determine leading zeros. + for (i = 0; str.charCodeAt(i) === 48; i++); + + // Determine trailing zeros. + for (len = str.length; str.charCodeAt(--len) === 48;); + + if (str = str.slice(i, ++len)) { + len -= i; + + // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}' + if (isNum && BigNumber.DEBUG && + len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) { + throw Error + (tooManyDigits + (x.s * v)); + } + + // Overflow? + if ((e = e - i - 1) > MAX_EXP) { + + // Infinity. + x.c = x.e = null; + + // Underflow? + } else if (e < MIN_EXP) { + + // Zero. + x.c = [x.e = 0]; + } else { + x.e = e; + x.c = []; + + // Transform base + + // e is the base 10 exponent. + // i is where to slice str to get the first element of the coefficient array. + i = (e + 1) % LOG_BASE; + if (e < 0) i += LOG_BASE; // i < 1 + + if (i < len) { + if (i) x.c.push(+str.slice(0, i)); + + for (len -= LOG_BASE; i < len;) { + x.c.push(+str.slice(i, i += LOG_BASE)); + } + + i = LOG_BASE - (str = str.slice(i)).length; + } else { + i -= len; + } + + for (; i--; str += '0'); + x.c.push(+str); + } + } else { + + // Zero. + x.c = [x.e = 0]; + } + } + + + // CONSTRUCTOR PROPERTIES + + + BigNumber.clone = clone; + + BigNumber.ROUND_UP = 0; + BigNumber.ROUND_DOWN = 1; + BigNumber.ROUND_CEIL = 2; + BigNumber.ROUND_FLOOR = 3; + BigNumber.ROUND_HALF_UP = 4; + BigNumber.ROUND_HALF_DOWN = 5; + BigNumber.ROUND_HALF_EVEN = 6; + BigNumber.ROUND_HALF_CEIL = 7; + BigNumber.ROUND_HALF_FLOOR = 8; + BigNumber.EUCLID = 9; + + + /* + * Configure infrequently-changing library-wide settings. + * + * Accept an object with the following optional properties (if the value of a property is + * a number, it must be an integer within the inclusive range stated): + * + * DECIMAL_PLACES {number} 0 to MAX + * ROUNDING_MODE {number} 0 to 8 + * EXPONENTIAL_AT {number|number[]} -MAX to MAX or [-MAX to 0, 0 to MAX] + * RANGE {number|number[]} -MAX to MAX (not zero) or [-MAX to -1, 1 to MAX] + * CRYPTO {boolean} true or false + * MODULO_MODE {number} 0 to 9 + * POW_PRECISION {number} 0 to MAX + * ALPHABET {string} A string of two or more unique characters which does + * not contain '.'. + * FORMAT {object} An object with some of the following properties: + * prefix {string} + * groupSize {number} + * secondaryGroupSize {number} + * groupSeparator {string} + * decimalSeparator {string} + * fractionGroupSize {number} + * fractionGroupSeparator {string} + * suffix {string} + * + * (The values assigned to the above FORMAT object properties are not checked for validity.) + * + * E.g. + * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 }) + * + * Ignore properties/parameters set to null or undefined, except for ALPHABET. + * + * Return an object with the properties current values. + */ + BigNumber.config = BigNumber.set = function (obj) { + var p, v; + + if (obj != null) { + + if (typeof obj == 'object') { + + // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive. + // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}' + if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) { + v = obj[p]; + intCheck(v, 0, MAX, p); + DECIMAL_PLACES = v; + } + + // ROUNDING_MODE {number} Integer, 0 to 8 inclusive. + // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}' + if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) { + v = obj[p]; + intCheck(v, 0, 8, p); + ROUNDING_MODE = v; + } + + // EXPONENTIAL_AT {number|number[]} + // Integer, -MAX to MAX inclusive or + // [integer -MAX to 0 inclusive, 0 to MAX inclusive]. + // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}' + if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) { + v = obj[p]; + if (v && v.pop) { + intCheck(v[0], -MAX, 0, p); + intCheck(v[1], 0, MAX, p); + TO_EXP_NEG = v[0]; + TO_EXP_POS = v[1]; + } else { + intCheck(v, -MAX, MAX, p); + TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v); + } + } + + // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or + // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive]. + // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}' + if (obj.hasOwnProperty(p = 'RANGE')) { + v = obj[p]; + if (v && v.pop) { + intCheck(v[0], -MAX, -1, p); + intCheck(v[1], 1, MAX, p); + MIN_EXP = v[0]; + MAX_EXP = v[1]; + } else { + intCheck(v, -MAX, MAX, p); + if (v) { + MIN_EXP = -(MAX_EXP = v < 0 ? -v : v); + } else { + throw Error + (bignumberError + p + ' cannot be zero: ' + v); + } + } + } + + // CRYPTO {boolean} true or false. + // '[BigNumber Error] CRYPTO not true or false: {v}' + // '[BigNumber Error] crypto unavailable' + if (obj.hasOwnProperty(p = 'CRYPTO')) { + v = obj[p]; + if (v === !!v) { + if (v) { + if (typeof crypto != 'undefined' && crypto && + (crypto.getRandomValues || crypto.randomBytes)) { + CRYPTO = v; + } else { + CRYPTO = !v; + throw Error + (bignumberError + 'crypto unavailable'); + } + } else { + CRYPTO = v; + } + } else { + throw Error + (bignumberError + p + ' not true or false: ' + v); + } + } + + // MODULO_MODE {number} Integer, 0 to 9 inclusive. + // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}' + if (obj.hasOwnProperty(p = 'MODULO_MODE')) { + v = obj[p]; + intCheck(v, 0, 9, p); + MODULO_MODE = v; + } + + // POW_PRECISION {number} Integer, 0 to MAX inclusive. + // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}' + if (obj.hasOwnProperty(p = 'POW_PRECISION')) { + v = obj[p]; + intCheck(v, 0, MAX, p); + POW_PRECISION = v; + } + + // FORMAT {object} + // '[BigNumber Error] FORMAT not an object: {v}' + if (obj.hasOwnProperty(p = 'FORMAT')) { + v = obj[p]; + if (typeof v == 'object') FORMAT = v; + else throw Error + (bignumberError + p + ' not an object: ' + v); + } + + // ALPHABET {string} + // '[BigNumber Error] ALPHABET invalid: {v}' + if (obj.hasOwnProperty(p = 'ALPHABET')) { + v = obj[p]; + + // Disallow if less than two characters, + // or if it contains '+', '-', '.', whitespace, or a repeated character. + if (typeof v == 'string' && !/^.?$|[+\-.\s]|(.).*\1/.test(v)) { + alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789'; + ALPHABET = v; + } else { + throw Error + (bignumberError + p + ' invalid: ' + v); + } + } + + } else { + + // '[BigNumber Error] Object expected: {v}' + throw Error + (bignumberError + 'Object expected: ' + obj); + } + } + + return { + DECIMAL_PLACES: DECIMAL_PLACES, + ROUNDING_MODE: ROUNDING_MODE, + EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS], + RANGE: [MIN_EXP, MAX_EXP], + CRYPTO: CRYPTO, + MODULO_MODE: MODULO_MODE, + POW_PRECISION: POW_PRECISION, + FORMAT: FORMAT, + ALPHABET: ALPHABET + }; + }; + + + /* + * Return true if v is a BigNumber instance, otherwise return false. + * + * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed. + * + * v {any} + * + * '[BigNumber Error] Invalid BigNumber: {v}' + */ + BigNumber.isBigNumber = function (v) { + if (!v || v._isBigNumber !== true) return false; + if (!BigNumber.DEBUG) return true; + + var i, n, + c = v.c, + e = v.e, + s = v.s; + + out: if ({}.toString.call(c) == '[object Array]') { + + if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) { + + // If the first element is zero, the BigNumber value must be zero. + if (c[0] === 0) { + if (e === 0 && c.length === 1) return true; + break out; + } + + // Calculate number of digits that c[0] should have, based on the exponent. + i = (e + 1) % LOG_BASE; + if (i < 1) i += LOG_BASE; + + // Calculate number of digits of c[0]. + //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) { + if (String(c[0]).length == i) { + + for (i = 0; i < c.length; i++) { + n = c[i]; + if (n < 0 || n >= BASE || n !== mathfloor(n)) break out; + } + + // Last element cannot be zero, unless it is the only element. + if (n !== 0) return true; + } + } + + // Infinity/NaN + } else if (c === null && e === null && (s === null || s === 1 || s === -1)) { + return true; + } + + throw Error + (bignumberError + 'Invalid BigNumber: ' + v); + }; + + + /* + * Return a new BigNumber whose value is the maximum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.maximum = BigNumber.max = function () { + return maxOrMin(arguments, -1); + }; + + + /* + * Return a new BigNumber whose value is the minimum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.minimum = BigNumber.min = function () { + return maxOrMin(arguments, 1); + }; + + + /* + * Return a new BigNumber with a random value equal to or greater than 0 and less than 1, + * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing + * zeros are produced). + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}' + * '[BigNumber Error] crypto unavailable' + */ + BigNumber.random = (function () { + var pow2_53 = 0x20000000000000; + + // Return a 53 bit integer n, where 0 <= n < 9007199254740992. + // Check if Math.random() produces more than 32 bits of randomness. + // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits. + // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1. + var random53bitInt = (Math.random() * pow2_53) & 0x1fffff + ? function () { return mathfloor(Math.random() * pow2_53); } + : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) + + (Math.random() * 0x800000 | 0); }; + + return function (dp) { + var a, b, e, k, v, + i = 0, + c = [], + rand = new BigNumber(ONE); + + if (dp == null) dp = DECIMAL_PLACES; + else intCheck(dp, 0, MAX); + + k = mathceil(dp / LOG_BASE); + + if (CRYPTO) { + + // Browsers supporting crypto.getRandomValues. + if (crypto.getRandomValues) { + + a = crypto.getRandomValues(new Uint32Array(k *= 2)); + + for (; i < k;) { + + // 53 bits: + // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2) + // 11111 11111111 11111111 11111111 11100000 00000000 00000000 + // ((Math.pow(2, 32) - 1) >>> 11).toString(2) + // 11111 11111111 11111111 + // 0x20000 is 2^21. + v = a[i] * 0x20000 + (a[i + 1] >>> 11); + + // Rejection sampling: + // 0 <= v < 9007199254740992 + // Probability that v >= 9e15, is + // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251 + if (v >= 9e15) { + b = crypto.getRandomValues(new Uint32Array(2)); + a[i] = b[0]; + a[i + 1] = b[1]; + } else { + + // 0 <= v <= 8999999999999999 + // 0 <= (v % 1e14) <= 99999999999999 + c.push(v % 1e14); + i += 2; + } + } + i = k / 2; + + // Node.js supporting crypto.randomBytes. + } else if (crypto.randomBytes) { + + // buffer + a = crypto.randomBytes(k *= 7); + + for (; i < k;) { + + // 0x1000000000000 is 2^48, 0x10000000000 is 2^40 + // 0x100000000 is 2^32, 0x1000000 is 2^24 + // 11111 11111111 11111111 11111111 11111111 11111111 11111111 + // 0 <= v < 9007199254740992 + v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) + + (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) + + (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6]; + + if (v >= 9e15) { + crypto.randomBytes(7).copy(a, i); + } else { + + // 0 <= (v % 1e14) <= 99999999999999 + c.push(v % 1e14); + i += 7; + } + } + i = k / 7; + } else { + CRYPTO = false; + throw Error + (bignumberError + 'crypto unavailable'); + } + } + + // Use Math.random. + if (!CRYPTO) { + + for (; i < k;) { + v = random53bitInt(); + if (v < 9e15) c[i++] = v % 1e14; + } + } + + k = c[--i]; + dp %= LOG_BASE; + + // Convert trailing digits to zeros according to dp. + if (k && dp) { + v = POWS_TEN[LOG_BASE - dp]; + c[i] = mathfloor(k / v) * v; + } + + // Remove trailing elements which are zero. + for (; c[i] === 0; c.pop(), i--); + + // Zero? + if (i < 0) { + c = [e = 0]; + } else { + + // Remove leading elements which are zero and adjust exponent accordingly. + for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE); + + // Count the digits of the first element of c to determine leading zeros, and... + for (i = 1, v = c[0]; v >= 10; v /= 10, i++); + + // adjust the exponent accordingly. + if (i < LOG_BASE) e -= LOG_BASE - i; + } + + rand.e = e; + rand.c = c; + return rand; + }; + })(); + + + /* + * Return a BigNumber whose value is the sum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.sum = function () { + var i = 1, + args = arguments, + sum = new BigNumber(args[0]); + for (; i < args.length;) sum = sum.plus(args[i++]); + return sum; + }; + + + // PRIVATE FUNCTIONS + + + // Called by BigNumber and BigNumber.prototype.toString. + convertBase = (function () { + var decimal = '0123456789'; + + /* + * Convert string of baseIn to an array of numbers of baseOut. + * Eg. toBaseOut('255', 10, 16) returns [15, 15]. + * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5]. + */ + function toBaseOut(str, baseIn, baseOut, alphabet) { + var j, + arr = [0], + arrL, + i = 0, + len = str.length; + + for (; i < len;) { + for (arrL = arr.length; arrL--; arr[arrL] *= baseIn); + + arr[0] += alphabet.indexOf(str.charAt(i++)); + + for (j = 0; j < arr.length; j++) { + + if (arr[j] > baseOut - 1) { + if (arr[j + 1] == null) arr[j + 1] = 0; + arr[j + 1] += arr[j] / baseOut | 0; + arr[j] %= baseOut; + } + } + } + + return arr.reverse(); + } + + // Convert a numeric string of baseIn to a numeric string of baseOut. + // If the caller is toString, we are converting from base 10 to baseOut. + // If the caller is BigNumber, we are converting from baseIn to base 10. + return function (str, baseIn, baseOut, sign, callerIsToString) { + var alphabet, d, e, k, r, x, xc, y, + i = str.indexOf('.'), + dp = DECIMAL_PLACES, + rm = ROUNDING_MODE; + + // Non-integer. + if (i >= 0) { + k = POW_PRECISION; + + // Unlimited precision. + POW_PRECISION = 0; + str = str.replace('.', ''); + y = new BigNumber(baseIn); + x = y.pow(str.length - i); + POW_PRECISION = k; + + // Convert str as if an integer, then restore the fraction part by dividing the + // result by its base raised to a power. + + y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'), + 10, baseOut, decimal); + y.e = y.c.length; + } + + // Convert the number as integer. + + xc = toBaseOut(str, baseIn, baseOut, callerIsToString + ? (alphabet = ALPHABET, decimal) + : (alphabet = decimal, ALPHABET)); + + // xc now represents str as an integer and converted to baseOut. e is the exponent. + e = k = xc.length; + + // Remove trailing zeros. + for (; xc[--k] == 0; xc.pop()); + + // Zero? + if (!xc[0]) return alphabet.charAt(0); + + // Does str represent an integer? If so, no need for the division. + if (i < 0) { + --e; + } else { + x.c = xc; + x.e = e; + + // The sign is needed for correct rounding. + x.s = sign; + x = div(x, y, dp, rm, baseOut); + xc = x.c; + r = x.r; + e = x.e; + } + + // xc now represents str converted to baseOut. + + // THe index of the rounding digit. + d = e + dp + 1; + + // The rounding digit: the digit to the right of the digit that may be rounded up. + i = xc[d]; + + // Look at the rounding digits and mode to determine whether to round up. + + k = baseOut / 2; + r = r || d < 0 || xc[d + 1] != null; + + r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) + : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 || + rm == (x.s < 0 ? 8 : 7)); + + // If the index of the rounding digit is not greater than zero, or xc represents + // zero, then the result of the base conversion is zero or, if rounding up, a value + // such as 0.00001. + if (d < 1 || !xc[0]) { + + // 1^-dp or 0 + str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0); + } else { + + // Truncate xc to the required number of decimal places. + xc.length = d; + + // Round up? + if (r) { + + // Rounding up may mean the previous digit has to be rounded up and so on. + for (--baseOut; ++xc[--d] > baseOut;) { + xc[d] = 0; + + if (!d) { + ++e; + xc = [1].concat(xc); + } + } + } + + // Determine trailing zeros. + for (k = xc.length; !xc[--k];); + + // E.g. [4, 11, 15] becomes 4bf. + for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++])); + + // Add leading zeros, decimal point and trailing zeros as required. + str = toFixedPoint(str, e, alphabet.charAt(0)); + } + + // The caller will add the sign. + return str; + }; + })(); + + + // Perform division in the specified base. Called by div and convertBase. + div = (function () { + + // Assume non-zero x and k. + function multiply(x, k, base) { + var m, temp, xlo, xhi, + carry = 0, + i = x.length, + klo = k % SQRT_BASE, + khi = k / SQRT_BASE | 0; + + for (x = x.slice(); i--;) { + xlo = x[i] % SQRT_BASE; + xhi = x[i] / SQRT_BASE | 0; + m = khi * xlo + xhi * klo; + temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry; + carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi; + x[i] = temp % base; + } + + if (carry) x = [carry].concat(x); + + return x; + } + + function compare(a, b, aL, bL) { + var i, cmp; + + if (aL != bL) { + cmp = aL > bL ? 1 : -1; + } else { + + for (i = cmp = 0; i < aL; i++) { + + if (a[i] != b[i]) { + cmp = a[i] > b[i] ? 1 : -1; + break; + } + } + } + + return cmp; + } + + function subtract(a, b, aL, base) { + var i = 0; + + // Subtract b from a. + for (; aL--;) { + a[aL] -= i; + i = a[aL] < b[aL] ? 1 : 0; + a[aL] = i * base + a[aL] - b[aL]; + } + + // Remove leading zeros. + for (; !a[0] && a.length > 1; a.splice(0, 1)); + } + + // x: dividend, y: divisor. + return function (x, y, dp, rm, base) { + var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0, + yL, yz, + s = x.s == y.s ? 1 : -1, + xc = x.c, + yc = y.c; + + // Either NaN, Infinity or 0? + if (!xc || !xc[0] || !yc || !yc[0]) { + + return new BigNumber( + + // Return NaN if either NaN, or both Infinity or 0. + !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN : + + // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0. + xc && xc[0] == 0 || !yc ? s * 0 : s / 0 + ); + } + + q = new BigNumber(s); + qc = q.c = []; + e = x.e - y.e; + s = dp + e + 1; + + if (!base) { + base = BASE; + e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE); + s = s / LOG_BASE | 0; + } + + // Result exponent may be one less then the current value of e. + // The coefficients of the BigNumbers from convertBase may have trailing zeros. + for (i = 0; yc[i] == (xc[i] || 0); i++); + + if (yc[i] > (xc[i] || 0)) e--; + + if (s < 0) { + qc.push(1); + more = true; + } else { + xL = xc.length; + yL = yc.length; + i = 0; + s += 2; + + // Normalise xc and yc so highest order digit of yc is >= base / 2. + + n = mathfloor(base / (yc[0] + 1)); + + // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1. + // if (n > 1 || n++ == 1 && yc[0] < base / 2) { + if (n > 1) { + yc = multiply(yc, n, base); + xc = multiply(xc, n, base); + yL = yc.length; + xL = xc.length; + } + + xi = yL; + rem = xc.slice(0, yL); + remL = rem.length; + + // Add zeros to make remainder as long as divisor. + for (; remL < yL; rem[remL++] = 0); + yz = yc.slice(); + yz = [0].concat(yz); + yc0 = yc[0]; + if (yc[1] >= base / 2) yc0++; + // Not necessary, but to prevent trial digit n > base, when using base 3. + // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15; + + do { + n = 0; + + // Compare divisor and remainder. + cmp = compare(yc, rem, yL, remL); + + // If divisor < remainder. + if (cmp < 0) { + + // Calculate trial digit, n. + + rem0 = rem[0]; + if (yL != remL) rem0 = rem0 * base + (rem[1] || 0); + + // n is how many times the divisor goes into the current remainder. + n = mathfloor(rem0 / yc0); + + // Algorithm: + // product = divisor multiplied by trial digit (n). + // Compare product and remainder. + // If product is greater than remainder: + // Subtract divisor from product, decrement trial digit. + // Subtract product from remainder. + // If product was less than remainder at the last compare: + // Compare new remainder and divisor. + // If remainder is greater than divisor: + // Subtract divisor from remainder, increment trial digit. + + if (n > 1) { + + // n may be > base only when base is 3. + if (n >= base) n = base - 1; + + // product = divisor * trial digit. + prod = multiply(yc, n, base); + prodL = prod.length; + remL = rem.length; + + // Compare product and remainder. + // If product > remainder then trial digit n too high. + // n is 1 too high about 5% of the time, and is not known to have + // ever been more than 1 too high. + while (compare(prod, rem, prodL, remL) == 1) { + n--; + + // Subtract divisor from product. + subtract(prod, yL < prodL ? yz : yc, prodL, base); + prodL = prod.length; + cmp = 1; + } + } else { + + // n is 0 or 1, cmp is -1. + // If n is 0, there is no need to compare yc and rem again below, + // so change cmp to 1 to avoid it. + // If n is 1, leave cmp as -1, so yc and rem are compared again. + if (n == 0) { + + // divisor < remainder, so n must be at least 1. + cmp = n = 1; + } + + // product = divisor + prod = yc.slice(); + prodL = prod.length; + } + + if (prodL < remL) prod = [0].concat(prod); + + // Subtract product from remainder. + subtract(rem, prod, remL, base); + remL = rem.length; + + // If product was < remainder. + if (cmp == -1) { + + // Compare divisor and new remainder. + // If divisor < new remainder, subtract divisor from remainder. + // Trial digit n too low. + // n is 1 too low about 5% of the time, and very rarely 2 too low. + while (compare(yc, rem, yL, remL) < 1) { + n++; + + // Subtract divisor from remainder. + subtract(rem, yL < remL ? yz : yc, remL, base); + remL = rem.length; + } + } + } else if (cmp === 0) { + n++; + rem = [0]; + } // else cmp === 1 and n will be 0 + + // Add the next digit, n, to the result array. + qc[i++] = n; + + // Update the remainder. + if (rem[0]) { + rem[remL++] = xc[xi] || 0; + } else { + rem = [xc[xi]]; + remL = 1; + } + } while ((xi++ < xL || rem[0] != null) && s--); + + more = rem[0] != null; + + // Leading zero? + if (!qc[0]) qc.splice(0, 1); + } + + if (base == BASE) { + + // To calculate q.e, first get the number of digits of qc[0]. + for (i = 1, s = qc[0]; s >= 10; s /= 10, i++); + + round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more); + + // Caller is convertBase. + } else { + q.e = e; + q.r = +more; + } + + return q; + }; + })(); + + + /* + * Return a string representing the value of BigNumber n in fixed-point or exponential + * notation rounded to the specified decimal places or significant digits. + * + * n: a BigNumber. + * i: the index of the last digit required (i.e. the digit that may be rounded up). + * rm: the rounding mode. + * id: 1 (toExponential) or 2 (toPrecision). + */ + function format(n, i, rm, id) { + var c0, e, ne, len, str; + + if (rm == null) rm = ROUNDING_MODE; + else intCheck(rm, 0, 8); + + if (!n.c) return n.toString(); + + c0 = n.c[0]; + ne = n.e; + + if (i == null) { + str = coeffToString(n.c); + str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS) + ? toExponential(str, ne) + : toFixedPoint(str, ne, '0'); + } else { + n = round(new BigNumber(n), i, rm); + + // n.e may have changed if the value was rounded up. + e = n.e; + + str = coeffToString(n.c); + len = str.length; + + // toPrecision returns exponential notation if the number of significant digits + // specified is less than the number of digits necessary to represent the integer + // part of the value in fixed-point notation. + + // Exponential notation. + if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) { + + // Append zeros? + for (; len < i; str += '0', len++); + str = toExponential(str, e); + + // Fixed-point notation. + } else { + i -= ne; + str = toFixedPoint(str, e, '0'); + + // Append zeros? + if (e + 1 > len) { + if (--i > 0) for (str += '.'; i--; str += '0'); + } else { + i += e - len; + if (i > 0) { + if (e + 1 == len) str += '.'; + for (; i--; str += '0'); + } + } + } + } + + return n.s < 0 && c0 ? '-' + str : str; + } + + + // Handle BigNumber.max and BigNumber.min. + // If any number is NaN, return NaN. + function maxOrMin(args, n) { + var k, y, + i = 1, + x = new BigNumber(args[0]); + + for (; i < args.length; i++) { + y = new BigNumber(args[i]); + if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) { + x = y; + } + } + + return x; + } + + + /* + * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP. + * Called by minus, plus and times. + */ + function normalise(n, c, e) { + var i = 1, + j = c.length; + + // Remove trailing zeros. + for (; !c[--j]; c.pop()); + + // Calculate the base 10 exponent. First get the number of digits of c[0]. + for (j = c[0]; j >= 10; j /= 10, i++); + + // Overflow? + if ((e = i + e * LOG_BASE - 1) > MAX_EXP) { + + // Infinity. + n.c = n.e = null; + + // Underflow? + } else if (e < MIN_EXP) { + + // Zero. + n.c = [n.e = 0]; + } else { + n.e = e; + n.c = c; + } + + return n; + } + + + // Handle values that fail the validity test in BigNumber. + parseNumeric = (function () { + var basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i, + dotAfter = /^([^.]+)\.$/, + dotBefore = /^\.([^.]+)$/, + isInfinityOrNaN = /^-?(Infinity|NaN)$/, + whitespaceOrPlus = /^\s*\+(?=[\w.])|^\s+|\s+$/g; + + return function (x, str, isNum, b) { + var base, + s = isNum ? str : str.replace(whitespaceOrPlus, ''); + + // No exception on ±Infinity or NaN. + if (isInfinityOrNaN.test(s)) { + x.s = isNaN(s) ? null : s < 0 ? -1 : 1; + } else { + if (!isNum) { + + // basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i + s = s.replace(basePrefix, function (m, p1, p2) { + base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8; + return !b || b == base ? p1 : m; + }); + + if (b) { + base = b; + + // E.g. '1.' to '1', '.1' to '0.1' + s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1'); + } + + if (str != s) return new BigNumber(s, base); + } + + // '[BigNumber Error] Not a number: {n}' + // '[BigNumber Error] Not a base {b} number: {n}' + if (BigNumber.DEBUG) { + throw Error + (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str); + } + + // NaN + x.s = null; + } + + x.c = x.e = null; + } + })(); + + + /* + * Round x to sd significant digits using rounding mode rm. Check for over/under-flow. + * If r is truthy, it is known that there are more digits after the rounding digit. + */ + function round(x, sd, rm, r) { + var d, i, j, k, n, ni, rd, + xc = x.c, + pows10 = POWS_TEN; + + // if x is not Infinity or NaN... + if (xc) { + + // rd is the rounding digit, i.e. the digit after the digit that may be rounded up. + // n is a base 1e14 number, the value of the element of array x.c containing rd. + // ni is the index of n within x.c. + // d is the number of digits of n. + // i is the index of rd within n including leading zeros. + // j is the actual index of rd within n (if < 0, rd is a leading zero). + out: { + + // Get the number of digits of the first element of xc. + for (d = 1, k = xc[0]; k >= 10; k /= 10, d++); + i = sd - d; + + // If the rounding digit is in the first element of xc... + if (i < 0) { + i += LOG_BASE; + j = sd; + n = xc[ni = 0]; + + // Get the rounding digit at index j of n. + rd = mathfloor(n / pows10[d - j - 1] % 10); + } else { + ni = mathceil((i + 1) / LOG_BASE); + + if (ni >= xc.length) { + + if (r) { + + // Needed by sqrt. + for (; xc.length <= ni; xc.push(0)); + n = rd = 0; + d = 1; + i %= LOG_BASE; + j = i - LOG_BASE + 1; + } else { + break out; + } + } else { + n = k = xc[ni]; + + // Get the number of digits of n. + for (d = 1; k >= 10; k /= 10, d++); + + // Get the index of rd within n. + i %= LOG_BASE; + + // Get the index of rd within n, adjusted for leading zeros. + // The number of leading zeros of n is given by LOG_BASE - d. + j = i - LOG_BASE + d; + + // Get the rounding digit at index j of n. + rd = j < 0 ? 0 : mathfloor(n / pows10[d - j - 1] % 10); + } + } + + r = r || sd < 0 || + + // Are there any non-zero digits after the rounding digit? + // The expression n % pows10[d - j - 1] returns all digits of n to the right + // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714. + xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]); + + r = rm < 4 + ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) + : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 && + + // Check whether the digit to the left of the rounding digit is odd. + ((i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 || + rm == (x.s < 0 ? 8 : 7)); + + if (sd < 1 || !xc[0]) { + xc.length = 0; + + if (r) { + + // Convert sd to decimal places. + sd -= x.e + 1; + + // 1, 0.1, 0.01, 0.001, 0.0001 etc. + xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE]; + x.e = -sd || 0; + } else { + + // Zero. + xc[0] = x.e = 0; + } + + return x; + } + + // Remove excess digits. + if (i == 0) { + xc.length = ni; + k = 1; + ni--; + } else { + xc.length = ni + 1; + k = pows10[LOG_BASE - i]; + + // E.g. 56700 becomes 56000 if 7 is the rounding digit. + // j > 0 means i > number of leading zeros of n. + xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0; + } + + // Round up? + if (r) { + + for (; ;) { + + // If the digit to be rounded up is in the first element of xc... + if (ni == 0) { + + // i will be the length of xc[0] before k is added. + for (i = 1, j = xc[0]; j >= 10; j /= 10, i++); + j = xc[0] += k; + for (k = 1; j >= 10; j /= 10, k++); + + // if i != k the length has increased. + if (i != k) { + x.e++; + if (xc[0] == BASE) xc[0] = 1; + } + + break; + } else { + xc[ni] += k; + if (xc[ni] != BASE) break; + xc[ni--] = 0; + k = 1; + } + } + } + + // Remove trailing zeros. + for (i = xc.length; xc[--i] === 0; xc.pop()); + } + + // Overflow? Infinity. + if (x.e > MAX_EXP) { + x.c = x.e = null; + + // Underflow? Zero. + } else if (x.e < MIN_EXP) { + x.c = [x.e = 0]; + } + } + + return x; + } + + + function valueOf(n) { + var str, + e = n.e; + + if (e === null) return n.toString(); + + str = coeffToString(n.c); + + str = e <= TO_EXP_NEG || e >= TO_EXP_POS + ? toExponential(str, e) + : toFixedPoint(str, e, '0'); + + return n.s < 0 ? '-' + str : str; + } + + + // PROTOTYPE/INSTANCE METHODS + + + /* + * Return a new BigNumber whose value is the absolute value of this BigNumber. + */ + P.absoluteValue = P.abs = function () { + var x = new BigNumber(this); + if (x.s < 0) x.s = 1; + return x; + }; + + + /* + * Return + * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b), + * -1 if the value of this BigNumber is less than the value of BigNumber(y, b), + * 0 if they have the same value, + * or null if the value of either is NaN. + */ + P.comparedTo = function (y, b) { + return compare(this, new BigNumber(y, b)); + }; + + + /* + * If dp is undefined or null or true or false, return the number of decimal places of the + * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN. + * + * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this + * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or + * ROUNDING_MODE if rm is omitted. + * + * [dp] {number} Decimal places: integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}' + */ + P.decimalPlaces = P.dp = function (dp, rm) { + var c, n, v, + x = this; + + if (dp != null) { + intCheck(dp, 0, MAX); + if (rm == null) rm = ROUNDING_MODE; + else intCheck(rm, 0, 8); + + return round(new BigNumber(x), dp + x.e + 1, rm); + } + + if (!(c = x.c)) return null; + n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE; + + // Subtract the number of trailing zeros of the last number. + if (v = c[v]) for (; v % 10 == 0; v /= 10, n--); + if (n < 0) n = 0; + + return n; + }; + + + /* + * n / 0 = I + * n / N = N + * n / I = 0 + * 0 / n = 0 + * 0 / 0 = N + * 0 / N = N + * 0 / I = 0 + * N / n = N + * N / 0 = N + * N / N = N + * N / I = N + * I / n = I + * I / 0 = I + * I / N = N + * I / I = N + * + * Return a new BigNumber whose value is the value of this BigNumber divided by the value of + * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE. + */ + P.dividedBy = P.div = function (y, b) { + return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE); + }; + + + /* + * Return a new BigNumber whose value is the integer part of dividing the value of this + * BigNumber by the value of BigNumber(y, b). + */ + P.dividedToIntegerBy = P.idiv = function (y, b) { + return div(this, new BigNumber(y, b), 0, 1); + }; + + + /* + * Return a BigNumber whose value is the value of this BigNumber exponentiated by n. + * + * If m is present, return the result modulo m. + * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE. + * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE. + * + * The modular power operation works efficiently when x, n, and m are integers, otherwise it + * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0. + * + * n {number|string|BigNumber} The exponent. An integer. + * [m] {number|string|BigNumber} The modulus. + * + * '[BigNumber Error] Exponent not an integer: {n}' + */ + P.exponentiatedBy = P.pow = function (n, m) { + var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y, + x = this; + + n = new BigNumber(n); + + // Allow NaN and ±Infinity, but not other non-integers. + if (n.c && !n.isInteger()) { + throw Error + (bignumberError + 'Exponent not an integer: ' + valueOf(n)); + } + + if (m != null) m = new BigNumber(m); + + // Exponent of MAX_SAFE_INTEGER is 15. + nIsBig = n.e > 14; + + // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0. + if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) { + + // The sign of the result of pow when x is negative depends on the evenness of n. + // If +n overflows to ±Infinity, the evenness of n would be not be known. + y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? n.s * (2 - isOdd(n)) : +valueOf(n))); + return m ? y.mod(m) : y; + } + + nIsNeg = n.s < 0; + + if (m) { + + // x % m returns NaN if abs(m) is zero, or m is NaN. + if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN); + + isModExp = !nIsNeg && x.isInteger() && m.isInteger(); + + if (isModExp) x = x.mod(m); + + // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15. + // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15. + } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0 + // [1, 240000000] + ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7 + // [80000000000000] [99999750000000] + : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) { + + // If x is negative and n is odd, k = -0, else k = 0. + k = x.s < 0 && isOdd(n) ? -0 : 0; + + // If x >= 1, k = ±Infinity. + if (x.e > -1) k = 1 / k; + + // If n is negative return ±0, else return ±Infinity. + return new BigNumber(nIsNeg ? 1 / k : k); + + } else if (POW_PRECISION) { + + // Truncating each coefficient array to a length of k after each multiplication + // equates to truncating significant digits to POW_PRECISION + [28, 41], + // i.e. there will be a minimum of 28 guard digits retained. + k = mathceil(POW_PRECISION / LOG_BASE + 2); + } + + if (nIsBig) { + half = new BigNumber(0.5); + if (nIsNeg) n.s = 1; + nIsOdd = isOdd(n); + } else { + i = Math.abs(+valueOf(n)); + nIsOdd = i % 2; + } + + y = new BigNumber(ONE); + + // Performs 54 loop iterations for n of 9007199254740991. + for (; ;) { + + if (nIsOdd) { + y = y.times(x); + if (!y.c) break; + + if (k) { + if (y.c.length > k) y.c.length = k; + } else if (isModExp) { + y = y.mod(m); //y = y.minus(div(y, m, 0, MODULO_MODE).times(m)); + } + } + + if (i) { + i = mathfloor(i / 2); + if (i === 0) break; + nIsOdd = i % 2; + } else { + n = n.times(half); + round(n, n.e + 1, 1); + + if (n.e > 14) { + nIsOdd = isOdd(n); + } else { + i = +valueOf(n); + if (i === 0) break; + nIsOdd = i % 2; + } + } + + x = x.times(x); + + if (k) { + if (x.c && x.c.length > k) x.c.length = k; + } else if (isModExp) { + x = x.mod(m); //x = x.minus(div(x, m, 0, MODULO_MODE).times(m)); + } + } + + if (isModExp) return y; + if (nIsNeg) y = ONE.div(y); + + return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer + * using rounding mode rm, or ROUNDING_MODE if rm is omitted. + * + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}' + */ + P.integerValue = function (rm) { + var n = new BigNumber(this); + if (rm == null) rm = ROUNDING_MODE; + else intCheck(rm, 0, 8); + return round(n, n.e + 1, rm); + }; + + + /* + * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b), + * otherwise return false. + */ + P.isEqualTo = P.eq = function (y, b) { + return compare(this, new BigNumber(y, b)) === 0; + }; + + + /* + * Return true if the value of this BigNumber is a finite number, otherwise return false. + */ + P.isFinite = function () { + return !!this.c; + }; + + + /* + * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b), + * otherwise return false. + */ + P.isGreaterThan = P.gt = function (y, b) { + return compare(this, new BigNumber(y, b)) > 0; + }; + + + /* + * Return true if the value of this BigNumber is greater than or equal to the value of + * BigNumber(y, b), otherwise return false. + */ + P.isGreaterThanOrEqualTo = P.gte = function (y, b) { + return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0; + + }; + + + /* + * Return true if the value of this BigNumber is an integer, otherwise return false. + */ + P.isInteger = function () { + return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2; + }; + + + /* + * Return true if the value of this BigNumber is less than the value of BigNumber(y, b), + * otherwise return false. + */ + P.isLessThan = P.lt = function (y, b) { + return compare(this, new BigNumber(y, b)) < 0; + }; + + + /* + * Return true if the value of this BigNumber is less than or equal to the value of + * BigNumber(y, b), otherwise return false. + */ + P.isLessThanOrEqualTo = P.lte = function (y, b) { + return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0; + }; + + + /* + * Return true if the value of this BigNumber is NaN, otherwise return false. + */ + P.isNaN = function () { + return !this.s; + }; + + + /* + * Return true if the value of this BigNumber is negative, otherwise return false. + */ + P.isNegative = function () { + return this.s < 0; + }; + + + /* + * Return true if the value of this BigNumber is positive, otherwise return false. + */ + P.isPositive = function () { + return this.s > 0; + }; + + + /* + * Return true if the value of this BigNumber is 0 or -0, otherwise return false. + */ + P.isZero = function () { + return !!this.c && this.c[0] == 0; + }; + + + /* + * n - 0 = n + * n - N = N + * n - I = -I + * 0 - n = -n + * 0 - 0 = 0 + * 0 - N = N + * 0 - I = -I + * N - n = N + * N - 0 = N + * N - N = N + * N - I = N + * I - n = I + * I - 0 = I + * I - N = N + * I - I = N + * + * Return a new BigNumber whose value is the value of this BigNumber minus the value of + * BigNumber(y, b). + */ + P.minus = function (y, b) { + var i, j, t, xLTy, + x = this, + a = x.s; + + y = new BigNumber(y, b); + b = y.s; + + // Either NaN? + if (!a || !b) return new BigNumber(NaN); + + // Signs differ? + if (a != b) { + y.s = -b; + return x.plus(y); + } + + var xe = x.e / LOG_BASE, + ye = y.e / LOG_BASE, + xc = x.c, + yc = y.c; + + if (!xe || !ye) { + + // Either Infinity? + if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN); + + // Either zero? + if (!xc[0] || !yc[0]) { + + // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. + return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x : + + // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity + ROUNDING_MODE == 3 ? -0 : 0); + } + } + + xe = bitFloor(xe); + ye = bitFloor(ye); + xc = xc.slice(); + + // Determine which is the bigger number. + if (a = xe - ye) { + + if (xLTy = a < 0) { + a = -a; + t = xc; + } else { + ye = xe; + t = yc; + } + + t.reverse(); + + // Prepend zeros to equalise exponents. + for (b = a; b--; t.push(0)); + t.reverse(); + } else { + + // Exponents equal. Check digit by digit. + j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b; + + for (a = b = 0; b < j; b++) { + + if (xc[b] != yc[b]) { + xLTy = xc[b] < yc[b]; + break; + } + } + } + + // x < y? Point xc to the array of the bigger number. + if (xLTy) { + t = xc; + xc = yc; + yc = t; + y.s = -y.s; + } + + b = (j = yc.length) - (i = xc.length); + + // Append zeros to xc if shorter. + // No need to add zeros to yc if shorter as subtract only needs to start at yc.length. + if (b > 0) for (; b--; xc[i++] = 0); + b = BASE - 1; + + // Subtract yc from xc. + for (; j > a;) { + + if (xc[--j] < yc[j]) { + for (i = j; i && !xc[--i]; xc[i] = b); + --xc[i]; + xc[j] += BASE; + } + + xc[j] -= yc[j]; + } + + // Remove leading zeros and adjust exponent accordingly. + for (; xc[0] == 0; xc.splice(0, 1), --ye); + + // Zero? + if (!xc[0]) { + + // Following IEEE 754 (2008) 6.3, + // n - n = +0 but n - n = -0 when rounding towards -Infinity. + y.s = ROUNDING_MODE == 3 ? -1 : 1; + y.c = [y.e = 0]; + return y; + } + + // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity + // for finite x and y. + return normalise(y, xc, ye); + }; + + + /* + * n % 0 = N + * n % N = N + * n % I = n + * 0 % n = 0 + * -0 % n = -0 + * 0 % 0 = N + * 0 % N = N + * 0 % I = 0 + * N % n = N + * N % 0 = N + * N % N = N + * N % I = N + * I % n = N + * I % 0 = N + * I % N = N + * I % I = N + * + * Return a new BigNumber whose value is the value of this BigNumber modulo the value of + * BigNumber(y, b). The result depends on the value of MODULO_MODE. + */ + P.modulo = P.mod = function (y, b) { + var q, s, + x = this; + + y = new BigNumber(y, b); + + // Return NaN if x is Infinity or NaN, or y is NaN or zero. + if (!x.c || !y.s || y.c && !y.c[0]) { + return new BigNumber(NaN); + + // Return x if y is Infinity or x is zero. + } else if (!y.c || x.c && !x.c[0]) { + return new BigNumber(x); + } + + if (MODULO_MODE == 9) { + + // Euclidian division: q = sign(y) * floor(x / abs(y)) + // r = x - qy where 0 <= r < abs(y) + s = y.s; + y.s = 1; + q = div(x, y, 0, 3); + y.s = s; + q.s *= s; + } else { + q = div(x, y, 0, MODULO_MODE); + } + + y = x.minus(q.times(y)); + + // To match JavaScript %, ensure sign of zero is sign of dividend. + if (!y.c[0] && MODULO_MODE == 1) y.s = x.s; + + return y; + }; + + + /* + * n * 0 = 0 + * n * N = N + * n * I = I + * 0 * n = 0 + * 0 * 0 = 0 + * 0 * N = N + * 0 * I = N + * N * n = N + * N * 0 = N + * N * N = N + * N * I = N + * I * n = I + * I * 0 = N + * I * N = N + * I * I = I + * + * Return a new BigNumber whose value is the value of this BigNumber multiplied by the value + * of BigNumber(y, b). + */ + P.multipliedBy = P.times = function (y, b) { + var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc, + base, sqrtBase, + x = this, + xc = x.c, + yc = (y = new BigNumber(y, b)).c; + + // Either NaN, ±Infinity or ±0? + if (!xc || !yc || !xc[0] || !yc[0]) { + + // Return NaN if either is NaN, or one is 0 and the other is Infinity. + if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) { + y.c = y.e = y.s = null; + } else { + y.s *= x.s; + + // Return ±Infinity if either is ±Infinity. + if (!xc || !yc) { + y.c = y.e = null; + + // Return ±0 if either is ±0. + } else { + y.c = [0]; + y.e = 0; + } + } + + return y; + } + + e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE); + y.s *= x.s; + xcL = xc.length; + ycL = yc.length; + + // Ensure xc points to longer array and xcL to its length. + if (xcL < ycL) { + zc = xc; + xc = yc; + yc = zc; + i = xcL; + xcL = ycL; + ycL = i; + } + + // Initialise the result array with zeros. + for (i = xcL + ycL, zc = []; i--; zc.push(0)); + + base = BASE; + sqrtBase = SQRT_BASE; + + for (i = ycL; --i >= 0;) { + c = 0; + ylo = yc[i] % sqrtBase; + yhi = yc[i] / sqrtBase | 0; + + for (k = xcL, j = i + k; j > i;) { + xlo = xc[--k] % sqrtBase; + xhi = xc[k] / sqrtBase | 0; + m = yhi * xlo + xhi * ylo; + xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c; + c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi; + zc[j--] = xlo % base; + } + + zc[j] = c; + } + + if (c) { + ++e; + } else { + zc.splice(0, 1); + } + + return normalise(y, zc, e); + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber negated, + * i.e. multiplied by -1. + */ + P.negated = function () { + var x = new BigNumber(this); + x.s = -x.s || null; + return x; + }; + + + /* + * n + 0 = n + * n + N = N + * n + I = I + * 0 + n = n + * 0 + 0 = 0 + * 0 + N = N + * 0 + I = I + * N + n = N + * N + 0 = N + * N + N = N + * N + I = N + * I + n = I + * I + 0 = I + * I + N = N + * I + I = I + * + * Return a new BigNumber whose value is the value of this BigNumber plus the value of + * BigNumber(y, b). + */ + P.plus = function (y, b) { + var t, + x = this, + a = x.s; + + y = new BigNumber(y, b); + b = y.s; + + // Either NaN? + if (!a || !b) return new BigNumber(NaN); + + // Signs differ? + if (a != b) { + y.s = -b; + return x.minus(y); + } + + var xe = x.e / LOG_BASE, + ye = y.e / LOG_BASE, + xc = x.c, + yc = y.c; + + if (!xe || !ye) { + + // Return ±Infinity if either ±Infinity. + if (!xc || !yc) return new BigNumber(a / 0); + + // Either zero? + // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. + if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0); + } + + xe = bitFloor(xe); + ye = bitFloor(ye); + xc = xc.slice(); + + // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts. + if (a = xe - ye) { + if (a > 0) { + ye = xe; + t = yc; + } else { + a = -a; + t = xc; + } + + t.reverse(); + for (; a--; t.push(0)); + t.reverse(); + } + + a = xc.length; + b = yc.length; + + // Point xc to the longer array, and b to the shorter length. + if (a - b < 0) { + t = yc; + yc = xc; + xc = t; + b = a; + } + + // Only start adding at yc.length - 1 as the further digits of xc can be ignored. + for (a = 0; b;) { + a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0; + xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE; + } + + if (a) { + xc = [a].concat(xc); + ++ye; + } + + // No need to check for zero, as +x + +y != 0 && -x + -y != 0 + // ye = MAX_EXP + 1 possible + return normalise(y, xc, ye); + }; + + + /* + * If sd is undefined or null or true or false, return the number of significant digits of + * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN. + * If sd is true include integer-part trailing zeros in the count. + * + * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this + * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or + * ROUNDING_MODE if rm is omitted. + * + * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive. + * boolean: whether to count integer-part trailing zeros: true or false. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}' + */ + P.precision = P.sd = function (sd, rm) { + var c, n, v, + x = this; + + if (sd != null && sd !== !!sd) { + intCheck(sd, 1, MAX); + if (rm == null) rm = ROUNDING_MODE; + else intCheck(rm, 0, 8); + + return round(new BigNumber(x), sd, rm); + } + + if (!(c = x.c)) return null; + v = c.length - 1; + n = v * LOG_BASE + 1; + + if (v = c[v]) { + + // Subtract the number of trailing zeros of the last element. + for (; v % 10 == 0; v /= 10, n--); + + // Add the number of digits of the first element. + for (v = c[0]; v >= 10; v /= 10, n++); + } + + if (sd && x.e + 1 > n) n = x.e + 1; + + return n; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber shifted by k places + * (powers of 10). Shift to the right if n > 0, and to the left if n < 0. + * + * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}' + */ + P.shiftedBy = function (k) { + intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER); + return this.times('1e' + k); + }; + + + /* + * sqrt(-n) = N + * sqrt(N) = N + * sqrt(-I) = N + * sqrt(I) = I + * sqrt(0) = 0 + * sqrt(-0) = -0 + * + * Return a new BigNumber whose value is the square root of the value of this BigNumber, + * rounded according to DECIMAL_PLACES and ROUNDING_MODE. + */ + P.squareRoot = P.sqrt = function () { + var m, n, r, rep, t, + x = this, + c = x.c, + s = x.s, + e = x.e, + dp = DECIMAL_PLACES + 4, + half = new BigNumber('0.5'); + + // Negative/NaN/Infinity/zero? + if (s !== 1 || !c || !c[0]) { + return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0); + } + + // Initial estimate. + s = Math.sqrt(+valueOf(x)); + + // Math.sqrt underflow/overflow? + // Pass x to Math.sqrt as integer, then adjust the exponent of the result. + if (s == 0 || s == 1 / 0) { + n = coeffToString(c); + if ((n.length + e) % 2 == 0) n += '0'; + s = Math.sqrt(+n); + e = bitFloor((e + 1) / 2) - (e < 0 || e % 2); + + if (s == 1 / 0) { + n = '5e' + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf('e') + 1) + e; + } + + r = new BigNumber(n); + } else { + r = new BigNumber(s + ''); + } + + // Check for zero. + // r could be zero if MIN_EXP is changed after the this value was created. + // This would cause a division by zero (x/t) and hence Infinity below, which would cause + // coeffToString to throw. + if (r.c[0]) { + e = r.e; + s = e + dp; + if (s < 3) s = 0; + + // Newton-Raphson iteration. + for (; ;) { + t = r; + r = half.times(t.plus(div(x, t, dp, 1))); + + if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) { + + // The exponent of r may here be one less than the final result exponent, + // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits + // are indexed correctly. + if (r.e < e) --s; + n = n.slice(s - 3, s + 1); + + // The 4th rounding digit may be in error by -1 so if the 4 rounding digits + // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the + // iteration. + if (n == '9999' || !rep && n == '4999') { + + // On the first iteration only, check to see if rounding up gives the + // exact result as the nines may infinitely repeat. + if (!rep) { + round(t, t.e + DECIMAL_PLACES + 2, 0); + + if (t.times(t).eq(x)) { + r = t; + break; + } + } + + dp += 4; + s += 4; + rep = 1; + } else { + + // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact + // result. If not, then there are further digits and m will be truthy. + if (!+n || !+n.slice(1) && n.charAt(0) == '5') { + + // Truncate to the first rounding digit. + round(r, r.e + DECIMAL_PLACES + 2, 1); + m = !r.times(r).eq(x); + } + + break; + } + } + } + } + + return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m); + }; + + + /* + * Return a string representing the value of this BigNumber in exponential notation and + * rounded using ROUNDING_MODE to dp fixed decimal places. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}' + */ + P.toExponential = function (dp, rm) { + if (dp != null) { + intCheck(dp, 0, MAX); + dp++; + } + return format(this, dp, rm, 1); + }; + + + /* + * Return a string representing the value of this BigNumber in fixed-point notation rounding + * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted. + * + * Note: as with JavaScript's number type, (-0).toFixed(0) is '0', + * but e.g. (-0.00001).toFixed(0) is '-0'. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}' + */ + P.toFixed = function (dp, rm) { + if (dp != null) { + intCheck(dp, 0, MAX); + dp = dp + this.e + 1; + } + return format(this, dp, rm); + }; + + + /* + * Return a string representing the value of this BigNumber in fixed-point notation rounded + * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties + * of the format or FORMAT object (see BigNumber.set). + * + * The formatting object may contain some or all of the properties shown below. + * + * FORMAT = { + * prefix: '', + * groupSize: 3, + * secondaryGroupSize: 0, + * groupSeparator: ',', + * decimalSeparator: '.', + * fractionGroupSize: 0, + * fractionGroupSeparator: '\xA0', // non-breaking space + * suffix: '' + * }; + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * [format] {object} Formatting options. See FORMAT pbject above. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}' + * '[BigNumber Error] Argument not an object: {format}' + */ + P.toFormat = function (dp, rm, format) { + var str, + x = this; + + if (format == null) { + if (dp != null && rm && typeof rm == 'object') { + format = rm; + rm = null; + } else if (dp && typeof dp == 'object') { + format = dp; + dp = rm = null; + } else { + format = FORMAT; + } + } else if (typeof format != 'object') { + throw Error + (bignumberError + 'Argument not an object: ' + format); + } + + str = x.toFixed(dp, rm); + + if (x.c) { + var i, + arr = str.split('.'), + g1 = +format.groupSize, + g2 = +format.secondaryGroupSize, + groupSeparator = format.groupSeparator || '', + intPart = arr[0], + fractionPart = arr[1], + isNeg = x.s < 0, + intDigits = isNeg ? intPart.slice(1) : intPart, + len = intDigits.length; + + if (g2) { + i = g1; + g1 = g2; + g2 = i; + len -= i; + } + + if (g1 > 0 && len > 0) { + i = len % g1 || g1; + intPart = intDigits.substr(0, i); + for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1); + if (g2 > 0) intPart += groupSeparator + intDigits.slice(i); + if (isNeg) intPart = '-' + intPart; + } + + str = fractionPart + ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize) + ? fractionPart.replace(new RegExp('\\d{' + g2 + '}\\B', 'g'), + '$&' + (format.fractionGroupSeparator || '')) + : fractionPart) + : intPart; + } + + return (format.prefix || '') + str + (format.suffix || ''); + }; + + + /* + * Return an array of two BigNumbers representing the value of this BigNumber as a simple + * fraction with an integer numerator and an integer denominator. + * The denominator will be a positive non-zero value less than or equal to the specified + * maximum denominator. If a maximum denominator is not specified, the denominator will be + * the lowest value necessary to represent the number exactly. + * + * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator. + * + * '[BigNumber Error] Argument {not an integer|out of range} : {md}' + */ + P.toFraction = function (md) { + var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s, + x = this, + xc = x.c; + + if (md != null) { + n = new BigNumber(md); + + // Throw if md is less than one or is not an integer, unless it is Infinity. + if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) { + throw Error + (bignumberError + 'Argument ' + + (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n)); + } + } + + if (!xc) return new BigNumber(x); + + d = new BigNumber(ONE); + n1 = d0 = new BigNumber(ONE); + d1 = n0 = new BigNumber(ONE); + s = coeffToString(xc); + + // Determine initial denominator. + // d is a power of 10 and the minimum max denominator that specifies the value exactly. + e = d.e = s.length - x.e - 1; + d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp]; + md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n; + + exp = MAX_EXP; + MAX_EXP = 1 / 0; + n = new BigNumber(s); + + // n0 = d1 = 0 + n0.c[0] = 0; + + for (; ;) { + q = div(n, d, 0, 1); + d2 = d0.plus(q.times(d1)); + if (d2.comparedTo(md) == 1) break; + d0 = d1; + d1 = d2; + n1 = n0.plus(q.times(d2 = n1)); + n0 = d2; + d = n.minus(q.times(d2 = d)); + n = d2; + } + + d2 = div(md.minus(d0), d1, 0, 1); + n0 = n0.plus(d2.times(n1)); + d0 = d0.plus(d2.times(d1)); + n0.s = n1.s = x.s; + e = e * 2; + + // Determine which fraction is closer to x, n0/d0 or n1/d1 + r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo( + div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0]; + + MAX_EXP = exp; + + return r; + }; + + + /* + * Return the value of this BigNumber converted to a number primitive. + */ + P.toNumber = function () { + return +valueOf(this); + }; + + + /* + * Return a string representing the value of this BigNumber rounded to sd significant digits + * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits + * necessary to represent the integer part of the value in fixed-point notation, then use + * exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}' + */ + P.toPrecision = function (sd, rm) { + if (sd != null) intCheck(sd, 1, MAX); + return format(this, sd, rm, 2); + }; + + + /* + * Return a string representing the value of this BigNumber in base b, or base 10 if b is + * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and + * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent + * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than + * TO_EXP_NEG, return exponential notation. + * + * [b] {number} Integer, 2 to ALPHABET.length inclusive. + * + * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}' + */ + P.toString = function (b) { + var str, + n = this, + s = n.s, + e = n.e; + + // Infinity or NaN? + if (e === null) { + if (s) { + str = 'Infinity'; + if (s < 0) str = '-' + str; + } else { + str = 'NaN'; + } + } else { + if (b == null) { + str = e <= TO_EXP_NEG || e >= TO_EXP_POS + ? toExponential(coeffToString(n.c), e) + : toFixedPoint(coeffToString(n.c), e, '0'); + } else if (b === 10 && alphabetHasNormalDecimalDigits) { + n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE); + str = toFixedPoint(coeffToString(n.c), n.e, '0'); + } else { + intCheck(b, 2, ALPHABET.length, 'Base'); + str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true); + } + + if (s < 0 && n.c[0]) str = '-' + str; + } + + return str; + }; + + + /* + * Return as toString, but do not accept a base argument, and include the minus sign for + * negative zero. + */ + P.valueOf = P.toJSON = function () { + return valueOf(this); + }; + + + P._isBigNumber = true; + + if (configObject != null) BigNumber.set(configObject); + + return BigNumber; + } + + + // PRIVATE HELPER FUNCTIONS + + // These functions don't need access to variables, + // e.g. DECIMAL_PLACES, in the scope of the `clone` function above. + + + function bitFloor(n) { + var i = n | 0; + return n > 0 || n === i ? i : i - 1; + } + + + // Return a coefficient array as a string of base 10 digits. + function coeffToString(a) { + var s, z, + i = 1, + j = a.length, + r = a[0] + ''; + + for (; i < j;) { + s = a[i++] + ''; + z = LOG_BASE - s.length; + for (; z--; s = '0' + s); + r += s; + } + + // Determine trailing zeros. + for (j = r.length; r.charCodeAt(--j) === 48;); + + return r.slice(0, j + 1 || 1); + } + + + // Compare the value of BigNumbers x and y. + function compare(x, y) { + var a, b, + xc = x.c, + yc = y.c, + i = x.s, + j = y.s, + k = x.e, + l = y.e; + + // Either NaN? + if (!i || !j) return null; + + a = xc && !xc[0]; + b = yc && !yc[0]; + + // Either zero? + if (a || b) return a ? b ? 0 : -j : i; + + // Signs differ? + if (i != j) return i; + + a = i < 0; + b = k == l; + + // Either Infinity? + if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1; + + // Compare exponents. + if (!b) return k > l ^ a ? 1 : -1; + + j = (k = xc.length) < (l = yc.length) ? k : l; + + // Compare digit by digit. + for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1; + + // Compare lengths. + return k == l ? 0 : k > l ^ a ? 1 : -1; + } + + + /* + * Check that n is a primitive number, an integer, and in range, otherwise throw. + */ + function intCheck(n, min, max, name) { + if (n < min || n > max || n !== mathfloor(n)) { + throw Error + (bignumberError + (name || 'Argument') + (typeof n == 'number' + ? n < min || n > max ? ' out of range: ' : ' not an integer: ' + : ' not a primitive number: ') + String(n)); + } + } + + + // Assumes finite n. + function isOdd(n) { + var k = n.c.length - 1; + return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0; + } + + + function toExponential(str, e) { + return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) + + (e < 0 ? 'e' : 'e+') + e; + } + + + function toFixedPoint(str, e, z) { + var len, zs; + + // Negative exponent? + if (e < 0) { + + // Prepend zeros. + for (zs = z + '.'; ++e; zs += z); + str = zs + str; + + // Positive exponent + } else { + len = str.length; + + // Append zeros. + if (++e > len) { + for (zs = z, e -= len; --e; zs += z); + str += zs; + } else if (e < len) { + str = str.slice(0, e) + '.' + str.slice(e); + } + } + + return str; + } + + + // EXPORT + + + BigNumber = clone(); + BigNumber['default'] = BigNumber.BigNumber = BigNumber; + + // AMD. + if (typeof define == 'function' && define.amd) { + define(function () { return BigNumber; }); + + // Node.js and other environments that support module.exports. + } else if (typeof module != 'undefined' && module.exports) { + module.exports = BigNumber; + + // Browser. + } else { + if (!globalObject) { + globalObject = typeof self != 'undefined' && self ? self : window; + } + + globalObject.BigNumber = BigNumber; + } +})(this); diff --git a/node/node_modules/bignumber.js/bignumber.mjs b/node/node_modules/bignumber.js/bignumber.mjs new file mode 100644 index 0000000..f154015 --- /dev/null +++ b/node/node_modules/bignumber.js/bignumber.mjs @@ -0,0 +1,2907 @@ +/* + * bignumber.js v9.1.2 + * A JavaScript library for arbitrary-precision arithmetic. + * https://github.com/MikeMcl/bignumber.js + * Copyright (c) 2022 Michael Mclaughlin + * MIT Licensed. + * + * BigNumber.prototype methods | BigNumber methods + * | + * absoluteValue abs | clone + * comparedTo | config set + * decimalPlaces dp | DECIMAL_PLACES + * dividedBy div | ROUNDING_MODE + * dividedToIntegerBy idiv | EXPONENTIAL_AT + * exponentiatedBy pow | RANGE + * integerValue | CRYPTO + * isEqualTo eq | MODULO_MODE + * isFinite | POW_PRECISION + * isGreaterThan gt | FORMAT + * isGreaterThanOrEqualTo gte | ALPHABET + * isInteger | isBigNumber + * isLessThan lt | maximum max + * isLessThanOrEqualTo lte | minimum min + * isNaN | random + * isNegative | sum + * isPositive | + * isZero | + * minus | + * modulo mod | + * multipliedBy times | + * negated | + * plus | + * precision sd | + * shiftedBy | + * squareRoot sqrt | + * toExponential | + * toFixed | + * toFormat | + * toFraction | + * toJSON | + * toNumber | + * toPrecision | + * toString | + * valueOf | + * + */ + + +var + isNumeric = /^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i, + mathceil = Math.ceil, + mathfloor = Math.floor, + + bignumberError = '[BigNumber Error] ', + tooManyDigits = bignumberError + 'Number primitive has more than 15 significant digits: ', + + BASE = 1e14, + LOG_BASE = 14, + MAX_SAFE_INTEGER = 0x1fffffffffffff, // 2^53 - 1 + // MAX_INT32 = 0x7fffffff, // 2^31 - 1 + POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13], + SQRT_BASE = 1e7, + + // EDITABLE + // The limit on the value of DECIMAL_PLACES, TO_EXP_NEG, TO_EXP_POS, MIN_EXP, MAX_EXP, and + // the arguments to toExponential, toFixed, toFormat, and toPrecision. + MAX = 1E9; // 0 to MAX_INT32 + + +/* + * Create and return a BigNumber constructor. + */ +function clone(configObject) { + var div, convertBase, parseNumeric, + P = BigNumber.prototype = { constructor: BigNumber, toString: null, valueOf: null }, + ONE = new BigNumber(1), + + + //----------------------------- EDITABLE CONFIG DEFAULTS ------------------------------- + + + // The default values below must be integers within the inclusive ranges stated. + // The values can also be changed at run-time using BigNumber.set. + + // The maximum number of decimal places for operations involving division. + DECIMAL_PLACES = 20, // 0 to MAX + + // The rounding mode used when rounding to the above decimal places, and when using + // toExponential, toFixed, toFormat and toPrecision, and round (default value). + // UP 0 Away from zero. + // DOWN 1 Towards zero. + // CEIL 2 Towards +Infinity. + // FLOOR 3 Towards -Infinity. + // HALF_UP 4 Towards nearest neighbour. If equidistant, up. + // HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. + // HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. + // HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. + // HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. + ROUNDING_MODE = 4, // 0 to 8 + + // EXPONENTIAL_AT : [TO_EXP_NEG , TO_EXP_POS] + + // The exponent value at and beneath which toString returns exponential notation. + // Number type: -7 + TO_EXP_NEG = -7, // 0 to -MAX + + // The exponent value at and above which toString returns exponential notation. + // Number type: 21 + TO_EXP_POS = 21, // 0 to MAX + + // RANGE : [MIN_EXP, MAX_EXP] + + // The minimum exponent value, beneath which underflow to zero occurs. + // Number type: -324 (5e-324) + MIN_EXP = -1e7, // -1 to -MAX + + // The maximum exponent value, above which overflow to Infinity occurs. + // Number type: 308 (1.7976931348623157e+308) + // For MAX_EXP > 1e7, e.g. new BigNumber('1e100000000').plus(1) may be slow. + MAX_EXP = 1e7, // 1 to MAX + + // Whether to use cryptographically-secure random number generation, if available. + CRYPTO = false, // true or false + + // The modulo mode used when calculating the modulus: a mod n. + // The quotient (q = a / n) is calculated according to the corresponding rounding mode. + // The remainder (r) is calculated as: r = a - n * q. + // + // UP 0 The remainder is positive if the dividend is negative, else is negative. + // DOWN 1 The remainder has the same sign as the dividend. + // This modulo mode is commonly known as 'truncated division' and is + // equivalent to (a % n) in JavaScript. + // FLOOR 3 The remainder has the same sign as the divisor (Python %). + // HALF_EVEN 6 This modulo mode implements the IEEE 754 remainder function. + // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). + // The remainder is always positive. + // + // The truncated division, floored division, Euclidian division and IEEE 754 remainder + // modes are commonly used for the modulus operation. + // Although the other rounding modes can also be used, they may not give useful results. + MODULO_MODE = 1, // 0 to 9 + + // The maximum number of significant digits of the result of the exponentiatedBy operation. + // If POW_PRECISION is 0, there will be unlimited significant digits. + POW_PRECISION = 0, // 0 to MAX + + // The format specification used by the BigNumber.prototype.toFormat method. + FORMAT = { + prefix: '', + groupSize: 3, + secondaryGroupSize: 0, + groupSeparator: ',', + decimalSeparator: '.', + fractionGroupSize: 0, + fractionGroupSeparator: '\xA0', // non-breaking space + suffix: '' + }, + + // The alphabet used for base conversion. It must be at least 2 characters long, with no '+', + // '-', '.', whitespace, or repeated character. + // '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_' + ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz', + alphabetHasNormalDecimalDigits = true; + + + //------------------------------------------------------------------------------------------ + + + // CONSTRUCTOR + + + /* + * The BigNumber constructor and exported function. + * Create and return a new instance of a BigNumber object. + * + * v {number|string|BigNumber} A numeric value. + * [b] {number} The base of v. Integer, 2 to ALPHABET.length inclusive. + */ + function BigNumber(v, b) { + var alphabet, c, caseChanged, e, i, isNum, len, str, + x = this; + + // Enable constructor call without `new`. + if (!(x instanceof BigNumber)) return new BigNumber(v, b); + + if (b == null) { + + if (v && v._isBigNumber === true) { + x.s = v.s; + + if (!v.c || v.e > MAX_EXP) { + x.c = x.e = null; + } else if (v.e < MIN_EXP) { + x.c = [x.e = 0]; + } else { + x.e = v.e; + x.c = v.c.slice(); + } + + return; + } + + if ((isNum = typeof v == 'number') && v * 0 == 0) { + + // Use `1 / n` to handle minus zero also. + x.s = 1 / v < 0 ? (v = -v, -1) : 1; + + // Fast path for integers, where n < 2147483648 (2**31). + if (v === ~~v) { + for (e = 0, i = v; i >= 10; i /= 10, e++); + + if (e > MAX_EXP) { + x.c = x.e = null; + } else { + x.e = e; + x.c = [v]; + } + + return; + } + + str = String(v); + } else { + + if (!isNumeric.test(str = String(v))) return parseNumeric(x, str, isNum); + + x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1; + } + + // Decimal point? + if ((e = str.indexOf('.')) > -1) str = str.replace('.', ''); + + // Exponential form? + if ((i = str.search(/e/i)) > 0) { + + // Determine exponent. + if (e < 0) e = i; + e += +str.slice(i + 1); + str = str.substring(0, i); + } else if (e < 0) { + + // Integer. + e = str.length; + } + + } else { + + // '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}' + intCheck(b, 2, ALPHABET.length, 'Base'); + + // Allow exponential notation to be used with base 10 argument, while + // also rounding to DECIMAL_PLACES as with other bases. + if (b == 10 && alphabetHasNormalDecimalDigits) { + x = new BigNumber(v); + return round(x, DECIMAL_PLACES + x.e + 1, ROUNDING_MODE); + } + + str = String(v); + + if (isNum = typeof v == 'number') { + + // Avoid potential interpretation of Infinity and NaN as base 44+ values. + if (v * 0 != 0) return parseNumeric(x, str, isNum, b); + + x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1; + + // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}' + if (BigNumber.DEBUG && str.replace(/^0\.0*|\./, '').length > 15) { + throw Error + (tooManyDigits + v); + } + } else { + x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1; + } + + alphabet = ALPHABET.slice(0, b); + e = i = 0; + + // Check that str is a valid base b number. + // Don't use RegExp, so alphabet can contain special characters. + for (len = str.length; i < len; i++) { + if (alphabet.indexOf(c = str.charAt(i)) < 0) { + if (c == '.') { + + // If '.' is not the first character and it has not be found before. + if (i > e) { + e = len; + continue; + } + } else if (!caseChanged) { + + // Allow e.g. hexadecimal 'FF' as well as 'ff'. + if (str == str.toUpperCase() && (str = str.toLowerCase()) || + str == str.toLowerCase() && (str = str.toUpperCase())) { + caseChanged = true; + i = -1; + e = 0; + continue; + } + } + + return parseNumeric(x, String(v), isNum, b); + } + } + + // Prevent later check for length on converted number. + isNum = false; + str = convertBase(str, b, 10, x.s); + + // Decimal point? + if ((e = str.indexOf('.')) > -1) str = str.replace('.', ''); + else e = str.length; + } + + // Determine leading zeros. + for (i = 0; str.charCodeAt(i) === 48; i++); + + // Determine trailing zeros. + for (len = str.length; str.charCodeAt(--len) === 48;); + + if (str = str.slice(i, ++len)) { + len -= i; + + // '[BigNumber Error] Number primitive has more than 15 significant digits: {n}' + if (isNum && BigNumber.DEBUG && + len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) { + throw Error + (tooManyDigits + (x.s * v)); + } + + // Overflow? + if ((e = e - i - 1) > MAX_EXP) { + + // Infinity. + x.c = x.e = null; + + // Underflow? + } else if (e < MIN_EXP) { + + // Zero. + x.c = [x.e = 0]; + } else { + x.e = e; + x.c = []; + + // Transform base + + // e is the base 10 exponent. + // i is where to slice str to get the first element of the coefficient array. + i = (e + 1) % LOG_BASE; + if (e < 0) i += LOG_BASE; // i < 1 + + if (i < len) { + if (i) x.c.push(+str.slice(0, i)); + + for (len -= LOG_BASE; i < len;) { + x.c.push(+str.slice(i, i += LOG_BASE)); + } + + i = LOG_BASE - (str = str.slice(i)).length; + } else { + i -= len; + } + + for (; i--; str += '0'); + x.c.push(+str); + } + } else { + + // Zero. + x.c = [x.e = 0]; + } + } + + + // CONSTRUCTOR PROPERTIES + + + BigNumber.clone = clone; + + BigNumber.ROUND_UP = 0; + BigNumber.ROUND_DOWN = 1; + BigNumber.ROUND_CEIL = 2; + BigNumber.ROUND_FLOOR = 3; + BigNumber.ROUND_HALF_UP = 4; + BigNumber.ROUND_HALF_DOWN = 5; + BigNumber.ROUND_HALF_EVEN = 6; + BigNumber.ROUND_HALF_CEIL = 7; + BigNumber.ROUND_HALF_FLOOR = 8; + BigNumber.EUCLID = 9; + + + /* + * Configure infrequently-changing library-wide settings. + * + * Accept an object with the following optional properties (if the value of a property is + * a number, it must be an integer within the inclusive range stated): + * + * DECIMAL_PLACES {number} 0 to MAX + * ROUNDING_MODE {number} 0 to 8 + * EXPONENTIAL_AT {number|number[]} -MAX to MAX or [-MAX to 0, 0 to MAX] + * RANGE {number|number[]} -MAX to MAX (not zero) or [-MAX to -1, 1 to MAX] + * CRYPTO {boolean} true or false + * MODULO_MODE {number} 0 to 9 + * POW_PRECISION {number} 0 to MAX + * ALPHABET {string} A string of two or more unique characters which does + * not contain '.'. + * FORMAT {object} An object with some of the following properties: + * prefix {string} + * groupSize {number} + * secondaryGroupSize {number} + * groupSeparator {string} + * decimalSeparator {string} + * fractionGroupSize {number} + * fractionGroupSeparator {string} + * suffix {string} + * + * (The values assigned to the above FORMAT object properties are not checked for validity.) + * + * E.g. + * BigNumber.config({ DECIMAL_PLACES : 20, ROUNDING_MODE : 4 }) + * + * Ignore properties/parameters set to null or undefined, except for ALPHABET. + * + * Return an object with the properties current values. + */ + BigNumber.config = BigNumber.set = function (obj) { + var p, v; + + if (obj != null) { + + if (typeof obj == 'object') { + + // DECIMAL_PLACES {number} Integer, 0 to MAX inclusive. + // '[BigNumber Error] DECIMAL_PLACES {not a primitive number|not an integer|out of range}: {v}' + if (obj.hasOwnProperty(p = 'DECIMAL_PLACES')) { + v = obj[p]; + intCheck(v, 0, MAX, p); + DECIMAL_PLACES = v; + } + + // ROUNDING_MODE {number} Integer, 0 to 8 inclusive. + // '[BigNumber Error] ROUNDING_MODE {not a primitive number|not an integer|out of range}: {v}' + if (obj.hasOwnProperty(p = 'ROUNDING_MODE')) { + v = obj[p]; + intCheck(v, 0, 8, p); + ROUNDING_MODE = v; + } + + // EXPONENTIAL_AT {number|number[]} + // Integer, -MAX to MAX inclusive or + // [integer -MAX to 0 inclusive, 0 to MAX inclusive]. + // '[BigNumber Error] EXPONENTIAL_AT {not a primitive number|not an integer|out of range}: {v}' + if (obj.hasOwnProperty(p = 'EXPONENTIAL_AT')) { + v = obj[p]; + if (v && v.pop) { + intCheck(v[0], -MAX, 0, p); + intCheck(v[1], 0, MAX, p); + TO_EXP_NEG = v[0]; + TO_EXP_POS = v[1]; + } else { + intCheck(v, -MAX, MAX, p); + TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v); + } + } + + // RANGE {number|number[]} Non-zero integer, -MAX to MAX inclusive or + // [integer -MAX to -1 inclusive, integer 1 to MAX inclusive]. + // '[BigNumber Error] RANGE {not a primitive number|not an integer|out of range|cannot be zero}: {v}' + if (obj.hasOwnProperty(p = 'RANGE')) { + v = obj[p]; + if (v && v.pop) { + intCheck(v[0], -MAX, -1, p); + intCheck(v[1], 1, MAX, p); + MIN_EXP = v[0]; + MAX_EXP = v[1]; + } else { + intCheck(v, -MAX, MAX, p); + if (v) { + MIN_EXP = -(MAX_EXP = v < 0 ? -v : v); + } else { + throw Error + (bignumberError + p + ' cannot be zero: ' + v); + } + } + } + + // CRYPTO {boolean} true or false. + // '[BigNumber Error] CRYPTO not true or false: {v}' + // '[BigNumber Error] crypto unavailable' + if (obj.hasOwnProperty(p = 'CRYPTO')) { + v = obj[p]; + if (v === !!v) { + if (v) { + if (typeof crypto != 'undefined' && crypto && + (crypto.getRandomValues || crypto.randomBytes)) { + CRYPTO = v; + } else { + CRYPTO = !v; + throw Error + (bignumberError + 'crypto unavailable'); + } + } else { + CRYPTO = v; + } + } else { + throw Error + (bignumberError + p + ' not true or false: ' + v); + } + } + + // MODULO_MODE {number} Integer, 0 to 9 inclusive. + // '[BigNumber Error] MODULO_MODE {not a primitive number|not an integer|out of range}: {v}' + if (obj.hasOwnProperty(p = 'MODULO_MODE')) { + v = obj[p]; + intCheck(v, 0, 9, p); + MODULO_MODE = v; + } + + // POW_PRECISION {number} Integer, 0 to MAX inclusive. + // '[BigNumber Error] POW_PRECISION {not a primitive number|not an integer|out of range}: {v}' + if (obj.hasOwnProperty(p = 'POW_PRECISION')) { + v = obj[p]; + intCheck(v, 0, MAX, p); + POW_PRECISION = v; + } + + // FORMAT {object} + // '[BigNumber Error] FORMAT not an object: {v}' + if (obj.hasOwnProperty(p = 'FORMAT')) { + v = obj[p]; + if (typeof v == 'object') FORMAT = v; + else throw Error + (bignumberError + p + ' not an object: ' + v); + } + + // ALPHABET {string} + // '[BigNumber Error] ALPHABET invalid: {v}' + if (obj.hasOwnProperty(p = 'ALPHABET')) { + v = obj[p]; + + // Disallow if less than two characters, + // or if it contains '+', '-', '.', whitespace, or a repeated character. + if (typeof v == 'string' && !/^.?$|[+\-.\s]|(.).*\1/.test(v)) { + alphabetHasNormalDecimalDigits = v.slice(0, 10) == '0123456789'; + ALPHABET = v; + } else { + throw Error + (bignumberError + p + ' invalid: ' + v); + } + } + + } else { + + // '[BigNumber Error] Object expected: {v}' + throw Error + (bignumberError + 'Object expected: ' + obj); + } + } + + return { + DECIMAL_PLACES: DECIMAL_PLACES, + ROUNDING_MODE: ROUNDING_MODE, + EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS], + RANGE: [MIN_EXP, MAX_EXP], + CRYPTO: CRYPTO, + MODULO_MODE: MODULO_MODE, + POW_PRECISION: POW_PRECISION, + FORMAT: FORMAT, + ALPHABET: ALPHABET + }; + }; + + + /* + * Return true if v is a BigNumber instance, otherwise return false. + * + * If BigNumber.DEBUG is true, throw if a BigNumber instance is not well-formed. + * + * v {any} + * + * '[BigNumber Error] Invalid BigNumber: {v}' + */ + BigNumber.isBigNumber = function (v) { + if (!v || v._isBigNumber !== true) return false; + if (!BigNumber.DEBUG) return true; + + var i, n, + c = v.c, + e = v.e, + s = v.s; + + out: if ({}.toString.call(c) == '[object Array]') { + + if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) { + + // If the first element is zero, the BigNumber value must be zero. + if (c[0] === 0) { + if (e === 0 && c.length === 1) return true; + break out; + } + + // Calculate number of digits that c[0] should have, based on the exponent. + i = (e + 1) % LOG_BASE; + if (i < 1) i += LOG_BASE; + + // Calculate number of digits of c[0]. + //if (Math.ceil(Math.log(c[0] + 1) / Math.LN10) == i) { + if (String(c[0]).length == i) { + + for (i = 0; i < c.length; i++) { + n = c[i]; + if (n < 0 || n >= BASE || n !== mathfloor(n)) break out; + } + + // Last element cannot be zero, unless it is the only element. + if (n !== 0) return true; + } + } + + // Infinity/NaN + } else if (c === null && e === null && (s === null || s === 1 || s === -1)) { + return true; + } + + throw Error + (bignumberError + 'Invalid BigNumber: ' + v); + }; + + + /* + * Return a new BigNumber whose value is the maximum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.maximum = BigNumber.max = function () { + return maxOrMin(arguments, -1); + }; + + + /* + * Return a new BigNumber whose value is the minimum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.minimum = BigNumber.min = function () { + return maxOrMin(arguments, 1); + }; + + + /* + * Return a new BigNumber with a random value equal to or greater than 0 and less than 1, + * and with dp, or DECIMAL_PLACES if dp is omitted, decimal places (or less if trailing + * zeros are produced). + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp}' + * '[BigNumber Error] crypto unavailable' + */ + BigNumber.random = (function () { + var pow2_53 = 0x20000000000000; + + // Return a 53 bit integer n, where 0 <= n < 9007199254740992. + // Check if Math.random() produces more than 32 bits of randomness. + // If it does, assume at least 53 bits are produced, otherwise assume at least 30 bits. + // 0x40000000 is 2^30, 0x800000 is 2^23, 0x1fffff is 2^21 - 1. + var random53bitInt = (Math.random() * pow2_53) & 0x1fffff + ? function () { return mathfloor(Math.random() * pow2_53); } + : function () { return ((Math.random() * 0x40000000 | 0) * 0x800000) + + (Math.random() * 0x800000 | 0); }; + + return function (dp) { + var a, b, e, k, v, + i = 0, + c = [], + rand = new BigNumber(ONE); + + if (dp == null) dp = DECIMAL_PLACES; + else intCheck(dp, 0, MAX); + + k = mathceil(dp / LOG_BASE); + + if (CRYPTO) { + + // Browsers supporting crypto.getRandomValues. + if (crypto.getRandomValues) { + + a = crypto.getRandomValues(new Uint32Array(k *= 2)); + + for (; i < k;) { + + // 53 bits: + // ((Math.pow(2, 32) - 1) * Math.pow(2, 21)).toString(2) + // 11111 11111111 11111111 11111111 11100000 00000000 00000000 + // ((Math.pow(2, 32) - 1) >>> 11).toString(2) + // 11111 11111111 11111111 + // 0x20000 is 2^21. + v = a[i] * 0x20000 + (a[i + 1] >>> 11); + + // Rejection sampling: + // 0 <= v < 9007199254740992 + // Probability that v >= 9e15, is + // 7199254740992 / 9007199254740992 ~= 0.0008, i.e. 1 in 1251 + if (v >= 9e15) { + b = crypto.getRandomValues(new Uint32Array(2)); + a[i] = b[0]; + a[i + 1] = b[1]; + } else { + + // 0 <= v <= 8999999999999999 + // 0 <= (v % 1e14) <= 99999999999999 + c.push(v % 1e14); + i += 2; + } + } + i = k / 2; + + // Node.js supporting crypto.randomBytes. + } else if (crypto.randomBytes) { + + // buffer + a = crypto.randomBytes(k *= 7); + + for (; i < k;) { + + // 0x1000000000000 is 2^48, 0x10000000000 is 2^40 + // 0x100000000 is 2^32, 0x1000000 is 2^24 + // 11111 11111111 11111111 11111111 11111111 11111111 11111111 + // 0 <= v < 9007199254740992 + v = ((a[i] & 31) * 0x1000000000000) + (a[i + 1] * 0x10000000000) + + (a[i + 2] * 0x100000000) + (a[i + 3] * 0x1000000) + + (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6]; + + if (v >= 9e15) { + crypto.randomBytes(7).copy(a, i); + } else { + + // 0 <= (v % 1e14) <= 99999999999999 + c.push(v % 1e14); + i += 7; + } + } + i = k / 7; + } else { + CRYPTO = false; + throw Error + (bignumberError + 'crypto unavailable'); + } + } + + // Use Math.random. + if (!CRYPTO) { + + for (; i < k;) { + v = random53bitInt(); + if (v < 9e15) c[i++] = v % 1e14; + } + } + + k = c[--i]; + dp %= LOG_BASE; + + // Convert trailing digits to zeros according to dp. + if (k && dp) { + v = POWS_TEN[LOG_BASE - dp]; + c[i] = mathfloor(k / v) * v; + } + + // Remove trailing elements which are zero. + for (; c[i] === 0; c.pop(), i--); + + // Zero? + if (i < 0) { + c = [e = 0]; + } else { + + // Remove leading elements which are zero and adjust exponent accordingly. + for (e = -1 ; c[0] === 0; c.splice(0, 1), e -= LOG_BASE); + + // Count the digits of the first element of c to determine leading zeros, and... + for (i = 1, v = c[0]; v >= 10; v /= 10, i++); + + // adjust the exponent accordingly. + if (i < LOG_BASE) e -= LOG_BASE - i; + } + + rand.e = e; + rand.c = c; + return rand; + }; + })(); + + + /* + * Return a BigNumber whose value is the sum of the arguments. + * + * arguments {number|string|BigNumber} + */ + BigNumber.sum = function () { + var i = 1, + args = arguments, + sum = new BigNumber(args[0]); + for (; i < args.length;) sum = sum.plus(args[i++]); + return sum; + }; + + + // PRIVATE FUNCTIONS + + + // Called by BigNumber and BigNumber.prototype.toString. + convertBase = (function () { + var decimal = '0123456789'; + + /* + * Convert string of baseIn to an array of numbers of baseOut. + * Eg. toBaseOut('255', 10, 16) returns [15, 15]. + * Eg. toBaseOut('ff', 16, 10) returns [2, 5, 5]. + */ + function toBaseOut(str, baseIn, baseOut, alphabet) { + var j, + arr = [0], + arrL, + i = 0, + len = str.length; + + for (; i < len;) { + for (arrL = arr.length; arrL--; arr[arrL] *= baseIn); + + arr[0] += alphabet.indexOf(str.charAt(i++)); + + for (j = 0; j < arr.length; j++) { + + if (arr[j] > baseOut - 1) { + if (arr[j + 1] == null) arr[j + 1] = 0; + arr[j + 1] += arr[j] / baseOut | 0; + arr[j] %= baseOut; + } + } + } + + return arr.reverse(); + } + + // Convert a numeric string of baseIn to a numeric string of baseOut. + // If the caller is toString, we are converting from base 10 to baseOut. + // If the caller is BigNumber, we are converting from baseIn to base 10. + return function (str, baseIn, baseOut, sign, callerIsToString) { + var alphabet, d, e, k, r, x, xc, y, + i = str.indexOf('.'), + dp = DECIMAL_PLACES, + rm = ROUNDING_MODE; + + // Non-integer. + if (i >= 0) { + k = POW_PRECISION; + + // Unlimited precision. + POW_PRECISION = 0; + str = str.replace('.', ''); + y = new BigNumber(baseIn); + x = y.pow(str.length - i); + POW_PRECISION = k; + + // Convert str as if an integer, then restore the fraction part by dividing the + // result by its base raised to a power. + + y.c = toBaseOut(toFixedPoint(coeffToString(x.c), x.e, '0'), + 10, baseOut, decimal); + y.e = y.c.length; + } + + // Convert the number as integer. + + xc = toBaseOut(str, baseIn, baseOut, callerIsToString + ? (alphabet = ALPHABET, decimal) + : (alphabet = decimal, ALPHABET)); + + // xc now represents str as an integer and converted to baseOut. e is the exponent. + e = k = xc.length; + + // Remove trailing zeros. + for (; xc[--k] == 0; xc.pop()); + + // Zero? + if (!xc[0]) return alphabet.charAt(0); + + // Does str represent an integer? If so, no need for the division. + if (i < 0) { + --e; + } else { + x.c = xc; + x.e = e; + + // The sign is needed for correct rounding. + x.s = sign; + x = div(x, y, dp, rm, baseOut); + xc = x.c; + r = x.r; + e = x.e; + } + + // xc now represents str converted to baseOut. + + // THe index of the rounding digit. + d = e + dp + 1; + + // The rounding digit: the digit to the right of the digit that may be rounded up. + i = xc[d]; + + // Look at the rounding digits and mode to determine whether to round up. + + k = baseOut / 2; + r = r || d < 0 || xc[d + 1] != null; + + r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) + : i > k || i == k &&(rm == 4 || r || rm == 6 && xc[d - 1] & 1 || + rm == (x.s < 0 ? 8 : 7)); + + // If the index of the rounding digit is not greater than zero, or xc represents + // zero, then the result of the base conversion is zero or, if rounding up, a value + // such as 0.00001. + if (d < 1 || !xc[0]) { + + // 1^-dp or 0 + str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0); + } else { + + // Truncate xc to the required number of decimal places. + xc.length = d; + + // Round up? + if (r) { + + // Rounding up may mean the previous digit has to be rounded up and so on. + for (--baseOut; ++xc[--d] > baseOut;) { + xc[d] = 0; + + if (!d) { + ++e; + xc = [1].concat(xc); + } + } + } + + // Determine trailing zeros. + for (k = xc.length; !xc[--k];); + + // E.g. [4, 11, 15] becomes 4bf. + for (i = 0, str = ''; i <= k; str += alphabet.charAt(xc[i++])); + + // Add leading zeros, decimal point and trailing zeros as required. + str = toFixedPoint(str, e, alphabet.charAt(0)); + } + + // The caller will add the sign. + return str; + }; + })(); + + + // Perform division in the specified base. Called by div and convertBase. + div = (function () { + + // Assume non-zero x and k. + function multiply(x, k, base) { + var m, temp, xlo, xhi, + carry = 0, + i = x.length, + klo = k % SQRT_BASE, + khi = k / SQRT_BASE | 0; + + for (x = x.slice(); i--;) { + xlo = x[i] % SQRT_BASE; + xhi = x[i] / SQRT_BASE | 0; + m = khi * xlo + xhi * klo; + temp = klo * xlo + ((m % SQRT_BASE) * SQRT_BASE) + carry; + carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi; + x[i] = temp % base; + } + + if (carry) x = [carry].concat(x); + + return x; + } + + function compare(a, b, aL, bL) { + var i, cmp; + + if (aL != bL) { + cmp = aL > bL ? 1 : -1; + } else { + + for (i = cmp = 0; i < aL; i++) { + + if (a[i] != b[i]) { + cmp = a[i] > b[i] ? 1 : -1; + break; + } + } + } + + return cmp; + } + + function subtract(a, b, aL, base) { + var i = 0; + + // Subtract b from a. + for (; aL--;) { + a[aL] -= i; + i = a[aL] < b[aL] ? 1 : 0; + a[aL] = i * base + a[aL] - b[aL]; + } + + // Remove leading zeros. + for (; !a[0] && a.length > 1; a.splice(0, 1)); + } + + // x: dividend, y: divisor. + return function (x, y, dp, rm, base) { + var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0, + yL, yz, + s = x.s == y.s ? 1 : -1, + xc = x.c, + yc = y.c; + + // Either NaN, Infinity or 0? + if (!xc || !xc[0] || !yc || !yc[0]) { + + return new BigNumber( + + // Return NaN if either NaN, or both Infinity or 0. + !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN : + + // Return ±0 if x is ±0 or y is ±Infinity, or return ±Infinity as y is ±0. + xc && xc[0] == 0 || !yc ? s * 0 : s / 0 + ); + } + + q = new BigNumber(s); + qc = q.c = []; + e = x.e - y.e; + s = dp + e + 1; + + if (!base) { + base = BASE; + e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE); + s = s / LOG_BASE | 0; + } + + // Result exponent may be one less then the current value of e. + // The coefficients of the BigNumbers from convertBase may have trailing zeros. + for (i = 0; yc[i] == (xc[i] || 0); i++); + + if (yc[i] > (xc[i] || 0)) e--; + + if (s < 0) { + qc.push(1); + more = true; + } else { + xL = xc.length; + yL = yc.length; + i = 0; + s += 2; + + // Normalise xc and yc so highest order digit of yc is >= base / 2. + + n = mathfloor(base / (yc[0] + 1)); + + // Not necessary, but to handle odd bases where yc[0] == (base / 2) - 1. + // if (n > 1 || n++ == 1 && yc[0] < base / 2) { + if (n > 1) { + yc = multiply(yc, n, base); + xc = multiply(xc, n, base); + yL = yc.length; + xL = xc.length; + } + + xi = yL; + rem = xc.slice(0, yL); + remL = rem.length; + + // Add zeros to make remainder as long as divisor. + for (; remL < yL; rem[remL++] = 0); + yz = yc.slice(); + yz = [0].concat(yz); + yc0 = yc[0]; + if (yc[1] >= base / 2) yc0++; + // Not necessary, but to prevent trial digit n > base, when using base 3. + // else if (base == 3 && yc0 == 1) yc0 = 1 + 1e-15; + + do { + n = 0; + + // Compare divisor and remainder. + cmp = compare(yc, rem, yL, remL); + + // If divisor < remainder. + if (cmp < 0) { + + // Calculate trial digit, n. + + rem0 = rem[0]; + if (yL != remL) rem0 = rem0 * base + (rem[1] || 0); + + // n is how many times the divisor goes into the current remainder. + n = mathfloor(rem0 / yc0); + + // Algorithm: + // product = divisor multiplied by trial digit (n). + // Compare product and remainder. + // If product is greater than remainder: + // Subtract divisor from product, decrement trial digit. + // Subtract product from remainder. + // If product was less than remainder at the last compare: + // Compare new remainder and divisor. + // If remainder is greater than divisor: + // Subtract divisor from remainder, increment trial digit. + + if (n > 1) { + + // n may be > base only when base is 3. + if (n >= base) n = base - 1; + + // product = divisor * trial digit. + prod = multiply(yc, n, base); + prodL = prod.length; + remL = rem.length; + + // Compare product and remainder. + // If product > remainder then trial digit n too high. + // n is 1 too high about 5% of the time, and is not known to have + // ever been more than 1 too high. + while (compare(prod, rem, prodL, remL) == 1) { + n--; + + // Subtract divisor from product. + subtract(prod, yL < prodL ? yz : yc, prodL, base); + prodL = prod.length; + cmp = 1; + } + } else { + + // n is 0 or 1, cmp is -1. + // If n is 0, there is no need to compare yc and rem again below, + // so change cmp to 1 to avoid it. + // If n is 1, leave cmp as -1, so yc and rem are compared again. + if (n == 0) { + + // divisor < remainder, so n must be at least 1. + cmp = n = 1; + } + + // product = divisor + prod = yc.slice(); + prodL = prod.length; + } + + if (prodL < remL) prod = [0].concat(prod); + + // Subtract product from remainder. + subtract(rem, prod, remL, base); + remL = rem.length; + + // If product was < remainder. + if (cmp == -1) { + + // Compare divisor and new remainder. + // If divisor < new remainder, subtract divisor from remainder. + // Trial digit n too low. + // n is 1 too low about 5% of the time, and very rarely 2 too low. + while (compare(yc, rem, yL, remL) < 1) { + n++; + + // Subtract divisor from remainder. + subtract(rem, yL < remL ? yz : yc, remL, base); + remL = rem.length; + } + } + } else if (cmp === 0) { + n++; + rem = [0]; + } // else cmp === 1 and n will be 0 + + // Add the next digit, n, to the result array. + qc[i++] = n; + + // Update the remainder. + if (rem[0]) { + rem[remL++] = xc[xi] || 0; + } else { + rem = [xc[xi]]; + remL = 1; + } + } while ((xi++ < xL || rem[0] != null) && s--); + + more = rem[0] != null; + + // Leading zero? + if (!qc[0]) qc.splice(0, 1); + } + + if (base == BASE) { + + // To calculate q.e, first get the number of digits of qc[0]. + for (i = 1, s = qc[0]; s >= 10; s /= 10, i++); + + round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more); + + // Caller is convertBase. + } else { + q.e = e; + q.r = +more; + } + + return q; + }; + })(); + + + /* + * Return a string representing the value of BigNumber n in fixed-point or exponential + * notation rounded to the specified decimal places or significant digits. + * + * n: a BigNumber. + * i: the index of the last digit required (i.e. the digit that may be rounded up). + * rm: the rounding mode. + * id: 1 (toExponential) or 2 (toPrecision). + */ + function format(n, i, rm, id) { + var c0, e, ne, len, str; + + if (rm == null) rm = ROUNDING_MODE; + else intCheck(rm, 0, 8); + + if (!n.c) return n.toString(); + + c0 = n.c[0]; + ne = n.e; + + if (i == null) { + str = coeffToString(n.c); + str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS) + ? toExponential(str, ne) + : toFixedPoint(str, ne, '0'); + } else { + n = round(new BigNumber(n), i, rm); + + // n.e may have changed if the value was rounded up. + e = n.e; + + str = coeffToString(n.c); + len = str.length; + + // toPrecision returns exponential notation if the number of significant digits + // specified is less than the number of digits necessary to represent the integer + // part of the value in fixed-point notation. + + // Exponential notation. + if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) { + + // Append zeros? + for (; len < i; str += '0', len++); + str = toExponential(str, e); + + // Fixed-point notation. + } else { + i -= ne; + str = toFixedPoint(str, e, '0'); + + // Append zeros? + if (e + 1 > len) { + if (--i > 0) for (str += '.'; i--; str += '0'); + } else { + i += e - len; + if (i > 0) { + if (e + 1 == len) str += '.'; + for (; i--; str += '0'); + } + } + } + } + + return n.s < 0 && c0 ? '-' + str : str; + } + + + // Handle BigNumber.max and BigNumber.min. + // If any number is NaN, return NaN. + function maxOrMin(args, n) { + var k, y, + i = 1, + x = new BigNumber(args[0]); + + for (; i < args.length; i++) { + y = new BigNumber(args[i]); + if (!y.s || (k = compare(x, y)) === n || k === 0 && x.s === n) { + x = y; + } + } + + return x; + } + + + /* + * Strip trailing zeros, calculate base 10 exponent and check against MIN_EXP and MAX_EXP. + * Called by minus, plus and times. + */ + function normalise(n, c, e) { + var i = 1, + j = c.length; + + // Remove trailing zeros. + for (; !c[--j]; c.pop()); + + // Calculate the base 10 exponent. First get the number of digits of c[0]. + for (j = c[0]; j >= 10; j /= 10, i++); + + // Overflow? + if ((e = i + e * LOG_BASE - 1) > MAX_EXP) { + + // Infinity. + n.c = n.e = null; + + // Underflow? + } else if (e < MIN_EXP) { + + // Zero. + n.c = [n.e = 0]; + } else { + n.e = e; + n.c = c; + } + + return n; + } + + + // Handle values that fail the validity test in BigNumber. + parseNumeric = (function () { + var basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i, + dotAfter = /^([^.]+)\.$/, + dotBefore = /^\.([^.]+)$/, + isInfinityOrNaN = /^-?(Infinity|NaN)$/, + whitespaceOrPlus = /^\s*\+(?=[\w.])|^\s+|\s+$/g; + + return function (x, str, isNum, b) { + var base, + s = isNum ? str : str.replace(whitespaceOrPlus, ''); + + // No exception on ±Infinity or NaN. + if (isInfinityOrNaN.test(s)) { + x.s = isNaN(s) ? null : s < 0 ? -1 : 1; + } else { + if (!isNum) { + + // basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i + s = s.replace(basePrefix, function (m, p1, p2) { + base = (p2 = p2.toLowerCase()) == 'x' ? 16 : p2 == 'b' ? 2 : 8; + return !b || b == base ? p1 : m; + }); + + if (b) { + base = b; + + // E.g. '1.' to '1', '.1' to '0.1' + s = s.replace(dotAfter, '$1').replace(dotBefore, '0.$1'); + } + + if (str != s) return new BigNumber(s, base); + } + + // '[BigNumber Error] Not a number: {n}' + // '[BigNumber Error] Not a base {b} number: {n}' + if (BigNumber.DEBUG) { + throw Error + (bignumberError + 'Not a' + (b ? ' base ' + b : '') + ' number: ' + str); + } + + // NaN + x.s = null; + } + + x.c = x.e = null; + } + })(); + + + /* + * Round x to sd significant digits using rounding mode rm. Check for over/under-flow. + * If r is truthy, it is known that there are more digits after the rounding digit. + */ + function round(x, sd, rm, r) { + var d, i, j, k, n, ni, rd, + xc = x.c, + pows10 = POWS_TEN; + + // if x is not Infinity or NaN... + if (xc) { + + // rd is the rounding digit, i.e. the digit after the digit that may be rounded up. + // n is a base 1e14 number, the value of the element of array x.c containing rd. + // ni is the index of n within x.c. + // d is the number of digits of n. + // i is the index of rd within n including leading zeros. + // j is the actual index of rd within n (if < 0, rd is a leading zero). + out: { + + // Get the number of digits of the first element of xc. + for (d = 1, k = xc[0]; k >= 10; k /= 10, d++); + i = sd - d; + + // If the rounding digit is in the first element of xc... + if (i < 0) { + i += LOG_BASE; + j = sd; + n = xc[ni = 0]; + + // Get the rounding digit at index j of n. + rd = mathfloor(n / pows10[d - j - 1] % 10); + } else { + ni = mathceil((i + 1) / LOG_BASE); + + if (ni >= xc.length) { + + if (r) { + + // Needed by sqrt. + for (; xc.length <= ni; xc.push(0)); + n = rd = 0; + d = 1; + i %= LOG_BASE; + j = i - LOG_BASE + 1; + } else { + break out; + } + } else { + n = k = xc[ni]; + + // Get the number of digits of n. + for (d = 1; k >= 10; k /= 10, d++); + + // Get the index of rd within n. + i %= LOG_BASE; + + // Get the index of rd within n, adjusted for leading zeros. + // The number of leading zeros of n is given by LOG_BASE - d. + j = i - LOG_BASE + d; + + // Get the rounding digit at index j of n. + rd = j < 0 ? 0 : mathfloor(n / pows10[d - j - 1] % 10); + } + } + + r = r || sd < 0 || + + // Are there any non-zero digits after the rounding digit? + // The expression n % pows10[d - j - 1] returns all digits of n to the right + // of the digit at j, e.g. if n is 908714 and j is 2, the expression gives 714. + xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]); + + r = rm < 4 + ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) + : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 && + + // Check whether the digit to the left of the rounding digit is odd. + ((i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10) & 1 || + rm == (x.s < 0 ? 8 : 7)); + + if (sd < 1 || !xc[0]) { + xc.length = 0; + + if (r) { + + // Convert sd to decimal places. + sd -= x.e + 1; + + // 1, 0.1, 0.01, 0.001, 0.0001 etc. + xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE]; + x.e = -sd || 0; + } else { + + // Zero. + xc[0] = x.e = 0; + } + + return x; + } + + // Remove excess digits. + if (i == 0) { + xc.length = ni; + k = 1; + ni--; + } else { + xc.length = ni + 1; + k = pows10[LOG_BASE - i]; + + // E.g. 56700 becomes 56000 if 7 is the rounding digit. + // j > 0 means i > number of leading zeros of n. + xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0; + } + + // Round up? + if (r) { + + for (; ;) { + + // If the digit to be rounded up is in the first element of xc... + if (ni == 0) { + + // i will be the length of xc[0] before k is added. + for (i = 1, j = xc[0]; j >= 10; j /= 10, i++); + j = xc[0] += k; + for (k = 1; j >= 10; j /= 10, k++); + + // if i != k the length has increased. + if (i != k) { + x.e++; + if (xc[0] == BASE) xc[0] = 1; + } + + break; + } else { + xc[ni] += k; + if (xc[ni] != BASE) break; + xc[ni--] = 0; + k = 1; + } + } + } + + // Remove trailing zeros. + for (i = xc.length; xc[--i] === 0; xc.pop()); + } + + // Overflow? Infinity. + if (x.e > MAX_EXP) { + x.c = x.e = null; + + // Underflow? Zero. + } else if (x.e < MIN_EXP) { + x.c = [x.e = 0]; + } + } + + return x; + } + + + function valueOf(n) { + var str, + e = n.e; + + if (e === null) return n.toString(); + + str = coeffToString(n.c); + + str = e <= TO_EXP_NEG || e >= TO_EXP_POS + ? toExponential(str, e) + : toFixedPoint(str, e, '0'); + + return n.s < 0 ? '-' + str : str; + } + + + // PROTOTYPE/INSTANCE METHODS + + + /* + * Return a new BigNumber whose value is the absolute value of this BigNumber. + */ + P.absoluteValue = P.abs = function () { + var x = new BigNumber(this); + if (x.s < 0) x.s = 1; + return x; + }; + + + /* + * Return + * 1 if the value of this BigNumber is greater than the value of BigNumber(y, b), + * -1 if the value of this BigNumber is less than the value of BigNumber(y, b), + * 0 if they have the same value, + * or null if the value of either is NaN. + */ + P.comparedTo = function (y, b) { + return compare(this, new BigNumber(y, b)); + }; + + + /* + * If dp is undefined or null or true or false, return the number of decimal places of the + * value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN. + * + * Otherwise, if dp is a number, return a new BigNumber whose value is the value of this + * BigNumber rounded to a maximum of dp decimal places using rounding mode rm, or + * ROUNDING_MODE if rm is omitted. + * + * [dp] {number} Decimal places: integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}' + */ + P.decimalPlaces = P.dp = function (dp, rm) { + var c, n, v, + x = this; + + if (dp != null) { + intCheck(dp, 0, MAX); + if (rm == null) rm = ROUNDING_MODE; + else intCheck(rm, 0, 8); + + return round(new BigNumber(x), dp + x.e + 1, rm); + } + + if (!(c = x.c)) return null; + n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE; + + // Subtract the number of trailing zeros of the last number. + if (v = c[v]) for (; v % 10 == 0; v /= 10, n--); + if (n < 0) n = 0; + + return n; + }; + + + /* + * n / 0 = I + * n / N = N + * n / I = 0 + * 0 / n = 0 + * 0 / 0 = N + * 0 / N = N + * 0 / I = 0 + * N / n = N + * N / 0 = N + * N / N = N + * N / I = N + * I / n = I + * I / 0 = I + * I / N = N + * I / I = N + * + * Return a new BigNumber whose value is the value of this BigNumber divided by the value of + * BigNumber(y, b), rounded according to DECIMAL_PLACES and ROUNDING_MODE. + */ + P.dividedBy = P.div = function (y, b) { + return div(this, new BigNumber(y, b), DECIMAL_PLACES, ROUNDING_MODE); + }; + + + /* + * Return a new BigNumber whose value is the integer part of dividing the value of this + * BigNumber by the value of BigNumber(y, b). + */ + P.dividedToIntegerBy = P.idiv = function (y, b) { + return div(this, new BigNumber(y, b), 0, 1); + }; + + + /* + * Return a BigNumber whose value is the value of this BigNumber exponentiated by n. + * + * If m is present, return the result modulo m. + * If n is negative round according to DECIMAL_PLACES and ROUNDING_MODE. + * If POW_PRECISION is non-zero and m is not present, round to POW_PRECISION using ROUNDING_MODE. + * + * The modular power operation works efficiently when x, n, and m are integers, otherwise it + * is equivalent to calculating x.exponentiatedBy(n).modulo(m) with a POW_PRECISION of 0. + * + * n {number|string|BigNumber} The exponent. An integer. + * [m] {number|string|BigNumber} The modulus. + * + * '[BigNumber Error] Exponent not an integer: {n}' + */ + P.exponentiatedBy = P.pow = function (n, m) { + var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y, + x = this; + + n = new BigNumber(n); + + // Allow NaN and ±Infinity, but not other non-integers. + if (n.c && !n.isInteger()) { + throw Error + (bignumberError + 'Exponent not an integer: ' + valueOf(n)); + } + + if (m != null) m = new BigNumber(m); + + // Exponent of MAX_SAFE_INTEGER is 15. + nIsBig = n.e > 14; + + // If x is NaN, ±Infinity, ±0 or ±1, or n is ±Infinity, NaN or ±0. + if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) { + + // The sign of the result of pow when x is negative depends on the evenness of n. + // If +n overflows to ±Infinity, the evenness of n would be not be known. + y = new BigNumber(Math.pow(+valueOf(x), nIsBig ? n.s * (2 - isOdd(n)) : +valueOf(n))); + return m ? y.mod(m) : y; + } + + nIsNeg = n.s < 0; + + if (m) { + + // x % m returns NaN if abs(m) is zero, or m is NaN. + if (m.c ? !m.c[0] : !m.s) return new BigNumber(NaN); + + isModExp = !nIsNeg && x.isInteger() && m.isInteger(); + + if (isModExp) x = x.mod(m); + + // Overflow to ±Infinity: >=2**1e10 or >=1.0000024**1e15. + // Underflow to ±0: <=0.79**1e10 or <=0.9999975**1e15. + } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0 + // [1, 240000000] + ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7 + // [80000000000000] [99999750000000] + : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) { + + // If x is negative and n is odd, k = -0, else k = 0. + k = x.s < 0 && isOdd(n) ? -0 : 0; + + // If x >= 1, k = ±Infinity. + if (x.e > -1) k = 1 / k; + + // If n is negative return ±0, else return ±Infinity. + return new BigNumber(nIsNeg ? 1 / k : k); + + } else if (POW_PRECISION) { + + // Truncating each coefficient array to a length of k after each multiplication + // equates to truncating significant digits to POW_PRECISION + [28, 41], + // i.e. there will be a minimum of 28 guard digits retained. + k = mathceil(POW_PRECISION / LOG_BASE + 2); + } + + if (nIsBig) { + half = new BigNumber(0.5); + if (nIsNeg) n.s = 1; + nIsOdd = isOdd(n); + } else { + i = Math.abs(+valueOf(n)); + nIsOdd = i % 2; + } + + y = new BigNumber(ONE); + + // Performs 54 loop iterations for n of 9007199254740991. + for (; ;) { + + if (nIsOdd) { + y = y.times(x); + if (!y.c) break; + + if (k) { + if (y.c.length > k) y.c.length = k; + } else if (isModExp) { + y = y.mod(m); //y = y.minus(div(y, m, 0, MODULO_MODE).times(m)); + } + } + + if (i) { + i = mathfloor(i / 2); + if (i === 0) break; + nIsOdd = i % 2; + } else { + n = n.times(half); + round(n, n.e + 1, 1); + + if (n.e > 14) { + nIsOdd = isOdd(n); + } else { + i = +valueOf(n); + if (i === 0) break; + nIsOdd = i % 2; + } + } + + x = x.times(x); + + if (k) { + if (x.c && x.c.length > k) x.c.length = k; + } else if (isModExp) { + x = x.mod(m); //x = x.minus(div(x, m, 0, MODULO_MODE).times(m)); + } + } + + if (isModExp) return y; + if (nIsNeg) y = ONE.div(y); + + return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber rounded to an integer + * using rounding mode rm, or ROUNDING_MODE if rm is omitted. + * + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {rm}' + */ + P.integerValue = function (rm) { + var n = new BigNumber(this); + if (rm == null) rm = ROUNDING_MODE; + else intCheck(rm, 0, 8); + return round(n, n.e + 1, rm); + }; + + + /* + * Return true if the value of this BigNumber is equal to the value of BigNumber(y, b), + * otherwise return false. + */ + P.isEqualTo = P.eq = function (y, b) { + return compare(this, new BigNumber(y, b)) === 0; + }; + + + /* + * Return true if the value of this BigNumber is a finite number, otherwise return false. + */ + P.isFinite = function () { + return !!this.c; + }; + + + /* + * Return true if the value of this BigNumber is greater than the value of BigNumber(y, b), + * otherwise return false. + */ + P.isGreaterThan = P.gt = function (y, b) { + return compare(this, new BigNumber(y, b)) > 0; + }; + + + /* + * Return true if the value of this BigNumber is greater than or equal to the value of + * BigNumber(y, b), otherwise return false. + */ + P.isGreaterThanOrEqualTo = P.gte = function (y, b) { + return (b = compare(this, new BigNumber(y, b))) === 1 || b === 0; + + }; + + + /* + * Return true if the value of this BigNumber is an integer, otherwise return false. + */ + P.isInteger = function () { + return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2; + }; + + + /* + * Return true if the value of this BigNumber is less than the value of BigNumber(y, b), + * otherwise return false. + */ + P.isLessThan = P.lt = function (y, b) { + return compare(this, new BigNumber(y, b)) < 0; + }; + + + /* + * Return true if the value of this BigNumber is less than or equal to the value of + * BigNumber(y, b), otherwise return false. + */ + P.isLessThanOrEqualTo = P.lte = function (y, b) { + return (b = compare(this, new BigNumber(y, b))) === -1 || b === 0; + }; + + + /* + * Return true if the value of this BigNumber is NaN, otherwise return false. + */ + P.isNaN = function () { + return !this.s; + }; + + + /* + * Return true if the value of this BigNumber is negative, otherwise return false. + */ + P.isNegative = function () { + return this.s < 0; + }; + + + /* + * Return true if the value of this BigNumber is positive, otherwise return false. + */ + P.isPositive = function () { + return this.s > 0; + }; + + + /* + * Return true if the value of this BigNumber is 0 or -0, otherwise return false. + */ + P.isZero = function () { + return !!this.c && this.c[0] == 0; + }; + + + /* + * n - 0 = n + * n - N = N + * n - I = -I + * 0 - n = -n + * 0 - 0 = 0 + * 0 - N = N + * 0 - I = -I + * N - n = N + * N - 0 = N + * N - N = N + * N - I = N + * I - n = I + * I - 0 = I + * I - N = N + * I - I = N + * + * Return a new BigNumber whose value is the value of this BigNumber minus the value of + * BigNumber(y, b). + */ + P.minus = function (y, b) { + var i, j, t, xLTy, + x = this, + a = x.s; + + y = new BigNumber(y, b); + b = y.s; + + // Either NaN? + if (!a || !b) return new BigNumber(NaN); + + // Signs differ? + if (a != b) { + y.s = -b; + return x.plus(y); + } + + var xe = x.e / LOG_BASE, + ye = y.e / LOG_BASE, + xc = x.c, + yc = y.c; + + if (!xe || !ye) { + + // Either Infinity? + if (!xc || !yc) return xc ? (y.s = -b, y) : new BigNumber(yc ? x : NaN); + + // Either zero? + if (!xc[0] || !yc[0]) { + + // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. + return yc[0] ? (y.s = -b, y) : new BigNumber(xc[0] ? x : + + // IEEE 754 (2008) 6.3: n - n = -0 when rounding to -Infinity + ROUNDING_MODE == 3 ? -0 : 0); + } + } + + xe = bitFloor(xe); + ye = bitFloor(ye); + xc = xc.slice(); + + // Determine which is the bigger number. + if (a = xe - ye) { + + if (xLTy = a < 0) { + a = -a; + t = xc; + } else { + ye = xe; + t = yc; + } + + t.reverse(); + + // Prepend zeros to equalise exponents. + for (b = a; b--; t.push(0)); + t.reverse(); + } else { + + // Exponents equal. Check digit by digit. + j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b; + + for (a = b = 0; b < j; b++) { + + if (xc[b] != yc[b]) { + xLTy = xc[b] < yc[b]; + break; + } + } + } + + // x < y? Point xc to the array of the bigger number. + if (xLTy) { + t = xc; + xc = yc; + yc = t; + y.s = -y.s; + } + + b = (j = yc.length) - (i = xc.length); + + // Append zeros to xc if shorter. + // No need to add zeros to yc if shorter as subtract only needs to start at yc.length. + if (b > 0) for (; b--; xc[i++] = 0); + b = BASE - 1; + + // Subtract yc from xc. + for (; j > a;) { + + if (xc[--j] < yc[j]) { + for (i = j; i && !xc[--i]; xc[i] = b); + --xc[i]; + xc[j] += BASE; + } + + xc[j] -= yc[j]; + } + + // Remove leading zeros and adjust exponent accordingly. + for (; xc[0] == 0; xc.splice(0, 1), --ye); + + // Zero? + if (!xc[0]) { + + // Following IEEE 754 (2008) 6.3, + // n - n = +0 but n - n = -0 when rounding towards -Infinity. + y.s = ROUNDING_MODE == 3 ? -1 : 1; + y.c = [y.e = 0]; + return y; + } + + // No need to check for Infinity as +x - +y != Infinity && -x - -y != Infinity + // for finite x and y. + return normalise(y, xc, ye); + }; + + + /* + * n % 0 = N + * n % N = N + * n % I = n + * 0 % n = 0 + * -0 % n = -0 + * 0 % 0 = N + * 0 % N = N + * 0 % I = 0 + * N % n = N + * N % 0 = N + * N % N = N + * N % I = N + * I % n = N + * I % 0 = N + * I % N = N + * I % I = N + * + * Return a new BigNumber whose value is the value of this BigNumber modulo the value of + * BigNumber(y, b). The result depends on the value of MODULO_MODE. + */ + P.modulo = P.mod = function (y, b) { + var q, s, + x = this; + + y = new BigNumber(y, b); + + // Return NaN if x is Infinity or NaN, or y is NaN or zero. + if (!x.c || !y.s || y.c && !y.c[0]) { + return new BigNumber(NaN); + + // Return x if y is Infinity or x is zero. + } else if (!y.c || x.c && !x.c[0]) { + return new BigNumber(x); + } + + if (MODULO_MODE == 9) { + + // Euclidian division: q = sign(y) * floor(x / abs(y)) + // r = x - qy where 0 <= r < abs(y) + s = y.s; + y.s = 1; + q = div(x, y, 0, 3); + y.s = s; + q.s *= s; + } else { + q = div(x, y, 0, MODULO_MODE); + } + + y = x.minus(q.times(y)); + + // To match JavaScript %, ensure sign of zero is sign of dividend. + if (!y.c[0] && MODULO_MODE == 1) y.s = x.s; + + return y; + }; + + + /* + * n * 0 = 0 + * n * N = N + * n * I = I + * 0 * n = 0 + * 0 * 0 = 0 + * 0 * N = N + * 0 * I = N + * N * n = N + * N * 0 = N + * N * N = N + * N * I = N + * I * n = I + * I * 0 = N + * I * N = N + * I * I = I + * + * Return a new BigNumber whose value is the value of this BigNumber multiplied by the value + * of BigNumber(y, b). + */ + P.multipliedBy = P.times = function (y, b) { + var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc, + base, sqrtBase, + x = this, + xc = x.c, + yc = (y = new BigNumber(y, b)).c; + + // Either NaN, ±Infinity or ±0? + if (!xc || !yc || !xc[0] || !yc[0]) { + + // Return NaN if either is NaN, or one is 0 and the other is Infinity. + if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) { + y.c = y.e = y.s = null; + } else { + y.s *= x.s; + + // Return ±Infinity if either is ±Infinity. + if (!xc || !yc) { + y.c = y.e = null; + + // Return ±0 if either is ±0. + } else { + y.c = [0]; + y.e = 0; + } + } + + return y; + } + + e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE); + y.s *= x.s; + xcL = xc.length; + ycL = yc.length; + + // Ensure xc points to longer array and xcL to its length. + if (xcL < ycL) { + zc = xc; + xc = yc; + yc = zc; + i = xcL; + xcL = ycL; + ycL = i; + } + + // Initialise the result array with zeros. + for (i = xcL + ycL, zc = []; i--; zc.push(0)); + + base = BASE; + sqrtBase = SQRT_BASE; + + for (i = ycL; --i >= 0;) { + c = 0; + ylo = yc[i] % sqrtBase; + yhi = yc[i] / sqrtBase | 0; + + for (k = xcL, j = i + k; j > i;) { + xlo = xc[--k] % sqrtBase; + xhi = xc[k] / sqrtBase | 0; + m = yhi * xlo + xhi * ylo; + xlo = ylo * xlo + ((m % sqrtBase) * sqrtBase) + zc[j] + c; + c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi; + zc[j--] = xlo % base; + } + + zc[j] = c; + } + + if (c) { + ++e; + } else { + zc.splice(0, 1); + } + + return normalise(y, zc, e); + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber negated, + * i.e. multiplied by -1. + */ + P.negated = function () { + var x = new BigNumber(this); + x.s = -x.s || null; + return x; + }; + + + /* + * n + 0 = n + * n + N = N + * n + I = I + * 0 + n = n + * 0 + 0 = 0 + * 0 + N = N + * 0 + I = I + * N + n = N + * N + 0 = N + * N + N = N + * N + I = N + * I + n = I + * I + 0 = I + * I + N = N + * I + I = I + * + * Return a new BigNumber whose value is the value of this BigNumber plus the value of + * BigNumber(y, b). + */ + P.plus = function (y, b) { + var t, + x = this, + a = x.s; + + y = new BigNumber(y, b); + b = y.s; + + // Either NaN? + if (!a || !b) return new BigNumber(NaN); + + // Signs differ? + if (a != b) { + y.s = -b; + return x.minus(y); + } + + var xe = x.e / LOG_BASE, + ye = y.e / LOG_BASE, + xc = x.c, + yc = y.c; + + if (!xe || !ye) { + + // Return ±Infinity if either ±Infinity. + if (!xc || !yc) return new BigNumber(a / 0); + + // Either zero? + // Return y if y is non-zero, x if x is non-zero, or zero if both are zero. + if (!xc[0] || !yc[0]) return yc[0] ? y : new BigNumber(xc[0] ? x : a * 0); + } + + xe = bitFloor(xe); + ye = bitFloor(ye); + xc = xc.slice(); + + // Prepend zeros to equalise exponents. Faster to use reverse then do unshifts. + if (a = xe - ye) { + if (a > 0) { + ye = xe; + t = yc; + } else { + a = -a; + t = xc; + } + + t.reverse(); + for (; a--; t.push(0)); + t.reverse(); + } + + a = xc.length; + b = yc.length; + + // Point xc to the longer array, and b to the shorter length. + if (a - b < 0) { + t = yc; + yc = xc; + xc = t; + b = a; + } + + // Only start adding at yc.length - 1 as the further digits of xc can be ignored. + for (a = 0; b;) { + a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0; + xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE; + } + + if (a) { + xc = [a].concat(xc); + ++ye; + } + + // No need to check for zero, as +x + +y != 0 && -x + -y != 0 + // ye = MAX_EXP + 1 possible + return normalise(y, xc, ye); + }; + + + /* + * If sd is undefined or null or true or false, return the number of significant digits of + * the value of this BigNumber, or null if the value of this BigNumber is ±Infinity or NaN. + * If sd is true include integer-part trailing zeros in the count. + * + * Otherwise, if sd is a number, return a new BigNumber whose value is the value of this + * BigNumber rounded to a maximum of sd significant digits using rounding mode rm, or + * ROUNDING_MODE if rm is omitted. + * + * sd {number|boolean} number: significant digits: integer, 1 to MAX inclusive. + * boolean: whether to count integer-part trailing zeros: true or false. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}' + */ + P.precision = P.sd = function (sd, rm) { + var c, n, v, + x = this; + + if (sd != null && sd !== !!sd) { + intCheck(sd, 1, MAX); + if (rm == null) rm = ROUNDING_MODE; + else intCheck(rm, 0, 8); + + return round(new BigNumber(x), sd, rm); + } + + if (!(c = x.c)) return null; + v = c.length - 1; + n = v * LOG_BASE + 1; + + if (v = c[v]) { + + // Subtract the number of trailing zeros of the last element. + for (; v % 10 == 0; v /= 10, n--); + + // Add the number of digits of the first element. + for (v = c[0]; v >= 10; v /= 10, n++); + } + + if (sd && x.e + 1 > n) n = x.e + 1; + + return n; + }; + + + /* + * Return a new BigNumber whose value is the value of this BigNumber shifted by k places + * (powers of 10). Shift to the right if n > 0, and to the left if n < 0. + * + * k {number} Integer, -MAX_SAFE_INTEGER to MAX_SAFE_INTEGER inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {k}' + */ + P.shiftedBy = function (k) { + intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER); + return this.times('1e' + k); + }; + + + /* + * sqrt(-n) = N + * sqrt(N) = N + * sqrt(-I) = N + * sqrt(I) = I + * sqrt(0) = 0 + * sqrt(-0) = -0 + * + * Return a new BigNumber whose value is the square root of the value of this BigNumber, + * rounded according to DECIMAL_PLACES and ROUNDING_MODE. + */ + P.squareRoot = P.sqrt = function () { + var m, n, r, rep, t, + x = this, + c = x.c, + s = x.s, + e = x.e, + dp = DECIMAL_PLACES + 4, + half = new BigNumber('0.5'); + + // Negative/NaN/Infinity/zero? + if (s !== 1 || !c || !c[0]) { + return new BigNumber(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0); + } + + // Initial estimate. + s = Math.sqrt(+valueOf(x)); + + // Math.sqrt underflow/overflow? + // Pass x to Math.sqrt as integer, then adjust the exponent of the result. + if (s == 0 || s == 1 / 0) { + n = coeffToString(c); + if ((n.length + e) % 2 == 0) n += '0'; + s = Math.sqrt(+n); + e = bitFloor((e + 1) / 2) - (e < 0 || e % 2); + + if (s == 1 / 0) { + n = '5e' + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf('e') + 1) + e; + } + + r = new BigNumber(n); + } else { + r = new BigNumber(s + ''); + } + + // Check for zero. + // r could be zero if MIN_EXP is changed after the this value was created. + // This would cause a division by zero (x/t) and hence Infinity below, which would cause + // coeffToString to throw. + if (r.c[0]) { + e = r.e; + s = e + dp; + if (s < 3) s = 0; + + // Newton-Raphson iteration. + for (; ;) { + t = r; + r = half.times(t.plus(div(x, t, dp, 1))); + + if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) { + + // The exponent of r may here be one less than the final result exponent, + // e.g 0.0009999 (e-4) --> 0.001 (e-3), so adjust s so the rounding digits + // are indexed correctly. + if (r.e < e) --s; + n = n.slice(s - 3, s + 1); + + // The 4th rounding digit may be in error by -1 so if the 4 rounding digits + // are 9999 or 4999 (i.e. approaching a rounding boundary) continue the + // iteration. + if (n == '9999' || !rep && n == '4999') { + + // On the first iteration only, check to see if rounding up gives the + // exact result as the nines may infinitely repeat. + if (!rep) { + round(t, t.e + DECIMAL_PLACES + 2, 0); + + if (t.times(t).eq(x)) { + r = t; + break; + } + } + + dp += 4; + s += 4; + rep = 1; + } else { + + // If rounding digits are null, 0{0,4} or 50{0,3}, check for exact + // result. If not, then there are further digits and m will be truthy. + if (!+n || !+n.slice(1) && n.charAt(0) == '5') { + + // Truncate to the first rounding digit. + round(r, r.e + DECIMAL_PLACES + 2, 1); + m = !r.times(r).eq(x); + } + + break; + } + } + } + } + + return round(r, r.e + DECIMAL_PLACES + 1, ROUNDING_MODE, m); + }; + + + /* + * Return a string representing the value of this BigNumber in exponential notation and + * rounded using ROUNDING_MODE to dp fixed decimal places. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}' + */ + P.toExponential = function (dp, rm) { + if (dp != null) { + intCheck(dp, 0, MAX); + dp++; + } + return format(this, dp, rm, 1); + }; + + + /* + * Return a string representing the value of this BigNumber in fixed-point notation rounding + * to dp fixed decimal places using rounding mode rm, or ROUNDING_MODE if rm is omitted. + * + * Note: as with JavaScript's number type, (-0).toFixed(0) is '0', + * but e.g. (-0.00001).toFixed(0) is '-0'. + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}' + */ + P.toFixed = function (dp, rm) { + if (dp != null) { + intCheck(dp, 0, MAX); + dp = dp + this.e + 1; + } + return format(this, dp, rm); + }; + + + /* + * Return a string representing the value of this BigNumber in fixed-point notation rounded + * using rm or ROUNDING_MODE to dp decimal places, and formatted according to the properties + * of the format or FORMAT object (see BigNumber.set). + * + * The formatting object may contain some or all of the properties shown below. + * + * FORMAT = { + * prefix: '', + * groupSize: 3, + * secondaryGroupSize: 0, + * groupSeparator: ',', + * decimalSeparator: '.', + * fractionGroupSize: 0, + * fractionGroupSeparator: '\xA0', // non-breaking space + * suffix: '' + * }; + * + * [dp] {number} Decimal places. Integer, 0 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * [format] {object} Formatting options. See FORMAT pbject above. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {dp|rm}' + * '[BigNumber Error] Argument not an object: {format}' + */ + P.toFormat = function (dp, rm, format) { + var str, + x = this; + + if (format == null) { + if (dp != null && rm && typeof rm == 'object') { + format = rm; + rm = null; + } else if (dp && typeof dp == 'object') { + format = dp; + dp = rm = null; + } else { + format = FORMAT; + } + } else if (typeof format != 'object') { + throw Error + (bignumberError + 'Argument not an object: ' + format); + } + + str = x.toFixed(dp, rm); + + if (x.c) { + var i, + arr = str.split('.'), + g1 = +format.groupSize, + g2 = +format.secondaryGroupSize, + groupSeparator = format.groupSeparator || '', + intPart = arr[0], + fractionPart = arr[1], + isNeg = x.s < 0, + intDigits = isNeg ? intPart.slice(1) : intPart, + len = intDigits.length; + + if (g2) { + i = g1; + g1 = g2; + g2 = i; + len -= i; + } + + if (g1 > 0 && len > 0) { + i = len % g1 || g1; + intPart = intDigits.substr(0, i); + for (; i < len; i += g1) intPart += groupSeparator + intDigits.substr(i, g1); + if (g2 > 0) intPart += groupSeparator + intDigits.slice(i); + if (isNeg) intPart = '-' + intPart; + } + + str = fractionPart + ? intPart + (format.decimalSeparator || '') + ((g2 = +format.fractionGroupSize) + ? fractionPart.replace(new RegExp('\\d{' + g2 + '}\\B', 'g'), + '$&' + (format.fractionGroupSeparator || '')) + : fractionPart) + : intPart; + } + + return (format.prefix || '') + str + (format.suffix || ''); + }; + + + /* + * Return an array of two BigNumbers representing the value of this BigNumber as a simple + * fraction with an integer numerator and an integer denominator. + * The denominator will be a positive non-zero value less than or equal to the specified + * maximum denominator. If a maximum denominator is not specified, the denominator will be + * the lowest value necessary to represent the number exactly. + * + * [md] {number|string|BigNumber} Integer >= 1, or Infinity. The maximum denominator. + * + * '[BigNumber Error] Argument {not an integer|out of range} : {md}' + */ + P.toFraction = function (md) { + var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s, + x = this, + xc = x.c; + + if (md != null) { + n = new BigNumber(md); + + // Throw if md is less than one or is not an integer, unless it is Infinity. + if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE)) { + throw Error + (bignumberError + 'Argument ' + + (n.isInteger() ? 'out of range: ' : 'not an integer: ') + valueOf(n)); + } + } + + if (!xc) return new BigNumber(x); + + d = new BigNumber(ONE); + n1 = d0 = new BigNumber(ONE); + d1 = n0 = new BigNumber(ONE); + s = coeffToString(xc); + + // Determine initial denominator. + // d is a power of 10 and the minimum max denominator that specifies the value exactly. + e = d.e = s.length - x.e - 1; + d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp]; + md = !md || n.comparedTo(d) > 0 ? (e > 0 ? d : n1) : n; + + exp = MAX_EXP; + MAX_EXP = 1 / 0; + n = new BigNumber(s); + + // n0 = d1 = 0 + n0.c[0] = 0; + + for (; ;) { + q = div(n, d, 0, 1); + d2 = d0.plus(q.times(d1)); + if (d2.comparedTo(md) == 1) break; + d0 = d1; + d1 = d2; + n1 = n0.plus(q.times(d2 = n1)); + n0 = d2; + d = n.minus(q.times(d2 = d)); + n = d2; + } + + d2 = div(md.minus(d0), d1, 0, 1); + n0 = n0.plus(d2.times(n1)); + d0 = d0.plus(d2.times(d1)); + n0.s = n1.s = x.s; + e = e * 2; + + // Determine which fraction is closer to x, n0/d0 or n1/d1 + r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo( + div(n0, d0, e, ROUNDING_MODE).minus(x).abs()) < 1 ? [n1, d1] : [n0, d0]; + + MAX_EXP = exp; + + return r; + }; + + + /* + * Return the value of this BigNumber converted to a number primitive. + */ + P.toNumber = function () { + return +valueOf(this); + }; + + + /* + * Return a string representing the value of this BigNumber rounded to sd significant digits + * using rounding mode rm or ROUNDING_MODE. If sd is less than the number of digits + * necessary to represent the integer part of the value in fixed-point notation, then use + * exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * '[BigNumber Error] Argument {not a primitive number|not an integer|out of range}: {sd|rm}' + */ + P.toPrecision = function (sd, rm) { + if (sd != null) intCheck(sd, 1, MAX); + return format(this, sd, rm, 2); + }; + + + /* + * Return a string representing the value of this BigNumber in base b, or base 10 if b is + * omitted. If a base is specified, including base 10, round according to DECIMAL_PLACES and + * ROUNDING_MODE. If a base is not specified, and this BigNumber has a positive exponent + * that is equal to or greater than TO_EXP_POS, or a negative exponent equal to or less than + * TO_EXP_NEG, return exponential notation. + * + * [b] {number} Integer, 2 to ALPHABET.length inclusive. + * + * '[BigNumber Error] Base {not a primitive number|not an integer|out of range}: {b}' + */ + P.toString = function (b) { + var str, + n = this, + s = n.s, + e = n.e; + + // Infinity or NaN? + if (e === null) { + if (s) { + str = 'Infinity'; + if (s < 0) str = '-' + str; + } else { + str = 'NaN'; + } + } else { + if (b == null) { + str = e <= TO_EXP_NEG || e >= TO_EXP_POS + ? toExponential(coeffToString(n.c), e) + : toFixedPoint(coeffToString(n.c), e, '0'); + } else if (b === 10 && alphabetHasNormalDecimalDigits) { + n = round(new BigNumber(n), DECIMAL_PLACES + e + 1, ROUNDING_MODE); + str = toFixedPoint(coeffToString(n.c), n.e, '0'); + } else { + intCheck(b, 2, ALPHABET.length, 'Base'); + str = convertBase(toFixedPoint(coeffToString(n.c), e, '0'), 10, b, s, true); + } + + if (s < 0 && n.c[0]) str = '-' + str; + } + + return str; + }; + + + /* + * Return as toString, but do not accept a base argument, and include the minus sign for + * negative zero. + */ + P.valueOf = P.toJSON = function () { + return valueOf(this); + }; + + + P._isBigNumber = true; + + P[Symbol.toStringTag] = 'BigNumber'; + + // Node.js v10.12.0+ + P[Symbol.for('nodejs.util.inspect.custom')] = P.valueOf; + + if (configObject != null) BigNumber.set(configObject); + + return BigNumber; +} + + +// PRIVATE HELPER FUNCTIONS + +// These functions don't need access to variables, +// e.g. DECIMAL_PLACES, in the scope of the `clone` function above. + + +function bitFloor(n) { + var i = n | 0; + return n > 0 || n === i ? i : i - 1; +} + + +// Return a coefficient array as a string of base 10 digits. +function coeffToString(a) { + var s, z, + i = 1, + j = a.length, + r = a[0] + ''; + + for (; i < j;) { + s = a[i++] + ''; + z = LOG_BASE - s.length; + for (; z--; s = '0' + s); + r += s; + } + + // Determine trailing zeros. + for (j = r.length; r.charCodeAt(--j) === 48;); + + return r.slice(0, j + 1 || 1); +} + + +// Compare the value of BigNumbers x and y. +function compare(x, y) { + var a, b, + xc = x.c, + yc = y.c, + i = x.s, + j = y.s, + k = x.e, + l = y.e; + + // Either NaN? + if (!i || !j) return null; + + a = xc && !xc[0]; + b = yc && !yc[0]; + + // Either zero? + if (a || b) return a ? b ? 0 : -j : i; + + // Signs differ? + if (i != j) return i; + + a = i < 0; + b = k == l; + + // Either Infinity? + if (!xc || !yc) return b ? 0 : !xc ^ a ? 1 : -1; + + // Compare exponents. + if (!b) return k > l ^ a ? 1 : -1; + + j = (k = xc.length) < (l = yc.length) ? k : l; + + // Compare digit by digit. + for (i = 0; i < j; i++) if (xc[i] != yc[i]) return xc[i] > yc[i] ^ a ? 1 : -1; + + // Compare lengths. + return k == l ? 0 : k > l ^ a ? 1 : -1; +} + + +/* + * Check that n is a primitive number, an integer, and in range, otherwise throw. + */ +function intCheck(n, min, max, name) { + if (n < min || n > max || n !== mathfloor(n)) { + throw Error + (bignumberError + (name || 'Argument') + (typeof n == 'number' + ? n < min || n > max ? ' out of range: ' : ' not an integer: ' + : ' not a primitive number: ') + String(n)); + } +} + + +// Assumes finite n. +function isOdd(n) { + var k = n.c.length - 1; + return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0; +} + + +function toExponential(str, e) { + return (str.length > 1 ? str.charAt(0) + '.' + str.slice(1) : str) + + (e < 0 ? 'e' : 'e+') + e; +} + + +function toFixedPoint(str, e, z) { + var len, zs; + + // Negative exponent? + if (e < 0) { + + // Prepend zeros. + for (zs = z + '.'; ++e; zs += z); + str = zs + str; + + // Positive exponent + } else { + len = str.length; + + // Append zeros. + if (++e > len) { + for (zs = z, e -= len; --e; zs += z); + str += zs; + } else if (e < len) { + str = str.slice(0, e) + '.' + str.slice(e); + } + } + + return str; +} + + +// EXPORT + + +export var BigNumber = clone(); + +export default BigNumber; diff --git a/node/node_modules/bignumber.js/doc/API.html b/node/node_modules/bignumber.js/doc/API.html new file mode 100644 index 0000000..bb2b7dd --- /dev/null +++ b/node/node_modules/bignumber.js/doc/API.html @@ -0,0 +1,2249 @@ + + + + + + +bignumber.js API + + + + + + +
+ +

bignumber.js

+ +

A JavaScript library for arbitrary-precision arithmetic.

+

Hosted on GitHub.

+ +

API

+ +

+ See the README on GitHub for a + quick-start introduction. +

+

+ In all examples below, var and semicolons are not shown, and if a commented-out + value is in quotes it means toString has been called on the preceding expression. +

+ + +

CONSTRUCTOR

+ + +
+ BigNumberBigNumber(n [, base]) ⇒ BigNumber +
+

+ n: number|string|BigNumber
+ base: number: integer, 2 to 36 inclusive. (See + ALPHABET to extend this range). +

+

+ Returns a new instance of a BigNumber object with value n, where n + is a numeric value in the specified base, or base 10 if + base is omitted or is null or undefined. +

+

+ Note that the BigNnumber constructor accepts an n of type number purely + as a convenience so that string quotes don't have to be typed when entering literal values, + and that it is the toString value of n that is used rather than its + underlying binary floating point value converted to decimal. +

+
+x = new BigNumber(123.4567)                // '123.4567'
+// 'new' is optional
+y = BigNumber(x)                           // '123.4567'
+

+ If n is a base 10 value it can be in normal or exponential notation. + Values in other bases must be in normal notation. Values in any base can have fraction digits, + i.e. digits after the decimal point. +

+
+new BigNumber(43210)                       // '43210'
+new BigNumber('4.321e+4')                  // '43210'
+new BigNumber('-735.0918e-430')            // '-7.350918e-428'
+new BigNumber('123412421.234324', 5)       // '607236.557696'
+

+ Signed 0, signed Infinity and NaN are supported. +

+
+new BigNumber('-Infinity')                 // '-Infinity'
+new BigNumber(NaN)                         // 'NaN'
+new BigNumber(-0)                          // '0'
+new BigNumber('.5')                        // '0.5'
+new BigNumber('+2')                        // '2'
+

+ String values in hexadecimal literal form, e.g. '0xff' or '0xFF' + (but not '0xfF'), are valid, as are string values with the octal and binary + prefixs '0o' and '0b'. String values in octal literal form without + the prefix will be interpreted as decimals, e.g. '011' is interpreted as 11, not 9. +

+
+new BigNumber(-10110100.1, 2)              // '-180.5'
+new BigNumber('-0b10110100.1')             // '-180.5'
+new BigNumber('ff.8', 16)                  // '255.5'
+new BigNumber('0xff.8')                    // '255.5'
+

+ If a base is specified, n is rounded according to the current + DECIMAL_PLACES and + ROUNDING_MODE settings. This includes base + 10 so don't include a base parameter for decimal values unless + this behaviour is wanted. +

+
BigNumber.config({ DECIMAL_PLACES: 5 })
+new BigNumber(1.23456789)                  // '1.23456789'
+new BigNumber(1.23456789, 10)              // '1.23457'
+

An error is thrown if base is invalid. See Errors.

+

+ There is no limit to the number of digits of a value of type string (other than + that of JavaScript's maximum array size). See RANGE to set + the maximum and minimum possible exponent value of a BigNumber. +

+
+new BigNumber('5032485723458348569331745.33434346346912144534543')
+new BigNumber('4.321e10000000')
+

BigNumber NaN is returned if n is invalid + (unless BigNumber.DEBUG is true, see below).

+
+new BigNumber('.1*')                       // 'NaN'
+new BigNumber('blurgh')                    // 'NaN'
+new BigNumber(9, 2)                        // 'NaN'
+

+ To aid in debugging, if BigNumber.DEBUG is true then an error will + be thrown on an invalid n. An error will also be thrown if n is of + type number and has more than 15 significant digits, as calling + toString or valueOf on + these numbers may not result in the intended value. +

+
+console.log(823456789123456.3)            //  823456789123456.2
+new BigNumber(823456789123456.3)          // '823456789123456.2'
+BigNumber.DEBUG = true
+// '[BigNumber Error] Number primitive has more than 15 significant digits'
+new BigNumber(823456789123456.3)
+// '[BigNumber Error] Not a base 2 number'
+new BigNumber(9, 2)
+

+ A BigNumber can also be created from an object literal. + Use isBigNumber to check that it is well-formed. +

+
new BigNumber({ s: 1, e: 2, c: [ 777, 12300000000000 ], _isBigNumber: true })    // '777.123'
+ + + + +

Methods

+

The static methods of a BigNumber constructor.

+ + + + +
clone + .clone([object]) ⇒ BigNumber constructor +
+

object: object

+

+ Returns a new independent BigNumber constructor with configuration as described by + object (see config), or with the default + configuration if object is null or undefined. +

+

+ Throws if object is not an object. See Errors. +

+
BigNumber.config({ DECIMAL_PLACES: 5 })
+BN = BigNumber.clone({ DECIMAL_PLACES: 9 })
+
+x = new BigNumber(1)
+y = new BN(1)
+
+x.div(3)                        // 0.33333
+y.div(3)                        // 0.333333333
+
+// BN = BigNumber.clone({ DECIMAL_PLACES: 9 }) is equivalent to:
+BN = BigNumber.clone()
+BN.config({ DECIMAL_PLACES: 9 })
+ + + +
configset([object]) ⇒ object
+

+ object: object: an object that contains some or all of the following + properties. +

+

Configures the settings for this particular BigNumber constructor.

+ +
+
DECIMAL_PLACES
+
+ number: integer, 0 to 1e+9 inclusive
+ Default value: 20 +
+
+ The maximum number of decimal places of the results of operations involving + division, i.e. division, square root and base conversion operations, and power operations + with negative exponents.
+
+
+
BigNumber.config({ DECIMAL_PLACES: 5 })
+BigNumber.set({ DECIMAL_PLACES: 5 })    // equivalent
+
+ + + +
ROUNDING_MODE
+
+ number: integer, 0 to 8 inclusive
+ Default value: 4 (ROUND_HALF_UP) +
+
+ The rounding mode used in the above operations and the default rounding mode of + decimalPlaces, + precision, + toExponential, + toFixed, + toFormat and + toPrecision. +
+
The modes are available as enumerated properties of the BigNumber constructor.
+
+
BigNumber.config({ ROUNDING_MODE: 0 })
+BigNumber.set({ ROUNDING_MODE: BigNumber.ROUND_UP })    // equivalent
+
+ + + +
EXPONENTIAL_AT
+
+ number: integer, magnitude 0 to 1e+9 inclusive, or +
+ number[]: [ integer -1e+9 to 0 inclusive, integer + 0 to 1e+9 inclusive ]
+ Default value: [-7, 20] +
+
+ The exponent value(s) at which toString returns exponential notation. +
+
+ If a single number is assigned, the value is the exponent magnitude.
+ If an array of two numbers is assigned then the first number is the negative exponent + value at and beneath which exponential notation is used, and the second number is the + positive exponent value at and above which the same. +
+
+ For example, to emulate JavaScript numbers in terms of the exponent values at which they + begin to use exponential notation, use [-7, 20]. +
+
+
BigNumber.config({ EXPONENTIAL_AT: 2 })
+new BigNumber(12.3)         // '12.3'        e is only 1
+new BigNumber(123)          // '1.23e+2'
+new BigNumber(0.123)        // '0.123'       e is only -1
+new BigNumber(0.0123)       // '1.23e-2'
+
+BigNumber.config({ EXPONENTIAL_AT: [-7, 20] })
+new BigNumber(123456789)    // '123456789'   e is only 8
+new BigNumber(0.000000123)  // '1.23e-7'
+
+// Almost never return exponential notation:
+BigNumber.config({ EXPONENTIAL_AT: 1e+9 })
+
+// Always return exponential notation:
+BigNumber.config({ EXPONENTIAL_AT: 0 })
+
+
+ Regardless of the value of EXPONENTIAL_AT, the toFixed method + will always return a value in normal notation and the toExponential method + will always return a value in exponential form. +
+
+ Calling toString with a base argument, e.g. toString(10), will + also always return normal notation. +
+ + + +
RANGE
+
+ number: integer, magnitude 1 to 1e+9 inclusive, or +
+ number[]: [ integer -1e+9 to -1 inclusive, integer + 1 to 1e+9 inclusive ]
+ Default value: [-1e+9, 1e+9] +
+
+ The exponent value(s) beyond which overflow to Infinity and underflow to + zero occurs. +
+
+ If a single number is assigned, it is the maximum exponent magnitude: values wth a + positive exponent of greater magnitude become Infinity and those with a + negative exponent of greater magnitude become zero. +
+ If an array of two numbers is assigned then the first number is the negative exponent + limit and the second number is the positive exponent limit. +
+
+ For example, to emulate JavaScript numbers in terms of the exponent values at which they + become zero and Infinity, use [-324, 308]. +
+
+
BigNumber.config({ RANGE: 500 })
+BigNumber.config().RANGE     // [ -500, 500 ]
+new BigNumber('9.999e499')   // '9.999e+499'
+new BigNumber('1e500')       // 'Infinity'
+new BigNumber('1e-499')      // '1e-499'
+new BigNumber('1e-500')      // '0'
+
+BigNumber.config({ RANGE: [-3, 4] })
+new BigNumber(99999)         // '99999'      e is only 4
+new BigNumber(100000)        // 'Infinity'   e is 5
+new BigNumber(0.001)         // '0.01'       e is only -3
+new BigNumber(0.0001)        // '0'          e is -4
+
+
+ The largest possible magnitude of a finite BigNumber is + 9.999...e+1000000000.
+ The smallest possible magnitude of a non-zero BigNumber is 1e-1000000000. +
+ + + +
CRYPTO
+
+ boolean: true or false.
+ Default value: false +
+
+ The value that determines whether cryptographically-secure pseudo-random number + generation is used. +
+
+ If CRYPTO is set to true then the + random method will generate random digits using + crypto.getRandomValues in browsers that support it, or + crypto.randomBytes if using Node.js. +
+
+ If neither function is supported by the host environment then attempting to set + CRYPTO to true will fail and an exception will be thrown. +
+
+ If CRYPTO is false then the source of randomness used will be + Math.random (which is assumed to generate at least 30 bits of + randomness). +
+
See random.
+
+
+// Node.js
+const crypto = require('crypto');   // CommonJS
+import * as crypto from 'crypto';   // ES module
+
+global.crypto = crypto;
+
+BigNumber.config({ CRYPTO: true })
+BigNumber.config().CRYPTO       // true
+BigNumber.random()              // 0.54340758610486147524
+
+ + + +
MODULO_MODE
+
+ number: integer, 0 to 9 inclusive
+ Default value: 1 (ROUND_DOWN) +
+
The modulo mode used when calculating the modulus: a mod n.
+
+ The quotient, q = a / n, is calculated according to the + ROUNDING_MODE that corresponds to the chosen + MODULO_MODE. +
+
The remainder, r, is calculated as: r = a - n * q.
+
+ The modes that are most commonly used for the modulus/remainder operation are shown in + the following table. Although the other rounding modes can be used, they may not give + useful results. +
+
+ + + + + + + + + + + + + + + + + + + + + + +
PropertyValueDescription
ROUND_UP0 + The remainder is positive if the dividend is negative, otherwise it is negative. +
ROUND_DOWN1 + The remainder has the same sign as the dividend.
+ This uses 'truncating division' and matches the behaviour of JavaScript's + remainder operator %. +
ROUND_FLOOR3 + The remainder has the same sign as the divisor.
+ This matches Python's % operator. +
ROUND_HALF_EVEN6The IEEE 754 remainder function.
EUCLID9 + The remainder is always positive. Euclidian division:
+ q = sign(n) * floor(a / abs(n)) +
+
+
+ The rounding/modulo modes are available as enumerated properties of the BigNumber + constructor. +
+
See modulo.
+
+
BigNumber.config({ MODULO_MODE: BigNumber.EUCLID })
+BigNumber.config({ MODULO_MODE: 9 })          // equivalent
+
+ + + +
POW_PRECISION
+
+ number: integer, 0 to 1e+9 inclusive.
+ Default value: 0 +
+
+ The maximum precision, i.e. number of significant digits, of the result of the power + operation (unless a modulus is specified). +
+
If set to 0, the number of significant digits will not be limited.
+
See exponentiatedBy.
+
BigNumber.config({ POW_PRECISION: 100 })
+ + + +
FORMAT
+
object
+
+ The FORMAT object configures the format of the string returned by the + toFormat method. +
+
+ The example below shows the properties of the FORMAT object that are + recognised, and their default values. +
+
+ Unlike the other configuration properties, the values of the properties of the + FORMAT object will not be checked for validity. The existing + FORMAT object will simply be replaced by the object that is passed in. + The object can include any number of the properties shown below. +
+
See toFormat for examples of usage.
+
+
+BigNumber.config({
+  FORMAT: {
+    // string to prepend
+    prefix: '',
+    // decimal separator
+    decimalSeparator: '.',
+    // grouping separator of the integer part
+    groupSeparator: ',',
+    // primary grouping size of the integer part
+    groupSize: 3,
+    // secondary grouping size of the integer part
+    secondaryGroupSize: 0,
+    // grouping separator of the fraction part
+    fractionGroupSeparator: ' ',
+    // grouping size of the fraction part
+    fractionGroupSize: 0,
+    // string to append
+    suffix: ''
+  }
+});
+
+ + + +
ALPHABET
+
+ string
+ Default value: '0123456789abcdefghijklmnopqrstuvwxyz' +
+
+ The alphabet used for base conversion. The length of the alphabet corresponds to the + maximum value of the base argument that can be passed to the + BigNumber constructor or + toString. +
+
+ There is no maximum length for the alphabet, but it must be at least 2 characters long, and + it must not contain whitespace or a repeated character, or the sign indicators + '+' and '-', or the decimal separator '.'. +
+
+
// duodecimal (base 12)
+BigNumber.config({ ALPHABET: '0123456789TE' })
+x = new BigNumber('T', 12)
+x.toString()                // '10'
+x.toString(12)              // 'T'
+
+ + + +
+

+

Returns an object with the above properties and their current values.

+

+ Throws if object is not an object, or if an invalid value is assigned to + one or more of the above properties. See Errors. +

+
+BigNumber.config({
+  DECIMAL_PLACES: 40,
+  ROUNDING_MODE: BigNumber.ROUND_HALF_CEIL,
+  EXPONENTIAL_AT: [-10, 20],
+  RANGE: [-500, 500],
+  CRYPTO: true,
+  MODULO_MODE: BigNumber.ROUND_FLOOR,
+  POW_PRECISION: 80,
+  FORMAT: {
+    groupSize: 3,
+    groupSeparator: ' ',
+    decimalSeparator: ','
+  },
+  ALPHABET: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'
+});
+
+obj = BigNumber.config();
+obj.DECIMAL_PLACES        // 40
+obj.RANGE                 // [-500, 500]
+ + + +
+ isBigNumber.isBigNumber(value) ⇒ boolean +
+

value: any

+

+ Returns true if value is a BigNumber instance, otherwise returns + false. +

+
x = 42
+y = new BigNumber(x)
+
+BigNumber.isBigNumber(x)             // false
+y instanceof BigNumber               // true
+BigNumber.isBigNumber(y)             // true
+
+BN = BigNumber.clone();
+z = new BN(x)
+z instanceof BigNumber               // false
+BigNumber.isBigNumber(z)             // true
+

+ If value is a BigNumber instance and BigNumber.DEBUG is true, + then this method will also check if value is well-formed, and throw if it is not. + See Errors. +

+

+ The check can be useful if creating a BigNumber from an object literal. + See BigNumber. +

+
+x = new BigNumber(10)
+
+// Change x.c to an illegitimate value.
+x.c = NaN
+
+BigNumber.DEBUG = false
+
+// No error.
+BigNumber.isBigNumber(x)    // true
+
+BigNumber.DEBUG = true
+
+// Error.
+BigNumber.isBigNumber(x)    // '[BigNumber Error] Invalid BigNumber'
+ + + +
maximum.max(n...) ⇒ BigNumber
+

+ n: number|string|BigNumber
+ See BigNumber for further parameter details. +

+

+ Returns a BigNumber whose value is the maximum of the arguments. +

+

The return value is always exact and unrounded.

+
x = new BigNumber('3257869345.0378653')
+BigNumber.maximum(4e9, x, '123456789.9')      // '4000000000'
+
+arr = [12, '13', new BigNumber(14)]
+BigNumber.max.apply(null, arr)                // '14'
+ + + +
minimum.min(n...) ⇒ BigNumber
+

+ n: number|string|BigNumber
+ See BigNumber for further parameter details. +

+

+ Returns a BigNumber whose value is the minimum of the arguments. +

+

The return value is always exact and unrounded.

+
x = new BigNumber('3257869345.0378653')
+BigNumber.minimum(4e9, x, '123456789.9')      // '123456789.9'
+
+arr = [2, new BigNumber(-14), '-15.9999', -12]
+BigNumber.min.apply(null, arr)                // '-15.9999'
+ + + +
+ random.random([dp]) ⇒ BigNumber +
+

dp: number: integer, 0 to 1e+9 inclusive

+

+ Returns a new BigNumber with a pseudo-random value equal to or greater than 0 and + less than 1. +

+

+ The return value will have dp decimal places (or less if trailing zeros are + produced).
+ If dp is omitted then the number of decimal places will default to the current + DECIMAL_PLACES setting. +

+

+ Depending on the value of this BigNumber constructor's + CRYPTO setting and the support for the + crypto object in the host environment, the random digits of the return value are + generated by either Math.random (fastest), crypto.getRandomValues + (Web Cryptography API in recent browsers) or crypto.randomBytes (Node.js). +

+

+ To be able to set CRYPTO to true when using + Node.js, the crypto object must be available globally: +

+
// Node.js
+const crypto = require('crypto');   // CommonJS
+import * as crypto from 'crypto';   // ES module
+global.crypto = crypto;
+

+ If CRYPTO is true, i.e. one of the + crypto methods is to be used, the value of a returned BigNumber should be + cryptographically-secure and statistically indistinguishable from a random value. +

+

+ Throws if dp is invalid. See Errors. +

+
BigNumber.config({ DECIMAL_PLACES: 10 })
+BigNumber.random()              // '0.4117936847'
+BigNumber.random(20)            // '0.78193327636914089009'
+ + + +
sum.sum(n...) ⇒ BigNumber
+

+ n: number|string|BigNumber
+ See BigNumber for further parameter details. +

+

Returns a BigNumber whose value is the sum of the arguments.

+

The return value is always exact and unrounded.

+
x = new BigNumber('3257869345.0378653')
+BigNumber.sum(4e9, x, '123456789.9')      // '7381326134.9378653'
+
+arr = [2, new BigNumber(14), '15.9999', 12]
+BigNumber.sum.apply(null, arr)            // '43.9999'
+ + + +

Properties

+

+ The library's enumerated rounding modes are stored as properties of the constructor.
+ (They are not referenced internally by the library itself.) +

+

+ Rounding modes 0 to 6 (inclusive) are the same as those of Java's + BigDecimal class. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyValueDescription
ROUND_UP0Rounds away from zero
ROUND_DOWN1Rounds towards zero
ROUND_CEIL2Rounds towards Infinity
ROUND_FLOOR3Rounds towards -Infinity
ROUND_HALF_UP4 + Rounds towards nearest neighbour.
+ If equidistant, rounds away from zero +
ROUND_HALF_DOWN5 + Rounds towards nearest neighbour.
+ If equidistant, rounds towards zero +
ROUND_HALF_EVEN6 + Rounds towards nearest neighbour.
+ If equidistant, rounds towards even neighbour +
ROUND_HALF_CEIL7 + Rounds towards nearest neighbour.
+ If equidistant, rounds towards Infinity +
ROUND_HALF_FLOOR8 + Rounds towards nearest neighbour.
+ If equidistant, rounds towards -Infinity +
+
+BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_CEIL })
+BigNumber.config({ ROUNDING_MODE: 2 })     // equivalent
+ +
DEBUG
+

undefined|false|true

+

+ If BigNumber.DEBUG is set true then an error will be thrown + if this BigNumber constructor receives an invalid value, such as + a value of type number with more than 15 significant digits. + See BigNumber. +

+

+ An error will also be thrown if the isBigNumber + method receives a BigNumber that is not well-formed. + See isBigNumber. +

+
BigNumber.DEBUG = true
+ + +

INSTANCE

+ + +

Methods

+

The methods inherited by a BigNumber instance from its constructor's prototype object.

+

A BigNumber is immutable in the sense that it is not changed by its methods.

+

+ The treatment of ±0, ±Infinity and NaN is + consistent with how JavaScript treats these values. +

+

Many method names have a shorter alias.

+ + + +
absoluteValue.abs() ⇒ BigNumber
+

+ Returns a BigNumber whose value is the absolute value, i.e. the magnitude, of the value of + this BigNumber. +

+

The return value is always exact and unrounded.

+
+x = new BigNumber(-0.8)
+y = x.absoluteValue()           // '0.8'
+z = y.abs()                     // '0.8'
+ + + +
+ comparedTo.comparedTo(n [, base]) ⇒ number +
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+ + + + + + + + + + + + + + + + + + +
Returns 
1If the value of this BigNumber is greater than the value of n
-1If the value of this BigNumber is less than the value of n
0If this BigNumber and n have the same value
nullIf the value of either this BigNumber or n is NaN
+
+x = new BigNumber(Infinity)
+y = new BigNumber(5)
+x.comparedTo(y)                 // 1
+x.comparedTo(x.minus(1))        // 0
+y.comparedTo(NaN)               // null
+y.comparedTo('110', 2)          // -1
+ + + +
+ decimalPlaces.dp([dp [, rm]]) ⇒ BigNumber|number +
+

+ dp: number: integer, 0 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive +

+

+ If dp is a number, returns a BigNumber whose value is the value of this BigNumber + rounded by rounding mode rm to a maximum of dp decimal places. +

+

+ If dp is omitted, or is null or undefined, the return + value is the number of decimal places of the value of this BigNumber, or null if + the value of this BigNumber is ±Infinity or NaN. +

+

+ If rm is omitted, or is null or undefined, + ROUNDING_MODE is used. +

+

+ Throws if dp or rm is invalid. See Errors. +

+
+x = new BigNumber(1234.56)
+x.decimalPlaces(1)                     // '1234.6'
+x.dp()                                 // 2
+x.decimalPlaces(2)                     // '1234.56'
+x.dp(10)                               // '1234.56'
+x.decimalPlaces(0, 1)                  // '1234'
+x.dp(0, 6)                             // '1235'
+x.decimalPlaces(1, 1)                  // '1234.5'
+x.dp(1, BigNumber.ROUND_HALF_EVEN)     // '1234.6'
+x                                      // '1234.56'
+y = new BigNumber('9.9e-101')
+y.dp()                                 // 102
+ + + +
dividedBy.div(n [, base]) ⇒ BigNumber +
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+

+ Returns a BigNumber whose value is the value of this BigNumber divided by + n, rounded according to the current + DECIMAL_PLACES and + ROUNDING_MODE settings. +

+
+x = new BigNumber(355)
+y = new BigNumber(113)
+x.dividedBy(y)                  // '3.14159292035398230088'
+x.div(5)                        // '71'
+x.div(47, 16)                   // '5'
+ + + +
+ dividedToIntegerBy.idiv(n [, base]) ⇒ + BigNumber +
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+

+ Returns a BigNumber whose value is the integer part of dividing the value of this BigNumber by + n. +

+
+x = new BigNumber(5)
+y = new BigNumber(3)
+x.dividedToIntegerBy(y)         // '1'
+x.idiv(0.7)                     // '7'
+x.idiv('0.f', 16)               // '5'
+ + + +
+ exponentiatedBy.pow(n [, m]) ⇒ BigNumber +
+

+ n: number|string|BigNumber: integer
+ m: number|string|BigNumber +

+

+ Returns a BigNumber whose value is the value of this BigNumber exponentiated by + n, i.e. raised to the power n, and optionally modulo a modulus + m. +

+

+ Throws if n is not an integer. See Errors. +

+

+ If n is negative the result is rounded according to the current + DECIMAL_PLACES and + ROUNDING_MODE settings. +

+

+ As the number of digits of the result of the power operation can grow so large so quickly, + e.g. 123.45610000 has over 50000 digits, the number of significant + digits calculated is limited to the value of the + POW_PRECISION setting (unless a modulus + m is specified). +

+

+ By default POW_PRECISION is set to 0. + This means that an unlimited number of significant digits will be calculated, and that the + method's performance will decrease dramatically for larger exponents. +

+

+ If m is specified and the value of m, n and this + BigNumber are integers, and n is positive, then a fast modular exponentiation + algorithm is used, otherwise the operation will be performed as + x.exponentiatedBy(n).modulo(m) with a + POW_PRECISION of 0. +

+
+Math.pow(0.7, 2)                // 0.48999999999999994
+x = new BigNumber(0.7)
+x.exponentiatedBy(2)            // '0.49'
+BigNumber(3).pow(-2)            // '0.11111111111111111111'
+ + + +
+ integerValue.integerValue([rm]) ⇒ BigNumber +
+

+ rm: number: integer, 0 to 8 inclusive +

+

+ Returns a BigNumber whose value is the value of this BigNumber rounded to an integer using + rounding mode rm. +

+

+ If rm is omitted, or is null or undefined, + ROUNDING_MODE is used. +

+

+ Throws if rm is invalid. See Errors. +

+
+x = new BigNumber(123.456)
+x.integerValue()                        // '123'
+x.integerValue(BigNumber.ROUND_CEIL)    // '124'
+y = new BigNumber(-12.7)
+y.integerValue()                        // '-13'
+y.integerValue(BigNumber.ROUND_DOWN)    // '-12'
+

+ The following is an example of how to add a prototype method that emulates JavaScript's + Math.round function. Math.ceil, Math.floor and + Math.trunc can be emulated in the same way with + BigNumber.ROUND_CEIL, BigNumber.ROUND_FLOOR and + BigNumber.ROUND_DOWN respectively. +

+
+BigNumber.prototype.round = function () {
+  return this.integerValue(BigNumber.ROUND_HALF_CEIL);
+};
+x.round()                               // '123'
+ + + +
isEqualTo.eq(n [, base]) ⇒ boolean
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+

+ Returns true if the value of this BigNumber is equal to the value of + n, otherwise returns false.
+ As with JavaScript, NaN does not equal NaN. +

+

Note: This method uses the comparedTo method internally.

+
+0 === 1e-324                    // true
+x = new BigNumber(0)
+x.isEqualTo('1e-324')           // false
+BigNumber(-0).eq(x)             // true  ( -0 === 0 )
+BigNumber(255).eq('ff', 16)     // true
+
+y = new BigNumber(NaN)
+y.isEqualTo(NaN)                // false
+ + + +
isFinite.isFinite() ⇒ boolean
+

+ Returns true if the value of this BigNumber is a finite number, otherwise + returns false. +

+

+ The only possible non-finite values of a BigNumber are NaN, Infinity + and -Infinity. +

+
+x = new BigNumber(1)
+x.isFinite()                    // true
+y = new BigNumber(Infinity)
+y.isFinite()                    // false
+

+ Note: The native method isFinite() can be used if + n <= Number.MAX_VALUE. +

+ + + +
isGreaterThan.gt(n [, base]) ⇒ boolean
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+

+ Returns true if the value of this BigNumber is greater than the value of + n, otherwise returns false. +

+

Note: This method uses the comparedTo method internally.

+
+0.1 > (0.3 - 0.2)                             // true
+x = new BigNumber(0.1)
+x.isGreaterThan(BigNumber(0.3).minus(0.2))    // false
+BigNumber(0).gt(x)                            // false
+BigNumber(11, 3).gt(11.1, 2)                  // true
+ + + +
+ isGreaterThanOrEqualTo.gte(n [, base]) ⇒ boolean +
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+

+ Returns true if the value of this BigNumber is greater than or equal to the value + of n, otherwise returns false. +

+

Note: This method uses the comparedTo method internally.

+
+(0.3 - 0.2) >= 0.1                     // false
+x = new BigNumber(0.3).minus(0.2)
+x.isGreaterThanOrEqualTo(0.1)          // true
+BigNumber(1).gte(x)                    // true
+BigNumber(10, 18).gte('i', 36)         // true
+ + + +
isInteger.isInteger() ⇒ boolean
+

+ Returns true if the value of this BigNumber is an integer, otherwise returns + false. +

+
+x = new BigNumber(1)
+x.isInteger()                   // true
+y = new BigNumber(123.456)
+y.isInteger()                   // false
+ + + +
isLessThan.lt(n [, base]) ⇒ boolean
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+

+ Returns true if the value of this BigNumber is less than the value of + n, otherwise returns false. +

+

Note: This method uses the comparedTo method internally.

+
+(0.3 - 0.2) < 0.1                       // true
+x = new BigNumber(0.3).minus(0.2)
+x.isLessThan(0.1)                       // false
+BigNumber(0).lt(x)                      // true
+BigNumber(11.1, 2).lt(11, 3)            // true
+ + + +
+ isLessThanOrEqualTo.lte(n [, base]) ⇒ boolean +
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+

+ Returns true if the value of this BigNumber is less than or equal to the value of + n, otherwise returns false. +

+

Note: This method uses the comparedTo method internally.

+
+0.1 <= (0.3 - 0.2)                                // false
+x = new BigNumber(0.1)
+x.isLessThanOrEqualTo(BigNumber(0.3).minus(0.2))  // true
+BigNumber(-1).lte(x)                              // true
+BigNumber(10, 18).lte('i', 36)                    // true
+ + + +
isNaN.isNaN() ⇒ boolean
+

+ Returns true if the value of this BigNumber is NaN, otherwise + returns false. +

+
+x = new BigNumber(NaN)
+x.isNaN()                       // true
+y = new BigNumber('Infinity')
+y.isNaN()                       // false
+

Note: The native method isNaN() can also be used.

+ + + +
isNegative.isNegative() ⇒ boolean
+

+ Returns true if the sign of this BigNumber is negative, otherwise returns + false. +

+
+x = new BigNumber(-0)
+x.isNegative()                  // true
+y = new BigNumber(2)
+y.isNegative()                  // false
+

Note: n < 0 can be used if n <= -Number.MIN_VALUE.

+ + + +
isPositive.isPositive() ⇒ boolean
+

+ Returns true if the sign of this BigNumber is positive, otherwise returns + false. +

+
+x = new BigNumber(-0)
+x.isPositive()                  // false
+y = new BigNumber(2)
+y.isPositive()                  // true
+ + + +
isZero.isZero() ⇒ boolean
+

+ Returns true if the value of this BigNumber is zero or minus zero, otherwise + returns false. +

+
+x = new BigNumber(-0)
+x.isZero() && x.isNegative()         // true
+y = new BigNumber(Infinity)
+y.isZero()                      // false
+

Note: n == 0 can be used if n >= Number.MIN_VALUE.

+ + + +
+ minus.minus(n [, base]) ⇒ BigNumber +
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+

Returns a BigNumber whose value is the value of this BigNumber minus n.

+

The return value is always exact and unrounded.

+
+0.3 - 0.1                       // 0.19999999999999998
+x = new BigNumber(0.3)
+x.minus(0.1)                    // '0.2'
+x.minus(0.6, 20)                // '0'
+ + + +
modulo.mod(n [, base]) ⇒ BigNumber
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+

+ Returns a BigNumber whose value is the value of this BigNumber modulo n, i.e. + the integer remainder of dividing this BigNumber by n. +

+

+ The value returned, and in particular its sign, is dependent on the value of the + MODULO_MODE setting of this BigNumber constructor. + If it is 1 (default value), the result will have the same sign as this BigNumber, + and it will match that of Javascript's % operator (within the limits of double + precision) and BigDecimal's remainder method. +

+

The return value is always exact and unrounded.

+

+ See MODULO_MODE for a description of the other + modulo modes. +

+
+1 % 0.9                         // 0.09999999999999998
+x = new BigNumber(1)
+x.modulo(0.9)                   // '0.1'
+y = new BigNumber(33)
+y.mod('a', 33)                  // '3'
+ + + +
+ multipliedBy.times(n [, base]) ⇒ BigNumber +
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+

+ Returns a BigNumber whose value is the value of this BigNumber multiplied by n. +

+

The return value is always exact and unrounded.

+
+0.6 * 3                         // 1.7999999999999998
+x = new BigNumber(0.6)
+y = x.multipliedBy(3)           // '1.8'
+BigNumber('7e+500').times(y)    // '1.26e+501'
+x.multipliedBy('-a', 16)        // '-6'
+ + + +
negated.negated() ⇒ BigNumber
+

+ Returns a BigNumber whose value is the value of this BigNumber negated, i.e. multiplied by + -1. +

+
+x = new BigNumber(1.8)
+x.negated()                     // '-1.8'
+y = new BigNumber(-1.3)
+y.negated()                     // '1.3'
+ + + +
plus.plus(n [, base]) ⇒ BigNumber
+

+ n: number|string|BigNumber
+ base: number
+ See BigNumber for further parameter details. +

+

Returns a BigNumber whose value is the value of this BigNumber plus n.

+

The return value is always exact and unrounded.

+
+0.1 + 0.2                       // 0.30000000000000004
+x = new BigNumber(0.1)
+y = x.plus(0.2)                 // '0.3'
+BigNumber(0.7).plus(x).plus(y)  // '1.1'
+x.plus('0.1', 8)                // '0.225'
+ + + +
+ precision.sd([d [, rm]]) ⇒ BigNumber|number +
+

+ d: number|boolean: integer, 1 to 1e+9 + inclusive, or true or false
+ rm: number: integer, 0 to 8 inclusive. +

+

+ If d is a number, returns a BigNumber whose value is the value of this BigNumber + rounded to a precision of d significant digits using rounding mode + rm. +

+

+ If d is omitted or is null or undefined, the return + value is the number of significant digits of the value of this BigNumber, or null + if the value of this BigNumber is ±Infinity or NaN. +

+

+ If d is true then any trailing zeros of the integer + part of a number are counted as significant digits, otherwise they are not. +

+

+ If rm is omitted or is null or undefined, + ROUNDING_MODE will be used. +

+

+ Throws if d or rm is invalid. See Errors. +

+
+x = new BigNumber(9876.54321)
+x.precision(6)                         // '9876.54'
+x.sd()                                 // 9
+x.precision(6, BigNumber.ROUND_UP)     // '9876.55'
+x.sd(2)                                // '9900'
+x.precision(2, 1)                      // '9800'
+x                                      // '9876.54321'
+y = new BigNumber(987000)
+y.precision()                          // 3
+y.sd(true)                             // 6
+ + + +
shiftedBy.shiftedBy(n) ⇒ BigNumber
+

+ n: number: integer, + -9007199254740991 to 9007199254740991 inclusive +

+

+ Returns a BigNumber whose value is the value of this BigNumber shifted by n + places. +

+ The shift is of the decimal point, i.e. of powers of ten, and is to the left if n + is negative or to the right if n is positive. +

+

The return value is always exact and unrounded.

+

+ Throws if n is invalid. See Errors. +

+
+x = new BigNumber(1.23)
+x.shiftedBy(3)                      // '1230'
+x.shiftedBy(-3)                     // '0.00123'
+ + + +
squareRoot.sqrt() ⇒ BigNumber
+

+ Returns a BigNumber whose value is the square root of the value of this BigNumber, + rounded according to the current + DECIMAL_PLACES and + ROUNDING_MODE settings. +

+

+ The return value will be correctly rounded, i.e. rounded as if the result was first calculated + to an infinite number of correct digits before rounding. +

+
+x = new BigNumber(16)
+x.squareRoot()                  // '4'
+y = new BigNumber(3)
+y.sqrt()                        // '1.73205080756887729353'
+ + + +
+ toExponential.toExponential([dp [, rm]]) ⇒ string +
+

+ dp: number: integer, 0 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive +

+

+ Returns a string representing the value of this BigNumber in exponential notation rounded + using rounding mode rm to dp decimal places, i.e with one digit + before the decimal point and dp digits after it. +

+

+ If the value of this BigNumber in exponential notation has fewer than dp fraction + digits, the return value will be appended with zeros accordingly. +

+

+ If dp is omitted, or is null or undefined, the number + of digits after the decimal point defaults to the minimum number of digits necessary to + represent the value exactly.
+ If rm is omitted or is null or undefined, + ROUNDING_MODE is used. +

+

+ Throws if dp or rm is invalid. See Errors. +

+
+x = 45.6
+y = new BigNumber(x)
+x.toExponential()               // '4.56e+1'
+y.toExponential()               // '4.56e+1'
+x.toExponential(0)              // '5e+1'
+y.toExponential(0)              // '5e+1'
+x.toExponential(1)              // '4.6e+1'
+y.toExponential(1)              // '4.6e+1'
+y.toExponential(1, 1)           // '4.5e+1'  (ROUND_DOWN)
+x.toExponential(3)              // '4.560e+1'
+y.toExponential(3)              // '4.560e+1'
+ + + +
+ toFixed.toFixed([dp [, rm]]) ⇒ string +
+

+ dp: number: integer, 0 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive +

+

+ Returns a string representing the value of this BigNumber in normal (fixed-point) notation + rounded to dp decimal places using rounding mode rm. +

+

+ If the value of this BigNumber in normal notation has fewer than dp fraction + digits, the return value will be appended with zeros accordingly. +

+

+ Unlike Number.prototype.toFixed, which returns exponential notation if a number + is greater or equal to 1021, this method will always return normal + notation. +

+

+ If dp is omitted or is null or undefined, the return + value will be unrounded and in normal notation. This is also unlike + Number.prototype.toFixed, which returns the value to zero decimal places.
+ It is useful when fixed-point notation is required and the current + EXPONENTIAL_AT setting causes + toString to return exponential notation.
+ If rm is omitted or is null or undefined, + ROUNDING_MODE is used. +

+

+ Throws if dp or rm is invalid. See Errors. +

+
+x = 3.456
+y = new BigNumber(x)
+x.toFixed()                     // '3'
+y.toFixed()                     // '3.456'
+y.toFixed(0)                    // '3'
+x.toFixed(2)                    // '3.46'
+y.toFixed(2)                    // '3.46'
+y.toFixed(2, 1)                 // '3.45'  (ROUND_DOWN)
+x.toFixed(5)                    // '3.45600'
+y.toFixed(5)                    // '3.45600'
+ + + +
+ toFormat.toFormat([dp [, rm[, format]]]) ⇒ string +
+

+ dp: number: integer, 0 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive
+ format: object: see FORMAT +

+

+

+ Returns a string representing the value of this BigNumber in normal (fixed-point) notation + rounded to dp decimal places using rounding mode rm, and formatted + according to the properties of the format object. +

+

+ See FORMAT and the examples below for the properties of the + format object, their types, and their usage. A formatting object may contain + some or all of the recognised properties. +

+

+ If dp is omitted or is null or undefined, then the + return value is not rounded to a fixed number of decimal places.
+ If rm is omitted or is null or undefined, + ROUNDING_MODE is used.
+ If format is omitted or is null or undefined, the + FORMAT object is used. +

+

+ Throws if dp, rm or format is invalid. See + Errors. +

+
+fmt = {
+  prefix: '',
+  decimalSeparator: '.',
+  groupSeparator: ',',
+  groupSize: 3,
+  secondaryGroupSize: 0,
+  fractionGroupSeparator: ' ',
+  fractionGroupSize: 0,
+  suffix: ''
+}
+
+x = new BigNumber('123456789.123456789')
+
+// Set the global formatting options
+BigNumber.config({ FORMAT: fmt })
+
+x.toFormat()                              // '123,456,789.123456789'
+x.toFormat(3)                             // '123,456,789.123'
+
+// If a reference to the object assigned to FORMAT has been retained,
+// the format properties can be changed directly
+fmt.groupSeparator = ' '
+fmt.fractionGroupSize = 5
+x.toFormat()                              // '123 456 789.12345 6789'
+
+// Alternatively, pass the formatting options as an argument
+fmt = {
+  prefix: '=> ',
+  decimalSeparator: ',',
+  groupSeparator: '.',
+  groupSize: 3,
+  secondaryGroupSize: 2
+}
+
+x.toFormat()                              // '123 456 789.12345 6789'
+x.toFormat(fmt)                           // '=> 12.34.56.789,123456789'
+x.toFormat(2, fmt)                        // '=> 12.34.56.789,12'
+x.toFormat(3, BigNumber.ROUND_UP, fmt)    // '=> 12.34.56.789,124'
+ + + +
+ toFraction.toFraction([maximum_denominator]) + ⇒ [BigNumber, BigNumber] +
+

+ maximum_denominator: + number|string|BigNumber: integer >= 1 and <= + Infinity +

+

+ Returns an array of two BigNumbers representing the value of this BigNumber as a simple + fraction with an integer numerator and an integer denominator. The denominator will be a + positive non-zero value less than or equal to maximum_denominator. +

+

+ If a maximum_denominator is not specified, or is null or + undefined, the denominator will be the lowest value necessary to represent the + number exactly. +

+

+ Throws if maximum_denominator is invalid. See Errors. +

+
+x = new BigNumber(1.75)
+x.toFraction()                  // '7, 4'
+
+pi = new BigNumber('3.14159265358')
+pi.toFraction()                 // '157079632679,50000000000'
+pi.toFraction(100000)           // '312689, 99532'
+pi.toFraction(10000)            // '355, 113'
+pi.toFraction(100)              // '311, 99'
+pi.toFraction(10)               // '22, 7'
+pi.toFraction(1)                // '3, 1'
+ + + +
toJSON.toJSON() ⇒ string
+

As valueOf.

+
+x = new BigNumber('177.7e+457')
+y = new BigNumber(235.4325)
+z = new BigNumber('0.0098074')
+
+// Serialize an array of three BigNumbers
+str = JSON.stringify( [x, y, z] )
+// "["1.777e+459","235.4325","0.0098074"]"
+
+// Return an array of three BigNumbers
+JSON.parse(str, function (key, val) {
+    return key === '' ? val : new BigNumber(val)
+})
+ + + +
toNumber.toNumber() ⇒ number
+

Returns the value of this BigNumber as a JavaScript number primitive.

+

+ This method is identical to using type coercion with the unary plus operator. +

+
+x = new BigNumber(456.789)
+x.toNumber()                    // 456.789
++x                              // 456.789
+
+y = new BigNumber('45987349857634085409857349856430985')
+y.toNumber()                    // 4.598734985763409e+34
+
+z = new BigNumber(-0)
+1 / z.toNumber()                // -Infinity
+1 / +z                          // -Infinity
+ + + +
+ toPrecision.toPrecision([sd [, rm]]) ⇒ string +
+

+ sd: number: integer, 1 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive +

+

+ Returns a string representing the value of this BigNumber rounded to sd + significant digits using rounding mode rm. +

+

+ If sd is less than the number of digits necessary to represent the integer part + of the value in normal (fixed-point) notation, then exponential notation is used. +

+

+ If sd is omitted, or is null or undefined, then the + return value is the same as n.toString().
+ If rm is omitted or is null or undefined, + ROUNDING_MODE is used. +

+

+ Throws if sd or rm is invalid. See Errors. +

+
+x = 45.6
+y = new BigNumber(x)
+x.toPrecision()                 // '45.6'
+y.toPrecision()                 // '45.6'
+x.toPrecision(1)                // '5e+1'
+y.toPrecision(1)                // '5e+1'
+y.toPrecision(2, 0)             // '4.6e+1'  (ROUND_UP)
+y.toPrecision(2, 1)             // '4.5e+1'  (ROUND_DOWN)
+x.toPrecision(5)                // '45.600'
+y.toPrecision(5)                // '45.600'
+ + + +
toString.toString([base]) ⇒ string
+

+ base: number: integer, 2 to ALPHABET.length + inclusive (see ALPHABET). +

+

+ Returns a string representing the value of this BigNumber in the specified base, or base + 10 if base is omitted or is null or + undefined. +

+

+ For bases above 10, and using the default base conversion alphabet + (see ALPHABET), values from 10 to + 35 are represented by a-z + (as with Number.prototype.toString). +

+

+ If a base is specified the value is rounded according to the current + DECIMAL_PLACES + and ROUNDING_MODE settings. +

+

+ If a base is not specified, and this BigNumber has a positive + exponent that is equal to or greater than the positive component of the + current EXPONENTIAL_AT setting, + or a negative exponent equal to or less than the negative component of the + setting, then exponential notation is returned. +

+

If base is null or undefined it is ignored.

+

+ Throws if base is invalid. See Errors. +

+
+x = new BigNumber(750000)
+x.toString()                    // '750000'
+BigNumber.config({ EXPONENTIAL_AT: 5 })
+x.toString()                    // '7.5e+5'
+
+y = new BigNumber(362.875)
+y.toString(2)                   // '101101010.111'
+y.toString(9)                   // '442.77777777777777777778'
+y.toString(32)                  // 'ba.s'
+
+BigNumber.config({ DECIMAL_PLACES: 4 });
+z = new BigNumber('1.23456789')
+z.toString()                    // '1.23456789'
+z.toString(10)                  // '1.2346'
+ + + +
valueOf.valueOf() ⇒ string
+

+ As toString, but does not accept a base argument and includes + the minus sign for negative zero. +

+
+x = new BigNumber('-0')
+x.toString()                    // '0'
+x.valueOf()                     // '-0'
+y = new BigNumber('1.777e+457')
+y.valueOf()                     // '1.777e+457'
+ + + +

Properties

+

The properties of a BigNumber instance:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDescriptionTypeValue
ccoefficient*number[] Array of base 1e14 numbers
eexponentnumberInteger, -1000000000 to 1000000000 inclusive
ssignnumber-1 or 1
+

*significand

+

+ The value of any of the c, e and s properties may also + be null. +

+

+ The above properties are best considered to be read-only. In early versions of this library it + was okay to change the exponent of a BigNumber by writing to its exponent property directly, + but this is no longer reliable as the value of the first element of the coefficient array is + now dependent on the exponent. +

+

+ Note that, as with JavaScript numbers, the original exponent and fractional trailing zeros are + not necessarily preserved. +

+
x = new BigNumber(0.123)              // '0.123'
+x.toExponential()                     // '1.23e-1'
+x.c                                   // '1,2,3'
+x.e                                   // -1
+x.s                                   // 1
+
+y = new Number(-123.4567000e+2)       // '-12345.67'
+y.toExponential()                     // '-1.234567e+4'
+z = new BigNumber('-123.4567000e+2')  // '-12345.67'
+z.toExponential()                     // '-1.234567e+4'
+z.c                                   // '1,2,3,4,5,6,7'
+z.e                                   // 4
+z.s                                   // -1
+ + + +

Zero, NaN and Infinity

+

+ The table below shows how ±0, NaN and + ±Infinity are stored. +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
ces
±0[0]0±1
NaNnullnullnull
±Infinitynullnull±1
+
+x = new Number(-0)              // 0
+1 / x == -Infinity              // true
+
+y = new BigNumber(-0)           // '0'
+y.c                             // '0' ( [0].toString() )
+y.e                             // 0
+y.s                             // -1
+ + + +

Errors

+

The table below shows the errors that are thrown.

+

+ The errors are generic Error objects whose message begins + '[BigNumber Error]'. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodThrows
+ BigNumber
+ comparedTo
+ dividedBy
+ dividedToIntegerBy
+ isEqualTo
+ isGreaterThan
+ isGreaterThanOrEqualTo
+ isLessThan
+ isLessThanOrEqualTo
+ minus
+ modulo
+ plus
+ multipliedBy +
Base not a primitive number
Base not an integer
Base out of range
Number primitive has more than 15 significant digits*
Not a base... number*
Not a number*
cloneObject expected
configObject expected
DECIMAL_PLACES not a primitive number
DECIMAL_PLACES not an integer
DECIMAL_PLACES out of range
ROUNDING_MODE not a primitive number
ROUNDING_MODE not an integer
ROUNDING_MODE out of range
EXPONENTIAL_AT not a primitive number
EXPONENTIAL_AT not an integer
EXPONENTIAL_AT out of range
RANGE not a primitive number
RANGE not an integer
RANGE cannot be zero
RANGE cannot be zero
CRYPTO not true or false
crypto unavailable
MODULO_MODE not a primitive number
MODULO_MODE not an integer
MODULO_MODE out of range
POW_PRECISION not a primitive number
POW_PRECISION not an integer
POW_PRECISION out of range
FORMAT not an object
ALPHABET invalid
+ decimalPlaces
+ precision
+ random
+ shiftedBy
+ toExponential
+ toFixed
+ toFormat
+ toPrecision +
Argument not a primitive number
Argument not an integer
Argument out of range
+ decimalPlaces
+ precision +
Argument not true or false
exponentiatedByArgument not an integer
isBigNumberInvalid BigNumber*
+ minimum
+ maximum +
Not a number*
+ random + crypto unavailable
+ toFormat + Argument not an object
toFractionArgument not an integer
Argument out of range
toStringBase not a primitive number
Base not an integer
Base out of range
+

*Only thrown if BigNumber.DEBUG is true.

+

To determine if an exception is a BigNumber Error:

+
+try {
+  // ...
+} catch (e) {
+  if (e instanceof Error && e.message.indexOf('[BigNumber Error]') === 0) {
+      // ...
+  }
+}
+ + + +

Type coercion

+

+ To prevent the accidental use of a BigNumber in primitive number operations, or the + accidental addition of a BigNumber to a string, the valueOf method can be safely + overwritten as shown below. +

+

+ The valueOf method is the same as the + toJSON method, and both are the same as the + toString method except they do not take a base + argument and they include the minus sign for negative zero. +

+
+BigNumber.prototype.valueOf = function () {
+  throw Error('valueOf called!')
+}
+
+x = new BigNumber(1)
+x / 2                    // '[BigNumber Error] valueOf called!'
+x + 'abc'                // '[BigNumber Error] valueOf called!'
+
+ + + +

FAQ

+ +
Why are trailing fractional zeros removed from BigNumbers?
+

+ Some arbitrary-precision libraries retain trailing fractional zeros as they can indicate the + precision of a value. This can be useful but the results of arithmetic operations can be + misleading. +

+
+x = new BigDecimal("1.0")
+y = new BigDecimal("1.1000")
+z = x.add(y)                      // 2.1000
+
+x = new BigDecimal("1.20")
+y = new BigDecimal("3.45000")
+z = x.multiply(y)                 // 4.1400000
+

+ To specify the precision of a value is to specify that the value lies + within a certain range. +

+

+ In the first example, x has a value of 1.0. The trailing zero shows + the precision of the value, implying that it is in the range 0.95 to + 1.05. Similarly, the precision indicated by the trailing zeros of y + indicates that the value is in the range 1.09995 to 1.10005. +

+

+ If we add the two lowest values in the ranges we have, 0.95 + 1.09995 = 2.04995, + and if we add the two highest values we have, 1.05 + 1.10005 = 2.15005, so the + range of the result of the addition implied by the precision of its operands is + 2.04995 to 2.15005. +

+

+ The result given by BigDecimal of 2.1000 however, indicates that the value is in + the range 2.09995 to 2.10005 and therefore the precision implied by + its trailing zeros may be misleading. +

+

+ In the second example, the true range is 4.122744 to 4.157256 yet + the BigDecimal answer of 4.1400000 indicates a range of 4.13999995 + to 4.14000005. Again, the precision implied by the trailing zeros may be + misleading. +

+

+ This library, like binary floating point and most calculators, does not retain trailing + fractional zeros. Instead, the toExponential, toFixed and + toPrecision methods enable trailing zeros to be added if and when required.
+

+
+ + + diff --git a/node/node_modules/bignumber.js/package.json b/node/node_modules/bignumber.js/package.json new file mode 100644 index 0000000..e0571a0 --- /dev/null +++ b/node/node_modules/bignumber.js/package.json @@ -0,0 +1,50 @@ +{ + "name": "bignumber.js", + "description": "A library for arbitrary-precision decimal and non-decimal arithmetic", + "version": "9.1.2", + "keywords": [ + "arbitrary", + "precision", + "arithmetic", + "big", + "number", + "decimal", + "float", + "biginteger", + "bigdecimal", + "bignumber", + "bigint", + "bignum" + ], + "repository": { + "type": "git", + "url": "https://github.com/MikeMcl/bignumber.js.git" + }, + "main": "bignumber", + "module": "bignumber.mjs", + "browser": "bignumber.js", + "types": "bignumber.d.ts", + "exports": { + ".": { + "types": "./bignumber.d.ts", + "require": "./bignumber.js", + "import": "./bignumber.mjs", + "browser": "./bignumber.js" + }, + "./bignumber.mjs": "./bignumber.mjs", + "./bignumber.js": "./bignumber.js", + "./package.json": "./package.json" + }, + "author": { + "name": "Michael Mclaughlin", + "email": "M8ch88l@gmail.com" + }, + "engines": { + "node": "*" + }, + "license": "MIT", + "scripts": { + "test": "node test/test" + }, + "dependencies": {} +} diff --git a/node/node_modules/combined-stream/License b/node/node_modules/combined-stream/License new file mode 100644 index 0000000..4804b7a --- /dev/null +++ b/node/node_modules/combined-stream/License @@ -0,0 +1,19 @@ +Copyright (c) 2011 Debuggable Limited + +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. diff --git a/node/node_modules/combined-stream/Readme.md b/node/node_modules/combined-stream/Readme.md new file mode 100644 index 0000000..9e367b5 --- /dev/null +++ b/node/node_modules/combined-stream/Readme.md @@ -0,0 +1,138 @@ +# combined-stream + +A stream that emits multiple other streams one after another. + +**NB** Currently `combined-stream` works with streams version 1 only. There is ongoing effort to switch this library to streams version 2. Any help is welcome. :) Meanwhile you can explore other libraries that provide streams2 support with more or less compatibility with `combined-stream`. + +- [combined-stream2](https://www.npmjs.com/package/combined-stream2): A drop-in streams2-compatible replacement for the combined-stream module. + +- [multistream](https://www.npmjs.com/package/multistream): A stream that emits multiple other streams one after another. + +## Installation + +``` bash +npm install combined-stream +``` + +## Usage + +Here is a simple example that shows how you can use combined-stream to combine +two files into one: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create(); +combinedStream.append(fs.createReadStream('file1.txt')); +combinedStream.append(fs.createReadStream('file2.txt')); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +While the example above works great, it will pause all source streams until +they are needed. If you don't want that to happen, you can set `pauseStreams` +to `false`: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create({pauseStreams: false}); +combinedStream.append(fs.createReadStream('file1.txt')); +combinedStream.append(fs.createReadStream('file2.txt')); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +However, what if you don't have all the source streams yet, or you don't want +to allocate the resources (file descriptors, memory, etc.) for them right away? +Well, in that case you can simply provide a callback that supplies the stream +by calling a `next()` function: + +``` javascript +var CombinedStream = require('combined-stream'); +var fs = require('fs'); + +var combinedStream = CombinedStream.create(); +combinedStream.append(function(next) { + next(fs.createReadStream('file1.txt')); +}); +combinedStream.append(function(next) { + next(fs.createReadStream('file2.txt')); +}); + +combinedStream.pipe(fs.createWriteStream('combined.txt')); +``` + +## API + +### CombinedStream.create([options]) + +Returns a new combined stream object. Available options are: + +* `maxDataSize` +* `pauseStreams` + +The effect of those options is described below. + +### combinedStream.pauseStreams = `true` + +Whether to apply back pressure to the underlaying streams. If set to `false`, +the underlaying streams will never be paused. If set to `true`, the +underlaying streams will be paused right after being appended, as well as when +`delayedStream.pipe()` wants to throttle. + +### combinedStream.maxDataSize = `2 * 1024 * 1024` + +The maximum amount of bytes (or characters) to buffer for all source streams. +If this value is exceeded, `combinedStream` emits an `'error'` event. + +### combinedStream.dataSize = `0` + +The amount of bytes (or characters) currently buffered by `combinedStream`. + +### combinedStream.append(stream) + +Appends the given `stream` to the combinedStream object. If `pauseStreams` is +set to `true, this stream will also be paused right away. + +`streams` can also be a function that takes one parameter called `next`. `next` +is a function that must be invoked in order to provide the `next` stream, see +example above. + +Regardless of how the `stream` is appended, combined-stream always attaches an +`'error'` listener to it, so you don't have to do that manually. + +Special case: `stream` can also be a String or Buffer. + +### combinedStream.write(data) + +You should not call this, `combinedStream` takes care of piping the appended +streams into itself for you. + +### combinedStream.resume() + +Causes `combinedStream` to start drain the streams it manages. The function is +idempotent, and also emits a `'resume'` event each time which usually goes to +the stream that is currently being drained. + +### combinedStream.pause(); + +If `combinedStream.pauseStreams` is set to `false`, this does nothing. +Otherwise a `'pause'` event is emitted, this goes to the stream that is +currently being drained, so you can use it to apply back pressure. + +### combinedStream.end(); + +Sets `combinedStream.writable` to false, emits an `'end'` event, and removes +all streams from the queue. + +### combinedStream.destroy(); + +Same as `combinedStream.end()`, except it emits a `'close'` event instead of +`'end'`. + +## License + +combined-stream is licensed under the MIT license. diff --git a/node/node_modules/combined-stream/lib/combined_stream.js b/node/node_modules/combined-stream/lib/combined_stream.js new file mode 100644 index 0000000..125f097 --- /dev/null +++ b/node/node_modules/combined-stream/lib/combined_stream.js @@ -0,0 +1,208 @@ +var util = require('util'); +var Stream = require('stream').Stream; +var DelayedStream = require('delayed-stream'); + +module.exports = CombinedStream; +function CombinedStream() { + this.writable = false; + this.readable = true; + this.dataSize = 0; + this.maxDataSize = 2 * 1024 * 1024; + this.pauseStreams = true; + + this._released = false; + this._streams = []; + this._currentStream = null; + this._insideLoop = false; + this._pendingNext = false; +} +util.inherits(CombinedStream, Stream); + +CombinedStream.create = function(options) { + var combinedStream = new this(); + + options = options || {}; + for (var option in options) { + combinedStream[option] = options[option]; + } + + return combinedStream; +}; + +CombinedStream.isStreamLike = function(stream) { + return (typeof stream !== 'function') + && (typeof stream !== 'string') + && (typeof stream !== 'boolean') + && (typeof stream !== 'number') + && (!Buffer.isBuffer(stream)); +}; + +CombinedStream.prototype.append = function(stream) { + var isStreamLike = CombinedStream.isStreamLike(stream); + + if (isStreamLike) { + if (!(stream instanceof DelayedStream)) { + var newStream = DelayedStream.create(stream, { + maxDataSize: Infinity, + pauseStream: this.pauseStreams, + }); + stream.on('data', this._checkDataSize.bind(this)); + stream = newStream; + } + + this._handleErrors(stream); + + if (this.pauseStreams) { + stream.pause(); + } + } + + this._streams.push(stream); + return this; +}; + +CombinedStream.prototype.pipe = function(dest, options) { + Stream.prototype.pipe.call(this, dest, options); + this.resume(); + return dest; +}; + +CombinedStream.prototype._getNext = function() { + this._currentStream = null; + + if (this._insideLoop) { + this._pendingNext = true; + return; // defer call + } + + this._insideLoop = true; + try { + do { + this._pendingNext = false; + this._realGetNext(); + } while (this._pendingNext); + } finally { + this._insideLoop = false; + } +}; + +CombinedStream.prototype._realGetNext = function() { + var stream = this._streams.shift(); + + + if (typeof stream == 'undefined') { + this.end(); + return; + } + + if (typeof stream !== 'function') { + this._pipeNext(stream); + return; + } + + var getStream = stream; + getStream(function(stream) { + var isStreamLike = CombinedStream.isStreamLike(stream); + if (isStreamLike) { + stream.on('data', this._checkDataSize.bind(this)); + this._handleErrors(stream); + } + + this._pipeNext(stream); + }.bind(this)); +}; + +CombinedStream.prototype._pipeNext = function(stream) { + this._currentStream = stream; + + var isStreamLike = CombinedStream.isStreamLike(stream); + if (isStreamLike) { + stream.on('end', this._getNext.bind(this)); + stream.pipe(this, {end: false}); + return; + } + + var value = stream; + this.write(value); + this._getNext(); +}; + +CombinedStream.prototype._handleErrors = function(stream) { + var self = this; + stream.on('error', function(err) { + self._emitError(err); + }); +}; + +CombinedStream.prototype.write = function(data) { + this.emit('data', data); +}; + +CombinedStream.prototype.pause = function() { + if (!this.pauseStreams) { + return; + } + + if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause(); + this.emit('pause'); +}; + +CombinedStream.prototype.resume = function() { + if (!this._released) { + this._released = true; + this.writable = true; + this._getNext(); + } + + if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume(); + this.emit('resume'); +}; + +CombinedStream.prototype.end = function() { + this._reset(); + this.emit('end'); +}; + +CombinedStream.prototype.destroy = function() { + this._reset(); + this.emit('close'); +}; + +CombinedStream.prototype._reset = function() { + this.writable = false; + this._streams = []; + this._currentStream = null; +}; + +CombinedStream.prototype._checkDataSize = function() { + this._updateDataSize(); + if (this.dataSize <= this.maxDataSize) { + return; + } + + var message = + 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'; + this._emitError(new Error(message)); +}; + +CombinedStream.prototype._updateDataSize = function() { + this.dataSize = 0; + + var self = this; + this._streams.forEach(function(stream) { + if (!stream.dataSize) { + return; + } + + self.dataSize += stream.dataSize; + }); + + if (this._currentStream && this._currentStream.dataSize) { + this.dataSize += this._currentStream.dataSize; + } +}; + +CombinedStream.prototype._emitError = function(err) { + this._reset(); + this.emit('error', err); +}; diff --git a/node/node_modules/combined-stream/package.json b/node/node_modules/combined-stream/package.json new file mode 100644 index 0000000..6982b6d --- /dev/null +++ b/node/node_modules/combined-stream/package.json @@ -0,0 +1,25 @@ +{ + "author": "Felix Geisendörfer (http://debuggable.com/)", + "name": "combined-stream", + "description": "A stream that emits multiple other streams one after another.", + "version": "1.0.8", + "homepage": "https://github.com/felixge/node-combined-stream", + "repository": { + "type": "git", + "url": "git://github.com/felixge/node-combined-stream.git" + }, + "main": "./lib/combined_stream", + "scripts": { + "test": "node test/run.js" + }, + "engines": { + "node": ">= 0.8" + }, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "devDependencies": { + "far": "~0.0.7" + }, + "license": "MIT" +} diff --git a/node/node_modules/combined-stream/yarn.lock b/node/node_modules/combined-stream/yarn.lock new file mode 100644 index 0000000..7edf418 --- /dev/null +++ b/node/node_modules/combined-stream/yarn.lock @@ -0,0 +1,17 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +far@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/far/-/far-0.0.7.tgz#01c1fd362bcd26ce9cf161af3938aa34619f79a7" + dependencies: + oop "0.0.3" + +oop@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/oop/-/oop-0.0.3.tgz#70fa405a5650891a194fdc82ca68dad6dabf4401" diff --git a/node/node_modules/delayed-stream/.npmignore b/node/node_modules/delayed-stream/.npmignore new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/node/node_modules/delayed-stream/.npmignore @@ -0,0 +1 @@ +test diff --git a/node/node_modules/delayed-stream/License b/node/node_modules/delayed-stream/License new file mode 100644 index 0000000..4804b7a --- /dev/null +++ b/node/node_modules/delayed-stream/License @@ -0,0 +1,19 @@ +Copyright (c) 2011 Debuggable Limited + +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. diff --git a/node/node_modules/delayed-stream/Makefile b/node/node_modules/delayed-stream/Makefile new file mode 100644 index 0000000..b4ff85a --- /dev/null +++ b/node/node_modules/delayed-stream/Makefile @@ -0,0 +1,7 @@ +SHELL := /bin/bash + +test: + @./test/run.js + +.PHONY: test + diff --git a/node/node_modules/delayed-stream/Readme.md b/node/node_modules/delayed-stream/Readme.md new file mode 100644 index 0000000..aca36f9 --- /dev/null +++ b/node/node_modules/delayed-stream/Readme.md @@ -0,0 +1,141 @@ +# delayed-stream + +Buffers events from a stream until you are ready to handle them. + +## Installation + +``` bash +npm install delayed-stream +``` + +## Usage + +The following example shows how to write a http echo server that delays its +response by 1000 ms. + +``` javascript +var DelayedStream = require('delayed-stream'); +var http = require('http'); + +http.createServer(function(req, res) { + var delayed = DelayedStream.create(req); + + setTimeout(function() { + res.writeHead(200); + delayed.pipe(res); + }, 1000); +}); +``` + +If you are not using `Stream#pipe`, you can also manually release the buffered +events by calling `delayedStream.resume()`: + +``` javascript +var delayed = DelayedStream.create(req); + +setTimeout(function() { + // Emit all buffered events and resume underlaying source + delayed.resume(); +}, 1000); +``` + +## Implementation + +In order to use this meta stream properly, here are a few things you should +know about the implementation. + +### Event Buffering / Proxying + +All events of the `source` stream are hijacked by overwriting the `source.emit` +method. Until node implements a catch-all event listener, this is the only way. + +However, delayed-stream still continues to emit all events it captures on the +`source`, regardless of whether you have released the delayed stream yet or +not. + +Upon creation, delayed-stream captures all `source` events and stores them in +an internal event buffer. Once `delayedStream.release()` is called, all +buffered events are emitted on the `delayedStream`, and the event buffer is +cleared. After that, delayed-stream merely acts as a proxy for the underlaying +source. + +### Error handling + +Error events on `source` are buffered / proxied just like any other events. +However, `delayedStream.create` attaches a no-op `'error'` listener to the +`source`. This way you only have to handle errors on the `delayedStream` +object, rather than in two places. + +### Buffer limits + +delayed-stream provides a `maxDataSize` property that can be used to limit +the amount of data being buffered. In order to protect you from bad `source` +streams that don't react to `source.pause()`, this feature is enabled by +default. + +## API + +### DelayedStream.create(source, [options]) + +Returns a new `delayedStream`. Available options are: + +* `pauseStream` +* `maxDataSize` + +The description for those properties can be found below. + +### delayedStream.source + +The `source` stream managed by this object. This is useful if you are +passing your `delayedStream` around, and you still want to access properties +on the `source` object. + +### delayedStream.pauseStream = true + +Whether to pause the underlaying `source` when calling +`DelayedStream.create()`. Modifying this property afterwards has no effect. + +### delayedStream.maxDataSize = 1024 * 1024 + +The amount of data to buffer before emitting an `error`. + +If the underlaying source is emitting `Buffer` objects, the `maxDataSize` +refers to bytes. + +If the underlaying source is emitting JavaScript strings, the size refers to +characters. + +If you know what you are doing, you can set this property to `Infinity` to +disable this feature. You can also modify this property during runtime. + +### delayedStream.dataSize = 0 + +The amount of data buffered so far. + +### delayedStream.readable + +An ECMA5 getter that returns the value of `source.readable`. + +### delayedStream.resume() + +If the `delayedStream` has not been released so far, `delayedStream.release()` +is called. + +In either case, `source.resume()` is called. + +### delayedStream.pause() + +Calls `source.pause()`. + +### delayedStream.pipe(dest) + +Calls `delayedStream.resume()` and then proxies the arguments to `source.pipe`. + +### delayedStream.release() + +Emits and clears all events that have been buffered up so far. This does not +resume the underlaying source, use `delayedStream.resume()` instead. + +## License + +delayed-stream is licensed under the MIT license. diff --git a/node/node_modules/delayed-stream/lib/delayed_stream.js b/node/node_modules/delayed-stream/lib/delayed_stream.js new file mode 100644 index 0000000..b38fc85 --- /dev/null +++ b/node/node_modules/delayed-stream/lib/delayed_stream.js @@ -0,0 +1,107 @@ +var Stream = require('stream').Stream; +var util = require('util'); + +module.exports = DelayedStream; +function DelayedStream() { + this.source = null; + this.dataSize = 0; + this.maxDataSize = 1024 * 1024; + this.pauseStream = true; + + this._maxDataSizeExceeded = false; + this._released = false; + this._bufferedEvents = []; +} +util.inherits(DelayedStream, Stream); + +DelayedStream.create = function(source, options) { + var delayedStream = new this(); + + options = options || {}; + for (var option in options) { + delayedStream[option] = options[option]; + } + + delayedStream.source = source; + + var realEmit = source.emit; + source.emit = function() { + delayedStream._handleEmit(arguments); + return realEmit.apply(source, arguments); + }; + + source.on('error', function() {}); + if (delayedStream.pauseStream) { + source.pause(); + } + + return delayedStream; +}; + +Object.defineProperty(DelayedStream.prototype, 'readable', { + configurable: true, + enumerable: true, + get: function() { + return this.source.readable; + } +}); + +DelayedStream.prototype.setEncoding = function() { + return this.source.setEncoding.apply(this.source, arguments); +}; + +DelayedStream.prototype.resume = function() { + if (!this._released) { + this.release(); + } + + this.source.resume(); +}; + +DelayedStream.prototype.pause = function() { + this.source.pause(); +}; + +DelayedStream.prototype.release = function() { + this._released = true; + + this._bufferedEvents.forEach(function(args) { + this.emit.apply(this, args); + }.bind(this)); + this._bufferedEvents = []; +}; + +DelayedStream.prototype.pipe = function() { + var r = Stream.prototype.pipe.apply(this, arguments); + this.resume(); + return r; +}; + +DelayedStream.prototype._handleEmit = function(args) { + if (this._released) { + this.emit.apply(this, args); + return; + } + + if (args[0] === 'data') { + this.dataSize += args[1].length; + this._checkIfMaxDataSizeExceeded(); + } + + this._bufferedEvents.push(args); +}; + +DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() { + if (this._maxDataSizeExceeded) { + return; + } + + if (this.dataSize <= this.maxDataSize) { + return; + } + + this._maxDataSizeExceeded = true; + var message = + 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' + this.emit('error', new Error(message)); +}; diff --git a/node/node_modules/delayed-stream/package.json b/node/node_modules/delayed-stream/package.json new file mode 100644 index 0000000..eea3291 --- /dev/null +++ b/node/node_modules/delayed-stream/package.json @@ -0,0 +1,27 @@ +{ + "author": "Felix Geisendörfer (http://debuggable.com/)", + "contributors": [ + "Mike Atkins " + ], + "name": "delayed-stream", + "description": "Buffers events from a stream until you are ready to handle them.", + "license": "MIT", + "version": "1.0.0", + "homepage": "https://github.com/felixge/node-delayed-stream", + "repository": { + "type": "git", + "url": "git://github.com/felixge/node-delayed-stream.git" + }, + "main": "./lib/delayed_stream", + "engines": { + "node": ">=0.4.0" + }, + "scripts": { + "test": "make test" + }, + "dependencies": {}, + "devDependencies": { + "fake": "0.2.0", + "far": "0.0.1" + } +} diff --git a/node/node_modules/form-data/License b/node/node_modules/form-data/License new file mode 100644 index 0000000..c7ff12a --- /dev/null +++ b/node/node_modules/form-data/License @@ -0,0 +1,19 @@ +Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and 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. diff --git a/node/node_modules/form-data/README.md.bak b/node/node_modules/form-data/README.md.bak new file mode 100644 index 0000000..f06d86c --- /dev/null +++ b/node/node_modules/form-data/README.md.bak @@ -0,0 +1,356 @@ +# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data) + +A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications. + +The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd]. + +[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface + +[![Linux Build](https://img.shields.io/travis/form-data/form-data/v3.0.1.svg?label=linux:6.x-12.x)](https://travis-ci.org/form-data/form-data) +[![MacOS Build](https://img.shields.io/travis/form-data/form-data/v3.0.1.svg?label=macos:6.x-12.x)](https://travis-ci.org/form-data/form-data) +[![Windows Build](https://img.shields.io/travis/form-data/form-data/v3.0.1.svg?label=windows:6.x-12.x)](https://travis-ci.org/form-data/form-data) + +[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/v3.0.1.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master) +[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data) + +## Install + +``` +npm install --save form-data +``` + +## Usage + +In this example we are constructing a form with 3 fields that contain a string, +a buffer and a file stream. + +``` javascript +var FormData = require('form-data'); +var fs = require('fs'); + +var form = new FormData(); +form.append('my_field', 'my value'); +form.append('my_buffer', new Buffer(10)); +form.append('my_file', fs.createReadStream('/foo/bar.jpg')); +``` + +Also you can use http-response stream: + +``` javascript +var FormData = require('form-data'); +var http = require('http'); + +var form = new FormData(); + +http.request('http://nodejs.org/images/logo.png', function(response) { + form.append('my_field', 'my value'); + form.append('my_buffer', new Buffer(10)); + form.append('my_logo', response); +}); +``` + +Or @mikeal's [request](https://github.com/request/request) stream: + +``` javascript +var FormData = require('form-data'); +var request = require('request'); + +var form = new FormData(); + +form.append('my_field', 'my value'); +form.append('my_buffer', new Buffer(10)); +form.append('my_logo', request('http://nodejs.org/images/logo.png')); +``` + +In order to submit this form to a web application, call ```submit(url, [callback])``` method: + +``` javascript +form.submit('http://example.org/', function(err, res) { + // res – response object (http.IncomingMessage) // + res.resume(); +}); + +``` + +For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods. + +### Custom options + +You can provide custom options, such as `maxDataSize`: + +``` javascript +var FormData = require('form-data'); + +var form = new FormData({ maxDataSize: 20971520 }); +form.append('my_field', 'my value'); +form.append('my_buffer', /* something big */); +``` + +List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15) + +### Alternative submission methods + +You can use node's http client interface: + +``` javascript +var http = require('http'); + +var request = http.request({ + method: 'post', + host: 'example.org', + path: '/upload', + headers: form.getHeaders() +}); + +form.pipe(request); + +request.on('response', function(res) { + console.log(res.statusCode); +}); +``` + +Or if you would prefer the `'Content-Length'` header to be set for you: + +``` javascript +form.submit('example.org/upload', function(err, res) { + console.log(res.statusCode); +}); +``` + +To use custom headers and pre-known length in parts: + +``` javascript +var CRLF = '\r\n'; +var form = new FormData(); + +var options = { + header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF, + knownLength: 1 +}; + +form.append('my_buffer', buffer, options); + +form.submit('http://example.com/', function(err, res) { + if (err) throw err; + console.log('Done'); +}); +``` + +Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually: + +``` javascript +someModule.stream(function(err, stdout, stderr) { + if (err) throw err; + + var form = new FormData(); + + form.append('file', stdout, { + filename: 'unicycle.jpg', // ... or: + filepath: 'photos/toys/unicycle.jpg', + contentType: 'image/jpeg', + knownLength: 19806 + }); + + form.submit('http://example.com/', function(err, res) { + if (err) throw err; + console.log('Done'); + }); +}); +``` + +The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory). + +For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter: + +``` javascript +form.submit({ + host: 'example.com', + path: '/probably.php?extra=params', + auth: 'username:password' +}, function(err, res) { + console.log(res.statusCode); +}); +``` + +In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`: + +``` javascript +form.submit({ + host: 'example.com', + path: '/surelynot.php', + headers: {'x-test-header': 'test-header-value'} +}, function(err, res) { + console.log(res.statusCode); +}); +``` + +### Methods + +- [_Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )](https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-). +- [_Headers_ getHeaders( [**Headers** _userHeaders_] )](https://github.com/form-data/form-data#array-getheaders-array-userheaders-) +- [_String_ getBoundary()](https://github.com/form-data/form-data#string-getboundary) +- [_Void_ setBoundary()](https://github.com/form-data/form-data#void-setboundary) +- [_Buffer_ getBuffer()](https://github.com/form-data/form-data#buffer-getbuffer) +- [_Integer_ getLengthSync()](https://github.com/form-data/form-data#integer-getlengthsync) +- [_Integer_ getLength( **function** _callback_ )](https://github.com/form-data/form-data#integer-getlength-function-callback-) +- [_Boolean_ hasKnownLength()](https://github.com/form-data/form-data#boolean-hasknownlength) +- [_Request_ submit( _params_, **function** _callback_ )](https://github.com/form-data/form-data#request-submit-params-function-callback-) +- [_String_ toString()](https://github.com/form-data/form-data#string-tostring) + +#### _Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] ) +Append data to the form. You can submit about any format (string, integer, boolean, buffer, etc.). However, Arrays are not supported and need to be turned into strings by the user. +```javascript +var form = new FormData(); +form.append( 'my_string', 'my value' ); +form.append( 'my_integer', 1 ); +form.append( 'my_boolean', true ); +form.append( 'my_buffer', new Buffer(10) ); +form.append( 'my_array_as_json', JSON.stringify( ['bird','cute'] ) ) +``` + +You may provide a string for options, or an object. +```javascript +// Set filename by providing a string for options +form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), 'bar.jpg' ); + +// provide an object. +form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), {filename: 'bar.jpg', contentType: 'image/jpeg', knownLength: 19806} ); +``` + +#### _Headers_ getHeaders( [**Headers** _userHeaders_] ) +This method adds the correct `content-type` header to the provided array of `userHeaders`. + +#### _String_ getBoundary() +Return the boundary of the formData. By default, the boundary consists of 26 `-` followed by 24 numbers +for example: +```javascript +--------------------------515890814546601021194782 +``` + +#### _Void_ setBoundary(String _boundary_) +Set the boundary string, overriding the default behavior described above. + +_Note: The boundary must be unique and may not appear in the data._ + +#### _Buffer_ getBuffer() +Return the full formdata request package, as a Buffer. You can insert this Buffer in e.g. Axios to send multipart data. +```javascript +var form = new FormData(); +form.append( 'my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]) ); +form.append( 'my_file', fs.readFileSync('/foo/bar.jpg') ); + +axios.post( 'https://example.com/path/to/api', + form.getBuffer(), + form.getHeaders() + ) +``` +**Note:** Because the output is of type Buffer, you can only append types that are accepted by Buffer: *string, Buffer, ArrayBuffer, Array, or Array-like Object*. A ReadStream for example will result in an error. + +#### _Integer_ getLengthSync() +Same as `getLength` but synchronous. + +_Note: getLengthSync __doesn't__ calculate streams length._ + +#### _Integer_ getLength( **function** _callback_ ) +Returns the `Content-Length` async. The callback is used to handle errors and continue once the length has been calculated +```javascript +this.getLength(function(err, length) { + if (err) { + this._error(err); + return; + } + + // add content length + request.setHeader('Content-Length', length); + + ... +}.bind(this)); +``` + +#### _Boolean_ hasKnownLength() +Checks if the length of added values is known. + +#### _Request_ submit( _params_, **function** _callback_ ) +Submit the form to a web application. +```javascript +var form = new FormData(); +form.append( 'my_string', 'Hello World' ); + +form.submit( 'http://example.com/', function(err, res) { + // res – response object (http.IncomingMessage) // + res.resume(); +} ); +``` + +#### _String_ toString() +Returns the form data as a string. Don't use this if you are sending files or buffers, use `getBuffer()` instead. + +### Integration with other libraries + +#### Request + +Form submission using [request](https://github.com/request/request): + +```javascript +var formData = { + my_field: 'my_value', + my_file: fs.createReadStream(__dirname + '/unicycle.jpg'), +}; + +request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) { + if (err) { + return console.error('upload failed:', err); + } + console.log('Upload successful! Server responded with:', body); +}); +``` + +For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads). + +#### node-fetch + +You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch): + +```javascript +var form = new FormData(); + +form.append('a', 1); + +fetch('http://example.com', { method: 'POST', body: form }) + .then(function(res) { + return res.json(); + }).then(function(json) { + console.log(json); + }); +``` + +#### axios + +In Node.js you can post a file using [axios](https://github.com/axios/axios): +```javascript +const form = new FormData(); +const stream = fs.createReadStream(PATH_TO_FILE); + +form.append('image', stream); + +// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders` +const formHeaders = form.getHeaders(); + +axios.post('http://example.com', form, { + headers: { + ...formHeaders, + }, +}) +.then(response => response) +.catch(error => error) +``` + +## Notes + +- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround. +- Starting version `2.x` FormData has dropped support for `node@0.10.x`. +- Starting version `3.x` FormData has dropped support for `node@4.x`. + +## License + +Form-Data is released under the [MIT](License) license. diff --git a/node/node_modules/form-data/Readme.md b/node/node_modules/form-data/Readme.md new file mode 100644 index 0000000..f06d86c --- /dev/null +++ b/node/node_modules/form-data/Readme.md @@ -0,0 +1,356 @@ +# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data) + +A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications. + +The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd]. + +[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface + +[![Linux Build](https://img.shields.io/travis/form-data/form-data/v3.0.1.svg?label=linux:6.x-12.x)](https://travis-ci.org/form-data/form-data) +[![MacOS Build](https://img.shields.io/travis/form-data/form-data/v3.0.1.svg?label=macos:6.x-12.x)](https://travis-ci.org/form-data/form-data) +[![Windows Build](https://img.shields.io/travis/form-data/form-data/v3.0.1.svg?label=windows:6.x-12.x)](https://travis-ci.org/form-data/form-data) + +[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/v3.0.1.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master) +[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data) + +## Install + +``` +npm install --save form-data +``` + +## Usage + +In this example we are constructing a form with 3 fields that contain a string, +a buffer and a file stream. + +``` javascript +var FormData = require('form-data'); +var fs = require('fs'); + +var form = new FormData(); +form.append('my_field', 'my value'); +form.append('my_buffer', new Buffer(10)); +form.append('my_file', fs.createReadStream('/foo/bar.jpg')); +``` + +Also you can use http-response stream: + +``` javascript +var FormData = require('form-data'); +var http = require('http'); + +var form = new FormData(); + +http.request('http://nodejs.org/images/logo.png', function(response) { + form.append('my_field', 'my value'); + form.append('my_buffer', new Buffer(10)); + form.append('my_logo', response); +}); +``` + +Or @mikeal's [request](https://github.com/request/request) stream: + +``` javascript +var FormData = require('form-data'); +var request = require('request'); + +var form = new FormData(); + +form.append('my_field', 'my value'); +form.append('my_buffer', new Buffer(10)); +form.append('my_logo', request('http://nodejs.org/images/logo.png')); +``` + +In order to submit this form to a web application, call ```submit(url, [callback])``` method: + +``` javascript +form.submit('http://example.org/', function(err, res) { + // res – response object (http.IncomingMessage) // + res.resume(); +}); + +``` + +For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods. + +### Custom options + +You can provide custom options, such as `maxDataSize`: + +``` javascript +var FormData = require('form-data'); + +var form = new FormData({ maxDataSize: 20971520 }); +form.append('my_field', 'my value'); +form.append('my_buffer', /* something big */); +``` + +List of available options could be found in [combined-stream](https://github.com/felixge/node-combined-stream/blob/master/lib/combined_stream.js#L7-L15) + +### Alternative submission methods + +You can use node's http client interface: + +``` javascript +var http = require('http'); + +var request = http.request({ + method: 'post', + host: 'example.org', + path: '/upload', + headers: form.getHeaders() +}); + +form.pipe(request); + +request.on('response', function(res) { + console.log(res.statusCode); +}); +``` + +Or if you would prefer the `'Content-Length'` header to be set for you: + +``` javascript +form.submit('example.org/upload', function(err, res) { + console.log(res.statusCode); +}); +``` + +To use custom headers and pre-known length in parts: + +``` javascript +var CRLF = '\r\n'; +var form = new FormData(); + +var options = { + header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF, + knownLength: 1 +}; + +form.append('my_buffer', buffer, options); + +form.submit('http://example.com/', function(err, res) { + if (err) throw err; + console.log('Done'); +}); +``` + +Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually: + +``` javascript +someModule.stream(function(err, stdout, stderr) { + if (err) throw err; + + var form = new FormData(); + + form.append('file', stdout, { + filename: 'unicycle.jpg', // ... or: + filepath: 'photos/toys/unicycle.jpg', + contentType: 'image/jpeg', + knownLength: 19806 + }); + + form.submit('http://example.com/', function(err, res) { + if (err) throw err; + console.log('Done'); + }); +}); +``` + +The `filepath` property overrides `filename` and may contain a relative path. This is typically used when uploading [multiple files from a directory](https://wicg.github.io/entries-api/#dom-htmlinputelement-webkitdirectory). + +For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter: + +``` javascript +form.submit({ + host: 'example.com', + path: '/probably.php?extra=params', + auth: 'username:password' +}, function(err, res) { + console.log(res.statusCode); +}); +``` + +In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`: + +``` javascript +form.submit({ + host: 'example.com', + path: '/surelynot.php', + headers: {'x-test-header': 'test-header-value'} +}, function(err, res) { + console.log(res.statusCode); +}); +``` + +### Methods + +- [_Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] )](https://github.com/form-data/form-data#void-append-string-field-mixed-value--mixed-options-). +- [_Headers_ getHeaders( [**Headers** _userHeaders_] )](https://github.com/form-data/form-data#array-getheaders-array-userheaders-) +- [_String_ getBoundary()](https://github.com/form-data/form-data#string-getboundary) +- [_Void_ setBoundary()](https://github.com/form-data/form-data#void-setboundary) +- [_Buffer_ getBuffer()](https://github.com/form-data/form-data#buffer-getbuffer) +- [_Integer_ getLengthSync()](https://github.com/form-data/form-data#integer-getlengthsync) +- [_Integer_ getLength( **function** _callback_ )](https://github.com/form-data/form-data#integer-getlength-function-callback-) +- [_Boolean_ hasKnownLength()](https://github.com/form-data/form-data#boolean-hasknownlength) +- [_Request_ submit( _params_, **function** _callback_ )](https://github.com/form-data/form-data#request-submit-params-function-callback-) +- [_String_ toString()](https://github.com/form-data/form-data#string-tostring) + +#### _Void_ append( **String** _field_, **Mixed** _value_ [, **Mixed** _options_] ) +Append data to the form. You can submit about any format (string, integer, boolean, buffer, etc.). However, Arrays are not supported and need to be turned into strings by the user. +```javascript +var form = new FormData(); +form.append( 'my_string', 'my value' ); +form.append( 'my_integer', 1 ); +form.append( 'my_boolean', true ); +form.append( 'my_buffer', new Buffer(10) ); +form.append( 'my_array_as_json', JSON.stringify( ['bird','cute'] ) ) +``` + +You may provide a string for options, or an object. +```javascript +// Set filename by providing a string for options +form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), 'bar.jpg' ); + +// provide an object. +form.append( 'my_file', fs.createReadStream('/foo/bar.jpg'), {filename: 'bar.jpg', contentType: 'image/jpeg', knownLength: 19806} ); +``` + +#### _Headers_ getHeaders( [**Headers** _userHeaders_] ) +This method adds the correct `content-type` header to the provided array of `userHeaders`. + +#### _String_ getBoundary() +Return the boundary of the formData. By default, the boundary consists of 26 `-` followed by 24 numbers +for example: +```javascript +--------------------------515890814546601021194782 +``` + +#### _Void_ setBoundary(String _boundary_) +Set the boundary string, overriding the default behavior described above. + +_Note: The boundary must be unique and may not appear in the data._ + +#### _Buffer_ getBuffer() +Return the full formdata request package, as a Buffer. You can insert this Buffer in e.g. Axios to send multipart data. +```javascript +var form = new FormData(); +form.append( 'my_buffer', Buffer.from([0x4a,0x42,0x20,0x52,0x6f,0x63,0x6b,0x73]) ); +form.append( 'my_file', fs.readFileSync('/foo/bar.jpg') ); + +axios.post( 'https://example.com/path/to/api', + form.getBuffer(), + form.getHeaders() + ) +``` +**Note:** Because the output is of type Buffer, you can only append types that are accepted by Buffer: *string, Buffer, ArrayBuffer, Array, or Array-like Object*. A ReadStream for example will result in an error. + +#### _Integer_ getLengthSync() +Same as `getLength` but synchronous. + +_Note: getLengthSync __doesn't__ calculate streams length._ + +#### _Integer_ getLength( **function** _callback_ ) +Returns the `Content-Length` async. The callback is used to handle errors and continue once the length has been calculated +```javascript +this.getLength(function(err, length) { + if (err) { + this._error(err); + return; + } + + // add content length + request.setHeader('Content-Length', length); + + ... +}.bind(this)); +``` + +#### _Boolean_ hasKnownLength() +Checks if the length of added values is known. + +#### _Request_ submit( _params_, **function** _callback_ ) +Submit the form to a web application. +```javascript +var form = new FormData(); +form.append( 'my_string', 'Hello World' ); + +form.submit( 'http://example.com/', function(err, res) { + // res – response object (http.IncomingMessage) // + res.resume(); +} ); +``` + +#### _String_ toString() +Returns the form data as a string. Don't use this if you are sending files or buffers, use `getBuffer()` instead. + +### Integration with other libraries + +#### Request + +Form submission using [request](https://github.com/request/request): + +```javascript +var formData = { + my_field: 'my_value', + my_file: fs.createReadStream(__dirname + '/unicycle.jpg'), +}; + +request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) { + if (err) { + return console.error('upload failed:', err); + } + console.log('Upload successful! Server responded with:', body); +}); +``` + +For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads). + +#### node-fetch + +You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch): + +```javascript +var form = new FormData(); + +form.append('a', 1); + +fetch('http://example.com', { method: 'POST', body: form }) + .then(function(res) { + return res.json(); + }).then(function(json) { + console.log(json); + }); +``` + +#### axios + +In Node.js you can post a file using [axios](https://github.com/axios/axios): +```javascript +const form = new FormData(); +const stream = fs.createReadStream(PATH_TO_FILE); + +form.append('image', stream); + +// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders` +const formHeaders = form.getHeaders(); + +axios.post('http://example.com', form, { + headers: { + ...formHeaders, + }, +}) +.then(response => response) +.catch(error => error) +``` + +## Notes + +- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround. +- Starting version `2.x` FormData has dropped support for `node@0.10.x`. +- Starting version `3.x` FormData has dropped support for `node@4.x`. + +## License + +Form-Data is released under the [MIT](License) license. diff --git a/node/node_modules/form-data/index.d.ts b/node/node_modules/form-data/index.d.ts new file mode 100644 index 0000000..295e9e9 --- /dev/null +++ b/node/node_modules/form-data/index.d.ts @@ -0,0 +1,62 @@ +// Definitions by: Carlos Ballesteros Velasco +// Leon Yu +// BendingBender +// Maple Miao + +/// +import * as stream from 'stream'; +import * as http from 'http'; + +export = FormData; + +// Extracted because @types/node doesn't export interfaces. +interface ReadableOptions { + highWaterMark?: number; + encoding?: string; + objectMode?: boolean; + read?(this: stream.Readable, size: number): void; + destroy?(this: stream.Readable, error: Error | null, callback: (error: Error | null) => void): void; + autoDestroy?: boolean; +} + +interface Options extends ReadableOptions { + writable?: boolean; + readable?: boolean; + dataSize?: number; + maxDataSize?: number; + pauseStreams?: boolean; +} + +declare class FormData extends stream.Readable { + constructor(options?: Options); + append(key: string, value: any, options?: FormData.AppendOptions | string): void; + getHeaders(userHeaders?: FormData.Headers): FormData.Headers; + submit( + params: string | FormData.SubmitOptions, + callback?: (error: Error | null, response: http.IncomingMessage) => void + ): http.ClientRequest; + getBuffer(): Buffer; + setBoundary(boundary: string): void; + getBoundary(): string; + getLength(callback: (err: Error | null, length: number) => void): void; + getLengthSync(): number; + hasKnownLength(): boolean; +} + +declare namespace FormData { + interface Headers { + [key: string]: any; + } + + interface AppendOptions { + header?: string | Headers; + knownLength?: number; + filename?: string; + filepath?: string; + contentType?: string; + } + + interface SubmitOptions extends http.RequestOptions { + protocol?: 'https:' | 'http:'; + } +} diff --git a/node/node_modules/form-data/lib/browser.js b/node/node_modules/form-data/lib/browser.js new file mode 100644 index 0000000..09e7c70 --- /dev/null +++ b/node/node_modules/form-data/lib/browser.js @@ -0,0 +1,2 @@ +/* eslint-env browser */ +module.exports = typeof self == 'object' ? self.FormData : window.FormData; diff --git a/node/node_modules/form-data/lib/form_data.js b/node/node_modules/form-data/lib/form_data.js new file mode 100644 index 0000000..cf836b0 --- /dev/null +++ b/node/node_modules/form-data/lib/form_data.js @@ -0,0 +1,498 @@ +var CombinedStream = require('combined-stream'); +var util = require('util'); +var path = require('path'); +var http = require('http'); +var https = require('https'); +var parseUrl = require('url').parse; +var fs = require('fs'); +var mime = require('mime-types'); +var asynckit = require('asynckit'); +var populate = require('./populate.js'); + +// Public API +module.exports = FormData; + +// make it a Stream +util.inherits(FormData, CombinedStream); + +/** + * Create readable "multipart/form-data" streams. + * Can be used to submit forms + * and file uploads to other web applications. + * + * @constructor + * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream + */ +function FormData(options) { + if (!(this instanceof FormData)) { + return new FormData(options); + } + + this._overheadLength = 0; + this._valueLength = 0; + this._valuesToMeasure = []; + + CombinedStream.call(this); + + options = options || {}; + for (var option in options) { + this[option] = options[option]; + } +} + +FormData.LINE_BREAK = '\r\n'; +FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream'; + +FormData.prototype.append = function(field, value, options) { + + options = options || {}; + + // allow filename as single option + if (typeof options == 'string') { + options = {filename: options}; + } + + var append = CombinedStream.prototype.append.bind(this); + + // all that streamy business can't handle numbers + if (typeof value == 'number') { + value = '' + value; + } + + // https://github.com/felixge/node-form-data/issues/38 + if (util.isArray(value)) { + // Please convert your array into string + // the way web server expects it + this._error(new Error('Arrays are not supported.')); + return; + } + + var header = this._multiPartHeader(field, value, options); + var footer = this._multiPartFooter(); + + append(header); + append(value); + append(footer); + + // pass along options.knownLength + this._trackLength(header, value, options); +}; + +FormData.prototype._trackLength = function(header, value, options) { + var valueLength = 0; + + // used w/ getLengthSync(), when length is known. + // e.g. for streaming directly from a remote server, + // w/ a known file a size, and not wanting to wait for + // incoming file to finish to get its size. + if (options.knownLength != null) { + valueLength += +options.knownLength; + } else if (Buffer.isBuffer(value)) { + valueLength = value.length; + } else if (typeof value === 'string') { + valueLength = Buffer.byteLength(value); + } + + this._valueLength += valueLength; + + // @check why add CRLF? does this account for custom/multiple CRLFs? + this._overheadLength += + Buffer.byteLength(header) + + FormData.LINE_BREAK.length; + + // empty or either doesn't have path or not an http response + if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) )) { + return; + } + + // no need to bother with the length + if (!options.knownLength) { + this._valuesToMeasure.push(value); + } +}; + +FormData.prototype._lengthRetriever = function(value, callback) { + + if (value.hasOwnProperty('fd')) { + + // take read range into a account + // `end` = Infinity –> read file till the end + // + // TODO: Looks like there is bug in Node fs.createReadStream + // it doesn't respect `end` options without `start` options + // Fix it when node fixes it. + // https://github.com/joyent/node/issues/7819 + if (value.end != undefined && value.end != Infinity && value.start != undefined) { + + // when end specified + // no need to calculate range + // inclusive, starts with 0 + callback(null, value.end + 1 - (value.start ? value.start : 0)); + + // not that fast snoopy + } else { + // still need to fetch file size from fs + fs.stat(value.path, function(err, stat) { + + var fileSize; + + if (err) { + callback(err); + return; + } + + // update final size based on the range options + fileSize = stat.size - (value.start ? value.start : 0); + callback(null, fileSize); + }); + } + + // or http response + } else if (value.hasOwnProperty('httpVersion')) { + callback(null, +value.headers['content-length']); + + // or request stream http://github.com/mikeal/request + } else if (value.hasOwnProperty('httpModule')) { + // wait till response come back + value.on('response', function(response) { + value.pause(); + callback(null, +response.headers['content-length']); + }); + value.resume(); + + // something else + } else { + callback('Unknown stream'); + } +}; + +FormData.prototype._multiPartHeader = function(field, value, options) { + // custom header specified (as string)? + // it becomes responsible for boundary + // (e.g. to handle extra CRLFs on .NET servers) + if (typeof options.header == 'string') { + return options.header; + } + + var contentDisposition = this._getContentDisposition(value, options); + var contentType = this._getContentType(value, options); + + var contents = ''; + var headers = { + // add custom disposition as third element or keep it two elements if not + 'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []), + // if no content type. allow it to be empty array + 'Content-Type': [].concat(contentType || []) + }; + + // allow custom headers. + if (typeof options.header == 'object') { + populate(headers, options.header); + } + + var header; + for (var prop in headers) { + if (!headers.hasOwnProperty(prop)) continue; + header = headers[prop]; + + // skip nullish headers. + if (header == null) { + continue; + } + + // convert all headers to arrays. + if (!Array.isArray(header)) { + header = [header]; + } + + // add non-empty headers. + if (header.length) { + contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK; + } + } + + return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK; +}; + +FormData.prototype._getContentDisposition = function(value, options) { + + var filename + , contentDisposition + ; + + if (typeof options.filepath === 'string') { + // custom filepath for relative paths + filename = path.normalize(options.filepath).replace(/\\/g, '/'); + } else if (options.filename || value.name || value.path) { + // custom filename take precedence + // formidable and the browser add a name property + // fs- and request- streams have path property + filename = path.basename(options.filename || value.name || value.path); + } else if (value.readable && value.hasOwnProperty('httpVersion')) { + // or try http response + filename = path.basename(value.client._httpMessage.path || ''); + } + + if (filename) { + contentDisposition = 'filename="' + filename + '"'; + } + + return contentDisposition; +}; + +FormData.prototype._getContentType = function(value, options) { + + // use custom content-type above all + var contentType = options.contentType; + + // or try `name` from formidable, browser + if (!contentType && value.name) { + contentType = mime.lookup(value.name); + } + + // or try `path` from fs-, request- streams + if (!contentType && value.path) { + contentType = mime.lookup(value.path); + } + + // or if it's http-reponse + if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) { + contentType = value.headers['content-type']; + } + + // or guess it from the filepath or filename + if (!contentType && (options.filepath || options.filename)) { + contentType = mime.lookup(options.filepath || options.filename); + } + + // fallback to the default content type if `value` is not simple value + if (!contentType && typeof value == 'object') { + contentType = FormData.DEFAULT_CONTENT_TYPE; + } + + return contentType; +}; + +FormData.prototype._multiPartFooter = function() { + return function(next) { + var footer = FormData.LINE_BREAK; + + var lastPart = (this._streams.length === 0); + if (lastPart) { + footer += this._lastBoundary(); + } + + next(footer); + }.bind(this); +}; + +FormData.prototype._lastBoundary = function() { + return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK; +}; + +FormData.prototype.getHeaders = function(userHeaders) { + var header; + var formHeaders = { + 'content-type': 'multipart/form-data; boundary=' + this.getBoundary() + }; + + for (header in userHeaders) { + if (userHeaders.hasOwnProperty(header)) { + formHeaders[header.toLowerCase()] = userHeaders[header]; + } + } + + return formHeaders; +}; + +FormData.prototype.setBoundary = function(boundary) { + this._boundary = boundary; +}; + +FormData.prototype.getBoundary = function() { + if (!this._boundary) { + this._generateBoundary(); + } + + return this._boundary; +}; + +FormData.prototype.getBuffer = function() { + var dataBuffer = new Buffer.alloc( 0 ); + var boundary = this.getBoundary(); + + // Create the form content. Add Line breaks to the end of data. + for (var i = 0, len = this._streams.length; i < len; i++) { + if (typeof this._streams[i] !== 'function') { + + // Add content to the buffer. + if(Buffer.isBuffer(this._streams[i])) { + dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]); + }else { + dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]); + } + + // Add break after content. + if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) { + dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] ); + } + } + } + + // Add the footer and return the Buffer object. + return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] ); +}; + +FormData.prototype._generateBoundary = function() { + // This generates a 50 character boundary similar to those used by Firefox. + // They are optimized for boyer-moore parsing. + var boundary = '--------------------------'; + for (var i = 0; i < 24; i++) { + boundary += Math.floor(Math.random() * 10).toString(16); + } + + this._boundary = boundary; +}; + +// Note: getLengthSync DOESN'T calculate streams length +// As workaround one can calculate file size manually +// and add it as knownLength option +FormData.prototype.getLengthSync = function() { + var knownLength = this._overheadLength + this._valueLength; + + // Don't get confused, there are 3 "internal" streams for each keyval pair + // so it basically checks if there is any value added to the form + if (this._streams.length) { + knownLength += this._lastBoundary().length; + } + + // https://github.com/form-data/form-data/issues/40 + if (!this.hasKnownLength()) { + // Some async length retrievers are present + // therefore synchronous length calculation is false. + // Please use getLength(callback) to get proper length + this._error(new Error('Cannot calculate proper length in synchronous way.')); + } + + return knownLength; +}; + +// Public API to check if length of added values is known +// https://github.com/form-data/form-data/issues/196 +// https://github.com/form-data/form-data/issues/262 +FormData.prototype.hasKnownLength = function() { + var hasKnownLength = true; + + if (this._valuesToMeasure.length) { + hasKnownLength = false; + } + + return hasKnownLength; +}; + +FormData.prototype.getLength = function(cb) { + var knownLength = this._overheadLength + this._valueLength; + + if (this._streams.length) { + knownLength += this._lastBoundary().length; + } + + if (!this._valuesToMeasure.length) { + process.nextTick(cb.bind(this, null, knownLength)); + return; + } + + asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) { + if (err) { + cb(err); + return; + } + + values.forEach(function(length) { + knownLength += length; + }); + + cb(null, knownLength); + }); +}; + +FormData.prototype.submit = function(params, cb) { + var request + , options + , defaults = {method: 'post'} + ; + + // parse provided url if it's string + // or treat it as options object + if (typeof params == 'string') { + + params = parseUrl(params); + options = populate({ + port: params.port, + path: params.pathname, + host: params.hostname, + protocol: params.protocol + }, defaults); + + // use custom params + } else { + + options = populate(params, defaults); + // if no port provided use default one + if (!options.port) { + options.port = options.protocol == 'https:' ? 443 : 80; + } + } + + // put that good code in getHeaders to some use + options.headers = this.getHeaders(params.headers); + + // https if specified, fallback to http in any other case + if (options.protocol == 'https:') { + request = https.request(options); + } else { + request = http.request(options); + } + + // get content length and fire away + this.getLength(function(err, length) { + if (err) { + this._error(err); + return; + } + + // add content length + request.setHeader('Content-Length', length); + + this.pipe(request); + if (cb) { + var onResponse; + + var callback = function (error, responce) { + request.removeListener('error', callback); + request.removeListener('response', onResponse); + + return cb.call(this, error, responce); + }; + + onResponse = callback.bind(this, null); + + request.on('error', callback); + request.on('response', onResponse); + } + }.bind(this)); + + return request; +}; + +FormData.prototype._error = function(err) { + if (!this.error) { + this.error = err; + this.pause(); + this.emit('error', err); + } +}; + +FormData.prototype.toString = function () { + return '[object FormData]'; +}; diff --git a/node/node_modules/form-data/lib/populate.js b/node/node_modules/form-data/lib/populate.js new file mode 100644 index 0000000..4d35738 --- /dev/null +++ b/node/node_modules/form-data/lib/populate.js @@ -0,0 +1,10 @@ +// populates missing values +module.exports = function(dst, src) { + + Object.keys(src).forEach(function(prop) + { + dst[prop] = dst[prop] || src[prop]; + }); + + return dst; +}; diff --git a/node/node_modules/form-data/package.json b/node/node_modules/form-data/package.json new file mode 100644 index 0000000..a2fcb88 --- /dev/null +++ b/node/node_modules/form-data/package.json @@ -0,0 +1,68 @@ +{ + "author": "Felix Geisendörfer (http://debuggable.com/)", + "name": "form-data", + "description": "A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.", + "version": "3.0.1", + "repository": { + "type": "git", + "url": "git://github.com/form-data/form-data.git" + }, + "main": "./lib/form_data", + "browser": "./lib/browser", + "typings": "./index.d.ts", + "scripts": { + "pretest": "rimraf coverage test/tmp", + "test": "istanbul cover test/run.js", + "posttest": "istanbul report lcov text", + "lint": "eslint lib/*.js test/*.js test/integration/*.js", + "report": "istanbul report lcov text", + "ci-lint": "is-node-modern 8 && npm run lint || is-node-not-modern 8", + "ci-test": "npm run test && npm run browser && npm run report", + "predebug": "rimraf coverage test/tmp", + "debug": "verbose=1 ./test/run.js", + "browser": "browserify -t browserify-istanbul test/run-browser.js | obake --coverage", + "check": "istanbul check-coverage coverage/coverage*.json", + "files": "pkgfiles --sort=name", + "get-version": "node -e \"console.log(require('./package.json').version)\"", + "update-readme": "sed -i.bak 's/\\/master\\.svg/\\/v'$(npm --silent run get-version)'.svg/g' README.md", + "restore-readme": "mv README.md.bak README.md", + "prepublish": "in-publish && npm run update-readme || not-in-publish", + "postpublish": "npm run restore-readme" + }, + "pre-commit": [ + "lint", + "ci-test", + "check" + ], + "engines": { + "node": ">= 6" + }, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "devDependencies": { + "@types/node": "^12.0.10", + "browserify": "^13.1.1", + "browserify-istanbul": "^2.0.0", + "coveralls": "^3.0.4", + "cross-spawn": "^6.0.5", + "eslint": "^6.0.1", + "fake": "^0.2.2", + "far": "^0.0.7", + "formidable": "^1.0.17", + "in-publish": "^2.0.0", + "is-node-modern": "^1.0.0", + "istanbul": "^0.4.5", + "obake": "^0.1.2", + "puppeteer": "^1.19.0", + "pkgfiles": "^2.3.0", + "pre-commit": "^1.1.3", + "request": "^2.88.0", + "rimraf": "^2.7.1", + "tape": "^4.6.2", + "typescript": "^3.5.2" + }, + "license": "MIT" +} diff --git a/node/node_modules/get-stream/buffer-stream.js b/node/node_modules/get-stream/buffer-stream.js new file mode 100644 index 0000000..2dd7574 --- /dev/null +++ b/node/node_modules/get-stream/buffer-stream.js @@ -0,0 +1,52 @@ +'use strict'; +const {PassThrough: PassThroughStream} = require('stream'); + +module.exports = options => { + options = {...options}; + + const {array} = options; + let {encoding} = options; + const isBuffer = encoding === 'buffer'; + let objectMode = false; + + if (array) { + objectMode = !(encoding || isBuffer); + } else { + encoding = encoding || 'utf8'; + } + + if (isBuffer) { + encoding = null; + } + + const stream = new PassThroughStream({objectMode}); + + if (encoding) { + stream.setEncoding(encoding); + } + + let length = 0; + const chunks = []; + + stream.on('data', chunk => { + chunks.push(chunk); + + if (objectMode) { + length = chunks.length; + } else { + length += chunk.length; + } + }); + + stream.getBufferedValue = () => { + if (array) { + return chunks; + } + + return isBuffer ? Buffer.concat(chunks, length) : chunks.join(''); + }; + + stream.getBufferedLength = () => length; + + return stream; +}; diff --git a/node/node_modules/get-stream/index.d.ts b/node/node_modules/get-stream/index.d.ts new file mode 100644 index 0000000..9485b2b --- /dev/null +++ b/node/node_modules/get-stream/index.d.ts @@ -0,0 +1,105 @@ +/// +import {Stream} from 'stream'; + +declare class MaxBufferErrorClass extends Error { + readonly name: 'MaxBufferError'; + constructor(); +} + +declare namespace getStream { + interface Options { + /** + Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `MaxBufferError` error. + + @default Infinity + */ + readonly maxBuffer?: number; + } + + interface OptionsWithEncoding extends Options { + /** + [Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream. + + @default 'utf8' + */ + readonly encoding?: EncodingType; + } + + type MaxBufferError = MaxBufferErrorClass; +} + +declare const getStream: { + /** + Get the `stream` as a string. + + @returns A promise that resolves when the end event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode. + + @example + ``` + import * as fs from 'fs'; + import getStream = require('get-stream'); + + (async () => { + const stream = fs.createReadStream('unicorn.txt'); + + console.log(await getStream(stream)); + // ,,))))))));, + // __)))))))))))))), + // \|/ -\(((((''''((((((((. + // -*-==//////(('' . `)))))), + // /|\ ))| o ;-. '((((( ,(, + // ( `| / ) ;))))' ,_))^;(~ + // | | | ,))((((_ _____------~~~-. %,;(;(>';'~ + // o_); ; )))(((` ~---~ `:: \ %%~~)(v;(`('~ + // ; ''''```` `: `:::|\,__,%% );`'; ~ + // | _ ) / `:|`----' `-' + // ______/\/~ | / / + // /~;;.____/;;' / ___--,-( `;;;/ + // / // _;______;'------~~~~~ /;;/\ / + // // | | / ; \;;,\ + // (<_ | ; /',/-----' _> + // \_| ||_ //~;~~~~~~~~~ + // `\_| (,~~ + // \~\ + // ~~ + })(); + ``` + */ + (stream: Stream, options?: getStream.OptionsWithEncoding): Promise; + + /** + Get the `stream` as a buffer. + + It honors the `maxBuffer` option as above, but it refers to byte length rather than string length. + */ + buffer( + stream: Stream, + options?: getStream.Options + ): Promise; + + /** + Get the `stream` as an array of values. + + It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen: + + - When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes). + - When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array. + - When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array. + */ + array( + stream: Stream, + options?: getStream.Options + ): Promise; + array( + stream: Stream, + options: getStream.OptionsWithEncoding<'buffer'> + ): Promise; + array( + stream: Stream, + options: getStream.OptionsWithEncoding + ): Promise; + + MaxBufferError: typeof MaxBufferErrorClass; +}; + +export = getStream; diff --git a/node/node_modules/get-stream/index.js b/node/node_modules/get-stream/index.js new file mode 100644 index 0000000..1c5d028 --- /dev/null +++ b/node/node_modules/get-stream/index.js @@ -0,0 +1,61 @@ +'use strict'; +const {constants: BufferConstants} = require('buffer'); +const stream = require('stream'); +const {promisify} = require('util'); +const bufferStream = require('./buffer-stream'); + +const streamPipelinePromisified = promisify(stream.pipeline); + +class MaxBufferError extends Error { + constructor() { + super('maxBuffer exceeded'); + this.name = 'MaxBufferError'; + } +} + +async function getStream(inputStream, options) { + if (!inputStream) { + throw new Error('Expected a stream'); + } + + options = { + maxBuffer: Infinity, + ...options + }; + + const {maxBuffer} = options; + const stream = bufferStream(options); + + await new Promise((resolve, reject) => { + const rejectPromise = error => { + // Don't retrieve an oversized buffer. + if (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) { + error.bufferedData = stream.getBufferedValue(); + } + + reject(error); + }; + + (async () => { + try { + await streamPipelinePromisified(inputStream, stream); + resolve(); + } catch (error) { + rejectPromise(error); + } + })(); + + stream.on('data', () => { + if (stream.getBufferedLength() > maxBuffer) { + rejectPromise(new MaxBufferError()); + } + }); + }); + + return stream.getBufferedValue(); +} + +module.exports = getStream; +module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'}); +module.exports.array = (stream, options) => getStream(stream, {...options, array: true}); +module.exports.MaxBufferError = MaxBufferError; diff --git a/node/node_modules/get-stream/license b/node/node_modules/get-stream/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/node/node_modules/get-stream/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +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. diff --git a/node/node_modules/get-stream/package.json b/node/node_modules/get-stream/package.json new file mode 100644 index 0000000..bd47a75 --- /dev/null +++ b/node/node_modules/get-stream/package.json @@ -0,0 +1,47 @@ +{ + "name": "get-stream", + "version": "6.0.1", + "description": "Get a stream as a string, buffer, or array", + "license": "MIT", + "repository": "sindresorhus/get-stream", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "engines": { + "node": ">=10" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts", + "buffer-stream.js" + ], + "keywords": [ + "get", + "stream", + "promise", + "concat", + "string", + "text", + "buffer", + "read", + "data", + "consume", + "readable", + "readablestream", + "array", + "object" + ], + "devDependencies": { + "@types/node": "^14.0.27", + "ava": "^2.4.0", + "into-stream": "^5.0.0", + "tsd": "^0.13.1", + "xo": "^0.24.0" + } +} diff --git a/node/node_modules/get-stream/readme.md b/node/node_modules/get-stream/readme.md new file mode 100644 index 0000000..70b01fd --- /dev/null +++ b/node/node_modules/get-stream/readme.md @@ -0,0 +1,124 @@ +# get-stream + +> Get a stream as a string, buffer, or array + +## Install + +``` +$ npm install get-stream +``` + +## Usage + +```js +const fs = require('fs'); +const getStream = require('get-stream'); + +(async () => { + const stream = fs.createReadStream('unicorn.txt'); + + console.log(await getStream(stream)); + /* + ,,))))))));, + __)))))))))))))), + \|/ -\(((((''''((((((((. + -*-==//////(('' . `)))))), + /|\ ))| o ;-. '((((( ,(, + ( `| / ) ;))))' ,_))^;(~ + | | | ,))((((_ _____------~~~-. %,;(;(>';'~ + o_); ; )))(((` ~---~ `:: \ %%~~)(v;(`('~ + ; ''''```` `: `:::|\,__,%% );`'; ~ + | _ ) / `:|`----' `-' + ______/\/~ | / / + /~;;.____/;;' / ___--,-( `;;;/ + / // _;______;'------~~~~~ /;;/\ / + // | | / ; \;;,\ + (<_ | ; /',/-----' _> + \_| ||_ //~;~~~~~~~~~ + `\_| (,~~ + \~\ + ~~ + */ +})(); +``` + +## API + +The methods returns a promise that resolves when the `end` event fires on the stream, indicating that there is no more data to be read. The stream is switched to flowing mode. + +### getStream(stream, options?) + +Get the `stream` as a string. + +#### options + +Type: `object` + +##### encoding + +Type: `string`\ +Default: `'utf8'` + +[Encoding](https://nodejs.org/api/buffer.html#buffer_buffer) of the incoming stream. + +##### maxBuffer + +Type: `number`\ +Default: `Infinity` + +Maximum length of the returned string. If it exceeds this value before the stream ends, the promise will be rejected with a `getStream.MaxBufferError` error. + +### getStream.buffer(stream, options?) + +Get the `stream` as a buffer. + +It honors the `maxBuffer` option as above, but it refers to byte length rather than string length. + +### getStream.array(stream, options?) + +Get the `stream` as an array of values. + +It honors both the `maxBuffer` and `encoding` options. The behavior changes slightly based on the encoding chosen: + +- When `encoding` is unset, it assumes an [object mode stream](https://nodesource.com/blog/understanding-object-streams/) and collects values emitted from `stream` unmodified. In this case `maxBuffer` refers to the number of items in the array (not the sum of their sizes). + +- When `encoding` is set to `buffer`, it collects an array of buffers. `maxBuffer` refers to the summed byte lengths of every buffer in the array. + +- When `encoding` is set to anything else, it collects an array of strings. `maxBuffer` refers to the summed character lengths of every string in the array. + +## Errors + +If the input stream emits an `error` event, the promise will be rejected with the error. The buffered data will be attached to the `bufferedData` property of the error. + +```js +(async () => { + try { + await getStream(streamThatErrorsAtTheEnd('unicorn')); + } catch (error) { + console.log(error.bufferedData); + //=> 'unicorn' + } +})() +``` + +## FAQ + +### How is this different from [`concat-stream`](https://github.com/maxogden/concat-stream)? + +This module accepts a stream instead of being one and returns a promise instead of using a callback. The API is simpler and it only supports returning a string, buffer, or array. It doesn't have a fragile type inference. You explicitly choose what you want. And it doesn't depend on the huge `readable-stream` package. + +## Related + +- [get-stdin](https://github.com/sindresorhus/get-stdin) - Get stdin as a string or buffer + +--- + +
+ + Get professional support for this package with a Tidelift subscription + +
+ + Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. +
+
diff --git a/node/node_modules/https-proxy-agent/README.md b/node/node_modules/https-proxy-agent/README.md new file mode 100644 index 0000000..328656a --- /dev/null +++ b/node/node_modules/https-proxy-agent/README.md @@ -0,0 +1,137 @@ +https-proxy-agent +================ +### An HTTP(s) proxy `http.Agent` implementation for HTTPS +[![Build Status](https://github.com/TooTallNate/node-https-proxy-agent/workflows/Node%20CI/badge.svg)](https://github.com/TooTallNate/node-https-proxy-agent/actions?workflow=Node+CI) + +This module provides an `http.Agent` implementation that connects to a specified +HTTP or HTTPS proxy server, and can be used with the built-in `https` module. + +Specifically, this `Agent` implementation connects to an intermediary "proxy" +server and issues the [CONNECT HTTP method][CONNECT], which tells the proxy to +open a direct TCP connection to the destination server. + +Since this agent implements the CONNECT HTTP method, it also works with other +protocols that use this method when connecting over proxies (i.e. WebSockets). +See the "Examples" section below for more. + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install https-proxy-agent +``` + + +Examples +-------- + +#### `https` module example + +``` js +var url = require('url'); +var https = require('https'); +var HttpsProxyAgent = require('https-proxy-agent'); + +// HTTP/HTTPS proxy to connect to +var proxy = process.env.http_proxy || 'http://168.63.76.32:3128'; +console.log('using proxy server %j', proxy); + +// HTTPS endpoint for the proxy to connect to +var endpoint = process.argv[2] || 'https://graph.facebook.com/tootallnate'; +console.log('attempting to GET %j', endpoint); +var options = url.parse(endpoint); + +// create an instance of the `HttpsProxyAgent` class with the proxy server information +var agent = new HttpsProxyAgent(proxy); +options.agent = agent; + +https.get(options, function (res) { + console.log('"response" event!', res.headers); + res.pipe(process.stdout); +}); +``` + +#### `ws` WebSocket connection example + +``` js +var url = require('url'); +var WebSocket = require('ws'); +var HttpsProxyAgent = require('https-proxy-agent'); + +// HTTP/HTTPS proxy to connect to +var proxy = process.env.http_proxy || 'http://168.63.76.32:3128'; +console.log('using proxy server %j', proxy); + +// WebSocket endpoint for the proxy to connect to +var endpoint = process.argv[2] || 'ws://echo.websocket.org'; +var parsed = url.parse(endpoint); +console.log('attempting to connect to WebSocket %j', endpoint); + +// create an instance of the `HttpsProxyAgent` class with the proxy server information +var options = url.parse(proxy); + +var agent = new HttpsProxyAgent(options); + +// finally, initiate the WebSocket connection +var socket = new WebSocket(endpoint, { agent: agent }); + +socket.on('open', function () { + console.log('"open" event!'); + socket.send('hello world'); +}); + +socket.on('message', function (data, flags) { + console.log('"message" event! %j %j', data, flags); + socket.close(); +}); +``` + +API +--- + +### new HttpsProxyAgent(Object options) + +The `HttpsProxyAgent` class implements an `http.Agent` subclass that connects +to the specified "HTTP(s) proxy server" in order to proxy HTTPS and/or WebSocket +requests. This is achieved by using the [HTTP `CONNECT` method][CONNECT]. + +The `options` argument may either be a string URI of the proxy server to use, or an +"options" object with more specific properties: + + * `host` - String - Proxy host to connect to (may use `hostname` as well). Required. + * `port` - Number - Proxy port to connect to. Required. + * `protocol` - String - If `https:`, then use TLS to connect to the proxy. + * `headers` - Object - Additional HTTP headers to be sent on the HTTP CONNECT method. + * Any other options given are passed to the `net.connect()`/`tls.connect()` functions. + + +License +------- + +(The MIT License) + +Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net> + +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. + +[CONNECT]: http://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_Tunneling diff --git a/node/node_modules/https-proxy-agent/dist/agent.d.ts b/node/node_modules/https-proxy-agent/dist/agent.d.ts new file mode 100644 index 0000000..4f1c636 --- /dev/null +++ b/node/node_modules/https-proxy-agent/dist/agent.d.ts @@ -0,0 +1,30 @@ +/// +import net from 'net'; +import { Agent, ClientRequest, RequestOptions } from 'agent-base'; +import { HttpsProxyAgentOptions } from '.'; +/** + * The `HttpsProxyAgent` implements an HTTP Agent subclass that connects to + * the specified "HTTP(s) proxy server" in order to proxy HTTPS requests. + * + * Outgoing HTTP requests are first tunneled through the proxy server using the + * `CONNECT` HTTP request method to establish a connection to the proxy server, + * and then the proxy server connects to the destination target and issues the + * HTTP request from the proxy server. + * + * `https:` requests have their socket connection upgraded to TLS once + * the connection to the proxy server has been established. + * + * @api public + */ +export default class HttpsProxyAgent extends Agent { + private secureProxy; + private proxy; + constructor(_opts: string | HttpsProxyAgentOptions); + /** + * Called when the node-core HTTP client library is creating a + * new HTTP request. + * + * @api protected + */ + callback(req: ClientRequest, opts: RequestOptions): Promise; +} diff --git a/node/node_modules/https-proxy-agent/dist/agent.js b/node/node_modules/https-proxy-agent/dist/agent.js new file mode 100644 index 0000000..75d1136 --- /dev/null +++ b/node/node_modules/https-proxy-agent/dist/agent.js @@ -0,0 +1,177 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const net_1 = __importDefault(require("net")); +const tls_1 = __importDefault(require("tls")); +const url_1 = __importDefault(require("url")); +const assert_1 = __importDefault(require("assert")); +const debug_1 = __importDefault(require("debug")); +const agent_base_1 = require("agent-base"); +const parse_proxy_response_1 = __importDefault(require("./parse-proxy-response")); +const debug = debug_1.default('https-proxy-agent:agent'); +/** + * The `HttpsProxyAgent` implements an HTTP Agent subclass that connects to + * the specified "HTTP(s) proxy server" in order to proxy HTTPS requests. + * + * Outgoing HTTP requests are first tunneled through the proxy server using the + * `CONNECT` HTTP request method to establish a connection to the proxy server, + * and then the proxy server connects to the destination target and issues the + * HTTP request from the proxy server. + * + * `https:` requests have their socket connection upgraded to TLS once + * the connection to the proxy server has been established. + * + * @api public + */ +class HttpsProxyAgent extends agent_base_1.Agent { + constructor(_opts) { + let opts; + if (typeof _opts === 'string') { + opts = url_1.default.parse(_opts); + } + else { + opts = _opts; + } + if (!opts) { + throw new Error('an HTTP(S) proxy server `host` and `port` must be specified!'); + } + debug('creating new HttpsProxyAgent instance: %o', opts); + super(opts); + const proxy = Object.assign({}, opts); + // If `true`, then connect to the proxy server over TLS. + // Defaults to `false`. + this.secureProxy = opts.secureProxy || isHTTPS(proxy.protocol); + // Prefer `hostname` over `host`, and set the `port` if needed. + proxy.host = proxy.hostname || proxy.host; + if (typeof proxy.port === 'string') { + proxy.port = parseInt(proxy.port, 10); + } + if (!proxy.port && proxy.host) { + proxy.port = this.secureProxy ? 443 : 80; + } + // ALPN is supported by Node.js >= v5. + // attempt to negotiate http/1.1 for proxy servers that support http/2 + if (this.secureProxy && !('ALPNProtocols' in proxy)) { + proxy.ALPNProtocols = ['http 1.1']; + } + if (proxy.host && proxy.path) { + // If both a `host` and `path` are specified then it's most likely + // the result of a `url.parse()` call... we need to remove the + // `path` portion so that `net.connect()` doesn't attempt to open + // that as a Unix socket file. + delete proxy.path; + delete proxy.pathname; + } + this.proxy = proxy; + } + /** + * Called when the node-core HTTP client library is creating a + * new HTTP request. + * + * @api protected + */ + callback(req, opts) { + return __awaiter(this, void 0, void 0, function* () { + const { proxy, secureProxy } = this; + // Create a socket connection to the proxy server. + let socket; + if (secureProxy) { + debug('Creating `tls.Socket`: %o', proxy); + socket = tls_1.default.connect(proxy); + } + else { + debug('Creating `net.Socket`: %o', proxy); + socket = net_1.default.connect(proxy); + } + const headers = Object.assign({}, proxy.headers); + const hostname = `${opts.host}:${opts.port}`; + let payload = `CONNECT ${hostname} HTTP/1.1\r\n`; + // Inject the `Proxy-Authorization` header if necessary. + if (proxy.auth) { + headers['Proxy-Authorization'] = `Basic ${Buffer.from(proxy.auth).toString('base64')}`; + } + // The `Host` header should only include the port + // number when it is not the default port. + let { host, port, secureEndpoint } = opts; + if (!isDefaultPort(port, secureEndpoint)) { + host += `:${port}`; + } + headers.Host = host; + headers.Connection = 'close'; + for (const name of Object.keys(headers)) { + payload += `${name}: ${headers[name]}\r\n`; + } + const proxyResponsePromise = parse_proxy_response_1.default(socket); + socket.write(`${payload}\r\n`); + const { statusCode, buffered } = yield proxyResponsePromise; + if (statusCode === 200) { + req.once('socket', resume); + if (opts.secureEndpoint) { + // The proxy is connecting to a TLS server, so upgrade + // this socket connection to a TLS connection. + debug('Upgrading socket connection to TLS'); + const servername = opts.servername || opts.host; + return tls_1.default.connect(Object.assign(Object.assign({}, omit(opts, 'host', 'hostname', 'path', 'port')), { socket, + servername })); + } + return socket; + } + // Some other status code that's not 200... need to re-play the HTTP + // header "data" events onto the socket once the HTTP machinery is + // attached so that the node core `http` can parse and handle the + // error status code. + // Close the original socket, and a new "fake" socket is returned + // instead, so that the proxy doesn't get the HTTP request + // written to it (which may contain `Authorization` headers or other + // sensitive data). + // + // See: https://hackerone.com/reports/541502 + socket.destroy(); + const fakeSocket = new net_1.default.Socket({ writable: false }); + fakeSocket.readable = true; + // Need to wait for the "socket" event to re-play the "data" events. + req.once('socket', (s) => { + debug('replaying proxy buffer for failed request'); + assert_1.default(s.listenerCount('data') > 0); + // Replay the "buffered" Buffer onto the fake `socket`, since at + // this point the HTTP module machinery has been hooked up for + // the user. + s.push(buffered); + s.push(null); + }); + return fakeSocket; + }); + } +} +exports.default = HttpsProxyAgent; +function resume(socket) { + socket.resume(); +} +function isDefaultPort(port, secure) { + return Boolean((!secure && port === 80) || (secure && port === 443)); +} +function isHTTPS(protocol) { + return typeof protocol === 'string' ? /^https:?$/i.test(protocol) : false; +} +function omit(obj, ...keys) { + const ret = {}; + let key; + for (key in obj) { + if (!keys.includes(key)) { + ret[key] = obj[key]; + } + } + return ret; +} +//# sourceMappingURL=agent.js.map \ No newline at end of file diff --git a/node/node_modules/https-proxy-agent/dist/agent.js.map b/node/node_modules/https-proxy-agent/dist/agent.js.map new file mode 100644 index 0000000..0af6c17 --- /dev/null +++ b/node/node_modules/https-proxy-agent/dist/agent.js.map @@ -0,0 +1 @@ +{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/node/node_modules/https-proxy-agent/dist/index.d.ts b/node/node_modules/https-proxy-agent/dist/index.d.ts new file mode 100644 index 0000000..0d60062 --- /dev/null +++ b/node/node_modules/https-proxy-agent/dist/index.d.ts @@ -0,0 +1,23 @@ +/// +import net from 'net'; +import tls from 'tls'; +import { Url } from 'url'; +import { AgentOptions } from 'agent-base'; +import { OutgoingHttpHeaders } from 'http'; +import _HttpsProxyAgent from './agent'; +declare function createHttpsProxyAgent(opts: string | createHttpsProxyAgent.HttpsProxyAgentOptions): _HttpsProxyAgent; +declare namespace createHttpsProxyAgent { + interface BaseHttpsProxyAgentOptions { + headers?: OutgoingHttpHeaders; + secureProxy?: boolean; + host?: string | null; + path?: string | null; + port?: string | number | null; + } + export interface HttpsProxyAgentOptions extends AgentOptions, BaseHttpsProxyAgentOptions, Partial> { + } + export type HttpsProxyAgent = _HttpsProxyAgent; + export const HttpsProxyAgent: typeof _HttpsProxyAgent; + export {}; +} +export = createHttpsProxyAgent; diff --git a/node/node_modules/https-proxy-agent/dist/index.js b/node/node_modules/https-proxy-agent/dist/index.js new file mode 100644 index 0000000..b03e763 --- /dev/null +++ b/node/node_modules/https-proxy-agent/dist/index.js @@ -0,0 +1,14 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +const agent_1 = __importDefault(require("./agent")); +function createHttpsProxyAgent(opts) { + return new agent_1.default(opts); +} +(function (createHttpsProxyAgent) { + createHttpsProxyAgent.HttpsProxyAgent = agent_1.default; + createHttpsProxyAgent.prototype = agent_1.default.prototype; +})(createHttpsProxyAgent || (createHttpsProxyAgent = {})); +module.exports = createHttpsProxyAgent; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/node/node_modules/https-proxy-agent/dist/index.js.map b/node/node_modules/https-proxy-agent/dist/index.js.map new file mode 100644 index 0000000..f3ce559 --- /dev/null +++ b/node/node_modules/https-proxy-agent/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;AAKA,oDAAuC;AAEvC,SAAS,qBAAqB,CAC7B,IAA2D;IAE3D,OAAO,IAAI,eAAgB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,WAAU,qBAAqB;IAoBjB,qCAAe,GAAG,eAAgB,CAAC;IAEhD,qBAAqB,CAAC,SAAS,GAAG,eAAgB,CAAC,SAAS,CAAC;AAC9D,CAAC,EAvBS,qBAAqB,KAArB,qBAAqB,QAuB9B;AAED,iBAAS,qBAAqB,CAAC"} \ No newline at end of file diff --git a/node/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts b/node/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts new file mode 100644 index 0000000..7565674 --- /dev/null +++ b/node/node_modules/https-proxy-agent/dist/parse-proxy-response.d.ts @@ -0,0 +1,7 @@ +/// +import { Readable } from 'stream'; +export interface ProxyResponse { + statusCode: number; + buffered: Buffer; +} +export default function parseProxyResponse(socket: Readable): Promise; diff --git a/node/node_modules/https-proxy-agent/dist/parse-proxy-response.js b/node/node_modules/https-proxy-agent/dist/parse-proxy-response.js new file mode 100644 index 0000000..aa5ce3c --- /dev/null +++ b/node/node_modules/https-proxy-agent/dist/parse-proxy-response.js @@ -0,0 +1,66 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const debug_1 = __importDefault(require("debug")); +const debug = debug_1.default('https-proxy-agent:parse-proxy-response'); +function parseProxyResponse(socket) { + return new Promise((resolve, reject) => { + // we need to buffer any HTTP traffic that happens with the proxy before we get + // the CONNECT response, so that if the response is anything other than an "200" + // response code, then we can re-play the "data" events on the socket once the + // HTTP parser is hooked up... + let buffersLength = 0; + const buffers = []; + function read() { + const b = socket.read(); + if (b) + ondata(b); + else + socket.once('readable', read); + } + function cleanup() { + socket.removeListener('end', onend); + socket.removeListener('error', onerror); + socket.removeListener('close', onclose); + socket.removeListener('readable', read); + } + function onclose(err) { + debug('onclose had error %o', err); + } + function onend() { + debug('onend'); + } + function onerror(err) { + cleanup(); + debug('onerror %o', err); + reject(err); + } + function ondata(b) { + buffers.push(b); + buffersLength += b.length; + const buffered = Buffer.concat(buffers, buffersLength); + const endOfHeaders = buffered.indexOf('\r\n\r\n'); + if (endOfHeaders === -1) { + // keep buffering + debug('have not received end of HTTP headers yet...'); + read(); + return; + } + const firstLine = buffered.toString('ascii', 0, buffered.indexOf('\r\n')); + const statusCode = +firstLine.split(' ')[1]; + debug('got proxy server response: %o', firstLine); + resolve({ + statusCode, + buffered + }); + } + socket.on('error', onerror); + socket.on('close', onclose); + socket.on('end', onend); + read(); + }); +} +exports.default = parseProxyResponse; +//# sourceMappingURL=parse-proxy-response.js.map \ No newline at end of file diff --git a/node/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map b/node/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map new file mode 100644 index 0000000..bacdb84 --- /dev/null +++ b/node/node_modules/https-proxy-agent/dist/parse-proxy-response.js.map @@ -0,0 +1 @@ +{"version":3,"file":"parse-proxy-response.js","sourceRoot":"","sources":["../src/parse-proxy-response.ts"],"names":[],"mappings":";;;;;AAAA,kDAAgC;AAGhC,MAAM,KAAK,GAAG,eAAW,CAAC,wCAAwC,CAAC,CAAC;AAOpE,SAAwB,kBAAkB,CACzC,MAAgB;IAEhB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,+EAA+E;QAC/E,gFAAgF;QAChF,8EAA8E;QAC9E,8BAA8B;QAC9B,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,SAAS,IAAI;YACZ,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC;gBAAE,MAAM,CAAC,CAAC,CAAC,CAAC;;gBACZ,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QAED,SAAS,OAAO;YACf,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACpC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,SAAS,OAAO,CAAC,GAAW;YAC3B,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;QAED,SAAS,KAAK;YACb,KAAK,CAAC,OAAO,CAAC,CAAC;QAChB,CAAC;QAED,SAAS,OAAO,CAAC,GAAU;YAC1B,OAAO,EAAE,CAAC;YACV,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;QAED,SAAS,MAAM,CAAC,CAAS;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,aAAa,IAAI,CAAC,CAAC,MAAM,CAAC;YAE1B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YACvD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAElD,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE;gBACxB,iBAAiB;gBACjB,KAAK,CAAC,8CAA8C,CAAC,CAAC;gBACtD,IAAI,EAAE,CAAC;gBACP,OAAO;aACP;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAClC,OAAO,EACP,CAAC,EACD,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CACxB,CAAC;YACF,MAAM,UAAU,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,KAAK,CAAC,+BAA+B,EAAE,SAAS,CAAC,CAAC;YAClD,OAAO,CAAC;gBACP,UAAU;gBACV,QAAQ;aACR,CAAC,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAExB,IAAI,EAAE,CAAC;IACR,CAAC,CAAC,CAAC;AACJ,CAAC;AAvED,qCAuEC"} \ No newline at end of file diff --git a/node/node_modules/https-proxy-agent/node_modules/debug/LICENSE b/node/node_modules/https-proxy-agent/node_modules/debug/LICENSE new file mode 100644 index 0000000..1a9820e --- /dev/null +++ b/node/node_modules/https-proxy-agent/node_modules/debug/LICENSE @@ -0,0 +1,20 @@ +(The MIT License) + +Copyright (c) 2014-2017 TJ Holowaychuk +Copyright (c) 2018-2021 Josh Junon + +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. + diff --git a/node/node_modules/https-proxy-agent/node_modules/debug/README.md b/node/node_modules/https-proxy-agent/node_modules/debug/README.md new file mode 100644 index 0000000..e9c3e04 --- /dev/null +++ b/node/node_modules/https-proxy-agent/node_modules/debug/README.md @@ -0,0 +1,481 @@ +# debug +[![Build Status](https://travis-ci.org/debug-js/debug.svg?branch=master)](https://travis-ci.org/debug-js/debug) [![Coverage Status](https://coveralls.io/repos/github/debug-js/debug/badge.svg?branch=master)](https://coveralls.io/github/debug-js/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) +[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) + + + +A tiny JavaScript debugging utility modelled after Node.js core's debugging +technique. Works in Node.js and web browsers. + +## Installation + +```bash +$ npm install debug +``` + +## Usage + +`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. + +Example [_app.js_](./examples/node/app.js): + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %o', name); + +http.createServer(function(req, res){ + debug(req.method + ' ' + req.url); + res.end('hello\n'); +}).listen(3000, function(){ + debug('listening'); +}); + +// fake worker of some kind + +require('./worker'); +``` + +Example [_worker.js_](./examples/node/worker.js): + +```js +var a = require('debug')('worker:a') + , b = require('debug')('worker:b'); + +function work() { + a('doing lots of uninteresting work'); + setTimeout(work, Math.random() * 1000); +} + +work(); + +function workb() { + b('doing some work'); + setTimeout(workb, Math.random() * 2000); +} + +workb(); +``` + +The `DEBUG` environment variable is then used to enable these based on space or +comma-delimited names. + +Here are some examples: + +screen shot 2017-08-08 at 12 53 04 pm +screen shot 2017-08-08 at 12 53 38 pm +screen shot 2017-08-08 at 12 53 25 pm + +#### Windows command prompt notes + +##### CMD + +On Windows the environment variable is set using the `set` command. + +```cmd +set DEBUG=*,-not_this +``` + +Example: + +```cmd +set DEBUG=* & node app.js +``` + +##### PowerShell (VS Code default) + +PowerShell uses different syntax to set environment variables. + +```cmd +$env:DEBUG = "*,-not_this" +``` + +Example: + +```cmd +$env:DEBUG='app';node app.js +``` + +Then, run the program to be debugged as usual. + +npm script example: +```js + "windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js", +``` + +## Namespace Colors + +Every debug instance has a color generated for it based on its namespace name. +This helps when visually parsing the debug output to identify which debug instance +a debug line belongs to. + +#### Node.js + +In Node.js, colors are enabled when stderr is a TTY. You also _should_ install +the [`supports-color`](https://npmjs.org/supports-color) module alongside debug, +otherwise debug will only use a small handful of basic colors. + + + +#### Web Browser + +Colors are also enabled on "Web Inspectors" that understand the `%c` formatting +option. These are WebKit web inspectors, Firefox ([since version +31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) +and the Firebug plugin for Firefox (any version). + + + + +## Millisecond diff + +When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. + + + +When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below: + + + + +## Conventions + +If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable. You can then use it for normal output as well as debug output. + +## Wildcards + +The `*` character may be used as a wildcard. Suppose for example your library has +debuggers named "connect:bodyParser", "connect:compress", "connect:session", +instead of listing all three with +`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do +`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. + +You can also exclude specific debuggers by prefixing them with a "-" character. +For example, `DEBUG=*,-connect:*` would include all debuggers except those +starting with "connect:". + +## Environment Variables + +When running through Node.js, you can set a few environment variables that will +change the behavior of the debug logging: + +| Name | Purpose | +|-----------|-------------------------------------------------| +| `DEBUG` | Enables/disables specific debugging namespaces. | +| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY). | +| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | +| `DEBUG_DEPTH` | Object inspection depth. | +| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | + + +__Note:__ The environment variables beginning with `DEBUG_` end up being +converted into an Options object that gets used with `%o`/`%O` formatters. +See the Node.js documentation for +[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) +for the complete list. + +## Formatters + +Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. +Below are the officially supported formatters: + +| Formatter | Representation | +|-----------|----------------| +| `%O` | Pretty-print an Object on multiple lines. | +| `%o` | Pretty-print an Object all on a single line. | +| `%s` | String. | +| `%d` | Number (both integer and float). | +| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | +| `%%` | Single percent sign ('%'). This does not consume an argument. | + + +### Custom formatters + +You can add custom formatters by extending the `debug.formatters` object. +For example, if you wanted to add support for rendering a Buffer as hex with +`%h`, you could do something like: + +```js +const createDebug = require('debug') +createDebug.formatters.h = (v) => { + return v.toString('hex') +} + +// …elsewhere +const debug = createDebug('foo') +debug('this is hex: %h', new Buffer('hello world')) +// foo this is hex: 68656c6c6f20776f726c6421 +0ms +``` + + +## Browser Support + +You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), +or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), +if you don't want to build it yourself. + +Debug's enable state is currently persisted by `localStorage`. +Consider the situation shown below where you have `worker:a` and `worker:b`, +and wish to debug both. You can enable this using `localStorage.debug`: + +```js +localStorage.debug = 'worker:*' +``` + +And then refresh the page. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + b('doing some work'); +}, 1200); +``` + +In Chromium-based web browsers (e.g. Brave, Chrome, and Electron), the JavaScript console will—by default—only show messages logged by `debug` if the "Verbose" log level is _enabled_. + + + +## Output streams + + By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: + +Example [_stdout.js_](./examples/node/stdout.js): + +```js +var debug = require('debug'); +var error = debug('app:error'); + +// by default stderr is used +error('goes to stderr!'); + +var log = debug('app:log'); +// set this namespace to log via console.log +log.log = console.log.bind(console); // don't forget to bind to console! +log('goes to stdout'); +error('still goes to stderr!'); + +// set all output to go via console.info +// overrides all per-namespace log settings +debug.log = console.info.bind(console); +error('now goes to stdout via console.info'); +log('still goes to stdout, but via console.info now'); +``` + +## Extend +You can simply extend debugger +```js +const log = require('debug')('auth'); + +//creates new debug instance with extended namespace +const logSign = log.extend('sign'); +const logLogin = log.extend('login'); + +log('hello'); // auth hello +logSign('hello'); //auth:sign hello +logLogin('hello'); //auth:login hello +``` + +## Set dynamically + +You can also enable debug dynamically by calling the `enable()` method : + +```js +let debug = require('debug'); + +console.log(1, debug.enabled('test')); + +debug.enable('test'); +console.log(2, debug.enabled('test')); + +debug.disable(); +console.log(3, debug.enabled('test')); + +``` + +print : +``` +1 false +2 true +3 false +``` + +Usage : +`enable(namespaces)` +`namespaces` can include modes separated by a colon and wildcards. + +Note that calling `enable()` completely overrides previously set DEBUG variable : + +``` +$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))' +=> false +``` + +`disable()` + +Will disable all namespaces. The functions returns the namespaces currently +enabled (and skipped). This can be useful if you want to disable debugging +temporarily without knowing what was enabled to begin with. + +For example: + +```js +let debug = require('debug'); +debug.enable('foo:*,-foo:bar'); +let namespaces = debug.disable(); +debug.enable(namespaces); +``` + +Note: There is no guarantee that the string will be identical to the initial +enable string, but semantically they will be identical. + +## Checking whether a debug target is enabled + +After you've created a debug instance, you can determine whether or not it is +enabled by checking the `enabled` property: + +```javascript +const debug = require('debug')('http'); + +if (debug.enabled) { + // do stuff... +} +``` + +You can also manually toggle this property to force the debug instance to be +enabled or disabled. + +## Usage in child processes + +Due to the way `debug` detects if the output is a TTY or not, colors are not shown in child processes when `stderr` is piped. A solution is to pass the `DEBUG_COLORS=1` environment variable to the child process. +For example: + +```javascript +worker = fork(WORKER_WRAP_PATH, [workerPath], { + stdio: [ + /* stdin: */ 0, + /* stdout: */ 'pipe', + /* stderr: */ 'pipe', + 'ipc', + ], + env: Object.assign({}, process.env, { + DEBUG_COLORS: 1 // without this settings, colors won't be shown + }), +}); + +worker.stderr.pipe(process.stderr, { end: false }); +``` + + +## Authors + + - TJ Holowaychuk + - Nathan Rajlich + - Andrew Rhyne + - Josh Junon + +## Backers + +Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Sponsors + +Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## License + +(The MIT License) + +Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca> +Copyright (c) 2018-2021 Josh Junon + +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. diff --git a/node/node_modules/https-proxy-agent/node_modules/debug/package.json b/node/node_modules/https-proxy-agent/node_modules/debug/package.json new file mode 100644 index 0000000..3bcdc24 --- /dev/null +++ b/node/node_modules/https-proxy-agent/node_modules/debug/package.json @@ -0,0 +1,59 @@ +{ + "name": "debug", + "version": "4.3.4", + "repository": { + "type": "git", + "url": "git://github.com/debug-js/debug.git" + }, + "description": "Lightweight debugging utility for Node.js and the browser", + "keywords": [ + "debug", + "log", + "debugger" + ], + "files": [ + "src", + "LICENSE", + "README.md" + ], + "author": "Josh Junon ", + "contributors": [ + "TJ Holowaychuk ", + "Nathan Rajlich (http://n8.io)", + "Andrew Rhyne " + ], + "license": "MIT", + "scripts": { + "lint": "xo", + "test": "npm run test:node && npm run test:browser && npm run lint", + "test:node": "istanbul cover _mocha -- test.js", + "test:browser": "karma start --single-run", + "test:coverage": "cat ./coverage/lcov.info | coveralls" + }, + "dependencies": { + "ms": "2.1.2" + }, + "devDependencies": { + "brfs": "^2.0.1", + "browserify": "^16.2.3", + "coveralls": "^3.0.2", + "istanbul": "^0.4.5", + "karma": "^3.1.4", + "karma-browserify": "^6.0.0", + "karma-chrome-launcher": "^2.2.0", + "karma-mocha": "^1.3.0", + "mocha": "^5.2.0", + "mocha-lcov-reporter": "^1.2.0", + "xo": "^0.23.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + }, + "main": "./src/index.js", + "browser": "./src/browser.js", + "engines": { + "node": ">=6.0" + } +} diff --git a/node/node_modules/https-proxy-agent/node_modules/debug/src/browser.js b/node/node_modules/https-proxy-agent/node_modules/debug/src/browser.js new file mode 100644 index 0000000..cd0fc35 --- /dev/null +++ b/node/node_modules/https-proxy-agent/node_modules/debug/src/browser.js @@ -0,0 +1,269 @@ +/* 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; + } +}; diff --git a/node/node_modules/https-proxy-agent/node_modules/debug/src/common.js b/node/node_modules/https-proxy-agent/node_modules/debug/src/common.js new file mode 100644 index 0000000..e3291b2 --- /dev/null +++ b/node/node_modules/https-proxy-agent/node_modules/debug/src/common.js @@ -0,0 +1,274 @@ + +/** + * 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; diff --git a/node/node_modules/https-proxy-agent/node_modules/debug/src/index.js b/node/node_modules/https-proxy-agent/node_modules/debug/src/index.js new file mode 100644 index 0000000..bf4c57f --- /dev/null +++ b/node/node_modules/https-proxy-agent/node_modules/debug/src/index.js @@ -0,0 +1,10 @@ +/** + * Detect Electron renderer / nwjs process, which is node, but we should + * treat as a browser. + */ + +if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) { + module.exports = require('./browser.js'); +} else { + module.exports = require('./node.js'); +} diff --git a/node/node_modules/https-proxy-agent/node_modules/debug/src/node.js b/node/node_modules/https-proxy-agent/node_modules/debug/src/node.js new file mode 100644 index 0000000..79bc085 --- /dev/null +++ b/node/node_modules/https-proxy-agent/node_modules/debug/src/node.js @@ -0,0 +1,263 @@ +/** + * Module dependencies. + */ + +const tty = require('tty'); +const util = require('util'); + +/** + * This is the Node.js implementation of `debug()`. + */ + +exports.init = init; +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.destroy = util.deprecate( + () => {}, + '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 = [6, 2, 3, 4, 5, 1]; + +try { + // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) + // eslint-disable-next-line import/no-extraneous-dependencies + const supportsColor = require('supports-color'); + + if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { + exports.colors = [ + 20, + 21, + 26, + 27, + 32, + 33, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 56, + 57, + 62, + 63, + 68, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 92, + 93, + 98, + 99, + 112, + 113, + 128, + 129, + 134, + 135, + 148, + 149, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 178, + 179, + 184, + 185, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 214, + 215, + 220, + 221 + ]; + } +} catch (error) { + // Swallow - we only care if `supports-color` is available; it doesn't have to be. +} + +/** + * Build up the default `inspectOpts` object from the environment variables. + * + * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js + */ + +exports.inspectOpts = Object.keys(process.env).filter(key => { + return /^debug_/i.test(key); +}).reduce((obj, key) => { + // Camel-case + const prop = key + .substring(6) + .toLowerCase() + .replace(/_([a-z])/g, (_, k) => { + return k.toUpperCase(); + }); + + // Coerce string value into JS value + let val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) { + val = true; + } else if (/^(no|off|false|disabled)$/i.test(val)) { + val = false; + } else if (val === 'null') { + val = null; + } else { + val = Number(val); + } + + obj[prop] = val; + return obj; +}, {}); + +/** + * Is stdout a TTY? Colored output is enabled when `true`. + */ + +function useColors() { + return 'colors' in exports.inspectOpts ? + Boolean(exports.inspectOpts.colors) : + tty.isatty(process.stderr.fd); +} + +/** + * Adds ANSI color escape codes if enabled. + * + * @api public + */ + +function formatArgs(args) { + const {namespace: name, useColors} = this; + + if (useColors) { + const c = this.color; + const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); + const prefix = ` ${colorCode};1m${name} \u001B[0m`; + + args[0] = prefix + args[0].split('\n').join('\n' + prefix); + args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); + } else { + args[0] = getDate() + name + ' ' + args[0]; + } +} + +function getDate() { + if (exports.inspectOpts.hideDate) { + return ''; + } + return new Date().toISOString() + ' '; +} + +/** + * Invokes `util.format()` with the specified arguments and writes to stderr. + */ + +function log(...args) { + return process.stderr.write(util.format(...args) + '\n'); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + if (namespaces) { + process.env.DEBUG = namespaces; + } else { + // If you set a process.env field to null or undefined, it gets cast to the + // string 'null' or 'undefined'. Just delete instead. + delete process.env.DEBUG; + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ + +function load() { + return process.env.DEBUG; +} + +/** + * Init logic for `debug` instances. + * + * Create a new `inspectOpts` object in case `useColors` is set + * differently for a particular `debug` instance. + */ + +function init(debug) { + debug.inspectOpts = {}; + + const keys = Object.keys(exports.inspectOpts); + for (let i = 0; i < keys.length; i++) { + debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; + } +} + +module.exports = require('./common')(exports); + +const {formatters} = module.exports; + +/** + * Map %o to `util.inspect()`, all on a single line. + */ + +formatters.o = function (v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts) + .split('\n') + .map(str => str.trim()) + .join(' '); +}; + +/** + * Map %O to `util.inspect()`, allowing multiple lines if needed. + */ + +formatters.O = function (v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); +}; diff --git a/node/node_modules/https-proxy-agent/node_modules/ms/index.js b/node/node_modules/https-proxy-agent/node_modules/ms/index.js new file mode 100644 index 0000000..c4498bc --- /dev/null +++ b/node/node_modules/https-proxy-agent/node_modules/ms/index.js @@ -0,0 +1,162 @@ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * 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 + */ + +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) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + 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; + } + 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; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + 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'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} diff --git a/node/node_modules/https-proxy-agent/node_modules/ms/license.md b/node/node_modules/https-proxy-agent/node_modules/ms/license.md new file mode 100644 index 0000000..69b6125 --- /dev/null +++ b/node/node_modules/https-proxy-agent/node_modules/ms/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +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. diff --git a/node/node_modules/https-proxy-agent/node_modules/ms/package.json b/node/node_modules/https-proxy-agent/node_modules/ms/package.json new file mode 100644 index 0000000..eea666e --- /dev/null +++ b/node/node_modules/https-proxy-agent/node_modules/ms/package.json @@ -0,0 +1,37 @@ +{ + "name": "ms", + "version": "2.1.2", + "description": "Tiny millisecond conversion utility", + "repository": "zeit/ms", + "main": "./index", + "files": [ + "index.js" + ], + "scripts": { + "precommit": "lint-staged", + "lint": "eslint lib/* bin/*", + "test": "mocha tests.js" + }, + "eslintConfig": { + "extends": "eslint:recommended", + "env": { + "node": true, + "es6": true + } + }, + "lint-staged": { + "*.js": [ + "npm run lint", + "prettier --single-quote --write", + "git add" + ] + }, + "license": "MIT", + "devDependencies": { + "eslint": "4.12.1", + "expect.js": "0.3.1", + "husky": "0.14.3", + "lint-staged": "5.0.0", + "mocha": "4.0.1" + } +} diff --git a/node/node_modules/https-proxy-agent/node_modules/ms/readme.md b/node/node_modules/https-proxy-agent/node_modules/ms/readme.md new file mode 100644 index 0000000..9a1996b --- /dev/null +++ b/node/node_modules/https-proxy-agent/node_modules/ms/readme.md @@ -0,0 +1,60 @@ +# ms + +[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms) +[![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/zeit) + +Use this package to easily convert various time formats to milliseconds. + +## Examples + +```js +ms('2 days') // 172800000 +ms('1d') // 86400000 +ms('10h') // 36000000 +ms('2.5 hrs') // 9000000 +ms('2h') // 7200000 +ms('1m') // 60000 +ms('5s') // 5000 +ms('1y') // 31557600000 +ms('100') // 100 +ms('-3 days') // -259200000 +ms('-1h') // -3600000 +ms('-200') // -200 +``` + +### Convert from Milliseconds + +```js +ms(60000) // "1m" +ms(2 * 60000) // "2m" +ms(-3 * 60000) // "-3m" +ms(ms('10 hours')) // "10h" +``` + +### Time Format Written-Out + +```js +ms(60000, { long: true }) // "1 minute" +ms(2 * 60000, { long: true }) // "2 minutes" +ms(-3 * 60000, { long: true }) // "-3 minutes" +ms(ms('10 hours'), { long: true }) // "10 hours" +``` + +## Features + +- Works both in [Node.js](https://nodejs.org) and in the browser +- If a number is supplied to `ms`, a string with a unit is returned +- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`) +- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned + +## Related Packages + +- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time. + +## Caught a Bug? + +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device +2. Link the package to the global module directory: `npm link` +3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms! + +As always, you can run the tests using: `npm test` diff --git a/node/node_modules/https-proxy-agent/package.json b/node/node_modules/https-proxy-agent/package.json new file mode 100644 index 0000000..fb2aba1 --- /dev/null +++ b/node/node_modules/https-proxy-agent/package.json @@ -0,0 +1,56 @@ +{ + "name": "https-proxy-agent", + "version": "5.0.1", + "description": "An HTTP(s) proxy `http.Agent` implementation for HTTPS", + "main": "dist/index", + "types": "dist/index", + "files": [ + "dist" + ], + "scripts": { + "prebuild": "rimraf dist", + "build": "tsc", + "test": "mocha --reporter spec", + "test-lint": "eslint src --ext .js,.ts", + "prepublishOnly": "npm run build" + }, + "repository": { + "type": "git", + "url": "git://github.com/TooTallNate/node-https-proxy-agent.git" + }, + "keywords": [ + "https", + "proxy", + "endpoint", + "agent" + ], + "author": "Nathan Rajlich (http://n8.io/)", + "license": "MIT", + "bugs": { + "url": "https://github.com/TooTallNate/node-https-proxy-agent/issues" + }, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "devDependencies": { + "@types/debug": "4", + "@types/node": "^12.12.11", + "@typescript-eslint/eslint-plugin": "1.6.0", + "@typescript-eslint/parser": "1.1.0", + "eslint": "5.16.0", + "eslint-config-airbnb": "17.1.0", + "eslint-config-prettier": "4.1.0", + "eslint-import-resolver-typescript": "1.1.1", + "eslint-plugin-import": "2.16.0", + "eslint-plugin-jsx-a11y": "6.2.1", + "eslint-plugin-react": "7.12.4", + "mocha": "^6.2.2", + "proxy": "1", + "rimraf": "^3.0.0", + "typescript": "^3.5.3" + }, + "engines": { + "node": ">= 6" + } +} diff --git a/node/node_modules/is-stream/index.d.ts b/node/node_modules/is-stream/index.d.ts new file mode 100644 index 0000000..eee2e83 --- /dev/null +++ b/node/node_modules/is-stream/index.d.ts @@ -0,0 +1,79 @@ +import * as stream from 'stream'; + +declare const isStream: { + /** + @returns Whether `stream` is a [`Stream`](https://nodejs.org/api/stream.html#stream_stream). + + @example + ``` + import * as fs from 'fs'; + import isStream = require('is-stream'); + + isStream(fs.createReadStream('unicorn.png')); + //=> true + + isStream({}); + //=> false + ``` + */ + (stream: unknown): stream is stream.Stream; + + /** + @returns Whether `stream` is a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable). + + @example + ``` + import * as fs from 'fs'; + import isStream = require('is-stream'); + + isStream.writable(fs.createWriteStrem('unicorn.txt')); + //=> true + ``` + */ + writable(stream: unknown): stream is stream.Writable; + + /** + @returns Whether `stream` is a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable). + + @example + ``` + import * as fs from 'fs'; + import isStream = require('is-stream'); + + isStream.readable(fs.createReadStream('unicorn.png')); + //=> true + ``` + */ + readable(stream: unknown): stream is stream.Readable; + + /** + @returns Whether `stream` is a [`stream.Duplex`](https://nodejs.org/api/stream.html#stream_class_stream_duplex). + + @example + ``` + import {Duplex} from 'stream'; + import isStream = require('is-stream'); + + isStream.duplex(new Duplex()); + //=> true + ``` + */ + duplex(stream: unknown): stream is stream.Duplex; + + /** + @returns Whether `stream` is a [`stream.Transform`](https://nodejs.org/api/stream.html#stream_class_stream_transform). + + @example + ``` + import * as fs from 'fs'; + import Stringify = require('streaming-json-stringify'); + import isStream = require('is-stream'); + + isStream.transform(Stringify()); + //=> true + ``` + */ + transform(input: unknown): input is stream.Transform; +}; + +export = isStream; diff --git a/node/node_modules/is-stream/index.js b/node/node_modules/is-stream/index.js new file mode 100644 index 0000000..2e43434 --- /dev/null +++ b/node/node_modules/is-stream/index.js @@ -0,0 +1,28 @@ +'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'; + +module.exports = isStream; diff --git a/node/node_modules/is-stream/license b/node/node_modules/is-stream/license new file mode 100644 index 0000000..fa7ceba --- /dev/null +++ b/node/node_modules/is-stream/license @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) Sindre Sorhus (https://sindresorhus.com) + +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. diff --git a/node/node_modules/is-stream/package.json b/node/node_modules/is-stream/package.json new file mode 100644 index 0000000..c3b5673 --- /dev/null +++ b/node/node_modules/is-stream/package.json @@ -0,0 +1,42 @@ +{ + "name": "is-stream", + "version": "2.0.1", + "description": "Check if something is a Node.js stream", + "license": "MIT", + "repository": "sindresorhus/is-stream", + "funding": "https://github.com/sponsors/sindresorhus", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com" + }, + "engines": { + "node": ">=8" + }, + "scripts": { + "test": "xo && ava && tsd" + }, + "files": [ + "index.js", + "index.d.ts" + ], + "keywords": [ + "stream", + "type", + "streams", + "writable", + "readable", + "duplex", + "transform", + "check", + "detect", + "is" + ], + "devDependencies": { + "@types/node": "^11.13.6", + "ava": "^1.4.1", + "tempy": "^0.3.0", + "tsd": "^0.7.2", + "xo": "^0.24.0" + } +} diff --git a/node/node_modules/is-stream/readme.md b/node/node_modules/is-stream/readme.md new file mode 100644 index 0000000..19308e7 --- /dev/null +++ b/node/node_modules/is-stream/readme.md @@ -0,0 +1,60 @@ +# is-stream + +> Check if something is a [Node.js stream](https://nodejs.org/api/stream.html) + +## Install + +``` +$ npm install is-stream +``` + +## Usage + +```js +const fs = require('fs'); +const isStream = require('is-stream'); + +isStream(fs.createReadStream('unicorn.png')); +//=> true + +isStream({}); +//=> false +``` + +## API + +### isStream(stream) + +Returns a `boolean` for whether it's a [`Stream`](https://nodejs.org/api/stream.html#stream_stream). + +#### isStream.writable(stream) + +Returns a `boolean` for whether it's a [`stream.Writable`](https://nodejs.org/api/stream.html#stream_class_stream_writable). + +#### isStream.readable(stream) + +Returns a `boolean` for whether it's a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable). + +#### isStream.duplex(stream) + +Returns a `boolean` for whether it's a [`stream.Duplex`](https://nodejs.org/api/stream.html#stream_class_stream_duplex). + +#### isStream.transform(stream) + +Returns a `boolean` for whether it's a [`stream.Transform`](https://nodejs.org/api/stream.html#stream_class_stream_transform). + +## Related + +- [is-file-stream](https://github.com/jamestalmage/is-file-stream) - Detect if a stream is a file stream + +--- + +
+ + Get professional support for this package with a Tidelift subscription + +
+ + Tidelift helps make open source sustainable for maintainers while giving companies
assurances about security, maintenance, and licensing for their dependencies. +
+
diff --git a/node/node_modules/json-bigint/LICENSE b/node/node_modules/json-bigint/LICENSE new file mode 100644 index 0000000..9ab4d83 --- /dev/null +++ b/node/node_modules/json-bigint/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Andrey Sidorov + +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. diff --git a/node/node_modules/json-bigint/README.md b/node/node_modules/json-bigint/README.md new file mode 100644 index 0000000..e7335c7 --- /dev/null +++ b/node/node_modules/json-bigint/README.md @@ -0,0 +1,240 @@ +# json-bigint + +[![Build Status](https://secure.travis-ci.org/sidorares/json-bigint.png)](http://travis-ci.org/sidorares/json-bigint) +[![NPM](https://nodei.co/npm/json-bigint.png?downloads=true&stars=true)](https://nodei.co/npm/json-bigint/) + +JSON.parse/stringify with bigints support. Based on Douglas Crockford [JSON.js](https://github.com/douglascrockford/JSON-js) package and [bignumber.js](https://github.com/MikeMcl/bignumber.js) library. + +Native `Bigint` was added to JS recently, so we added an option to leverage it instead of `bignumber.js`. However, the parsing with native `BigInt` is kept an option for backward compability. + +While most JSON parsers assume numeric values have same precision restrictions as IEEE 754 double, JSON specification _does not_ say anything about number precision. Any floating point number in decimal (optionally scientific) notation is valid JSON value. It's a good idea to serialize values which might fall out of IEEE 754 integer precision as strings in your JSON api, but `{ "value" : 9223372036854775807}`, for example, is still a valid RFC4627 JSON string, and in most JS runtimes the result of `JSON.parse` is this object: `{ value: 9223372036854776000 }` + +========== + +example: + +```js +var JSONbig = require('json-bigint'); + +var json = '{ "value" : 9223372036854775807, "v2": 123 }'; +console.log('Input:', json); +console.log(''); + +console.log('node.js built-in JSON:'); +var r = JSON.parse(json); +console.log('JSON.parse(input).value : ', r.value.toString()); +console.log('JSON.stringify(JSON.parse(input)):', JSON.stringify(r)); + +console.log('\n\nbig number JSON:'); +var r1 = JSONbig.parse(json); +console.log('JSONbig.parse(input).value : ', r1.value.toString()); +console.log('JSONbig.stringify(JSONbig.parse(input)):', JSONbig.stringify(r1)); +``` + +Output: + +``` +Input: { "value" : 9223372036854775807, "v2": 123 } + +node.js built-in JSON: +JSON.parse(input).value : 9223372036854776000 +JSON.stringify(JSON.parse(input)): {"value":9223372036854776000,"v2":123} + + +big number JSON: +JSONbig.parse(input).value : 9223372036854775807 +JSONbig.stringify(JSONbig.parse(input)): {"value":9223372036854775807,"v2":123} +``` + +### Options + +The behaviour of the parser is somewhat configurable through 'options' + +#### options.strict, boolean, default false + +Specifies the parsing should be "strict" towards reporting duplicate-keys in the parsed string. +The default follows what is allowed in standard json and resembles the behavior of JSON.parse, but overwrites any previous values with the last one assigned to the duplicate-key. + +Setting options.strict = true will fail-fast on such duplicate-key occurances and thus warn you upfront of possible lost information. + +example: + +```js +var JSONbig = require('json-bigint'); +var JSONstrict = require('json-bigint')({ strict: true }); + +var dupkeys = '{ "dupkey": "value 1", "dupkey": "value 2"}'; +console.log('\n\nDuplicate Key test with both lenient and strict JSON parsing'); +console.log('Input:', dupkeys); +var works = JSONbig.parse(dupkeys); +console.log('JSON.parse(dupkeys).dupkey: %s', works.dupkey); +var fails = 'will stay like this'; +try { + fails = JSONstrict.parse(dupkeys); + console.log('ERROR!! Should never get here'); +} catch (e) { + console.log( + 'Succesfully catched expected exception on duplicate keys: %j', + e + ); +} +``` + +Output + +``` +Duplicate Key test with big number JSON +Input: { "dupkey": "value 1", "dupkey": "value 2"} +JSON.parse(dupkeys).dupkey: value 2 +Succesfully catched expected exception on duplicate keys: {"name":"SyntaxError","message":"Duplicate key \"dupkey\"","at":33,"text":"{ \"dupkey\": \"value 1\", \"dupkey\": \"value 2\"}"} + +``` + +#### options.storeAsString, boolean, default false + +Specifies if BigInts should be stored in the object as a string, rather than the default BigNumber. + +Note that this is a dangerous behavior as it breaks the default functionality of being able to convert back-and-forth without data type changes (as this will convert all BigInts to be-and-stay strings). + +example: + +```js +var JSONbig = require('json-bigint'); +var JSONbigString = require('json-bigint')({ storeAsString: true }); +var key = '{ "key": 1234567890123456789 }'; +console.log('\n\nStoring the BigInt as a string, instead of a BigNumber'); +console.log('Input:', key); +var withInt = JSONbig.parse(key); +var withString = JSONbigString.parse(key); +console.log( + 'Default type: %s, With option type: %s', + typeof withInt.key, + typeof withString.key +); +``` + +Output + +``` +Storing the BigInt as a string, instead of a BigNumber +Input: { "key": 1234567890123456789 } +Default type: object, With option type: string + +``` + +#### options.useNativeBigInt, boolean, default false + +Specifies if parser uses native BigInt instead of bignumber.js + +example: + +```js +var JSONbig = require('json-bigint'); +var JSONbigNative = require('json-bigint')({ useNativeBigInt: true }); +var key = '{ "key": 993143214321423154315154321 }'; +console.log(`\n\nStoring the Number as native BigInt, instead of a BigNumber`); +console.log('Input:', key); +var normal = JSONbig.parse(key); +var nativeBigInt = JSONbigNative.parse(key); +console.log( + 'Default type: %s, With option type: %s', + typeof normal.key, + typeof nativeBigInt.key +); +``` + +Output + +``` +Storing the Number as native BigInt, instead of a BigNumber +Input: { "key": 993143214321423154315154321 } +Default type: object, With option type: bigint + +``` + +#### options.alwaysParseAsBig, boolean, default false + +Specifies if all numbers should be stored as BigNumber. + +Note that this is a dangerous behavior as it breaks the default functionality of being able to convert back-and-forth without data type changes (as this will convert all Number to be-and-stay BigNumber) + +example: + +```js +var JSONbig = require('json-bigint'); +var JSONbigAlways = require('json-bigint')({ alwaysParseAsBig: true }); +var key = '{ "key": 123 }'; // there is no need for BigNumber by default, but we're forcing it +console.log(`\n\nStoring the Number as a BigNumber, instead of a Number`); +console.log('Input:', key); +var normal = JSONbig.parse(key); +var always = JSONbigAlways.parse(key); +console.log( + 'Default type: %s, With option type: %s', + typeof normal.key, + typeof always.key +); +``` + +Output + +``` +Storing the Number as a BigNumber, instead of a Number +Input: { "key": 123 } +Default type: number, With option type: object + +``` + +If you want to force all numbers to be parsed as native `BigInt` +(you probably do! Otherwise any calulations become a real headache): + +```js +var JSONbig = require('json-bigint')({ + alwaysParseAsBig: true, + useNativeBigInt: true, +}); +``` + +#### options.protoAction, boolean, default: "error". Possible values: "error", "ignore", "preserve" + +#### options.constructorAction, boolean, default: "error". Possible values: "error", "ignore", "preserve" + +Controls how `__proto__` and `constructor` properties are treated. If set to "error" they are not allowed and +parse() call will throw an error. If set to "ignore" the prroperty and it;s value is skipped from parsing and object building. +If set to "preserve" the `__proto__` property is set. One should be extra careful and make sure any other library consuming generated data +is not vulnerable to prototype poisoning attacks. + +example: + +```js +var JSONbigAlways = require('json-bigint')({ protoAction: 'ignore' }); +const user = JSONbig.parse('{ "__proto__": { "admin": true }, "id": 12345 }'); +// => result is { id: 12345 } +``` + +### Links: + +- [RFC4627: The application/json Media Type for JavaScript Object Notation (JSON)](http://www.ietf.org/rfc/rfc4627.txt) +- [Re: \[Json\] Limitations on number size?](http://www.ietf.org/mail-archive/web/json/current/msg00297.html) +- [Is there any proper way to parse JSON with large numbers? (long, bigint, int64)](http://stackoverflow.com/questions/18755125/node-js-is-there-any-proper-way-to-parse-json-with-large-numbers-long-bigint) +- [What is JavaScript's Max Int? What's the highest Integer value a Number can go to without losing precision?](http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest-integer-value-a-number-can-go-t) +- [Large numbers erroneously rounded in Javascript](http://stackoverflow.com/questions/1379934/large-numbers-erroneously-rounded-in-javascript) + +### Note on native BigInt support + +#### Stringifying + +Full support out-of-the-box, stringifies BigInts as pure numbers (no quotes, no `n`) + +#### Limitations + +- Roundtrip operations + +`s === JSONbig.stringify(JSONbig.parse(s))` but + +`o !== JSONbig.parse(JSONbig.stringify(o))` + +when `o` has a value with something like `123n`. + +`JSONbig` stringify `123n` as `123`, which becomes `number` (aka `123` not `123n`) by default when being reparsed. + +There is currently no consistent way to deal with this issue, so we decided to leave it, handling this specific case is then up to users. diff --git a/node/node_modules/json-bigint/index.js b/node/node_modules/json-bigint/index.js new file mode 100644 index 0000000..4757600 --- /dev/null +++ b/node/node_modules/json-bigint/index.js @@ -0,0 +1,12 @@ +var json_stringify = require('./lib/stringify.js').stringify; +var json_parse = require('./lib/parse.js'); + +module.exports = function(options) { + return { + parse: json_parse(options), + stringify: json_stringify + } +}; +//create the default method members with no options applied for backwards compatibility +module.exports.parse = json_parse(); +module.exports.stringify = json_stringify; diff --git a/node/node_modules/json-bigint/lib/parse.js b/node/node_modules/json-bigint/lib/parse.js new file mode 100644 index 0000000..bb4e5eb --- /dev/null +++ b/node/node_modules/json-bigint/lib/parse.js @@ -0,0 +1,443 @@ +var BigNumber = null; + +// regexpxs extracted from +// (c) BSD-3-Clause +// https://github.com/fastify/secure-json-parse/graphs/contributors and https://github.com/hapijs/bourne/graphs/contributors + +const suspectProtoRx = /(?:_|\\u005[Ff])(?:_|\\u005[Ff])(?:p|\\u0070)(?:r|\\u0072)(?:o|\\u006[Ff])(?:t|\\u0074)(?:o|\\u006[Ff])(?:_|\\u005[Ff])(?:_|\\u005[Ff])/; +const suspectConstructorRx = /(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)/; + +/* + json_parse.js + 2012-06-20 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + This file creates a json_parse function. + During create you can (optionally) specify some behavioural switches + + require('json-bigint')(options) + + The optional options parameter holds switches that drive certain + aspects of the parsing process: + * options.strict = true will warn about duplicate-key usage in the json. + The default (strict = false) will silently ignore those and overwrite + values for keys that are in duplicate use. + + The resulting function follows this signature: + json_parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = json_parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + This is a reference implementation. You are free to copy, modify, or + redistribute. + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. +*/ + +/*members "", "\"", "\/", "\\", at, b, call, charAt, f, fromCharCode, + hasOwnProperty, message, n, name, prototype, push, r, t, text +*/ + +var json_parse = function (options) { + 'use strict'; + + // This is a function that can parse a JSON text, producing a JavaScript + // data structure. It is a simple, recursive descent parser. It does not use + // eval or regular expressions, so it can be used as a model for implementing + // a JSON parser in other languages. + + // We are defining the function inside of another function to avoid creating + // global variables. + + // Default options one can override by passing options to the parse() + var _options = { + strict: false, // not being strict means do not generate syntax errors for "duplicate key" + storeAsString: false, // toggles whether the values should be stored as BigNumber (default) or a string + alwaysParseAsBig: false, // toggles whether all numbers should be Big + useNativeBigInt: false, // toggles whether to use native BigInt instead of bignumber.js + protoAction: 'error', + constructorAction: 'error', + }; + + // If there are options, then use them to override the default _options + if (options !== undefined && options !== null) { + if (options.strict === true) { + _options.strict = true; + } + if (options.storeAsString === true) { + _options.storeAsString = true; + } + _options.alwaysParseAsBig = + options.alwaysParseAsBig === true ? options.alwaysParseAsBig : false; + _options.useNativeBigInt = + options.useNativeBigInt === true ? options.useNativeBigInt : false; + + if (typeof options.constructorAction !== 'undefined') { + if ( + options.constructorAction === 'error' || + options.constructorAction === 'ignore' || + options.constructorAction === 'preserve' + ) { + _options.constructorAction = options.constructorAction; + } else { + throw new Error( + `Incorrect value for constructorAction option, must be "error", "ignore" or undefined but passed ${options.constructorAction}` + ); + } + } + + if (typeof options.protoAction !== 'undefined') { + if ( + options.protoAction === 'error' || + options.protoAction === 'ignore' || + options.protoAction === 'preserve' + ) { + _options.protoAction = options.protoAction; + } else { + throw new Error( + `Incorrect value for protoAction option, must be "error", "ignore" or undefined but passed ${options.protoAction}` + ); + } + } + } + + var at, // The index of the current character + ch, // The current character + escapee = { + '"': '"', + '\\': '\\', + '/': '/', + b: '\b', + f: '\f', + n: '\n', + r: '\r', + t: '\t', + }, + text, + error = function (m) { + // Call error when something is wrong. + + throw { + name: 'SyntaxError', + message: m, + at: at, + text: text, + }; + }, + next = function (c) { + // If a c parameter is provided, verify that it matches the current character. + + if (c && c !== ch) { + error("Expected '" + c + "' instead of '" + ch + "'"); + } + + // Get the next character. When there are no more characters, + // return the empty string. + + ch = text.charAt(at); + at += 1; + return ch; + }, + number = function () { + // Parse a number value. + + var number, + string = ''; + + if (ch === '-') { + string = '-'; + next('-'); + } + while (ch >= '0' && ch <= '9') { + string += ch; + next(); + } + if (ch === '.') { + string += '.'; + while (next() && ch >= '0' && ch <= '9') { + string += ch; + } + } + if (ch === 'e' || ch === 'E') { + string += ch; + next(); + if (ch === '-' || ch === '+') { + string += ch; + next(); + } + while (ch >= '0' && ch <= '9') { + string += ch; + next(); + } + } + number = +string; + if (!isFinite(number)) { + error('Bad number'); + } else { + if (BigNumber == null) BigNumber = require('bignumber.js'); + //if (number > 9007199254740992 || number < -9007199254740992) + // Bignumber has stricter check: everything with length > 15 digits disallowed + if (string.length > 15) + return _options.storeAsString + ? string + : _options.useNativeBigInt + ? BigInt(string) + : new BigNumber(string); + else + return !_options.alwaysParseAsBig + ? number + : _options.useNativeBigInt + ? BigInt(number) + : new BigNumber(number); + } + }, + string = function () { + // Parse a string value. + + var hex, + i, + string = '', + uffff; + + // When parsing for string values, we must look for " and \ characters. + + if (ch === '"') { + var startAt = at; + while (next()) { + if (ch === '"') { + if (at - 1 > startAt) string += text.substring(startAt, at - 1); + next(); + return string; + } + if (ch === '\\') { + if (at - 1 > startAt) string += text.substring(startAt, at - 1); + next(); + if (ch === 'u') { + uffff = 0; + for (i = 0; i < 4; i += 1) { + hex = parseInt(next(), 16); + if (!isFinite(hex)) { + break; + } + uffff = uffff * 16 + hex; + } + string += String.fromCharCode(uffff); + } else if (typeof escapee[ch] === 'string') { + string += escapee[ch]; + } else { + break; + } + startAt = at; + } + } + } + error('Bad string'); + }, + white = function () { + // Skip whitespace. + + while (ch && ch <= ' ') { + next(); + } + }, + word = function () { + // true, false, or null. + + switch (ch) { + case 't': + next('t'); + next('r'); + next('u'); + next('e'); + return true; + case 'f': + next('f'); + next('a'); + next('l'); + next('s'); + next('e'); + return false; + case 'n': + next('n'); + next('u'); + next('l'); + next('l'); + return null; + } + error("Unexpected '" + ch + "'"); + }, + value, // Place holder for the value function. + array = function () { + // Parse an array value. + + var array = []; + + if (ch === '[') { + next('['); + white(); + if (ch === ']') { + next(']'); + return array; // empty array + } + while (ch) { + array.push(value()); + white(); + if (ch === ']') { + next(']'); + return array; + } + next(','); + white(); + } + } + error('Bad array'); + }, + object = function () { + // Parse an object value. + + var key, + object = Object.create(null); + + if (ch === '{') { + next('{'); + white(); + if (ch === '}') { + next('}'); + return object; // empty object + } + while (ch) { + key = string(); + white(); + next(':'); + if ( + _options.strict === true && + Object.hasOwnProperty.call(object, key) + ) { + error('Duplicate key "' + key + '"'); + } + + if (suspectProtoRx.test(key) === true) { + if (_options.protoAction === 'error') { + error('Object contains forbidden prototype property'); + } else if (_options.protoAction === 'ignore') { + value(); + } else { + object[key] = value(); + } + } else if (suspectConstructorRx.test(key) === true) { + if (_options.constructorAction === 'error') { + error('Object contains forbidden constructor property'); + } else if (_options.constructorAction === 'ignore') { + value(); + } else { + object[key] = value(); + } + } else { + object[key] = value(); + } + + white(); + if (ch === '}') { + next('}'); + return object; + } + next(','); + white(); + } + } + error('Bad object'); + }; + + value = function () { + // Parse a JSON value. It could be an object, an array, a string, a number, + // or a word. + + white(); + switch (ch) { + case '{': + return object(); + case '[': + return array(); + case '"': + return string(); + case '-': + return number(); + default: + return ch >= '0' && ch <= '9' ? number() : word(); + } + }; + + // Return the json_parse function. It will have access to all of the above + // functions and variables. + + return function (source, reviver) { + var result; + + text = source + ''; + at = 0; + ch = ' '; + result = value(); + white(); + if (ch) { + error('Syntax error'); + } + + // If there is a reviver function, we recursively walk the new structure, + // passing each name/value pair to the reviver function for possible + // transformation, starting with a temporary root object that holds the result + // in an empty key. If there is not a reviver function, we simply return the + // result. + + return typeof reviver === 'function' + ? (function walk(holder, key) { + var k, + v, + value = holder[key]; + if (value && typeof value === 'object') { + Object.keys(value).forEach(function (k) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + }); + } + return reviver.call(holder, key, value); + })({ '': result }, '') + : result; + }; +}; + +module.exports = json_parse; diff --git a/node/node_modules/json-bigint/lib/stringify.js b/node/node_modules/json-bigint/lib/stringify.js new file mode 100644 index 0000000..3bd5269 --- /dev/null +++ b/node/node_modules/json-bigint/lib/stringify.js @@ -0,0 +1,384 @@ +var BigNumber = require('bignumber.js'); + +/* + json2.js + 2013-05-26 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. + + + This file creates a global JSON object containing two methods: stringify + and parse. + + JSON.stringify(value, replacer, space) + value any JavaScript value, usually an object or array. + + replacer an optional parameter that determines how object + values are stringified for objects. It can be a + function or an array of strings. + + space an optional parameter that specifies the indentation + of nested structures. If it is omitted, the text will + be packed without extra whitespace. If it is a number, + it will specify the number of spaces to indent at each + level. If it is a string (such as '\t' or ' '), + it contains the characters used to indent at each level. + + This method produces a JSON text from a JavaScript value. + + When an object value is found, if the object contains a toJSON + method, its toJSON method will be called and the result will be + stringified. A toJSON method does not serialize: it returns the + value represented by the name/value pair that should be serialized, + or undefined if nothing should be serialized. The toJSON method + will be passed the key associated with the value, and this will be + bound to the value + + For example, this would serialize Dates as ISO strings. + + Date.prototype.toJSON = function (key) { + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + You can provide an optional replacer method. It will be passed the + key and value of each member, with this bound to the containing + object. The value that is returned from your method will be + serialized. If your method returns undefined, then the member will + be excluded from the serialization. + + If the replacer parameter is an array of strings, then it will be + used to select the members to be serialized. It filters the results + such that only members with keys listed in the replacer array are + stringified. + + Values that do not have JSON representations, such as undefined or + functions, will not be serialized. Such values in objects will be + dropped; in arrays they will be replaced with null. You can use + a replacer function to replace those with JSON values. + JSON.stringify(undefined) returns undefined. + + The optional space parameter produces a stringification of the + value that is filled with line breaks and indentation to make it + easier to read. + + If the space parameter is a non-empty string, then that string will + be used for indentation. If the space parameter is a number, then + the indentation will be that many spaces. + + Example: + + text = JSON.stringify(['e', {pluribus: 'unum'}]); + // text is '["e",{"pluribus":"unum"}]' + + + text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); + // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + + text = JSON.stringify([new Date()], function (key, value) { + return this[key] instanceof Date ? + 'Date(' + this[key] + ')' : value; + }); + // text is '["Date(---current time---)"]' + + + JSON.parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = JSON.parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { + var d; + if (typeof value === 'string' && + value.slice(0, 5) === 'Date(' && + value.slice(-1) === ')') { + d = new Date(value.slice(5, -1)); + if (d) { + return d; + } + } + return value; + }); + + + This is a reference implementation. You are free to copy, modify, or + redistribute. +*/ + +/*jslint evil: true, regexp: true */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, + call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, + getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, + lastIndex, length, parse, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +var JSON = module.exports; + +(function () { + 'use strict'; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' + ? c + : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key], + isBigNumber = value != null && (value instanceof BigNumber || BigNumber.isBigNumber(value)); + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + if (isBigNumber) { + return value; + } else { + return quote(value); + } + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + case 'bigint': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 + ? '[]' + : gap + ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' + : '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + Object.keys(value).forEach(function(k) { + var v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + }); + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 + ? '{}' + : gap + ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' + : '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== 'function') { + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + } +}()); diff --git a/node/node_modules/json-bigint/package.json b/node/node_modules/json-bigint/package.json new file mode 100644 index 0000000..9309f6b --- /dev/null +++ b/node/node_modules/json-bigint/package.json @@ -0,0 +1,34 @@ +{ + "name": "json-bigint", + "version": "1.0.0", + "description": "JSON.parse with bigints support", + "main": "index.js", + "files": [ + "index.js", + "lib/parse.js", + "lib/stringify.js" + ], + "scripts": { + "test": "./node_modules/mocha/bin/mocha -R spec --check-leaks test/*-test.js" + }, + "repository": { + "type": "git", + "url": "git@github.com:sidorares/json-bigint.git" + }, + "keywords": [ + "JSON", + "bigint", + "bignumber", + "parse", + "json" + ], + "author": "Andrey Sidorov ", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + }, + "devDependencies": { + "chai": "4.2.0", + "mocha": "8.0.1" + } +} diff --git a/node/node_modules/node-fetch/LICENSE.md b/node/node_modules/node-fetch/LICENSE.md new file mode 100644 index 0000000..660ffec --- /dev/null +++ b/node/node_modules/node-fetch/LICENSE.md @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2016 David Frank + +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. + diff --git a/node/node_modules/node-fetch/README.md b/node/node_modules/node-fetch/README.md new file mode 100644 index 0000000..55f09b7 --- /dev/null +++ b/node/node_modules/node-fetch/README.md @@ -0,0 +1,634 @@ +node-fetch +========== + +[![npm version][npm-image]][npm-url] +[![build status][travis-image]][travis-url] +[![coverage status][codecov-image]][codecov-url] +[![install size][install-size-image]][install-size-url] +[![Discord][discord-image]][discord-url] + +A light-weight module that brings `window.fetch` to Node.js + +(We are looking for [v2 maintainers and collaborators](https://github.com/bitinn/node-fetch/issues/567)) + +[![Backers][opencollective-image]][opencollective-url] + + + +- [Motivation](#motivation) +- [Features](#features) +- [Difference from client-side fetch](#difference-from-client-side-fetch) +- [Installation](#installation) +- [Loading and configuring the module](#loading-and-configuring-the-module) +- [Common Usage](#common-usage) + - [Plain text or HTML](#plain-text-or-html) + - [JSON](#json) + - [Simple Post](#simple-post) + - [Post with JSON](#post-with-json) + - [Post with form parameters](#post-with-form-parameters) + - [Handling exceptions](#handling-exceptions) + - [Handling client and server errors](#handling-client-and-server-errors) +- [Advanced Usage](#advanced-usage) + - [Streams](#streams) + - [Buffer](#buffer) + - [Accessing Headers and other Meta data](#accessing-headers-and-other-meta-data) + - [Extract Set-Cookie Header](#extract-set-cookie-header) + - [Post data using a file stream](#post-data-using-a-file-stream) + - [Post with form-data (detect multipart)](#post-with-form-data-detect-multipart) + - [Request cancellation with AbortSignal](#request-cancellation-with-abortsignal) +- [API](#api) + - [fetch(url[, options])](#fetchurl-options) + - [Options](#options) + - [Class: Request](#class-request) + - [Class: Response](#class-response) + - [Class: Headers](#class-headers) + - [Interface: Body](#interface-body) + - [Class: FetchError](#class-fetcherror) +- [License](#license) +- [Acknowledgement](#acknowledgement) + + + +## Motivation + +Instead of implementing `XMLHttpRequest` in Node.js to run browser-specific [Fetch polyfill](https://github.com/github/fetch), why not go from native `http` to `fetch` API directly? Hence, `node-fetch`, minimal code for a `window.fetch` compatible API on Node.js runtime. + +See Matt Andrews' [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch) or Leonardo Quixada's [cross-fetch](https://github.com/lquixada/cross-fetch) for isomorphic usage (exports `node-fetch` for server-side, `whatwg-fetch` for client-side). + +## Features + +- Stay consistent with `window.fetch` API. +- Make conscious trade-off when following [WHATWG fetch spec][whatwg-fetch] and [stream spec](https://streams.spec.whatwg.org/) implementation details, document known differences. +- Use native promise but allow substituting it with [insert your favorite promise library]. +- Use native Node streams for body on both request and response. +- Decode content encoding (gzip/deflate) properly and convert string output (such as `res.text()` and `res.json()`) to UTF-8 automatically. +- Useful extensions such as timeout, redirect limit, response size limit, [explicit errors](ERROR-HANDLING.md) for troubleshooting. + +## Difference from client-side fetch + +- See [Known Differences](LIMITS.md) for details. +- If you happen to use a missing feature that `window.fetch` offers, feel free to open an issue. +- Pull requests are welcomed too! + +## Installation + +Current stable release (`2.x`) + +```sh +$ npm install node-fetch +``` + +## Loading and configuring the module +We suggest you load the module via `require` until the stabilization of ES modules in node: +```js +const fetch = require('node-fetch'); +``` + +If you are using a Promise library other than native, set it through `fetch.Promise`: +```js +const Bluebird = require('bluebird'); + +fetch.Promise = Bluebird; +``` + +## Common Usage + +NOTE: The documentation below is up-to-date with `2.x` releases; see the [`1.x` readme](https://github.com/bitinn/node-fetch/blob/1.x/README.md), [changelog](https://github.com/bitinn/node-fetch/blob/1.x/CHANGELOG.md) and [2.x upgrade guide](UPGRADE-GUIDE.md) for the differences. + +#### Plain text or HTML +```js +fetch('https://github.com/') + .then(res => res.text()) + .then(body => console.log(body)); +``` + +#### JSON + +```js + +fetch('https://api.github.com/users/github') + .then(res => res.json()) + .then(json => console.log(json)); +``` + +#### Simple Post +```js +fetch('https://httpbin.org/post', { method: 'POST', body: 'a=1' }) + .then(res => res.json()) // expecting a json response + .then(json => console.log(json)); +``` + +#### Post with JSON + +```js +const body = { a: 1 }; + +fetch('https://httpbin.org/post', { + method: 'post', + body: JSON.stringify(body), + headers: { 'Content-Type': 'application/json' }, + }) + .then(res => res.json()) + .then(json => console.log(json)); +``` + +#### Post with form parameters +`URLSearchParams` is available in Node.js as of v7.5.0. See [official documentation](https://nodejs.org/api/url.html#url_class_urlsearchparams) for more usage methods. + +NOTE: The `Content-Type` header is only set automatically to `x-www-form-urlencoded` when an instance of `URLSearchParams` is given as such: + +```js +const { URLSearchParams } = require('url'); + +const params = new URLSearchParams(); +params.append('a', 1); + +fetch('https://httpbin.org/post', { method: 'POST', body: params }) + .then(res => res.json()) + .then(json => console.log(json)); +``` + +#### Handling exceptions +NOTE: 3xx-5xx responses are *NOT* exceptions and should be handled in `then()`; see the next section for more information. + +Adding a catch to the fetch promise chain will catch *all* exceptions, such as errors originating from node core libraries, network errors and operational errors, which are instances of FetchError. See the [error handling document](ERROR-HANDLING.md) for more details. + +```js +fetch('https://domain.invalid/') + .catch(err => console.error(err)); +``` + +#### Handling client and server errors +It is common to create a helper function to check that the response contains no client (4xx) or server (5xx) error responses: + +```js +function checkStatus(res) { + if (res.ok) { // res.status >= 200 && res.status < 300 + return res; + } else { + throw MyCustomError(res.statusText); + } +} + +fetch('https://httpbin.org/status/400') + .then(checkStatus) + .then(res => console.log('will not get here...')) +``` + +## Advanced Usage + +#### Streams +The "Node.js way" is to use streams when possible: + +```js +fetch('https://assets-cdn.github.com/images/modules/logos_page/Octocat.png') + .then(res => { + const dest = fs.createWriteStream('./octocat.png'); + res.body.pipe(dest); + }); +``` + +In Node.js 14 you can also use async iterators to read `body`; however, be careful to catch +errors -- the longer a response runs, the more likely it is to encounter an error. + +```js +const fetch = require('node-fetch'); +const response = await fetch('https://httpbin.org/stream/3'); +try { + for await (const chunk of response.body) { + console.dir(JSON.parse(chunk.toString())); + } +} catch (err) { + console.error(err.stack); +} +``` + +In Node.js 12 you can also use async iterators to read `body`; however, async iterators with streams +did not mature until Node.js 14, so you need to do some extra work to ensure you handle errors +directly from the stream and wait on it response to fully close. + +```js +const fetch = require('node-fetch'); +const read = async body => { + let error; + body.on('error', err => { + error = err; + }); + for await (const chunk of body) { + console.dir(JSON.parse(chunk.toString())); + } + return new Promise((resolve, reject) => { + body.on('close', () => { + error ? reject(error) : resolve(); + }); + }); +}; +try { + const response = await fetch('https://httpbin.org/stream/3'); + await read(response.body); +} catch (err) { + console.error(err.stack); +} +``` + +#### Buffer +If you prefer to cache binary data in full, use buffer(). (NOTE: `buffer()` is a `node-fetch`-only API) + +```js +const fileType = require('file-type'); + +fetch('https://assets-cdn.github.com/images/modules/logos_page/Octocat.png') + .then(res => res.buffer()) + .then(buffer => fileType(buffer)) + .then(type => { /* ... */ }); +``` + +#### Accessing Headers and other Meta data +```js +fetch('https://github.com/') + .then(res => { + console.log(res.ok); + console.log(res.status); + console.log(res.statusText); + console.log(res.headers.raw()); + console.log(res.headers.get('content-type')); + }); +``` + +#### Extract Set-Cookie Header + +Unlike browsers, you can access raw `Set-Cookie` headers manually using `Headers.raw()`. This is a `node-fetch` only API. + +```js +fetch(url).then(res => { + // returns an array of values, instead of a string of comma-separated values + console.log(res.headers.raw()['set-cookie']); +}); +``` + +#### Post data using a file stream + +```js +const { createReadStream } = require('fs'); + +const stream = createReadStream('input.txt'); + +fetch('https://httpbin.org/post', { method: 'POST', body: stream }) + .then(res => res.json()) + .then(json => console.log(json)); +``` + +#### Post with form-data (detect multipart) + +```js +const FormData = require('form-data'); + +const form = new FormData(); +form.append('a', 1); + +fetch('https://httpbin.org/post', { method: 'POST', body: form }) + .then(res => res.json()) + .then(json => console.log(json)); + +// OR, using custom headers +// NOTE: getHeaders() is non-standard API + +const form = new FormData(); +form.append('a', 1); + +const options = { + method: 'POST', + body: form, + headers: form.getHeaders() +} + +fetch('https://httpbin.org/post', options) + .then(res => res.json()) + .then(json => console.log(json)); +``` + +#### Request cancellation with AbortSignal + +> NOTE: You may cancel streamed requests only on Node >= v8.0.0 + +You may cancel requests with `AbortController`. A suggested implementation is [`abort-controller`](https://www.npmjs.com/package/abort-controller). + +An example of timing out a request after 150ms could be achieved as the following: + +```js +import AbortController from 'abort-controller'; + +const controller = new AbortController(); +const timeout = setTimeout( + () => { controller.abort(); }, + 150, +); + +fetch(url, { signal: controller.signal }) + .then(res => res.json()) + .then( + data => { + useData(data) + }, + err => { + if (err.name === 'AbortError') { + // request was aborted + } + }, + ) + .finally(() => { + clearTimeout(timeout); + }); +``` + +See [test cases](https://github.com/bitinn/node-fetch/blob/master/test/test.js) for more examples. + + +## API + +### fetch(url[, options]) + +- `url` A string representing the URL for fetching +- `options` [Options](#fetch-options) for the HTTP(S) request +- Returns: Promise<[Response](#class-response)> + +Perform an HTTP(S) fetch. + +`url` should be an absolute url, such as `https://example.com/`. A path-relative URL (`/file/under/root`) or protocol-relative URL (`//can-be-http-or-https.com/`) will result in a rejected `Promise`. + + +### Options + +The default values are shown after each option key. + +```js +{ + // These properties are part of the Fetch Standard + method: 'GET', + headers: {}, // request headers. format is the identical to that accepted by the Headers constructor (see below) + body: null, // request body. can be null, a string, a Buffer, a Blob, or a Node.js Readable stream + redirect: 'follow', // set to `manual` to extract redirect headers, `error` to reject redirect + signal: null, // pass an instance of AbortSignal to optionally abort requests + + // The following properties are node-fetch extensions + follow: 20, // maximum redirect count. 0 to not follow redirect + timeout: 0, // req/res timeout in ms, it resets on redirect. 0 to disable (OS limit applies). Signal is recommended instead. + compress: true, // support gzip/deflate content encoding. false to disable + size: 0, // maximum response body size in bytes. 0 to disable + agent: null // http(s).Agent instance or function that returns an instance (see below) +} +``` + +##### Default Headers + +If no values are set, the following request headers will be sent automatically: + +Header | Value +------------------- | -------------------------------------------------------- +`Accept-Encoding` | `gzip,deflate` _(when `options.compress === true`)_ +`Accept` | `*/*` +`Content-Length` | _(automatically calculated, if possible)_ +`Transfer-Encoding` | `chunked` _(when `req.body` is a stream)_ +`User-Agent` | `node-fetch/1.0 (+https://github.com/bitinn/node-fetch)` + +Note: when `body` is a `Stream`, `Content-Length` is not set automatically. + +##### Custom Agent + +The `agent` option allows you to specify networking related options which are out of the scope of Fetch, including and not limited to the following: + +- Support self-signed certificate +- Use only IPv4 or IPv6 +- Custom DNS Lookup + +See [`http.Agent`](https://nodejs.org/api/http.html#http_new_agent_options) for more information. + +If no agent is specified, the default agent provided by Node.js is used. Note that [this changed in Node.js 19](https://github.com/nodejs/node/blob/4267b92604ad78584244488e7f7508a690cb80d0/lib/_http_agent.js#L564) to have `keepalive` true by default. If you wish to enable `keepalive` in an earlier version of Node.js, you can override the agent as per the following code sample. + +In addition, the `agent` option accepts a function that returns `http`(s)`.Agent` instance given current [URL](https://nodejs.org/api/url.html), this is useful during a redirection chain across HTTP and HTTPS protocol. + +```js +const httpAgent = new http.Agent({ + keepAlive: true +}); +const httpsAgent = new https.Agent({ + keepAlive: true +}); + +const options = { + agent: function (_parsedURL) { + if (_parsedURL.protocol == 'http:') { + return httpAgent; + } else { + return httpsAgent; + } + } +} +``` + + +### Class: Request + +An HTTP(S) request containing information about URL, method, headers, and the body. This class implements the [Body](#iface-body) interface. + +Due to the nature of Node.js, the following properties are not implemented at this moment: + +- `type` +- `destination` +- `referrer` +- `referrerPolicy` +- `mode` +- `credentials` +- `cache` +- `integrity` +- `keepalive` + +The following node-fetch extension properties are provided: + +- `follow` +- `compress` +- `counter` +- `agent` + +See [options](#fetch-options) for exact meaning of these extensions. + +#### new Request(input[, options]) + +*(spec-compliant)* + +- `input` A string representing a URL, or another `Request` (which will be cloned) +- `options` [Options][#fetch-options] for the HTTP(S) request + +Constructs a new `Request` object. The constructor is identical to that in the [browser](https://developer.mozilla.org/en-US/docs/Web/API/Request/Request). + +In most cases, directly `fetch(url, options)` is simpler than creating a `Request` object. + + +### Class: Response + +An HTTP(S) response. This class implements the [Body](#iface-body) interface. + +The following properties are not implemented in node-fetch at this moment: + +- `Response.error()` +- `Response.redirect()` +- `type` +- `trailer` + +#### new Response([body[, options]]) + +*(spec-compliant)* + +- `body` A `String` or [`Readable` stream][node-readable] +- `options` A [`ResponseInit`][response-init] options dictionary + +Constructs a new `Response` object. The constructor is identical to that in the [browser](https://developer.mozilla.org/en-US/docs/Web/API/Response/Response). + +Because Node.js does not implement service workers (for which this class was designed), one rarely has to construct a `Response` directly. + +#### response.ok + +*(spec-compliant)* + +Convenience property representing if the request ended normally. Will evaluate to true if the response status was greater than or equal to 200 but smaller than 300. + +#### response.redirected + +*(spec-compliant)* + +Convenience property representing if the request has been redirected at least once. Will evaluate to true if the internal redirect counter is greater than 0. + + +### Class: Headers + +This class allows manipulating and iterating over a set of HTTP headers. All methods specified in the [Fetch Standard][whatwg-fetch] are implemented. + +#### new Headers([init]) + +*(spec-compliant)* + +- `init` Optional argument to pre-fill the `Headers` object + +Construct a new `Headers` object. `init` can be either `null`, a `Headers` object, an key-value map object or any iterable object. + +```js +// Example adapted from https://fetch.spec.whatwg.org/#example-headers-class + +const meta = { + 'Content-Type': 'text/xml', + 'Breaking-Bad': '<3' +}; +const headers = new Headers(meta); + +// The above is equivalent to +const meta = [ + [ 'Content-Type', 'text/xml' ], + [ 'Breaking-Bad', '<3' ] +]; +const headers = new Headers(meta); + +// You can in fact use any iterable objects, like a Map or even another Headers +const meta = new Map(); +meta.set('Content-Type', 'text/xml'); +meta.set('Breaking-Bad', '<3'); +const headers = new Headers(meta); +const copyOfHeaders = new Headers(headers); +``` + + +### Interface: Body + +`Body` is an abstract interface with methods that are applicable to both `Request` and `Response` classes. + +The following methods are not yet implemented in node-fetch at this moment: + +- `formData()` + +#### body.body + +*(deviation from spec)* + +* Node.js [`Readable` stream][node-readable] + +Data are encapsulated in the `Body` object. Note that while the [Fetch Standard][whatwg-fetch] requires the property to always be a WHATWG `ReadableStream`, in node-fetch it is a Node.js [`Readable` stream][node-readable]. + +#### body.bodyUsed + +*(spec-compliant)* + +* `Boolean` + +A boolean property for if this body has been consumed. Per the specs, a consumed body cannot be used again. + +#### body.arrayBuffer() +#### body.blob() +#### body.json() +#### body.text() + +*(spec-compliant)* + +* Returns: Promise + +Consume the body and return a promise that will resolve to one of these formats. + +#### body.buffer() + +*(node-fetch extension)* + +* Returns: Promise<Buffer> + +Consume the body and return a promise that will resolve to a Buffer. + +#### body.textConverted() + +*(node-fetch extension)* + +* Returns: Promise<String> + +Identical to `body.text()`, except instead of always converting to UTF-8, encoding sniffing will be performed and text converted to UTF-8 if possible. + +(This API requires an optional dependency of the npm package [encoding](https://www.npmjs.com/package/encoding), which you need to install manually. `webpack` users may see [a warning message](https://github.com/bitinn/node-fetch/issues/412#issuecomment-379007792) due to this optional dependency.) + + +### Class: FetchError + +*(node-fetch extension)* + +An operational error in the fetching process. See [ERROR-HANDLING.md][] for more info. + + +### Class: AbortError + +*(node-fetch extension)* + +An Error thrown when the request is aborted in response to an `AbortSignal`'s `abort` event. It has a `name` property of `AbortError`. See [ERROR-HANDLING.MD][] for more info. + +## Acknowledgement + +Thanks to [github/fetch](https://github.com/github/fetch) for providing a solid implementation reference. + +`node-fetch` v1 was maintained by [@bitinn](https://github.com/bitinn); v2 was maintained by [@TimothyGu](https://github.com/timothygu), [@bitinn](https://github.com/bitinn) and [@jimmywarting](https://github.com/jimmywarting); v2 readme is written by [@jkantr](https://github.com/jkantr). + +## License + +MIT + +[npm-image]: https://flat.badgen.net/npm/v/node-fetch +[npm-url]: https://www.npmjs.com/package/node-fetch +[travis-image]: https://flat.badgen.net/travis/bitinn/node-fetch +[travis-url]: https://travis-ci.org/bitinn/node-fetch +[codecov-image]: https://flat.badgen.net/codecov/c/github/bitinn/node-fetch/master +[codecov-url]: https://codecov.io/gh/bitinn/node-fetch +[install-size-image]: https://flat.badgen.net/packagephobia/install/node-fetch +[install-size-url]: https://packagephobia.now.sh/result?p=node-fetch +[discord-image]: https://img.shields.io/discord/619915844268326952?color=%237289DA&label=Discord&style=flat-square +[discord-url]: https://discord.gg/Zxbndcm +[opencollective-image]: https://opencollective.com/node-fetch/backers.svg +[opencollective-url]: https://opencollective.com/node-fetch +[whatwg-fetch]: https://fetch.spec.whatwg.org/ +[response-init]: https://fetch.spec.whatwg.org/#responseinit +[node-readable]: https://nodejs.org/api/stream.html#stream_readable_streams +[mdn-headers]: https://developer.mozilla.org/en-US/docs/Web/API/Headers +[LIMITS.md]: https://github.com/bitinn/node-fetch/blob/master/LIMITS.md +[ERROR-HANDLING.md]: https://github.com/bitinn/node-fetch/blob/master/ERROR-HANDLING.md +[UPGRADE-GUIDE.md]: https://github.com/bitinn/node-fetch/blob/master/UPGRADE-GUIDE.md diff --git a/node/node_modules/node-fetch/browser.js b/node/node_modules/node-fetch/browser.js new file mode 100644 index 0000000..ee86265 --- /dev/null +++ b/node/node_modules/node-fetch/browser.js @@ -0,0 +1,25 @@ +"use strict"; + +// ref: https://github.com/tc39/proposal-global +var getGlobal = function () { + // the only reliable means to get the global object is + // `Function('return this')()` + // However, this causes CSP violations in Chrome apps. + if (typeof self !== 'undefined') { return self; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + throw new Error('unable to locate global object'); +} + +var globalObject = getGlobal(); + +module.exports = exports = globalObject.fetch; + +// Needed for TypeScript and Webpack. +if (globalObject.fetch) { + exports.default = globalObject.fetch.bind(globalObject); +} + +exports.Headers = globalObject.Headers; +exports.Request = globalObject.Request; +exports.Response = globalObject.Response; diff --git a/node/node_modules/node-fetch/lib/index.es.js b/node/node_modules/node-fetch/lib/index.es.js new file mode 100644 index 0000000..aae9799 --- /dev/null +++ b/node/node_modules/node-fetch/lib/index.es.js @@ -0,0 +1,1777 @@ +process.emitWarning("The .es.js file is deprecated. Use .mjs instead."); + +import Stream from 'stream'; +import http from 'http'; +import Url from 'url'; +import whatwgUrl from 'whatwg-url'; +import https from 'https'; +import zlib from 'zlib'; + +// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js + +// fix for "Readable" isn't a named export issue +const Readable = Stream.Readable; + +const BUFFER = Symbol('buffer'); +const TYPE = Symbol('type'); + +class Blob { + constructor() { + this[TYPE] = ''; + + const blobParts = arguments[0]; + const options = arguments[1]; + + const buffers = []; + let size = 0; + + if (blobParts) { + const a = blobParts; + const length = Number(a.length); + for (let i = 0; i < length; i++) { + const element = a[i]; + let buffer; + if (element instanceof Buffer) { + buffer = element; + } else if (ArrayBuffer.isView(element)) { + buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); + } else if (element instanceof ArrayBuffer) { + buffer = Buffer.from(element); + } else if (element instanceof Blob) { + buffer = element[BUFFER]; + } else { + buffer = Buffer.from(typeof element === 'string' ? element : String(element)); + } + size += buffer.length; + buffers.push(buffer); + } + } + + this[BUFFER] = Buffer.concat(buffers); + + let type = options && options.type !== undefined && String(options.type).toLowerCase(); + if (type && !/[^\u0020-\u007E]/.test(type)) { + this[TYPE] = type; + } + } + get size() { + return this[BUFFER].length; + } + get type() { + return this[TYPE]; + } + text() { + return Promise.resolve(this[BUFFER].toString()); + } + arrayBuffer() { + const buf = this[BUFFER]; + const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + return Promise.resolve(ab); + } + stream() { + const readable = new Readable(); + readable._read = function () {}; + readable.push(this[BUFFER]); + readable.push(null); + return readable; + } + toString() { + return '[object Blob]'; + } + slice() { + const size = this.size; + + const start = arguments[0]; + const end = arguments[1]; + let relativeStart, relativeEnd; + if (start === undefined) { + relativeStart = 0; + } else if (start < 0) { + relativeStart = Math.max(size + start, 0); + } else { + relativeStart = Math.min(start, size); + } + if (end === undefined) { + relativeEnd = size; + } else if (end < 0) { + relativeEnd = Math.max(size + end, 0); + } else { + relativeEnd = Math.min(end, size); + } + const span = Math.max(relativeEnd - relativeStart, 0); + + const buffer = this[BUFFER]; + const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); + const blob = new Blob([], { type: arguments[2] }); + blob[BUFFER] = slicedBuffer; + return blob; + } +} + +Object.defineProperties(Blob.prototype, { + size: { enumerable: true }, + type: { enumerable: true }, + slice: { enumerable: true } +}); + +Object.defineProperty(Blob.prototype, Symbol.toStringTag, { + value: 'Blob', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * fetch-error.js + * + * FetchError interface for operational errors + */ + +/** + * Create FetchError instance + * + * @param String message Error message for human + * @param String type Error type for machine + * @param String systemError For Node.js system error + * @return FetchError + */ +function FetchError(message, type, systemError) { + Error.call(this, message); + + this.message = message; + this.type = type; + + // when err.type is `system`, err.code contains system error code + if (systemError) { + this.code = this.errno = systemError.code; + } + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +FetchError.prototype = Object.create(Error.prototype); +FetchError.prototype.constructor = FetchError; +FetchError.prototype.name = 'FetchError'; + +let convert; +try { + convert = require('encoding').convert; +} catch (e) {} + +const INTERNALS = Symbol('Body internals'); + +// fix an issue where "PassThrough" isn't a named export for node <10 +const PassThrough = Stream.PassThrough; + +/** + * Body mixin + * + * Ref: https://fetch.spec.whatwg.org/#body + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +function Body(body) { + var _this = this; + + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref$size = _ref.size; + + let size = _ref$size === undefined ? 0 : _ref$size; + var _ref$timeout = _ref.timeout; + let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; + + if (body == null) { + // body is undefined or null + body = null; + } else if (isURLSearchParams(body)) { + // body is a URLSearchParams + body = Buffer.from(body.toString()); + } else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { + // body is ArrayBuffer + body = Buffer.from(body); + } else if (ArrayBuffer.isView(body)) { + // body is ArrayBufferView + body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); + } else if (body instanceof Stream) ; else { + // none of the above + // coerce to string then buffer + body = Buffer.from(String(body)); + } + this[INTERNALS] = { + body, + disturbed: false, + error: null + }; + this.size = size; + this.timeout = timeout; + + if (body instanceof Stream) { + body.on('error', function (err) { + const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err); + _this[INTERNALS].error = error; + }); + } +} + +Body.prototype = { + get body() { + return this[INTERNALS].body; + }, + + get bodyUsed() { + return this[INTERNALS].disturbed; + }, + + /** + * Decode response as ArrayBuffer + * + * @return Promise + */ + arrayBuffer() { + return consumeBody.call(this).then(function (buf) { + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + }); + }, + + /** + * Return raw response as Blob + * + * @return Promise + */ + blob() { + let ct = this.headers && this.headers.get('content-type') || ''; + return consumeBody.call(this).then(function (buf) { + return Object.assign( + // Prevent copying + new Blob([], { + type: ct.toLowerCase() + }), { + [BUFFER]: buf + }); + }); + }, + + /** + * Decode response as json + * + * @return Promise + */ + json() { + var _this2 = this; + + return consumeBody.call(this).then(function (buffer) { + try { + return JSON.parse(buffer.toString()); + } catch (err) { + return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); + } + }); + }, + + /** + * Decode response as text + * + * @return Promise + */ + text() { + return consumeBody.call(this).then(function (buffer) { + return buffer.toString(); + }); + }, + + /** + * Decode response as buffer (non-spec api) + * + * @return Promise + */ + buffer() { + return consumeBody.call(this); + }, + + /** + * Decode response as text, while automatically detecting the encoding and + * trying to decode to UTF-8 (non-spec api) + * + * @return Promise + */ + textConverted() { + var _this3 = this; + + return consumeBody.call(this).then(function (buffer) { + return convertBody(buffer, _this3.headers); + }); + } +}; + +// In browsers, all properties are enumerable. +Object.defineProperties(Body.prototype, { + body: { enumerable: true }, + bodyUsed: { enumerable: true }, + arrayBuffer: { enumerable: true }, + blob: { enumerable: true }, + json: { enumerable: true }, + text: { enumerable: true } +}); + +Body.mixIn = function (proto) { + for (const name of Object.getOwnPropertyNames(Body.prototype)) { + // istanbul ignore else: future proof + if (!(name in proto)) { + const desc = Object.getOwnPropertyDescriptor(Body.prototype, name); + Object.defineProperty(proto, name, desc); + } + } +}; + +/** + * Consume and convert an entire Body to a Buffer. + * + * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body + * + * @return Promise + */ +function consumeBody() { + var _this4 = this; + + if (this[INTERNALS].disturbed) { + return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`)); + } + + this[INTERNALS].disturbed = true; + + if (this[INTERNALS].error) { + return Body.Promise.reject(this[INTERNALS].error); + } + + let body = this.body; + + // body is null + if (body === null) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is blob + if (isBlob(body)) { + body = body.stream(); + } + + // body is buffer + if (Buffer.isBuffer(body)) { + return Body.Promise.resolve(body); + } + + // istanbul ignore if: should never happen + if (!(body instanceof Stream)) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is stream + // get ready to actually consume the body + let accum = []; + let accumBytes = 0; + let abort = false; + + return new Body.Promise(function (resolve, reject) { + let resTimeout; + + // allow timeout on slow response body + if (_this4.timeout) { + resTimeout = setTimeout(function () { + abort = true; + reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout')); + }, _this4.timeout); + } + + // handle stream errors + body.on('error', function (err) { + if (err.name === 'AbortError') { + // if the request was aborted, reject with this Error + abort = true; + reject(err); + } else { + // other errors, such as incorrect content-encoding + reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + + body.on('data', function (chunk) { + if (abort || chunk === null) { + return; + } + + if (_this4.size && accumBytes + chunk.length > _this4.size) { + abort = true; + reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size')); + return; + } + + accumBytes += chunk.length; + accum.push(chunk); + }); + + body.on('end', function () { + if (abort) { + return; + } + + clearTimeout(resTimeout); + + try { + resolve(Buffer.concat(accum, accumBytes)); + } catch (err) { + // handle streams that have accumulated too much data (issue #414) + reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + }); +} + +/** + * Detect buffer encoding and convert to target encoding + * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding + * + * @param Buffer buffer Incoming buffer + * @param String encoding Target encoding + * @return String + */ +function convertBody(buffer, headers) { + if (typeof convert !== 'function') { + throw new Error('The package `encoding` must be installed to use the textConverted() function'); + } + + const ct = headers.get('content-type'); + let charset = 'utf-8'; + let res, str; + + // header + if (ct) { + res = /charset=([^;]*)/i.exec(ct); + } + + // no charset in content type, peek at response body for at most 1024 bytes + str = buffer.slice(0, 1024).toString(); + + // html5 + if (!res && str) { + res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined; + + this[MAP] = Object.create(null); + + if (init instanceof Headers) { + const rawHeaders = init.raw(); + const headerNames = Object.keys(rawHeaders); + + for (const headerName of headerNames) { + for (const value of rawHeaders[headerName]) { + this.append(headerName, value); + } + } + + return; + } + + // We don't worry about converting prop to ByteString here as append() + // will handle it. + if (init == null) ; else if (typeof init === 'object') { + const method = init[Symbol.iterator]; + if (method != null) { + if (typeof method !== 'function') { + throw new TypeError('Header pairs must be iterable'); + } + + // sequence> + // Note: per spec we have to first exhaust the lists then process them + const pairs = []; + for (const pair of init) { + if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') { + throw new TypeError('Each header pair must be iterable'); + } + pairs.push(Array.from(pair)); + } + + for (const pair of pairs) { + if (pair.length !== 2) { + throw new TypeError('Each header pair must be a name/value tuple'); + } + this.append(pair[0], pair[1]); + } + } else { + // record + for (const key of Object.keys(init)) { + const value = init[key]; + this.append(key, value); + } + } + } else { + throw new TypeError('Provided initializer must be an object'); + } + } + + /** + * Return combined header value given name + * + * @param String name Header name + * @return Mixed + */ + get(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key === undefined) { + return null; + } + + return this[MAP][key].join(', '); + } + + /** + * Iterate over all headers + * + * @param Function callback Executed for each item with parameters (value, name, thisArg) + * @param Boolean thisArg `this` context for callback function + * @return Void + */ + forEach(callback) { + let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; + + let pairs = getHeaders(this); + let i = 0; + while (i < pairs.length) { + var _pairs$i = pairs[i]; + const name = _pairs$i[0], + value = _pairs$i[1]; + + callback.call(thisArg, value, name, this); + pairs = getHeaders(this); + i++; + } + } + + /** + * Overwrite header values given name + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + set(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + this[MAP][key !== undefined ? key : name] = [value]; + } + + /** + * Append a value onto existing header + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + append(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + if (key !== undefined) { + this[MAP][key].push(value); + } else { + this[MAP][name] = [value]; + } + } + + /** + * Check for header name existence + * + * @param String name Header name + * @return Boolean + */ + has(name) { + name = `${name}`; + validateName(name); + return find(this[MAP], name) !== undefined; + } + + /** + * Delete all header values given name + * + * @param String name Header name + * @return Void + */ + delete(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key !== undefined) { + delete this[MAP][key]; + } + } + + /** + * Return raw headers (non-spec api) + * + * @return Object + */ + raw() { + return this[MAP]; + } + + /** + * Get an iterator on keys. + * + * @return Iterator + */ + keys() { + return createHeadersIterator(this, 'key'); + } + + /** + * Get an iterator on values. + * + * @return Iterator + */ + values() { + return createHeadersIterator(this, 'value'); + } + + /** + * Get an iterator on entries. + * + * This is the default iterator of the Headers object. + * + * @return Iterator + */ + [Symbol.iterator]() { + return createHeadersIterator(this, 'key+value'); + } +} +Headers.prototype.entries = Headers.prototype[Symbol.iterator]; + +Object.defineProperty(Headers.prototype, Symbol.toStringTag, { + value: 'Headers', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Headers.prototype, { + get: { enumerable: true }, + forEach: { enumerable: true }, + set: { enumerable: true }, + append: { enumerable: true }, + has: { enumerable: true }, + delete: { enumerable: true }, + keys: { enumerable: true }, + values: { enumerable: true }, + entries: { enumerable: true } +}); + +function getHeaders(headers) { + let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value'; + + const keys = Object.keys(headers[MAP]).sort(); + return keys.map(kind === 'key' ? function (k) { + return k.toLowerCase(); + } : kind === 'value' ? function (k) { + return headers[MAP][k].join(', '); + } : function (k) { + return [k.toLowerCase(), headers[MAP][k].join(', ')]; + }); +} + +const INTERNAL = Symbol('internal'); + +function createHeadersIterator(target, kind) { + const iterator = Object.create(HeadersIteratorPrototype); + iterator[INTERNAL] = { + target, + kind, + index: 0 + }; + return iterator; +} + +const HeadersIteratorPrototype = Object.setPrototypeOf({ + next() { + // istanbul ignore if + if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { + throw new TypeError('Value of `this` is not a HeadersIterator'); + } + + var _INTERNAL = this[INTERNAL]; + const target = _INTERNAL.target, + kind = _INTERNAL.kind, + index = _INTERNAL.index; + + const values = getHeaders(target, kind); + const len = values.length; + if (index >= len) { + return { + value: undefined, + done: true + }; + } + + this[INTERNAL].index = index + 1; + + return { + value: values[index], + done: false + }; + } +}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); + +Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { + value: 'HeadersIterator', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * Export the Headers object in a form that Node.js can consume. + * + * @param Headers headers + * @return Object + */ +function exportNodeCompatibleHeaders(headers) { + const obj = Object.assign({ __proto__: null }, headers[MAP]); + + // http.request() only supports string as Host header. This hack makes + // specifying custom Host header possible. + const hostHeaderKey = find(headers[MAP], 'Host'); + if (hostHeaderKey !== undefined) { + obj[hostHeaderKey] = obj[hostHeaderKey][0]; + } + + return obj; +} + +/** + * Create a Headers object from an object of headers, ignoring those that do + * not conform to HTTP grammar productions. + * + * @param Object obj Object of headers + * @return Headers + */ +function createHeadersLenient(obj) { + const headers = new Headers(); + for (const name of Object.keys(obj)) { + if (invalidTokenRegex.test(name)) { + continue; + } + if (Array.isArray(obj[name])) { + for (const val of obj[name]) { + if (invalidHeaderCharRegex.test(val)) { + continue; + } + if (headers[MAP][name] === undefined) { + headers[MAP][name] = [val]; + } else { + headers[MAP][name].push(val); + } + } + } else if (!invalidHeaderCharRegex.test(obj[name])) { + headers[MAP][name] = [obj[name]]; + } + } + return headers; +} + +const INTERNALS$1 = Symbol('Response internals'); + +// fix an issue where "STATUS_CODES" aren't a named export for node <10 +const STATUS_CODES = http.STATUS_CODES; + +/** + * Response class + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +class Response { + constructor() { + let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + Body.call(this, body, opts); + + const status = opts.status || 200; + const headers = new Headers(opts.headers); + + if (body != null && !headers.has('Content-Type')) { + const contentType = extractContentType(body); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + this[INTERNALS$1] = { + url: opts.url, + status, + statusText: opts.statusText || STATUS_CODES[status], + headers, + counter: opts.counter + }; + } + + get url() { + return this[INTERNALS$1].url || ''; + } + + get status() { + return this[INTERNALS$1].status; + } + + /** + * Convenience property representing if the request ended normally + */ + get ok() { + return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; + } + + get redirected() { + return this[INTERNALS$1].counter > 0; + } + + get statusText() { + return this[INTERNALS$1].statusText; + } + + get headers() { + return this[INTERNALS$1].headers; + } + + /** + * Clone this response + * + * @return Response + */ + clone() { + return new Response(clone(this), { + url: this.url, + status: this.status, + statusText: this.statusText, + headers: this.headers, + ok: this.ok, + redirected: this.redirected + }); + } +} + +Body.mixIn(Response.prototype); + +Object.defineProperties(Response.prototype, { + url: { enumerable: true }, + status: { enumerable: true }, + ok: { enumerable: true }, + redirected: { enumerable: true }, + statusText: { enumerable: true }, + headers: { enumerable: true }, + clone: { enumerable: true } +}); + +Object.defineProperty(Response.prototype, Symbol.toStringTag, { + value: 'Response', + writable: false, + enumerable: false, + configurable: true +}); + +const INTERNALS$2 = Symbol('Request internals'); +const URL = Url.URL || whatwgUrl.URL; + +// fix an issue where "format", "parse" aren't a named export for node <10 +const parse_url = Url.parse; +const format_url = Url.format; + +/** + * Wrapper around `new URL` to handle arbitrary URLs + * + * @param {string} urlStr + * @return {void} + */ +function parseURL(urlStr) { + /* + Check whether the URL is absolute or not + Scheme: https://tools.ietf.org/html/rfc3986#section-3.1 + Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3 + */ + if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) { + urlStr = new URL(urlStr).toString(); + } + + // Fallback to old implementation for arbitrary URLs + return parse_url(urlStr); +} + +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +/** + * Check if a value is an instance of Request. + * + * @param Mixed input + * @return Boolean + */ +function isRequest(input) { + return typeof input === 'object' && typeof input[INTERNALS$2] === 'object'; +} + +function isAbortSignal(signal) { + const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal); + return !!(proto && proto.constructor.name === 'AbortSignal'); +} + +/** + * Request class + * + * @param Mixed input Url or Request instance + * @param Object init Custom options + * @return Void + */ +class Request { + constructor(input) { + let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + let parsedURL; + + // normalize input + if (!isRequest(input)) { + if (input && input.href) { + // in order to support Node.js' Url objects; though WHATWG's URL objects + // will fall into this branch also (since their `toString()` will return + // `href` property anyway) + parsedURL = parseURL(input.href); + } else { + // coerce input to a string before attempting to parse + parsedURL = parseURL(`${input}`); + } + input = {}; + } else { + parsedURL = parseURL(input.url); + } + + let method = init.method || input.method || 'GET'; + method = method.toUpperCase(); + + if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) { + throw new TypeError('Request with GET/HEAD method cannot have body'); + } + + let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; + + Body.call(this, inputBody, { + timeout: init.timeout || input.timeout || 0, + size: init.size || input.size || 0 + }); + + const headers = new Headers(init.headers || input.headers || {}); + + if (inputBody != null && !headers.has('Content-Type')) { + const contentType = extractContentType(inputBody); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + let signal = isRequest(input) ? input.signal : null; + if ('signal' in init) signal = init.signal; + + if (signal != null && !isAbortSignal(signal)) { + throw new TypeError('Expected signal to be an instanceof AbortSignal'); + } + + this[INTERNALS$2] = { + method, + redirect: init.redirect || input.redirect || 'follow', + headers, + parsedURL, + signal + }; + + // node-fetch-only options + this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; + this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; + this.counter = init.counter || input.counter || 0; + this.agent = init.agent || input.agent; + } + + get method() { + return this[INTERNALS$2].method; + } + + get url() { + return format_url(this[INTERNALS$2].parsedURL); + } + + get headers() { + return this[INTERNALS$2].headers; + } + + get redirect() { + return this[INTERNALS$2].redirect; + } + + get signal() { + return this[INTERNALS$2].signal; + } + + /** + * Clone this request + * + * @return Request + */ + clone() { + return new Request(this); + } +} + +Body.mixIn(Request.prototype); + +Object.defineProperty(Request.prototype, Symbol.toStringTag, { + value: 'Request', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Request.prototype, { + method: { enumerable: true }, + url: { enumerable: true }, + headers: { enumerable: true }, + redirect: { enumerable: true }, + clone: { enumerable: true }, + signal: { enumerable: true } +}); + +/** + * Convert a Request to Node.js http request options. + * + * @param Request A Request instance + * @return Object The options object to be passed to http.request + */ +function getNodeRequestOptions(request) { + const parsedURL = request[INTERNALS$2].parsedURL; + const headers = new Headers(request[INTERNALS$2].headers); + + // fetch step 1.3 + if (!headers.has('Accept')) { + headers.set('Accept', '*/*'); + } + + // Basic fetch + if (!parsedURL.protocol || !parsedURL.hostname) { + throw new TypeError('Only absolute URLs are supported'); + } + + if (!/^https?:$/.test(parsedURL.protocol)) { + throw new TypeError('Only HTTP(S) protocols are supported'); + } + + if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) { + throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8'); + } + + // HTTP-network-or-cache fetch steps 2.4-2.7 + let contentLengthValue = null; + if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { + contentLengthValue = '0'; + } + if (request.body != null) { + const totalBytes = getTotalBytes(request); + if (typeof totalBytes === 'number') { + contentLengthValue = String(totalBytes); + } + } + if (contentLengthValue) { + headers.set('Content-Length', contentLengthValue); + } + + // HTTP-network-or-cache fetch step 2.11 + if (!headers.has('User-Agent')) { + headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); + } + + // HTTP-network-or-cache fetch step 2.15 + if (request.compress && !headers.has('Accept-Encoding')) { + headers.set('Accept-Encoding', 'gzip,deflate'); + } + + let agent = request.agent; + if (typeof agent === 'function') { + agent = agent(parsedURL); + } + + // HTTP-network fetch step 4.2 + // chunked encoding is handled by Node.js + + return Object.assign({}, parsedURL, { + method: request.method, + headers: exportNodeCompatibleHeaders(headers), + agent + }); +} + +/** + * abort-error.js + * + * AbortError interface for cancelled requests + */ + +/** + * Create AbortError instance + * + * @param String message Error message for human + * @return AbortError + */ +function AbortError(message) { + Error.call(this, message); + + this.type = 'aborted'; + this.message = message; + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +AbortError.prototype = Object.create(Error.prototype); +AbortError.prototype.constructor = AbortError; +AbortError.prototype.name = 'AbortError'; + +const URL$1 = Url.URL || whatwgUrl.URL; + +// fix an issue where "PassThrough", "resolve" aren't a named export for node <10 +const PassThrough$1 = Stream.PassThrough; + +const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) { + const orig = new URL$1(original).hostname; + const dest = new URL$1(destination).hostname; + + return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest); +}; + +/** + * isSameProtocol reports whether the two provided URLs use the same protocol. + * + * Both domains must already be in canonical form. + * @param {string|URL} original + * @param {string|URL} destination + */ +const isSameProtocol = function isSameProtocol(destination, original) { + const orig = new URL$1(original).protocol; + const dest = new URL$1(destination).protocol; + + return orig === dest; +}; + +/** + * Fetch function + * + * @param Mixed url Absolute url or Request instance + * @param Object opts Fetch options + * @return Promise + */ +function fetch(url, opts) { + + // allow custom promise + if (!fetch.Promise) { + throw new Error('native promise missing, set fetch.Promise to your favorite alternative'); + } + + Body.Promise = fetch.Promise; + + // wrap http.request into fetch + return new fetch.Promise(function (resolve, reject) { + // build request object + const request = new Request(url, opts); + const options = getNodeRequestOptions(request); + + const send = (options.protocol === 'https:' ? https : http).request; + const signal = request.signal; + + let response = null; + + const abort = function abort() { + let error = new AbortError('The user aborted a request.'); + reject(error); + if (request.body && request.body instanceof Stream.Readable) { + destroyStream(request.body, error); + } + if (!response || !response.body) return; + response.body.emit('error', error); + }; + + if (signal && signal.aborted) { + abort(); + return; + } + + const abortAndFinalize = function abortAndFinalize() { + abort(); + finalize(); + }; + + // send request + const req = send(options); + let reqTimeout; + + if (signal) { + signal.addEventListener('abort', abortAndFinalize); + } + + function finalize() { + req.abort(); + if (signal) signal.removeEventListener('abort', abortAndFinalize); + clearTimeout(reqTimeout); + } + + if (request.timeout) { + req.once('socket', function (socket) { + reqTimeout = setTimeout(function () { + reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); + finalize(); + }, request.timeout); + }); + } + + req.on('error', function (err) { + reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); + + if (response && response.body) { + destroyStream(response.body, err); + } + + finalize(); + }); + + fixResponseChunkedTransferBadEnding(req, function (err) { + if (signal && signal.aborted) { + return; + } + + if (response && response.body) { + destroyStream(response.body, err); + } + }); + + /* c8 ignore next 18 */ + if (parseInt(process.version.substring(1)) < 14) { + // Before Node.js 14, pipeline() does not fully support async iterators and does not always + // properly handle when the socket close/end events are out of order. + req.on('socket', function (s) { + s.addListener('close', function (hadError) { + // if a data listener is still present we didn't end cleanly + const hasDataListener = s.listenerCount('data') > 0; + + // if end happened before close but the socket didn't emit an error, do it now + if (response && hasDataListener && !hadError && !(signal && signal.aborted)) { + const err = new Error('Premature close'); + err.code = 'ERR_STREAM_PREMATURE_CLOSE'; + response.body.emit('error', err); + } + }); + }); + } + + req.on('response', function (res) { + clearTimeout(reqTimeout); + + const headers = createHeadersLenient(res.headers); + + // HTTP fetch step 5 + if (fetch.isRedirect(res.statusCode)) { + // HTTP fetch step 5.2 + const location = headers.get('Location'); + + // HTTP fetch step 5.3 + let locationURL = null; + try { + locationURL = location === null ? null : new URL$1(location, request.url).toString(); + } catch (err) { + // error here can only be invalid URL in Location: header + // do not throw when options.redirect == manual + // let the user extract the errorneous redirect URL + if (request.redirect !== 'manual') { + reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')); + finalize(); + return; + } + } + + // HTTP fetch step 5.5 + switch (request.redirect) { + case 'error': + reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect')); + finalize(); + return; + case 'manual': + // node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL. + if (locationURL !== null) { + // handle corrupted header + try { + headers.set('Location', locationURL); + } catch (err) { + // istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request + reject(err); + } + } + break; + case 'follow': + // HTTP-redirect fetch step 2 + if (locationURL === null) { + break; + } + + // HTTP-redirect fetch step 5 + if (request.counter >= request.follow) { + reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 6 (counter increment) + // Create a new Request object. + const requestOpts = { + headers: new Headers(request.headers), + follow: request.follow, + counter: request.counter + 1, + agent: request.agent, + compress: request.compress, + method: request.method, + body: request.body, + signal: request.signal, + timeout: request.timeout, + size: request.size + }; + + if (!isDomainOrSubdomain(request.url, locationURL) || !isSameProtocol(request.url, locationURL)) { + for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) { + requestOpts.headers.delete(name); + } + } + + // HTTP-redirect fetch step 9 + if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { + reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 11 + if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') { + requestOpts.method = 'GET'; + requestOpts.body = undefined; + requestOpts.headers.delete('content-length'); + } + + // HTTP-redirect fetch step 15 + resolve(fetch(new Request(locationURL, requestOpts))); + finalize(); + return; + } + } + + // prepare response + res.once('end', function () { + if (signal) signal.removeEventListener('abort', abortAndFinalize); + }); + let body = res.pipe(new PassThrough$1()); + + const response_options = { + url: request.url, + status: res.statusCode, + statusText: res.statusMessage, + headers: headers, + size: request.size, + timeout: request.timeout, + counter: request.counter + }; + + // HTTP-network fetch step 12.1.1.3 + const codings = headers.get('Content-Encoding'); + + // HTTP-network fetch step 12.1.1.4: handle content codings + + // in following scenarios we ignore compression support + // 1. compression support is disabled + // 2. HEAD request + // 3. no Content-Encoding header + // 4. no content response (204) + // 5. content not modified response (304) + if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) { + response = new Response(body, response_options); + resolve(response); + return; + } + + // For Node v6+ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + const zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + }; + + // for gzip + if (codings == 'gzip' || codings == 'x-gzip') { + body = body.pipe(zlib.createGunzip(zlibOptions)); + response = new Response(body, response_options); + resolve(response); + return; + } + + // for deflate + if (codings == 'deflate' || codings == 'x-deflate') { + // handle the infamous raw deflate response from old servers + // a hack for old IIS and Apache servers + const raw = res.pipe(new PassThrough$1()); + raw.once('data', function (chunk) { + // see http://stackoverflow.com/questions/37519828 + if ((chunk[0] & 0x0F) === 0x08) { + body = body.pipe(zlib.createInflate()); + } else { + body = body.pipe(zlib.createInflateRaw()); + } + response = new Response(body, response_options); + resolve(response); + }); + raw.on('end', function () { + // some old IIS servers return zero-length OK deflate responses, so 'data' is never emitted. + if (!response) { + response = new Response(body, response_options); + resolve(response); + } + }); + return; + } + + // for br + if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') { + body = body.pipe(zlib.createBrotliDecompress()); + response = new Response(body, response_options); + resolve(response); + return; + } + + // otherwise, use response as-is + response = new Response(body, response_options); + resolve(response); + }); + + writeToStream(req, request); + }); +} +function fixResponseChunkedTransferBadEnding(request, errorCallback) { + let socket; + + request.on('socket', function (s) { + socket = s; + }); + + request.on('response', function (response) { + const headers = response.headers; + + if (headers['transfer-encoding'] === 'chunked' && !headers['content-length']) { + response.once('close', function (hadError) { + // tests for socket presence, as in some situations the + // the 'socket' event is not triggered for the request + // (happens in deno), avoids `TypeError` + // if a data listener is still present we didn't end cleanly + const hasDataListener = socket && socket.listenerCount('data') > 0; + + if (hasDataListener && !hadError) { + const err = new Error('Premature close'); + err.code = 'ERR_STREAM_PREMATURE_CLOSE'; + errorCallback(err); + } + }); + } + }); +} + +function destroyStream(stream, err) { + if (stream.destroy) { + stream.destroy(err); + } else { + // node < 8 + stream.emit('error', err); + stream.end(); + } +} + +/** + * Redirect code matching + * + * @param Number code Status code + * @return Boolean + */ +fetch.isRedirect = function (code) { + return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; +}; + +// expose Promise +fetch.Promise = global.Promise; + +export default fetch; +export { Headers, Request, Response, FetchError, AbortError }; diff --git a/node/node_modules/node-fetch/lib/index.js b/node/node_modules/node-fetch/lib/index.js new file mode 100644 index 0000000..567ff5d --- /dev/null +++ b/node/node_modules/node-fetch/lib/index.js @@ -0,0 +1,1787 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var Stream = _interopDefault(require('stream')); +var http = _interopDefault(require('http')); +var Url = _interopDefault(require('url')); +var whatwgUrl = _interopDefault(require('whatwg-url')); +var https = _interopDefault(require('https')); +var zlib = _interopDefault(require('zlib')); + +// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js + +// fix for "Readable" isn't a named export issue +const Readable = Stream.Readable; + +const BUFFER = Symbol('buffer'); +const TYPE = Symbol('type'); + +class Blob { + constructor() { + this[TYPE] = ''; + + const blobParts = arguments[0]; + const options = arguments[1]; + + const buffers = []; + let size = 0; + + if (blobParts) { + const a = blobParts; + const length = Number(a.length); + for (let i = 0; i < length; i++) { + const element = a[i]; + let buffer; + if (element instanceof Buffer) { + buffer = element; + } else if (ArrayBuffer.isView(element)) { + buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); + } else if (element instanceof ArrayBuffer) { + buffer = Buffer.from(element); + } else if (element instanceof Blob) { + buffer = element[BUFFER]; + } else { + buffer = Buffer.from(typeof element === 'string' ? element : String(element)); + } + size += buffer.length; + buffers.push(buffer); + } + } + + this[BUFFER] = Buffer.concat(buffers); + + let type = options && options.type !== undefined && String(options.type).toLowerCase(); + if (type && !/[^\u0020-\u007E]/.test(type)) { + this[TYPE] = type; + } + } + get size() { + return this[BUFFER].length; + } + get type() { + return this[TYPE]; + } + text() { + return Promise.resolve(this[BUFFER].toString()); + } + arrayBuffer() { + const buf = this[BUFFER]; + const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + return Promise.resolve(ab); + } + stream() { + const readable = new Readable(); + readable._read = function () {}; + readable.push(this[BUFFER]); + readable.push(null); + return readable; + } + toString() { + return '[object Blob]'; + } + slice() { + const size = this.size; + + const start = arguments[0]; + const end = arguments[1]; + let relativeStart, relativeEnd; + if (start === undefined) { + relativeStart = 0; + } else if (start < 0) { + relativeStart = Math.max(size + start, 0); + } else { + relativeStart = Math.min(start, size); + } + if (end === undefined) { + relativeEnd = size; + } else if (end < 0) { + relativeEnd = Math.max(size + end, 0); + } else { + relativeEnd = Math.min(end, size); + } + const span = Math.max(relativeEnd - relativeStart, 0); + + const buffer = this[BUFFER]; + const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); + const blob = new Blob([], { type: arguments[2] }); + blob[BUFFER] = slicedBuffer; + return blob; + } +} + +Object.defineProperties(Blob.prototype, { + size: { enumerable: true }, + type: { enumerable: true }, + slice: { enumerable: true } +}); + +Object.defineProperty(Blob.prototype, Symbol.toStringTag, { + value: 'Blob', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * fetch-error.js + * + * FetchError interface for operational errors + */ + +/** + * Create FetchError instance + * + * @param String message Error message for human + * @param String type Error type for machine + * @param String systemError For Node.js system error + * @return FetchError + */ +function FetchError(message, type, systemError) { + Error.call(this, message); + + this.message = message; + this.type = type; + + // when err.type is `system`, err.code contains system error code + if (systemError) { + this.code = this.errno = systemError.code; + } + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +FetchError.prototype = Object.create(Error.prototype); +FetchError.prototype.constructor = FetchError; +FetchError.prototype.name = 'FetchError'; + +let convert; +try { + convert = require('encoding').convert; +} catch (e) {} + +const INTERNALS = Symbol('Body internals'); + +// fix an issue where "PassThrough" isn't a named export for node <10 +const PassThrough = Stream.PassThrough; + +/** + * Body mixin + * + * Ref: https://fetch.spec.whatwg.org/#body + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +function Body(body) { + var _this = this; + + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref$size = _ref.size; + + let size = _ref$size === undefined ? 0 : _ref$size; + var _ref$timeout = _ref.timeout; + let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; + + if (body == null) { + // body is undefined or null + body = null; + } else if (isURLSearchParams(body)) { + // body is a URLSearchParams + body = Buffer.from(body.toString()); + } else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { + // body is ArrayBuffer + body = Buffer.from(body); + } else if (ArrayBuffer.isView(body)) { + // body is ArrayBufferView + body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); + } else if (body instanceof Stream) ; else { + // none of the above + // coerce to string then buffer + body = Buffer.from(String(body)); + } + this[INTERNALS] = { + body, + disturbed: false, + error: null + }; + this.size = size; + this.timeout = timeout; + + if (body instanceof Stream) { + body.on('error', function (err) { + const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err); + _this[INTERNALS].error = error; + }); + } +} + +Body.prototype = { + get body() { + return this[INTERNALS].body; + }, + + get bodyUsed() { + return this[INTERNALS].disturbed; + }, + + /** + * Decode response as ArrayBuffer + * + * @return Promise + */ + arrayBuffer() { + return consumeBody.call(this).then(function (buf) { + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + }); + }, + + /** + * Return raw response as Blob + * + * @return Promise + */ + blob() { + let ct = this.headers && this.headers.get('content-type') || ''; + return consumeBody.call(this).then(function (buf) { + return Object.assign( + // Prevent copying + new Blob([], { + type: ct.toLowerCase() + }), { + [BUFFER]: buf + }); + }); + }, + + /** + * Decode response as json + * + * @return Promise + */ + json() { + var _this2 = this; + + return consumeBody.call(this).then(function (buffer) { + try { + return JSON.parse(buffer.toString()); + } catch (err) { + return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); + } + }); + }, + + /** + * Decode response as text + * + * @return Promise + */ + text() { + return consumeBody.call(this).then(function (buffer) { + return buffer.toString(); + }); + }, + + /** + * Decode response as buffer (non-spec api) + * + * @return Promise + */ + buffer() { + return consumeBody.call(this); + }, + + /** + * Decode response as text, while automatically detecting the encoding and + * trying to decode to UTF-8 (non-spec api) + * + * @return Promise + */ + textConverted() { + var _this3 = this; + + return consumeBody.call(this).then(function (buffer) { + return convertBody(buffer, _this3.headers); + }); + } +}; + +// In browsers, all properties are enumerable. +Object.defineProperties(Body.prototype, { + body: { enumerable: true }, + bodyUsed: { enumerable: true }, + arrayBuffer: { enumerable: true }, + blob: { enumerable: true }, + json: { enumerable: true }, + text: { enumerable: true } +}); + +Body.mixIn = function (proto) { + for (const name of Object.getOwnPropertyNames(Body.prototype)) { + // istanbul ignore else: future proof + if (!(name in proto)) { + const desc = Object.getOwnPropertyDescriptor(Body.prototype, name); + Object.defineProperty(proto, name, desc); + } + } +}; + +/** + * Consume and convert an entire Body to a Buffer. + * + * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body + * + * @return Promise + */ +function consumeBody() { + var _this4 = this; + + if (this[INTERNALS].disturbed) { + return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`)); + } + + this[INTERNALS].disturbed = true; + + if (this[INTERNALS].error) { + return Body.Promise.reject(this[INTERNALS].error); + } + + let body = this.body; + + // body is null + if (body === null) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is blob + if (isBlob(body)) { + body = body.stream(); + } + + // body is buffer + if (Buffer.isBuffer(body)) { + return Body.Promise.resolve(body); + } + + // istanbul ignore if: should never happen + if (!(body instanceof Stream)) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is stream + // get ready to actually consume the body + let accum = []; + let accumBytes = 0; + let abort = false; + + return new Body.Promise(function (resolve, reject) { + let resTimeout; + + // allow timeout on slow response body + if (_this4.timeout) { + resTimeout = setTimeout(function () { + abort = true; + reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout')); + }, _this4.timeout); + } + + // handle stream errors + body.on('error', function (err) { + if (err.name === 'AbortError') { + // if the request was aborted, reject with this Error + abort = true; + reject(err); + } else { + // other errors, such as incorrect content-encoding + reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + + body.on('data', function (chunk) { + if (abort || chunk === null) { + return; + } + + if (_this4.size && accumBytes + chunk.length > _this4.size) { + abort = true; + reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size')); + return; + } + + accumBytes += chunk.length; + accum.push(chunk); + }); + + body.on('end', function () { + if (abort) { + return; + } + + clearTimeout(resTimeout); + + try { + resolve(Buffer.concat(accum, accumBytes)); + } catch (err) { + // handle streams that have accumulated too much data (issue #414) + reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + }); +} + +/** + * Detect buffer encoding and convert to target encoding + * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding + * + * @param Buffer buffer Incoming buffer + * @param String encoding Target encoding + * @return String + */ +function convertBody(buffer, headers) { + if (typeof convert !== 'function') { + throw new Error('The package `encoding` must be installed to use the textConverted() function'); + } + + const ct = headers.get('content-type'); + let charset = 'utf-8'; + let res, str; + + // header + if (ct) { + res = /charset=([^;]*)/i.exec(ct); + } + + // no charset in content type, peek at response body for at most 1024 bytes + str = buffer.slice(0, 1024).toString(); + + // html5 + if (!res && str) { + res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined; + + this[MAP] = Object.create(null); + + if (init instanceof Headers) { + const rawHeaders = init.raw(); + const headerNames = Object.keys(rawHeaders); + + for (const headerName of headerNames) { + for (const value of rawHeaders[headerName]) { + this.append(headerName, value); + } + } + + return; + } + + // We don't worry about converting prop to ByteString here as append() + // will handle it. + if (init == null) ; else if (typeof init === 'object') { + const method = init[Symbol.iterator]; + if (method != null) { + if (typeof method !== 'function') { + throw new TypeError('Header pairs must be iterable'); + } + + // sequence> + // Note: per spec we have to first exhaust the lists then process them + const pairs = []; + for (const pair of init) { + if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') { + throw new TypeError('Each header pair must be iterable'); + } + pairs.push(Array.from(pair)); + } + + for (const pair of pairs) { + if (pair.length !== 2) { + throw new TypeError('Each header pair must be a name/value tuple'); + } + this.append(pair[0], pair[1]); + } + } else { + // record + for (const key of Object.keys(init)) { + const value = init[key]; + this.append(key, value); + } + } + } else { + throw new TypeError('Provided initializer must be an object'); + } + } + + /** + * Return combined header value given name + * + * @param String name Header name + * @return Mixed + */ + get(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key === undefined) { + return null; + } + + return this[MAP][key].join(', '); + } + + /** + * Iterate over all headers + * + * @param Function callback Executed for each item with parameters (value, name, thisArg) + * @param Boolean thisArg `this` context for callback function + * @return Void + */ + forEach(callback) { + let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; + + let pairs = getHeaders(this); + let i = 0; + while (i < pairs.length) { + var _pairs$i = pairs[i]; + const name = _pairs$i[0], + value = _pairs$i[1]; + + callback.call(thisArg, value, name, this); + pairs = getHeaders(this); + i++; + } + } + + /** + * Overwrite header values given name + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + set(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + this[MAP][key !== undefined ? key : name] = [value]; + } + + /** + * Append a value onto existing header + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + append(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + if (key !== undefined) { + this[MAP][key].push(value); + } else { + this[MAP][name] = [value]; + } + } + + /** + * Check for header name existence + * + * @param String name Header name + * @return Boolean + */ + has(name) { + name = `${name}`; + validateName(name); + return find(this[MAP], name) !== undefined; + } + + /** + * Delete all header values given name + * + * @param String name Header name + * @return Void + */ + delete(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key !== undefined) { + delete this[MAP][key]; + } + } + + /** + * Return raw headers (non-spec api) + * + * @return Object + */ + raw() { + return this[MAP]; + } + + /** + * Get an iterator on keys. + * + * @return Iterator + */ + keys() { + return createHeadersIterator(this, 'key'); + } + + /** + * Get an iterator on values. + * + * @return Iterator + */ + values() { + return createHeadersIterator(this, 'value'); + } + + /** + * Get an iterator on entries. + * + * This is the default iterator of the Headers object. + * + * @return Iterator + */ + [Symbol.iterator]() { + return createHeadersIterator(this, 'key+value'); + } +} +Headers.prototype.entries = Headers.prototype[Symbol.iterator]; + +Object.defineProperty(Headers.prototype, Symbol.toStringTag, { + value: 'Headers', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Headers.prototype, { + get: { enumerable: true }, + forEach: { enumerable: true }, + set: { enumerable: true }, + append: { enumerable: true }, + has: { enumerable: true }, + delete: { enumerable: true }, + keys: { enumerable: true }, + values: { enumerable: true }, + entries: { enumerable: true } +}); + +function getHeaders(headers) { + let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value'; + + const keys = Object.keys(headers[MAP]).sort(); + return keys.map(kind === 'key' ? function (k) { + return k.toLowerCase(); + } : kind === 'value' ? function (k) { + return headers[MAP][k].join(', '); + } : function (k) { + return [k.toLowerCase(), headers[MAP][k].join(', ')]; + }); +} + +const INTERNAL = Symbol('internal'); + +function createHeadersIterator(target, kind) { + const iterator = Object.create(HeadersIteratorPrototype); + iterator[INTERNAL] = { + target, + kind, + index: 0 + }; + return iterator; +} + +const HeadersIteratorPrototype = Object.setPrototypeOf({ + next() { + // istanbul ignore if + if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { + throw new TypeError('Value of `this` is not a HeadersIterator'); + } + + var _INTERNAL = this[INTERNAL]; + const target = _INTERNAL.target, + kind = _INTERNAL.kind, + index = _INTERNAL.index; + + const values = getHeaders(target, kind); + const len = values.length; + if (index >= len) { + return { + value: undefined, + done: true + }; + } + + this[INTERNAL].index = index + 1; + + return { + value: values[index], + done: false + }; + } +}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); + +Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { + value: 'HeadersIterator', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * Export the Headers object in a form that Node.js can consume. + * + * @param Headers headers + * @return Object + */ +function exportNodeCompatibleHeaders(headers) { + const obj = Object.assign({ __proto__: null }, headers[MAP]); + + // http.request() only supports string as Host header. This hack makes + // specifying custom Host header possible. + const hostHeaderKey = find(headers[MAP], 'Host'); + if (hostHeaderKey !== undefined) { + obj[hostHeaderKey] = obj[hostHeaderKey][0]; + } + + return obj; +} + +/** + * Create a Headers object from an object of headers, ignoring those that do + * not conform to HTTP grammar productions. + * + * @param Object obj Object of headers + * @return Headers + */ +function createHeadersLenient(obj) { + const headers = new Headers(); + for (const name of Object.keys(obj)) { + if (invalidTokenRegex.test(name)) { + continue; + } + if (Array.isArray(obj[name])) { + for (const val of obj[name]) { + if (invalidHeaderCharRegex.test(val)) { + continue; + } + if (headers[MAP][name] === undefined) { + headers[MAP][name] = [val]; + } else { + headers[MAP][name].push(val); + } + } + } else if (!invalidHeaderCharRegex.test(obj[name])) { + headers[MAP][name] = [obj[name]]; + } + } + return headers; +} + +const INTERNALS$1 = Symbol('Response internals'); + +// fix an issue where "STATUS_CODES" aren't a named export for node <10 +const STATUS_CODES = http.STATUS_CODES; + +/** + * Response class + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +class Response { + constructor() { + let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + Body.call(this, body, opts); + + const status = opts.status || 200; + const headers = new Headers(opts.headers); + + if (body != null && !headers.has('Content-Type')) { + const contentType = extractContentType(body); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + this[INTERNALS$1] = { + url: opts.url, + status, + statusText: opts.statusText || STATUS_CODES[status], + headers, + counter: opts.counter + }; + } + + get url() { + return this[INTERNALS$1].url || ''; + } + + get status() { + return this[INTERNALS$1].status; + } + + /** + * Convenience property representing if the request ended normally + */ + get ok() { + return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; + } + + get redirected() { + return this[INTERNALS$1].counter > 0; + } + + get statusText() { + return this[INTERNALS$1].statusText; + } + + get headers() { + return this[INTERNALS$1].headers; + } + + /** + * Clone this response + * + * @return Response + */ + clone() { + return new Response(clone(this), { + url: this.url, + status: this.status, + statusText: this.statusText, + headers: this.headers, + ok: this.ok, + redirected: this.redirected + }); + } +} + +Body.mixIn(Response.prototype); + +Object.defineProperties(Response.prototype, { + url: { enumerable: true }, + status: { enumerable: true }, + ok: { enumerable: true }, + redirected: { enumerable: true }, + statusText: { enumerable: true }, + headers: { enumerable: true }, + clone: { enumerable: true } +}); + +Object.defineProperty(Response.prototype, Symbol.toStringTag, { + value: 'Response', + writable: false, + enumerable: false, + configurable: true +}); + +const INTERNALS$2 = Symbol('Request internals'); +const URL = Url.URL || whatwgUrl.URL; + +// fix an issue where "format", "parse" aren't a named export for node <10 +const parse_url = Url.parse; +const format_url = Url.format; + +/** + * Wrapper around `new URL` to handle arbitrary URLs + * + * @param {string} urlStr + * @return {void} + */ +function parseURL(urlStr) { + /* + Check whether the URL is absolute or not + Scheme: https://tools.ietf.org/html/rfc3986#section-3.1 + Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3 + */ + if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) { + urlStr = new URL(urlStr).toString(); + } + + // Fallback to old implementation for arbitrary URLs + return parse_url(urlStr); +} + +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +/** + * Check if a value is an instance of Request. + * + * @param Mixed input + * @return Boolean + */ +function isRequest(input) { + return typeof input === 'object' && typeof input[INTERNALS$2] === 'object'; +} + +function isAbortSignal(signal) { + const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal); + return !!(proto && proto.constructor.name === 'AbortSignal'); +} + +/** + * Request class + * + * @param Mixed input Url or Request instance + * @param Object init Custom options + * @return Void + */ +class Request { + constructor(input) { + let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + let parsedURL; + + // normalize input + if (!isRequest(input)) { + if (input && input.href) { + // in order to support Node.js' Url objects; though WHATWG's URL objects + // will fall into this branch also (since their `toString()` will return + // `href` property anyway) + parsedURL = parseURL(input.href); + } else { + // coerce input to a string before attempting to parse + parsedURL = parseURL(`${input}`); + } + input = {}; + } else { + parsedURL = parseURL(input.url); + } + + let method = init.method || input.method || 'GET'; + method = method.toUpperCase(); + + if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) { + throw new TypeError('Request with GET/HEAD method cannot have body'); + } + + let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; + + Body.call(this, inputBody, { + timeout: init.timeout || input.timeout || 0, + size: init.size || input.size || 0 + }); + + const headers = new Headers(init.headers || input.headers || {}); + + if (inputBody != null && !headers.has('Content-Type')) { + const contentType = extractContentType(inputBody); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + let signal = isRequest(input) ? input.signal : null; + if ('signal' in init) signal = init.signal; + + if (signal != null && !isAbortSignal(signal)) { + throw new TypeError('Expected signal to be an instanceof AbortSignal'); + } + + this[INTERNALS$2] = { + method, + redirect: init.redirect || input.redirect || 'follow', + headers, + parsedURL, + signal + }; + + // node-fetch-only options + this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; + this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; + this.counter = init.counter || input.counter || 0; + this.agent = init.agent || input.agent; + } + + get method() { + return this[INTERNALS$2].method; + } + + get url() { + return format_url(this[INTERNALS$2].parsedURL); + } + + get headers() { + return this[INTERNALS$2].headers; + } + + get redirect() { + return this[INTERNALS$2].redirect; + } + + get signal() { + return this[INTERNALS$2].signal; + } + + /** + * Clone this request + * + * @return Request + */ + clone() { + return new Request(this); + } +} + +Body.mixIn(Request.prototype); + +Object.defineProperty(Request.prototype, Symbol.toStringTag, { + value: 'Request', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Request.prototype, { + method: { enumerable: true }, + url: { enumerable: true }, + headers: { enumerable: true }, + redirect: { enumerable: true }, + clone: { enumerable: true }, + signal: { enumerable: true } +}); + +/** + * Convert a Request to Node.js http request options. + * + * @param Request A Request instance + * @return Object The options object to be passed to http.request + */ +function getNodeRequestOptions(request) { + const parsedURL = request[INTERNALS$2].parsedURL; + const headers = new Headers(request[INTERNALS$2].headers); + + // fetch step 1.3 + if (!headers.has('Accept')) { + headers.set('Accept', '*/*'); + } + + // Basic fetch + if (!parsedURL.protocol || !parsedURL.hostname) { + throw new TypeError('Only absolute URLs are supported'); + } + + if (!/^https?:$/.test(parsedURL.protocol)) { + throw new TypeError('Only HTTP(S) protocols are supported'); + } + + if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) { + throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8'); + } + + // HTTP-network-or-cache fetch steps 2.4-2.7 + let contentLengthValue = null; + if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { + contentLengthValue = '0'; + } + if (request.body != null) { + const totalBytes = getTotalBytes(request); + if (typeof totalBytes === 'number') { + contentLengthValue = String(totalBytes); + } + } + if (contentLengthValue) { + headers.set('Content-Length', contentLengthValue); + } + + // HTTP-network-or-cache fetch step 2.11 + if (!headers.has('User-Agent')) { + headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); + } + + // HTTP-network-or-cache fetch step 2.15 + if (request.compress && !headers.has('Accept-Encoding')) { + headers.set('Accept-Encoding', 'gzip,deflate'); + } + + let agent = request.agent; + if (typeof agent === 'function') { + agent = agent(parsedURL); + } + + // HTTP-network fetch step 4.2 + // chunked encoding is handled by Node.js + + return Object.assign({}, parsedURL, { + method: request.method, + headers: exportNodeCompatibleHeaders(headers), + agent + }); +} + +/** + * abort-error.js + * + * AbortError interface for cancelled requests + */ + +/** + * Create AbortError instance + * + * @param String message Error message for human + * @return AbortError + */ +function AbortError(message) { + Error.call(this, message); + + this.type = 'aborted'; + this.message = message; + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +AbortError.prototype = Object.create(Error.prototype); +AbortError.prototype.constructor = AbortError; +AbortError.prototype.name = 'AbortError'; + +const URL$1 = Url.URL || whatwgUrl.URL; + +// fix an issue where "PassThrough", "resolve" aren't a named export for node <10 +const PassThrough$1 = Stream.PassThrough; + +const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) { + const orig = new URL$1(original).hostname; + const dest = new URL$1(destination).hostname; + + return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest); +}; + +/** + * isSameProtocol reports whether the two provided URLs use the same protocol. + * + * Both domains must already be in canonical form. + * @param {string|URL} original + * @param {string|URL} destination + */ +const isSameProtocol = function isSameProtocol(destination, original) { + const orig = new URL$1(original).protocol; + const dest = new URL$1(destination).protocol; + + return orig === dest; +}; + +/** + * Fetch function + * + * @param Mixed url Absolute url or Request instance + * @param Object opts Fetch options + * @return Promise + */ +function fetch(url, opts) { + + // allow custom promise + if (!fetch.Promise) { + throw new Error('native promise missing, set fetch.Promise to your favorite alternative'); + } + + Body.Promise = fetch.Promise; + + // wrap http.request into fetch + return new fetch.Promise(function (resolve, reject) { + // build request object + const request = new Request(url, opts); + const options = getNodeRequestOptions(request); + + const send = (options.protocol === 'https:' ? https : http).request; + const signal = request.signal; + + let response = null; + + const abort = function abort() { + let error = new AbortError('The user aborted a request.'); + reject(error); + if (request.body && request.body instanceof Stream.Readable) { + destroyStream(request.body, error); + } + if (!response || !response.body) return; + response.body.emit('error', error); + }; + + if (signal && signal.aborted) { + abort(); + return; + } + + const abortAndFinalize = function abortAndFinalize() { + abort(); + finalize(); + }; + + // send request + const req = send(options); + let reqTimeout; + + if (signal) { + signal.addEventListener('abort', abortAndFinalize); + } + + function finalize() { + req.abort(); + if (signal) signal.removeEventListener('abort', abortAndFinalize); + clearTimeout(reqTimeout); + } + + if (request.timeout) { + req.once('socket', function (socket) { + reqTimeout = setTimeout(function () { + reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); + finalize(); + }, request.timeout); + }); + } + + req.on('error', function (err) { + reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); + + if (response && response.body) { + destroyStream(response.body, err); + } + + finalize(); + }); + + fixResponseChunkedTransferBadEnding(req, function (err) { + if (signal && signal.aborted) { + return; + } + + if (response && response.body) { + destroyStream(response.body, err); + } + }); + + /* c8 ignore next 18 */ + if (parseInt(process.version.substring(1)) < 14) { + // Before Node.js 14, pipeline() does not fully support async iterators and does not always + // properly handle when the socket close/end events are out of order. + req.on('socket', function (s) { + s.addListener('close', function (hadError) { + // if a data listener is still present we didn't end cleanly + const hasDataListener = s.listenerCount('data') > 0; + + // if end happened before close but the socket didn't emit an error, do it now + if (response && hasDataListener && !hadError && !(signal && signal.aborted)) { + const err = new Error('Premature close'); + err.code = 'ERR_STREAM_PREMATURE_CLOSE'; + response.body.emit('error', err); + } + }); + }); + } + + req.on('response', function (res) { + clearTimeout(reqTimeout); + + const headers = createHeadersLenient(res.headers); + + // HTTP fetch step 5 + if (fetch.isRedirect(res.statusCode)) { + // HTTP fetch step 5.2 + const location = headers.get('Location'); + + // HTTP fetch step 5.3 + let locationURL = null; + try { + locationURL = location === null ? null : new URL$1(location, request.url).toString(); + } catch (err) { + // error here can only be invalid URL in Location: header + // do not throw when options.redirect == manual + // let the user extract the errorneous redirect URL + if (request.redirect !== 'manual') { + reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')); + finalize(); + return; + } + } + + // HTTP fetch step 5.5 + switch (request.redirect) { + case 'error': + reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect')); + finalize(); + return; + case 'manual': + // node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL. + if (locationURL !== null) { + // handle corrupted header + try { + headers.set('Location', locationURL); + } catch (err) { + // istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request + reject(err); + } + } + break; + case 'follow': + // HTTP-redirect fetch step 2 + if (locationURL === null) { + break; + } + + // HTTP-redirect fetch step 5 + if (request.counter >= request.follow) { + reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 6 (counter increment) + // Create a new Request object. + const requestOpts = { + headers: new Headers(request.headers), + follow: request.follow, + counter: request.counter + 1, + agent: request.agent, + compress: request.compress, + method: request.method, + body: request.body, + signal: request.signal, + timeout: request.timeout, + size: request.size + }; + + if (!isDomainOrSubdomain(request.url, locationURL) || !isSameProtocol(request.url, locationURL)) { + for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) { + requestOpts.headers.delete(name); + } + } + + // HTTP-redirect fetch step 9 + if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { + reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 11 + if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') { + requestOpts.method = 'GET'; + requestOpts.body = undefined; + requestOpts.headers.delete('content-length'); + } + + // HTTP-redirect fetch step 15 + resolve(fetch(new Request(locationURL, requestOpts))); + finalize(); + return; + } + } + + // prepare response + res.once('end', function () { + if (signal) signal.removeEventListener('abort', abortAndFinalize); + }); + let body = res.pipe(new PassThrough$1()); + + const response_options = { + url: request.url, + status: res.statusCode, + statusText: res.statusMessage, + headers: headers, + size: request.size, + timeout: request.timeout, + counter: request.counter + }; + + // HTTP-network fetch step 12.1.1.3 + const codings = headers.get('Content-Encoding'); + + // HTTP-network fetch step 12.1.1.4: handle content codings + + // in following scenarios we ignore compression support + // 1. compression support is disabled + // 2. HEAD request + // 3. no Content-Encoding header + // 4. no content response (204) + // 5. content not modified response (304) + if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) { + response = new Response(body, response_options); + resolve(response); + return; + } + + // For Node v6+ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + const zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + }; + + // for gzip + if (codings == 'gzip' || codings == 'x-gzip') { + body = body.pipe(zlib.createGunzip(zlibOptions)); + response = new Response(body, response_options); + resolve(response); + return; + } + + // for deflate + if (codings == 'deflate' || codings == 'x-deflate') { + // handle the infamous raw deflate response from old servers + // a hack for old IIS and Apache servers + const raw = res.pipe(new PassThrough$1()); + raw.once('data', function (chunk) { + // see http://stackoverflow.com/questions/37519828 + if ((chunk[0] & 0x0F) === 0x08) { + body = body.pipe(zlib.createInflate()); + } else { + body = body.pipe(zlib.createInflateRaw()); + } + response = new Response(body, response_options); + resolve(response); + }); + raw.on('end', function () { + // some old IIS servers return zero-length OK deflate responses, so 'data' is never emitted. + if (!response) { + response = new Response(body, response_options); + resolve(response); + } + }); + return; + } + + // for br + if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') { + body = body.pipe(zlib.createBrotliDecompress()); + response = new Response(body, response_options); + resolve(response); + return; + } + + // otherwise, use response as-is + response = new Response(body, response_options); + resolve(response); + }); + + writeToStream(req, request); + }); +} +function fixResponseChunkedTransferBadEnding(request, errorCallback) { + let socket; + + request.on('socket', function (s) { + socket = s; + }); + + request.on('response', function (response) { + const headers = response.headers; + + if (headers['transfer-encoding'] === 'chunked' && !headers['content-length']) { + response.once('close', function (hadError) { + // tests for socket presence, as in some situations the + // the 'socket' event is not triggered for the request + // (happens in deno), avoids `TypeError` + // if a data listener is still present we didn't end cleanly + const hasDataListener = socket && socket.listenerCount('data') > 0; + + if (hasDataListener && !hadError) { + const err = new Error('Premature close'); + err.code = 'ERR_STREAM_PREMATURE_CLOSE'; + errorCallback(err); + } + }); + } + }); +} + +function destroyStream(stream, err) { + if (stream.destroy) { + stream.destroy(err); + } else { + // node < 8 + stream.emit('error', err); + stream.end(); + } +} + +/** + * Redirect code matching + * + * @param Number code Status code + * @return Boolean + */ +fetch.isRedirect = function (code) { + return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; +}; + +// expose Promise +fetch.Promise = global.Promise; + +module.exports = exports = fetch; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = exports; +exports.Headers = Headers; +exports.Request = Request; +exports.Response = Response; +exports.FetchError = FetchError; +exports.AbortError = AbortError; diff --git a/node/node_modules/node-fetch/lib/index.mjs b/node/node_modules/node-fetch/lib/index.mjs new file mode 100644 index 0000000..2863dd9 --- /dev/null +++ b/node/node_modules/node-fetch/lib/index.mjs @@ -0,0 +1,1775 @@ +import Stream from 'stream'; +import http from 'http'; +import Url from 'url'; +import whatwgUrl from 'whatwg-url'; +import https from 'https'; +import zlib from 'zlib'; + +// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js + +// fix for "Readable" isn't a named export issue +const Readable = Stream.Readable; + +const BUFFER = Symbol('buffer'); +const TYPE = Symbol('type'); + +class Blob { + constructor() { + this[TYPE] = ''; + + const blobParts = arguments[0]; + const options = arguments[1]; + + const buffers = []; + let size = 0; + + if (blobParts) { + const a = blobParts; + const length = Number(a.length); + for (let i = 0; i < length; i++) { + const element = a[i]; + let buffer; + if (element instanceof Buffer) { + buffer = element; + } else if (ArrayBuffer.isView(element)) { + buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); + } else if (element instanceof ArrayBuffer) { + buffer = Buffer.from(element); + } else if (element instanceof Blob) { + buffer = element[BUFFER]; + } else { + buffer = Buffer.from(typeof element === 'string' ? element : String(element)); + } + size += buffer.length; + buffers.push(buffer); + } + } + + this[BUFFER] = Buffer.concat(buffers); + + let type = options && options.type !== undefined && String(options.type).toLowerCase(); + if (type && !/[^\u0020-\u007E]/.test(type)) { + this[TYPE] = type; + } + } + get size() { + return this[BUFFER].length; + } + get type() { + return this[TYPE]; + } + text() { + return Promise.resolve(this[BUFFER].toString()); + } + arrayBuffer() { + const buf = this[BUFFER]; + const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + return Promise.resolve(ab); + } + stream() { + const readable = new Readable(); + readable._read = function () {}; + readable.push(this[BUFFER]); + readable.push(null); + return readable; + } + toString() { + return '[object Blob]'; + } + slice() { + const size = this.size; + + const start = arguments[0]; + const end = arguments[1]; + let relativeStart, relativeEnd; + if (start === undefined) { + relativeStart = 0; + } else if (start < 0) { + relativeStart = Math.max(size + start, 0); + } else { + relativeStart = Math.min(start, size); + } + if (end === undefined) { + relativeEnd = size; + } else if (end < 0) { + relativeEnd = Math.max(size + end, 0); + } else { + relativeEnd = Math.min(end, size); + } + const span = Math.max(relativeEnd - relativeStart, 0); + + const buffer = this[BUFFER]; + const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); + const blob = new Blob([], { type: arguments[2] }); + blob[BUFFER] = slicedBuffer; + return blob; + } +} + +Object.defineProperties(Blob.prototype, { + size: { enumerable: true }, + type: { enumerable: true }, + slice: { enumerable: true } +}); + +Object.defineProperty(Blob.prototype, Symbol.toStringTag, { + value: 'Blob', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * fetch-error.js + * + * FetchError interface for operational errors + */ + +/** + * Create FetchError instance + * + * @param String message Error message for human + * @param String type Error type for machine + * @param String systemError For Node.js system error + * @return FetchError + */ +function FetchError(message, type, systemError) { + Error.call(this, message); + + this.message = message; + this.type = type; + + // when err.type is `system`, err.code contains system error code + if (systemError) { + this.code = this.errno = systemError.code; + } + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +FetchError.prototype = Object.create(Error.prototype); +FetchError.prototype.constructor = FetchError; +FetchError.prototype.name = 'FetchError'; + +let convert; +try { + convert = require('encoding').convert; +} catch (e) {} + +const INTERNALS = Symbol('Body internals'); + +// fix an issue where "PassThrough" isn't a named export for node <10 +const PassThrough = Stream.PassThrough; + +/** + * Body mixin + * + * Ref: https://fetch.spec.whatwg.org/#body + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +function Body(body) { + var _this = this; + + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref$size = _ref.size; + + let size = _ref$size === undefined ? 0 : _ref$size; + var _ref$timeout = _ref.timeout; + let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; + + if (body == null) { + // body is undefined or null + body = null; + } else if (isURLSearchParams(body)) { + // body is a URLSearchParams + body = Buffer.from(body.toString()); + } else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { + // body is ArrayBuffer + body = Buffer.from(body); + } else if (ArrayBuffer.isView(body)) { + // body is ArrayBufferView + body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); + } else if (body instanceof Stream) ; else { + // none of the above + // coerce to string then buffer + body = Buffer.from(String(body)); + } + this[INTERNALS] = { + body, + disturbed: false, + error: null + }; + this.size = size; + this.timeout = timeout; + + if (body instanceof Stream) { + body.on('error', function (err) { + const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err); + _this[INTERNALS].error = error; + }); + } +} + +Body.prototype = { + get body() { + return this[INTERNALS].body; + }, + + get bodyUsed() { + return this[INTERNALS].disturbed; + }, + + /** + * Decode response as ArrayBuffer + * + * @return Promise + */ + arrayBuffer() { + return consumeBody.call(this).then(function (buf) { + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + }); + }, + + /** + * Return raw response as Blob + * + * @return Promise + */ + blob() { + let ct = this.headers && this.headers.get('content-type') || ''; + return consumeBody.call(this).then(function (buf) { + return Object.assign( + // Prevent copying + new Blob([], { + type: ct.toLowerCase() + }), { + [BUFFER]: buf + }); + }); + }, + + /** + * Decode response as json + * + * @return Promise + */ + json() { + var _this2 = this; + + return consumeBody.call(this).then(function (buffer) { + try { + return JSON.parse(buffer.toString()); + } catch (err) { + return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); + } + }); + }, + + /** + * Decode response as text + * + * @return Promise + */ + text() { + return consumeBody.call(this).then(function (buffer) { + return buffer.toString(); + }); + }, + + /** + * Decode response as buffer (non-spec api) + * + * @return Promise + */ + buffer() { + return consumeBody.call(this); + }, + + /** + * Decode response as text, while automatically detecting the encoding and + * trying to decode to UTF-8 (non-spec api) + * + * @return Promise + */ + textConverted() { + var _this3 = this; + + return consumeBody.call(this).then(function (buffer) { + return convertBody(buffer, _this3.headers); + }); + } +}; + +// In browsers, all properties are enumerable. +Object.defineProperties(Body.prototype, { + body: { enumerable: true }, + bodyUsed: { enumerable: true }, + arrayBuffer: { enumerable: true }, + blob: { enumerable: true }, + json: { enumerable: true }, + text: { enumerable: true } +}); + +Body.mixIn = function (proto) { + for (const name of Object.getOwnPropertyNames(Body.prototype)) { + // istanbul ignore else: future proof + if (!(name in proto)) { + const desc = Object.getOwnPropertyDescriptor(Body.prototype, name); + Object.defineProperty(proto, name, desc); + } + } +}; + +/** + * Consume and convert an entire Body to a Buffer. + * + * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body + * + * @return Promise + */ +function consumeBody() { + var _this4 = this; + + if (this[INTERNALS].disturbed) { + return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`)); + } + + this[INTERNALS].disturbed = true; + + if (this[INTERNALS].error) { + return Body.Promise.reject(this[INTERNALS].error); + } + + let body = this.body; + + // body is null + if (body === null) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is blob + if (isBlob(body)) { + body = body.stream(); + } + + // body is buffer + if (Buffer.isBuffer(body)) { + return Body.Promise.resolve(body); + } + + // istanbul ignore if: should never happen + if (!(body instanceof Stream)) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is stream + // get ready to actually consume the body + let accum = []; + let accumBytes = 0; + let abort = false; + + return new Body.Promise(function (resolve, reject) { + let resTimeout; + + // allow timeout on slow response body + if (_this4.timeout) { + resTimeout = setTimeout(function () { + abort = true; + reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout')); + }, _this4.timeout); + } + + // handle stream errors + body.on('error', function (err) { + if (err.name === 'AbortError') { + // if the request was aborted, reject with this Error + abort = true; + reject(err); + } else { + // other errors, such as incorrect content-encoding + reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + + body.on('data', function (chunk) { + if (abort || chunk === null) { + return; + } + + if (_this4.size && accumBytes + chunk.length > _this4.size) { + abort = true; + reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size')); + return; + } + + accumBytes += chunk.length; + accum.push(chunk); + }); + + body.on('end', function () { + if (abort) { + return; + } + + clearTimeout(resTimeout); + + try { + resolve(Buffer.concat(accum, accumBytes)); + } catch (err) { + // handle streams that have accumulated too much data (issue #414) + reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + }); +} + +/** + * Detect buffer encoding and convert to target encoding + * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding + * + * @param Buffer buffer Incoming buffer + * @param String encoding Target encoding + * @return String + */ +function convertBody(buffer, headers) { + if (typeof convert !== 'function') { + throw new Error('The package `encoding` must be installed to use the textConverted() function'); + } + + const ct = headers.get('content-type'); + let charset = 'utf-8'; + let res, str; + + // header + if (ct) { + res = /charset=([^;]*)/i.exec(ct); + } + + // no charset in content type, peek at response body for at most 1024 bytes + str = buffer.slice(0, 1024).toString(); + + // html5 + if (!res && str) { + res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined; + + this[MAP] = Object.create(null); + + if (init instanceof Headers) { + const rawHeaders = init.raw(); + const headerNames = Object.keys(rawHeaders); + + for (const headerName of headerNames) { + for (const value of rawHeaders[headerName]) { + this.append(headerName, value); + } + } + + return; + } + + // We don't worry about converting prop to ByteString here as append() + // will handle it. + if (init == null) ; else if (typeof init === 'object') { + const method = init[Symbol.iterator]; + if (method != null) { + if (typeof method !== 'function') { + throw new TypeError('Header pairs must be iterable'); + } + + // sequence> + // Note: per spec we have to first exhaust the lists then process them + const pairs = []; + for (const pair of init) { + if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') { + throw new TypeError('Each header pair must be iterable'); + } + pairs.push(Array.from(pair)); + } + + for (const pair of pairs) { + if (pair.length !== 2) { + throw new TypeError('Each header pair must be a name/value tuple'); + } + this.append(pair[0], pair[1]); + } + } else { + // record + for (const key of Object.keys(init)) { + const value = init[key]; + this.append(key, value); + } + } + } else { + throw new TypeError('Provided initializer must be an object'); + } + } + + /** + * Return combined header value given name + * + * @param String name Header name + * @return Mixed + */ + get(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key === undefined) { + return null; + } + + return this[MAP][key].join(', '); + } + + /** + * Iterate over all headers + * + * @param Function callback Executed for each item with parameters (value, name, thisArg) + * @param Boolean thisArg `this` context for callback function + * @return Void + */ + forEach(callback) { + let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; + + let pairs = getHeaders(this); + let i = 0; + while (i < pairs.length) { + var _pairs$i = pairs[i]; + const name = _pairs$i[0], + value = _pairs$i[1]; + + callback.call(thisArg, value, name, this); + pairs = getHeaders(this); + i++; + } + } + + /** + * Overwrite header values given name + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + set(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + this[MAP][key !== undefined ? key : name] = [value]; + } + + /** + * Append a value onto existing header + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + append(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + if (key !== undefined) { + this[MAP][key].push(value); + } else { + this[MAP][name] = [value]; + } + } + + /** + * Check for header name existence + * + * @param String name Header name + * @return Boolean + */ + has(name) { + name = `${name}`; + validateName(name); + return find(this[MAP], name) !== undefined; + } + + /** + * Delete all header values given name + * + * @param String name Header name + * @return Void + */ + delete(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key !== undefined) { + delete this[MAP][key]; + } + } + + /** + * Return raw headers (non-spec api) + * + * @return Object + */ + raw() { + return this[MAP]; + } + + /** + * Get an iterator on keys. + * + * @return Iterator + */ + keys() { + return createHeadersIterator(this, 'key'); + } + + /** + * Get an iterator on values. + * + * @return Iterator + */ + values() { + return createHeadersIterator(this, 'value'); + } + + /** + * Get an iterator on entries. + * + * This is the default iterator of the Headers object. + * + * @return Iterator + */ + [Symbol.iterator]() { + return createHeadersIterator(this, 'key+value'); + } +} +Headers.prototype.entries = Headers.prototype[Symbol.iterator]; + +Object.defineProperty(Headers.prototype, Symbol.toStringTag, { + value: 'Headers', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Headers.prototype, { + get: { enumerable: true }, + forEach: { enumerable: true }, + set: { enumerable: true }, + append: { enumerable: true }, + has: { enumerable: true }, + delete: { enumerable: true }, + keys: { enumerable: true }, + values: { enumerable: true }, + entries: { enumerable: true } +}); + +function getHeaders(headers) { + let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value'; + + const keys = Object.keys(headers[MAP]).sort(); + return keys.map(kind === 'key' ? function (k) { + return k.toLowerCase(); + } : kind === 'value' ? function (k) { + return headers[MAP][k].join(', '); + } : function (k) { + return [k.toLowerCase(), headers[MAP][k].join(', ')]; + }); +} + +const INTERNAL = Symbol('internal'); + +function createHeadersIterator(target, kind) { + const iterator = Object.create(HeadersIteratorPrototype); + iterator[INTERNAL] = { + target, + kind, + index: 0 + }; + return iterator; +} + +const HeadersIteratorPrototype = Object.setPrototypeOf({ + next() { + // istanbul ignore if + if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { + throw new TypeError('Value of `this` is not a HeadersIterator'); + } + + var _INTERNAL = this[INTERNAL]; + const target = _INTERNAL.target, + kind = _INTERNAL.kind, + index = _INTERNAL.index; + + const values = getHeaders(target, kind); + const len = values.length; + if (index >= len) { + return { + value: undefined, + done: true + }; + } + + this[INTERNAL].index = index + 1; + + return { + value: values[index], + done: false + }; + } +}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); + +Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { + value: 'HeadersIterator', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * Export the Headers object in a form that Node.js can consume. + * + * @param Headers headers + * @return Object + */ +function exportNodeCompatibleHeaders(headers) { + const obj = Object.assign({ __proto__: null }, headers[MAP]); + + // http.request() only supports string as Host header. This hack makes + // specifying custom Host header possible. + const hostHeaderKey = find(headers[MAP], 'Host'); + if (hostHeaderKey !== undefined) { + obj[hostHeaderKey] = obj[hostHeaderKey][0]; + } + + return obj; +} + +/** + * Create a Headers object from an object of headers, ignoring those that do + * not conform to HTTP grammar productions. + * + * @param Object obj Object of headers + * @return Headers + */ +function createHeadersLenient(obj) { + const headers = new Headers(); + for (const name of Object.keys(obj)) { + if (invalidTokenRegex.test(name)) { + continue; + } + if (Array.isArray(obj[name])) { + for (const val of obj[name]) { + if (invalidHeaderCharRegex.test(val)) { + continue; + } + if (headers[MAP][name] === undefined) { + headers[MAP][name] = [val]; + } else { + headers[MAP][name].push(val); + } + } + } else if (!invalidHeaderCharRegex.test(obj[name])) { + headers[MAP][name] = [obj[name]]; + } + } + return headers; +} + +const INTERNALS$1 = Symbol('Response internals'); + +// fix an issue where "STATUS_CODES" aren't a named export for node <10 +const STATUS_CODES = http.STATUS_CODES; + +/** + * Response class + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +class Response { + constructor() { + let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + Body.call(this, body, opts); + + const status = opts.status || 200; + const headers = new Headers(opts.headers); + + if (body != null && !headers.has('Content-Type')) { + const contentType = extractContentType(body); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + this[INTERNALS$1] = { + url: opts.url, + status, + statusText: opts.statusText || STATUS_CODES[status], + headers, + counter: opts.counter + }; + } + + get url() { + return this[INTERNALS$1].url || ''; + } + + get status() { + return this[INTERNALS$1].status; + } + + /** + * Convenience property representing if the request ended normally + */ + get ok() { + return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; + } + + get redirected() { + return this[INTERNALS$1].counter > 0; + } + + get statusText() { + return this[INTERNALS$1].statusText; + } + + get headers() { + return this[INTERNALS$1].headers; + } + + /** + * Clone this response + * + * @return Response + */ + clone() { + return new Response(clone(this), { + url: this.url, + status: this.status, + statusText: this.statusText, + headers: this.headers, + ok: this.ok, + redirected: this.redirected + }); + } +} + +Body.mixIn(Response.prototype); + +Object.defineProperties(Response.prototype, { + url: { enumerable: true }, + status: { enumerable: true }, + ok: { enumerable: true }, + redirected: { enumerable: true }, + statusText: { enumerable: true }, + headers: { enumerable: true }, + clone: { enumerable: true } +}); + +Object.defineProperty(Response.prototype, Symbol.toStringTag, { + value: 'Response', + writable: false, + enumerable: false, + configurable: true +}); + +const INTERNALS$2 = Symbol('Request internals'); +const URL = Url.URL || whatwgUrl.URL; + +// fix an issue where "format", "parse" aren't a named export for node <10 +const parse_url = Url.parse; +const format_url = Url.format; + +/** + * Wrapper around `new URL` to handle arbitrary URLs + * + * @param {string} urlStr + * @return {void} + */ +function parseURL(urlStr) { + /* + Check whether the URL is absolute or not + Scheme: https://tools.ietf.org/html/rfc3986#section-3.1 + Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3 + */ + if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) { + urlStr = new URL(urlStr).toString(); + } + + // Fallback to old implementation for arbitrary URLs + return parse_url(urlStr); +} + +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +/** + * Check if a value is an instance of Request. + * + * @param Mixed input + * @return Boolean + */ +function isRequest(input) { + return typeof input === 'object' && typeof input[INTERNALS$2] === 'object'; +} + +function isAbortSignal(signal) { + const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal); + return !!(proto && proto.constructor.name === 'AbortSignal'); +} + +/** + * Request class + * + * @param Mixed input Url or Request instance + * @param Object init Custom options + * @return Void + */ +class Request { + constructor(input) { + let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + let parsedURL; + + // normalize input + if (!isRequest(input)) { + if (input && input.href) { + // in order to support Node.js' Url objects; though WHATWG's URL objects + // will fall into this branch also (since their `toString()` will return + // `href` property anyway) + parsedURL = parseURL(input.href); + } else { + // coerce input to a string before attempting to parse + parsedURL = parseURL(`${input}`); + } + input = {}; + } else { + parsedURL = parseURL(input.url); + } + + let method = init.method || input.method || 'GET'; + method = method.toUpperCase(); + + if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) { + throw new TypeError('Request with GET/HEAD method cannot have body'); + } + + let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; + + Body.call(this, inputBody, { + timeout: init.timeout || input.timeout || 0, + size: init.size || input.size || 0 + }); + + const headers = new Headers(init.headers || input.headers || {}); + + if (inputBody != null && !headers.has('Content-Type')) { + const contentType = extractContentType(inputBody); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + let signal = isRequest(input) ? input.signal : null; + if ('signal' in init) signal = init.signal; + + if (signal != null && !isAbortSignal(signal)) { + throw new TypeError('Expected signal to be an instanceof AbortSignal'); + } + + this[INTERNALS$2] = { + method, + redirect: init.redirect || input.redirect || 'follow', + headers, + parsedURL, + signal + }; + + // node-fetch-only options + this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; + this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; + this.counter = init.counter || input.counter || 0; + this.agent = init.agent || input.agent; + } + + get method() { + return this[INTERNALS$2].method; + } + + get url() { + return format_url(this[INTERNALS$2].parsedURL); + } + + get headers() { + return this[INTERNALS$2].headers; + } + + get redirect() { + return this[INTERNALS$2].redirect; + } + + get signal() { + return this[INTERNALS$2].signal; + } + + /** + * Clone this request + * + * @return Request + */ + clone() { + return new Request(this); + } +} + +Body.mixIn(Request.prototype); + +Object.defineProperty(Request.prototype, Symbol.toStringTag, { + value: 'Request', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Request.prototype, { + method: { enumerable: true }, + url: { enumerable: true }, + headers: { enumerable: true }, + redirect: { enumerable: true }, + clone: { enumerable: true }, + signal: { enumerable: true } +}); + +/** + * Convert a Request to Node.js http request options. + * + * @param Request A Request instance + * @return Object The options object to be passed to http.request + */ +function getNodeRequestOptions(request) { + const parsedURL = request[INTERNALS$2].parsedURL; + const headers = new Headers(request[INTERNALS$2].headers); + + // fetch step 1.3 + if (!headers.has('Accept')) { + headers.set('Accept', '*/*'); + } + + // Basic fetch + if (!parsedURL.protocol || !parsedURL.hostname) { + throw new TypeError('Only absolute URLs are supported'); + } + + if (!/^https?:$/.test(parsedURL.protocol)) { + throw new TypeError('Only HTTP(S) protocols are supported'); + } + + if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) { + throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8'); + } + + // HTTP-network-or-cache fetch steps 2.4-2.7 + let contentLengthValue = null; + if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { + contentLengthValue = '0'; + } + if (request.body != null) { + const totalBytes = getTotalBytes(request); + if (typeof totalBytes === 'number') { + contentLengthValue = String(totalBytes); + } + } + if (contentLengthValue) { + headers.set('Content-Length', contentLengthValue); + } + + // HTTP-network-or-cache fetch step 2.11 + if (!headers.has('User-Agent')) { + headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); + } + + // HTTP-network-or-cache fetch step 2.15 + if (request.compress && !headers.has('Accept-Encoding')) { + headers.set('Accept-Encoding', 'gzip,deflate'); + } + + let agent = request.agent; + if (typeof agent === 'function') { + agent = agent(parsedURL); + } + + // HTTP-network fetch step 4.2 + // chunked encoding is handled by Node.js + + return Object.assign({}, parsedURL, { + method: request.method, + headers: exportNodeCompatibleHeaders(headers), + agent + }); +} + +/** + * abort-error.js + * + * AbortError interface for cancelled requests + */ + +/** + * Create AbortError instance + * + * @param String message Error message for human + * @return AbortError + */ +function AbortError(message) { + Error.call(this, message); + + this.type = 'aborted'; + this.message = message; + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +AbortError.prototype = Object.create(Error.prototype); +AbortError.prototype.constructor = AbortError; +AbortError.prototype.name = 'AbortError'; + +const URL$1 = Url.URL || whatwgUrl.URL; + +// fix an issue where "PassThrough", "resolve" aren't a named export for node <10 +const PassThrough$1 = Stream.PassThrough; + +const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) { + const orig = new URL$1(original).hostname; + const dest = new URL$1(destination).hostname; + + return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest); +}; + +/** + * isSameProtocol reports whether the two provided URLs use the same protocol. + * + * Both domains must already be in canonical form. + * @param {string|URL} original + * @param {string|URL} destination + */ +const isSameProtocol = function isSameProtocol(destination, original) { + const orig = new URL$1(original).protocol; + const dest = new URL$1(destination).protocol; + + return orig === dest; +}; + +/** + * Fetch function + * + * @param Mixed url Absolute url or Request instance + * @param Object opts Fetch options + * @return Promise + */ +function fetch(url, opts) { + + // allow custom promise + if (!fetch.Promise) { + throw new Error('native promise missing, set fetch.Promise to your favorite alternative'); + } + + Body.Promise = fetch.Promise; + + // wrap http.request into fetch + return new fetch.Promise(function (resolve, reject) { + // build request object + const request = new Request(url, opts); + const options = getNodeRequestOptions(request); + + const send = (options.protocol === 'https:' ? https : http).request; + const signal = request.signal; + + let response = null; + + const abort = function abort() { + let error = new AbortError('The user aborted a request.'); + reject(error); + if (request.body && request.body instanceof Stream.Readable) { + destroyStream(request.body, error); + } + if (!response || !response.body) return; + response.body.emit('error', error); + }; + + if (signal && signal.aborted) { + abort(); + return; + } + + const abortAndFinalize = function abortAndFinalize() { + abort(); + finalize(); + }; + + // send request + const req = send(options); + let reqTimeout; + + if (signal) { + signal.addEventListener('abort', abortAndFinalize); + } + + function finalize() { + req.abort(); + if (signal) signal.removeEventListener('abort', abortAndFinalize); + clearTimeout(reqTimeout); + } + + if (request.timeout) { + req.once('socket', function (socket) { + reqTimeout = setTimeout(function () { + reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); + finalize(); + }, request.timeout); + }); + } + + req.on('error', function (err) { + reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); + + if (response && response.body) { + destroyStream(response.body, err); + } + + finalize(); + }); + + fixResponseChunkedTransferBadEnding(req, function (err) { + if (signal && signal.aborted) { + return; + } + + if (response && response.body) { + destroyStream(response.body, err); + } + }); + + /* c8 ignore next 18 */ + if (parseInt(process.version.substring(1)) < 14) { + // Before Node.js 14, pipeline() does not fully support async iterators and does not always + // properly handle when the socket close/end events are out of order. + req.on('socket', function (s) { + s.addListener('close', function (hadError) { + // if a data listener is still present we didn't end cleanly + const hasDataListener = s.listenerCount('data') > 0; + + // if end happened before close but the socket didn't emit an error, do it now + if (response && hasDataListener && !hadError && !(signal && signal.aborted)) { + const err = new Error('Premature close'); + err.code = 'ERR_STREAM_PREMATURE_CLOSE'; + response.body.emit('error', err); + } + }); + }); + } + + req.on('response', function (res) { + clearTimeout(reqTimeout); + + const headers = createHeadersLenient(res.headers); + + // HTTP fetch step 5 + if (fetch.isRedirect(res.statusCode)) { + // HTTP fetch step 5.2 + const location = headers.get('Location'); + + // HTTP fetch step 5.3 + let locationURL = null; + try { + locationURL = location === null ? null : new URL$1(location, request.url).toString(); + } catch (err) { + // error here can only be invalid URL in Location: header + // do not throw when options.redirect == manual + // let the user extract the errorneous redirect URL + if (request.redirect !== 'manual') { + reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')); + finalize(); + return; + } + } + + // HTTP fetch step 5.5 + switch (request.redirect) { + case 'error': + reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect')); + finalize(); + return; + case 'manual': + // node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL. + if (locationURL !== null) { + // handle corrupted header + try { + headers.set('Location', locationURL); + } catch (err) { + // istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request + reject(err); + } + } + break; + case 'follow': + // HTTP-redirect fetch step 2 + if (locationURL === null) { + break; + } + + // HTTP-redirect fetch step 5 + if (request.counter >= request.follow) { + reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 6 (counter increment) + // Create a new Request object. + const requestOpts = { + headers: new Headers(request.headers), + follow: request.follow, + counter: request.counter + 1, + agent: request.agent, + compress: request.compress, + method: request.method, + body: request.body, + signal: request.signal, + timeout: request.timeout, + size: request.size + }; + + if (!isDomainOrSubdomain(request.url, locationURL) || !isSameProtocol(request.url, locationURL)) { + for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) { + requestOpts.headers.delete(name); + } + } + + // HTTP-redirect fetch step 9 + if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { + reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 11 + if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') { + requestOpts.method = 'GET'; + requestOpts.body = undefined; + requestOpts.headers.delete('content-length'); + } + + // HTTP-redirect fetch step 15 + resolve(fetch(new Request(locationURL, requestOpts))); + finalize(); + return; + } + } + + // prepare response + res.once('end', function () { + if (signal) signal.removeEventListener('abort', abortAndFinalize); + }); + let body = res.pipe(new PassThrough$1()); + + const response_options = { + url: request.url, + status: res.statusCode, + statusText: res.statusMessage, + headers: headers, + size: request.size, + timeout: request.timeout, + counter: request.counter + }; + + // HTTP-network fetch step 12.1.1.3 + const codings = headers.get('Content-Encoding'); + + // HTTP-network fetch step 12.1.1.4: handle content codings + + // in following scenarios we ignore compression support + // 1. compression support is disabled + // 2. HEAD request + // 3. no Content-Encoding header + // 4. no content response (204) + // 5. content not modified response (304) + if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) { + response = new Response(body, response_options); + resolve(response); + return; + } + + // For Node v6+ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + const zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + }; + + // for gzip + if (codings == 'gzip' || codings == 'x-gzip') { + body = body.pipe(zlib.createGunzip(zlibOptions)); + response = new Response(body, response_options); + resolve(response); + return; + } + + // for deflate + if (codings == 'deflate' || codings == 'x-deflate') { + // handle the infamous raw deflate response from old servers + // a hack for old IIS and Apache servers + const raw = res.pipe(new PassThrough$1()); + raw.once('data', function (chunk) { + // see http://stackoverflow.com/questions/37519828 + if ((chunk[0] & 0x0F) === 0x08) { + body = body.pipe(zlib.createInflate()); + } else { + body = body.pipe(zlib.createInflateRaw()); + } + response = new Response(body, response_options); + resolve(response); + }); + raw.on('end', function () { + // some old IIS servers return zero-length OK deflate responses, so 'data' is never emitted. + if (!response) { + response = new Response(body, response_options); + resolve(response); + } + }); + return; + } + + // for br + if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') { + body = body.pipe(zlib.createBrotliDecompress()); + response = new Response(body, response_options); + resolve(response); + return; + } + + // otherwise, use response as-is + response = new Response(body, response_options); + resolve(response); + }); + + writeToStream(req, request); + }); +} +function fixResponseChunkedTransferBadEnding(request, errorCallback) { + let socket; + + request.on('socket', function (s) { + socket = s; + }); + + request.on('response', function (response) { + const headers = response.headers; + + if (headers['transfer-encoding'] === 'chunked' && !headers['content-length']) { + response.once('close', function (hadError) { + // tests for socket presence, as in some situations the + // the 'socket' event is not triggered for the request + // (happens in deno), avoids `TypeError` + // if a data listener is still present we didn't end cleanly + const hasDataListener = socket && socket.listenerCount('data') > 0; + + if (hasDataListener && !hadError) { + const err = new Error('Premature close'); + err.code = 'ERR_STREAM_PREMATURE_CLOSE'; + errorCallback(err); + } + }); + } + }); +} + +function destroyStream(stream, err) { + if (stream.destroy) { + stream.destroy(err); + } else { + // node < 8 + stream.emit('error', err); + stream.end(); + } +} + +/** + * Redirect code matching + * + * @param Number code Status code + * @return Boolean + */ +fetch.isRedirect = function (code) { + return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; +}; + +// expose Promise +fetch.Promise = global.Promise; + +export default fetch; +export { Headers, Request, Response, FetchError, AbortError }; diff --git a/node/node_modules/node-fetch/node_modules/tr46/.npmignore b/node/node_modules/node-fetch/node_modules/tr46/.npmignore new file mode 100644 index 0000000..96e9161 --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/tr46/.npmignore @@ -0,0 +1,4 @@ +scripts/ +test/ + +!lib/mapping_table.json diff --git a/node/node_modules/node-fetch/node_modules/tr46/index.js b/node/node_modules/node-fetch/node_modules/tr46/index.js new file mode 100644 index 0000000..9ce12ca --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/tr46/index.js @@ -0,0 +1,193 @@ +"use strict"; + +var punycode = require("punycode"); +var mappingTable = require("./lib/mappingTable.json"); + +var PROCESSING_OPTIONS = { + TRANSITIONAL: 0, + NONTRANSITIONAL: 1 +}; + +function normalize(str) { // fix bug in v8 + return str.split('\u0000').map(function (s) { return s.normalize('NFC'); }).join('\u0000'); +} + +function findStatus(val) { + var start = 0; + var end = mappingTable.length - 1; + + while (start <= end) { + var mid = Math.floor((start + end) / 2); + + var target = mappingTable[mid]; + if (target[0][0] <= val && target[0][1] >= val) { + return target; + } else if (target[0][0] > val) { + end = mid - 1; + } else { + start = mid + 1; + } + } + + return null; +} + +var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + +function countSymbols(string) { + return string + // replace every surrogate pair with a BMP symbol + .replace(regexAstralSymbols, '_') + // then get the length + .length; +} + +function mapChars(domain_name, useSTD3, processing_option) { + var hasError = false; + var processed = ""; + + var len = countSymbols(domain_name); + for (var i = 0; i < len; ++i) { + var codePoint = domain_name.codePointAt(i); + var status = findStatus(codePoint); + + switch (status[1]) { + case "disallowed": + hasError = true; + processed += String.fromCodePoint(codePoint); + break; + case "ignored": + break; + case "mapped": + processed += String.fromCodePoint.apply(String, status[2]); + break; + case "deviation": + if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) { + processed += String.fromCodePoint.apply(String, status[2]); + } else { + processed += String.fromCodePoint(codePoint); + } + break; + case "valid": + processed += String.fromCodePoint(codePoint); + break; + case "disallowed_STD3_mapped": + if (useSTD3) { + hasError = true; + processed += String.fromCodePoint(codePoint); + } else { + processed += String.fromCodePoint.apply(String, status[2]); + } + break; + case "disallowed_STD3_valid": + if (useSTD3) { + hasError = true; + } + + processed += String.fromCodePoint(codePoint); + break; + } + } + + return { + string: processed, + error: hasError + }; +} + +var combiningMarksRegex = /[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E4-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u192B\u1930-\u193B\u19B0-\u19C0\u19C8\u19C9\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2D]|\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDE2C-\uDE37\uDEDF-\uDEEA\uDF01-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDE30-\uDE40\uDEAB-\uDEB7]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD83A[\uDCD0-\uDCD6]|\uDB40[\uDD00-\uDDEF]/; + +function validateLabel(label, processing_option) { + if (label.substr(0, 4) === "xn--") { + label = punycode.toUnicode(label); + processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL; + } + + var error = false; + + if (normalize(label) !== label || + (label[3] === "-" && label[4] === "-") || + label[0] === "-" || label[label.length - 1] === "-" || + label.indexOf(".") !== -1 || + label.search(combiningMarksRegex) === 0) { + error = true; + } + + var len = countSymbols(label); + for (var i = 0; i < len; ++i) { + var status = findStatus(label.codePointAt(i)); + if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== "valid") || + (processing === PROCESSING_OPTIONS.NONTRANSITIONAL && + status[1] !== "valid" && status[1] !== "deviation")) { + error = true; + break; + } + } + + return { + label: label, + error: error + }; +} + +function processing(domain_name, useSTD3, processing_option) { + var result = mapChars(domain_name, useSTD3, processing_option); + result.string = normalize(result.string); + + var labels = result.string.split("."); + for (var i = 0; i < labels.length; ++i) { + try { + var validation = validateLabel(labels[i]); + labels[i] = validation.label; + result.error = result.error || validation.error; + } catch(e) { + result.error = true; + } + } + + return { + string: labels.join("."), + error: result.error + }; +} + +module.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) { + var result = processing(domain_name, useSTD3, processing_option); + var labels = result.string.split("."); + labels = labels.map(function(l) { + try { + return punycode.toASCII(l); + } catch(e) { + result.error = true; + return l; + } + }); + + if (verifyDnsLength) { + var total = labels.slice(0, labels.length - 1).join(".").length; + if (total.length > 253 || total.length === 0) { + result.error = true; + } + + for (var i=0; i < labels.length; ++i) { + if (labels.length > 63 || labels.length === 0) { + result.error = true; + break; + } + } + } + + if (result.error) return null; + return labels.join("."); +}; + +module.exports.toUnicode = function(domain_name, useSTD3) { + var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL); + + return { + domain: result.string, + error: result.error + }; +}; + +module.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS; diff --git a/node/node_modules/node-fetch/node_modules/tr46/lib/.gitkeep b/node/node_modules/node-fetch/node_modules/tr46/lib/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/node/node_modules/node-fetch/node_modules/tr46/lib/mappingTable.json b/node/node_modules/node-fetch/node_modules/tr46/lib/mappingTable.json new file mode 100644 index 0000000..89cf19a --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/tr46/lib/mappingTable.json @@ -0,0 +1 @@ +[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"],[[47,47],"disallowed_STD3_valid"],[[48,57],"valid"],[[58,64],"disallowed_STD3_valid"],[[65,65],"mapped",[97]],[[66,66],"mapped",[98]],[[67,67],"mapped",[99]],[[68,68],"mapped",[100]],[[69,69],"mapped",[101]],[[70,70],"mapped",[102]],[[71,71],"mapped",[103]],[[72,72],"mapped",[104]],[[73,73],"mapped",[105]],[[74,74],"mapped",[106]],[[75,75],"mapped",[107]],[[76,76],"mapped",[108]],[[77,77],"mapped",[109]],[[78,78],"mapped",[110]],[[79,79],"mapped",[111]],[[80,80],"mapped",[112]],[[81,81],"mapped",[113]],[[82,82],"mapped",[114]],[[83,83],"mapped",[115]],[[84,84],"mapped",[116]],[[85,85],"mapped",[117]],[[86,86],"mapped",[118]],[[87,87],"mapped",[119]],[[88,88],"mapped",[120]],[[89,89],"mapped",[121]],[[90,90],"mapped",[122]],[[91,96],"disallowed_STD3_valid"],[[97,122],"valid"],[[123,127],"disallowed_STD3_valid"],[[128,159],"disallowed"],[[160,160],"disallowed_STD3_mapped",[32]],[[161,167],"valid",[],"NV8"],[[168,168],"disallowed_STD3_mapped",[32,776]],[[169,169],"valid",[],"NV8"],[[170,170],"mapped",[97]],[[171,172],"valid",[],"NV8"],[[173,173],"ignored"],[[174,174],"valid",[],"NV8"],[[175,175],"disallowed_STD3_mapped",[32,772]],[[176,177],"valid",[],"NV8"],[[178,178],"mapped",[50]],[[179,179],"mapped",[51]],[[180,180],"disallowed_STD3_mapped",[32,769]],[[181,181],"mapped",[956]],[[182,182],"valid",[],"NV8"],[[183,183],"valid"],[[184,184],"disallowed_STD3_mapped",[32,807]],[[185,185],"mapped",[49]],[[186,186],"mapped",[111]],[[187,187],"valid",[],"NV8"],[[188,188],"mapped",[49,8260,52]],[[189,189],"mapped",[49,8260,50]],[[190,190],"mapped",[51,8260,52]],[[191,191],"valid",[],"NV8"],[[192,192],"mapped",[224]],[[193,193],"mapped",[225]],[[194,194],"mapped",[226]],[[195,195],"mapped",[227]],[[196,196],"mapped",[228]],[[197,197],"mapped",[229]],[[198,198],"mapped",[230]],[[199,199],"mapped",[231]],[[200,200],"mapped",[232]],[[201,201],"mapped",[233]],[[202,202],"mapped",[234]],[[203,203],"mapped",[235]],[[204,204],"mapped",[236]],[[205,205],"mapped",[237]],[[206,206],"mapped",[238]],[[207,207],"mapped",[239]],[[208,208],"mapped",[240]],[[209,209],"mapped",[241]],[[210,210],"mapped",[242]],[[211,211],"mapped",[243]],[[212,212],"mapped",[244]],[[213,213],"mapped",[245]],[[214,214],"mapped",[246]],[[215,215],"valid",[],"NV8"],[[216,216],"mapped",[248]],[[217,217],"mapped",[249]],[[218,218],"mapped",[250]],[[219,219],"mapped",[251]],[[220,220],"mapped",[252]],[[221,221],"mapped",[253]],[[222,222],"mapped",[254]],[[223,223],"deviation",[115,115]],[[224,246],"valid"],[[247,247],"valid",[],"NV8"],[[248,255],"valid"],[[256,256],"mapped",[257]],[[257,257],"valid"],[[258,258],"mapped",[259]],[[259,259],"valid"],[[260,260],"mapped",[261]],[[261,261],"valid"],[[262,262],"mapped",[263]],[[263,263],"valid"],[[264,264],"mapped",[265]],[[265,265],"valid"],[[266,266],"mapped",[267]],[[267,267],"valid"],[[268,268],"mapped",[269]],[[269,269],"valid"],[[270,270],"mapped",[271]],[[271,271],"valid"],[[272,272],"mapped",[273]],[[273,273],"valid"],[[274,274],"mapped",[275]],[[275,275],"valid"],[[276,276],"mapped",[277]],[[277,277],"valid"],[[278,278],"mapped",[279]],[[279,279],"valid"],[[280,280],"mapped",[281]],[[281,281],"valid"],[[282,282],"mapped",[283]],[[283,283],"valid"],[[284,284],"mapped",[285]],[[285,285],"valid"],[[286,286],"mapped",[287]],[[287,287],"valid"],[[288,288],"mapped",[289]],[[289,289],"valid"],[[290,290],"mapped",[291]],[[291,291],"valid"],[[292,292],"mapped",[293]],[[293,293],"valid"],[[294,294],"mapped",[295]],[[295,295],"valid"],[[296,296],"mapped",[297]],[[297,297],"valid"],[[298,298],"mapped",[299]],[[299,299],"valid"],[[300,300],"mapped",[301]],[[301,301],"valid"],[[302,302],"mapped",[303]],[[303,303],"valid"],[[304,304],"mapped",[105,775]],[[305,305],"valid"],[[306,307],"mapped",[105,106]],[[308,308],"mapped",[309]],[[309,309],"valid"],[[310,310],"mapped",[311]],[[311,312],"valid"],[[313,313],"mapped",[314]],[[314,314],"valid"],[[315,315],"mapped",[316]],[[316,316],"valid"],[[317,317],"mapped",[318]],[[318,318],"valid"],[[319,320],"mapped",[108,183]],[[321,321],"mapped",[322]],[[322,322],"valid"],[[323,323],"mapped",[324]],[[324,324],"valid"],[[325,325],"mapped",[326]],[[326,326],"valid"],[[327,327],"mapped",[328]],[[328,328],"valid"],[[329,329],"mapped",[700,110]],[[330,330],"mapped",[331]],[[331,331],"valid"],[[332,332],"mapped",[333]],[[333,333],"valid"],[[334,334],"mapped",[335]],[[335,335],"valid"],[[336,336],"mapped",[337]],[[337,337],"valid"],[[338,338],"mapped",[339]],[[339,339],"valid"],[[340,340],"mapped",[341]],[[341,341],"valid"],[[342,342],"mapped",[343]],[[343,343],"valid"],[[344,344],"mapped",[345]],[[345,345],"valid"],[[346,346],"mapped",[347]],[[347,347],"valid"],[[348,348],"mapped",[349]],[[349,349],"valid"],[[350,350],"mapped",[351]],[[351,351],"valid"],[[352,352],"mapped",[353]],[[353,353],"valid"],[[354,354],"mapped",[355]],[[355,355],"valid"],[[356,356],"mapped",[357]],[[357,357],"valid"],[[358,358],"mapped",[359]],[[359,359],"valid"],[[360,360],"mapped",[361]],[[361,361],"valid"],[[362,362],"mapped",[363]],[[363,363],"valid"],[[364,364],"mapped",[365]],[[365,365],"valid"],[[366,366],"mapped",[367]],[[367,367],"valid"],[[368,368],"mapped",[369]],[[369,369],"valid"],[[370,370],"mapped",[371]],[[371,371],"valid"],[[372,372],"mapped",[373]],[[373,373],"valid"],[[374,374],"mapped",[375]],[[375,375],"valid"],[[376,376],"mapped",[255]],[[377,377],"mapped",[378]],[[378,378],"valid"],[[379,379],"mapped",[380]],[[380,380],"valid"],[[381,381],"mapped",[382]],[[382,382],"valid"],[[383,383],"mapped",[115]],[[384,384],"valid"],[[385,385],"mapped",[595]],[[386,386],"mapped",[387]],[[387,387],"valid"],[[388,388],"mapped",[389]],[[389,389],"valid"],[[390,390],"mapped",[596]],[[391,391],"mapped",[392]],[[392,392],"valid"],[[393,393],"mapped",[598]],[[394,394],"mapped",[599]],[[395,395],"mapped",[396]],[[396,397],"valid"],[[398,398],"mapped",[477]],[[399,399],"mapped",[601]],[[400,400],"mapped",[603]],[[401,401],"mapped",[402]],[[402,402],"valid"],[[403,403],"mapped",[608]],[[404,404],"mapped",[611]],[[405,405],"valid"],[[406,406],"mapped",[617]],[[407,407],"mapped",[616]],[[408,408],"mapped",[409]],[[409,411],"valid"],[[412,412],"mapped",[623]],[[413,413],"mapped",[626]],[[414,414],"valid"],[[415,415],"mapped",[629]],[[416,416],"mapped",[417]],[[417,417],"valid"],[[418,418],"mapped",[419]],[[419,419],"valid"],[[420,420],"mapped",[421]],[[421,421],"valid"],[[422,422],"mapped",[640]],[[423,423],"mapped",[424]],[[424,424],"valid"],[[425,425],"mapped",[643]],[[426,427],"valid"],[[428,428],"mapped",[429]],[[429,429],"valid"],[[430,430],"mapped",[648]],[[431,431],"mapped",[432]],[[432,432],"valid"],[[433,433],"mapped",[650]],[[434,434],"mapped",[651]],[[435,435],"mapped",[436]],[[436,436],"valid"],[[437,437],"mapped",[438]],[[438,438],"valid"],[[439,439],"mapped",[658]],[[440,440],"mapped",[441]],[[441,443],"valid"],[[444,444],"mapped",[445]],[[445,451],"valid"],[[452,454],"mapped",[100,382]],[[455,457],"mapped",[108,106]],[[458,460],"mapped",[110,106]],[[461,461],"mapped",[462]],[[462,462],"valid"],[[463,463],"mapped",[464]],[[464,464],"valid"],[[465,465],"mapped",[466]],[[466,466],"valid"],[[467,467],"mapped",[468]],[[468,468],"valid"],[[469,469],"mapped",[470]],[[470,470],"valid"],[[471,471],"mapped",[472]],[[472,472],"valid"],[[473,473],"mapped",[474]],[[474,474],"valid"],[[475,475],"mapped",[476]],[[476,477],"valid"],[[478,478],"mapped",[479]],[[479,479],"valid"],[[480,480],"mapped",[481]],[[481,481],"valid"],[[482,482],"mapped",[483]],[[483,483],"valid"],[[484,484],"mapped",[485]],[[485,485],"valid"],[[486,486],"mapped",[487]],[[487,487],"valid"],[[488,488],"mapped",[489]],[[489,489],"valid"],[[490,490],"mapped",[491]],[[491,491],"valid"],[[492,492],"mapped",[493]],[[493,493],"valid"],[[494,494],"mapped",[495]],[[495,496],"valid"],[[497,499],"mapped",[100,122]],[[500,500],"mapped",[501]],[[501,501],"valid"],[[502,502],"mapped",[405]],[[503,503],"mapped",[447]],[[504,504],"mapped",[505]],[[505,505],"valid"],[[506,506],"mapped",[507]],[[507,507],"valid"],[[508,508],"mapped",[509]],[[509,509],"valid"],[[510,510],"mapped",[511]],[[511,511],"valid"],[[512,512],"mapped",[513]],[[513,513],"valid"],[[514,514],"mapped",[515]],[[515,515],"valid"],[[516,516],"mapped",[517]],[[517,517],"valid"],[[518,518],"mapped",[519]],[[519,519],"valid"],[[520,520],"mapped",[521]],[[521,521],"valid"],[[522,522],"mapped",[523]],[[523,523],"valid"],[[524,524],"mapped",[525]],[[525,525],"valid"],[[526,526],"mapped",[527]],[[527,527],"valid"],[[528,528],"mapped",[529]],[[529,529],"valid"],[[530,530],"mapped",[531]],[[531,531],"valid"],[[532,532],"mapped",[533]],[[533,533],"valid"],[[534,534],"mapped",[535]],[[535,535],"valid"],[[536,536],"mapped",[537]],[[537,537],"valid"],[[538,538],"mapped",[539]],[[539,539],"valid"],[[540,540],"mapped",[541]],[[541,541],"valid"],[[542,542],"mapped",[543]],[[543,543],"valid"],[[544,544],"mapped",[414]],[[545,545],"valid"],[[546,546],"mapped",[547]],[[547,547],"valid"],[[548,548],"mapped",[549]],[[549,549],"valid"],[[550,550],"mapped",[551]],[[551,551],"valid"],[[552,552],"mapped",[553]],[[553,553],"valid"],[[554,554],"mapped",[555]],[[555,555],"valid"],[[556,556],"mapped",[557]],[[557,557],"valid"],[[558,558],"mapped",[559]],[[559,559],"valid"],[[560,560],"mapped",[561]],[[561,561],"valid"],[[562,562],"mapped",[563]],[[563,563],"valid"],[[564,566],"valid"],[[567,569],"valid"],[[570,570],"mapped",[11365]],[[571,571],"mapped",[572]],[[572,572],"valid"],[[573,573],"mapped",[410]],[[574,574],"mapped",[11366]],[[575,576],"valid"],[[577,577],"mapped",[578]],[[578,578],"valid"],[[579,579],"mapped",[384]],[[580,580],"mapped",[649]],[[581,581],"mapped",[652]],[[582,582],"mapped",[583]],[[583,583],"valid"],[[584,584],"mapped",[585]],[[585,585],"valid"],[[586,586],"mapped",[587]],[[587,587],"valid"],[[588,588],"mapped",[589]],[[589,589],"valid"],[[590,590],"mapped",[591]],[[591,591],"valid"],[[592,680],"valid"],[[681,685],"valid"],[[686,687],"valid"],[[688,688],"mapped",[104]],[[689,689],"mapped",[614]],[[690,690],"mapped",[106]],[[691,691],"mapped",[114]],[[692,692],"mapped",[633]],[[693,693],"mapped",[635]],[[694,694],"mapped",[641]],[[695,695],"mapped",[119]],[[696,696],"mapped",[121]],[[697,705],"valid"],[[706,709],"valid",[],"NV8"],[[710,721],"valid"],[[722,727],"valid",[],"NV8"],[[728,728],"disallowed_STD3_mapped",[32,774]],[[729,729],"disallowed_STD3_mapped",[32,775]],[[730,730],"disallowed_STD3_mapped",[32,778]],[[731,731],"disallowed_STD3_mapped",[32,808]],[[732,732],"disallowed_STD3_mapped",[32,771]],[[733,733],"disallowed_STD3_mapped",[32,779]],[[734,734],"valid",[],"NV8"],[[735,735],"valid",[],"NV8"],[[736,736],"mapped",[611]],[[737,737],"mapped",[108]],[[738,738],"mapped",[115]],[[739,739],"mapped",[120]],[[740,740],"mapped",[661]],[[741,745],"valid",[],"NV8"],[[746,747],"valid",[],"NV8"],[[748,748],"valid"],[[749,749],"valid",[],"NV8"],[[750,750],"valid"],[[751,767],"valid",[],"NV8"],[[768,831],"valid"],[[832,832],"mapped",[768]],[[833,833],"mapped",[769]],[[834,834],"valid"],[[835,835],"mapped",[787]],[[836,836],"mapped",[776,769]],[[837,837],"mapped",[953]],[[838,846],"valid"],[[847,847],"ignored"],[[848,855],"valid"],[[856,860],"valid"],[[861,863],"valid"],[[864,865],"valid"],[[866,866],"valid"],[[867,879],"valid"],[[880,880],"mapped",[881]],[[881,881],"valid"],[[882,882],"mapped",[883]],[[883,883],"valid"],[[884,884],"mapped",[697]],[[885,885],"valid"],[[886,886],"mapped",[887]],[[887,887],"valid"],[[888,889],"disallowed"],[[890,890],"disallowed_STD3_mapped",[32,953]],[[891,893],"valid"],[[894,894],"disallowed_STD3_mapped",[59]],[[895,895],"mapped",[1011]],[[896,899],"disallowed"],[[900,900],"disallowed_STD3_mapped",[32,769]],[[901,901],"disallowed_STD3_mapped",[32,776,769]],[[902,902],"mapped",[940]],[[903,903],"mapped",[183]],[[904,904],"mapped",[941]],[[905,905],"mapped",[942]],[[906,906],"mapped",[943]],[[907,907],"disallowed"],[[908,908],"mapped",[972]],[[909,909],"disallowed"],[[910,910],"mapped",[973]],[[911,911],"mapped",[974]],[[912,912],"valid"],[[913,913],"mapped",[945]],[[914,914],"mapped",[946]],[[915,915],"mapped",[947]],[[916,916],"mapped",[948]],[[917,917],"mapped",[949]],[[918,918],"mapped",[950]],[[919,919],"mapped",[951]],[[920,920],"mapped",[952]],[[921,921],"mapped",[953]],[[922,922],"mapped",[954]],[[923,923],"mapped",[955]],[[924,924],"mapped",[956]],[[925,925],"mapped",[957]],[[926,926],"mapped",[958]],[[927,927],"mapped",[959]],[[928,928],"mapped",[960]],[[929,929],"mapped",[961]],[[930,930],"disallowed"],[[931,931],"mapped",[963]],[[932,932],"mapped",[964]],[[933,933],"mapped",[965]],[[934,934],"mapped",[966]],[[935,935],"mapped",[967]],[[936,936],"mapped",[968]],[[937,937],"mapped",[969]],[[938,938],"mapped",[970]],[[939,939],"mapped",[971]],[[940,961],"valid"],[[962,962],"deviation",[963]],[[963,974],"valid"],[[975,975],"mapped",[983]],[[976,976],"mapped",[946]],[[977,977],"mapped",[952]],[[978,978],"mapped",[965]],[[979,979],"mapped",[973]],[[980,980],"mapped",[971]],[[981,981],"mapped",[966]],[[982,982],"mapped",[960]],[[983,983],"valid"],[[984,984],"mapped",[985]],[[985,985],"valid"],[[986,986],"mapped",[987]],[[987,987],"valid"],[[988,988],"mapped",[989]],[[989,989],"valid"],[[990,990],"mapped",[991]],[[991,991],"valid"],[[992,992],"mapped",[993]],[[993,993],"valid"],[[994,994],"mapped",[995]],[[995,995],"valid"],[[996,996],"mapped",[997]],[[997,997],"valid"],[[998,998],"mapped",[999]],[[999,999],"valid"],[[1000,1000],"mapped",[1001]],[[1001,1001],"valid"],[[1002,1002],"mapped",[1003]],[[1003,1003],"valid"],[[1004,1004],"mapped",[1005]],[[1005,1005],"valid"],[[1006,1006],"mapped",[1007]],[[1007,1007],"valid"],[[1008,1008],"mapped",[954]],[[1009,1009],"mapped",[961]],[[1010,1010],"mapped",[963]],[[1011,1011],"valid"],[[1012,1012],"mapped",[952]],[[1013,1013],"mapped",[949]],[[1014,1014],"valid",[],"NV8"],[[1015,1015],"mapped",[1016]],[[1016,1016],"valid"],[[1017,1017],"mapped",[963]],[[1018,1018],"mapped",[1019]],[[1019,1019],"valid"],[[1020,1020],"valid"],[[1021,1021],"mapped",[891]],[[1022,1022],"mapped",[892]],[[1023,1023],"mapped",[893]],[[1024,1024],"mapped",[1104]],[[1025,1025],"mapped",[1105]],[[1026,1026],"mapped",[1106]],[[1027,1027],"mapped",[1107]],[[1028,1028],"mapped",[1108]],[[1029,1029],"mapped",[1109]],[[1030,1030],"mapped",[1110]],[[1031,1031],"mapped",[1111]],[[1032,1032],"mapped",[1112]],[[1033,1033],"mapped",[1113]],[[1034,1034],"mapped",[1114]],[[1035,1035],"mapped",[1115]],[[1036,1036],"mapped",[1116]],[[1037,1037],"mapped",[1117]],[[1038,1038],"mapped",[1118]],[[1039,1039],"mapped",[1119]],[[1040,1040],"mapped",[1072]],[[1041,1041],"mapped",[1073]],[[1042,1042],"mapped",[1074]],[[1043,1043],"mapped",[1075]],[[1044,1044],"mapped",[1076]],[[1045,1045],"mapped",[1077]],[[1046,1046],"mapped",[1078]],[[1047,1047],"mapped",[1079]],[[1048,1048],"mapped",[1080]],[[1049,1049],"mapped",[1081]],[[1050,1050],"mapped",[1082]],[[1051,1051],"mapped",[1083]],[[1052,1052],"mapped",[1084]],[[1053,1053],"mapped",[1085]],[[1054,1054],"mapped",[1086]],[[1055,1055],"mapped",[1087]],[[1056,1056],"mapped",[1088]],[[1057,1057],"mapped",[1089]],[[1058,1058],"mapped",[1090]],[[1059,1059],"mapped",[1091]],[[1060,1060],"mapped",[1092]],[[1061,1061],"mapped",[1093]],[[1062,1062],"mapped",[1094]],[[1063,1063],"mapped",[1095]],[[1064,1064],"mapped",[1096]],[[1065,1065],"mapped",[1097]],[[1066,1066],"mapped",[1098]],[[1067,1067],"mapped",[1099]],[[1068,1068],"mapped",[1100]],[[1069,1069],"mapped",[1101]],[[1070,1070],"mapped",[1102]],[[1071,1071],"mapped",[1103]],[[1072,1103],"valid"],[[1104,1104],"valid"],[[1105,1116],"valid"],[[1117,1117],"valid"],[[1118,1119],"valid"],[[1120,1120],"mapped",[1121]],[[1121,1121],"valid"],[[1122,1122],"mapped",[1123]],[[1123,1123],"valid"],[[1124,1124],"mapped",[1125]],[[1125,1125],"valid"],[[1126,1126],"mapped",[1127]],[[1127,1127],"valid"],[[1128,1128],"mapped",[1129]],[[1129,1129],"valid"],[[1130,1130],"mapped",[1131]],[[1131,1131],"valid"],[[1132,1132],"mapped",[1133]],[[1133,1133],"valid"],[[1134,1134],"mapped",[1135]],[[1135,1135],"valid"],[[1136,1136],"mapped",[1137]],[[1137,1137],"valid"],[[1138,1138],"mapped",[1139]],[[1139,1139],"valid"],[[1140,1140],"mapped",[1141]],[[1141,1141],"valid"],[[1142,1142],"mapped",[1143]],[[1143,1143],"valid"],[[1144,1144],"mapped",[1145]],[[1145,1145],"valid"],[[1146,1146],"mapped",[1147]],[[1147,1147],"valid"],[[1148,1148],"mapped",[1149]],[[1149,1149],"valid"],[[1150,1150],"mapped",[1151]],[[1151,1151],"valid"],[[1152,1152],"mapped",[1153]],[[1153,1153],"valid"],[[1154,1154],"valid",[],"NV8"],[[1155,1158],"valid"],[[1159,1159],"valid"],[[1160,1161],"valid",[],"NV8"],[[1162,1162],"mapped",[1163]],[[1163,1163],"valid"],[[1164,1164],"mapped",[1165]],[[1165,1165],"valid"],[[1166,1166],"mapped",[1167]],[[1167,1167],"valid"],[[1168,1168],"mapped",[1169]],[[1169,1169],"valid"],[[1170,1170],"mapped",[1171]],[[1171,1171],"valid"],[[1172,1172],"mapped",[1173]],[[1173,1173],"valid"],[[1174,1174],"mapped",[1175]],[[1175,1175],"valid"],[[1176,1176],"mapped",[1177]],[[1177,1177],"valid"],[[1178,1178],"mapped",[1179]],[[1179,1179],"valid"],[[1180,1180],"mapped",[1181]],[[1181,1181],"valid"],[[1182,1182],"mapped",[1183]],[[1183,1183],"valid"],[[1184,1184],"mapped",[1185]],[[1185,1185],"valid"],[[1186,1186],"mapped",[1187]],[[1187,1187],"valid"],[[1188,1188],"mapped",[1189]],[[1189,1189],"valid"],[[1190,1190],"mapped",[1191]],[[1191,1191],"valid"],[[1192,1192],"mapped",[1193]],[[1193,1193],"valid"],[[1194,1194],"mapped",[1195]],[[1195,1195],"valid"],[[1196,1196],"mapped",[1197]],[[1197,1197],"valid"],[[1198,1198],"mapped",[1199]],[[1199,1199],"valid"],[[1200,1200],"mapped",[1201]],[[1201,1201],"valid"],[[1202,1202],"mapped",[1203]],[[1203,1203],"valid"],[[1204,1204],"mapped",[1205]],[[1205,1205],"valid"],[[1206,1206],"mapped",[1207]],[[1207,1207],"valid"],[[1208,1208],"mapped",[1209]],[[1209,1209],"valid"],[[1210,1210],"mapped",[1211]],[[1211,1211],"valid"],[[1212,1212],"mapped",[1213]],[[1213,1213],"valid"],[[1214,1214],"mapped",[1215]],[[1215,1215],"valid"],[[1216,1216],"disallowed"],[[1217,1217],"mapped",[1218]],[[1218,1218],"valid"],[[1219,1219],"mapped",[1220]],[[1220,1220],"valid"],[[1221,1221],"mapped",[1222]],[[1222,1222],"valid"],[[1223,1223],"mapped",[1224]],[[1224,1224],"valid"],[[1225,1225],"mapped",[1226]],[[1226,1226],"valid"],[[1227,1227],"mapped",[1228]],[[1228,1228],"valid"],[[1229,1229],"mapped",[1230]],[[1230,1230],"valid"],[[1231,1231],"valid"],[[1232,1232],"mapped",[1233]],[[1233,1233],"valid"],[[1234,1234],"mapped",[1235]],[[1235,1235],"valid"],[[1236,1236],"mapped",[1237]],[[1237,1237],"valid"],[[1238,1238],"mapped",[1239]],[[1239,1239],"valid"],[[1240,1240],"mapped",[1241]],[[1241,1241],"valid"],[[1242,1242],"mapped",[1243]],[[1243,1243],"valid"],[[1244,1244],"mapped",[1245]],[[1245,1245],"valid"],[[1246,1246],"mapped",[1247]],[[1247,1247],"valid"],[[1248,1248],"mapped",[1249]],[[1249,1249],"valid"],[[1250,1250],"mapped",[1251]],[[1251,1251],"valid"],[[1252,1252],"mapped",[1253]],[[1253,1253],"valid"],[[1254,1254],"mapped",[1255]],[[1255,1255],"valid"],[[1256,1256],"mapped",[1257]],[[1257,1257],"valid"],[[1258,1258],"mapped",[1259]],[[1259,1259],"valid"],[[1260,1260],"mapped",[1261]],[[1261,1261],"valid"],[[1262,1262],"mapped",[1263]],[[1263,1263],"valid"],[[1264,1264],"mapped",[1265]],[[1265,1265],"valid"],[[1266,1266],"mapped",[1267]],[[1267,1267],"valid"],[[1268,1268],"mapped",[1269]],[[1269,1269],"valid"],[[1270,1270],"mapped",[1271]],[[1271,1271],"valid"],[[1272,1272],"mapped",[1273]],[[1273,1273],"valid"],[[1274,1274],"mapped",[1275]],[[1275,1275],"valid"],[[1276,1276],"mapped",[1277]],[[1277,1277],"valid"],[[1278,1278],"mapped",[1279]],[[1279,1279],"valid"],[[1280,1280],"mapped",[1281]],[[1281,1281],"valid"],[[1282,1282],"mapped",[1283]],[[1283,1283],"valid"],[[1284,1284],"mapped",[1285]],[[1285,1285],"valid"],[[1286,1286],"mapped",[1287]],[[1287,1287],"valid"],[[1288,1288],"mapped",[1289]],[[1289,1289],"valid"],[[1290,1290],"mapped",[1291]],[[1291,1291],"valid"],[[1292,1292],"mapped",[1293]],[[1293,1293],"valid"],[[1294,1294],"mapped",[1295]],[[1295,1295],"valid"],[[1296,1296],"mapped",[1297]],[[1297,1297],"valid"],[[1298,1298],"mapped",[1299]],[[1299,1299],"valid"],[[1300,1300],"mapped",[1301]],[[1301,1301],"valid"],[[1302,1302],"mapped",[1303]],[[1303,1303],"valid"],[[1304,1304],"mapped",[1305]],[[1305,1305],"valid"],[[1306,1306],"mapped",[1307]],[[1307,1307],"valid"],[[1308,1308],"mapped",[1309]],[[1309,1309],"valid"],[[1310,1310],"mapped",[1311]],[[1311,1311],"valid"],[[1312,1312],"mapped",[1313]],[[1313,1313],"valid"],[[1314,1314],"mapped",[1315]],[[1315,1315],"valid"],[[1316,1316],"mapped",[1317]],[[1317,1317],"valid"],[[1318,1318],"mapped",[1319]],[[1319,1319],"valid"],[[1320,1320],"mapped",[1321]],[[1321,1321],"valid"],[[1322,1322],"mapped",[1323]],[[1323,1323],"valid"],[[1324,1324],"mapped",[1325]],[[1325,1325],"valid"],[[1326,1326],"mapped",[1327]],[[1327,1327],"valid"],[[1328,1328],"disallowed"],[[1329,1329],"mapped",[1377]],[[1330,1330],"mapped",[1378]],[[1331,1331],"mapped",[1379]],[[1332,1332],"mapped",[1380]],[[1333,1333],"mapped",[1381]],[[1334,1334],"mapped",[1382]],[[1335,1335],"mapped",[1383]],[[1336,1336],"mapped",[1384]],[[1337,1337],"mapped",[1385]],[[1338,1338],"mapped",[1386]],[[1339,1339],"mapped",[1387]],[[1340,1340],"mapped",[1388]],[[1341,1341],"mapped",[1389]],[[1342,1342],"mapped",[1390]],[[1343,1343],"mapped",[1391]],[[1344,1344],"mapped",[1392]],[[1345,1345],"mapped",[1393]],[[1346,1346],"mapped",[1394]],[[1347,1347],"mapped",[1395]],[[1348,1348],"mapped",[1396]],[[1349,1349],"mapped",[1397]],[[1350,1350],"mapped",[1398]],[[1351,1351],"mapped",[1399]],[[1352,1352],"mapped",[1400]],[[1353,1353],"mapped",[1401]],[[1354,1354],"mapped",[1402]],[[1355,1355],"mapped",[1403]],[[1356,1356],"mapped",[1404]],[[1357,1357],"mapped",[1405]],[[1358,1358],"mapped",[1406]],[[1359,1359],"mapped",[1407]],[[1360,1360],"mapped",[1408]],[[1361,1361],"mapped",[1409]],[[1362,1362],"mapped",[1410]],[[1363,1363],"mapped",[1411]],[[1364,1364],"mapped",[1412]],[[1365,1365],"mapped",[1413]],[[1366,1366],"mapped",[1414]],[[1367,1368],"disallowed"],[[1369,1369],"valid"],[[1370,1375],"valid",[],"NV8"],[[1376,1376],"disallowed"],[[1377,1414],"valid"],[[1415,1415],"mapped",[1381,1410]],[[1416,1416],"disallowed"],[[1417,1417],"valid",[],"NV8"],[[1418,1418],"valid",[],"NV8"],[[1419,1420],"disallowed"],[[1421,1422],"valid",[],"NV8"],[[1423,1423],"valid",[],"NV8"],[[1424,1424],"disallowed"],[[1425,1441],"valid"],[[1442,1442],"valid"],[[1443,1455],"valid"],[[1456,1465],"valid"],[[1466,1466],"valid"],[[1467,1469],"valid"],[[1470,1470],"valid",[],"NV8"],[[1471,1471],"valid"],[[1472,1472],"valid",[],"NV8"],[[1473,1474],"valid"],[[1475,1475],"valid",[],"NV8"],[[1476,1476],"valid"],[[1477,1477],"valid"],[[1478,1478],"valid",[],"NV8"],[[1479,1479],"valid"],[[1480,1487],"disallowed"],[[1488,1514],"valid"],[[1515,1519],"disallowed"],[[1520,1524],"valid"],[[1525,1535],"disallowed"],[[1536,1539],"disallowed"],[[1540,1540],"disallowed"],[[1541,1541],"disallowed"],[[1542,1546],"valid",[],"NV8"],[[1547,1547],"valid",[],"NV8"],[[1548,1548],"valid",[],"NV8"],[[1549,1551],"valid",[],"NV8"],[[1552,1557],"valid"],[[1558,1562],"valid"],[[1563,1563],"valid",[],"NV8"],[[1564,1564],"disallowed"],[[1565,1565],"disallowed"],[[1566,1566],"valid",[],"NV8"],[[1567,1567],"valid",[],"NV8"],[[1568,1568],"valid"],[[1569,1594],"valid"],[[1595,1599],"valid"],[[1600,1600],"valid",[],"NV8"],[[1601,1618],"valid"],[[1619,1621],"valid"],[[1622,1624],"valid"],[[1625,1630],"valid"],[[1631,1631],"valid"],[[1632,1641],"valid"],[[1642,1645],"valid",[],"NV8"],[[1646,1647],"valid"],[[1648,1652],"valid"],[[1653,1653],"mapped",[1575,1652]],[[1654,1654],"mapped",[1608,1652]],[[1655,1655],"mapped",[1735,1652]],[[1656,1656],"mapped",[1610,1652]],[[1657,1719],"valid"],[[1720,1721],"valid"],[[1722,1726],"valid"],[[1727,1727],"valid"],[[1728,1742],"valid"],[[1743,1743],"valid"],[[1744,1747],"valid"],[[1748,1748],"valid",[],"NV8"],[[1749,1756],"valid"],[[1757,1757],"disallowed"],[[1758,1758],"valid",[],"NV8"],[[1759,1768],"valid"],[[1769,1769],"valid",[],"NV8"],[[1770,1773],"valid"],[[1774,1775],"valid"],[[1776,1785],"valid"],[[1786,1790],"valid"],[[1791,1791],"valid"],[[1792,1805],"valid",[],"NV8"],[[1806,1806],"disallowed"],[[1807,1807],"disallowed"],[[1808,1836],"valid"],[[1837,1839],"valid"],[[1840,1866],"valid"],[[1867,1868],"disallowed"],[[1869,1871],"valid"],[[1872,1901],"valid"],[[1902,1919],"valid"],[[1920,1968],"valid"],[[1969,1969],"valid"],[[1970,1983],"disallowed"],[[1984,2037],"valid"],[[2038,2042],"valid",[],"NV8"],[[2043,2047],"disallowed"],[[2048,2093],"valid"],[[2094,2095],"disallowed"],[[2096,2110],"valid",[],"NV8"],[[2111,2111],"disallowed"],[[2112,2139],"valid"],[[2140,2141],"disallowed"],[[2142,2142],"valid",[],"NV8"],[[2143,2207],"disallowed"],[[2208,2208],"valid"],[[2209,2209],"valid"],[[2210,2220],"valid"],[[2221,2226],"valid"],[[2227,2228],"valid"],[[2229,2274],"disallowed"],[[2275,2275],"valid"],[[2276,2302],"valid"],[[2303,2303],"valid"],[[2304,2304],"valid"],[[2305,2307],"valid"],[[2308,2308],"valid"],[[2309,2361],"valid"],[[2362,2363],"valid"],[[2364,2381],"valid"],[[2382,2382],"valid"],[[2383,2383],"valid"],[[2384,2388],"valid"],[[2389,2389],"valid"],[[2390,2391],"valid"],[[2392,2392],"mapped",[2325,2364]],[[2393,2393],"mapped",[2326,2364]],[[2394,2394],"mapped",[2327,2364]],[[2395,2395],"mapped",[2332,2364]],[[2396,2396],"mapped",[2337,2364]],[[2397,2397],"mapped",[2338,2364]],[[2398,2398],"mapped",[2347,2364]],[[2399,2399],"mapped",[2351,2364]],[[2400,2403],"valid"],[[2404,2405],"valid",[],"NV8"],[[2406,2415],"valid"],[[2416,2416],"valid",[],"NV8"],[[2417,2418],"valid"],[[2419,2423],"valid"],[[2424,2424],"valid"],[[2425,2426],"valid"],[[2427,2428],"valid"],[[2429,2429],"valid"],[[2430,2431],"valid"],[[2432,2432],"valid"],[[2433,2435],"valid"],[[2436,2436],"disallowed"],[[2437,2444],"valid"],[[2445,2446],"disallowed"],[[2447,2448],"valid"],[[2449,2450],"disallowed"],[[2451,2472],"valid"],[[2473,2473],"disallowed"],[[2474,2480],"valid"],[[2481,2481],"disallowed"],[[2482,2482],"valid"],[[2483,2485],"disallowed"],[[2486,2489],"valid"],[[2490,2491],"disallowed"],[[2492,2492],"valid"],[[2493,2493],"valid"],[[2494,2500],"valid"],[[2501,2502],"disallowed"],[[2503,2504],"valid"],[[2505,2506],"disallowed"],[[2507,2509],"valid"],[[2510,2510],"valid"],[[2511,2518],"disallowed"],[[2519,2519],"valid"],[[2520,2523],"disallowed"],[[2524,2524],"mapped",[2465,2492]],[[2525,2525],"mapped",[2466,2492]],[[2526,2526],"disallowed"],[[2527,2527],"mapped",[2479,2492]],[[2528,2531],"valid"],[[2532,2533],"disallowed"],[[2534,2545],"valid"],[[2546,2554],"valid",[],"NV8"],[[2555,2555],"valid",[],"NV8"],[[2556,2560],"disallowed"],[[2561,2561],"valid"],[[2562,2562],"valid"],[[2563,2563],"valid"],[[2564,2564],"disallowed"],[[2565,2570],"valid"],[[2571,2574],"disallowed"],[[2575,2576],"valid"],[[2577,2578],"disallowed"],[[2579,2600],"valid"],[[2601,2601],"disallowed"],[[2602,2608],"valid"],[[2609,2609],"disallowed"],[[2610,2610],"valid"],[[2611,2611],"mapped",[2610,2620]],[[2612,2612],"disallowed"],[[2613,2613],"valid"],[[2614,2614],"mapped",[2616,2620]],[[2615,2615],"disallowed"],[[2616,2617],"valid"],[[2618,2619],"disallowed"],[[2620,2620],"valid"],[[2621,2621],"disallowed"],[[2622,2626],"valid"],[[2627,2630],"disallowed"],[[2631,2632],"valid"],[[2633,2634],"disallowed"],[[2635,2637],"valid"],[[2638,2640],"disallowed"],[[2641,2641],"valid"],[[2642,2648],"disallowed"],[[2649,2649],"mapped",[2582,2620]],[[2650,2650],"mapped",[2583,2620]],[[2651,2651],"mapped",[2588,2620]],[[2652,2652],"valid"],[[2653,2653],"disallowed"],[[2654,2654],"mapped",[2603,2620]],[[2655,2661],"disallowed"],[[2662,2676],"valid"],[[2677,2677],"valid"],[[2678,2688],"disallowed"],[[2689,2691],"valid"],[[2692,2692],"disallowed"],[[2693,2699],"valid"],[[2700,2700],"valid"],[[2701,2701],"valid"],[[2702,2702],"disallowed"],[[2703,2705],"valid"],[[2706,2706],"disallowed"],[[2707,2728],"valid"],[[2729,2729],"disallowed"],[[2730,2736],"valid"],[[2737,2737],"disallowed"],[[2738,2739],"valid"],[[2740,2740],"disallowed"],[[2741,2745],"valid"],[[2746,2747],"disallowed"],[[2748,2757],"valid"],[[2758,2758],"disallowed"],[[2759,2761],"valid"],[[2762,2762],"disallowed"],[[2763,2765],"valid"],[[2766,2767],"disallowed"],[[2768,2768],"valid"],[[2769,2783],"disallowed"],[[2784,2784],"valid"],[[2785,2787],"valid"],[[2788,2789],"disallowed"],[[2790,2799],"valid"],[[2800,2800],"valid",[],"NV8"],[[2801,2801],"valid",[],"NV8"],[[2802,2808],"disallowed"],[[2809,2809],"valid"],[[2810,2816],"disallowed"],[[2817,2819],"valid"],[[2820,2820],"disallowed"],[[2821,2828],"valid"],[[2829,2830],"disallowed"],[[2831,2832],"valid"],[[2833,2834],"disallowed"],[[2835,2856],"valid"],[[2857,2857],"disallowed"],[[2858,2864],"valid"],[[2865,2865],"disallowed"],[[2866,2867],"valid"],[[2868,2868],"disallowed"],[[2869,2869],"valid"],[[2870,2873],"valid"],[[2874,2875],"disallowed"],[[2876,2883],"valid"],[[2884,2884],"valid"],[[2885,2886],"disallowed"],[[2887,2888],"valid"],[[2889,2890],"disallowed"],[[2891,2893],"valid"],[[2894,2901],"disallowed"],[[2902,2903],"valid"],[[2904,2907],"disallowed"],[[2908,2908],"mapped",[2849,2876]],[[2909,2909],"mapped",[2850,2876]],[[2910,2910],"disallowed"],[[2911,2913],"valid"],[[2914,2915],"valid"],[[2916,2917],"disallowed"],[[2918,2927],"valid"],[[2928,2928],"valid",[],"NV8"],[[2929,2929],"valid"],[[2930,2935],"valid",[],"NV8"],[[2936,2945],"disallowed"],[[2946,2947],"valid"],[[2948,2948],"disallowed"],[[2949,2954],"valid"],[[2955,2957],"disallowed"],[[2958,2960],"valid"],[[2961,2961],"disallowed"],[[2962,2965],"valid"],[[2966,2968],"disallowed"],[[2969,2970],"valid"],[[2971,2971],"disallowed"],[[2972,2972],"valid"],[[2973,2973],"disallowed"],[[2974,2975],"valid"],[[2976,2978],"disallowed"],[[2979,2980],"valid"],[[2981,2983],"disallowed"],[[2984,2986],"valid"],[[2987,2989],"disallowed"],[[2990,2997],"valid"],[[2998,2998],"valid"],[[2999,3001],"valid"],[[3002,3005],"disallowed"],[[3006,3010],"valid"],[[3011,3013],"disallowed"],[[3014,3016],"valid"],[[3017,3017],"disallowed"],[[3018,3021],"valid"],[[3022,3023],"disallowed"],[[3024,3024],"valid"],[[3025,3030],"disallowed"],[[3031,3031],"valid"],[[3032,3045],"disallowed"],[[3046,3046],"valid"],[[3047,3055],"valid"],[[3056,3058],"valid",[],"NV8"],[[3059,3066],"valid",[],"NV8"],[[3067,3071],"disallowed"],[[3072,3072],"valid"],[[3073,3075],"valid"],[[3076,3076],"disallowed"],[[3077,3084],"valid"],[[3085,3085],"disallowed"],[[3086,3088],"valid"],[[3089,3089],"disallowed"],[[3090,3112],"valid"],[[3113,3113],"disallowed"],[[3114,3123],"valid"],[[3124,3124],"valid"],[[3125,3129],"valid"],[[3130,3132],"disallowed"],[[3133,3133],"valid"],[[3134,3140],"valid"],[[3141,3141],"disallowed"],[[3142,3144],"valid"],[[3145,3145],"disallowed"],[[3146,3149],"valid"],[[3150,3156],"disallowed"],[[3157,3158],"valid"],[[3159,3159],"disallowed"],[[3160,3161],"valid"],[[3162,3162],"valid"],[[3163,3167],"disallowed"],[[3168,3169],"valid"],[[3170,3171],"valid"],[[3172,3173],"disallowed"],[[3174,3183],"valid"],[[3184,3191],"disallowed"],[[3192,3199],"valid",[],"NV8"],[[3200,3200],"disallowed"],[[3201,3201],"valid"],[[3202,3203],"valid"],[[3204,3204],"disallowed"],[[3205,3212],"valid"],[[3213,3213],"disallowed"],[[3214,3216],"valid"],[[3217,3217],"disallowed"],[[3218,3240],"valid"],[[3241,3241],"disallowed"],[[3242,3251],"valid"],[[3252,3252],"disallowed"],[[3253,3257],"valid"],[[3258,3259],"disallowed"],[[3260,3261],"valid"],[[3262,3268],"valid"],[[3269,3269],"disallowed"],[[3270,3272],"valid"],[[3273,3273],"disallowed"],[[3274,3277],"valid"],[[3278,3284],"disallowed"],[[3285,3286],"valid"],[[3287,3293],"disallowed"],[[3294,3294],"valid"],[[3295,3295],"disallowed"],[[3296,3297],"valid"],[[3298,3299],"valid"],[[3300,3301],"disallowed"],[[3302,3311],"valid"],[[3312,3312],"disallowed"],[[3313,3314],"valid"],[[3315,3328],"disallowed"],[[3329,3329],"valid"],[[3330,3331],"valid"],[[3332,3332],"disallowed"],[[3333,3340],"valid"],[[3341,3341],"disallowed"],[[3342,3344],"valid"],[[3345,3345],"disallowed"],[[3346,3368],"valid"],[[3369,3369],"valid"],[[3370,3385],"valid"],[[3386,3386],"valid"],[[3387,3388],"disallowed"],[[3389,3389],"valid"],[[3390,3395],"valid"],[[3396,3396],"valid"],[[3397,3397],"disallowed"],[[3398,3400],"valid"],[[3401,3401],"disallowed"],[[3402,3405],"valid"],[[3406,3406],"valid"],[[3407,3414],"disallowed"],[[3415,3415],"valid"],[[3416,3422],"disallowed"],[[3423,3423],"valid"],[[3424,3425],"valid"],[[3426,3427],"valid"],[[3428,3429],"disallowed"],[[3430,3439],"valid"],[[3440,3445],"valid",[],"NV8"],[[3446,3448],"disallowed"],[[3449,3449],"valid",[],"NV8"],[[3450,3455],"valid"],[[3456,3457],"disallowed"],[[3458,3459],"valid"],[[3460,3460],"disallowed"],[[3461,3478],"valid"],[[3479,3481],"disallowed"],[[3482,3505],"valid"],[[3506,3506],"disallowed"],[[3507,3515],"valid"],[[3516,3516],"disallowed"],[[3517,3517],"valid"],[[3518,3519],"disallowed"],[[3520,3526],"valid"],[[3527,3529],"disallowed"],[[3530,3530],"valid"],[[3531,3534],"disallowed"],[[3535,3540],"valid"],[[3541,3541],"disallowed"],[[3542,3542],"valid"],[[3543,3543],"disallowed"],[[3544,3551],"valid"],[[3552,3557],"disallowed"],[[3558,3567],"valid"],[[3568,3569],"disallowed"],[[3570,3571],"valid"],[[3572,3572],"valid",[],"NV8"],[[3573,3584],"disallowed"],[[3585,3634],"valid"],[[3635,3635],"mapped",[3661,3634]],[[3636,3642],"valid"],[[3643,3646],"disallowed"],[[3647,3647],"valid",[],"NV8"],[[3648,3662],"valid"],[[3663,3663],"valid",[],"NV8"],[[3664,3673],"valid"],[[3674,3675],"valid",[],"NV8"],[[3676,3712],"disallowed"],[[3713,3714],"valid"],[[3715,3715],"disallowed"],[[3716,3716],"valid"],[[3717,3718],"disallowed"],[[3719,3720],"valid"],[[3721,3721],"disallowed"],[[3722,3722],"valid"],[[3723,3724],"disallowed"],[[3725,3725],"valid"],[[3726,3731],"disallowed"],[[3732,3735],"valid"],[[3736,3736],"disallowed"],[[3737,3743],"valid"],[[3744,3744],"disallowed"],[[3745,3747],"valid"],[[3748,3748],"disallowed"],[[3749,3749],"valid"],[[3750,3750],"disallowed"],[[3751,3751],"valid"],[[3752,3753],"disallowed"],[[3754,3755],"valid"],[[3756,3756],"disallowed"],[[3757,3762],"valid"],[[3763,3763],"mapped",[3789,3762]],[[3764,3769],"valid"],[[3770,3770],"disallowed"],[[3771,3773],"valid"],[[3774,3775],"disallowed"],[[3776,3780],"valid"],[[3781,3781],"disallowed"],[[3782,3782],"valid"],[[3783,3783],"disallowed"],[[3784,3789],"valid"],[[3790,3791],"disallowed"],[[3792,3801],"valid"],[[3802,3803],"disallowed"],[[3804,3804],"mapped",[3755,3737]],[[3805,3805],"mapped",[3755,3745]],[[3806,3807],"valid"],[[3808,3839],"disallowed"],[[3840,3840],"valid"],[[3841,3850],"valid",[],"NV8"],[[3851,3851],"valid"],[[3852,3852],"mapped",[3851]],[[3853,3863],"valid",[],"NV8"],[[3864,3865],"valid"],[[3866,3871],"valid",[],"NV8"],[[3872,3881],"valid"],[[3882,3892],"valid",[],"NV8"],[[3893,3893],"valid"],[[3894,3894],"valid",[],"NV8"],[[3895,3895],"valid"],[[3896,3896],"valid",[],"NV8"],[[3897,3897],"valid"],[[3898,3901],"valid",[],"NV8"],[[3902,3906],"valid"],[[3907,3907],"mapped",[3906,4023]],[[3908,3911],"valid"],[[3912,3912],"disallowed"],[[3913,3916],"valid"],[[3917,3917],"mapped",[3916,4023]],[[3918,3921],"valid"],[[3922,3922],"mapped",[3921,4023]],[[3923,3926],"valid"],[[3927,3927],"mapped",[3926,4023]],[[3928,3931],"valid"],[[3932,3932],"mapped",[3931,4023]],[[3933,3944],"valid"],[[3945,3945],"mapped",[3904,4021]],[[3946,3946],"valid"],[[3947,3948],"valid"],[[3949,3952],"disallowed"],[[3953,3954],"valid"],[[3955,3955],"mapped",[3953,3954]],[[3956,3956],"valid"],[[3957,3957],"mapped",[3953,3956]],[[3958,3958],"mapped",[4018,3968]],[[3959,3959],"mapped",[4018,3953,3968]],[[3960,3960],"mapped",[4019,3968]],[[3961,3961],"mapped",[4019,3953,3968]],[[3962,3968],"valid"],[[3969,3969],"mapped",[3953,3968]],[[3970,3972],"valid"],[[3973,3973],"valid",[],"NV8"],[[3974,3979],"valid"],[[3980,3983],"valid"],[[3984,3986],"valid"],[[3987,3987],"mapped",[3986,4023]],[[3988,3989],"valid"],[[3990,3990],"valid"],[[3991,3991],"valid"],[[3992,3992],"disallowed"],[[3993,3996],"valid"],[[3997,3997],"mapped",[3996,4023]],[[3998,4001],"valid"],[[4002,4002],"mapped",[4001,4023]],[[4003,4006],"valid"],[[4007,4007],"mapped",[4006,4023]],[[4008,4011],"valid"],[[4012,4012],"mapped",[4011,4023]],[[4013,4013],"valid"],[[4014,4016],"valid"],[[4017,4023],"valid"],[[4024,4024],"valid"],[[4025,4025],"mapped",[3984,4021]],[[4026,4028],"valid"],[[4029,4029],"disallowed"],[[4030,4037],"valid",[],"NV8"],[[4038,4038],"valid"],[[4039,4044],"valid",[],"NV8"],[[4045,4045],"disallowed"],[[4046,4046],"valid",[],"NV8"],[[4047,4047],"valid",[],"NV8"],[[4048,4049],"valid",[],"NV8"],[[4050,4052],"valid",[],"NV8"],[[4053,4056],"valid",[],"NV8"],[[4057,4058],"valid",[],"NV8"],[[4059,4095],"disallowed"],[[4096,4129],"valid"],[[4130,4130],"valid"],[[4131,4135],"valid"],[[4136,4136],"valid"],[[4137,4138],"valid"],[[4139,4139],"valid"],[[4140,4146],"valid"],[[4147,4149],"valid"],[[4150,4153],"valid"],[[4154,4159],"valid"],[[4160,4169],"valid"],[[4170,4175],"valid",[],"NV8"],[[4176,4185],"valid"],[[4186,4249],"valid"],[[4250,4253],"valid"],[[4254,4255],"valid",[],"NV8"],[[4256,4293],"disallowed"],[[4294,4294],"disallowed"],[[4295,4295],"mapped",[11559]],[[4296,4300],"disallowed"],[[4301,4301],"mapped",[11565]],[[4302,4303],"disallowed"],[[4304,4342],"valid"],[[4343,4344],"valid"],[[4345,4346],"valid"],[[4347,4347],"valid",[],"NV8"],[[4348,4348],"mapped",[4316]],[[4349,4351],"valid"],[[4352,4441],"valid",[],"NV8"],[[4442,4446],"valid",[],"NV8"],[[4447,4448],"disallowed"],[[4449,4514],"valid",[],"NV8"],[[4515,4519],"valid",[],"NV8"],[[4520,4601],"valid",[],"NV8"],[[4602,4607],"valid",[],"NV8"],[[4608,4614],"valid"],[[4615,4615],"valid"],[[4616,4678],"valid"],[[4679,4679],"valid"],[[4680,4680],"valid"],[[4681,4681],"disallowed"],[[4682,4685],"valid"],[[4686,4687],"disallowed"],[[4688,4694],"valid"],[[4695,4695],"disallowed"],[[4696,4696],"valid"],[[4697,4697],"disallowed"],[[4698,4701],"valid"],[[4702,4703],"disallowed"],[[4704,4742],"valid"],[[4743,4743],"valid"],[[4744,4744],"valid"],[[4745,4745],"disallowed"],[[4746,4749],"valid"],[[4750,4751],"disallowed"],[[4752,4782],"valid"],[[4783,4783],"valid"],[[4784,4784],"valid"],[[4785,4785],"disallowed"],[[4786,4789],"valid"],[[4790,4791],"disallowed"],[[4792,4798],"valid"],[[4799,4799],"disallowed"],[[4800,4800],"valid"],[[4801,4801],"disallowed"],[[4802,4805],"valid"],[[4806,4807],"disallowed"],[[4808,4814],"valid"],[[4815,4815],"valid"],[[4816,4822],"valid"],[[4823,4823],"disallowed"],[[4824,4846],"valid"],[[4847,4847],"valid"],[[4848,4878],"valid"],[[4879,4879],"valid"],[[4880,4880],"valid"],[[4881,4881],"disallowed"],[[4882,4885],"valid"],[[4886,4887],"disallowed"],[[4888,4894],"valid"],[[4895,4895],"valid"],[[4896,4934],"valid"],[[4935,4935],"valid"],[[4936,4954],"valid"],[[4955,4956],"disallowed"],[[4957,4958],"valid"],[[4959,4959],"valid"],[[4960,4960],"valid",[],"NV8"],[[4961,4988],"valid",[],"NV8"],[[4989,4991],"disallowed"],[[4992,5007],"valid"],[[5008,5017],"valid",[],"NV8"],[[5018,5023],"disallowed"],[[5024,5108],"valid"],[[5109,5109],"valid"],[[5110,5111],"disallowed"],[[5112,5112],"mapped",[5104]],[[5113,5113],"mapped",[5105]],[[5114,5114],"mapped",[5106]],[[5115,5115],"mapped",[5107]],[[5116,5116],"mapped",[5108]],[[5117,5117],"mapped",[5109]],[[5118,5119],"disallowed"],[[5120,5120],"valid",[],"NV8"],[[5121,5740],"valid"],[[5741,5742],"valid",[],"NV8"],[[5743,5750],"valid"],[[5751,5759],"valid"],[[5760,5760],"disallowed"],[[5761,5786],"valid"],[[5787,5788],"valid",[],"NV8"],[[5789,5791],"disallowed"],[[5792,5866],"valid"],[[5867,5872],"valid",[],"NV8"],[[5873,5880],"valid"],[[5881,5887],"disallowed"],[[5888,5900],"valid"],[[5901,5901],"disallowed"],[[5902,5908],"valid"],[[5909,5919],"disallowed"],[[5920,5940],"valid"],[[5941,5942],"valid",[],"NV8"],[[5943,5951],"disallowed"],[[5952,5971],"valid"],[[5972,5983],"disallowed"],[[5984,5996],"valid"],[[5997,5997],"disallowed"],[[5998,6000],"valid"],[[6001,6001],"disallowed"],[[6002,6003],"valid"],[[6004,6015],"disallowed"],[[6016,6067],"valid"],[[6068,6069],"disallowed"],[[6070,6099],"valid"],[[6100,6102],"valid",[],"NV8"],[[6103,6103],"valid"],[[6104,6107],"valid",[],"NV8"],[[6108,6108],"valid"],[[6109,6109],"valid"],[[6110,6111],"disallowed"],[[6112,6121],"valid"],[[6122,6127],"disallowed"],[[6128,6137],"valid",[],"NV8"],[[6138,6143],"disallowed"],[[6144,6149],"valid",[],"NV8"],[[6150,6150],"disallowed"],[[6151,6154],"valid",[],"NV8"],[[6155,6157],"ignored"],[[6158,6158],"disallowed"],[[6159,6159],"disallowed"],[[6160,6169],"valid"],[[6170,6175],"disallowed"],[[6176,6263],"valid"],[[6264,6271],"disallowed"],[[6272,6313],"valid"],[[6314,6314],"valid"],[[6315,6319],"disallowed"],[[6320,6389],"valid"],[[6390,6399],"disallowed"],[[6400,6428],"valid"],[[6429,6430],"valid"],[[6431,6431],"disallowed"],[[6432,6443],"valid"],[[6444,6447],"disallowed"],[[6448,6459],"valid"],[[6460,6463],"disallowed"],[[6464,6464],"valid",[],"NV8"],[[6465,6467],"disallowed"],[[6468,6469],"valid",[],"NV8"],[[6470,6509],"valid"],[[6510,6511],"disallowed"],[[6512,6516],"valid"],[[6517,6527],"disallowed"],[[6528,6569],"valid"],[[6570,6571],"valid"],[[6572,6575],"disallowed"],[[6576,6601],"valid"],[[6602,6607],"disallowed"],[[6608,6617],"valid"],[[6618,6618],"valid",[],"XV8"],[[6619,6621],"disallowed"],[[6622,6623],"valid",[],"NV8"],[[6624,6655],"valid",[],"NV8"],[[6656,6683],"valid"],[[6684,6685],"disallowed"],[[6686,6687],"valid",[],"NV8"],[[6688,6750],"valid"],[[6751,6751],"disallowed"],[[6752,6780],"valid"],[[6781,6782],"disallowed"],[[6783,6793],"valid"],[[6794,6799],"disallowed"],[[6800,6809],"valid"],[[6810,6815],"disallowed"],[[6816,6822],"valid",[],"NV8"],[[6823,6823],"valid"],[[6824,6829],"valid",[],"NV8"],[[6830,6831],"disallowed"],[[6832,6845],"valid"],[[6846,6846],"valid",[],"NV8"],[[6847,6911],"disallowed"],[[6912,6987],"valid"],[[6988,6991],"disallowed"],[[6992,7001],"valid"],[[7002,7018],"valid",[],"NV8"],[[7019,7027],"valid"],[[7028,7036],"valid",[],"NV8"],[[7037,7039],"disallowed"],[[7040,7082],"valid"],[[7083,7085],"valid"],[[7086,7097],"valid"],[[7098,7103],"valid"],[[7104,7155],"valid"],[[7156,7163],"disallowed"],[[7164,7167],"valid",[],"NV8"],[[7168,7223],"valid"],[[7224,7226],"disallowed"],[[7227,7231],"valid",[],"NV8"],[[7232,7241],"valid"],[[7242,7244],"disallowed"],[[7245,7293],"valid"],[[7294,7295],"valid",[],"NV8"],[[7296,7359],"disallowed"],[[7360,7367],"valid",[],"NV8"],[[7368,7375],"disallowed"],[[7376,7378],"valid"],[[7379,7379],"valid",[],"NV8"],[[7380,7410],"valid"],[[7411,7414],"valid"],[[7415,7415],"disallowed"],[[7416,7417],"valid"],[[7418,7423],"disallowed"],[[7424,7467],"valid"],[[7468,7468],"mapped",[97]],[[7469,7469],"mapped",[230]],[[7470,7470],"mapped",[98]],[[7471,7471],"valid"],[[7472,7472],"mapped",[100]],[[7473,7473],"mapped",[101]],[[7474,7474],"mapped",[477]],[[7475,7475],"mapped",[103]],[[7476,7476],"mapped",[104]],[[7477,7477],"mapped",[105]],[[7478,7478],"mapped",[106]],[[7479,7479],"mapped",[107]],[[7480,7480],"mapped",[108]],[[7481,7481],"mapped",[109]],[[7482,7482],"mapped",[110]],[[7483,7483],"valid"],[[7484,7484],"mapped",[111]],[[7485,7485],"mapped",[547]],[[7486,7486],"mapped",[112]],[[7487,7487],"mapped",[114]],[[7488,7488],"mapped",[116]],[[7489,7489],"mapped",[117]],[[7490,7490],"mapped",[119]],[[7491,7491],"mapped",[97]],[[7492,7492],"mapped",[592]],[[7493,7493],"mapped",[593]],[[7494,7494],"mapped",[7426]],[[7495,7495],"mapped",[98]],[[7496,7496],"mapped",[100]],[[7497,7497],"mapped",[101]],[[7498,7498],"mapped",[601]],[[7499,7499],"mapped",[603]],[[7500,7500],"mapped",[604]],[[7501,7501],"mapped",[103]],[[7502,7502],"valid"],[[7503,7503],"mapped",[107]],[[7504,7504],"mapped",[109]],[[7505,7505],"mapped",[331]],[[7506,7506],"mapped",[111]],[[7507,7507],"mapped",[596]],[[7508,7508],"mapped",[7446]],[[7509,7509],"mapped",[7447]],[[7510,7510],"mapped",[112]],[[7511,7511],"mapped",[116]],[[7512,7512],"mapped",[117]],[[7513,7513],"mapped",[7453]],[[7514,7514],"mapped",[623]],[[7515,7515],"mapped",[118]],[[7516,7516],"mapped",[7461]],[[7517,7517],"mapped",[946]],[[7518,7518],"mapped",[947]],[[7519,7519],"mapped",[948]],[[7520,7520],"mapped",[966]],[[7521,7521],"mapped",[967]],[[7522,7522],"mapped",[105]],[[7523,7523],"mapped",[114]],[[7524,7524],"mapped",[117]],[[7525,7525],"mapped",[118]],[[7526,7526],"mapped",[946]],[[7527,7527],"mapped",[947]],[[7528,7528],"mapped",[961]],[[7529,7529],"mapped",[966]],[[7530,7530],"mapped",[967]],[[7531,7531],"valid"],[[7532,7543],"valid"],[[7544,7544],"mapped",[1085]],[[7545,7578],"valid"],[[7579,7579],"mapped",[594]],[[7580,7580],"mapped",[99]],[[7581,7581],"mapped",[597]],[[7582,7582],"mapped",[240]],[[7583,7583],"mapped",[604]],[[7584,7584],"mapped",[102]],[[7585,7585],"mapped",[607]],[[7586,7586],"mapped",[609]],[[7587,7587],"mapped",[613]],[[7588,7588],"mapped",[616]],[[7589,7589],"mapped",[617]],[[7590,7590],"mapped",[618]],[[7591,7591],"mapped",[7547]],[[7592,7592],"mapped",[669]],[[7593,7593],"mapped",[621]],[[7594,7594],"mapped",[7557]],[[7595,7595],"mapped",[671]],[[7596,7596],"mapped",[625]],[[7597,7597],"mapped",[624]],[[7598,7598],"mapped",[626]],[[7599,7599],"mapped",[627]],[[7600,7600],"mapped",[628]],[[7601,7601],"mapped",[629]],[[7602,7602],"mapped",[632]],[[7603,7603],"mapped",[642]],[[7604,7604],"mapped",[643]],[[7605,7605],"mapped",[427]],[[7606,7606],"mapped",[649]],[[7607,7607],"mapped",[650]],[[7608,7608],"mapped",[7452]],[[7609,7609],"mapped",[651]],[[7610,7610],"mapped",[652]],[[7611,7611],"mapped",[122]],[[7612,7612],"mapped",[656]],[[7613,7613],"mapped",[657]],[[7614,7614],"mapped",[658]],[[7615,7615],"mapped",[952]],[[7616,7619],"valid"],[[7620,7626],"valid"],[[7627,7654],"valid"],[[7655,7669],"valid"],[[7670,7675],"disallowed"],[[7676,7676],"valid"],[[7677,7677],"valid"],[[7678,7679],"valid"],[[7680,7680],"mapped",[7681]],[[7681,7681],"valid"],[[7682,7682],"mapped",[7683]],[[7683,7683],"valid"],[[7684,7684],"mapped",[7685]],[[7685,7685],"valid"],[[7686,7686],"mapped",[7687]],[[7687,7687],"valid"],[[7688,7688],"mapped",[7689]],[[7689,7689],"valid"],[[7690,7690],"mapped",[7691]],[[7691,7691],"valid"],[[7692,7692],"mapped",[7693]],[[7693,7693],"valid"],[[7694,7694],"mapped",[7695]],[[7695,7695],"valid"],[[7696,7696],"mapped",[7697]],[[7697,7697],"valid"],[[7698,7698],"mapped",[7699]],[[7699,7699],"valid"],[[7700,7700],"mapped",[7701]],[[7701,7701],"valid"],[[7702,7702],"mapped",[7703]],[[7703,7703],"valid"],[[7704,7704],"mapped",[7705]],[[7705,7705],"valid"],[[7706,7706],"mapped",[7707]],[[7707,7707],"valid"],[[7708,7708],"mapped",[7709]],[[7709,7709],"valid"],[[7710,7710],"mapped",[7711]],[[7711,7711],"valid"],[[7712,7712],"mapped",[7713]],[[7713,7713],"valid"],[[7714,7714],"mapped",[7715]],[[7715,7715],"valid"],[[7716,7716],"mapped",[7717]],[[7717,7717],"valid"],[[7718,7718],"mapped",[7719]],[[7719,7719],"valid"],[[7720,7720],"mapped",[7721]],[[7721,7721],"valid"],[[7722,7722],"mapped",[7723]],[[7723,7723],"valid"],[[7724,7724],"mapped",[7725]],[[7725,7725],"valid"],[[7726,7726],"mapped",[7727]],[[7727,7727],"valid"],[[7728,7728],"mapped",[7729]],[[7729,7729],"valid"],[[7730,7730],"mapped",[7731]],[[7731,7731],"valid"],[[7732,7732],"mapped",[7733]],[[7733,7733],"valid"],[[7734,7734],"mapped",[7735]],[[7735,7735],"valid"],[[7736,7736],"mapped",[7737]],[[7737,7737],"valid"],[[7738,7738],"mapped",[7739]],[[7739,7739],"valid"],[[7740,7740],"mapped",[7741]],[[7741,7741],"valid"],[[7742,7742],"mapped",[7743]],[[7743,7743],"valid"],[[7744,7744],"mapped",[7745]],[[7745,7745],"valid"],[[7746,7746],"mapped",[7747]],[[7747,7747],"valid"],[[7748,7748],"mapped",[7749]],[[7749,7749],"valid"],[[7750,7750],"mapped",[7751]],[[7751,7751],"valid"],[[7752,7752],"mapped",[7753]],[[7753,7753],"valid"],[[7754,7754],"mapped",[7755]],[[7755,7755],"valid"],[[7756,7756],"mapped",[7757]],[[7757,7757],"valid"],[[7758,7758],"mapped",[7759]],[[7759,7759],"valid"],[[7760,7760],"mapped",[7761]],[[7761,7761],"valid"],[[7762,7762],"mapped",[7763]],[[7763,7763],"valid"],[[7764,7764],"mapped",[7765]],[[7765,7765],"valid"],[[7766,7766],"mapped",[7767]],[[7767,7767],"valid"],[[7768,7768],"mapped",[7769]],[[7769,7769],"valid"],[[7770,7770],"mapped",[7771]],[[7771,7771],"valid"],[[7772,7772],"mapped",[7773]],[[7773,7773],"valid"],[[7774,7774],"mapped",[7775]],[[7775,7775],"valid"],[[7776,7776],"mapped",[7777]],[[7777,7777],"valid"],[[7778,7778],"mapped",[7779]],[[7779,7779],"valid"],[[7780,7780],"mapped",[7781]],[[7781,7781],"valid"],[[7782,7782],"mapped",[7783]],[[7783,7783],"valid"],[[7784,7784],"mapped",[7785]],[[7785,7785],"valid"],[[7786,7786],"mapped",[7787]],[[7787,7787],"valid"],[[7788,7788],"mapped",[7789]],[[7789,7789],"valid"],[[7790,7790],"mapped",[7791]],[[7791,7791],"valid"],[[7792,7792],"mapped",[7793]],[[7793,7793],"valid"],[[7794,7794],"mapped",[7795]],[[7795,7795],"valid"],[[7796,7796],"mapped",[7797]],[[7797,7797],"valid"],[[7798,7798],"mapped",[7799]],[[7799,7799],"valid"],[[7800,7800],"mapped",[7801]],[[7801,7801],"valid"],[[7802,7802],"mapped",[7803]],[[7803,7803],"valid"],[[7804,7804],"mapped",[7805]],[[7805,7805],"valid"],[[7806,7806],"mapped",[7807]],[[7807,7807],"valid"],[[7808,7808],"mapped",[7809]],[[7809,7809],"valid"],[[7810,7810],"mapped",[7811]],[[7811,7811],"valid"],[[7812,7812],"mapped",[7813]],[[7813,7813],"valid"],[[7814,7814],"mapped",[7815]],[[7815,7815],"valid"],[[7816,7816],"mapped",[7817]],[[7817,7817],"valid"],[[7818,7818],"mapped",[7819]],[[7819,7819],"valid"],[[7820,7820],"mapped",[7821]],[[7821,7821],"valid"],[[7822,7822],"mapped",[7823]],[[7823,7823],"valid"],[[7824,7824],"mapped",[7825]],[[7825,7825],"valid"],[[7826,7826],"mapped",[7827]],[[7827,7827],"valid"],[[7828,7828],"mapped",[7829]],[[7829,7833],"valid"],[[7834,7834],"mapped",[97,702]],[[7835,7835],"mapped",[7777]],[[7836,7837],"valid"],[[7838,7838],"mapped",[115,115]],[[7839,7839],"valid"],[[7840,7840],"mapped",[7841]],[[7841,7841],"valid"],[[7842,7842],"mapped",[7843]],[[7843,7843],"valid"],[[7844,7844],"mapped",[7845]],[[7845,7845],"valid"],[[7846,7846],"mapped",[7847]],[[7847,7847],"valid"],[[7848,7848],"mapped",[7849]],[[7849,7849],"valid"],[[7850,7850],"mapped",[7851]],[[7851,7851],"valid"],[[7852,7852],"mapped",[7853]],[[7853,7853],"valid"],[[7854,7854],"mapped",[7855]],[[7855,7855],"valid"],[[7856,7856],"mapped",[7857]],[[7857,7857],"valid"],[[7858,7858],"mapped",[7859]],[[7859,7859],"valid"],[[7860,7860],"mapped",[7861]],[[7861,7861],"valid"],[[7862,7862],"mapped",[7863]],[[7863,7863],"valid"],[[7864,7864],"mapped",[7865]],[[7865,7865],"valid"],[[7866,7866],"mapped",[7867]],[[7867,7867],"valid"],[[7868,7868],"mapped",[7869]],[[7869,7869],"valid"],[[7870,7870],"mapped",[7871]],[[7871,7871],"valid"],[[7872,7872],"mapped",[7873]],[[7873,7873],"valid"],[[7874,7874],"mapped",[7875]],[[7875,7875],"valid"],[[7876,7876],"mapped",[7877]],[[7877,7877],"valid"],[[7878,7878],"mapped",[7879]],[[7879,7879],"valid"],[[7880,7880],"mapped",[7881]],[[7881,7881],"valid"],[[7882,7882],"mapped",[7883]],[[7883,7883],"valid"],[[7884,7884],"mapped",[7885]],[[7885,7885],"valid"],[[7886,7886],"mapped",[7887]],[[7887,7887],"valid"],[[7888,7888],"mapped",[7889]],[[7889,7889],"valid"],[[7890,7890],"mapped",[7891]],[[7891,7891],"valid"],[[7892,7892],"mapped",[7893]],[[7893,7893],"valid"],[[7894,7894],"mapped",[7895]],[[7895,7895],"valid"],[[7896,7896],"mapped",[7897]],[[7897,7897],"valid"],[[7898,7898],"mapped",[7899]],[[7899,7899],"valid"],[[7900,7900],"mapped",[7901]],[[7901,7901],"valid"],[[7902,7902],"mapped",[7903]],[[7903,7903],"valid"],[[7904,7904],"mapped",[7905]],[[7905,7905],"valid"],[[7906,7906],"mapped",[7907]],[[7907,7907],"valid"],[[7908,7908],"mapped",[7909]],[[7909,7909],"valid"],[[7910,7910],"mapped",[7911]],[[7911,7911],"valid"],[[7912,7912],"mapped",[7913]],[[7913,7913],"valid"],[[7914,7914],"mapped",[7915]],[[7915,7915],"valid"],[[7916,7916],"mapped",[7917]],[[7917,7917],"valid"],[[7918,7918],"mapped",[7919]],[[7919,7919],"valid"],[[7920,7920],"mapped",[7921]],[[7921,7921],"valid"],[[7922,7922],"mapped",[7923]],[[7923,7923],"valid"],[[7924,7924],"mapped",[7925]],[[7925,7925],"valid"],[[7926,7926],"mapped",[7927]],[[7927,7927],"valid"],[[7928,7928],"mapped",[7929]],[[7929,7929],"valid"],[[7930,7930],"mapped",[7931]],[[7931,7931],"valid"],[[7932,7932],"mapped",[7933]],[[7933,7933],"valid"],[[7934,7934],"mapped",[7935]],[[7935,7935],"valid"],[[7936,7943],"valid"],[[7944,7944],"mapped",[7936]],[[7945,7945],"mapped",[7937]],[[7946,7946],"mapped",[7938]],[[7947,7947],"mapped",[7939]],[[7948,7948],"mapped",[7940]],[[7949,7949],"mapped",[7941]],[[7950,7950],"mapped",[7942]],[[7951,7951],"mapped",[7943]],[[7952,7957],"valid"],[[7958,7959],"disallowed"],[[7960,7960],"mapped",[7952]],[[7961,7961],"mapped",[7953]],[[7962,7962],"mapped",[7954]],[[7963,7963],"mapped",[7955]],[[7964,7964],"mapped",[7956]],[[7965,7965],"mapped",[7957]],[[7966,7967],"disallowed"],[[7968,7975],"valid"],[[7976,7976],"mapped",[7968]],[[7977,7977],"mapped",[7969]],[[7978,7978],"mapped",[7970]],[[7979,7979],"mapped",[7971]],[[7980,7980],"mapped",[7972]],[[7981,7981],"mapped",[7973]],[[7982,7982],"mapped",[7974]],[[7983,7983],"mapped",[7975]],[[7984,7991],"valid"],[[7992,7992],"mapped",[7984]],[[7993,7993],"mapped",[7985]],[[7994,7994],"mapped",[7986]],[[7995,7995],"mapped",[7987]],[[7996,7996],"mapped",[7988]],[[7997,7997],"mapped",[7989]],[[7998,7998],"mapped",[7990]],[[7999,7999],"mapped",[7991]],[[8000,8005],"valid"],[[8006,8007],"disallowed"],[[8008,8008],"mapped",[8000]],[[8009,8009],"mapped",[8001]],[[8010,8010],"mapped",[8002]],[[8011,8011],"mapped",[8003]],[[8012,8012],"mapped",[8004]],[[8013,8013],"mapped",[8005]],[[8014,8015],"disallowed"],[[8016,8023],"valid"],[[8024,8024],"disallowed"],[[8025,8025],"mapped",[8017]],[[8026,8026],"disallowed"],[[8027,8027],"mapped",[8019]],[[8028,8028],"disallowed"],[[8029,8029],"mapped",[8021]],[[8030,8030],"disallowed"],[[8031,8031],"mapped",[8023]],[[8032,8039],"valid"],[[8040,8040],"mapped",[8032]],[[8041,8041],"mapped",[8033]],[[8042,8042],"mapped",[8034]],[[8043,8043],"mapped",[8035]],[[8044,8044],"mapped",[8036]],[[8045,8045],"mapped",[8037]],[[8046,8046],"mapped",[8038]],[[8047,8047],"mapped",[8039]],[[8048,8048],"valid"],[[8049,8049],"mapped",[940]],[[8050,8050],"valid"],[[8051,8051],"mapped",[941]],[[8052,8052],"valid"],[[8053,8053],"mapped",[942]],[[8054,8054],"valid"],[[8055,8055],"mapped",[943]],[[8056,8056],"valid"],[[8057,8057],"mapped",[972]],[[8058,8058],"valid"],[[8059,8059],"mapped",[973]],[[8060,8060],"valid"],[[8061,8061],"mapped",[974]],[[8062,8063],"disallowed"],[[8064,8064],"mapped",[7936,953]],[[8065,8065],"mapped",[7937,953]],[[8066,8066],"mapped",[7938,953]],[[8067,8067],"mapped",[7939,953]],[[8068,8068],"mapped",[7940,953]],[[8069,8069],"mapped",[7941,953]],[[8070,8070],"mapped",[7942,953]],[[8071,8071],"mapped",[7943,953]],[[8072,8072],"mapped",[7936,953]],[[8073,8073],"mapped",[7937,953]],[[8074,8074],"mapped",[7938,953]],[[8075,8075],"mapped",[7939,953]],[[8076,8076],"mapped",[7940,953]],[[8077,8077],"mapped",[7941,953]],[[8078,8078],"mapped",[7942,953]],[[8079,8079],"mapped",[7943,953]],[[8080,8080],"mapped",[7968,953]],[[8081,8081],"mapped",[7969,953]],[[8082,8082],"mapped",[7970,953]],[[8083,8083],"mapped",[7971,953]],[[8084,8084],"mapped",[7972,953]],[[8085,8085],"mapped",[7973,953]],[[8086,8086],"mapped",[7974,953]],[[8087,8087],"mapped",[7975,953]],[[8088,8088],"mapped",[7968,953]],[[8089,8089],"mapped",[7969,953]],[[8090,8090],"mapped",[7970,953]],[[8091,8091],"mapped",[7971,953]],[[8092,8092],"mapped",[7972,953]],[[8093,8093],"mapped",[7973,953]],[[8094,8094],"mapped",[7974,953]],[[8095,8095],"mapped",[7975,953]],[[8096,8096],"mapped",[8032,953]],[[8097,8097],"mapped",[8033,953]],[[8098,8098],"mapped",[8034,953]],[[8099,8099],"mapped",[8035,953]],[[8100,8100],"mapped",[8036,953]],[[8101,8101],"mapped",[8037,953]],[[8102,8102],"mapped",[8038,953]],[[8103,8103],"mapped",[8039,953]],[[8104,8104],"mapped",[8032,953]],[[8105,8105],"mapped",[8033,953]],[[8106,8106],"mapped",[8034,953]],[[8107,8107],"mapped",[8035,953]],[[8108,8108],"mapped",[8036,953]],[[8109,8109],"mapped",[8037,953]],[[8110,8110],"mapped",[8038,953]],[[8111,8111],"mapped",[8039,953]],[[8112,8113],"valid"],[[8114,8114],"mapped",[8048,953]],[[8115,8115],"mapped",[945,953]],[[8116,8116],"mapped",[940,953]],[[8117,8117],"disallowed"],[[8118,8118],"valid"],[[8119,8119],"mapped",[8118,953]],[[8120,8120],"mapped",[8112]],[[8121,8121],"mapped",[8113]],[[8122,8122],"mapped",[8048]],[[8123,8123],"mapped",[940]],[[8124,8124],"mapped",[945,953]],[[8125,8125],"disallowed_STD3_mapped",[32,787]],[[8126,8126],"mapped",[953]],[[8127,8127],"disallowed_STD3_mapped",[32,787]],[[8128,8128],"disallowed_STD3_mapped",[32,834]],[[8129,8129],"disallowed_STD3_mapped",[32,776,834]],[[8130,8130],"mapped",[8052,953]],[[8131,8131],"mapped",[951,953]],[[8132,8132],"mapped",[942,953]],[[8133,8133],"disallowed"],[[8134,8134],"valid"],[[8135,8135],"mapped",[8134,953]],[[8136,8136],"mapped",[8050]],[[8137,8137],"mapped",[941]],[[8138,8138],"mapped",[8052]],[[8139,8139],"mapped",[942]],[[8140,8140],"mapped",[951,953]],[[8141,8141],"disallowed_STD3_mapped",[32,787,768]],[[8142,8142],"disallowed_STD3_mapped",[32,787,769]],[[8143,8143],"disallowed_STD3_mapped",[32,787,834]],[[8144,8146],"valid"],[[8147,8147],"mapped",[912]],[[8148,8149],"disallowed"],[[8150,8151],"valid"],[[8152,8152],"mapped",[8144]],[[8153,8153],"mapped",[8145]],[[8154,8154],"mapped",[8054]],[[8155,8155],"mapped",[943]],[[8156,8156],"disallowed"],[[8157,8157],"disallowed_STD3_mapped",[32,788,768]],[[8158,8158],"disallowed_STD3_mapped",[32,788,769]],[[8159,8159],"disallowed_STD3_mapped",[32,788,834]],[[8160,8162],"valid"],[[8163,8163],"mapped",[944]],[[8164,8167],"valid"],[[8168,8168],"mapped",[8160]],[[8169,8169],"mapped",[8161]],[[8170,8170],"mapped",[8058]],[[8171,8171],"mapped",[973]],[[8172,8172],"mapped",[8165]],[[8173,8173],"disallowed_STD3_mapped",[32,776,768]],[[8174,8174],"disallowed_STD3_mapped",[32,776,769]],[[8175,8175],"disallowed_STD3_mapped",[96]],[[8176,8177],"disallowed"],[[8178,8178],"mapped",[8060,953]],[[8179,8179],"mapped",[969,953]],[[8180,8180],"mapped",[974,953]],[[8181,8181],"disallowed"],[[8182,8182],"valid"],[[8183,8183],"mapped",[8182,953]],[[8184,8184],"mapped",[8056]],[[8185,8185],"mapped",[972]],[[8186,8186],"mapped",[8060]],[[8187,8187],"mapped",[974]],[[8188,8188],"mapped",[969,953]],[[8189,8189],"disallowed_STD3_mapped",[32,769]],[[8190,8190],"disallowed_STD3_mapped",[32,788]],[[8191,8191],"disallowed"],[[8192,8202],"disallowed_STD3_mapped",[32]],[[8203,8203],"ignored"],[[8204,8205],"deviation",[]],[[8206,8207],"disallowed"],[[8208,8208],"valid",[],"NV8"],[[8209,8209],"mapped",[8208]],[[8210,8214],"valid",[],"NV8"],[[8215,8215],"disallowed_STD3_mapped",[32,819]],[[8216,8227],"valid",[],"NV8"],[[8228,8230],"disallowed"],[[8231,8231],"valid",[],"NV8"],[[8232,8238],"disallowed"],[[8239,8239],"disallowed_STD3_mapped",[32]],[[8240,8242],"valid",[],"NV8"],[[8243,8243],"mapped",[8242,8242]],[[8244,8244],"mapped",[8242,8242,8242]],[[8245,8245],"valid",[],"NV8"],[[8246,8246],"mapped",[8245,8245]],[[8247,8247],"mapped",[8245,8245,8245]],[[8248,8251],"valid",[],"NV8"],[[8252,8252],"disallowed_STD3_mapped",[33,33]],[[8253,8253],"valid",[],"NV8"],[[8254,8254],"disallowed_STD3_mapped",[32,773]],[[8255,8262],"valid",[],"NV8"],[[8263,8263],"disallowed_STD3_mapped",[63,63]],[[8264,8264],"disallowed_STD3_mapped",[63,33]],[[8265,8265],"disallowed_STD3_mapped",[33,63]],[[8266,8269],"valid",[],"NV8"],[[8270,8274],"valid",[],"NV8"],[[8275,8276],"valid",[],"NV8"],[[8277,8278],"valid",[],"NV8"],[[8279,8279],"mapped",[8242,8242,8242,8242]],[[8280,8286],"valid",[],"NV8"],[[8287,8287],"disallowed_STD3_mapped",[32]],[[8288,8288],"ignored"],[[8289,8291],"disallowed"],[[8292,8292],"ignored"],[[8293,8293],"disallowed"],[[8294,8297],"disallowed"],[[8298,8303],"disallowed"],[[8304,8304],"mapped",[48]],[[8305,8305],"mapped",[105]],[[8306,8307],"disallowed"],[[8308,8308],"mapped",[52]],[[8309,8309],"mapped",[53]],[[8310,8310],"mapped",[54]],[[8311,8311],"mapped",[55]],[[8312,8312],"mapped",[56]],[[8313,8313],"mapped",[57]],[[8314,8314],"disallowed_STD3_mapped",[43]],[[8315,8315],"mapped",[8722]],[[8316,8316],"disallowed_STD3_mapped",[61]],[[8317,8317],"disallowed_STD3_mapped",[40]],[[8318,8318],"disallowed_STD3_mapped",[41]],[[8319,8319],"mapped",[110]],[[8320,8320],"mapped",[48]],[[8321,8321],"mapped",[49]],[[8322,8322],"mapped",[50]],[[8323,8323],"mapped",[51]],[[8324,8324],"mapped",[52]],[[8325,8325],"mapped",[53]],[[8326,8326],"mapped",[54]],[[8327,8327],"mapped",[55]],[[8328,8328],"mapped",[56]],[[8329,8329],"mapped",[57]],[[8330,8330],"disallowed_STD3_mapped",[43]],[[8331,8331],"mapped",[8722]],[[8332,8332],"disallowed_STD3_mapped",[61]],[[8333,8333],"disallowed_STD3_mapped",[40]],[[8334,8334],"disallowed_STD3_mapped",[41]],[[8335,8335],"disallowed"],[[8336,8336],"mapped",[97]],[[8337,8337],"mapped",[101]],[[8338,8338],"mapped",[111]],[[8339,8339],"mapped",[120]],[[8340,8340],"mapped",[601]],[[8341,8341],"mapped",[104]],[[8342,8342],"mapped",[107]],[[8343,8343],"mapped",[108]],[[8344,8344],"mapped",[109]],[[8345,8345],"mapped",[110]],[[8346,8346],"mapped",[112]],[[8347,8347],"mapped",[115]],[[8348,8348],"mapped",[116]],[[8349,8351],"disallowed"],[[8352,8359],"valid",[],"NV8"],[[8360,8360],"mapped",[114,115]],[[8361,8362],"valid",[],"NV8"],[[8363,8363],"valid",[],"NV8"],[[8364,8364],"valid",[],"NV8"],[[8365,8367],"valid",[],"NV8"],[[8368,8369],"valid",[],"NV8"],[[8370,8373],"valid",[],"NV8"],[[8374,8376],"valid",[],"NV8"],[[8377,8377],"valid",[],"NV8"],[[8378,8378],"valid",[],"NV8"],[[8379,8381],"valid",[],"NV8"],[[8382,8382],"valid",[],"NV8"],[[8383,8399],"disallowed"],[[8400,8417],"valid",[],"NV8"],[[8418,8419],"valid",[],"NV8"],[[8420,8426],"valid",[],"NV8"],[[8427,8427],"valid",[],"NV8"],[[8428,8431],"valid",[],"NV8"],[[8432,8432],"valid",[],"NV8"],[[8433,8447],"disallowed"],[[8448,8448],"disallowed_STD3_mapped",[97,47,99]],[[8449,8449],"disallowed_STD3_mapped",[97,47,115]],[[8450,8450],"mapped",[99]],[[8451,8451],"mapped",[176,99]],[[8452,8452],"valid",[],"NV8"],[[8453,8453],"disallowed_STD3_mapped",[99,47,111]],[[8454,8454],"disallowed_STD3_mapped",[99,47,117]],[[8455,8455],"mapped",[603]],[[8456,8456],"valid",[],"NV8"],[[8457,8457],"mapped",[176,102]],[[8458,8458],"mapped",[103]],[[8459,8462],"mapped",[104]],[[8463,8463],"mapped",[295]],[[8464,8465],"mapped",[105]],[[8466,8467],"mapped",[108]],[[8468,8468],"valid",[],"NV8"],[[8469,8469],"mapped",[110]],[[8470,8470],"mapped",[110,111]],[[8471,8472],"valid",[],"NV8"],[[8473,8473],"mapped",[112]],[[8474,8474],"mapped",[113]],[[8475,8477],"mapped",[114]],[[8478,8479],"valid",[],"NV8"],[[8480,8480],"mapped",[115,109]],[[8481,8481],"mapped",[116,101,108]],[[8482,8482],"mapped",[116,109]],[[8483,8483],"valid",[],"NV8"],[[8484,8484],"mapped",[122]],[[8485,8485],"valid",[],"NV8"],[[8486,8486],"mapped",[969]],[[8487,8487],"valid",[],"NV8"],[[8488,8488],"mapped",[122]],[[8489,8489],"valid",[],"NV8"],[[8490,8490],"mapped",[107]],[[8491,8491],"mapped",[229]],[[8492,8492],"mapped",[98]],[[8493,8493],"mapped",[99]],[[8494,8494],"valid",[],"NV8"],[[8495,8496],"mapped",[101]],[[8497,8497],"mapped",[102]],[[8498,8498],"disallowed"],[[8499,8499],"mapped",[109]],[[8500,8500],"mapped",[111]],[[8501,8501],"mapped",[1488]],[[8502,8502],"mapped",[1489]],[[8503,8503],"mapped",[1490]],[[8504,8504],"mapped",[1491]],[[8505,8505],"mapped",[105]],[[8506,8506],"valid",[],"NV8"],[[8507,8507],"mapped",[102,97,120]],[[8508,8508],"mapped",[960]],[[8509,8510],"mapped",[947]],[[8511,8511],"mapped",[960]],[[8512,8512],"mapped",[8721]],[[8513,8516],"valid",[],"NV8"],[[8517,8518],"mapped",[100]],[[8519,8519],"mapped",[101]],[[8520,8520],"mapped",[105]],[[8521,8521],"mapped",[106]],[[8522,8523],"valid",[],"NV8"],[[8524,8524],"valid",[],"NV8"],[[8525,8525],"valid",[],"NV8"],[[8526,8526],"valid"],[[8527,8527],"valid",[],"NV8"],[[8528,8528],"mapped",[49,8260,55]],[[8529,8529],"mapped",[49,8260,57]],[[8530,8530],"mapped",[49,8260,49,48]],[[8531,8531],"mapped",[49,8260,51]],[[8532,8532],"mapped",[50,8260,51]],[[8533,8533],"mapped",[49,8260,53]],[[8534,8534],"mapped",[50,8260,53]],[[8535,8535],"mapped",[51,8260,53]],[[8536,8536],"mapped",[52,8260,53]],[[8537,8537],"mapped",[49,8260,54]],[[8538,8538],"mapped",[53,8260,54]],[[8539,8539],"mapped",[49,8260,56]],[[8540,8540],"mapped",[51,8260,56]],[[8541,8541],"mapped",[53,8260,56]],[[8542,8542],"mapped",[55,8260,56]],[[8543,8543],"mapped",[49,8260]],[[8544,8544],"mapped",[105]],[[8545,8545],"mapped",[105,105]],[[8546,8546],"mapped",[105,105,105]],[[8547,8547],"mapped",[105,118]],[[8548,8548],"mapped",[118]],[[8549,8549],"mapped",[118,105]],[[8550,8550],"mapped",[118,105,105]],[[8551,8551],"mapped",[118,105,105,105]],[[8552,8552],"mapped",[105,120]],[[8553,8553],"mapped",[120]],[[8554,8554],"mapped",[120,105]],[[8555,8555],"mapped",[120,105,105]],[[8556,8556],"mapped",[108]],[[8557,8557],"mapped",[99]],[[8558,8558],"mapped",[100]],[[8559,8559],"mapped",[109]],[[8560,8560],"mapped",[105]],[[8561,8561],"mapped",[105,105]],[[8562,8562],"mapped",[105,105,105]],[[8563,8563],"mapped",[105,118]],[[8564,8564],"mapped",[118]],[[8565,8565],"mapped",[118,105]],[[8566,8566],"mapped",[118,105,105]],[[8567,8567],"mapped",[118,105,105,105]],[[8568,8568],"mapped",[105,120]],[[8569,8569],"mapped",[120]],[[8570,8570],"mapped",[120,105]],[[8571,8571],"mapped",[120,105,105]],[[8572,8572],"mapped",[108]],[[8573,8573],"mapped",[99]],[[8574,8574],"mapped",[100]],[[8575,8575],"mapped",[109]],[[8576,8578],"valid",[],"NV8"],[[8579,8579],"disallowed"],[[8580,8580],"valid"],[[8581,8584],"valid",[],"NV8"],[[8585,8585],"mapped",[48,8260,51]],[[8586,8587],"valid",[],"NV8"],[[8588,8591],"disallowed"],[[8592,8682],"valid",[],"NV8"],[[8683,8691],"valid",[],"NV8"],[[8692,8703],"valid",[],"NV8"],[[8704,8747],"valid",[],"NV8"],[[8748,8748],"mapped",[8747,8747]],[[8749,8749],"mapped",[8747,8747,8747]],[[8750,8750],"valid",[],"NV8"],[[8751,8751],"mapped",[8750,8750]],[[8752,8752],"mapped",[8750,8750,8750]],[[8753,8799],"valid",[],"NV8"],[[8800,8800],"disallowed_STD3_valid"],[[8801,8813],"valid",[],"NV8"],[[8814,8815],"disallowed_STD3_valid"],[[8816,8945],"valid",[],"NV8"],[[8946,8959],"valid",[],"NV8"],[[8960,8960],"valid",[],"NV8"],[[8961,8961],"valid",[],"NV8"],[[8962,9000],"valid",[],"NV8"],[[9001,9001],"mapped",[12296]],[[9002,9002],"mapped",[12297]],[[9003,9082],"valid",[],"NV8"],[[9083,9083],"valid",[],"NV8"],[[9084,9084],"valid",[],"NV8"],[[9085,9114],"valid",[],"NV8"],[[9115,9166],"valid",[],"NV8"],[[9167,9168],"valid",[],"NV8"],[[9169,9179],"valid",[],"NV8"],[[9180,9191],"valid",[],"NV8"],[[9192,9192],"valid",[],"NV8"],[[9193,9203],"valid",[],"NV8"],[[9204,9210],"valid",[],"NV8"],[[9211,9215],"disallowed"],[[9216,9252],"valid",[],"NV8"],[[9253,9254],"valid",[],"NV8"],[[9255,9279],"disallowed"],[[9280,9290],"valid",[],"NV8"],[[9291,9311],"disallowed"],[[9312,9312],"mapped",[49]],[[9313,9313],"mapped",[50]],[[9314,9314],"mapped",[51]],[[9315,9315],"mapped",[52]],[[9316,9316],"mapped",[53]],[[9317,9317],"mapped",[54]],[[9318,9318],"mapped",[55]],[[9319,9319],"mapped",[56]],[[9320,9320],"mapped",[57]],[[9321,9321],"mapped",[49,48]],[[9322,9322],"mapped",[49,49]],[[9323,9323],"mapped",[49,50]],[[9324,9324],"mapped",[49,51]],[[9325,9325],"mapped",[49,52]],[[9326,9326],"mapped",[49,53]],[[9327,9327],"mapped",[49,54]],[[9328,9328],"mapped",[49,55]],[[9329,9329],"mapped",[49,56]],[[9330,9330],"mapped",[49,57]],[[9331,9331],"mapped",[50,48]],[[9332,9332],"disallowed_STD3_mapped",[40,49,41]],[[9333,9333],"disallowed_STD3_mapped",[40,50,41]],[[9334,9334],"disallowed_STD3_mapped",[40,51,41]],[[9335,9335],"disallowed_STD3_mapped",[40,52,41]],[[9336,9336],"disallowed_STD3_mapped",[40,53,41]],[[9337,9337],"disallowed_STD3_mapped",[40,54,41]],[[9338,9338],"disallowed_STD3_mapped",[40,55,41]],[[9339,9339],"disallowed_STD3_mapped",[40,56,41]],[[9340,9340],"disallowed_STD3_mapped",[40,57,41]],[[9341,9341],"disallowed_STD3_mapped",[40,49,48,41]],[[9342,9342],"disallowed_STD3_mapped",[40,49,49,41]],[[9343,9343],"disallowed_STD3_mapped",[40,49,50,41]],[[9344,9344],"disallowed_STD3_mapped",[40,49,51,41]],[[9345,9345],"disallowed_STD3_mapped",[40,49,52,41]],[[9346,9346],"disallowed_STD3_mapped",[40,49,53,41]],[[9347,9347],"disallowed_STD3_mapped",[40,49,54,41]],[[9348,9348],"disallowed_STD3_mapped",[40,49,55,41]],[[9349,9349],"disallowed_STD3_mapped",[40,49,56,41]],[[9350,9350],"disallowed_STD3_mapped",[40,49,57,41]],[[9351,9351],"disallowed_STD3_mapped",[40,50,48,41]],[[9352,9371],"disallowed"],[[9372,9372],"disallowed_STD3_mapped",[40,97,41]],[[9373,9373],"disallowed_STD3_mapped",[40,98,41]],[[9374,9374],"disallowed_STD3_mapped",[40,99,41]],[[9375,9375],"disallowed_STD3_mapped",[40,100,41]],[[9376,9376],"disallowed_STD3_mapped",[40,101,41]],[[9377,9377],"disallowed_STD3_mapped",[40,102,41]],[[9378,9378],"disallowed_STD3_mapped",[40,103,41]],[[9379,9379],"disallowed_STD3_mapped",[40,104,41]],[[9380,9380],"disallowed_STD3_mapped",[40,105,41]],[[9381,9381],"disallowed_STD3_mapped",[40,106,41]],[[9382,9382],"disallowed_STD3_mapped",[40,107,41]],[[9383,9383],"disallowed_STD3_mapped",[40,108,41]],[[9384,9384],"disallowed_STD3_mapped",[40,109,41]],[[9385,9385],"disallowed_STD3_mapped",[40,110,41]],[[9386,9386],"disallowed_STD3_mapped",[40,111,41]],[[9387,9387],"disallowed_STD3_mapped",[40,112,41]],[[9388,9388],"disallowed_STD3_mapped",[40,113,41]],[[9389,9389],"disallowed_STD3_mapped",[40,114,41]],[[9390,9390],"disallowed_STD3_mapped",[40,115,41]],[[9391,9391],"disallowed_STD3_mapped",[40,116,41]],[[9392,9392],"disallowed_STD3_mapped",[40,117,41]],[[9393,9393],"disallowed_STD3_mapped",[40,118,41]],[[9394,9394],"disallowed_STD3_mapped",[40,119,41]],[[9395,9395],"disallowed_STD3_mapped",[40,120,41]],[[9396,9396],"disallowed_STD3_mapped",[40,121,41]],[[9397,9397],"disallowed_STD3_mapped",[40,122,41]],[[9398,9398],"mapped",[97]],[[9399,9399],"mapped",[98]],[[9400,9400],"mapped",[99]],[[9401,9401],"mapped",[100]],[[9402,9402],"mapped",[101]],[[9403,9403],"mapped",[102]],[[9404,9404],"mapped",[103]],[[9405,9405],"mapped",[104]],[[9406,9406],"mapped",[105]],[[9407,9407],"mapped",[106]],[[9408,9408],"mapped",[107]],[[9409,9409],"mapped",[108]],[[9410,9410],"mapped",[109]],[[9411,9411],"mapped",[110]],[[9412,9412],"mapped",[111]],[[9413,9413],"mapped",[112]],[[9414,9414],"mapped",[113]],[[9415,9415],"mapped",[114]],[[9416,9416],"mapped",[115]],[[9417,9417],"mapped",[116]],[[9418,9418],"mapped",[117]],[[9419,9419],"mapped",[118]],[[9420,9420],"mapped",[119]],[[9421,9421],"mapped",[120]],[[9422,9422],"mapped",[121]],[[9423,9423],"mapped",[122]],[[9424,9424],"mapped",[97]],[[9425,9425],"mapped",[98]],[[9426,9426],"mapped",[99]],[[9427,9427],"mapped",[100]],[[9428,9428],"mapped",[101]],[[9429,9429],"mapped",[102]],[[9430,9430],"mapped",[103]],[[9431,9431],"mapped",[104]],[[9432,9432],"mapped",[105]],[[9433,9433],"mapped",[106]],[[9434,9434],"mapped",[107]],[[9435,9435],"mapped",[108]],[[9436,9436],"mapped",[109]],[[9437,9437],"mapped",[110]],[[9438,9438],"mapped",[111]],[[9439,9439],"mapped",[112]],[[9440,9440],"mapped",[113]],[[9441,9441],"mapped",[114]],[[9442,9442],"mapped",[115]],[[9443,9443],"mapped",[116]],[[9444,9444],"mapped",[117]],[[9445,9445],"mapped",[118]],[[9446,9446],"mapped",[119]],[[9447,9447],"mapped",[120]],[[9448,9448],"mapped",[121]],[[9449,9449],"mapped",[122]],[[9450,9450],"mapped",[48]],[[9451,9470],"valid",[],"NV8"],[[9471,9471],"valid",[],"NV8"],[[9472,9621],"valid",[],"NV8"],[[9622,9631],"valid",[],"NV8"],[[9632,9711],"valid",[],"NV8"],[[9712,9719],"valid",[],"NV8"],[[9720,9727],"valid",[],"NV8"],[[9728,9747],"valid",[],"NV8"],[[9748,9749],"valid",[],"NV8"],[[9750,9751],"valid",[],"NV8"],[[9752,9752],"valid",[],"NV8"],[[9753,9753],"valid",[],"NV8"],[[9754,9839],"valid",[],"NV8"],[[9840,9841],"valid",[],"NV8"],[[9842,9853],"valid",[],"NV8"],[[9854,9855],"valid",[],"NV8"],[[9856,9865],"valid",[],"NV8"],[[9866,9873],"valid",[],"NV8"],[[9874,9884],"valid",[],"NV8"],[[9885,9885],"valid",[],"NV8"],[[9886,9887],"valid",[],"NV8"],[[9888,9889],"valid",[],"NV8"],[[9890,9905],"valid",[],"NV8"],[[9906,9906],"valid",[],"NV8"],[[9907,9916],"valid",[],"NV8"],[[9917,9919],"valid",[],"NV8"],[[9920,9923],"valid",[],"NV8"],[[9924,9933],"valid",[],"NV8"],[[9934,9934],"valid",[],"NV8"],[[9935,9953],"valid",[],"NV8"],[[9954,9954],"valid",[],"NV8"],[[9955,9955],"valid",[],"NV8"],[[9956,9959],"valid",[],"NV8"],[[9960,9983],"valid",[],"NV8"],[[9984,9984],"valid",[],"NV8"],[[9985,9988],"valid",[],"NV8"],[[9989,9989],"valid",[],"NV8"],[[9990,9993],"valid",[],"NV8"],[[9994,9995],"valid",[],"NV8"],[[9996,10023],"valid",[],"NV8"],[[10024,10024],"valid",[],"NV8"],[[10025,10059],"valid",[],"NV8"],[[10060,10060],"valid",[],"NV8"],[[10061,10061],"valid",[],"NV8"],[[10062,10062],"valid",[],"NV8"],[[10063,10066],"valid",[],"NV8"],[[10067,10069],"valid",[],"NV8"],[[10070,10070],"valid",[],"NV8"],[[10071,10071],"valid",[],"NV8"],[[10072,10078],"valid",[],"NV8"],[[10079,10080],"valid",[],"NV8"],[[10081,10087],"valid",[],"NV8"],[[10088,10101],"valid",[],"NV8"],[[10102,10132],"valid",[],"NV8"],[[10133,10135],"valid",[],"NV8"],[[10136,10159],"valid",[],"NV8"],[[10160,10160],"valid",[],"NV8"],[[10161,10174],"valid",[],"NV8"],[[10175,10175],"valid",[],"NV8"],[[10176,10182],"valid",[],"NV8"],[[10183,10186],"valid",[],"NV8"],[[10187,10187],"valid",[],"NV8"],[[10188,10188],"valid",[],"NV8"],[[10189,10189],"valid",[],"NV8"],[[10190,10191],"valid",[],"NV8"],[[10192,10219],"valid",[],"NV8"],[[10220,10223],"valid",[],"NV8"],[[10224,10239],"valid",[],"NV8"],[[10240,10495],"valid",[],"NV8"],[[10496,10763],"valid",[],"NV8"],[[10764,10764],"mapped",[8747,8747,8747,8747]],[[10765,10867],"valid",[],"NV8"],[[10868,10868],"disallowed_STD3_mapped",[58,58,61]],[[10869,10869],"disallowed_STD3_mapped",[61,61]],[[10870,10870],"disallowed_STD3_mapped",[61,61,61]],[[10871,10971],"valid",[],"NV8"],[[10972,10972],"mapped",[10973,824]],[[10973,11007],"valid",[],"NV8"],[[11008,11021],"valid",[],"NV8"],[[11022,11027],"valid",[],"NV8"],[[11028,11034],"valid",[],"NV8"],[[11035,11039],"valid",[],"NV8"],[[11040,11043],"valid",[],"NV8"],[[11044,11084],"valid",[],"NV8"],[[11085,11087],"valid",[],"NV8"],[[11088,11092],"valid",[],"NV8"],[[11093,11097],"valid",[],"NV8"],[[11098,11123],"valid",[],"NV8"],[[11124,11125],"disallowed"],[[11126,11157],"valid",[],"NV8"],[[11158,11159],"disallowed"],[[11160,11193],"valid",[],"NV8"],[[11194,11196],"disallowed"],[[11197,11208],"valid",[],"NV8"],[[11209,11209],"disallowed"],[[11210,11217],"valid",[],"NV8"],[[11218,11243],"disallowed"],[[11244,11247],"valid",[],"NV8"],[[11248,11263],"disallowed"],[[11264,11264],"mapped",[11312]],[[11265,11265],"mapped",[11313]],[[11266,11266],"mapped",[11314]],[[11267,11267],"mapped",[11315]],[[11268,11268],"mapped",[11316]],[[11269,11269],"mapped",[11317]],[[11270,11270],"mapped",[11318]],[[11271,11271],"mapped",[11319]],[[11272,11272],"mapped",[11320]],[[11273,11273],"mapped",[11321]],[[11274,11274],"mapped",[11322]],[[11275,11275],"mapped",[11323]],[[11276,11276],"mapped",[11324]],[[11277,11277],"mapped",[11325]],[[11278,11278],"mapped",[11326]],[[11279,11279],"mapped",[11327]],[[11280,11280],"mapped",[11328]],[[11281,11281],"mapped",[11329]],[[11282,11282],"mapped",[11330]],[[11283,11283],"mapped",[11331]],[[11284,11284],"mapped",[11332]],[[11285,11285],"mapped",[11333]],[[11286,11286],"mapped",[11334]],[[11287,11287],"mapped",[11335]],[[11288,11288],"mapped",[11336]],[[11289,11289],"mapped",[11337]],[[11290,11290],"mapped",[11338]],[[11291,11291],"mapped",[11339]],[[11292,11292],"mapped",[11340]],[[11293,11293],"mapped",[11341]],[[11294,11294],"mapped",[11342]],[[11295,11295],"mapped",[11343]],[[11296,11296],"mapped",[11344]],[[11297,11297],"mapped",[11345]],[[11298,11298],"mapped",[11346]],[[11299,11299],"mapped",[11347]],[[11300,11300],"mapped",[11348]],[[11301,11301],"mapped",[11349]],[[11302,11302],"mapped",[11350]],[[11303,11303],"mapped",[11351]],[[11304,11304],"mapped",[11352]],[[11305,11305],"mapped",[11353]],[[11306,11306],"mapped",[11354]],[[11307,11307],"mapped",[11355]],[[11308,11308],"mapped",[11356]],[[11309,11309],"mapped",[11357]],[[11310,11310],"mapped",[11358]],[[11311,11311],"disallowed"],[[11312,11358],"valid"],[[11359,11359],"disallowed"],[[11360,11360],"mapped",[11361]],[[11361,11361],"valid"],[[11362,11362],"mapped",[619]],[[11363,11363],"mapped",[7549]],[[11364,11364],"mapped",[637]],[[11365,11366],"valid"],[[11367,11367],"mapped",[11368]],[[11368,11368],"valid"],[[11369,11369],"mapped",[11370]],[[11370,11370],"valid"],[[11371,11371],"mapped",[11372]],[[11372,11372],"valid"],[[11373,11373],"mapped",[593]],[[11374,11374],"mapped",[625]],[[11375,11375],"mapped",[592]],[[11376,11376],"mapped",[594]],[[11377,11377],"valid"],[[11378,11378],"mapped",[11379]],[[11379,11379],"valid"],[[11380,11380],"valid"],[[11381,11381],"mapped",[11382]],[[11382,11383],"valid"],[[11384,11387],"valid"],[[11388,11388],"mapped",[106]],[[11389,11389],"mapped",[118]],[[11390,11390],"mapped",[575]],[[11391,11391],"mapped",[576]],[[11392,11392],"mapped",[11393]],[[11393,11393],"valid"],[[11394,11394],"mapped",[11395]],[[11395,11395],"valid"],[[11396,11396],"mapped",[11397]],[[11397,11397],"valid"],[[11398,11398],"mapped",[11399]],[[11399,11399],"valid"],[[11400,11400],"mapped",[11401]],[[11401,11401],"valid"],[[11402,11402],"mapped",[11403]],[[11403,11403],"valid"],[[11404,11404],"mapped",[11405]],[[11405,11405],"valid"],[[11406,11406],"mapped",[11407]],[[11407,11407],"valid"],[[11408,11408],"mapped",[11409]],[[11409,11409],"valid"],[[11410,11410],"mapped",[11411]],[[11411,11411],"valid"],[[11412,11412],"mapped",[11413]],[[11413,11413],"valid"],[[11414,11414],"mapped",[11415]],[[11415,11415],"valid"],[[11416,11416],"mapped",[11417]],[[11417,11417],"valid"],[[11418,11418],"mapped",[11419]],[[11419,11419],"valid"],[[11420,11420],"mapped",[11421]],[[11421,11421],"valid"],[[11422,11422],"mapped",[11423]],[[11423,11423],"valid"],[[11424,11424],"mapped",[11425]],[[11425,11425],"valid"],[[11426,11426],"mapped",[11427]],[[11427,11427],"valid"],[[11428,11428],"mapped",[11429]],[[11429,11429],"valid"],[[11430,11430],"mapped",[11431]],[[11431,11431],"valid"],[[11432,11432],"mapped",[11433]],[[11433,11433],"valid"],[[11434,11434],"mapped",[11435]],[[11435,11435],"valid"],[[11436,11436],"mapped",[11437]],[[11437,11437],"valid"],[[11438,11438],"mapped",[11439]],[[11439,11439],"valid"],[[11440,11440],"mapped",[11441]],[[11441,11441],"valid"],[[11442,11442],"mapped",[11443]],[[11443,11443],"valid"],[[11444,11444],"mapped",[11445]],[[11445,11445],"valid"],[[11446,11446],"mapped",[11447]],[[11447,11447],"valid"],[[11448,11448],"mapped",[11449]],[[11449,11449],"valid"],[[11450,11450],"mapped",[11451]],[[11451,11451],"valid"],[[11452,11452],"mapped",[11453]],[[11453,11453],"valid"],[[11454,11454],"mapped",[11455]],[[11455,11455],"valid"],[[11456,11456],"mapped",[11457]],[[11457,11457],"valid"],[[11458,11458],"mapped",[11459]],[[11459,11459],"valid"],[[11460,11460],"mapped",[11461]],[[11461,11461],"valid"],[[11462,11462],"mapped",[11463]],[[11463,11463],"valid"],[[11464,11464],"mapped",[11465]],[[11465,11465],"valid"],[[11466,11466],"mapped",[11467]],[[11467,11467],"valid"],[[11468,11468],"mapped",[11469]],[[11469,11469],"valid"],[[11470,11470],"mapped",[11471]],[[11471,11471],"valid"],[[11472,11472],"mapped",[11473]],[[11473,11473],"valid"],[[11474,11474],"mapped",[11475]],[[11475,11475],"valid"],[[11476,11476],"mapped",[11477]],[[11477,11477],"valid"],[[11478,11478],"mapped",[11479]],[[11479,11479],"valid"],[[11480,11480],"mapped",[11481]],[[11481,11481],"valid"],[[11482,11482],"mapped",[11483]],[[11483,11483],"valid"],[[11484,11484],"mapped",[11485]],[[11485,11485],"valid"],[[11486,11486],"mapped",[11487]],[[11487,11487],"valid"],[[11488,11488],"mapped",[11489]],[[11489,11489],"valid"],[[11490,11490],"mapped",[11491]],[[11491,11492],"valid"],[[11493,11498],"valid",[],"NV8"],[[11499,11499],"mapped",[11500]],[[11500,11500],"valid"],[[11501,11501],"mapped",[11502]],[[11502,11505],"valid"],[[11506,11506],"mapped",[11507]],[[11507,11507],"valid"],[[11508,11512],"disallowed"],[[11513,11519],"valid",[],"NV8"],[[11520,11557],"valid"],[[11558,11558],"disallowed"],[[11559,11559],"valid"],[[11560,11564],"disallowed"],[[11565,11565],"valid"],[[11566,11567],"disallowed"],[[11568,11621],"valid"],[[11622,11623],"valid"],[[11624,11630],"disallowed"],[[11631,11631],"mapped",[11617]],[[11632,11632],"valid",[],"NV8"],[[11633,11646],"disallowed"],[[11647,11647],"valid"],[[11648,11670],"valid"],[[11671,11679],"disallowed"],[[11680,11686],"valid"],[[11687,11687],"disallowed"],[[11688,11694],"valid"],[[11695,11695],"disallowed"],[[11696,11702],"valid"],[[11703,11703],"disallowed"],[[11704,11710],"valid"],[[11711,11711],"disallowed"],[[11712,11718],"valid"],[[11719,11719],"disallowed"],[[11720,11726],"valid"],[[11727,11727],"disallowed"],[[11728,11734],"valid"],[[11735,11735],"disallowed"],[[11736,11742],"valid"],[[11743,11743],"disallowed"],[[11744,11775],"valid"],[[11776,11799],"valid",[],"NV8"],[[11800,11803],"valid",[],"NV8"],[[11804,11805],"valid",[],"NV8"],[[11806,11822],"valid",[],"NV8"],[[11823,11823],"valid"],[[11824,11824],"valid",[],"NV8"],[[11825,11825],"valid",[],"NV8"],[[11826,11835],"valid",[],"NV8"],[[11836,11842],"valid",[],"NV8"],[[11843,11903],"disallowed"],[[11904,11929],"valid",[],"NV8"],[[11930,11930],"disallowed"],[[11931,11934],"valid",[],"NV8"],[[11935,11935],"mapped",[27597]],[[11936,12018],"valid",[],"NV8"],[[12019,12019],"mapped",[40863]],[[12020,12031],"disallowed"],[[12032,12032],"mapped",[19968]],[[12033,12033],"mapped",[20008]],[[12034,12034],"mapped",[20022]],[[12035,12035],"mapped",[20031]],[[12036,12036],"mapped",[20057]],[[12037,12037],"mapped",[20101]],[[12038,12038],"mapped",[20108]],[[12039,12039],"mapped",[20128]],[[12040,12040],"mapped",[20154]],[[12041,12041],"mapped",[20799]],[[12042,12042],"mapped",[20837]],[[12043,12043],"mapped",[20843]],[[12044,12044],"mapped",[20866]],[[12045,12045],"mapped",[20886]],[[12046,12046],"mapped",[20907]],[[12047,12047],"mapped",[20960]],[[12048,12048],"mapped",[20981]],[[12049,12049],"mapped",[20992]],[[12050,12050],"mapped",[21147]],[[12051,12051],"mapped",[21241]],[[12052,12052],"mapped",[21269]],[[12053,12053],"mapped",[21274]],[[12054,12054],"mapped",[21304]],[[12055,12055],"mapped",[21313]],[[12056,12056],"mapped",[21340]],[[12057,12057],"mapped",[21353]],[[12058,12058],"mapped",[21378]],[[12059,12059],"mapped",[21430]],[[12060,12060],"mapped",[21448]],[[12061,12061],"mapped",[21475]],[[12062,12062],"mapped",[22231]],[[12063,12063],"mapped",[22303]],[[12064,12064],"mapped",[22763]],[[12065,12065],"mapped",[22786]],[[12066,12066],"mapped",[22794]],[[12067,12067],"mapped",[22805]],[[12068,12068],"mapped",[22823]],[[12069,12069],"mapped",[22899]],[[12070,12070],"mapped",[23376]],[[12071,12071],"mapped",[23424]],[[12072,12072],"mapped",[23544]],[[12073,12073],"mapped",[23567]],[[12074,12074],"mapped",[23586]],[[12075,12075],"mapped",[23608]],[[12076,12076],"mapped",[23662]],[[12077,12077],"mapped",[23665]],[[12078,12078],"mapped",[24027]],[[12079,12079],"mapped",[24037]],[[12080,12080],"mapped",[24049]],[[12081,12081],"mapped",[24062]],[[12082,12082],"mapped",[24178]],[[12083,12083],"mapped",[24186]],[[12084,12084],"mapped",[24191]],[[12085,12085],"mapped",[24308]],[[12086,12086],"mapped",[24318]],[[12087,12087],"mapped",[24331]],[[12088,12088],"mapped",[24339]],[[12089,12089],"mapped",[24400]],[[12090,12090],"mapped",[24417]],[[12091,12091],"mapped",[24435]],[[12092,12092],"mapped",[24515]],[[12093,12093],"mapped",[25096]],[[12094,12094],"mapped",[25142]],[[12095,12095],"mapped",[25163]],[[12096,12096],"mapped",[25903]],[[12097,12097],"mapped",[25908]],[[12098,12098],"mapped",[25991]],[[12099,12099],"mapped",[26007]],[[12100,12100],"mapped",[26020]],[[12101,12101],"mapped",[26041]],[[12102,12102],"mapped",[26080]],[[12103,12103],"mapped",[26085]],[[12104,12104],"mapped",[26352]],[[12105,12105],"mapped",[26376]],[[12106,12106],"mapped",[26408]],[[12107,12107],"mapped",[27424]],[[12108,12108],"mapped",[27490]],[[12109,12109],"mapped",[27513]],[[12110,12110],"mapped",[27571]],[[12111,12111],"mapped",[27595]],[[12112,12112],"mapped",[27604]],[[12113,12113],"mapped",[27611]],[[12114,12114],"mapped",[27663]],[[12115,12115],"mapped",[27668]],[[12116,12116],"mapped",[27700]],[[12117,12117],"mapped",[28779]],[[12118,12118],"mapped",[29226]],[[12119,12119],"mapped",[29238]],[[12120,12120],"mapped",[29243]],[[12121,12121],"mapped",[29247]],[[12122,12122],"mapped",[29255]],[[12123,12123],"mapped",[29273]],[[12124,12124],"mapped",[29275]],[[12125,12125],"mapped",[29356]],[[12126,12126],"mapped",[29572]],[[12127,12127],"mapped",[29577]],[[12128,12128],"mapped",[29916]],[[12129,12129],"mapped",[29926]],[[12130,12130],"mapped",[29976]],[[12131,12131],"mapped",[29983]],[[12132,12132],"mapped",[29992]],[[12133,12133],"mapped",[30000]],[[12134,12134],"mapped",[30091]],[[12135,12135],"mapped",[30098]],[[12136,12136],"mapped",[30326]],[[12137,12137],"mapped",[30333]],[[12138,12138],"mapped",[30382]],[[12139,12139],"mapped",[30399]],[[12140,12140],"mapped",[30446]],[[12141,12141],"mapped",[30683]],[[12142,12142],"mapped",[30690]],[[12143,12143],"mapped",[30707]],[[12144,12144],"mapped",[31034]],[[12145,12145],"mapped",[31160]],[[12146,12146],"mapped",[31166]],[[12147,12147],"mapped",[31348]],[[12148,12148],"mapped",[31435]],[[12149,12149],"mapped",[31481]],[[12150,12150],"mapped",[31859]],[[12151,12151],"mapped",[31992]],[[12152,12152],"mapped",[32566]],[[12153,12153],"mapped",[32593]],[[12154,12154],"mapped",[32650]],[[12155,12155],"mapped",[32701]],[[12156,12156],"mapped",[32769]],[[12157,12157],"mapped",[32780]],[[12158,12158],"mapped",[32786]],[[12159,12159],"mapped",[32819]],[[12160,12160],"mapped",[32895]],[[12161,12161],"mapped",[32905]],[[12162,12162],"mapped",[33251]],[[12163,12163],"mapped",[33258]],[[12164,12164],"mapped",[33267]],[[12165,12165],"mapped",[33276]],[[12166,12166],"mapped",[33292]],[[12167,12167],"mapped",[33307]],[[12168,12168],"mapped",[33311]],[[12169,12169],"mapped",[33390]],[[12170,12170],"mapped",[33394]],[[12171,12171],"mapped",[33400]],[[12172,12172],"mapped",[34381]],[[12173,12173],"mapped",[34411]],[[12174,12174],"mapped",[34880]],[[12175,12175],"mapped",[34892]],[[12176,12176],"mapped",[34915]],[[12177,12177],"mapped",[35198]],[[12178,12178],"mapped",[35211]],[[12179,12179],"mapped",[35282]],[[12180,12180],"mapped",[35328]],[[12181,12181],"mapped",[35895]],[[12182,12182],"mapped",[35910]],[[12183,12183],"mapped",[35925]],[[12184,12184],"mapped",[35960]],[[12185,12185],"mapped",[35997]],[[12186,12186],"mapped",[36196]],[[12187,12187],"mapped",[36208]],[[12188,12188],"mapped",[36275]],[[12189,12189],"mapped",[36523]],[[12190,12190],"mapped",[36554]],[[12191,12191],"mapped",[36763]],[[12192,12192],"mapped",[36784]],[[12193,12193],"mapped",[36789]],[[12194,12194],"mapped",[37009]],[[12195,12195],"mapped",[37193]],[[12196,12196],"mapped",[37318]],[[12197,12197],"mapped",[37324]],[[12198,12198],"mapped",[37329]],[[12199,12199],"mapped",[38263]],[[12200,12200],"mapped",[38272]],[[12201,12201],"mapped",[38428]],[[12202,12202],"mapped",[38582]],[[12203,12203],"mapped",[38585]],[[12204,12204],"mapped",[38632]],[[12205,12205],"mapped",[38737]],[[12206,12206],"mapped",[38750]],[[12207,12207],"mapped",[38754]],[[12208,12208],"mapped",[38761]],[[12209,12209],"mapped",[38859]],[[12210,12210],"mapped",[38893]],[[12211,12211],"mapped",[38899]],[[12212,12212],"mapped",[38913]],[[12213,12213],"mapped",[39080]],[[12214,12214],"mapped",[39131]],[[12215,12215],"mapped",[39135]],[[12216,12216],"mapped",[39318]],[[12217,12217],"mapped",[39321]],[[12218,12218],"mapped",[39340]],[[12219,12219],"mapped",[39592]],[[12220,12220],"mapped",[39640]],[[12221,12221],"mapped",[39647]],[[12222,12222],"mapped",[39717]],[[12223,12223],"mapped",[39727]],[[12224,12224],"mapped",[39730]],[[12225,12225],"mapped",[39740]],[[12226,12226],"mapped",[39770]],[[12227,12227],"mapped",[40165]],[[12228,12228],"mapped",[40565]],[[12229,12229],"mapped",[40575]],[[12230,12230],"mapped",[40613]],[[12231,12231],"mapped",[40635]],[[12232,12232],"mapped",[40643]],[[12233,12233],"mapped",[40653]],[[12234,12234],"mapped",[40657]],[[12235,12235],"mapped",[40697]],[[12236,12236],"mapped",[40701]],[[12237,12237],"mapped",[40718]],[[12238,12238],"mapped",[40723]],[[12239,12239],"mapped",[40736]],[[12240,12240],"mapped",[40763]],[[12241,12241],"mapped",[40778]],[[12242,12242],"mapped",[40786]],[[12243,12243],"mapped",[40845]],[[12244,12244],"mapped",[40860]],[[12245,12245],"mapped",[40864]],[[12246,12271],"disallowed"],[[12272,12283],"disallowed"],[[12284,12287],"disallowed"],[[12288,12288],"disallowed_STD3_mapped",[32]],[[12289,12289],"valid",[],"NV8"],[[12290,12290],"mapped",[46]],[[12291,12292],"valid",[],"NV8"],[[12293,12295],"valid"],[[12296,12329],"valid",[],"NV8"],[[12330,12333],"valid"],[[12334,12341],"valid",[],"NV8"],[[12342,12342],"mapped",[12306]],[[12343,12343],"valid",[],"NV8"],[[12344,12344],"mapped",[21313]],[[12345,12345],"mapped",[21316]],[[12346,12346],"mapped",[21317]],[[12347,12347],"valid",[],"NV8"],[[12348,12348],"valid"],[[12349,12349],"valid",[],"NV8"],[[12350,12350],"valid",[],"NV8"],[[12351,12351],"valid",[],"NV8"],[[12352,12352],"disallowed"],[[12353,12436],"valid"],[[12437,12438],"valid"],[[12439,12440],"disallowed"],[[12441,12442],"valid"],[[12443,12443],"disallowed_STD3_mapped",[32,12441]],[[12444,12444],"disallowed_STD3_mapped",[32,12442]],[[12445,12446],"valid"],[[12447,12447],"mapped",[12424,12426]],[[12448,12448],"valid",[],"NV8"],[[12449,12542],"valid"],[[12543,12543],"mapped",[12467,12488]],[[12544,12548],"disallowed"],[[12549,12588],"valid"],[[12589,12589],"valid"],[[12590,12592],"disallowed"],[[12593,12593],"mapped",[4352]],[[12594,12594],"mapped",[4353]],[[12595,12595],"mapped",[4522]],[[12596,12596],"mapped",[4354]],[[12597,12597],"mapped",[4524]],[[12598,12598],"mapped",[4525]],[[12599,12599],"mapped",[4355]],[[12600,12600],"mapped",[4356]],[[12601,12601],"mapped",[4357]],[[12602,12602],"mapped",[4528]],[[12603,12603],"mapped",[4529]],[[12604,12604],"mapped",[4530]],[[12605,12605],"mapped",[4531]],[[12606,12606],"mapped",[4532]],[[12607,12607],"mapped",[4533]],[[12608,12608],"mapped",[4378]],[[12609,12609],"mapped",[4358]],[[12610,12610],"mapped",[4359]],[[12611,12611],"mapped",[4360]],[[12612,12612],"mapped",[4385]],[[12613,12613],"mapped",[4361]],[[12614,12614],"mapped",[4362]],[[12615,12615],"mapped",[4363]],[[12616,12616],"mapped",[4364]],[[12617,12617],"mapped",[4365]],[[12618,12618],"mapped",[4366]],[[12619,12619],"mapped",[4367]],[[12620,12620],"mapped",[4368]],[[12621,12621],"mapped",[4369]],[[12622,12622],"mapped",[4370]],[[12623,12623],"mapped",[4449]],[[12624,12624],"mapped",[4450]],[[12625,12625],"mapped",[4451]],[[12626,12626],"mapped",[4452]],[[12627,12627],"mapped",[4453]],[[12628,12628],"mapped",[4454]],[[12629,12629],"mapped",[4455]],[[12630,12630],"mapped",[4456]],[[12631,12631],"mapped",[4457]],[[12632,12632],"mapped",[4458]],[[12633,12633],"mapped",[4459]],[[12634,12634],"mapped",[4460]],[[12635,12635],"mapped",[4461]],[[12636,12636],"mapped",[4462]],[[12637,12637],"mapped",[4463]],[[12638,12638],"mapped",[4464]],[[12639,12639],"mapped",[4465]],[[12640,12640],"mapped",[4466]],[[12641,12641],"mapped",[4467]],[[12642,12642],"mapped",[4468]],[[12643,12643],"mapped",[4469]],[[12644,12644],"disallowed"],[[12645,12645],"mapped",[4372]],[[12646,12646],"mapped",[4373]],[[12647,12647],"mapped",[4551]],[[12648,12648],"mapped",[4552]],[[12649,12649],"mapped",[4556]],[[12650,12650],"mapped",[4558]],[[12651,12651],"mapped",[4563]],[[12652,12652],"mapped",[4567]],[[12653,12653],"mapped",[4569]],[[12654,12654],"mapped",[4380]],[[12655,12655],"mapped",[4573]],[[12656,12656],"mapped",[4575]],[[12657,12657],"mapped",[4381]],[[12658,12658],"mapped",[4382]],[[12659,12659],"mapped",[4384]],[[12660,12660],"mapped",[4386]],[[12661,12661],"mapped",[4387]],[[12662,12662],"mapped",[4391]],[[12663,12663],"mapped",[4393]],[[12664,12664],"mapped",[4395]],[[12665,12665],"mapped",[4396]],[[12666,12666],"mapped",[4397]],[[12667,12667],"mapped",[4398]],[[12668,12668],"mapped",[4399]],[[12669,12669],"mapped",[4402]],[[12670,12670],"mapped",[4406]],[[12671,12671],"mapped",[4416]],[[12672,12672],"mapped",[4423]],[[12673,12673],"mapped",[4428]],[[12674,12674],"mapped",[4593]],[[12675,12675],"mapped",[4594]],[[12676,12676],"mapped",[4439]],[[12677,12677],"mapped",[4440]],[[12678,12678],"mapped",[4441]],[[12679,12679],"mapped",[4484]],[[12680,12680],"mapped",[4485]],[[12681,12681],"mapped",[4488]],[[12682,12682],"mapped",[4497]],[[12683,12683],"mapped",[4498]],[[12684,12684],"mapped",[4500]],[[12685,12685],"mapped",[4510]],[[12686,12686],"mapped",[4513]],[[12687,12687],"disallowed"],[[12688,12689],"valid",[],"NV8"],[[12690,12690],"mapped",[19968]],[[12691,12691],"mapped",[20108]],[[12692,12692],"mapped",[19977]],[[12693,12693],"mapped",[22235]],[[12694,12694],"mapped",[19978]],[[12695,12695],"mapped",[20013]],[[12696,12696],"mapped",[19979]],[[12697,12697],"mapped",[30002]],[[12698,12698],"mapped",[20057]],[[12699,12699],"mapped",[19993]],[[12700,12700],"mapped",[19969]],[[12701,12701],"mapped",[22825]],[[12702,12702],"mapped",[22320]],[[12703,12703],"mapped",[20154]],[[12704,12727],"valid"],[[12728,12730],"valid"],[[12731,12735],"disallowed"],[[12736,12751],"valid",[],"NV8"],[[12752,12771],"valid",[],"NV8"],[[12772,12783],"disallowed"],[[12784,12799],"valid"],[[12800,12800],"disallowed_STD3_mapped",[40,4352,41]],[[12801,12801],"disallowed_STD3_mapped",[40,4354,41]],[[12802,12802],"disallowed_STD3_mapped",[40,4355,41]],[[12803,12803],"disallowed_STD3_mapped",[40,4357,41]],[[12804,12804],"disallowed_STD3_mapped",[40,4358,41]],[[12805,12805],"disallowed_STD3_mapped",[40,4359,41]],[[12806,12806],"disallowed_STD3_mapped",[40,4361,41]],[[12807,12807],"disallowed_STD3_mapped",[40,4363,41]],[[12808,12808],"disallowed_STD3_mapped",[40,4364,41]],[[12809,12809],"disallowed_STD3_mapped",[40,4366,41]],[[12810,12810],"disallowed_STD3_mapped",[40,4367,41]],[[12811,12811],"disallowed_STD3_mapped",[40,4368,41]],[[12812,12812],"disallowed_STD3_mapped",[40,4369,41]],[[12813,12813],"disallowed_STD3_mapped",[40,4370,41]],[[12814,12814],"disallowed_STD3_mapped",[40,44032,41]],[[12815,12815],"disallowed_STD3_mapped",[40,45208,41]],[[12816,12816],"disallowed_STD3_mapped",[40,45796,41]],[[12817,12817],"disallowed_STD3_mapped",[40,46972,41]],[[12818,12818],"disallowed_STD3_mapped",[40,47560,41]],[[12819,12819],"disallowed_STD3_mapped",[40,48148,41]],[[12820,12820],"disallowed_STD3_mapped",[40,49324,41]],[[12821,12821],"disallowed_STD3_mapped",[40,50500,41]],[[12822,12822],"disallowed_STD3_mapped",[40,51088,41]],[[12823,12823],"disallowed_STD3_mapped",[40,52264,41]],[[12824,12824],"disallowed_STD3_mapped",[40,52852,41]],[[12825,12825],"disallowed_STD3_mapped",[40,53440,41]],[[12826,12826],"disallowed_STD3_mapped",[40,54028,41]],[[12827,12827],"disallowed_STD3_mapped",[40,54616,41]],[[12828,12828],"disallowed_STD3_mapped",[40,51452,41]],[[12829,12829],"disallowed_STD3_mapped",[40,50724,51204,41]],[[12830,12830],"disallowed_STD3_mapped",[40,50724,54980,41]],[[12831,12831],"disallowed"],[[12832,12832],"disallowed_STD3_mapped",[40,19968,41]],[[12833,12833],"disallowed_STD3_mapped",[40,20108,41]],[[12834,12834],"disallowed_STD3_mapped",[40,19977,41]],[[12835,12835],"disallowed_STD3_mapped",[40,22235,41]],[[12836,12836],"disallowed_STD3_mapped",[40,20116,41]],[[12837,12837],"disallowed_STD3_mapped",[40,20845,41]],[[12838,12838],"disallowed_STD3_mapped",[40,19971,41]],[[12839,12839],"disallowed_STD3_mapped",[40,20843,41]],[[12840,12840],"disallowed_STD3_mapped",[40,20061,41]],[[12841,12841],"disallowed_STD3_mapped",[40,21313,41]],[[12842,12842],"disallowed_STD3_mapped",[40,26376,41]],[[12843,12843],"disallowed_STD3_mapped",[40,28779,41]],[[12844,12844],"disallowed_STD3_mapped",[40,27700,41]],[[12845,12845],"disallowed_STD3_mapped",[40,26408,41]],[[12846,12846],"disallowed_STD3_mapped",[40,37329,41]],[[12847,12847],"disallowed_STD3_mapped",[40,22303,41]],[[12848,12848],"disallowed_STD3_mapped",[40,26085,41]],[[12849,12849],"disallowed_STD3_mapped",[40,26666,41]],[[12850,12850],"disallowed_STD3_mapped",[40,26377,41]],[[12851,12851],"disallowed_STD3_mapped",[40,31038,41]],[[12852,12852],"disallowed_STD3_mapped",[40,21517,41]],[[12853,12853],"disallowed_STD3_mapped",[40,29305,41]],[[12854,12854],"disallowed_STD3_mapped",[40,36001,41]],[[12855,12855],"disallowed_STD3_mapped",[40,31069,41]],[[12856,12856],"disallowed_STD3_mapped",[40,21172,41]],[[12857,12857],"disallowed_STD3_mapped",[40,20195,41]],[[12858,12858],"disallowed_STD3_mapped",[40,21628,41]],[[12859,12859],"disallowed_STD3_mapped",[40,23398,41]],[[12860,12860],"disallowed_STD3_mapped",[40,30435,41]],[[12861,12861],"disallowed_STD3_mapped",[40,20225,41]],[[12862,12862],"disallowed_STD3_mapped",[40,36039,41]],[[12863,12863],"disallowed_STD3_mapped",[40,21332,41]],[[12864,12864],"disallowed_STD3_mapped",[40,31085,41]],[[12865,12865],"disallowed_STD3_mapped",[40,20241,41]],[[12866,12866],"disallowed_STD3_mapped",[40,33258,41]],[[12867,12867],"disallowed_STD3_mapped",[40,33267,41]],[[12868,12868],"mapped",[21839]],[[12869,12869],"mapped",[24188]],[[12870,12870],"mapped",[25991]],[[12871,12871],"mapped",[31631]],[[12872,12879],"valid",[],"NV8"],[[12880,12880],"mapped",[112,116,101]],[[12881,12881],"mapped",[50,49]],[[12882,12882],"mapped",[50,50]],[[12883,12883],"mapped",[50,51]],[[12884,12884],"mapped",[50,52]],[[12885,12885],"mapped",[50,53]],[[12886,12886],"mapped",[50,54]],[[12887,12887],"mapped",[50,55]],[[12888,12888],"mapped",[50,56]],[[12889,12889],"mapped",[50,57]],[[12890,12890],"mapped",[51,48]],[[12891,12891],"mapped",[51,49]],[[12892,12892],"mapped",[51,50]],[[12893,12893],"mapped",[51,51]],[[12894,12894],"mapped",[51,52]],[[12895,12895],"mapped",[51,53]],[[12896,12896],"mapped",[4352]],[[12897,12897],"mapped",[4354]],[[12898,12898],"mapped",[4355]],[[12899,12899],"mapped",[4357]],[[12900,12900],"mapped",[4358]],[[12901,12901],"mapped",[4359]],[[12902,12902],"mapped",[4361]],[[12903,12903],"mapped",[4363]],[[12904,12904],"mapped",[4364]],[[12905,12905],"mapped",[4366]],[[12906,12906],"mapped",[4367]],[[12907,12907],"mapped",[4368]],[[12908,12908],"mapped",[4369]],[[12909,12909],"mapped",[4370]],[[12910,12910],"mapped",[44032]],[[12911,12911],"mapped",[45208]],[[12912,12912],"mapped",[45796]],[[12913,12913],"mapped",[46972]],[[12914,12914],"mapped",[47560]],[[12915,12915],"mapped",[48148]],[[12916,12916],"mapped",[49324]],[[12917,12917],"mapped",[50500]],[[12918,12918],"mapped",[51088]],[[12919,12919],"mapped",[52264]],[[12920,12920],"mapped",[52852]],[[12921,12921],"mapped",[53440]],[[12922,12922],"mapped",[54028]],[[12923,12923],"mapped",[54616]],[[12924,12924],"mapped",[52280,44256]],[[12925,12925],"mapped",[51452,51032]],[[12926,12926],"mapped",[50864]],[[12927,12927],"valid",[],"NV8"],[[12928,12928],"mapped",[19968]],[[12929,12929],"mapped",[20108]],[[12930,12930],"mapped",[19977]],[[12931,12931],"mapped",[22235]],[[12932,12932],"mapped",[20116]],[[12933,12933],"mapped",[20845]],[[12934,12934],"mapped",[19971]],[[12935,12935],"mapped",[20843]],[[12936,12936],"mapped",[20061]],[[12937,12937],"mapped",[21313]],[[12938,12938],"mapped",[26376]],[[12939,12939],"mapped",[28779]],[[12940,12940],"mapped",[27700]],[[12941,12941],"mapped",[26408]],[[12942,12942],"mapped",[37329]],[[12943,12943],"mapped",[22303]],[[12944,12944],"mapped",[26085]],[[12945,12945],"mapped",[26666]],[[12946,12946],"mapped",[26377]],[[12947,12947],"mapped",[31038]],[[12948,12948],"mapped",[21517]],[[12949,12949],"mapped",[29305]],[[12950,12950],"mapped",[36001]],[[12951,12951],"mapped",[31069]],[[12952,12952],"mapped",[21172]],[[12953,12953],"mapped",[31192]],[[12954,12954],"mapped",[30007]],[[12955,12955],"mapped",[22899]],[[12956,12956],"mapped",[36969]],[[12957,12957],"mapped",[20778]],[[12958,12958],"mapped",[21360]],[[12959,12959],"mapped",[27880]],[[12960,12960],"mapped",[38917]],[[12961,12961],"mapped",[20241]],[[12962,12962],"mapped",[20889]],[[12963,12963],"mapped",[27491]],[[12964,12964],"mapped",[19978]],[[12965,12965],"mapped",[20013]],[[12966,12966],"mapped",[19979]],[[12967,12967],"mapped",[24038]],[[12968,12968],"mapped",[21491]],[[12969,12969],"mapped",[21307]],[[12970,12970],"mapped",[23447]],[[12971,12971],"mapped",[23398]],[[12972,12972],"mapped",[30435]],[[12973,12973],"mapped",[20225]],[[12974,12974],"mapped",[36039]],[[12975,12975],"mapped",[21332]],[[12976,12976],"mapped",[22812]],[[12977,12977],"mapped",[51,54]],[[12978,12978],"mapped",[51,55]],[[12979,12979],"mapped",[51,56]],[[12980,12980],"mapped",[51,57]],[[12981,12981],"mapped",[52,48]],[[12982,12982],"mapped",[52,49]],[[12983,12983],"mapped",[52,50]],[[12984,12984],"mapped",[52,51]],[[12985,12985],"mapped",[52,52]],[[12986,12986],"mapped",[52,53]],[[12987,12987],"mapped",[52,54]],[[12988,12988],"mapped",[52,55]],[[12989,12989],"mapped",[52,56]],[[12990,12990],"mapped",[52,57]],[[12991,12991],"mapped",[53,48]],[[12992,12992],"mapped",[49,26376]],[[12993,12993],"mapped",[50,26376]],[[12994,12994],"mapped",[51,26376]],[[12995,12995],"mapped",[52,26376]],[[12996,12996],"mapped",[53,26376]],[[12997,12997],"mapped",[54,26376]],[[12998,12998],"mapped",[55,26376]],[[12999,12999],"mapped",[56,26376]],[[13000,13000],"mapped",[57,26376]],[[13001,13001],"mapped",[49,48,26376]],[[13002,13002],"mapped",[49,49,26376]],[[13003,13003],"mapped",[49,50,26376]],[[13004,13004],"mapped",[104,103]],[[13005,13005],"mapped",[101,114,103]],[[13006,13006],"mapped",[101,118]],[[13007,13007],"mapped",[108,116,100]],[[13008,13008],"mapped",[12450]],[[13009,13009],"mapped",[12452]],[[13010,13010],"mapped",[12454]],[[13011,13011],"mapped",[12456]],[[13012,13012],"mapped",[12458]],[[13013,13013],"mapped",[12459]],[[13014,13014],"mapped",[12461]],[[13015,13015],"mapped",[12463]],[[13016,13016],"mapped",[12465]],[[13017,13017],"mapped",[12467]],[[13018,13018],"mapped",[12469]],[[13019,13019],"mapped",[12471]],[[13020,13020],"mapped",[12473]],[[13021,13021],"mapped",[12475]],[[13022,13022],"mapped",[12477]],[[13023,13023],"mapped",[12479]],[[13024,13024],"mapped",[12481]],[[13025,13025],"mapped",[12484]],[[13026,13026],"mapped",[12486]],[[13027,13027],"mapped",[12488]],[[13028,13028],"mapped",[12490]],[[13029,13029],"mapped",[12491]],[[13030,13030],"mapped",[12492]],[[13031,13031],"mapped",[12493]],[[13032,13032],"mapped",[12494]],[[13033,13033],"mapped",[12495]],[[13034,13034],"mapped",[12498]],[[13035,13035],"mapped",[12501]],[[13036,13036],"mapped",[12504]],[[13037,13037],"mapped",[12507]],[[13038,13038],"mapped",[12510]],[[13039,13039],"mapped",[12511]],[[13040,13040],"mapped",[12512]],[[13041,13041],"mapped",[12513]],[[13042,13042],"mapped",[12514]],[[13043,13043],"mapped",[12516]],[[13044,13044],"mapped",[12518]],[[13045,13045],"mapped",[12520]],[[13046,13046],"mapped",[12521]],[[13047,13047],"mapped",[12522]],[[13048,13048],"mapped",[12523]],[[13049,13049],"mapped",[12524]],[[13050,13050],"mapped",[12525]],[[13051,13051],"mapped",[12527]],[[13052,13052],"mapped",[12528]],[[13053,13053],"mapped",[12529]],[[13054,13054],"mapped",[12530]],[[13055,13055],"disallowed"],[[13056,13056],"mapped",[12450,12497,12540,12488]],[[13057,13057],"mapped",[12450,12523,12501,12449]],[[13058,13058],"mapped",[12450,12531,12506,12450]],[[13059,13059],"mapped",[12450,12540,12523]],[[13060,13060],"mapped",[12452,12491,12531,12464]],[[13061,13061],"mapped",[12452,12531,12481]],[[13062,13062],"mapped",[12454,12457,12531]],[[13063,13063],"mapped",[12456,12473,12463,12540,12489]],[[13064,13064],"mapped",[12456,12540,12459,12540]],[[13065,13065],"mapped",[12458,12531,12473]],[[13066,13066],"mapped",[12458,12540,12512]],[[13067,13067],"mapped",[12459,12452,12522]],[[13068,13068],"mapped",[12459,12521,12483,12488]],[[13069,13069],"mapped",[12459,12525,12522,12540]],[[13070,13070],"mapped",[12460,12525,12531]],[[13071,13071],"mapped",[12460,12531,12510]],[[13072,13072],"mapped",[12462,12460]],[[13073,13073],"mapped",[12462,12491,12540]],[[13074,13074],"mapped",[12461,12517,12522,12540]],[[13075,13075],"mapped",[12462,12523,12480,12540]],[[13076,13076],"mapped",[12461,12525]],[[13077,13077],"mapped",[12461,12525,12464,12521,12512]],[[13078,13078],"mapped",[12461,12525,12513,12540,12488,12523]],[[13079,13079],"mapped",[12461,12525,12527,12483,12488]],[[13080,13080],"mapped",[12464,12521,12512]],[[13081,13081],"mapped",[12464,12521,12512,12488,12531]],[[13082,13082],"mapped",[12463,12523,12476,12452,12525]],[[13083,13083],"mapped",[12463,12525,12540,12493]],[[13084,13084],"mapped",[12465,12540,12473]],[[13085,13085],"mapped",[12467,12523,12490]],[[13086,13086],"mapped",[12467,12540,12509]],[[13087,13087],"mapped",[12469,12452,12463,12523]],[[13088,13088],"mapped",[12469,12531,12481,12540,12512]],[[13089,13089],"mapped",[12471,12522,12531,12464]],[[13090,13090],"mapped",[12475,12531,12481]],[[13091,13091],"mapped",[12475,12531,12488]],[[13092,13092],"mapped",[12480,12540,12473]],[[13093,13093],"mapped",[12487,12471]],[[13094,13094],"mapped",[12489,12523]],[[13095,13095],"mapped",[12488,12531]],[[13096,13096],"mapped",[12490,12494]],[[13097,13097],"mapped",[12494,12483,12488]],[[13098,13098],"mapped",[12495,12452,12484]],[[13099,13099],"mapped",[12497,12540,12475,12531,12488]],[[13100,13100],"mapped",[12497,12540,12484]],[[13101,13101],"mapped",[12496,12540,12524,12523]],[[13102,13102],"mapped",[12500,12450,12473,12488,12523]],[[13103,13103],"mapped",[12500,12463,12523]],[[13104,13104],"mapped",[12500,12467]],[[13105,13105],"mapped",[12499,12523]],[[13106,13106],"mapped",[12501,12449,12521,12483,12489]],[[13107,13107],"mapped",[12501,12451,12540,12488]],[[13108,13108],"mapped",[12502,12483,12471,12455,12523]],[[13109,13109],"mapped",[12501,12521,12531]],[[13110,13110],"mapped",[12504,12463,12479,12540,12523]],[[13111,13111],"mapped",[12506,12477]],[[13112,13112],"mapped",[12506,12491,12498]],[[13113,13113],"mapped",[12504,12523,12484]],[[13114,13114],"mapped",[12506,12531,12473]],[[13115,13115],"mapped",[12506,12540,12472]],[[13116,13116],"mapped",[12505,12540,12479]],[[13117,13117],"mapped",[12509,12452,12531,12488]],[[13118,13118],"mapped",[12508,12523,12488]],[[13119,13119],"mapped",[12507,12531]],[[13120,13120],"mapped",[12509,12531,12489]],[[13121,13121],"mapped",[12507,12540,12523]],[[13122,13122],"mapped",[12507,12540,12531]],[[13123,13123],"mapped",[12510,12452,12463,12525]],[[13124,13124],"mapped",[12510,12452,12523]],[[13125,13125],"mapped",[12510,12483,12495]],[[13126,13126],"mapped",[12510,12523,12463]],[[13127,13127],"mapped",[12510,12531,12471,12519,12531]],[[13128,13128],"mapped",[12511,12463,12525,12531]],[[13129,13129],"mapped",[12511,12522]],[[13130,13130],"mapped",[12511,12522,12496,12540,12523]],[[13131,13131],"mapped",[12513,12460]],[[13132,13132],"mapped",[12513,12460,12488,12531]],[[13133,13133],"mapped",[12513,12540,12488,12523]],[[13134,13134],"mapped",[12516,12540,12489]],[[13135,13135],"mapped",[12516,12540,12523]],[[13136,13136],"mapped",[12518,12450,12531]],[[13137,13137],"mapped",[12522,12483,12488,12523]],[[13138,13138],"mapped",[12522,12521]],[[13139,13139],"mapped",[12523,12500,12540]],[[13140,13140],"mapped",[12523,12540,12502,12523]],[[13141,13141],"mapped",[12524,12512]],[[13142,13142],"mapped",[12524,12531,12488,12466,12531]],[[13143,13143],"mapped",[12527,12483,12488]],[[13144,13144],"mapped",[48,28857]],[[13145,13145],"mapped",[49,28857]],[[13146,13146],"mapped",[50,28857]],[[13147,13147],"mapped",[51,28857]],[[13148,13148],"mapped",[52,28857]],[[13149,13149],"mapped",[53,28857]],[[13150,13150],"mapped",[54,28857]],[[13151,13151],"mapped",[55,28857]],[[13152,13152],"mapped",[56,28857]],[[13153,13153],"mapped",[57,28857]],[[13154,13154],"mapped",[49,48,28857]],[[13155,13155],"mapped",[49,49,28857]],[[13156,13156],"mapped",[49,50,28857]],[[13157,13157],"mapped",[49,51,28857]],[[13158,13158],"mapped",[49,52,28857]],[[13159,13159],"mapped",[49,53,28857]],[[13160,13160],"mapped",[49,54,28857]],[[13161,13161],"mapped",[49,55,28857]],[[13162,13162],"mapped",[49,56,28857]],[[13163,13163],"mapped",[49,57,28857]],[[13164,13164],"mapped",[50,48,28857]],[[13165,13165],"mapped",[50,49,28857]],[[13166,13166],"mapped",[50,50,28857]],[[13167,13167],"mapped",[50,51,28857]],[[13168,13168],"mapped",[50,52,28857]],[[13169,13169],"mapped",[104,112,97]],[[13170,13170],"mapped",[100,97]],[[13171,13171],"mapped",[97,117]],[[13172,13172],"mapped",[98,97,114]],[[13173,13173],"mapped",[111,118]],[[13174,13174],"mapped",[112,99]],[[13175,13175],"mapped",[100,109]],[[13176,13176],"mapped",[100,109,50]],[[13177,13177],"mapped",[100,109,51]],[[13178,13178],"mapped",[105,117]],[[13179,13179],"mapped",[24179,25104]],[[13180,13180],"mapped",[26157,21644]],[[13181,13181],"mapped",[22823,27491]],[[13182,13182],"mapped",[26126,27835]],[[13183,13183],"mapped",[26666,24335,20250,31038]],[[13184,13184],"mapped",[112,97]],[[13185,13185],"mapped",[110,97]],[[13186,13186],"mapped",[956,97]],[[13187,13187],"mapped",[109,97]],[[13188,13188],"mapped",[107,97]],[[13189,13189],"mapped",[107,98]],[[13190,13190],"mapped",[109,98]],[[13191,13191],"mapped",[103,98]],[[13192,13192],"mapped",[99,97,108]],[[13193,13193],"mapped",[107,99,97,108]],[[13194,13194],"mapped",[112,102]],[[13195,13195],"mapped",[110,102]],[[13196,13196],"mapped",[956,102]],[[13197,13197],"mapped",[956,103]],[[13198,13198],"mapped",[109,103]],[[13199,13199],"mapped",[107,103]],[[13200,13200],"mapped",[104,122]],[[13201,13201],"mapped",[107,104,122]],[[13202,13202],"mapped",[109,104,122]],[[13203,13203],"mapped",[103,104,122]],[[13204,13204],"mapped",[116,104,122]],[[13205,13205],"mapped",[956,108]],[[13206,13206],"mapped",[109,108]],[[13207,13207],"mapped",[100,108]],[[13208,13208],"mapped",[107,108]],[[13209,13209],"mapped",[102,109]],[[13210,13210],"mapped",[110,109]],[[13211,13211],"mapped",[956,109]],[[13212,13212],"mapped",[109,109]],[[13213,13213],"mapped",[99,109]],[[13214,13214],"mapped",[107,109]],[[13215,13215],"mapped",[109,109,50]],[[13216,13216],"mapped",[99,109,50]],[[13217,13217],"mapped",[109,50]],[[13218,13218],"mapped",[107,109,50]],[[13219,13219],"mapped",[109,109,51]],[[13220,13220],"mapped",[99,109,51]],[[13221,13221],"mapped",[109,51]],[[13222,13222],"mapped",[107,109,51]],[[13223,13223],"mapped",[109,8725,115]],[[13224,13224],"mapped",[109,8725,115,50]],[[13225,13225],"mapped",[112,97]],[[13226,13226],"mapped",[107,112,97]],[[13227,13227],"mapped",[109,112,97]],[[13228,13228],"mapped",[103,112,97]],[[13229,13229],"mapped",[114,97,100]],[[13230,13230],"mapped",[114,97,100,8725,115]],[[13231,13231],"mapped",[114,97,100,8725,115,50]],[[13232,13232],"mapped",[112,115]],[[13233,13233],"mapped",[110,115]],[[13234,13234],"mapped",[956,115]],[[13235,13235],"mapped",[109,115]],[[13236,13236],"mapped",[112,118]],[[13237,13237],"mapped",[110,118]],[[13238,13238],"mapped",[956,118]],[[13239,13239],"mapped",[109,118]],[[13240,13240],"mapped",[107,118]],[[13241,13241],"mapped",[109,118]],[[13242,13242],"mapped",[112,119]],[[13243,13243],"mapped",[110,119]],[[13244,13244],"mapped",[956,119]],[[13245,13245],"mapped",[109,119]],[[13246,13246],"mapped",[107,119]],[[13247,13247],"mapped",[109,119]],[[13248,13248],"mapped",[107,969]],[[13249,13249],"mapped",[109,969]],[[13250,13250],"disallowed"],[[13251,13251],"mapped",[98,113]],[[13252,13252],"mapped",[99,99]],[[13253,13253],"mapped",[99,100]],[[13254,13254],"mapped",[99,8725,107,103]],[[13255,13255],"disallowed"],[[13256,13256],"mapped",[100,98]],[[13257,13257],"mapped",[103,121]],[[13258,13258],"mapped",[104,97]],[[13259,13259],"mapped",[104,112]],[[13260,13260],"mapped",[105,110]],[[13261,13261],"mapped",[107,107]],[[13262,13262],"mapped",[107,109]],[[13263,13263],"mapped",[107,116]],[[13264,13264],"mapped",[108,109]],[[13265,13265],"mapped",[108,110]],[[13266,13266],"mapped",[108,111,103]],[[13267,13267],"mapped",[108,120]],[[13268,13268],"mapped",[109,98]],[[13269,13269],"mapped",[109,105,108]],[[13270,13270],"mapped",[109,111,108]],[[13271,13271],"mapped",[112,104]],[[13272,13272],"disallowed"],[[13273,13273],"mapped",[112,112,109]],[[13274,13274],"mapped",[112,114]],[[13275,13275],"mapped",[115,114]],[[13276,13276],"mapped",[115,118]],[[13277,13277],"mapped",[119,98]],[[13278,13278],"mapped",[118,8725,109]],[[13279,13279],"mapped",[97,8725,109]],[[13280,13280],"mapped",[49,26085]],[[13281,13281],"mapped",[50,26085]],[[13282,13282],"mapped",[51,26085]],[[13283,13283],"mapped",[52,26085]],[[13284,13284],"mapped",[53,26085]],[[13285,13285],"mapped",[54,26085]],[[13286,13286],"mapped",[55,26085]],[[13287,13287],"mapped",[56,26085]],[[13288,13288],"mapped",[57,26085]],[[13289,13289],"mapped",[49,48,26085]],[[13290,13290],"mapped",[49,49,26085]],[[13291,13291],"mapped",[49,50,26085]],[[13292,13292],"mapped",[49,51,26085]],[[13293,13293],"mapped",[49,52,26085]],[[13294,13294],"mapped",[49,53,26085]],[[13295,13295],"mapped",[49,54,26085]],[[13296,13296],"mapped",[49,55,26085]],[[13297,13297],"mapped",[49,56,26085]],[[13298,13298],"mapped",[49,57,26085]],[[13299,13299],"mapped",[50,48,26085]],[[13300,13300],"mapped",[50,49,26085]],[[13301,13301],"mapped",[50,50,26085]],[[13302,13302],"mapped",[50,51,26085]],[[13303,13303],"mapped",[50,52,26085]],[[13304,13304],"mapped",[50,53,26085]],[[13305,13305],"mapped",[50,54,26085]],[[13306,13306],"mapped",[50,55,26085]],[[13307,13307],"mapped",[50,56,26085]],[[13308,13308],"mapped",[50,57,26085]],[[13309,13309],"mapped",[51,48,26085]],[[13310,13310],"mapped",[51,49,26085]],[[13311,13311],"mapped",[103,97,108]],[[13312,19893],"valid"],[[19894,19903],"disallowed"],[[19904,19967],"valid",[],"NV8"],[[19968,40869],"valid"],[[40870,40891],"valid"],[[40892,40899],"valid"],[[40900,40907],"valid"],[[40908,40908],"valid"],[[40909,40917],"valid"],[[40918,40959],"disallowed"],[[40960,42124],"valid"],[[42125,42127],"disallowed"],[[42128,42145],"valid",[],"NV8"],[[42146,42147],"valid",[],"NV8"],[[42148,42163],"valid",[],"NV8"],[[42164,42164],"valid",[],"NV8"],[[42165,42176],"valid",[],"NV8"],[[42177,42177],"valid",[],"NV8"],[[42178,42180],"valid",[],"NV8"],[[42181,42181],"valid",[],"NV8"],[[42182,42182],"valid",[],"NV8"],[[42183,42191],"disallowed"],[[42192,42237],"valid"],[[42238,42239],"valid",[],"NV8"],[[42240,42508],"valid"],[[42509,42511],"valid",[],"NV8"],[[42512,42539],"valid"],[[42540,42559],"disallowed"],[[42560,42560],"mapped",[42561]],[[42561,42561],"valid"],[[42562,42562],"mapped",[42563]],[[42563,42563],"valid"],[[42564,42564],"mapped",[42565]],[[42565,42565],"valid"],[[42566,42566],"mapped",[42567]],[[42567,42567],"valid"],[[42568,42568],"mapped",[42569]],[[42569,42569],"valid"],[[42570,42570],"mapped",[42571]],[[42571,42571],"valid"],[[42572,42572],"mapped",[42573]],[[42573,42573],"valid"],[[42574,42574],"mapped",[42575]],[[42575,42575],"valid"],[[42576,42576],"mapped",[42577]],[[42577,42577],"valid"],[[42578,42578],"mapped",[42579]],[[42579,42579],"valid"],[[42580,42580],"mapped",[42581]],[[42581,42581],"valid"],[[42582,42582],"mapped",[42583]],[[42583,42583],"valid"],[[42584,42584],"mapped",[42585]],[[42585,42585],"valid"],[[42586,42586],"mapped",[42587]],[[42587,42587],"valid"],[[42588,42588],"mapped",[42589]],[[42589,42589],"valid"],[[42590,42590],"mapped",[42591]],[[42591,42591],"valid"],[[42592,42592],"mapped",[42593]],[[42593,42593],"valid"],[[42594,42594],"mapped",[42595]],[[42595,42595],"valid"],[[42596,42596],"mapped",[42597]],[[42597,42597],"valid"],[[42598,42598],"mapped",[42599]],[[42599,42599],"valid"],[[42600,42600],"mapped",[42601]],[[42601,42601],"valid"],[[42602,42602],"mapped",[42603]],[[42603,42603],"valid"],[[42604,42604],"mapped",[42605]],[[42605,42607],"valid"],[[42608,42611],"valid",[],"NV8"],[[42612,42619],"valid"],[[42620,42621],"valid"],[[42622,42622],"valid",[],"NV8"],[[42623,42623],"valid"],[[42624,42624],"mapped",[42625]],[[42625,42625],"valid"],[[42626,42626],"mapped",[42627]],[[42627,42627],"valid"],[[42628,42628],"mapped",[42629]],[[42629,42629],"valid"],[[42630,42630],"mapped",[42631]],[[42631,42631],"valid"],[[42632,42632],"mapped",[42633]],[[42633,42633],"valid"],[[42634,42634],"mapped",[42635]],[[42635,42635],"valid"],[[42636,42636],"mapped",[42637]],[[42637,42637],"valid"],[[42638,42638],"mapped",[42639]],[[42639,42639],"valid"],[[42640,42640],"mapped",[42641]],[[42641,42641],"valid"],[[42642,42642],"mapped",[42643]],[[42643,42643],"valid"],[[42644,42644],"mapped",[42645]],[[42645,42645],"valid"],[[42646,42646],"mapped",[42647]],[[42647,42647],"valid"],[[42648,42648],"mapped",[42649]],[[42649,42649],"valid"],[[42650,42650],"mapped",[42651]],[[42651,42651],"valid"],[[42652,42652],"mapped",[1098]],[[42653,42653],"mapped",[1100]],[[42654,42654],"valid"],[[42655,42655],"valid"],[[42656,42725],"valid"],[[42726,42735],"valid",[],"NV8"],[[42736,42737],"valid"],[[42738,42743],"valid",[],"NV8"],[[42744,42751],"disallowed"],[[42752,42774],"valid",[],"NV8"],[[42775,42778],"valid"],[[42779,42783],"valid"],[[42784,42785],"valid",[],"NV8"],[[42786,42786],"mapped",[42787]],[[42787,42787],"valid"],[[42788,42788],"mapped",[42789]],[[42789,42789],"valid"],[[42790,42790],"mapped",[42791]],[[42791,42791],"valid"],[[42792,42792],"mapped",[42793]],[[42793,42793],"valid"],[[42794,42794],"mapped",[42795]],[[42795,42795],"valid"],[[42796,42796],"mapped",[42797]],[[42797,42797],"valid"],[[42798,42798],"mapped",[42799]],[[42799,42801],"valid"],[[42802,42802],"mapped",[42803]],[[42803,42803],"valid"],[[42804,42804],"mapped",[42805]],[[42805,42805],"valid"],[[42806,42806],"mapped",[42807]],[[42807,42807],"valid"],[[42808,42808],"mapped",[42809]],[[42809,42809],"valid"],[[42810,42810],"mapped",[42811]],[[42811,42811],"valid"],[[42812,42812],"mapped",[42813]],[[42813,42813],"valid"],[[42814,42814],"mapped",[42815]],[[42815,42815],"valid"],[[42816,42816],"mapped",[42817]],[[42817,42817],"valid"],[[42818,42818],"mapped",[42819]],[[42819,42819],"valid"],[[42820,42820],"mapped",[42821]],[[42821,42821],"valid"],[[42822,42822],"mapped",[42823]],[[42823,42823],"valid"],[[42824,42824],"mapped",[42825]],[[42825,42825],"valid"],[[42826,42826],"mapped",[42827]],[[42827,42827],"valid"],[[42828,42828],"mapped",[42829]],[[42829,42829],"valid"],[[42830,42830],"mapped",[42831]],[[42831,42831],"valid"],[[42832,42832],"mapped",[42833]],[[42833,42833],"valid"],[[42834,42834],"mapped",[42835]],[[42835,42835],"valid"],[[42836,42836],"mapped",[42837]],[[42837,42837],"valid"],[[42838,42838],"mapped",[42839]],[[42839,42839],"valid"],[[42840,42840],"mapped",[42841]],[[42841,42841],"valid"],[[42842,42842],"mapped",[42843]],[[42843,42843],"valid"],[[42844,42844],"mapped",[42845]],[[42845,42845],"valid"],[[42846,42846],"mapped",[42847]],[[42847,42847],"valid"],[[42848,42848],"mapped",[42849]],[[42849,42849],"valid"],[[42850,42850],"mapped",[42851]],[[42851,42851],"valid"],[[42852,42852],"mapped",[42853]],[[42853,42853],"valid"],[[42854,42854],"mapped",[42855]],[[42855,42855],"valid"],[[42856,42856],"mapped",[42857]],[[42857,42857],"valid"],[[42858,42858],"mapped",[42859]],[[42859,42859],"valid"],[[42860,42860],"mapped",[42861]],[[42861,42861],"valid"],[[42862,42862],"mapped",[42863]],[[42863,42863],"valid"],[[42864,42864],"mapped",[42863]],[[42865,42872],"valid"],[[42873,42873],"mapped",[42874]],[[42874,42874],"valid"],[[42875,42875],"mapped",[42876]],[[42876,42876],"valid"],[[42877,42877],"mapped",[7545]],[[42878,42878],"mapped",[42879]],[[42879,42879],"valid"],[[42880,42880],"mapped",[42881]],[[42881,42881],"valid"],[[42882,42882],"mapped",[42883]],[[42883,42883],"valid"],[[42884,42884],"mapped",[42885]],[[42885,42885],"valid"],[[42886,42886],"mapped",[42887]],[[42887,42888],"valid"],[[42889,42890],"valid",[],"NV8"],[[42891,42891],"mapped",[42892]],[[42892,42892],"valid"],[[42893,42893],"mapped",[613]],[[42894,42894],"valid"],[[42895,42895],"valid"],[[42896,42896],"mapped",[42897]],[[42897,42897],"valid"],[[42898,42898],"mapped",[42899]],[[42899,42899],"valid"],[[42900,42901],"valid"],[[42902,42902],"mapped",[42903]],[[42903,42903],"valid"],[[42904,42904],"mapped",[42905]],[[42905,42905],"valid"],[[42906,42906],"mapped",[42907]],[[42907,42907],"valid"],[[42908,42908],"mapped",[42909]],[[42909,42909],"valid"],[[42910,42910],"mapped",[42911]],[[42911,42911],"valid"],[[42912,42912],"mapped",[42913]],[[42913,42913],"valid"],[[42914,42914],"mapped",[42915]],[[42915,42915],"valid"],[[42916,42916],"mapped",[42917]],[[42917,42917],"valid"],[[42918,42918],"mapped",[42919]],[[42919,42919],"valid"],[[42920,42920],"mapped",[42921]],[[42921,42921],"valid"],[[42922,42922],"mapped",[614]],[[42923,42923],"mapped",[604]],[[42924,42924],"mapped",[609]],[[42925,42925],"mapped",[620]],[[42926,42927],"disallowed"],[[42928,42928],"mapped",[670]],[[42929,42929],"mapped",[647]],[[42930,42930],"mapped",[669]],[[42931,42931],"mapped",[43859]],[[42932,42932],"mapped",[42933]],[[42933,42933],"valid"],[[42934,42934],"mapped",[42935]],[[42935,42935],"valid"],[[42936,42998],"disallowed"],[[42999,42999],"valid"],[[43000,43000],"mapped",[295]],[[43001,43001],"mapped",[339]],[[43002,43002],"valid"],[[43003,43007],"valid"],[[43008,43047],"valid"],[[43048,43051],"valid",[],"NV8"],[[43052,43055],"disallowed"],[[43056,43065],"valid",[],"NV8"],[[43066,43071],"disallowed"],[[43072,43123],"valid"],[[43124,43127],"valid",[],"NV8"],[[43128,43135],"disallowed"],[[43136,43204],"valid"],[[43205,43213],"disallowed"],[[43214,43215],"valid",[],"NV8"],[[43216,43225],"valid"],[[43226,43231],"disallowed"],[[43232,43255],"valid"],[[43256,43258],"valid",[],"NV8"],[[43259,43259],"valid"],[[43260,43260],"valid",[],"NV8"],[[43261,43261],"valid"],[[43262,43263],"disallowed"],[[43264,43309],"valid"],[[43310,43311],"valid",[],"NV8"],[[43312,43347],"valid"],[[43348,43358],"disallowed"],[[43359,43359],"valid",[],"NV8"],[[43360,43388],"valid",[],"NV8"],[[43389,43391],"disallowed"],[[43392,43456],"valid"],[[43457,43469],"valid",[],"NV8"],[[43470,43470],"disallowed"],[[43471,43481],"valid"],[[43482,43485],"disallowed"],[[43486,43487],"valid",[],"NV8"],[[43488,43518],"valid"],[[43519,43519],"disallowed"],[[43520,43574],"valid"],[[43575,43583],"disallowed"],[[43584,43597],"valid"],[[43598,43599],"disallowed"],[[43600,43609],"valid"],[[43610,43611],"disallowed"],[[43612,43615],"valid",[],"NV8"],[[43616,43638],"valid"],[[43639,43641],"valid",[],"NV8"],[[43642,43643],"valid"],[[43644,43647],"valid"],[[43648,43714],"valid"],[[43715,43738],"disallowed"],[[43739,43741],"valid"],[[43742,43743],"valid",[],"NV8"],[[43744,43759],"valid"],[[43760,43761],"valid",[],"NV8"],[[43762,43766],"valid"],[[43767,43776],"disallowed"],[[43777,43782],"valid"],[[43783,43784],"disallowed"],[[43785,43790],"valid"],[[43791,43792],"disallowed"],[[43793,43798],"valid"],[[43799,43807],"disallowed"],[[43808,43814],"valid"],[[43815,43815],"disallowed"],[[43816,43822],"valid"],[[43823,43823],"disallowed"],[[43824,43866],"valid"],[[43867,43867],"valid",[],"NV8"],[[43868,43868],"mapped",[42791]],[[43869,43869],"mapped",[43831]],[[43870,43870],"mapped",[619]],[[43871,43871],"mapped",[43858]],[[43872,43875],"valid"],[[43876,43877],"valid"],[[43878,43887],"disallowed"],[[43888,43888],"mapped",[5024]],[[43889,43889],"mapped",[5025]],[[43890,43890],"mapped",[5026]],[[43891,43891],"mapped",[5027]],[[43892,43892],"mapped",[5028]],[[43893,43893],"mapped",[5029]],[[43894,43894],"mapped",[5030]],[[43895,43895],"mapped",[5031]],[[43896,43896],"mapped",[5032]],[[43897,43897],"mapped",[5033]],[[43898,43898],"mapped",[5034]],[[43899,43899],"mapped",[5035]],[[43900,43900],"mapped",[5036]],[[43901,43901],"mapped",[5037]],[[43902,43902],"mapped",[5038]],[[43903,43903],"mapped",[5039]],[[43904,43904],"mapped",[5040]],[[43905,43905],"mapped",[5041]],[[43906,43906],"mapped",[5042]],[[43907,43907],"mapped",[5043]],[[43908,43908],"mapped",[5044]],[[43909,43909],"mapped",[5045]],[[43910,43910],"mapped",[5046]],[[43911,43911],"mapped",[5047]],[[43912,43912],"mapped",[5048]],[[43913,43913],"mapped",[5049]],[[43914,43914],"mapped",[5050]],[[43915,43915],"mapped",[5051]],[[43916,43916],"mapped",[5052]],[[43917,43917],"mapped",[5053]],[[43918,43918],"mapped",[5054]],[[43919,43919],"mapped",[5055]],[[43920,43920],"mapped",[5056]],[[43921,43921],"mapped",[5057]],[[43922,43922],"mapped",[5058]],[[43923,43923],"mapped",[5059]],[[43924,43924],"mapped",[5060]],[[43925,43925],"mapped",[5061]],[[43926,43926],"mapped",[5062]],[[43927,43927],"mapped",[5063]],[[43928,43928],"mapped",[5064]],[[43929,43929],"mapped",[5065]],[[43930,43930],"mapped",[5066]],[[43931,43931],"mapped",[5067]],[[43932,43932],"mapped",[5068]],[[43933,43933],"mapped",[5069]],[[43934,43934],"mapped",[5070]],[[43935,43935],"mapped",[5071]],[[43936,43936],"mapped",[5072]],[[43937,43937],"mapped",[5073]],[[43938,43938],"mapped",[5074]],[[43939,43939],"mapped",[5075]],[[43940,43940],"mapped",[5076]],[[43941,43941],"mapped",[5077]],[[43942,43942],"mapped",[5078]],[[43943,43943],"mapped",[5079]],[[43944,43944],"mapped",[5080]],[[43945,43945],"mapped",[5081]],[[43946,43946],"mapped",[5082]],[[43947,43947],"mapped",[5083]],[[43948,43948],"mapped",[5084]],[[43949,43949],"mapped",[5085]],[[43950,43950],"mapped",[5086]],[[43951,43951],"mapped",[5087]],[[43952,43952],"mapped",[5088]],[[43953,43953],"mapped",[5089]],[[43954,43954],"mapped",[5090]],[[43955,43955],"mapped",[5091]],[[43956,43956],"mapped",[5092]],[[43957,43957],"mapped",[5093]],[[43958,43958],"mapped",[5094]],[[43959,43959],"mapped",[5095]],[[43960,43960],"mapped",[5096]],[[43961,43961],"mapped",[5097]],[[43962,43962],"mapped",[5098]],[[43963,43963],"mapped",[5099]],[[43964,43964],"mapped",[5100]],[[43965,43965],"mapped",[5101]],[[43966,43966],"mapped",[5102]],[[43967,43967],"mapped",[5103]],[[43968,44010],"valid"],[[44011,44011],"valid",[],"NV8"],[[44012,44013],"valid"],[[44014,44015],"disallowed"],[[44016,44025],"valid"],[[44026,44031],"disallowed"],[[44032,55203],"valid"],[[55204,55215],"disallowed"],[[55216,55238],"valid",[],"NV8"],[[55239,55242],"disallowed"],[[55243,55291],"valid",[],"NV8"],[[55292,55295],"disallowed"],[[55296,57343],"disallowed"],[[57344,63743],"disallowed"],[[63744,63744],"mapped",[35912]],[[63745,63745],"mapped",[26356]],[[63746,63746],"mapped",[36554]],[[63747,63747],"mapped",[36040]],[[63748,63748],"mapped",[28369]],[[63749,63749],"mapped",[20018]],[[63750,63750],"mapped",[21477]],[[63751,63752],"mapped",[40860]],[[63753,63753],"mapped",[22865]],[[63754,63754],"mapped",[37329]],[[63755,63755],"mapped",[21895]],[[63756,63756],"mapped",[22856]],[[63757,63757],"mapped",[25078]],[[63758,63758],"mapped",[30313]],[[63759,63759],"mapped",[32645]],[[63760,63760],"mapped",[34367]],[[63761,63761],"mapped",[34746]],[[63762,63762],"mapped",[35064]],[[63763,63763],"mapped",[37007]],[[63764,63764],"mapped",[27138]],[[63765,63765],"mapped",[27931]],[[63766,63766],"mapped",[28889]],[[63767,63767],"mapped",[29662]],[[63768,63768],"mapped",[33853]],[[63769,63769],"mapped",[37226]],[[63770,63770],"mapped",[39409]],[[63771,63771],"mapped",[20098]],[[63772,63772],"mapped",[21365]],[[63773,63773],"mapped",[27396]],[[63774,63774],"mapped",[29211]],[[63775,63775],"mapped",[34349]],[[63776,63776],"mapped",[40478]],[[63777,63777],"mapped",[23888]],[[63778,63778],"mapped",[28651]],[[63779,63779],"mapped",[34253]],[[63780,63780],"mapped",[35172]],[[63781,63781],"mapped",[25289]],[[63782,63782],"mapped",[33240]],[[63783,63783],"mapped",[34847]],[[63784,63784],"mapped",[24266]],[[63785,63785],"mapped",[26391]],[[63786,63786],"mapped",[28010]],[[63787,63787],"mapped",[29436]],[[63788,63788],"mapped",[37070]],[[63789,63789],"mapped",[20358]],[[63790,63790],"mapped",[20919]],[[63791,63791],"mapped",[21214]],[[63792,63792],"mapped",[25796]],[[63793,63793],"mapped",[27347]],[[63794,63794],"mapped",[29200]],[[63795,63795],"mapped",[30439]],[[63796,63796],"mapped",[32769]],[[63797,63797],"mapped",[34310]],[[63798,63798],"mapped",[34396]],[[63799,63799],"mapped",[36335]],[[63800,63800],"mapped",[38706]],[[63801,63801],"mapped",[39791]],[[63802,63802],"mapped",[40442]],[[63803,63803],"mapped",[30860]],[[63804,63804],"mapped",[31103]],[[63805,63805],"mapped",[32160]],[[63806,63806],"mapped",[33737]],[[63807,63807],"mapped",[37636]],[[63808,63808],"mapped",[40575]],[[63809,63809],"mapped",[35542]],[[63810,63810],"mapped",[22751]],[[63811,63811],"mapped",[24324]],[[63812,63812],"mapped",[31840]],[[63813,63813],"mapped",[32894]],[[63814,63814],"mapped",[29282]],[[63815,63815],"mapped",[30922]],[[63816,63816],"mapped",[36034]],[[63817,63817],"mapped",[38647]],[[63818,63818],"mapped",[22744]],[[63819,63819],"mapped",[23650]],[[63820,63820],"mapped",[27155]],[[63821,63821],"mapped",[28122]],[[63822,63822],"mapped",[28431]],[[63823,63823],"mapped",[32047]],[[63824,63824],"mapped",[32311]],[[63825,63825],"mapped",[38475]],[[63826,63826],"mapped",[21202]],[[63827,63827],"mapped",[32907]],[[63828,63828],"mapped",[20956]],[[63829,63829],"mapped",[20940]],[[63830,63830],"mapped",[31260]],[[63831,63831],"mapped",[32190]],[[63832,63832],"mapped",[33777]],[[63833,63833],"mapped",[38517]],[[63834,63834],"mapped",[35712]],[[63835,63835],"mapped",[25295]],[[63836,63836],"mapped",[27138]],[[63837,63837],"mapped",[35582]],[[63838,63838],"mapped",[20025]],[[63839,63839],"mapped",[23527]],[[63840,63840],"mapped",[24594]],[[63841,63841],"mapped",[29575]],[[63842,63842],"mapped",[30064]],[[63843,63843],"mapped",[21271]],[[63844,63844],"mapped",[30971]],[[63845,63845],"mapped",[20415]],[[63846,63846],"mapped",[24489]],[[63847,63847],"mapped",[19981]],[[63848,63848],"mapped",[27852]],[[63849,63849],"mapped",[25976]],[[63850,63850],"mapped",[32034]],[[63851,63851],"mapped",[21443]],[[63852,63852],"mapped",[22622]],[[63853,63853],"mapped",[30465]],[[63854,63854],"mapped",[33865]],[[63855,63855],"mapped",[35498]],[[63856,63856],"mapped",[27578]],[[63857,63857],"mapped",[36784]],[[63858,63858],"mapped",[27784]],[[63859,63859],"mapped",[25342]],[[63860,63860],"mapped",[33509]],[[63861,63861],"mapped",[25504]],[[63862,63862],"mapped",[30053]],[[63863,63863],"mapped",[20142]],[[63864,63864],"mapped",[20841]],[[63865,63865],"mapped",[20937]],[[63866,63866],"mapped",[26753]],[[63867,63867],"mapped",[31975]],[[63868,63868],"mapped",[33391]],[[63869,63869],"mapped",[35538]],[[63870,63870],"mapped",[37327]],[[63871,63871],"mapped",[21237]],[[63872,63872],"mapped",[21570]],[[63873,63873],"mapped",[22899]],[[63874,63874],"mapped",[24300]],[[63875,63875],"mapped",[26053]],[[63876,63876],"mapped",[28670]],[[63877,63877],"mapped",[31018]],[[63878,63878],"mapped",[38317]],[[63879,63879],"mapped",[39530]],[[63880,63880],"mapped",[40599]],[[63881,63881],"mapped",[40654]],[[63882,63882],"mapped",[21147]],[[63883,63883],"mapped",[26310]],[[63884,63884],"mapped",[27511]],[[63885,63885],"mapped",[36706]],[[63886,63886],"mapped",[24180]],[[63887,63887],"mapped",[24976]],[[63888,63888],"mapped",[25088]],[[63889,63889],"mapped",[25754]],[[63890,63890],"mapped",[28451]],[[63891,63891],"mapped",[29001]],[[63892,63892],"mapped",[29833]],[[63893,63893],"mapped",[31178]],[[63894,63894],"mapped",[32244]],[[63895,63895],"mapped",[32879]],[[63896,63896],"mapped",[36646]],[[63897,63897],"mapped",[34030]],[[63898,63898],"mapped",[36899]],[[63899,63899],"mapped",[37706]],[[63900,63900],"mapped",[21015]],[[63901,63901],"mapped",[21155]],[[63902,63902],"mapped",[21693]],[[63903,63903],"mapped",[28872]],[[63904,63904],"mapped",[35010]],[[63905,63905],"mapped",[35498]],[[63906,63906],"mapped",[24265]],[[63907,63907],"mapped",[24565]],[[63908,63908],"mapped",[25467]],[[63909,63909],"mapped",[27566]],[[63910,63910],"mapped",[31806]],[[63911,63911],"mapped",[29557]],[[63912,63912],"mapped",[20196]],[[63913,63913],"mapped",[22265]],[[63914,63914],"mapped",[23527]],[[63915,63915],"mapped",[23994]],[[63916,63916],"mapped",[24604]],[[63917,63917],"mapped",[29618]],[[63918,63918],"mapped",[29801]],[[63919,63919],"mapped",[32666]],[[63920,63920],"mapped",[32838]],[[63921,63921],"mapped",[37428]],[[63922,63922],"mapped",[38646]],[[63923,63923],"mapped",[38728]],[[63924,63924],"mapped",[38936]],[[63925,63925],"mapped",[20363]],[[63926,63926],"mapped",[31150]],[[63927,63927],"mapped",[37300]],[[63928,63928],"mapped",[38584]],[[63929,63929],"mapped",[24801]],[[63930,63930],"mapped",[20102]],[[63931,63931],"mapped",[20698]],[[63932,63932],"mapped",[23534]],[[63933,63933],"mapped",[23615]],[[63934,63934],"mapped",[26009]],[[63935,63935],"mapped",[27138]],[[63936,63936],"mapped",[29134]],[[63937,63937],"mapped",[30274]],[[63938,63938],"mapped",[34044]],[[63939,63939],"mapped",[36988]],[[63940,63940],"mapped",[40845]],[[63941,63941],"mapped",[26248]],[[63942,63942],"mapped",[38446]],[[63943,63943],"mapped",[21129]],[[63944,63944],"mapped",[26491]],[[63945,63945],"mapped",[26611]],[[63946,63946],"mapped",[27969]],[[63947,63947],"mapped",[28316]],[[63948,63948],"mapped",[29705]],[[63949,63949],"mapped",[30041]],[[63950,63950],"mapped",[30827]],[[63951,63951],"mapped",[32016]],[[63952,63952],"mapped",[39006]],[[63953,63953],"mapped",[20845]],[[63954,63954],"mapped",[25134]],[[63955,63955],"mapped",[38520]],[[63956,63956],"mapped",[20523]],[[63957,63957],"mapped",[23833]],[[63958,63958],"mapped",[28138]],[[63959,63959],"mapped",[36650]],[[63960,63960],"mapped",[24459]],[[63961,63961],"mapped",[24900]],[[63962,63962],"mapped",[26647]],[[63963,63963],"mapped",[29575]],[[63964,63964],"mapped",[38534]],[[63965,63965],"mapped",[21033]],[[63966,63966],"mapped",[21519]],[[63967,63967],"mapped",[23653]],[[63968,63968],"mapped",[26131]],[[63969,63969],"mapped",[26446]],[[63970,63970],"mapped",[26792]],[[63971,63971],"mapped",[27877]],[[63972,63972],"mapped",[29702]],[[63973,63973],"mapped",[30178]],[[63974,63974],"mapped",[32633]],[[63975,63975],"mapped",[35023]],[[63976,63976],"mapped",[35041]],[[63977,63977],"mapped",[37324]],[[63978,63978],"mapped",[38626]],[[63979,63979],"mapped",[21311]],[[63980,63980],"mapped",[28346]],[[63981,63981],"mapped",[21533]],[[63982,63982],"mapped",[29136]],[[63983,63983],"mapped",[29848]],[[63984,63984],"mapped",[34298]],[[63985,63985],"mapped",[38563]],[[63986,63986],"mapped",[40023]],[[63987,63987],"mapped",[40607]],[[63988,63988],"mapped",[26519]],[[63989,63989],"mapped",[28107]],[[63990,63990],"mapped",[33256]],[[63991,63991],"mapped",[31435]],[[63992,63992],"mapped",[31520]],[[63993,63993],"mapped",[31890]],[[63994,63994],"mapped",[29376]],[[63995,63995],"mapped",[28825]],[[63996,63996],"mapped",[35672]],[[63997,63997],"mapped",[20160]],[[63998,63998],"mapped",[33590]],[[63999,63999],"mapped",[21050]],[[64000,64000],"mapped",[20999]],[[64001,64001],"mapped",[24230]],[[64002,64002],"mapped",[25299]],[[64003,64003],"mapped",[31958]],[[64004,64004],"mapped",[23429]],[[64005,64005],"mapped",[27934]],[[64006,64006],"mapped",[26292]],[[64007,64007],"mapped",[36667]],[[64008,64008],"mapped",[34892]],[[64009,64009],"mapped",[38477]],[[64010,64010],"mapped",[35211]],[[64011,64011],"mapped",[24275]],[[64012,64012],"mapped",[20800]],[[64013,64013],"mapped",[21952]],[[64014,64015],"valid"],[[64016,64016],"mapped",[22618]],[[64017,64017],"valid"],[[64018,64018],"mapped",[26228]],[[64019,64020],"valid"],[[64021,64021],"mapped",[20958]],[[64022,64022],"mapped",[29482]],[[64023,64023],"mapped",[30410]],[[64024,64024],"mapped",[31036]],[[64025,64025],"mapped",[31070]],[[64026,64026],"mapped",[31077]],[[64027,64027],"mapped",[31119]],[[64028,64028],"mapped",[38742]],[[64029,64029],"mapped",[31934]],[[64030,64030],"mapped",[32701]],[[64031,64031],"valid"],[[64032,64032],"mapped",[34322]],[[64033,64033],"valid"],[[64034,64034],"mapped",[35576]],[[64035,64036],"valid"],[[64037,64037],"mapped",[36920]],[[64038,64038],"mapped",[37117]],[[64039,64041],"valid"],[[64042,64042],"mapped",[39151]],[[64043,64043],"mapped",[39164]],[[64044,64044],"mapped",[39208]],[[64045,64045],"mapped",[40372]],[[64046,64046],"mapped",[37086]],[[64047,64047],"mapped",[38583]],[[64048,64048],"mapped",[20398]],[[64049,64049],"mapped",[20711]],[[64050,64050],"mapped",[20813]],[[64051,64051],"mapped",[21193]],[[64052,64052],"mapped",[21220]],[[64053,64053],"mapped",[21329]],[[64054,64054],"mapped",[21917]],[[64055,64055],"mapped",[22022]],[[64056,64056],"mapped",[22120]],[[64057,64057],"mapped",[22592]],[[64058,64058],"mapped",[22696]],[[64059,64059],"mapped",[23652]],[[64060,64060],"mapped",[23662]],[[64061,64061],"mapped",[24724]],[[64062,64062],"mapped",[24936]],[[64063,64063],"mapped",[24974]],[[64064,64064],"mapped",[25074]],[[64065,64065],"mapped",[25935]],[[64066,64066],"mapped",[26082]],[[64067,64067],"mapped",[26257]],[[64068,64068],"mapped",[26757]],[[64069,64069],"mapped",[28023]],[[64070,64070],"mapped",[28186]],[[64071,64071],"mapped",[28450]],[[64072,64072],"mapped",[29038]],[[64073,64073],"mapped",[29227]],[[64074,64074],"mapped",[29730]],[[64075,64075],"mapped",[30865]],[[64076,64076],"mapped",[31038]],[[64077,64077],"mapped",[31049]],[[64078,64078],"mapped",[31048]],[[64079,64079],"mapped",[31056]],[[64080,64080],"mapped",[31062]],[[64081,64081],"mapped",[31069]],[[64082,64082],"mapped",[31117]],[[64083,64083],"mapped",[31118]],[[64084,64084],"mapped",[31296]],[[64085,64085],"mapped",[31361]],[[64086,64086],"mapped",[31680]],[[64087,64087],"mapped",[32244]],[[64088,64088],"mapped",[32265]],[[64089,64089],"mapped",[32321]],[[64090,64090],"mapped",[32626]],[[64091,64091],"mapped",[32773]],[[64092,64092],"mapped",[33261]],[[64093,64094],"mapped",[33401]],[[64095,64095],"mapped",[33879]],[[64096,64096],"mapped",[35088]],[[64097,64097],"mapped",[35222]],[[64098,64098],"mapped",[35585]],[[64099,64099],"mapped",[35641]],[[64100,64100],"mapped",[36051]],[[64101,64101],"mapped",[36104]],[[64102,64102],"mapped",[36790]],[[64103,64103],"mapped",[36920]],[[64104,64104],"mapped",[38627]],[[64105,64105],"mapped",[38911]],[[64106,64106],"mapped",[38971]],[[64107,64107],"mapped",[24693]],[[64108,64108],"mapped",[148206]],[[64109,64109],"mapped",[33304]],[[64110,64111],"disallowed"],[[64112,64112],"mapped",[20006]],[[64113,64113],"mapped",[20917]],[[64114,64114],"mapped",[20840]],[[64115,64115],"mapped",[20352]],[[64116,64116],"mapped",[20805]],[[64117,64117],"mapped",[20864]],[[64118,64118],"mapped",[21191]],[[64119,64119],"mapped",[21242]],[[64120,64120],"mapped",[21917]],[[64121,64121],"mapped",[21845]],[[64122,64122],"mapped",[21913]],[[64123,64123],"mapped",[21986]],[[64124,64124],"mapped",[22618]],[[64125,64125],"mapped",[22707]],[[64126,64126],"mapped",[22852]],[[64127,64127],"mapped",[22868]],[[64128,64128],"mapped",[23138]],[[64129,64129],"mapped",[23336]],[[64130,64130],"mapped",[24274]],[[64131,64131],"mapped",[24281]],[[64132,64132],"mapped",[24425]],[[64133,64133],"mapped",[24493]],[[64134,64134],"mapped",[24792]],[[64135,64135],"mapped",[24910]],[[64136,64136],"mapped",[24840]],[[64137,64137],"mapped",[24974]],[[64138,64138],"mapped",[24928]],[[64139,64139],"mapped",[25074]],[[64140,64140],"mapped",[25140]],[[64141,64141],"mapped",[25540]],[[64142,64142],"mapped",[25628]],[[64143,64143],"mapped",[25682]],[[64144,64144],"mapped",[25942]],[[64145,64145],"mapped",[26228]],[[64146,64146],"mapped",[26391]],[[64147,64147],"mapped",[26395]],[[64148,64148],"mapped",[26454]],[[64149,64149],"mapped",[27513]],[[64150,64150],"mapped",[27578]],[[64151,64151],"mapped",[27969]],[[64152,64152],"mapped",[28379]],[[64153,64153],"mapped",[28363]],[[64154,64154],"mapped",[28450]],[[64155,64155],"mapped",[28702]],[[64156,64156],"mapped",[29038]],[[64157,64157],"mapped",[30631]],[[64158,64158],"mapped",[29237]],[[64159,64159],"mapped",[29359]],[[64160,64160],"mapped",[29482]],[[64161,64161],"mapped",[29809]],[[64162,64162],"mapped",[29958]],[[64163,64163],"mapped",[30011]],[[64164,64164],"mapped",[30237]],[[64165,64165],"mapped",[30239]],[[64166,64166],"mapped",[30410]],[[64167,64167],"mapped",[30427]],[[64168,64168],"mapped",[30452]],[[64169,64169],"mapped",[30538]],[[64170,64170],"mapped",[30528]],[[64171,64171],"mapped",[30924]],[[64172,64172],"mapped",[31409]],[[64173,64173],"mapped",[31680]],[[64174,64174],"mapped",[31867]],[[64175,64175],"mapped",[32091]],[[64176,64176],"mapped",[32244]],[[64177,64177],"mapped",[32574]],[[64178,64178],"mapped",[32773]],[[64179,64179],"mapped",[33618]],[[64180,64180],"mapped",[33775]],[[64181,64181],"mapped",[34681]],[[64182,64182],"mapped",[35137]],[[64183,64183],"mapped",[35206]],[[64184,64184],"mapped",[35222]],[[64185,64185],"mapped",[35519]],[[64186,64186],"mapped",[35576]],[[64187,64187],"mapped",[35531]],[[64188,64188],"mapped",[35585]],[[64189,64189],"mapped",[35582]],[[64190,64190],"mapped",[35565]],[[64191,64191],"mapped",[35641]],[[64192,64192],"mapped",[35722]],[[64193,64193],"mapped",[36104]],[[64194,64194],"mapped",[36664]],[[64195,64195],"mapped",[36978]],[[64196,64196],"mapped",[37273]],[[64197,64197],"mapped",[37494]],[[64198,64198],"mapped",[38524]],[[64199,64199],"mapped",[38627]],[[64200,64200],"mapped",[38742]],[[64201,64201],"mapped",[38875]],[[64202,64202],"mapped",[38911]],[[64203,64203],"mapped",[38923]],[[64204,64204],"mapped",[38971]],[[64205,64205],"mapped",[39698]],[[64206,64206],"mapped",[40860]],[[64207,64207],"mapped",[141386]],[[64208,64208],"mapped",[141380]],[[64209,64209],"mapped",[144341]],[[64210,64210],"mapped",[15261]],[[64211,64211],"mapped",[16408]],[[64212,64212],"mapped",[16441]],[[64213,64213],"mapped",[152137]],[[64214,64214],"mapped",[154832]],[[64215,64215],"mapped",[163539]],[[64216,64216],"mapped",[40771]],[[64217,64217],"mapped",[40846]],[[64218,64255],"disallowed"],[[64256,64256],"mapped",[102,102]],[[64257,64257],"mapped",[102,105]],[[64258,64258],"mapped",[102,108]],[[64259,64259],"mapped",[102,102,105]],[[64260,64260],"mapped",[102,102,108]],[[64261,64262],"mapped",[115,116]],[[64263,64274],"disallowed"],[[64275,64275],"mapped",[1396,1398]],[[64276,64276],"mapped",[1396,1381]],[[64277,64277],"mapped",[1396,1387]],[[64278,64278],"mapped",[1406,1398]],[[64279,64279],"mapped",[1396,1389]],[[64280,64284],"disallowed"],[[64285,64285],"mapped",[1497,1460]],[[64286,64286],"valid"],[[64287,64287],"mapped",[1522,1463]],[[64288,64288],"mapped",[1506]],[[64289,64289],"mapped",[1488]],[[64290,64290],"mapped",[1491]],[[64291,64291],"mapped",[1492]],[[64292,64292],"mapped",[1499]],[[64293,64293],"mapped",[1500]],[[64294,64294],"mapped",[1501]],[[64295,64295],"mapped",[1512]],[[64296,64296],"mapped",[1514]],[[64297,64297],"disallowed_STD3_mapped",[43]],[[64298,64298],"mapped",[1513,1473]],[[64299,64299],"mapped",[1513,1474]],[[64300,64300],"mapped",[1513,1468,1473]],[[64301,64301],"mapped",[1513,1468,1474]],[[64302,64302],"mapped",[1488,1463]],[[64303,64303],"mapped",[1488,1464]],[[64304,64304],"mapped",[1488,1468]],[[64305,64305],"mapped",[1489,1468]],[[64306,64306],"mapped",[1490,1468]],[[64307,64307],"mapped",[1491,1468]],[[64308,64308],"mapped",[1492,1468]],[[64309,64309],"mapped",[1493,1468]],[[64310,64310],"mapped",[1494,1468]],[[64311,64311],"disallowed"],[[64312,64312],"mapped",[1496,1468]],[[64313,64313],"mapped",[1497,1468]],[[64314,64314],"mapped",[1498,1468]],[[64315,64315],"mapped",[1499,1468]],[[64316,64316],"mapped",[1500,1468]],[[64317,64317],"disallowed"],[[64318,64318],"mapped",[1502,1468]],[[64319,64319],"disallowed"],[[64320,64320],"mapped",[1504,1468]],[[64321,64321],"mapped",[1505,1468]],[[64322,64322],"disallowed"],[[64323,64323],"mapped",[1507,1468]],[[64324,64324],"mapped",[1508,1468]],[[64325,64325],"disallowed"],[[64326,64326],"mapped",[1510,1468]],[[64327,64327],"mapped",[1511,1468]],[[64328,64328],"mapped",[1512,1468]],[[64329,64329],"mapped",[1513,1468]],[[64330,64330],"mapped",[1514,1468]],[[64331,64331],"mapped",[1493,1465]],[[64332,64332],"mapped",[1489,1471]],[[64333,64333],"mapped",[1499,1471]],[[64334,64334],"mapped",[1508,1471]],[[64335,64335],"mapped",[1488,1500]],[[64336,64337],"mapped",[1649]],[[64338,64341],"mapped",[1659]],[[64342,64345],"mapped",[1662]],[[64346,64349],"mapped",[1664]],[[64350,64353],"mapped",[1658]],[[64354,64357],"mapped",[1663]],[[64358,64361],"mapped",[1657]],[[64362,64365],"mapped",[1700]],[[64366,64369],"mapped",[1702]],[[64370,64373],"mapped",[1668]],[[64374,64377],"mapped",[1667]],[[64378,64381],"mapped",[1670]],[[64382,64385],"mapped",[1671]],[[64386,64387],"mapped",[1677]],[[64388,64389],"mapped",[1676]],[[64390,64391],"mapped",[1678]],[[64392,64393],"mapped",[1672]],[[64394,64395],"mapped",[1688]],[[64396,64397],"mapped",[1681]],[[64398,64401],"mapped",[1705]],[[64402,64405],"mapped",[1711]],[[64406,64409],"mapped",[1715]],[[64410,64413],"mapped",[1713]],[[64414,64415],"mapped",[1722]],[[64416,64419],"mapped",[1723]],[[64420,64421],"mapped",[1728]],[[64422,64425],"mapped",[1729]],[[64426,64429],"mapped",[1726]],[[64430,64431],"mapped",[1746]],[[64432,64433],"mapped",[1747]],[[64434,64449],"valid",[],"NV8"],[[64450,64466],"disallowed"],[[64467,64470],"mapped",[1709]],[[64471,64472],"mapped",[1735]],[[64473,64474],"mapped",[1734]],[[64475,64476],"mapped",[1736]],[[64477,64477],"mapped",[1735,1652]],[[64478,64479],"mapped",[1739]],[[64480,64481],"mapped",[1733]],[[64482,64483],"mapped",[1737]],[[64484,64487],"mapped",[1744]],[[64488,64489],"mapped",[1609]],[[64490,64491],"mapped",[1574,1575]],[[64492,64493],"mapped",[1574,1749]],[[64494,64495],"mapped",[1574,1608]],[[64496,64497],"mapped",[1574,1735]],[[64498,64499],"mapped",[1574,1734]],[[64500,64501],"mapped",[1574,1736]],[[64502,64504],"mapped",[1574,1744]],[[64505,64507],"mapped",[1574,1609]],[[64508,64511],"mapped",[1740]],[[64512,64512],"mapped",[1574,1580]],[[64513,64513],"mapped",[1574,1581]],[[64514,64514],"mapped",[1574,1605]],[[64515,64515],"mapped",[1574,1609]],[[64516,64516],"mapped",[1574,1610]],[[64517,64517],"mapped",[1576,1580]],[[64518,64518],"mapped",[1576,1581]],[[64519,64519],"mapped",[1576,1582]],[[64520,64520],"mapped",[1576,1605]],[[64521,64521],"mapped",[1576,1609]],[[64522,64522],"mapped",[1576,1610]],[[64523,64523],"mapped",[1578,1580]],[[64524,64524],"mapped",[1578,1581]],[[64525,64525],"mapped",[1578,1582]],[[64526,64526],"mapped",[1578,1605]],[[64527,64527],"mapped",[1578,1609]],[[64528,64528],"mapped",[1578,1610]],[[64529,64529],"mapped",[1579,1580]],[[64530,64530],"mapped",[1579,1605]],[[64531,64531],"mapped",[1579,1609]],[[64532,64532],"mapped",[1579,1610]],[[64533,64533],"mapped",[1580,1581]],[[64534,64534],"mapped",[1580,1605]],[[64535,64535],"mapped",[1581,1580]],[[64536,64536],"mapped",[1581,1605]],[[64537,64537],"mapped",[1582,1580]],[[64538,64538],"mapped",[1582,1581]],[[64539,64539],"mapped",[1582,1605]],[[64540,64540],"mapped",[1587,1580]],[[64541,64541],"mapped",[1587,1581]],[[64542,64542],"mapped",[1587,1582]],[[64543,64543],"mapped",[1587,1605]],[[64544,64544],"mapped",[1589,1581]],[[64545,64545],"mapped",[1589,1605]],[[64546,64546],"mapped",[1590,1580]],[[64547,64547],"mapped",[1590,1581]],[[64548,64548],"mapped",[1590,1582]],[[64549,64549],"mapped",[1590,1605]],[[64550,64550],"mapped",[1591,1581]],[[64551,64551],"mapped",[1591,1605]],[[64552,64552],"mapped",[1592,1605]],[[64553,64553],"mapped",[1593,1580]],[[64554,64554],"mapped",[1593,1605]],[[64555,64555],"mapped",[1594,1580]],[[64556,64556],"mapped",[1594,1605]],[[64557,64557],"mapped",[1601,1580]],[[64558,64558],"mapped",[1601,1581]],[[64559,64559],"mapped",[1601,1582]],[[64560,64560],"mapped",[1601,1605]],[[64561,64561],"mapped",[1601,1609]],[[64562,64562],"mapped",[1601,1610]],[[64563,64563],"mapped",[1602,1581]],[[64564,64564],"mapped",[1602,1605]],[[64565,64565],"mapped",[1602,1609]],[[64566,64566],"mapped",[1602,1610]],[[64567,64567],"mapped",[1603,1575]],[[64568,64568],"mapped",[1603,1580]],[[64569,64569],"mapped",[1603,1581]],[[64570,64570],"mapped",[1603,1582]],[[64571,64571],"mapped",[1603,1604]],[[64572,64572],"mapped",[1603,1605]],[[64573,64573],"mapped",[1603,1609]],[[64574,64574],"mapped",[1603,1610]],[[64575,64575],"mapped",[1604,1580]],[[64576,64576],"mapped",[1604,1581]],[[64577,64577],"mapped",[1604,1582]],[[64578,64578],"mapped",[1604,1605]],[[64579,64579],"mapped",[1604,1609]],[[64580,64580],"mapped",[1604,1610]],[[64581,64581],"mapped",[1605,1580]],[[64582,64582],"mapped",[1605,1581]],[[64583,64583],"mapped",[1605,1582]],[[64584,64584],"mapped",[1605,1605]],[[64585,64585],"mapped",[1605,1609]],[[64586,64586],"mapped",[1605,1610]],[[64587,64587],"mapped",[1606,1580]],[[64588,64588],"mapped",[1606,1581]],[[64589,64589],"mapped",[1606,1582]],[[64590,64590],"mapped",[1606,1605]],[[64591,64591],"mapped",[1606,1609]],[[64592,64592],"mapped",[1606,1610]],[[64593,64593],"mapped",[1607,1580]],[[64594,64594],"mapped",[1607,1605]],[[64595,64595],"mapped",[1607,1609]],[[64596,64596],"mapped",[1607,1610]],[[64597,64597],"mapped",[1610,1580]],[[64598,64598],"mapped",[1610,1581]],[[64599,64599],"mapped",[1610,1582]],[[64600,64600],"mapped",[1610,1605]],[[64601,64601],"mapped",[1610,1609]],[[64602,64602],"mapped",[1610,1610]],[[64603,64603],"mapped",[1584,1648]],[[64604,64604],"mapped",[1585,1648]],[[64605,64605],"mapped",[1609,1648]],[[64606,64606],"disallowed_STD3_mapped",[32,1612,1617]],[[64607,64607],"disallowed_STD3_mapped",[32,1613,1617]],[[64608,64608],"disallowed_STD3_mapped",[32,1614,1617]],[[64609,64609],"disallowed_STD3_mapped",[32,1615,1617]],[[64610,64610],"disallowed_STD3_mapped",[32,1616,1617]],[[64611,64611],"disallowed_STD3_mapped",[32,1617,1648]],[[64612,64612],"mapped",[1574,1585]],[[64613,64613],"mapped",[1574,1586]],[[64614,64614],"mapped",[1574,1605]],[[64615,64615],"mapped",[1574,1606]],[[64616,64616],"mapped",[1574,1609]],[[64617,64617],"mapped",[1574,1610]],[[64618,64618],"mapped",[1576,1585]],[[64619,64619],"mapped",[1576,1586]],[[64620,64620],"mapped",[1576,1605]],[[64621,64621],"mapped",[1576,1606]],[[64622,64622],"mapped",[1576,1609]],[[64623,64623],"mapped",[1576,1610]],[[64624,64624],"mapped",[1578,1585]],[[64625,64625],"mapped",[1578,1586]],[[64626,64626],"mapped",[1578,1605]],[[64627,64627],"mapped",[1578,1606]],[[64628,64628],"mapped",[1578,1609]],[[64629,64629],"mapped",[1578,1610]],[[64630,64630],"mapped",[1579,1585]],[[64631,64631],"mapped",[1579,1586]],[[64632,64632],"mapped",[1579,1605]],[[64633,64633],"mapped",[1579,1606]],[[64634,64634],"mapped",[1579,1609]],[[64635,64635],"mapped",[1579,1610]],[[64636,64636],"mapped",[1601,1609]],[[64637,64637],"mapped",[1601,1610]],[[64638,64638],"mapped",[1602,1609]],[[64639,64639],"mapped",[1602,1610]],[[64640,64640],"mapped",[1603,1575]],[[64641,64641],"mapped",[1603,1604]],[[64642,64642],"mapped",[1603,1605]],[[64643,64643],"mapped",[1603,1609]],[[64644,64644],"mapped",[1603,1610]],[[64645,64645],"mapped",[1604,1605]],[[64646,64646],"mapped",[1604,1609]],[[64647,64647],"mapped",[1604,1610]],[[64648,64648],"mapped",[1605,1575]],[[64649,64649],"mapped",[1605,1605]],[[64650,64650],"mapped",[1606,1585]],[[64651,64651],"mapped",[1606,1586]],[[64652,64652],"mapped",[1606,1605]],[[64653,64653],"mapped",[1606,1606]],[[64654,64654],"mapped",[1606,1609]],[[64655,64655],"mapped",[1606,1610]],[[64656,64656],"mapped",[1609,1648]],[[64657,64657],"mapped",[1610,1585]],[[64658,64658],"mapped",[1610,1586]],[[64659,64659],"mapped",[1610,1605]],[[64660,64660],"mapped",[1610,1606]],[[64661,64661],"mapped",[1610,1609]],[[64662,64662],"mapped",[1610,1610]],[[64663,64663],"mapped",[1574,1580]],[[64664,64664],"mapped",[1574,1581]],[[64665,64665],"mapped",[1574,1582]],[[64666,64666],"mapped",[1574,1605]],[[64667,64667],"mapped",[1574,1607]],[[64668,64668],"mapped",[1576,1580]],[[64669,64669],"mapped",[1576,1581]],[[64670,64670],"mapped",[1576,1582]],[[64671,64671],"mapped",[1576,1605]],[[64672,64672],"mapped",[1576,1607]],[[64673,64673],"mapped",[1578,1580]],[[64674,64674],"mapped",[1578,1581]],[[64675,64675],"mapped",[1578,1582]],[[64676,64676],"mapped",[1578,1605]],[[64677,64677],"mapped",[1578,1607]],[[64678,64678],"mapped",[1579,1605]],[[64679,64679],"mapped",[1580,1581]],[[64680,64680],"mapped",[1580,1605]],[[64681,64681],"mapped",[1581,1580]],[[64682,64682],"mapped",[1581,1605]],[[64683,64683],"mapped",[1582,1580]],[[64684,64684],"mapped",[1582,1605]],[[64685,64685],"mapped",[1587,1580]],[[64686,64686],"mapped",[1587,1581]],[[64687,64687],"mapped",[1587,1582]],[[64688,64688],"mapped",[1587,1605]],[[64689,64689],"mapped",[1589,1581]],[[64690,64690],"mapped",[1589,1582]],[[64691,64691],"mapped",[1589,1605]],[[64692,64692],"mapped",[1590,1580]],[[64693,64693],"mapped",[1590,1581]],[[64694,64694],"mapped",[1590,1582]],[[64695,64695],"mapped",[1590,1605]],[[64696,64696],"mapped",[1591,1581]],[[64697,64697],"mapped",[1592,1605]],[[64698,64698],"mapped",[1593,1580]],[[64699,64699],"mapped",[1593,1605]],[[64700,64700],"mapped",[1594,1580]],[[64701,64701],"mapped",[1594,1605]],[[64702,64702],"mapped",[1601,1580]],[[64703,64703],"mapped",[1601,1581]],[[64704,64704],"mapped",[1601,1582]],[[64705,64705],"mapped",[1601,1605]],[[64706,64706],"mapped",[1602,1581]],[[64707,64707],"mapped",[1602,1605]],[[64708,64708],"mapped",[1603,1580]],[[64709,64709],"mapped",[1603,1581]],[[64710,64710],"mapped",[1603,1582]],[[64711,64711],"mapped",[1603,1604]],[[64712,64712],"mapped",[1603,1605]],[[64713,64713],"mapped",[1604,1580]],[[64714,64714],"mapped",[1604,1581]],[[64715,64715],"mapped",[1604,1582]],[[64716,64716],"mapped",[1604,1605]],[[64717,64717],"mapped",[1604,1607]],[[64718,64718],"mapped",[1605,1580]],[[64719,64719],"mapped",[1605,1581]],[[64720,64720],"mapped",[1605,1582]],[[64721,64721],"mapped",[1605,1605]],[[64722,64722],"mapped",[1606,1580]],[[64723,64723],"mapped",[1606,1581]],[[64724,64724],"mapped",[1606,1582]],[[64725,64725],"mapped",[1606,1605]],[[64726,64726],"mapped",[1606,1607]],[[64727,64727],"mapped",[1607,1580]],[[64728,64728],"mapped",[1607,1605]],[[64729,64729],"mapped",[1607,1648]],[[64730,64730],"mapped",[1610,1580]],[[64731,64731],"mapped",[1610,1581]],[[64732,64732],"mapped",[1610,1582]],[[64733,64733],"mapped",[1610,1605]],[[64734,64734],"mapped",[1610,1607]],[[64735,64735],"mapped",[1574,1605]],[[64736,64736],"mapped",[1574,1607]],[[64737,64737],"mapped",[1576,1605]],[[64738,64738],"mapped",[1576,1607]],[[64739,64739],"mapped",[1578,1605]],[[64740,64740],"mapped",[1578,1607]],[[64741,64741],"mapped",[1579,1605]],[[64742,64742],"mapped",[1579,1607]],[[64743,64743],"mapped",[1587,1605]],[[64744,64744],"mapped",[1587,1607]],[[64745,64745],"mapped",[1588,1605]],[[64746,64746],"mapped",[1588,1607]],[[64747,64747],"mapped",[1603,1604]],[[64748,64748],"mapped",[1603,1605]],[[64749,64749],"mapped",[1604,1605]],[[64750,64750],"mapped",[1606,1605]],[[64751,64751],"mapped",[1606,1607]],[[64752,64752],"mapped",[1610,1605]],[[64753,64753],"mapped",[1610,1607]],[[64754,64754],"mapped",[1600,1614,1617]],[[64755,64755],"mapped",[1600,1615,1617]],[[64756,64756],"mapped",[1600,1616,1617]],[[64757,64757],"mapped",[1591,1609]],[[64758,64758],"mapped",[1591,1610]],[[64759,64759],"mapped",[1593,1609]],[[64760,64760],"mapped",[1593,1610]],[[64761,64761],"mapped",[1594,1609]],[[64762,64762],"mapped",[1594,1610]],[[64763,64763],"mapped",[1587,1609]],[[64764,64764],"mapped",[1587,1610]],[[64765,64765],"mapped",[1588,1609]],[[64766,64766],"mapped",[1588,1610]],[[64767,64767],"mapped",[1581,1609]],[[64768,64768],"mapped",[1581,1610]],[[64769,64769],"mapped",[1580,1609]],[[64770,64770],"mapped",[1580,1610]],[[64771,64771],"mapped",[1582,1609]],[[64772,64772],"mapped",[1582,1610]],[[64773,64773],"mapped",[1589,1609]],[[64774,64774],"mapped",[1589,1610]],[[64775,64775],"mapped",[1590,1609]],[[64776,64776],"mapped",[1590,1610]],[[64777,64777],"mapped",[1588,1580]],[[64778,64778],"mapped",[1588,1581]],[[64779,64779],"mapped",[1588,1582]],[[64780,64780],"mapped",[1588,1605]],[[64781,64781],"mapped",[1588,1585]],[[64782,64782],"mapped",[1587,1585]],[[64783,64783],"mapped",[1589,1585]],[[64784,64784],"mapped",[1590,1585]],[[64785,64785],"mapped",[1591,1609]],[[64786,64786],"mapped",[1591,1610]],[[64787,64787],"mapped",[1593,1609]],[[64788,64788],"mapped",[1593,1610]],[[64789,64789],"mapped",[1594,1609]],[[64790,64790],"mapped",[1594,1610]],[[64791,64791],"mapped",[1587,1609]],[[64792,64792],"mapped",[1587,1610]],[[64793,64793],"mapped",[1588,1609]],[[64794,64794],"mapped",[1588,1610]],[[64795,64795],"mapped",[1581,1609]],[[64796,64796],"mapped",[1581,1610]],[[64797,64797],"mapped",[1580,1609]],[[64798,64798],"mapped",[1580,1610]],[[64799,64799],"mapped",[1582,1609]],[[64800,64800],"mapped",[1582,1610]],[[64801,64801],"mapped",[1589,1609]],[[64802,64802],"mapped",[1589,1610]],[[64803,64803],"mapped",[1590,1609]],[[64804,64804],"mapped",[1590,1610]],[[64805,64805],"mapped",[1588,1580]],[[64806,64806],"mapped",[1588,1581]],[[64807,64807],"mapped",[1588,1582]],[[64808,64808],"mapped",[1588,1605]],[[64809,64809],"mapped",[1588,1585]],[[64810,64810],"mapped",[1587,1585]],[[64811,64811],"mapped",[1589,1585]],[[64812,64812],"mapped",[1590,1585]],[[64813,64813],"mapped",[1588,1580]],[[64814,64814],"mapped",[1588,1581]],[[64815,64815],"mapped",[1588,1582]],[[64816,64816],"mapped",[1588,1605]],[[64817,64817],"mapped",[1587,1607]],[[64818,64818],"mapped",[1588,1607]],[[64819,64819],"mapped",[1591,1605]],[[64820,64820],"mapped",[1587,1580]],[[64821,64821],"mapped",[1587,1581]],[[64822,64822],"mapped",[1587,1582]],[[64823,64823],"mapped",[1588,1580]],[[64824,64824],"mapped",[1588,1581]],[[64825,64825],"mapped",[1588,1582]],[[64826,64826],"mapped",[1591,1605]],[[64827,64827],"mapped",[1592,1605]],[[64828,64829],"mapped",[1575,1611]],[[64830,64831],"valid",[],"NV8"],[[64832,64847],"disallowed"],[[64848,64848],"mapped",[1578,1580,1605]],[[64849,64850],"mapped",[1578,1581,1580]],[[64851,64851],"mapped",[1578,1581,1605]],[[64852,64852],"mapped",[1578,1582,1605]],[[64853,64853],"mapped",[1578,1605,1580]],[[64854,64854],"mapped",[1578,1605,1581]],[[64855,64855],"mapped",[1578,1605,1582]],[[64856,64857],"mapped",[1580,1605,1581]],[[64858,64858],"mapped",[1581,1605,1610]],[[64859,64859],"mapped",[1581,1605,1609]],[[64860,64860],"mapped",[1587,1581,1580]],[[64861,64861],"mapped",[1587,1580,1581]],[[64862,64862],"mapped",[1587,1580,1609]],[[64863,64864],"mapped",[1587,1605,1581]],[[64865,64865],"mapped",[1587,1605,1580]],[[64866,64867],"mapped",[1587,1605,1605]],[[64868,64869],"mapped",[1589,1581,1581]],[[64870,64870],"mapped",[1589,1605,1605]],[[64871,64872],"mapped",[1588,1581,1605]],[[64873,64873],"mapped",[1588,1580,1610]],[[64874,64875],"mapped",[1588,1605,1582]],[[64876,64877],"mapped",[1588,1605,1605]],[[64878,64878],"mapped",[1590,1581,1609]],[[64879,64880],"mapped",[1590,1582,1605]],[[64881,64882],"mapped",[1591,1605,1581]],[[64883,64883],"mapped",[1591,1605,1605]],[[64884,64884],"mapped",[1591,1605,1610]],[[64885,64885],"mapped",[1593,1580,1605]],[[64886,64887],"mapped",[1593,1605,1605]],[[64888,64888],"mapped",[1593,1605,1609]],[[64889,64889],"mapped",[1594,1605,1605]],[[64890,64890],"mapped",[1594,1605,1610]],[[64891,64891],"mapped",[1594,1605,1609]],[[64892,64893],"mapped",[1601,1582,1605]],[[64894,64894],"mapped",[1602,1605,1581]],[[64895,64895],"mapped",[1602,1605,1605]],[[64896,64896],"mapped",[1604,1581,1605]],[[64897,64897],"mapped",[1604,1581,1610]],[[64898,64898],"mapped",[1604,1581,1609]],[[64899,64900],"mapped",[1604,1580,1580]],[[64901,64902],"mapped",[1604,1582,1605]],[[64903,64904],"mapped",[1604,1605,1581]],[[64905,64905],"mapped",[1605,1581,1580]],[[64906,64906],"mapped",[1605,1581,1605]],[[64907,64907],"mapped",[1605,1581,1610]],[[64908,64908],"mapped",[1605,1580,1581]],[[64909,64909],"mapped",[1605,1580,1605]],[[64910,64910],"mapped",[1605,1582,1580]],[[64911,64911],"mapped",[1605,1582,1605]],[[64912,64913],"disallowed"],[[64914,64914],"mapped",[1605,1580,1582]],[[64915,64915],"mapped",[1607,1605,1580]],[[64916,64916],"mapped",[1607,1605,1605]],[[64917,64917],"mapped",[1606,1581,1605]],[[64918,64918],"mapped",[1606,1581,1609]],[[64919,64920],"mapped",[1606,1580,1605]],[[64921,64921],"mapped",[1606,1580,1609]],[[64922,64922],"mapped",[1606,1605,1610]],[[64923,64923],"mapped",[1606,1605,1609]],[[64924,64925],"mapped",[1610,1605,1605]],[[64926,64926],"mapped",[1576,1582,1610]],[[64927,64927],"mapped",[1578,1580,1610]],[[64928,64928],"mapped",[1578,1580,1609]],[[64929,64929],"mapped",[1578,1582,1610]],[[64930,64930],"mapped",[1578,1582,1609]],[[64931,64931],"mapped",[1578,1605,1610]],[[64932,64932],"mapped",[1578,1605,1609]],[[64933,64933],"mapped",[1580,1605,1610]],[[64934,64934],"mapped",[1580,1581,1609]],[[64935,64935],"mapped",[1580,1605,1609]],[[64936,64936],"mapped",[1587,1582,1609]],[[64937,64937],"mapped",[1589,1581,1610]],[[64938,64938],"mapped",[1588,1581,1610]],[[64939,64939],"mapped",[1590,1581,1610]],[[64940,64940],"mapped",[1604,1580,1610]],[[64941,64941],"mapped",[1604,1605,1610]],[[64942,64942],"mapped",[1610,1581,1610]],[[64943,64943],"mapped",[1610,1580,1610]],[[64944,64944],"mapped",[1610,1605,1610]],[[64945,64945],"mapped",[1605,1605,1610]],[[64946,64946],"mapped",[1602,1605,1610]],[[64947,64947],"mapped",[1606,1581,1610]],[[64948,64948],"mapped",[1602,1605,1581]],[[64949,64949],"mapped",[1604,1581,1605]],[[64950,64950],"mapped",[1593,1605,1610]],[[64951,64951],"mapped",[1603,1605,1610]],[[64952,64952],"mapped",[1606,1580,1581]],[[64953,64953],"mapped",[1605,1582,1610]],[[64954,64954],"mapped",[1604,1580,1605]],[[64955,64955],"mapped",[1603,1605,1605]],[[64956,64956],"mapped",[1604,1580,1605]],[[64957,64957],"mapped",[1606,1580,1581]],[[64958,64958],"mapped",[1580,1581,1610]],[[64959,64959],"mapped",[1581,1580,1610]],[[64960,64960],"mapped",[1605,1580,1610]],[[64961,64961],"mapped",[1601,1605,1610]],[[64962,64962],"mapped",[1576,1581,1610]],[[64963,64963],"mapped",[1603,1605,1605]],[[64964,64964],"mapped",[1593,1580,1605]],[[64965,64965],"mapped",[1589,1605,1605]],[[64966,64966],"mapped",[1587,1582,1610]],[[64967,64967],"mapped",[1606,1580,1610]],[[64968,64975],"disallowed"],[[64976,65007],"disallowed"],[[65008,65008],"mapped",[1589,1604,1746]],[[65009,65009],"mapped",[1602,1604,1746]],[[65010,65010],"mapped",[1575,1604,1604,1607]],[[65011,65011],"mapped",[1575,1603,1576,1585]],[[65012,65012],"mapped",[1605,1581,1605,1583]],[[65013,65013],"mapped",[1589,1604,1593,1605]],[[65014,65014],"mapped",[1585,1587,1608,1604]],[[65015,65015],"mapped",[1593,1604,1610,1607]],[[65016,65016],"mapped",[1608,1587,1604,1605]],[[65017,65017],"mapped",[1589,1604,1609]],[[65018,65018],"disallowed_STD3_mapped",[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605]],[[65019,65019],"disallowed_STD3_mapped",[1580,1604,32,1580,1604,1575,1604,1607]],[[65020,65020],"mapped",[1585,1740,1575,1604]],[[65021,65021],"valid",[],"NV8"],[[65022,65023],"disallowed"],[[65024,65039],"ignored"],[[65040,65040],"disallowed_STD3_mapped",[44]],[[65041,65041],"mapped",[12289]],[[65042,65042],"disallowed"],[[65043,65043],"disallowed_STD3_mapped",[58]],[[65044,65044],"disallowed_STD3_mapped",[59]],[[65045,65045],"disallowed_STD3_mapped",[33]],[[65046,65046],"disallowed_STD3_mapped",[63]],[[65047,65047],"mapped",[12310]],[[65048,65048],"mapped",[12311]],[[65049,65049],"disallowed"],[[65050,65055],"disallowed"],[[65056,65059],"valid"],[[65060,65062],"valid"],[[65063,65069],"valid"],[[65070,65071],"valid"],[[65072,65072],"disallowed"],[[65073,65073],"mapped",[8212]],[[65074,65074],"mapped",[8211]],[[65075,65076],"disallowed_STD3_mapped",[95]],[[65077,65077],"disallowed_STD3_mapped",[40]],[[65078,65078],"disallowed_STD3_mapped",[41]],[[65079,65079],"disallowed_STD3_mapped",[123]],[[65080,65080],"disallowed_STD3_mapped",[125]],[[65081,65081],"mapped",[12308]],[[65082,65082],"mapped",[12309]],[[65083,65083],"mapped",[12304]],[[65084,65084],"mapped",[12305]],[[65085,65085],"mapped",[12298]],[[65086,65086],"mapped",[12299]],[[65087,65087],"mapped",[12296]],[[65088,65088],"mapped",[12297]],[[65089,65089],"mapped",[12300]],[[65090,65090],"mapped",[12301]],[[65091,65091],"mapped",[12302]],[[65092,65092],"mapped",[12303]],[[65093,65094],"valid",[],"NV8"],[[65095,65095],"disallowed_STD3_mapped",[91]],[[65096,65096],"disallowed_STD3_mapped",[93]],[[65097,65100],"disallowed_STD3_mapped",[32,773]],[[65101,65103],"disallowed_STD3_mapped",[95]],[[65104,65104],"disallowed_STD3_mapped",[44]],[[65105,65105],"mapped",[12289]],[[65106,65106],"disallowed"],[[65107,65107],"disallowed"],[[65108,65108],"disallowed_STD3_mapped",[59]],[[65109,65109],"disallowed_STD3_mapped",[58]],[[65110,65110],"disallowed_STD3_mapped",[63]],[[65111,65111],"disallowed_STD3_mapped",[33]],[[65112,65112],"mapped",[8212]],[[65113,65113],"disallowed_STD3_mapped",[40]],[[65114,65114],"disallowed_STD3_mapped",[41]],[[65115,65115],"disallowed_STD3_mapped",[123]],[[65116,65116],"disallowed_STD3_mapped",[125]],[[65117,65117],"mapped",[12308]],[[65118,65118],"mapped",[12309]],[[65119,65119],"disallowed_STD3_mapped",[35]],[[65120,65120],"disallowed_STD3_mapped",[38]],[[65121,65121],"disallowed_STD3_mapped",[42]],[[65122,65122],"disallowed_STD3_mapped",[43]],[[65123,65123],"mapped",[45]],[[65124,65124],"disallowed_STD3_mapped",[60]],[[65125,65125],"disallowed_STD3_mapped",[62]],[[65126,65126],"disallowed_STD3_mapped",[61]],[[65127,65127],"disallowed"],[[65128,65128],"disallowed_STD3_mapped",[92]],[[65129,65129],"disallowed_STD3_mapped",[36]],[[65130,65130],"disallowed_STD3_mapped",[37]],[[65131,65131],"disallowed_STD3_mapped",[64]],[[65132,65135],"disallowed"],[[65136,65136],"disallowed_STD3_mapped",[32,1611]],[[65137,65137],"mapped",[1600,1611]],[[65138,65138],"disallowed_STD3_mapped",[32,1612]],[[65139,65139],"valid"],[[65140,65140],"disallowed_STD3_mapped",[32,1613]],[[65141,65141],"disallowed"],[[65142,65142],"disallowed_STD3_mapped",[32,1614]],[[65143,65143],"mapped",[1600,1614]],[[65144,65144],"disallowed_STD3_mapped",[32,1615]],[[65145,65145],"mapped",[1600,1615]],[[65146,65146],"disallowed_STD3_mapped",[32,1616]],[[65147,65147],"mapped",[1600,1616]],[[65148,65148],"disallowed_STD3_mapped",[32,1617]],[[65149,65149],"mapped",[1600,1617]],[[65150,65150],"disallowed_STD3_mapped",[32,1618]],[[65151,65151],"mapped",[1600,1618]],[[65152,65152],"mapped",[1569]],[[65153,65154],"mapped",[1570]],[[65155,65156],"mapped",[1571]],[[65157,65158],"mapped",[1572]],[[65159,65160],"mapped",[1573]],[[65161,65164],"mapped",[1574]],[[65165,65166],"mapped",[1575]],[[65167,65170],"mapped",[1576]],[[65171,65172],"mapped",[1577]],[[65173,65176],"mapped",[1578]],[[65177,65180],"mapped",[1579]],[[65181,65184],"mapped",[1580]],[[65185,65188],"mapped",[1581]],[[65189,65192],"mapped",[1582]],[[65193,65194],"mapped",[1583]],[[65195,65196],"mapped",[1584]],[[65197,65198],"mapped",[1585]],[[65199,65200],"mapped",[1586]],[[65201,65204],"mapped",[1587]],[[65205,65208],"mapped",[1588]],[[65209,65212],"mapped",[1589]],[[65213,65216],"mapped",[1590]],[[65217,65220],"mapped",[1591]],[[65221,65224],"mapped",[1592]],[[65225,65228],"mapped",[1593]],[[65229,65232],"mapped",[1594]],[[65233,65236],"mapped",[1601]],[[65237,65240],"mapped",[1602]],[[65241,65244],"mapped",[1603]],[[65245,65248],"mapped",[1604]],[[65249,65252],"mapped",[1605]],[[65253,65256],"mapped",[1606]],[[65257,65260],"mapped",[1607]],[[65261,65262],"mapped",[1608]],[[65263,65264],"mapped",[1609]],[[65265,65268],"mapped",[1610]],[[65269,65270],"mapped",[1604,1570]],[[65271,65272],"mapped",[1604,1571]],[[65273,65274],"mapped",[1604,1573]],[[65275,65276],"mapped",[1604,1575]],[[65277,65278],"disallowed"],[[65279,65279],"ignored"],[[65280,65280],"disallowed"],[[65281,65281],"disallowed_STD3_mapped",[33]],[[65282,65282],"disallowed_STD3_mapped",[34]],[[65283,65283],"disallowed_STD3_mapped",[35]],[[65284,65284],"disallowed_STD3_mapped",[36]],[[65285,65285],"disallowed_STD3_mapped",[37]],[[65286,65286],"disallowed_STD3_mapped",[38]],[[65287,65287],"disallowed_STD3_mapped",[39]],[[65288,65288],"disallowed_STD3_mapped",[40]],[[65289,65289],"disallowed_STD3_mapped",[41]],[[65290,65290],"disallowed_STD3_mapped",[42]],[[65291,65291],"disallowed_STD3_mapped",[43]],[[65292,65292],"disallowed_STD3_mapped",[44]],[[65293,65293],"mapped",[45]],[[65294,65294],"mapped",[46]],[[65295,65295],"disallowed_STD3_mapped",[47]],[[65296,65296],"mapped",[48]],[[65297,65297],"mapped",[49]],[[65298,65298],"mapped",[50]],[[65299,65299],"mapped",[51]],[[65300,65300],"mapped",[52]],[[65301,65301],"mapped",[53]],[[65302,65302],"mapped",[54]],[[65303,65303],"mapped",[55]],[[65304,65304],"mapped",[56]],[[65305,65305],"mapped",[57]],[[65306,65306],"disallowed_STD3_mapped",[58]],[[65307,65307],"disallowed_STD3_mapped",[59]],[[65308,65308],"disallowed_STD3_mapped",[60]],[[65309,65309],"disallowed_STD3_mapped",[61]],[[65310,65310],"disallowed_STD3_mapped",[62]],[[65311,65311],"disallowed_STD3_mapped",[63]],[[65312,65312],"disallowed_STD3_mapped",[64]],[[65313,65313],"mapped",[97]],[[65314,65314],"mapped",[98]],[[65315,65315],"mapped",[99]],[[65316,65316],"mapped",[100]],[[65317,65317],"mapped",[101]],[[65318,65318],"mapped",[102]],[[65319,65319],"mapped",[103]],[[65320,65320],"mapped",[104]],[[65321,65321],"mapped",[105]],[[65322,65322],"mapped",[106]],[[65323,65323],"mapped",[107]],[[65324,65324],"mapped",[108]],[[65325,65325],"mapped",[109]],[[65326,65326],"mapped",[110]],[[65327,65327],"mapped",[111]],[[65328,65328],"mapped",[112]],[[65329,65329],"mapped",[113]],[[65330,65330],"mapped",[114]],[[65331,65331],"mapped",[115]],[[65332,65332],"mapped",[116]],[[65333,65333],"mapped",[117]],[[65334,65334],"mapped",[118]],[[65335,65335],"mapped",[119]],[[65336,65336],"mapped",[120]],[[65337,65337],"mapped",[121]],[[65338,65338],"mapped",[122]],[[65339,65339],"disallowed_STD3_mapped",[91]],[[65340,65340],"disallowed_STD3_mapped",[92]],[[65341,65341],"disallowed_STD3_mapped",[93]],[[65342,65342],"disallowed_STD3_mapped",[94]],[[65343,65343],"disallowed_STD3_mapped",[95]],[[65344,65344],"disallowed_STD3_mapped",[96]],[[65345,65345],"mapped",[97]],[[65346,65346],"mapped",[98]],[[65347,65347],"mapped",[99]],[[65348,65348],"mapped",[100]],[[65349,65349],"mapped",[101]],[[65350,65350],"mapped",[102]],[[65351,65351],"mapped",[103]],[[65352,65352],"mapped",[104]],[[65353,65353],"mapped",[105]],[[65354,65354],"mapped",[106]],[[65355,65355],"mapped",[107]],[[65356,65356],"mapped",[108]],[[65357,65357],"mapped",[109]],[[65358,65358],"mapped",[110]],[[65359,65359],"mapped",[111]],[[65360,65360],"mapped",[112]],[[65361,65361],"mapped",[113]],[[65362,65362],"mapped",[114]],[[65363,65363],"mapped",[115]],[[65364,65364],"mapped",[116]],[[65365,65365],"mapped",[117]],[[65366,65366],"mapped",[118]],[[65367,65367],"mapped",[119]],[[65368,65368],"mapped",[120]],[[65369,65369],"mapped",[121]],[[65370,65370],"mapped",[122]],[[65371,65371],"disallowed_STD3_mapped",[123]],[[65372,65372],"disallowed_STD3_mapped",[124]],[[65373,65373],"disallowed_STD3_mapped",[125]],[[65374,65374],"disallowed_STD3_mapped",[126]],[[65375,65375],"mapped",[10629]],[[65376,65376],"mapped",[10630]],[[65377,65377],"mapped",[46]],[[65378,65378],"mapped",[12300]],[[65379,65379],"mapped",[12301]],[[65380,65380],"mapped",[12289]],[[65381,65381],"mapped",[12539]],[[65382,65382],"mapped",[12530]],[[65383,65383],"mapped",[12449]],[[65384,65384],"mapped",[12451]],[[65385,65385],"mapped",[12453]],[[65386,65386],"mapped",[12455]],[[65387,65387],"mapped",[12457]],[[65388,65388],"mapped",[12515]],[[65389,65389],"mapped",[12517]],[[65390,65390],"mapped",[12519]],[[65391,65391],"mapped",[12483]],[[65392,65392],"mapped",[12540]],[[65393,65393],"mapped",[12450]],[[65394,65394],"mapped",[12452]],[[65395,65395],"mapped",[12454]],[[65396,65396],"mapped",[12456]],[[65397,65397],"mapped",[12458]],[[65398,65398],"mapped",[12459]],[[65399,65399],"mapped",[12461]],[[65400,65400],"mapped",[12463]],[[65401,65401],"mapped",[12465]],[[65402,65402],"mapped",[12467]],[[65403,65403],"mapped",[12469]],[[65404,65404],"mapped",[12471]],[[65405,65405],"mapped",[12473]],[[65406,65406],"mapped",[12475]],[[65407,65407],"mapped",[12477]],[[65408,65408],"mapped",[12479]],[[65409,65409],"mapped",[12481]],[[65410,65410],"mapped",[12484]],[[65411,65411],"mapped",[12486]],[[65412,65412],"mapped",[12488]],[[65413,65413],"mapped",[12490]],[[65414,65414],"mapped",[12491]],[[65415,65415],"mapped",[12492]],[[65416,65416],"mapped",[12493]],[[65417,65417],"mapped",[12494]],[[65418,65418],"mapped",[12495]],[[65419,65419],"mapped",[12498]],[[65420,65420],"mapped",[12501]],[[65421,65421],"mapped",[12504]],[[65422,65422],"mapped",[12507]],[[65423,65423],"mapped",[12510]],[[65424,65424],"mapped",[12511]],[[65425,65425],"mapped",[12512]],[[65426,65426],"mapped",[12513]],[[65427,65427],"mapped",[12514]],[[65428,65428],"mapped",[12516]],[[65429,65429],"mapped",[12518]],[[65430,65430],"mapped",[12520]],[[65431,65431],"mapped",[12521]],[[65432,65432],"mapped",[12522]],[[65433,65433],"mapped",[12523]],[[65434,65434],"mapped",[12524]],[[65435,65435],"mapped",[12525]],[[65436,65436],"mapped",[12527]],[[65437,65437],"mapped",[12531]],[[65438,65438],"mapped",[12441]],[[65439,65439],"mapped",[12442]],[[65440,65440],"disallowed"],[[65441,65441],"mapped",[4352]],[[65442,65442],"mapped",[4353]],[[65443,65443],"mapped",[4522]],[[65444,65444],"mapped",[4354]],[[65445,65445],"mapped",[4524]],[[65446,65446],"mapped",[4525]],[[65447,65447],"mapped",[4355]],[[65448,65448],"mapped",[4356]],[[65449,65449],"mapped",[4357]],[[65450,65450],"mapped",[4528]],[[65451,65451],"mapped",[4529]],[[65452,65452],"mapped",[4530]],[[65453,65453],"mapped",[4531]],[[65454,65454],"mapped",[4532]],[[65455,65455],"mapped",[4533]],[[65456,65456],"mapped",[4378]],[[65457,65457],"mapped",[4358]],[[65458,65458],"mapped",[4359]],[[65459,65459],"mapped",[4360]],[[65460,65460],"mapped",[4385]],[[65461,65461],"mapped",[4361]],[[65462,65462],"mapped",[4362]],[[65463,65463],"mapped",[4363]],[[65464,65464],"mapped",[4364]],[[65465,65465],"mapped",[4365]],[[65466,65466],"mapped",[4366]],[[65467,65467],"mapped",[4367]],[[65468,65468],"mapped",[4368]],[[65469,65469],"mapped",[4369]],[[65470,65470],"mapped",[4370]],[[65471,65473],"disallowed"],[[65474,65474],"mapped",[4449]],[[65475,65475],"mapped",[4450]],[[65476,65476],"mapped",[4451]],[[65477,65477],"mapped",[4452]],[[65478,65478],"mapped",[4453]],[[65479,65479],"mapped",[4454]],[[65480,65481],"disallowed"],[[65482,65482],"mapped",[4455]],[[65483,65483],"mapped",[4456]],[[65484,65484],"mapped",[4457]],[[65485,65485],"mapped",[4458]],[[65486,65486],"mapped",[4459]],[[65487,65487],"mapped",[4460]],[[65488,65489],"disallowed"],[[65490,65490],"mapped",[4461]],[[65491,65491],"mapped",[4462]],[[65492,65492],"mapped",[4463]],[[65493,65493],"mapped",[4464]],[[65494,65494],"mapped",[4465]],[[65495,65495],"mapped",[4466]],[[65496,65497],"disallowed"],[[65498,65498],"mapped",[4467]],[[65499,65499],"mapped",[4468]],[[65500,65500],"mapped",[4469]],[[65501,65503],"disallowed"],[[65504,65504],"mapped",[162]],[[65505,65505],"mapped",[163]],[[65506,65506],"mapped",[172]],[[65507,65507],"disallowed_STD3_mapped",[32,772]],[[65508,65508],"mapped",[166]],[[65509,65509],"mapped",[165]],[[65510,65510],"mapped",[8361]],[[65511,65511],"disallowed"],[[65512,65512],"mapped",[9474]],[[65513,65513],"mapped",[8592]],[[65514,65514],"mapped",[8593]],[[65515,65515],"mapped",[8594]],[[65516,65516],"mapped",[8595]],[[65517,65517],"mapped",[9632]],[[65518,65518],"mapped",[9675]],[[65519,65528],"disallowed"],[[65529,65531],"disallowed"],[[65532,65532],"disallowed"],[[65533,65533],"disallowed"],[[65534,65535],"disallowed"],[[65536,65547],"valid"],[[65548,65548],"disallowed"],[[65549,65574],"valid"],[[65575,65575],"disallowed"],[[65576,65594],"valid"],[[65595,65595],"disallowed"],[[65596,65597],"valid"],[[65598,65598],"disallowed"],[[65599,65613],"valid"],[[65614,65615],"disallowed"],[[65616,65629],"valid"],[[65630,65663],"disallowed"],[[65664,65786],"valid"],[[65787,65791],"disallowed"],[[65792,65794],"valid",[],"NV8"],[[65795,65798],"disallowed"],[[65799,65843],"valid",[],"NV8"],[[65844,65846],"disallowed"],[[65847,65855],"valid",[],"NV8"],[[65856,65930],"valid",[],"NV8"],[[65931,65932],"valid",[],"NV8"],[[65933,65935],"disallowed"],[[65936,65947],"valid",[],"NV8"],[[65948,65951],"disallowed"],[[65952,65952],"valid",[],"NV8"],[[65953,65999],"disallowed"],[[66000,66044],"valid",[],"NV8"],[[66045,66045],"valid"],[[66046,66175],"disallowed"],[[66176,66204],"valid"],[[66205,66207],"disallowed"],[[66208,66256],"valid"],[[66257,66271],"disallowed"],[[66272,66272],"valid"],[[66273,66299],"valid",[],"NV8"],[[66300,66303],"disallowed"],[[66304,66334],"valid"],[[66335,66335],"valid"],[[66336,66339],"valid",[],"NV8"],[[66340,66351],"disallowed"],[[66352,66368],"valid"],[[66369,66369],"valid",[],"NV8"],[[66370,66377],"valid"],[[66378,66378],"valid",[],"NV8"],[[66379,66383],"disallowed"],[[66384,66426],"valid"],[[66427,66431],"disallowed"],[[66432,66461],"valid"],[[66462,66462],"disallowed"],[[66463,66463],"valid",[],"NV8"],[[66464,66499],"valid"],[[66500,66503],"disallowed"],[[66504,66511],"valid"],[[66512,66517],"valid",[],"NV8"],[[66518,66559],"disallowed"],[[66560,66560],"mapped",[66600]],[[66561,66561],"mapped",[66601]],[[66562,66562],"mapped",[66602]],[[66563,66563],"mapped",[66603]],[[66564,66564],"mapped",[66604]],[[66565,66565],"mapped",[66605]],[[66566,66566],"mapped",[66606]],[[66567,66567],"mapped",[66607]],[[66568,66568],"mapped",[66608]],[[66569,66569],"mapped",[66609]],[[66570,66570],"mapped",[66610]],[[66571,66571],"mapped",[66611]],[[66572,66572],"mapped",[66612]],[[66573,66573],"mapped",[66613]],[[66574,66574],"mapped",[66614]],[[66575,66575],"mapped",[66615]],[[66576,66576],"mapped",[66616]],[[66577,66577],"mapped",[66617]],[[66578,66578],"mapped",[66618]],[[66579,66579],"mapped",[66619]],[[66580,66580],"mapped",[66620]],[[66581,66581],"mapped",[66621]],[[66582,66582],"mapped",[66622]],[[66583,66583],"mapped",[66623]],[[66584,66584],"mapped",[66624]],[[66585,66585],"mapped",[66625]],[[66586,66586],"mapped",[66626]],[[66587,66587],"mapped",[66627]],[[66588,66588],"mapped",[66628]],[[66589,66589],"mapped",[66629]],[[66590,66590],"mapped",[66630]],[[66591,66591],"mapped",[66631]],[[66592,66592],"mapped",[66632]],[[66593,66593],"mapped",[66633]],[[66594,66594],"mapped",[66634]],[[66595,66595],"mapped",[66635]],[[66596,66596],"mapped",[66636]],[[66597,66597],"mapped",[66637]],[[66598,66598],"mapped",[66638]],[[66599,66599],"mapped",[66639]],[[66600,66637],"valid"],[[66638,66717],"valid"],[[66718,66719],"disallowed"],[[66720,66729],"valid"],[[66730,66815],"disallowed"],[[66816,66855],"valid"],[[66856,66863],"disallowed"],[[66864,66915],"valid"],[[66916,66926],"disallowed"],[[66927,66927],"valid",[],"NV8"],[[66928,67071],"disallowed"],[[67072,67382],"valid"],[[67383,67391],"disallowed"],[[67392,67413],"valid"],[[67414,67423],"disallowed"],[[67424,67431],"valid"],[[67432,67583],"disallowed"],[[67584,67589],"valid"],[[67590,67591],"disallowed"],[[67592,67592],"valid"],[[67593,67593],"disallowed"],[[67594,67637],"valid"],[[67638,67638],"disallowed"],[[67639,67640],"valid"],[[67641,67643],"disallowed"],[[67644,67644],"valid"],[[67645,67646],"disallowed"],[[67647,67647],"valid"],[[67648,67669],"valid"],[[67670,67670],"disallowed"],[[67671,67679],"valid",[],"NV8"],[[67680,67702],"valid"],[[67703,67711],"valid",[],"NV8"],[[67712,67742],"valid"],[[67743,67750],"disallowed"],[[67751,67759],"valid",[],"NV8"],[[67760,67807],"disallowed"],[[67808,67826],"valid"],[[67827,67827],"disallowed"],[[67828,67829],"valid"],[[67830,67834],"disallowed"],[[67835,67839],"valid",[],"NV8"],[[67840,67861],"valid"],[[67862,67865],"valid",[],"NV8"],[[67866,67867],"valid",[],"NV8"],[[67868,67870],"disallowed"],[[67871,67871],"valid",[],"NV8"],[[67872,67897],"valid"],[[67898,67902],"disallowed"],[[67903,67903],"valid",[],"NV8"],[[67904,67967],"disallowed"],[[67968,68023],"valid"],[[68024,68027],"disallowed"],[[68028,68029],"valid",[],"NV8"],[[68030,68031],"valid"],[[68032,68047],"valid",[],"NV8"],[[68048,68049],"disallowed"],[[68050,68095],"valid",[],"NV8"],[[68096,68099],"valid"],[[68100,68100],"disallowed"],[[68101,68102],"valid"],[[68103,68107],"disallowed"],[[68108,68115],"valid"],[[68116,68116],"disallowed"],[[68117,68119],"valid"],[[68120,68120],"disallowed"],[[68121,68147],"valid"],[[68148,68151],"disallowed"],[[68152,68154],"valid"],[[68155,68158],"disallowed"],[[68159,68159],"valid"],[[68160,68167],"valid",[],"NV8"],[[68168,68175],"disallowed"],[[68176,68184],"valid",[],"NV8"],[[68185,68191],"disallowed"],[[68192,68220],"valid"],[[68221,68223],"valid",[],"NV8"],[[68224,68252],"valid"],[[68253,68255],"valid",[],"NV8"],[[68256,68287],"disallowed"],[[68288,68295],"valid"],[[68296,68296],"valid",[],"NV8"],[[68297,68326],"valid"],[[68327,68330],"disallowed"],[[68331,68342],"valid",[],"NV8"],[[68343,68351],"disallowed"],[[68352,68405],"valid"],[[68406,68408],"disallowed"],[[68409,68415],"valid",[],"NV8"],[[68416,68437],"valid"],[[68438,68439],"disallowed"],[[68440,68447],"valid",[],"NV8"],[[68448,68466],"valid"],[[68467,68471],"disallowed"],[[68472,68479],"valid",[],"NV8"],[[68480,68497],"valid"],[[68498,68504],"disallowed"],[[68505,68508],"valid",[],"NV8"],[[68509,68520],"disallowed"],[[68521,68527],"valid",[],"NV8"],[[68528,68607],"disallowed"],[[68608,68680],"valid"],[[68681,68735],"disallowed"],[[68736,68736],"mapped",[68800]],[[68737,68737],"mapped",[68801]],[[68738,68738],"mapped",[68802]],[[68739,68739],"mapped",[68803]],[[68740,68740],"mapped",[68804]],[[68741,68741],"mapped",[68805]],[[68742,68742],"mapped",[68806]],[[68743,68743],"mapped",[68807]],[[68744,68744],"mapped",[68808]],[[68745,68745],"mapped",[68809]],[[68746,68746],"mapped",[68810]],[[68747,68747],"mapped",[68811]],[[68748,68748],"mapped",[68812]],[[68749,68749],"mapped",[68813]],[[68750,68750],"mapped",[68814]],[[68751,68751],"mapped",[68815]],[[68752,68752],"mapped",[68816]],[[68753,68753],"mapped",[68817]],[[68754,68754],"mapped",[68818]],[[68755,68755],"mapped",[68819]],[[68756,68756],"mapped",[68820]],[[68757,68757],"mapped",[68821]],[[68758,68758],"mapped",[68822]],[[68759,68759],"mapped",[68823]],[[68760,68760],"mapped",[68824]],[[68761,68761],"mapped",[68825]],[[68762,68762],"mapped",[68826]],[[68763,68763],"mapped",[68827]],[[68764,68764],"mapped",[68828]],[[68765,68765],"mapped",[68829]],[[68766,68766],"mapped",[68830]],[[68767,68767],"mapped",[68831]],[[68768,68768],"mapped",[68832]],[[68769,68769],"mapped",[68833]],[[68770,68770],"mapped",[68834]],[[68771,68771],"mapped",[68835]],[[68772,68772],"mapped",[68836]],[[68773,68773],"mapped",[68837]],[[68774,68774],"mapped",[68838]],[[68775,68775],"mapped",[68839]],[[68776,68776],"mapped",[68840]],[[68777,68777],"mapped",[68841]],[[68778,68778],"mapped",[68842]],[[68779,68779],"mapped",[68843]],[[68780,68780],"mapped",[68844]],[[68781,68781],"mapped",[68845]],[[68782,68782],"mapped",[68846]],[[68783,68783],"mapped",[68847]],[[68784,68784],"mapped",[68848]],[[68785,68785],"mapped",[68849]],[[68786,68786],"mapped",[68850]],[[68787,68799],"disallowed"],[[68800,68850],"valid"],[[68851,68857],"disallowed"],[[68858,68863],"valid",[],"NV8"],[[68864,69215],"disallowed"],[[69216,69246],"valid",[],"NV8"],[[69247,69631],"disallowed"],[[69632,69702],"valid"],[[69703,69709],"valid",[],"NV8"],[[69710,69713],"disallowed"],[[69714,69733],"valid",[],"NV8"],[[69734,69743],"valid"],[[69744,69758],"disallowed"],[[69759,69759],"valid"],[[69760,69818],"valid"],[[69819,69820],"valid",[],"NV8"],[[69821,69821],"disallowed"],[[69822,69825],"valid",[],"NV8"],[[69826,69839],"disallowed"],[[69840,69864],"valid"],[[69865,69871],"disallowed"],[[69872,69881],"valid"],[[69882,69887],"disallowed"],[[69888,69940],"valid"],[[69941,69941],"disallowed"],[[69942,69951],"valid"],[[69952,69955],"valid",[],"NV8"],[[69956,69967],"disallowed"],[[69968,70003],"valid"],[[70004,70005],"valid",[],"NV8"],[[70006,70006],"valid"],[[70007,70015],"disallowed"],[[70016,70084],"valid"],[[70085,70088],"valid",[],"NV8"],[[70089,70089],"valid",[],"NV8"],[[70090,70092],"valid"],[[70093,70093],"valid",[],"NV8"],[[70094,70095],"disallowed"],[[70096,70105],"valid"],[[70106,70106],"valid"],[[70107,70107],"valid",[],"NV8"],[[70108,70108],"valid"],[[70109,70111],"valid",[],"NV8"],[[70112,70112],"disallowed"],[[70113,70132],"valid",[],"NV8"],[[70133,70143],"disallowed"],[[70144,70161],"valid"],[[70162,70162],"disallowed"],[[70163,70199],"valid"],[[70200,70205],"valid",[],"NV8"],[[70206,70271],"disallowed"],[[70272,70278],"valid"],[[70279,70279],"disallowed"],[[70280,70280],"valid"],[[70281,70281],"disallowed"],[[70282,70285],"valid"],[[70286,70286],"disallowed"],[[70287,70301],"valid"],[[70302,70302],"disallowed"],[[70303,70312],"valid"],[[70313,70313],"valid",[],"NV8"],[[70314,70319],"disallowed"],[[70320,70378],"valid"],[[70379,70383],"disallowed"],[[70384,70393],"valid"],[[70394,70399],"disallowed"],[[70400,70400],"valid"],[[70401,70403],"valid"],[[70404,70404],"disallowed"],[[70405,70412],"valid"],[[70413,70414],"disallowed"],[[70415,70416],"valid"],[[70417,70418],"disallowed"],[[70419,70440],"valid"],[[70441,70441],"disallowed"],[[70442,70448],"valid"],[[70449,70449],"disallowed"],[[70450,70451],"valid"],[[70452,70452],"disallowed"],[[70453,70457],"valid"],[[70458,70459],"disallowed"],[[70460,70468],"valid"],[[70469,70470],"disallowed"],[[70471,70472],"valid"],[[70473,70474],"disallowed"],[[70475,70477],"valid"],[[70478,70479],"disallowed"],[[70480,70480],"valid"],[[70481,70486],"disallowed"],[[70487,70487],"valid"],[[70488,70492],"disallowed"],[[70493,70499],"valid"],[[70500,70501],"disallowed"],[[70502,70508],"valid"],[[70509,70511],"disallowed"],[[70512,70516],"valid"],[[70517,70783],"disallowed"],[[70784,70853],"valid"],[[70854,70854],"valid",[],"NV8"],[[70855,70855],"valid"],[[70856,70863],"disallowed"],[[70864,70873],"valid"],[[70874,71039],"disallowed"],[[71040,71093],"valid"],[[71094,71095],"disallowed"],[[71096,71104],"valid"],[[71105,71113],"valid",[],"NV8"],[[71114,71127],"valid",[],"NV8"],[[71128,71133],"valid"],[[71134,71167],"disallowed"],[[71168,71232],"valid"],[[71233,71235],"valid",[],"NV8"],[[71236,71236],"valid"],[[71237,71247],"disallowed"],[[71248,71257],"valid"],[[71258,71295],"disallowed"],[[71296,71351],"valid"],[[71352,71359],"disallowed"],[[71360,71369],"valid"],[[71370,71423],"disallowed"],[[71424,71449],"valid"],[[71450,71452],"disallowed"],[[71453,71467],"valid"],[[71468,71471],"disallowed"],[[71472,71481],"valid"],[[71482,71487],"valid",[],"NV8"],[[71488,71839],"disallowed"],[[71840,71840],"mapped",[71872]],[[71841,71841],"mapped",[71873]],[[71842,71842],"mapped",[71874]],[[71843,71843],"mapped",[71875]],[[71844,71844],"mapped",[71876]],[[71845,71845],"mapped",[71877]],[[71846,71846],"mapped",[71878]],[[71847,71847],"mapped",[71879]],[[71848,71848],"mapped",[71880]],[[71849,71849],"mapped",[71881]],[[71850,71850],"mapped",[71882]],[[71851,71851],"mapped",[71883]],[[71852,71852],"mapped",[71884]],[[71853,71853],"mapped",[71885]],[[71854,71854],"mapped",[71886]],[[71855,71855],"mapped",[71887]],[[71856,71856],"mapped",[71888]],[[71857,71857],"mapped",[71889]],[[71858,71858],"mapped",[71890]],[[71859,71859],"mapped",[71891]],[[71860,71860],"mapped",[71892]],[[71861,71861],"mapped",[71893]],[[71862,71862],"mapped",[71894]],[[71863,71863],"mapped",[71895]],[[71864,71864],"mapped",[71896]],[[71865,71865],"mapped",[71897]],[[71866,71866],"mapped",[71898]],[[71867,71867],"mapped",[71899]],[[71868,71868],"mapped",[71900]],[[71869,71869],"mapped",[71901]],[[71870,71870],"mapped",[71902]],[[71871,71871],"mapped",[71903]],[[71872,71913],"valid"],[[71914,71922],"valid",[],"NV8"],[[71923,71934],"disallowed"],[[71935,71935],"valid"],[[71936,72383],"disallowed"],[[72384,72440],"valid"],[[72441,73727],"disallowed"],[[73728,74606],"valid"],[[74607,74648],"valid"],[[74649,74649],"valid"],[[74650,74751],"disallowed"],[[74752,74850],"valid",[],"NV8"],[[74851,74862],"valid",[],"NV8"],[[74863,74863],"disallowed"],[[74864,74867],"valid",[],"NV8"],[[74868,74868],"valid",[],"NV8"],[[74869,74879],"disallowed"],[[74880,75075],"valid"],[[75076,77823],"disallowed"],[[77824,78894],"valid"],[[78895,82943],"disallowed"],[[82944,83526],"valid"],[[83527,92159],"disallowed"],[[92160,92728],"valid"],[[92729,92735],"disallowed"],[[92736,92766],"valid"],[[92767,92767],"disallowed"],[[92768,92777],"valid"],[[92778,92781],"disallowed"],[[92782,92783],"valid",[],"NV8"],[[92784,92879],"disallowed"],[[92880,92909],"valid"],[[92910,92911],"disallowed"],[[92912,92916],"valid"],[[92917,92917],"valid",[],"NV8"],[[92918,92927],"disallowed"],[[92928,92982],"valid"],[[92983,92991],"valid",[],"NV8"],[[92992,92995],"valid"],[[92996,92997],"valid",[],"NV8"],[[92998,93007],"disallowed"],[[93008,93017],"valid"],[[93018,93018],"disallowed"],[[93019,93025],"valid",[],"NV8"],[[93026,93026],"disallowed"],[[93027,93047],"valid"],[[93048,93052],"disallowed"],[[93053,93071],"valid"],[[93072,93951],"disallowed"],[[93952,94020],"valid"],[[94021,94031],"disallowed"],[[94032,94078],"valid"],[[94079,94094],"disallowed"],[[94095,94111],"valid"],[[94112,110591],"disallowed"],[[110592,110593],"valid"],[[110594,113663],"disallowed"],[[113664,113770],"valid"],[[113771,113775],"disallowed"],[[113776,113788],"valid"],[[113789,113791],"disallowed"],[[113792,113800],"valid"],[[113801,113807],"disallowed"],[[113808,113817],"valid"],[[113818,113819],"disallowed"],[[113820,113820],"valid",[],"NV8"],[[113821,113822],"valid"],[[113823,113823],"valid",[],"NV8"],[[113824,113827],"ignored"],[[113828,118783],"disallowed"],[[118784,119029],"valid",[],"NV8"],[[119030,119039],"disallowed"],[[119040,119078],"valid",[],"NV8"],[[119079,119080],"disallowed"],[[119081,119081],"valid",[],"NV8"],[[119082,119133],"valid",[],"NV8"],[[119134,119134],"mapped",[119127,119141]],[[119135,119135],"mapped",[119128,119141]],[[119136,119136],"mapped",[119128,119141,119150]],[[119137,119137],"mapped",[119128,119141,119151]],[[119138,119138],"mapped",[119128,119141,119152]],[[119139,119139],"mapped",[119128,119141,119153]],[[119140,119140],"mapped",[119128,119141,119154]],[[119141,119154],"valid",[],"NV8"],[[119155,119162],"disallowed"],[[119163,119226],"valid",[],"NV8"],[[119227,119227],"mapped",[119225,119141]],[[119228,119228],"mapped",[119226,119141]],[[119229,119229],"mapped",[119225,119141,119150]],[[119230,119230],"mapped",[119226,119141,119150]],[[119231,119231],"mapped",[119225,119141,119151]],[[119232,119232],"mapped",[119226,119141,119151]],[[119233,119261],"valid",[],"NV8"],[[119262,119272],"valid",[],"NV8"],[[119273,119295],"disallowed"],[[119296,119365],"valid",[],"NV8"],[[119366,119551],"disallowed"],[[119552,119638],"valid",[],"NV8"],[[119639,119647],"disallowed"],[[119648,119665],"valid",[],"NV8"],[[119666,119807],"disallowed"],[[119808,119808],"mapped",[97]],[[119809,119809],"mapped",[98]],[[119810,119810],"mapped",[99]],[[119811,119811],"mapped",[100]],[[119812,119812],"mapped",[101]],[[119813,119813],"mapped",[102]],[[119814,119814],"mapped",[103]],[[119815,119815],"mapped",[104]],[[119816,119816],"mapped",[105]],[[119817,119817],"mapped",[106]],[[119818,119818],"mapped",[107]],[[119819,119819],"mapped",[108]],[[119820,119820],"mapped",[109]],[[119821,119821],"mapped",[110]],[[119822,119822],"mapped",[111]],[[119823,119823],"mapped",[112]],[[119824,119824],"mapped",[113]],[[119825,119825],"mapped",[114]],[[119826,119826],"mapped",[115]],[[119827,119827],"mapped",[116]],[[119828,119828],"mapped",[117]],[[119829,119829],"mapped",[118]],[[119830,119830],"mapped",[119]],[[119831,119831],"mapped",[120]],[[119832,119832],"mapped",[121]],[[119833,119833],"mapped",[122]],[[119834,119834],"mapped",[97]],[[119835,119835],"mapped",[98]],[[119836,119836],"mapped",[99]],[[119837,119837],"mapped",[100]],[[119838,119838],"mapped",[101]],[[119839,119839],"mapped",[102]],[[119840,119840],"mapped",[103]],[[119841,119841],"mapped",[104]],[[119842,119842],"mapped",[105]],[[119843,119843],"mapped",[106]],[[119844,119844],"mapped",[107]],[[119845,119845],"mapped",[108]],[[119846,119846],"mapped",[109]],[[119847,119847],"mapped",[110]],[[119848,119848],"mapped",[111]],[[119849,119849],"mapped",[112]],[[119850,119850],"mapped",[113]],[[119851,119851],"mapped",[114]],[[119852,119852],"mapped",[115]],[[119853,119853],"mapped",[116]],[[119854,119854],"mapped",[117]],[[119855,119855],"mapped",[118]],[[119856,119856],"mapped",[119]],[[119857,119857],"mapped",[120]],[[119858,119858],"mapped",[121]],[[119859,119859],"mapped",[122]],[[119860,119860],"mapped",[97]],[[119861,119861],"mapped",[98]],[[119862,119862],"mapped",[99]],[[119863,119863],"mapped",[100]],[[119864,119864],"mapped",[101]],[[119865,119865],"mapped",[102]],[[119866,119866],"mapped",[103]],[[119867,119867],"mapped",[104]],[[119868,119868],"mapped",[105]],[[119869,119869],"mapped",[106]],[[119870,119870],"mapped",[107]],[[119871,119871],"mapped",[108]],[[119872,119872],"mapped",[109]],[[119873,119873],"mapped",[110]],[[119874,119874],"mapped",[111]],[[119875,119875],"mapped",[112]],[[119876,119876],"mapped",[113]],[[119877,119877],"mapped",[114]],[[119878,119878],"mapped",[115]],[[119879,119879],"mapped",[116]],[[119880,119880],"mapped",[117]],[[119881,119881],"mapped",[118]],[[119882,119882],"mapped",[119]],[[119883,119883],"mapped",[120]],[[119884,119884],"mapped",[121]],[[119885,119885],"mapped",[122]],[[119886,119886],"mapped",[97]],[[119887,119887],"mapped",[98]],[[119888,119888],"mapped",[99]],[[119889,119889],"mapped",[100]],[[119890,119890],"mapped",[101]],[[119891,119891],"mapped",[102]],[[119892,119892],"mapped",[103]],[[119893,119893],"disallowed"],[[119894,119894],"mapped",[105]],[[119895,119895],"mapped",[106]],[[119896,119896],"mapped",[107]],[[119897,119897],"mapped",[108]],[[119898,119898],"mapped",[109]],[[119899,119899],"mapped",[110]],[[119900,119900],"mapped",[111]],[[119901,119901],"mapped",[112]],[[119902,119902],"mapped",[113]],[[119903,119903],"mapped",[114]],[[119904,119904],"mapped",[115]],[[119905,119905],"mapped",[116]],[[119906,119906],"mapped",[117]],[[119907,119907],"mapped",[118]],[[119908,119908],"mapped",[119]],[[119909,119909],"mapped",[120]],[[119910,119910],"mapped",[121]],[[119911,119911],"mapped",[122]],[[119912,119912],"mapped",[97]],[[119913,119913],"mapped",[98]],[[119914,119914],"mapped",[99]],[[119915,119915],"mapped",[100]],[[119916,119916],"mapped",[101]],[[119917,119917],"mapped",[102]],[[119918,119918],"mapped",[103]],[[119919,119919],"mapped",[104]],[[119920,119920],"mapped",[105]],[[119921,119921],"mapped",[106]],[[119922,119922],"mapped",[107]],[[119923,119923],"mapped",[108]],[[119924,119924],"mapped",[109]],[[119925,119925],"mapped",[110]],[[119926,119926],"mapped",[111]],[[119927,119927],"mapped",[112]],[[119928,119928],"mapped",[113]],[[119929,119929],"mapped",[114]],[[119930,119930],"mapped",[115]],[[119931,119931],"mapped",[116]],[[119932,119932],"mapped",[117]],[[119933,119933],"mapped",[118]],[[119934,119934],"mapped",[119]],[[119935,119935],"mapped",[120]],[[119936,119936],"mapped",[121]],[[119937,119937],"mapped",[122]],[[119938,119938],"mapped",[97]],[[119939,119939],"mapped",[98]],[[119940,119940],"mapped",[99]],[[119941,119941],"mapped",[100]],[[119942,119942],"mapped",[101]],[[119943,119943],"mapped",[102]],[[119944,119944],"mapped",[103]],[[119945,119945],"mapped",[104]],[[119946,119946],"mapped",[105]],[[119947,119947],"mapped",[106]],[[119948,119948],"mapped",[107]],[[119949,119949],"mapped",[108]],[[119950,119950],"mapped",[109]],[[119951,119951],"mapped",[110]],[[119952,119952],"mapped",[111]],[[119953,119953],"mapped",[112]],[[119954,119954],"mapped",[113]],[[119955,119955],"mapped",[114]],[[119956,119956],"mapped",[115]],[[119957,119957],"mapped",[116]],[[119958,119958],"mapped",[117]],[[119959,119959],"mapped",[118]],[[119960,119960],"mapped",[119]],[[119961,119961],"mapped",[120]],[[119962,119962],"mapped",[121]],[[119963,119963],"mapped",[122]],[[119964,119964],"mapped",[97]],[[119965,119965],"disallowed"],[[119966,119966],"mapped",[99]],[[119967,119967],"mapped",[100]],[[119968,119969],"disallowed"],[[119970,119970],"mapped",[103]],[[119971,119972],"disallowed"],[[119973,119973],"mapped",[106]],[[119974,119974],"mapped",[107]],[[119975,119976],"disallowed"],[[119977,119977],"mapped",[110]],[[119978,119978],"mapped",[111]],[[119979,119979],"mapped",[112]],[[119980,119980],"mapped",[113]],[[119981,119981],"disallowed"],[[119982,119982],"mapped",[115]],[[119983,119983],"mapped",[116]],[[119984,119984],"mapped",[117]],[[119985,119985],"mapped",[118]],[[119986,119986],"mapped",[119]],[[119987,119987],"mapped",[120]],[[119988,119988],"mapped",[121]],[[119989,119989],"mapped",[122]],[[119990,119990],"mapped",[97]],[[119991,119991],"mapped",[98]],[[119992,119992],"mapped",[99]],[[119993,119993],"mapped",[100]],[[119994,119994],"disallowed"],[[119995,119995],"mapped",[102]],[[119996,119996],"disallowed"],[[119997,119997],"mapped",[104]],[[119998,119998],"mapped",[105]],[[119999,119999],"mapped",[106]],[[120000,120000],"mapped",[107]],[[120001,120001],"mapped",[108]],[[120002,120002],"mapped",[109]],[[120003,120003],"mapped",[110]],[[120004,120004],"disallowed"],[[120005,120005],"mapped",[112]],[[120006,120006],"mapped",[113]],[[120007,120007],"mapped",[114]],[[120008,120008],"mapped",[115]],[[120009,120009],"mapped",[116]],[[120010,120010],"mapped",[117]],[[120011,120011],"mapped",[118]],[[120012,120012],"mapped",[119]],[[120013,120013],"mapped",[120]],[[120014,120014],"mapped",[121]],[[120015,120015],"mapped",[122]],[[120016,120016],"mapped",[97]],[[120017,120017],"mapped",[98]],[[120018,120018],"mapped",[99]],[[120019,120019],"mapped",[100]],[[120020,120020],"mapped",[101]],[[120021,120021],"mapped",[102]],[[120022,120022],"mapped",[103]],[[120023,120023],"mapped",[104]],[[120024,120024],"mapped",[105]],[[120025,120025],"mapped",[106]],[[120026,120026],"mapped",[107]],[[120027,120027],"mapped",[108]],[[120028,120028],"mapped",[109]],[[120029,120029],"mapped",[110]],[[120030,120030],"mapped",[111]],[[120031,120031],"mapped",[112]],[[120032,120032],"mapped",[113]],[[120033,120033],"mapped",[114]],[[120034,120034],"mapped",[115]],[[120035,120035],"mapped",[116]],[[120036,120036],"mapped",[117]],[[120037,120037],"mapped",[118]],[[120038,120038],"mapped",[119]],[[120039,120039],"mapped",[120]],[[120040,120040],"mapped",[121]],[[120041,120041],"mapped",[122]],[[120042,120042],"mapped",[97]],[[120043,120043],"mapped",[98]],[[120044,120044],"mapped",[99]],[[120045,120045],"mapped",[100]],[[120046,120046],"mapped",[101]],[[120047,120047],"mapped",[102]],[[120048,120048],"mapped",[103]],[[120049,120049],"mapped",[104]],[[120050,120050],"mapped",[105]],[[120051,120051],"mapped",[106]],[[120052,120052],"mapped",[107]],[[120053,120053],"mapped",[108]],[[120054,120054],"mapped",[109]],[[120055,120055],"mapped",[110]],[[120056,120056],"mapped",[111]],[[120057,120057],"mapped",[112]],[[120058,120058],"mapped",[113]],[[120059,120059],"mapped",[114]],[[120060,120060],"mapped",[115]],[[120061,120061],"mapped",[116]],[[120062,120062],"mapped",[117]],[[120063,120063],"mapped",[118]],[[120064,120064],"mapped",[119]],[[120065,120065],"mapped",[120]],[[120066,120066],"mapped",[121]],[[120067,120067],"mapped",[122]],[[120068,120068],"mapped",[97]],[[120069,120069],"mapped",[98]],[[120070,120070],"disallowed"],[[120071,120071],"mapped",[100]],[[120072,120072],"mapped",[101]],[[120073,120073],"mapped",[102]],[[120074,120074],"mapped",[103]],[[120075,120076],"disallowed"],[[120077,120077],"mapped",[106]],[[120078,120078],"mapped",[107]],[[120079,120079],"mapped",[108]],[[120080,120080],"mapped",[109]],[[120081,120081],"mapped",[110]],[[120082,120082],"mapped",[111]],[[120083,120083],"mapped",[112]],[[120084,120084],"mapped",[113]],[[120085,120085],"disallowed"],[[120086,120086],"mapped",[115]],[[120087,120087],"mapped",[116]],[[120088,120088],"mapped",[117]],[[120089,120089],"mapped",[118]],[[120090,120090],"mapped",[119]],[[120091,120091],"mapped",[120]],[[120092,120092],"mapped",[121]],[[120093,120093],"disallowed"],[[120094,120094],"mapped",[97]],[[120095,120095],"mapped",[98]],[[120096,120096],"mapped",[99]],[[120097,120097],"mapped",[100]],[[120098,120098],"mapped",[101]],[[120099,120099],"mapped",[102]],[[120100,120100],"mapped",[103]],[[120101,120101],"mapped",[104]],[[120102,120102],"mapped",[105]],[[120103,120103],"mapped",[106]],[[120104,120104],"mapped",[107]],[[120105,120105],"mapped",[108]],[[120106,120106],"mapped",[109]],[[120107,120107],"mapped",[110]],[[120108,120108],"mapped",[111]],[[120109,120109],"mapped",[112]],[[120110,120110],"mapped",[113]],[[120111,120111],"mapped",[114]],[[120112,120112],"mapped",[115]],[[120113,120113],"mapped",[116]],[[120114,120114],"mapped",[117]],[[120115,120115],"mapped",[118]],[[120116,120116],"mapped",[119]],[[120117,120117],"mapped",[120]],[[120118,120118],"mapped",[121]],[[120119,120119],"mapped",[122]],[[120120,120120],"mapped",[97]],[[120121,120121],"mapped",[98]],[[120122,120122],"disallowed"],[[120123,120123],"mapped",[100]],[[120124,120124],"mapped",[101]],[[120125,120125],"mapped",[102]],[[120126,120126],"mapped",[103]],[[120127,120127],"disallowed"],[[120128,120128],"mapped",[105]],[[120129,120129],"mapped",[106]],[[120130,120130],"mapped",[107]],[[120131,120131],"mapped",[108]],[[120132,120132],"mapped",[109]],[[120133,120133],"disallowed"],[[120134,120134],"mapped",[111]],[[120135,120137],"disallowed"],[[120138,120138],"mapped",[115]],[[120139,120139],"mapped",[116]],[[120140,120140],"mapped",[117]],[[120141,120141],"mapped",[118]],[[120142,120142],"mapped",[119]],[[120143,120143],"mapped",[120]],[[120144,120144],"mapped",[121]],[[120145,120145],"disallowed"],[[120146,120146],"mapped",[97]],[[120147,120147],"mapped",[98]],[[120148,120148],"mapped",[99]],[[120149,120149],"mapped",[100]],[[120150,120150],"mapped",[101]],[[120151,120151],"mapped",[102]],[[120152,120152],"mapped",[103]],[[120153,120153],"mapped",[104]],[[120154,120154],"mapped",[105]],[[120155,120155],"mapped",[106]],[[120156,120156],"mapped",[107]],[[120157,120157],"mapped",[108]],[[120158,120158],"mapped",[109]],[[120159,120159],"mapped",[110]],[[120160,120160],"mapped",[111]],[[120161,120161],"mapped",[112]],[[120162,120162],"mapped",[113]],[[120163,120163],"mapped",[114]],[[120164,120164],"mapped",[115]],[[120165,120165],"mapped",[116]],[[120166,120166],"mapped",[117]],[[120167,120167],"mapped",[118]],[[120168,120168],"mapped",[119]],[[120169,120169],"mapped",[120]],[[120170,120170],"mapped",[121]],[[120171,120171],"mapped",[122]],[[120172,120172],"mapped",[97]],[[120173,120173],"mapped",[98]],[[120174,120174],"mapped",[99]],[[120175,120175],"mapped",[100]],[[120176,120176],"mapped",[101]],[[120177,120177],"mapped",[102]],[[120178,120178],"mapped",[103]],[[120179,120179],"mapped",[104]],[[120180,120180],"mapped",[105]],[[120181,120181],"mapped",[106]],[[120182,120182],"mapped",[107]],[[120183,120183],"mapped",[108]],[[120184,120184],"mapped",[109]],[[120185,120185],"mapped",[110]],[[120186,120186],"mapped",[111]],[[120187,120187],"mapped",[112]],[[120188,120188],"mapped",[113]],[[120189,120189],"mapped",[114]],[[120190,120190],"mapped",[115]],[[120191,120191],"mapped",[116]],[[120192,120192],"mapped",[117]],[[120193,120193],"mapped",[118]],[[120194,120194],"mapped",[119]],[[120195,120195],"mapped",[120]],[[120196,120196],"mapped",[121]],[[120197,120197],"mapped",[122]],[[120198,120198],"mapped",[97]],[[120199,120199],"mapped",[98]],[[120200,120200],"mapped",[99]],[[120201,120201],"mapped",[100]],[[120202,120202],"mapped",[101]],[[120203,120203],"mapped",[102]],[[120204,120204],"mapped",[103]],[[120205,120205],"mapped",[104]],[[120206,120206],"mapped",[105]],[[120207,120207],"mapped",[106]],[[120208,120208],"mapped",[107]],[[120209,120209],"mapped",[108]],[[120210,120210],"mapped",[109]],[[120211,120211],"mapped",[110]],[[120212,120212],"mapped",[111]],[[120213,120213],"mapped",[112]],[[120214,120214],"mapped",[113]],[[120215,120215],"mapped",[114]],[[120216,120216],"mapped",[115]],[[120217,120217],"mapped",[116]],[[120218,120218],"mapped",[117]],[[120219,120219],"mapped",[118]],[[120220,120220],"mapped",[119]],[[120221,120221],"mapped",[120]],[[120222,120222],"mapped",[121]],[[120223,120223],"mapped",[122]],[[120224,120224],"mapped",[97]],[[120225,120225],"mapped",[98]],[[120226,120226],"mapped",[99]],[[120227,120227],"mapped",[100]],[[120228,120228],"mapped",[101]],[[120229,120229],"mapped",[102]],[[120230,120230],"mapped",[103]],[[120231,120231],"mapped",[104]],[[120232,120232],"mapped",[105]],[[120233,120233],"mapped",[106]],[[120234,120234],"mapped",[107]],[[120235,120235],"mapped",[108]],[[120236,120236],"mapped",[109]],[[120237,120237],"mapped",[110]],[[120238,120238],"mapped",[111]],[[120239,120239],"mapped",[112]],[[120240,120240],"mapped",[113]],[[120241,120241],"mapped",[114]],[[120242,120242],"mapped",[115]],[[120243,120243],"mapped",[116]],[[120244,120244],"mapped",[117]],[[120245,120245],"mapped",[118]],[[120246,120246],"mapped",[119]],[[120247,120247],"mapped",[120]],[[120248,120248],"mapped",[121]],[[120249,120249],"mapped",[122]],[[120250,120250],"mapped",[97]],[[120251,120251],"mapped",[98]],[[120252,120252],"mapped",[99]],[[120253,120253],"mapped",[100]],[[120254,120254],"mapped",[101]],[[120255,120255],"mapped",[102]],[[120256,120256],"mapped",[103]],[[120257,120257],"mapped",[104]],[[120258,120258],"mapped",[105]],[[120259,120259],"mapped",[106]],[[120260,120260],"mapped",[107]],[[120261,120261],"mapped",[108]],[[120262,120262],"mapped",[109]],[[120263,120263],"mapped",[110]],[[120264,120264],"mapped",[111]],[[120265,120265],"mapped",[112]],[[120266,120266],"mapped",[113]],[[120267,120267],"mapped",[114]],[[120268,120268],"mapped",[115]],[[120269,120269],"mapped",[116]],[[120270,120270],"mapped",[117]],[[120271,120271],"mapped",[118]],[[120272,120272],"mapped",[119]],[[120273,120273],"mapped",[120]],[[120274,120274],"mapped",[121]],[[120275,120275],"mapped",[122]],[[120276,120276],"mapped",[97]],[[120277,120277],"mapped",[98]],[[120278,120278],"mapped",[99]],[[120279,120279],"mapped",[100]],[[120280,120280],"mapped",[101]],[[120281,120281],"mapped",[102]],[[120282,120282],"mapped",[103]],[[120283,120283],"mapped",[104]],[[120284,120284],"mapped",[105]],[[120285,120285],"mapped",[106]],[[120286,120286],"mapped",[107]],[[120287,120287],"mapped",[108]],[[120288,120288],"mapped",[109]],[[120289,120289],"mapped",[110]],[[120290,120290],"mapped",[111]],[[120291,120291],"mapped",[112]],[[120292,120292],"mapped",[113]],[[120293,120293],"mapped",[114]],[[120294,120294],"mapped",[115]],[[120295,120295],"mapped",[116]],[[120296,120296],"mapped",[117]],[[120297,120297],"mapped",[118]],[[120298,120298],"mapped",[119]],[[120299,120299],"mapped",[120]],[[120300,120300],"mapped",[121]],[[120301,120301],"mapped",[122]],[[120302,120302],"mapped",[97]],[[120303,120303],"mapped",[98]],[[120304,120304],"mapped",[99]],[[120305,120305],"mapped",[100]],[[120306,120306],"mapped",[101]],[[120307,120307],"mapped",[102]],[[120308,120308],"mapped",[103]],[[120309,120309],"mapped",[104]],[[120310,120310],"mapped",[105]],[[120311,120311],"mapped",[106]],[[120312,120312],"mapped",[107]],[[120313,120313],"mapped",[108]],[[120314,120314],"mapped",[109]],[[120315,120315],"mapped",[110]],[[120316,120316],"mapped",[111]],[[120317,120317],"mapped",[112]],[[120318,120318],"mapped",[113]],[[120319,120319],"mapped",[114]],[[120320,120320],"mapped",[115]],[[120321,120321],"mapped",[116]],[[120322,120322],"mapped",[117]],[[120323,120323],"mapped",[118]],[[120324,120324],"mapped",[119]],[[120325,120325],"mapped",[120]],[[120326,120326],"mapped",[121]],[[120327,120327],"mapped",[122]],[[120328,120328],"mapped",[97]],[[120329,120329],"mapped",[98]],[[120330,120330],"mapped",[99]],[[120331,120331],"mapped",[100]],[[120332,120332],"mapped",[101]],[[120333,120333],"mapped",[102]],[[120334,120334],"mapped",[103]],[[120335,120335],"mapped",[104]],[[120336,120336],"mapped",[105]],[[120337,120337],"mapped",[106]],[[120338,120338],"mapped",[107]],[[120339,120339],"mapped",[108]],[[120340,120340],"mapped",[109]],[[120341,120341],"mapped",[110]],[[120342,120342],"mapped",[111]],[[120343,120343],"mapped",[112]],[[120344,120344],"mapped",[113]],[[120345,120345],"mapped",[114]],[[120346,120346],"mapped",[115]],[[120347,120347],"mapped",[116]],[[120348,120348],"mapped",[117]],[[120349,120349],"mapped",[118]],[[120350,120350],"mapped",[119]],[[120351,120351],"mapped",[120]],[[120352,120352],"mapped",[121]],[[120353,120353],"mapped",[122]],[[120354,120354],"mapped",[97]],[[120355,120355],"mapped",[98]],[[120356,120356],"mapped",[99]],[[120357,120357],"mapped",[100]],[[120358,120358],"mapped",[101]],[[120359,120359],"mapped",[102]],[[120360,120360],"mapped",[103]],[[120361,120361],"mapped",[104]],[[120362,120362],"mapped",[105]],[[120363,120363],"mapped",[106]],[[120364,120364],"mapped",[107]],[[120365,120365],"mapped",[108]],[[120366,120366],"mapped",[109]],[[120367,120367],"mapped",[110]],[[120368,120368],"mapped",[111]],[[120369,120369],"mapped",[112]],[[120370,120370],"mapped",[113]],[[120371,120371],"mapped",[114]],[[120372,120372],"mapped",[115]],[[120373,120373],"mapped",[116]],[[120374,120374],"mapped",[117]],[[120375,120375],"mapped",[118]],[[120376,120376],"mapped",[119]],[[120377,120377],"mapped",[120]],[[120378,120378],"mapped",[121]],[[120379,120379],"mapped",[122]],[[120380,120380],"mapped",[97]],[[120381,120381],"mapped",[98]],[[120382,120382],"mapped",[99]],[[120383,120383],"mapped",[100]],[[120384,120384],"mapped",[101]],[[120385,120385],"mapped",[102]],[[120386,120386],"mapped",[103]],[[120387,120387],"mapped",[104]],[[120388,120388],"mapped",[105]],[[120389,120389],"mapped",[106]],[[120390,120390],"mapped",[107]],[[120391,120391],"mapped",[108]],[[120392,120392],"mapped",[109]],[[120393,120393],"mapped",[110]],[[120394,120394],"mapped",[111]],[[120395,120395],"mapped",[112]],[[120396,120396],"mapped",[113]],[[120397,120397],"mapped",[114]],[[120398,120398],"mapped",[115]],[[120399,120399],"mapped",[116]],[[120400,120400],"mapped",[117]],[[120401,120401],"mapped",[118]],[[120402,120402],"mapped",[119]],[[120403,120403],"mapped",[120]],[[120404,120404],"mapped",[121]],[[120405,120405],"mapped",[122]],[[120406,120406],"mapped",[97]],[[120407,120407],"mapped",[98]],[[120408,120408],"mapped",[99]],[[120409,120409],"mapped",[100]],[[120410,120410],"mapped",[101]],[[120411,120411],"mapped",[102]],[[120412,120412],"mapped",[103]],[[120413,120413],"mapped",[104]],[[120414,120414],"mapped",[105]],[[120415,120415],"mapped",[106]],[[120416,120416],"mapped",[107]],[[120417,120417],"mapped",[108]],[[120418,120418],"mapped",[109]],[[120419,120419],"mapped",[110]],[[120420,120420],"mapped",[111]],[[120421,120421],"mapped",[112]],[[120422,120422],"mapped",[113]],[[120423,120423],"mapped",[114]],[[120424,120424],"mapped",[115]],[[120425,120425],"mapped",[116]],[[120426,120426],"mapped",[117]],[[120427,120427],"mapped",[118]],[[120428,120428],"mapped",[119]],[[120429,120429],"mapped",[120]],[[120430,120430],"mapped",[121]],[[120431,120431],"mapped",[122]],[[120432,120432],"mapped",[97]],[[120433,120433],"mapped",[98]],[[120434,120434],"mapped",[99]],[[120435,120435],"mapped",[100]],[[120436,120436],"mapped",[101]],[[120437,120437],"mapped",[102]],[[120438,120438],"mapped",[103]],[[120439,120439],"mapped",[104]],[[120440,120440],"mapped",[105]],[[120441,120441],"mapped",[106]],[[120442,120442],"mapped",[107]],[[120443,120443],"mapped",[108]],[[120444,120444],"mapped",[109]],[[120445,120445],"mapped",[110]],[[120446,120446],"mapped",[111]],[[120447,120447],"mapped",[112]],[[120448,120448],"mapped",[113]],[[120449,120449],"mapped",[114]],[[120450,120450],"mapped",[115]],[[120451,120451],"mapped",[116]],[[120452,120452],"mapped",[117]],[[120453,120453],"mapped",[118]],[[120454,120454],"mapped",[119]],[[120455,120455],"mapped",[120]],[[120456,120456],"mapped",[121]],[[120457,120457],"mapped",[122]],[[120458,120458],"mapped",[97]],[[120459,120459],"mapped",[98]],[[120460,120460],"mapped",[99]],[[120461,120461],"mapped",[100]],[[120462,120462],"mapped",[101]],[[120463,120463],"mapped",[102]],[[120464,120464],"mapped",[103]],[[120465,120465],"mapped",[104]],[[120466,120466],"mapped",[105]],[[120467,120467],"mapped",[106]],[[120468,120468],"mapped",[107]],[[120469,120469],"mapped",[108]],[[120470,120470],"mapped",[109]],[[120471,120471],"mapped",[110]],[[120472,120472],"mapped",[111]],[[120473,120473],"mapped",[112]],[[120474,120474],"mapped",[113]],[[120475,120475],"mapped",[114]],[[120476,120476],"mapped",[115]],[[120477,120477],"mapped",[116]],[[120478,120478],"mapped",[117]],[[120479,120479],"mapped",[118]],[[120480,120480],"mapped",[119]],[[120481,120481],"mapped",[120]],[[120482,120482],"mapped",[121]],[[120483,120483],"mapped",[122]],[[120484,120484],"mapped",[305]],[[120485,120485],"mapped",[567]],[[120486,120487],"disallowed"],[[120488,120488],"mapped",[945]],[[120489,120489],"mapped",[946]],[[120490,120490],"mapped",[947]],[[120491,120491],"mapped",[948]],[[120492,120492],"mapped",[949]],[[120493,120493],"mapped",[950]],[[120494,120494],"mapped",[951]],[[120495,120495],"mapped",[952]],[[120496,120496],"mapped",[953]],[[120497,120497],"mapped",[954]],[[120498,120498],"mapped",[955]],[[120499,120499],"mapped",[956]],[[120500,120500],"mapped",[957]],[[120501,120501],"mapped",[958]],[[120502,120502],"mapped",[959]],[[120503,120503],"mapped",[960]],[[120504,120504],"mapped",[961]],[[120505,120505],"mapped",[952]],[[120506,120506],"mapped",[963]],[[120507,120507],"mapped",[964]],[[120508,120508],"mapped",[965]],[[120509,120509],"mapped",[966]],[[120510,120510],"mapped",[967]],[[120511,120511],"mapped",[968]],[[120512,120512],"mapped",[969]],[[120513,120513],"mapped",[8711]],[[120514,120514],"mapped",[945]],[[120515,120515],"mapped",[946]],[[120516,120516],"mapped",[947]],[[120517,120517],"mapped",[948]],[[120518,120518],"mapped",[949]],[[120519,120519],"mapped",[950]],[[120520,120520],"mapped",[951]],[[120521,120521],"mapped",[952]],[[120522,120522],"mapped",[953]],[[120523,120523],"mapped",[954]],[[120524,120524],"mapped",[955]],[[120525,120525],"mapped",[956]],[[120526,120526],"mapped",[957]],[[120527,120527],"mapped",[958]],[[120528,120528],"mapped",[959]],[[120529,120529],"mapped",[960]],[[120530,120530],"mapped",[961]],[[120531,120532],"mapped",[963]],[[120533,120533],"mapped",[964]],[[120534,120534],"mapped",[965]],[[120535,120535],"mapped",[966]],[[120536,120536],"mapped",[967]],[[120537,120537],"mapped",[968]],[[120538,120538],"mapped",[969]],[[120539,120539],"mapped",[8706]],[[120540,120540],"mapped",[949]],[[120541,120541],"mapped",[952]],[[120542,120542],"mapped",[954]],[[120543,120543],"mapped",[966]],[[120544,120544],"mapped",[961]],[[120545,120545],"mapped",[960]],[[120546,120546],"mapped",[945]],[[120547,120547],"mapped",[946]],[[120548,120548],"mapped",[947]],[[120549,120549],"mapped",[948]],[[120550,120550],"mapped",[949]],[[120551,120551],"mapped",[950]],[[120552,120552],"mapped",[951]],[[120553,120553],"mapped",[952]],[[120554,120554],"mapped",[953]],[[120555,120555],"mapped",[954]],[[120556,120556],"mapped",[955]],[[120557,120557],"mapped",[956]],[[120558,120558],"mapped",[957]],[[120559,120559],"mapped",[958]],[[120560,120560],"mapped",[959]],[[120561,120561],"mapped",[960]],[[120562,120562],"mapped",[961]],[[120563,120563],"mapped",[952]],[[120564,120564],"mapped",[963]],[[120565,120565],"mapped",[964]],[[120566,120566],"mapped",[965]],[[120567,120567],"mapped",[966]],[[120568,120568],"mapped",[967]],[[120569,120569],"mapped",[968]],[[120570,120570],"mapped",[969]],[[120571,120571],"mapped",[8711]],[[120572,120572],"mapped",[945]],[[120573,120573],"mapped",[946]],[[120574,120574],"mapped",[947]],[[120575,120575],"mapped",[948]],[[120576,120576],"mapped",[949]],[[120577,120577],"mapped",[950]],[[120578,120578],"mapped",[951]],[[120579,120579],"mapped",[952]],[[120580,120580],"mapped",[953]],[[120581,120581],"mapped",[954]],[[120582,120582],"mapped",[955]],[[120583,120583],"mapped",[956]],[[120584,120584],"mapped",[957]],[[120585,120585],"mapped",[958]],[[120586,120586],"mapped",[959]],[[120587,120587],"mapped",[960]],[[120588,120588],"mapped",[961]],[[120589,120590],"mapped",[963]],[[120591,120591],"mapped",[964]],[[120592,120592],"mapped",[965]],[[120593,120593],"mapped",[966]],[[120594,120594],"mapped",[967]],[[120595,120595],"mapped",[968]],[[120596,120596],"mapped",[969]],[[120597,120597],"mapped",[8706]],[[120598,120598],"mapped",[949]],[[120599,120599],"mapped",[952]],[[120600,120600],"mapped",[954]],[[120601,120601],"mapped",[966]],[[120602,120602],"mapped",[961]],[[120603,120603],"mapped",[960]],[[120604,120604],"mapped",[945]],[[120605,120605],"mapped",[946]],[[120606,120606],"mapped",[947]],[[120607,120607],"mapped",[948]],[[120608,120608],"mapped",[949]],[[120609,120609],"mapped",[950]],[[120610,120610],"mapped",[951]],[[120611,120611],"mapped",[952]],[[120612,120612],"mapped",[953]],[[120613,120613],"mapped",[954]],[[120614,120614],"mapped",[955]],[[120615,120615],"mapped",[956]],[[120616,120616],"mapped",[957]],[[120617,120617],"mapped",[958]],[[120618,120618],"mapped",[959]],[[120619,120619],"mapped",[960]],[[120620,120620],"mapped",[961]],[[120621,120621],"mapped",[952]],[[120622,120622],"mapped",[963]],[[120623,120623],"mapped",[964]],[[120624,120624],"mapped",[965]],[[120625,120625],"mapped",[966]],[[120626,120626],"mapped",[967]],[[120627,120627],"mapped",[968]],[[120628,120628],"mapped",[969]],[[120629,120629],"mapped",[8711]],[[120630,120630],"mapped",[945]],[[120631,120631],"mapped",[946]],[[120632,120632],"mapped",[947]],[[120633,120633],"mapped",[948]],[[120634,120634],"mapped",[949]],[[120635,120635],"mapped",[950]],[[120636,120636],"mapped",[951]],[[120637,120637],"mapped",[952]],[[120638,120638],"mapped",[953]],[[120639,120639],"mapped",[954]],[[120640,120640],"mapped",[955]],[[120641,120641],"mapped",[956]],[[120642,120642],"mapped",[957]],[[120643,120643],"mapped",[958]],[[120644,120644],"mapped",[959]],[[120645,120645],"mapped",[960]],[[120646,120646],"mapped",[961]],[[120647,120648],"mapped",[963]],[[120649,120649],"mapped",[964]],[[120650,120650],"mapped",[965]],[[120651,120651],"mapped",[966]],[[120652,120652],"mapped",[967]],[[120653,120653],"mapped",[968]],[[120654,120654],"mapped",[969]],[[120655,120655],"mapped",[8706]],[[120656,120656],"mapped",[949]],[[120657,120657],"mapped",[952]],[[120658,120658],"mapped",[954]],[[120659,120659],"mapped",[966]],[[120660,120660],"mapped",[961]],[[120661,120661],"mapped",[960]],[[120662,120662],"mapped",[945]],[[120663,120663],"mapped",[946]],[[120664,120664],"mapped",[947]],[[120665,120665],"mapped",[948]],[[120666,120666],"mapped",[949]],[[120667,120667],"mapped",[950]],[[120668,120668],"mapped",[951]],[[120669,120669],"mapped",[952]],[[120670,120670],"mapped",[953]],[[120671,120671],"mapped",[954]],[[120672,120672],"mapped",[955]],[[120673,120673],"mapped",[956]],[[120674,120674],"mapped",[957]],[[120675,120675],"mapped",[958]],[[120676,120676],"mapped",[959]],[[120677,120677],"mapped",[960]],[[120678,120678],"mapped",[961]],[[120679,120679],"mapped",[952]],[[120680,120680],"mapped",[963]],[[120681,120681],"mapped",[964]],[[120682,120682],"mapped",[965]],[[120683,120683],"mapped",[966]],[[120684,120684],"mapped",[967]],[[120685,120685],"mapped",[968]],[[120686,120686],"mapped",[969]],[[120687,120687],"mapped",[8711]],[[120688,120688],"mapped",[945]],[[120689,120689],"mapped",[946]],[[120690,120690],"mapped",[947]],[[120691,120691],"mapped",[948]],[[120692,120692],"mapped",[949]],[[120693,120693],"mapped",[950]],[[120694,120694],"mapped",[951]],[[120695,120695],"mapped",[952]],[[120696,120696],"mapped",[953]],[[120697,120697],"mapped",[954]],[[120698,120698],"mapped",[955]],[[120699,120699],"mapped",[956]],[[120700,120700],"mapped",[957]],[[120701,120701],"mapped",[958]],[[120702,120702],"mapped",[959]],[[120703,120703],"mapped",[960]],[[120704,120704],"mapped",[961]],[[120705,120706],"mapped",[963]],[[120707,120707],"mapped",[964]],[[120708,120708],"mapped",[965]],[[120709,120709],"mapped",[966]],[[120710,120710],"mapped",[967]],[[120711,120711],"mapped",[968]],[[120712,120712],"mapped",[969]],[[120713,120713],"mapped",[8706]],[[120714,120714],"mapped",[949]],[[120715,120715],"mapped",[952]],[[120716,120716],"mapped",[954]],[[120717,120717],"mapped",[966]],[[120718,120718],"mapped",[961]],[[120719,120719],"mapped",[960]],[[120720,120720],"mapped",[945]],[[120721,120721],"mapped",[946]],[[120722,120722],"mapped",[947]],[[120723,120723],"mapped",[948]],[[120724,120724],"mapped",[949]],[[120725,120725],"mapped",[950]],[[120726,120726],"mapped",[951]],[[120727,120727],"mapped",[952]],[[120728,120728],"mapped",[953]],[[120729,120729],"mapped",[954]],[[120730,120730],"mapped",[955]],[[120731,120731],"mapped",[956]],[[120732,120732],"mapped",[957]],[[120733,120733],"mapped",[958]],[[120734,120734],"mapped",[959]],[[120735,120735],"mapped",[960]],[[120736,120736],"mapped",[961]],[[120737,120737],"mapped",[952]],[[120738,120738],"mapped",[963]],[[120739,120739],"mapped",[964]],[[120740,120740],"mapped",[965]],[[120741,120741],"mapped",[966]],[[120742,120742],"mapped",[967]],[[120743,120743],"mapped",[968]],[[120744,120744],"mapped",[969]],[[120745,120745],"mapped",[8711]],[[120746,120746],"mapped",[945]],[[120747,120747],"mapped",[946]],[[120748,120748],"mapped",[947]],[[120749,120749],"mapped",[948]],[[120750,120750],"mapped",[949]],[[120751,120751],"mapped",[950]],[[120752,120752],"mapped",[951]],[[120753,120753],"mapped",[952]],[[120754,120754],"mapped",[953]],[[120755,120755],"mapped",[954]],[[120756,120756],"mapped",[955]],[[120757,120757],"mapped",[956]],[[120758,120758],"mapped",[957]],[[120759,120759],"mapped",[958]],[[120760,120760],"mapped",[959]],[[120761,120761],"mapped",[960]],[[120762,120762],"mapped",[961]],[[120763,120764],"mapped",[963]],[[120765,120765],"mapped",[964]],[[120766,120766],"mapped",[965]],[[120767,120767],"mapped",[966]],[[120768,120768],"mapped",[967]],[[120769,120769],"mapped",[968]],[[120770,120770],"mapped",[969]],[[120771,120771],"mapped",[8706]],[[120772,120772],"mapped",[949]],[[120773,120773],"mapped",[952]],[[120774,120774],"mapped",[954]],[[120775,120775],"mapped",[966]],[[120776,120776],"mapped",[961]],[[120777,120777],"mapped",[960]],[[120778,120779],"mapped",[989]],[[120780,120781],"disallowed"],[[120782,120782],"mapped",[48]],[[120783,120783],"mapped",[49]],[[120784,120784],"mapped",[50]],[[120785,120785],"mapped",[51]],[[120786,120786],"mapped",[52]],[[120787,120787],"mapped",[53]],[[120788,120788],"mapped",[54]],[[120789,120789],"mapped",[55]],[[120790,120790],"mapped",[56]],[[120791,120791],"mapped",[57]],[[120792,120792],"mapped",[48]],[[120793,120793],"mapped",[49]],[[120794,120794],"mapped",[50]],[[120795,120795],"mapped",[51]],[[120796,120796],"mapped",[52]],[[120797,120797],"mapped",[53]],[[120798,120798],"mapped",[54]],[[120799,120799],"mapped",[55]],[[120800,120800],"mapped",[56]],[[120801,120801],"mapped",[57]],[[120802,120802],"mapped",[48]],[[120803,120803],"mapped",[49]],[[120804,120804],"mapped",[50]],[[120805,120805],"mapped",[51]],[[120806,120806],"mapped",[52]],[[120807,120807],"mapped",[53]],[[120808,120808],"mapped",[54]],[[120809,120809],"mapped",[55]],[[120810,120810],"mapped",[56]],[[120811,120811],"mapped",[57]],[[120812,120812],"mapped",[48]],[[120813,120813],"mapped",[49]],[[120814,120814],"mapped",[50]],[[120815,120815],"mapped",[51]],[[120816,120816],"mapped",[52]],[[120817,120817],"mapped",[53]],[[120818,120818],"mapped",[54]],[[120819,120819],"mapped",[55]],[[120820,120820],"mapped",[56]],[[120821,120821],"mapped",[57]],[[120822,120822],"mapped",[48]],[[120823,120823],"mapped",[49]],[[120824,120824],"mapped",[50]],[[120825,120825],"mapped",[51]],[[120826,120826],"mapped",[52]],[[120827,120827],"mapped",[53]],[[120828,120828],"mapped",[54]],[[120829,120829],"mapped",[55]],[[120830,120830],"mapped",[56]],[[120831,120831],"mapped",[57]],[[120832,121343],"valid",[],"NV8"],[[121344,121398],"valid"],[[121399,121402],"valid",[],"NV8"],[[121403,121452],"valid"],[[121453,121460],"valid",[],"NV8"],[[121461,121461],"valid"],[[121462,121475],"valid",[],"NV8"],[[121476,121476],"valid"],[[121477,121483],"valid",[],"NV8"],[[121484,121498],"disallowed"],[[121499,121503],"valid"],[[121504,121504],"disallowed"],[[121505,121519],"valid"],[[121520,124927],"disallowed"],[[124928,125124],"valid"],[[125125,125126],"disallowed"],[[125127,125135],"valid",[],"NV8"],[[125136,125142],"valid"],[[125143,126463],"disallowed"],[[126464,126464],"mapped",[1575]],[[126465,126465],"mapped",[1576]],[[126466,126466],"mapped",[1580]],[[126467,126467],"mapped",[1583]],[[126468,126468],"disallowed"],[[126469,126469],"mapped",[1608]],[[126470,126470],"mapped",[1586]],[[126471,126471],"mapped",[1581]],[[126472,126472],"mapped",[1591]],[[126473,126473],"mapped",[1610]],[[126474,126474],"mapped",[1603]],[[126475,126475],"mapped",[1604]],[[126476,126476],"mapped",[1605]],[[126477,126477],"mapped",[1606]],[[126478,126478],"mapped",[1587]],[[126479,126479],"mapped",[1593]],[[126480,126480],"mapped",[1601]],[[126481,126481],"mapped",[1589]],[[126482,126482],"mapped",[1602]],[[126483,126483],"mapped",[1585]],[[126484,126484],"mapped",[1588]],[[126485,126485],"mapped",[1578]],[[126486,126486],"mapped",[1579]],[[126487,126487],"mapped",[1582]],[[126488,126488],"mapped",[1584]],[[126489,126489],"mapped",[1590]],[[126490,126490],"mapped",[1592]],[[126491,126491],"mapped",[1594]],[[126492,126492],"mapped",[1646]],[[126493,126493],"mapped",[1722]],[[126494,126494],"mapped",[1697]],[[126495,126495],"mapped",[1647]],[[126496,126496],"disallowed"],[[126497,126497],"mapped",[1576]],[[126498,126498],"mapped",[1580]],[[126499,126499],"disallowed"],[[126500,126500],"mapped",[1607]],[[126501,126502],"disallowed"],[[126503,126503],"mapped",[1581]],[[126504,126504],"disallowed"],[[126505,126505],"mapped",[1610]],[[126506,126506],"mapped",[1603]],[[126507,126507],"mapped",[1604]],[[126508,126508],"mapped",[1605]],[[126509,126509],"mapped",[1606]],[[126510,126510],"mapped",[1587]],[[126511,126511],"mapped",[1593]],[[126512,126512],"mapped",[1601]],[[126513,126513],"mapped",[1589]],[[126514,126514],"mapped",[1602]],[[126515,126515],"disallowed"],[[126516,126516],"mapped",[1588]],[[126517,126517],"mapped",[1578]],[[126518,126518],"mapped",[1579]],[[126519,126519],"mapped",[1582]],[[126520,126520],"disallowed"],[[126521,126521],"mapped",[1590]],[[126522,126522],"disallowed"],[[126523,126523],"mapped",[1594]],[[126524,126529],"disallowed"],[[126530,126530],"mapped",[1580]],[[126531,126534],"disallowed"],[[126535,126535],"mapped",[1581]],[[126536,126536],"disallowed"],[[126537,126537],"mapped",[1610]],[[126538,126538],"disallowed"],[[126539,126539],"mapped",[1604]],[[126540,126540],"disallowed"],[[126541,126541],"mapped",[1606]],[[126542,126542],"mapped",[1587]],[[126543,126543],"mapped",[1593]],[[126544,126544],"disallowed"],[[126545,126545],"mapped",[1589]],[[126546,126546],"mapped",[1602]],[[126547,126547],"disallowed"],[[126548,126548],"mapped",[1588]],[[126549,126550],"disallowed"],[[126551,126551],"mapped",[1582]],[[126552,126552],"disallowed"],[[126553,126553],"mapped",[1590]],[[126554,126554],"disallowed"],[[126555,126555],"mapped",[1594]],[[126556,126556],"disallowed"],[[126557,126557],"mapped",[1722]],[[126558,126558],"disallowed"],[[126559,126559],"mapped",[1647]],[[126560,126560],"disallowed"],[[126561,126561],"mapped",[1576]],[[126562,126562],"mapped",[1580]],[[126563,126563],"disallowed"],[[126564,126564],"mapped",[1607]],[[126565,126566],"disallowed"],[[126567,126567],"mapped",[1581]],[[126568,126568],"mapped",[1591]],[[126569,126569],"mapped",[1610]],[[126570,126570],"mapped",[1603]],[[126571,126571],"disallowed"],[[126572,126572],"mapped",[1605]],[[126573,126573],"mapped",[1606]],[[126574,126574],"mapped",[1587]],[[126575,126575],"mapped",[1593]],[[126576,126576],"mapped",[1601]],[[126577,126577],"mapped",[1589]],[[126578,126578],"mapped",[1602]],[[126579,126579],"disallowed"],[[126580,126580],"mapped",[1588]],[[126581,126581],"mapped",[1578]],[[126582,126582],"mapped",[1579]],[[126583,126583],"mapped",[1582]],[[126584,126584],"disallowed"],[[126585,126585],"mapped",[1590]],[[126586,126586],"mapped",[1592]],[[126587,126587],"mapped",[1594]],[[126588,126588],"mapped",[1646]],[[126589,126589],"disallowed"],[[126590,126590],"mapped",[1697]],[[126591,126591],"disallowed"],[[126592,126592],"mapped",[1575]],[[126593,126593],"mapped",[1576]],[[126594,126594],"mapped",[1580]],[[126595,126595],"mapped",[1583]],[[126596,126596],"mapped",[1607]],[[126597,126597],"mapped",[1608]],[[126598,126598],"mapped",[1586]],[[126599,126599],"mapped",[1581]],[[126600,126600],"mapped",[1591]],[[126601,126601],"mapped",[1610]],[[126602,126602],"disallowed"],[[126603,126603],"mapped",[1604]],[[126604,126604],"mapped",[1605]],[[126605,126605],"mapped",[1606]],[[126606,126606],"mapped",[1587]],[[126607,126607],"mapped",[1593]],[[126608,126608],"mapped",[1601]],[[126609,126609],"mapped",[1589]],[[126610,126610],"mapped",[1602]],[[126611,126611],"mapped",[1585]],[[126612,126612],"mapped",[1588]],[[126613,126613],"mapped",[1578]],[[126614,126614],"mapped",[1579]],[[126615,126615],"mapped",[1582]],[[126616,126616],"mapped",[1584]],[[126617,126617],"mapped",[1590]],[[126618,126618],"mapped",[1592]],[[126619,126619],"mapped",[1594]],[[126620,126624],"disallowed"],[[126625,126625],"mapped",[1576]],[[126626,126626],"mapped",[1580]],[[126627,126627],"mapped",[1583]],[[126628,126628],"disallowed"],[[126629,126629],"mapped",[1608]],[[126630,126630],"mapped",[1586]],[[126631,126631],"mapped",[1581]],[[126632,126632],"mapped",[1591]],[[126633,126633],"mapped",[1610]],[[126634,126634],"disallowed"],[[126635,126635],"mapped",[1604]],[[126636,126636],"mapped",[1605]],[[126637,126637],"mapped",[1606]],[[126638,126638],"mapped",[1587]],[[126639,126639],"mapped",[1593]],[[126640,126640],"mapped",[1601]],[[126641,126641],"mapped",[1589]],[[126642,126642],"mapped",[1602]],[[126643,126643],"mapped",[1585]],[[126644,126644],"mapped",[1588]],[[126645,126645],"mapped",[1578]],[[126646,126646],"mapped",[1579]],[[126647,126647],"mapped",[1582]],[[126648,126648],"mapped",[1584]],[[126649,126649],"mapped",[1590]],[[126650,126650],"mapped",[1592]],[[126651,126651],"mapped",[1594]],[[126652,126703],"disallowed"],[[126704,126705],"valid",[],"NV8"],[[126706,126975],"disallowed"],[[126976,127019],"valid",[],"NV8"],[[127020,127023],"disallowed"],[[127024,127123],"valid",[],"NV8"],[[127124,127135],"disallowed"],[[127136,127150],"valid",[],"NV8"],[[127151,127152],"disallowed"],[[127153,127166],"valid",[],"NV8"],[[127167,127167],"valid",[],"NV8"],[[127168,127168],"disallowed"],[[127169,127183],"valid",[],"NV8"],[[127184,127184],"disallowed"],[[127185,127199],"valid",[],"NV8"],[[127200,127221],"valid",[],"NV8"],[[127222,127231],"disallowed"],[[127232,127232],"disallowed"],[[127233,127233],"disallowed_STD3_mapped",[48,44]],[[127234,127234],"disallowed_STD3_mapped",[49,44]],[[127235,127235],"disallowed_STD3_mapped",[50,44]],[[127236,127236],"disallowed_STD3_mapped",[51,44]],[[127237,127237],"disallowed_STD3_mapped",[52,44]],[[127238,127238],"disallowed_STD3_mapped",[53,44]],[[127239,127239],"disallowed_STD3_mapped",[54,44]],[[127240,127240],"disallowed_STD3_mapped",[55,44]],[[127241,127241],"disallowed_STD3_mapped",[56,44]],[[127242,127242],"disallowed_STD3_mapped",[57,44]],[[127243,127244],"valid",[],"NV8"],[[127245,127247],"disallowed"],[[127248,127248],"disallowed_STD3_mapped",[40,97,41]],[[127249,127249],"disallowed_STD3_mapped",[40,98,41]],[[127250,127250],"disallowed_STD3_mapped",[40,99,41]],[[127251,127251],"disallowed_STD3_mapped",[40,100,41]],[[127252,127252],"disallowed_STD3_mapped",[40,101,41]],[[127253,127253],"disallowed_STD3_mapped",[40,102,41]],[[127254,127254],"disallowed_STD3_mapped",[40,103,41]],[[127255,127255],"disallowed_STD3_mapped",[40,104,41]],[[127256,127256],"disallowed_STD3_mapped",[40,105,41]],[[127257,127257],"disallowed_STD3_mapped",[40,106,41]],[[127258,127258],"disallowed_STD3_mapped",[40,107,41]],[[127259,127259],"disallowed_STD3_mapped",[40,108,41]],[[127260,127260],"disallowed_STD3_mapped",[40,109,41]],[[127261,127261],"disallowed_STD3_mapped",[40,110,41]],[[127262,127262],"disallowed_STD3_mapped",[40,111,41]],[[127263,127263],"disallowed_STD3_mapped",[40,112,41]],[[127264,127264],"disallowed_STD3_mapped",[40,113,41]],[[127265,127265],"disallowed_STD3_mapped",[40,114,41]],[[127266,127266],"disallowed_STD3_mapped",[40,115,41]],[[127267,127267],"disallowed_STD3_mapped",[40,116,41]],[[127268,127268],"disallowed_STD3_mapped",[40,117,41]],[[127269,127269],"disallowed_STD3_mapped",[40,118,41]],[[127270,127270],"disallowed_STD3_mapped",[40,119,41]],[[127271,127271],"disallowed_STD3_mapped",[40,120,41]],[[127272,127272],"disallowed_STD3_mapped",[40,121,41]],[[127273,127273],"disallowed_STD3_mapped",[40,122,41]],[[127274,127274],"mapped",[12308,115,12309]],[[127275,127275],"mapped",[99]],[[127276,127276],"mapped",[114]],[[127277,127277],"mapped",[99,100]],[[127278,127278],"mapped",[119,122]],[[127279,127279],"disallowed"],[[127280,127280],"mapped",[97]],[[127281,127281],"mapped",[98]],[[127282,127282],"mapped",[99]],[[127283,127283],"mapped",[100]],[[127284,127284],"mapped",[101]],[[127285,127285],"mapped",[102]],[[127286,127286],"mapped",[103]],[[127287,127287],"mapped",[104]],[[127288,127288],"mapped",[105]],[[127289,127289],"mapped",[106]],[[127290,127290],"mapped",[107]],[[127291,127291],"mapped",[108]],[[127292,127292],"mapped",[109]],[[127293,127293],"mapped",[110]],[[127294,127294],"mapped",[111]],[[127295,127295],"mapped",[112]],[[127296,127296],"mapped",[113]],[[127297,127297],"mapped",[114]],[[127298,127298],"mapped",[115]],[[127299,127299],"mapped",[116]],[[127300,127300],"mapped",[117]],[[127301,127301],"mapped",[118]],[[127302,127302],"mapped",[119]],[[127303,127303],"mapped",[120]],[[127304,127304],"mapped",[121]],[[127305,127305],"mapped",[122]],[[127306,127306],"mapped",[104,118]],[[127307,127307],"mapped",[109,118]],[[127308,127308],"mapped",[115,100]],[[127309,127309],"mapped",[115,115]],[[127310,127310],"mapped",[112,112,118]],[[127311,127311],"mapped",[119,99]],[[127312,127318],"valid",[],"NV8"],[[127319,127319],"valid",[],"NV8"],[[127320,127326],"valid",[],"NV8"],[[127327,127327],"valid",[],"NV8"],[[127328,127337],"valid",[],"NV8"],[[127338,127338],"mapped",[109,99]],[[127339,127339],"mapped",[109,100]],[[127340,127343],"disallowed"],[[127344,127352],"valid",[],"NV8"],[[127353,127353],"valid",[],"NV8"],[[127354,127354],"valid",[],"NV8"],[[127355,127356],"valid",[],"NV8"],[[127357,127358],"valid",[],"NV8"],[[127359,127359],"valid",[],"NV8"],[[127360,127369],"valid",[],"NV8"],[[127370,127373],"valid",[],"NV8"],[[127374,127375],"valid",[],"NV8"],[[127376,127376],"mapped",[100,106]],[[127377,127386],"valid",[],"NV8"],[[127387,127461],"disallowed"],[[127462,127487],"valid",[],"NV8"],[[127488,127488],"mapped",[12411,12363]],[[127489,127489],"mapped",[12467,12467]],[[127490,127490],"mapped",[12469]],[[127491,127503],"disallowed"],[[127504,127504],"mapped",[25163]],[[127505,127505],"mapped",[23383]],[[127506,127506],"mapped",[21452]],[[127507,127507],"mapped",[12487]],[[127508,127508],"mapped",[20108]],[[127509,127509],"mapped",[22810]],[[127510,127510],"mapped",[35299]],[[127511,127511],"mapped",[22825]],[[127512,127512],"mapped",[20132]],[[127513,127513],"mapped",[26144]],[[127514,127514],"mapped",[28961]],[[127515,127515],"mapped",[26009]],[[127516,127516],"mapped",[21069]],[[127517,127517],"mapped",[24460]],[[127518,127518],"mapped",[20877]],[[127519,127519],"mapped",[26032]],[[127520,127520],"mapped",[21021]],[[127521,127521],"mapped",[32066]],[[127522,127522],"mapped",[29983]],[[127523,127523],"mapped",[36009]],[[127524,127524],"mapped",[22768]],[[127525,127525],"mapped",[21561]],[[127526,127526],"mapped",[28436]],[[127527,127527],"mapped",[25237]],[[127528,127528],"mapped",[25429]],[[127529,127529],"mapped",[19968]],[[127530,127530],"mapped",[19977]],[[127531,127531],"mapped",[36938]],[[127532,127532],"mapped",[24038]],[[127533,127533],"mapped",[20013]],[[127534,127534],"mapped",[21491]],[[127535,127535],"mapped",[25351]],[[127536,127536],"mapped",[36208]],[[127537,127537],"mapped",[25171]],[[127538,127538],"mapped",[31105]],[[127539,127539],"mapped",[31354]],[[127540,127540],"mapped",[21512]],[[127541,127541],"mapped",[28288]],[[127542,127542],"mapped",[26377]],[[127543,127543],"mapped",[26376]],[[127544,127544],"mapped",[30003]],[[127545,127545],"mapped",[21106]],[[127546,127546],"mapped",[21942]],[[127547,127551],"disallowed"],[[127552,127552],"mapped",[12308,26412,12309]],[[127553,127553],"mapped",[12308,19977,12309]],[[127554,127554],"mapped",[12308,20108,12309]],[[127555,127555],"mapped",[12308,23433,12309]],[[127556,127556],"mapped",[12308,28857,12309]],[[127557,127557],"mapped",[12308,25171,12309]],[[127558,127558],"mapped",[12308,30423,12309]],[[127559,127559],"mapped",[12308,21213,12309]],[[127560,127560],"mapped",[12308,25943,12309]],[[127561,127567],"disallowed"],[[127568,127568],"mapped",[24471]],[[127569,127569],"mapped",[21487]],[[127570,127743],"disallowed"],[[127744,127776],"valid",[],"NV8"],[[127777,127788],"valid",[],"NV8"],[[127789,127791],"valid",[],"NV8"],[[127792,127797],"valid",[],"NV8"],[[127798,127798],"valid",[],"NV8"],[[127799,127868],"valid",[],"NV8"],[[127869,127869],"valid",[],"NV8"],[[127870,127871],"valid",[],"NV8"],[[127872,127891],"valid",[],"NV8"],[[127892,127903],"valid",[],"NV8"],[[127904,127940],"valid",[],"NV8"],[[127941,127941],"valid",[],"NV8"],[[127942,127946],"valid",[],"NV8"],[[127947,127950],"valid",[],"NV8"],[[127951,127955],"valid",[],"NV8"],[[127956,127967],"valid",[],"NV8"],[[127968,127984],"valid",[],"NV8"],[[127985,127991],"valid",[],"NV8"],[[127992,127999],"valid",[],"NV8"],[[128000,128062],"valid",[],"NV8"],[[128063,128063],"valid",[],"NV8"],[[128064,128064],"valid",[],"NV8"],[[128065,128065],"valid",[],"NV8"],[[128066,128247],"valid",[],"NV8"],[[128248,128248],"valid",[],"NV8"],[[128249,128252],"valid",[],"NV8"],[[128253,128254],"valid",[],"NV8"],[[128255,128255],"valid",[],"NV8"],[[128256,128317],"valid",[],"NV8"],[[128318,128319],"valid",[],"NV8"],[[128320,128323],"valid",[],"NV8"],[[128324,128330],"valid",[],"NV8"],[[128331,128335],"valid",[],"NV8"],[[128336,128359],"valid",[],"NV8"],[[128360,128377],"valid",[],"NV8"],[[128378,128378],"disallowed"],[[128379,128419],"valid",[],"NV8"],[[128420,128420],"disallowed"],[[128421,128506],"valid",[],"NV8"],[[128507,128511],"valid",[],"NV8"],[[128512,128512],"valid",[],"NV8"],[[128513,128528],"valid",[],"NV8"],[[128529,128529],"valid",[],"NV8"],[[128530,128532],"valid",[],"NV8"],[[128533,128533],"valid",[],"NV8"],[[128534,128534],"valid",[],"NV8"],[[128535,128535],"valid",[],"NV8"],[[128536,128536],"valid",[],"NV8"],[[128537,128537],"valid",[],"NV8"],[[128538,128538],"valid",[],"NV8"],[[128539,128539],"valid",[],"NV8"],[[128540,128542],"valid",[],"NV8"],[[128543,128543],"valid",[],"NV8"],[[128544,128549],"valid",[],"NV8"],[[128550,128551],"valid",[],"NV8"],[[128552,128555],"valid",[],"NV8"],[[128556,128556],"valid",[],"NV8"],[[128557,128557],"valid",[],"NV8"],[[128558,128559],"valid",[],"NV8"],[[128560,128563],"valid",[],"NV8"],[[128564,128564],"valid",[],"NV8"],[[128565,128576],"valid",[],"NV8"],[[128577,128578],"valid",[],"NV8"],[[128579,128580],"valid",[],"NV8"],[[128581,128591],"valid",[],"NV8"],[[128592,128639],"valid",[],"NV8"],[[128640,128709],"valid",[],"NV8"],[[128710,128719],"valid",[],"NV8"],[[128720,128720],"valid",[],"NV8"],[[128721,128735],"disallowed"],[[128736,128748],"valid",[],"NV8"],[[128749,128751],"disallowed"],[[128752,128755],"valid",[],"NV8"],[[128756,128767],"disallowed"],[[128768,128883],"valid",[],"NV8"],[[128884,128895],"disallowed"],[[128896,128980],"valid",[],"NV8"],[[128981,129023],"disallowed"],[[129024,129035],"valid",[],"NV8"],[[129036,129039],"disallowed"],[[129040,129095],"valid",[],"NV8"],[[129096,129103],"disallowed"],[[129104,129113],"valid",[],"NV8"],[[129114,129119],"disallowed"],[[129120,129159],"valid",[],"NV8"],[[129160,129167],"disallowed"],[[129168,129197],"valid",[],"NV8"],[[129198,129295],"disallowed"],[[129296,129304],"valid",[],"NV8"],[[129305,129407],"disallowed"],[[129408,129412],"valid",[],"NV8"],[[129413,129471],"disallowed"],[[129472,129472],"valid",[],"NV8"],[[129473,131069],"disallowed"],[[131070,131071],"disallowed"],[[131072,173782],"valid"],[[173783,173823],"disallowed"],[[173824,177972],"valid"],[[177973,177983],"disallowed"],[[177984,178205],"valid"],[[178206,178207],"disallowed"],[[178208,183969],"valid"],[[183970,194559],"disallowed"],[[194560,194560],"mapped",[20029]],[[194561,194561],"mapped",[20024]],[[194562,194562],"mapped",[20033]],[[194563,194563],"mapped",[131362]],[[194564,194564],"mapped",[20320]],[[194565,194565],"mapped",[20398]],[[194566,194566],"mapped",[20411]],[[194567,194567],"mapped",[20482]],[[194568,194568],"mapped",[20602]],[[194569,194569],"mapped",[20633]],[[194570,194570],"mapped",[20711]],[[194571,194571],"mapped",[20687]],[[194572,194572],"mapped",[13470]],[[194573,194573],"mapped",[132666]],[[194574,194574],"mapped",[20813]],[[194575,194575],"mapped",[20820]],[[194576,194576],"mapped",[20836]],[[194577,194577],"mapped",[20855]],[[194578,194578],"mapped",[132380]],[[194579,194579],"mapped",[13497]],[[194580,194580],"mapped",[20839]],[[194581,194581],"mapped",[20877]],[[194582,194582],"mapped",[132427]],[[194583,194583],"mapped",[20887]],[[194584,194584],"mapped",[20900]],[[194585,194585],"mapped",[20172]],[[194586,194586],"mapped",[20908]],[[194587,194587],"mapped",[20917]],[[194588,194588],"mapped",[168415]],[[194589,194589],"mapped",[20981]],[[194590,194590],"mapped",[20995]],[[194591,194591],"mapped",[13535]],[[194592,194592],"mapped",[21051]],[[194593,194593],"mapped",[21062]],[[194594,194594],"mapped",[21106]],[[194595,194595],"mapped",[21111]],[[194596,194596],"mapped",[13589]],[[194597,194597],"mapped",[21191]],[[194598,194598],"mapped",[21193]],[[194599,194599],"mapped",[21220]],[[194600,194600],"mapped",[21242]],[[194601,194601],"mapped",[21253]],[[194602,194602],"mapped",[21254]],[[194603,194603],"mapped",[21271]],[[194604,194604],"mapped",[21321]],[[194605,194605],"mapped",[21329]],[[194606,194606],"mapped",[21338]],[[194607,194607],"mapped",[21363]],[[194608,194608],"mapped",[21373]],[[194609,194611],"mapped",[21375]],[[194612,194612],"mapped",[133676]],[[194613,194613],"mapped",[28784]],[[194614,194614],"mapped",[21450]],[[194615,194615],"mapped",[21471]],[[194616,194616],"mapped",[133987]],[[194617,194617],"mapped",[21483]],[[194618,194618],"mapped",[21489]],[[194619,194619],"mapped",[21510]],[[194620,194620],"mapped",[21662]],[[194621,194621],"mapped",[21560]],[[194622,194622],"mapped",[21576]],[[194623,194623],"mapped",[21608]],[[194624,194624],"mapped",[21666]],[[194625,194625],"mapped",[21750]],[[194626,194626],"mapped",[21776]],[[194627,194627],"mapped",[21843]],[[194628,194628],"mapped",[21859]],[[194629,194630],"mapped",[21892]],[[194631,194631],"mapped",[21913]],[[194632,194632],"mapped",[21931]],[[194633,194633],"mapped",[21939]],[[194634,194634],"mapped",[21954]],[[194635,194635],"mapped",[22294]],[[194636,194636],"mapped",[22022]],[[194637,194637],"mapped",[22295]],[[194638,194638],"mapped",[22097]],[[194639,194639],"mapped",[22132]],[[194640,194640],"mapped",[20999]],[[194641,194641],"mapped",[22766]],[[194642,194642],"mapped",[22478]],[[194643,194643],"mapped",[22516]],[[194644,194644],"mapped",[22541]],[[194645,194645],"mapped",[22411]],[[194646,194646],"mapped",[22578]],[[194647,194647],"mapped",[22577]],[[194648,194648],"mapped",[22700]],[[194649,194649],"mapped",[136420]],[[194650,194650],"mapped",[22770]],[[194651,194651],"mapped",[22775]],[[194652,194652],"mapped",[22790]],[[194653,194653],"mapped",[22810]],[[194654,194654],"mapped",[22818]],[[194655,194655],"mapped",[22882]],[[194656,194656],"mapped",[136872]],[[194657,194657],"mapped",[136938]],[[194658,194658],"mapped",[23020]],[[194659,194659],"mapped",[23067]],[[194660,194660],"mapped",[23079]],[[194661,194661],"mapped",[23000]],[[194662,194662],"mapped",[23142]],[[194663,194663],"mapped",[14062]],[[194664,194664],"disallowed"],[[194665,194665],"mapped",[23304]],[[194666,194667],"mapped",[23358]],[[194668,194668],"mapped",[137672]],[[194669,194669],"mapped",[23491]],[[194670,194670],"mapped",[23512]],[[194671,194671],"mapped",[23527]],[[194672,194672],"mapped",[23539]],[[194673,194673],"mapped",[138008]],[[194674,194674],"mapped",[23551]],[[194675,194675],"mapped",[23558]],[[194676,194676],"disallowed"],[[194677,194677],"mapped",[23586]],[[194678,194678],"mapped",[14209]],[[194679,194679],"mapped",[23648]],[[194680,194680],"mapped",[23662]],[[194681,194681],"mapped",[23744]],[[194682,194682],"mapped",[23693]],[[194683,194683],"mapped",[138724]],[[194684,194684],"mapped",[23875]],[[194685,194685],"mapped",[138726]],[[194686,194686],"mapped",[23918]],[[194687,194687],"mapped",[23915]],[[194688,194688],"mapped",[23932]],[[194689,194689],"mapped",[24033]],[[194690,194690],"mapped",[24034]],[[194691,194691],"mapped",[14383]],[[194692,194692],"mapped",[24061]],[[194693,194693],"mapped",[24104]],[[194694,194694],"mapped",[24125]],[[194695,194695],"mapped",[24169]],[[194696,194696],"mapped",[14434]],[[194697,194697],"mapped",[139651]],[[194698,194698],"mapped",[14460]],[[194699,194699],"mapped",[24240]],[[194700,194700],"mapped",[24243]],[[194701,194701],"mapped",[24246]],[[194702,194702],"mapped",[24266]],[[194703,194703],"mapped",[172946]],[[194704,194704],"mapped",[24318]],[[194705,194706],"mapped",[140081]],[[194707,194707],"mapped",[33281]],[[194708,194709],"mapped",[24354]],[[194710,194710],"mapped",[14535]],[[194711,194711],"mapped",[144056]],[[194712,194712],"mapped",[156122]],[[194713,194713],"mapped",[24418]],[[194714,194714],"mapped",[24427]],[[194715,194715],"mapped",[14563]],[[194716,194716],"mapped",[24474]],[[194717,194717],"mapped",[24525]],[[194718,194718],"mapped",[24535]],[[194719,194719],"mapped",[24569]],[[194720,194720],"mapped",[24705]],[[194721,194721],"mapped",[14650]],[[194722,194722],"mapped",[14620]],[[194723,194723],"mapped",[24724]],[[194724,194724],"mapped",[141012]],[[194725,194725],"mapped",[24775]],[[194726,194726],"mapped",[24904]],[[194727,194727],"mapped",[24908]],[[194728,194728],"mapped",[24910]],[[194729,194729],"mapped",[24908]],[[194730,194730],"mapped",[24954]],[[194731,194731],"mapped",[24974]],[[194732,194732],"mapped",[25010]],[[194733,194733],"mapped",[24996]],[[194734,194734],"mapped",[25007]],[[194735,194735],"mapped",[25054]],[[194736,194736],"mapped",[25074]],[[194737,194737],"mapped",[25078]],[[194738,194738],"mapped",[25104]],[[194739,194739],"mapped",[25115]],[[194740,194740],"mapped",[25181]],[[194741,194741],"mapped",[25265]],[[194742,194742],"mapped",[25300]],[[194743,194743],"mapped",[25424]],[[194744,194744],"mapped",[142092]],[[194745,194745],"mapped",[25405]],[[194746,194746],"mapped",[25340]],[[194747,194747],"mapped",[25448]],[[194748,194748],"mapped",[25475]],[[194749,194749],"mapped",[25572]],[[194750,194750],"mapped",[142321]],[[194751,194751],"mapped",[25634]],[[194752,194752],"mapped",[25541]],[[194753,194753],"mapped",[25513]],[[194754,194754],"mapped",[14894]],[[194755,194755],"mapped",[25705]],[[194756,194756],"mapped",[25726]],[[194757,194757],"mapped",[25757]],[[194758,194758],"mapped",[25719]],[[194759,194759],"mapped",[14956]],[[194760,194760],"mapped",[25935]],[[194761,194761],"mapped",[25964]],[[194762,194762],"mapped",[143370]],[[194763,194763],"mapped",[26083]],[[194764,194764],"mapped",[26360]],[[194765,194765],"mapped",[26185]],[[194766,194766],"mapped",[15129]],[[194767,194767],"mapped",[26257]],[[194768,194768],"mapped",[15112]],[[194769,194769],"mapped",[15076]],[[194770,194770],"mapped",[20882]],[[194771,194771],"mapped",[20885]],[[194772,194772],"mapped",[26368]],[[194773,194773],"mapped",[26268]],[[194774,194774],"mapped",[32941]],[[194775,194775],"mapped",[17369]],[[194776,194776],"mapped",[26391]],[[194777,194777],"mapped",[26395]],[[194778,194778],"mapped",[26401]],[[194779,194779],"mapped",[26462]],[[194780,194780],"mapped",[26451]],[[194781,194781],"mapped",[144323]],[[194782,194782],"mapped",[15177]],[[194783,194783],"mapped",[26618]],[[194784,194784],"mapped",[26501]],[[194785,194785],"mapped",[26706]],[[194786,194786],"mapped",[26757]],[[194787,194787],"mapped",[144493]],[[194788,194788],"mapped",[26766]],[[194789,194789],"mapped",[26655]],[[194790,194790],"mapped",[26900]],[[194791,194791],"mapped",[15261]],[[194792,194792],"mapped",[26946]],[[194793,194793],"mapped",[27043]],[[194794,194794],"mapped",[27114]],[[194795,194795],"mapped",[27304]],[[194796,194796],"mapped",[145059]],[[194797,194797],"mapped",[27355]],[[194798,194798],"mapped",[15384]],[[194799,194799],"mapped",[27425]],[[194800,194800],"mapped",[145575]],[[194801,194801],"mapped",[27476]],[[194802,194802],"mapped",[15438]],[[194803,194803],"mapped",[27506]],[[194804,194804],"mapped",[27551]],[[194805,194805],"mapped",[27578]],[[194806,194806],"mapped",[27579]],[[194807,194807],"mapped",[146061]],[[194808,194808],"mapped",[138507]],[[194809,194809],"mapped",[146170]],[[194810,194810],"mapped",[27726]],[[194811,194811],"mapped",[146620]],[[194812,194812],"mapped",[27839]],[[194813,194813],"mapped",[27853]],[[194814,194814],"mapped",[27751]],[[194815,194815],"mapped",[27926]],[[194816,194816],"mapped",[27966]],[[194817,194817],"mapped",[28023]],[[194818,194818],"mapped",[27969]],[[194819,194819],"mapped",[28009]],[[194820,194820],"mapped",[28024]],[[194821,194821],"mapped",[28037]],[[194822,194822],"mapped",[146718]],[[194823,194823],"mapped",[27956]],[[194824,194824],"mapped",[28207]],[[194825,194825],"mapped",[28270]],[[194826,194826],"mapped",[15667]],[[194827,194827],"mapped",[28363]],[[194828,194828],"mapped",[28359]],[[194829,194829],"mapped",[147153]],[[194830,194830],"mapped",[28153]],[[194831,194831],"mapped",[28526]],[[194832,194832],"mapped",[147294]],[[194833,194833],"mapped",[147342]],[[194834,194834],"mapped",[28614]],[[194835,194835],"mapped",[28729]],[[194836,194836],"mapped",[28702]],[[194837,194837],"mapped",[28699]],[[194838,194838],"mapped",[15766]],[[194839,194839],"mapped",[28746]],[[194840,194840],"mapped",[28797]],[[194841,194841],"mapped",[28791]],[[194842,194842],"mapped",[28845]],[[194843,194843],"mapped",[132389]],[[194844,194844],"mapped",[28997]],[[194845,194845],"mapped",[148067]],[[194846,194846],"mapped",[29084]],[[194847,194847],"disallowed"],[[194848,194848],"mapped",[29224]],[[194849,194849],"mapped",[29237]],[[194850,194850],"mapped",[29264]],[[194851,194851],"mapped",[149000]],[[194852,194852],"mapped",[29312]],[[194853,194853],"mapped",[29333]],[[194854,194854],"mapped",[149301]],[[194855,194855],"mapped",[149524]],[[194856,194856],"mapped",[29562]],[[194857,194857],"mapped",[29579]],[[194858,194858],"mapped",[16044]],[[194859,194859],"mapped",[29605]],[[194860,194861],"mapped",[16056]],[[194862,194862],"mapped",[29767]],[[194863,194863],"mapped",[29788]],[[194864,194864],"mapped",[29809]],[[194865,194865],"mapped",[29829]],[[194866,194866],"mapped",[29898]],[[194867,194867],"mapped",[16155]],[[194868,194868],"mapped",[29988]],[[194869,194869],"mapped",[150582]],[[194870,194870],"mapped",[30014]],[[194871,194871],"mapped",[150674]],[[194872,194872],"mapped",[30064]],[[194873,194873],"mapped",[139679]],[[194874,194874],"mapped",[30224]],[[194875,194875],"mapped",[151457]],[[194876,194876],"mapped",[151480]],[[194877,194877],"mapped",[151620]],[[194878,194878],"mapped",[16380]],[[194879,194879],"mapped",[16392]],[[194880,194880],"mapped",[30452]],[[194881,194881],"mapped",[151795]],[[194882,194882],"mapped",[151794]],[[194883,194883],"mapped",[151833]],[[194884,194884],"mapped",[151859]],[[194885,194885],"mapped",[30494]],[[194886,194887],"mapped",[30495]],[[194888,194888],"mapped",[30538]],[[194889,194889],"mapped",[16441]],[[194890,194890],"mapped",[30603]],[[194891,194891],"mapped",[16454]],[[194892,194892],"mapped",[16534]],[[194893,194893],"mapped",[152605]],[[194894,194894],"mapped",[30798]],[[194895,194895],"mapped",[30860]],[[194896,194896],"mapped",[30924]],[[194897,194897],"mapped",[16611]],[[194898,194898],"mapped",[153126]],[[194899,194899],"mapped",[31062]],[[194900,194900],"mapped",[153242]],[[194901,194901],"mapped",[153285]],[[194902,194902],"mapped",[31119]],[[194903,194903],"mapped",[31211]],[[194904,194904],"mapped",[16687]],[[194905,194905],"mapped",[31296]],[[194906,194906],"mapped",[31306]],[[194907,194907],"mapped",[31311]],[[194908,194908],"mapped",[153980]],[[194909,194910],"mapped",[154279]],[[194911,194911],"disallowed"],[[194912,194912],"mapped",[16898]],[[194913,194913],"mapped",[154539]],[[194914,194914],"mapped",[31686]],[[194915,194915],"mapped",[31689]],[[194916,194916],"mapped",[16935]],[[194917,194917],"mapped",[154752]],[[194918,194918],"mapped",[31954]],[[194919,194919],"mapped",[17056]],[[194920,194920],"mapped",[31976]],[[194921,194921],"mapped",[31971]],[[194922,194922],"mapped",[32000]],[[194923,194923],"mapped",[155526]],[[194924,194924],"mapped",[32099]],[[194925,194925],"mapped",[17153]],[[194926,194926],"mapped",[32199]],[[194927,194927],"mapped",[32258]],[[194928,194928],"mapped",[32325]],[[194929,194929],"mapped",[17204]],[[194930,194930],"mapped",[156200]],[[194931,194931],"mapped",[156231]],[[194932,194932],"mapped",[17241]],[[194933,194933],"mapped",[156377]],[[194934,194934],"mapped",[32634]],[[194935,194935],"mapped",[156478]],[[194936,194936],"mapped",[32661]],[[194937,194937],"mapped",[32762]],[[194938,194938],"mapped",[32773]],[[194939,194939],"mapped",[156890]],[[194940,194940],"mapped",[156963]],[[194941,194941],"mapped",[32864]],[[194942,194942],"mapped",[157096]],[[194943,194943],"mapped",[32880]],[[194944,194944],"mapped",[144223]],[[194945,194945],"mapped",[17365]],[[194946,194946],"mapped",[32946]],[[194947,194947],"mapped",[33027]],[[194948,194948],"mapped",[17419]],[[194949,194949],"mapped",[33086]],[[194950,194950],"mapped",[23221]],[[194951,194951],"mapped",[157607]],[[194952,194952],"mapped",[157621]],[[194953,194953],"mapped",[144275]],[[194954,194954],"mapped",[144284]],[[194955,194955],"mapped",[33281]],[[194956,194956],"mapped",[33284]],[[194957,194957],"mapped",[36766]],[[194958,194958],"mapped",[17515]],[[194959,194959],"mapped",[33425]],[[194960,194960],"mapped",[33419]],[[194961,194961],"mapped",[33437]],[[194962,194962],"mapped",[21171]],[[194963,194963],"mapped",[33457]],[[194964,194964],"mapped",[33459]],[[194965,194965],"mapped",[33469]],[[194966,194966],"mapped",[33510]],[[194967,194967],"mapped",[158524]],[[194968,194968],"mapped",[33509]],[[194969,194969],"mapped",[33565]],[[194970,194970],"mapped",[33635]],[[194971,194971],"mapped",[33709]],[[194972,194972],"mapped",[33571]],[[194973,194973],"mapped",[33725]],[[194974,194974],"mapped",[33767]],[[194975,194975],"mapped",[33879]],[[194976,194976],"mapped",[33619]],[[194977,194977],"mapped",[33738]],[[194978,194978],"mapped",[33740]],[[194979,194979],"mapped",[33756]],[[194980,194980],"mapped",[158774]],[[194981,194981],"mapped",[159083]],[[194982,194982],"mapped",[158933]],[[194983,194983],"mapped",[17707]],[[194984,194984],"mapped",[34033]],[[194985,194985],"mapped",[34035]],[[194986,194986],"mapped",[34070]],[[194987,194987],"mapped",[160714]],[[194988,194988],"mapped",[34148]],[[194989,194989],"mapped",[159532]],[[194990,194990],"mapped",[17757]],[[194991,194991],"mapped",[17761]],[[194992,194992],"mapped",[159665]],[[194993,194993],"mapped",[159954]],[[194994,194994],"mapped",[17771]],[[194995,194995],"mapped",[34384]],[[194996,194996],"mapped",[34396]],[[194997,194997],"mapped",[34407]],[[194998,194998],"mapped",[34409]],[[194999,194999],"mapped",[34473]],[[195000,195000],"mapped",[34440]],[[195001,195001],"mapped",[34574]],[[195002,195002],"mapped",[34530]],[[195003,195003],"mapped",[34681]],[[195004,195004],"mapped",[34600]],[[195005,195005],"mapped",[34667]],[[195006,195006],"mapped",[34694]],[[195007,195007],"disallowed"],[[195008,195008],"mapped",[34785]],[[195009,195009],"mapped",[34817]],[[195010,195010],"mapped",[17913]],[[195011,195011],"mapped",[34912]],[[195012,195012],"mapped",[34915]],[[195013,195013],"mapped",[161383]],[[195014,195014],"mapped",[35031]],[[195015,195015],"mapped",[35038]],[[195016,195016],"mapped",[17973]],[[195017,195017],"mapped",[35066]],[[195018,195018],"mapped",[13499]],[[195019,195019],"mapped",[161966]],[[195020,195020],"mapped",[162150]],[[195021,195021],"mapped",[18110]],[[195022,195022],"mapped",[18119]],[[195023,195023],"mapped",[35488]],[[195024,195024],"mapped",[35565]],[[195025,195025],"mapped",[35722]],[[195026,195026],"mapped",[35925]],[[195027,195027],"mapped",[162984]],[[195028,195028],"mapped",[36011]],[[195029,195029],"mapped",[36033]],[[195030,195030],"mapped",[36123]],[[195031,195031],"mapped",[36215]],[[195032,195032],"mapped",[163631]],[[195033,195033],"mapped",[133124]],[[195034,195034],"mapped",[36299]],[[195035,195035],"mapped",[36284]],[[195036,195036],"mapped",[36336]],[[195037,195037],"mapped",[133342]],[[195038,195038],"mapped",[36564]],[[195039,195039],"mapped",[36664]],[[195040,195040],"mapped",[165330]],[[195041,195041],"mapped",[165357]],[[195042,195042],"mapped",[37012]],[[195043,195043],"mapped",[37105]],[[195044,195044],"mapped",[37137]],[[195045,195045],"mapped",[165678]],[[195046,195046],"mapped",[37147]],[[195047,195047],"mapped",[37432]],[[195048,195048],"mapped",[37591]],[[195049,195049],"mapped",[37592]],[[195050,195050],"mapped",[37500]],[[195051,195051],"mapped",[37881]],[[195052,195052],"mapped",[37909]],[[195053,195053],"mapped",[166906]],[[195054,195054],"mapped",[38283]],[[195055,195055],"mapped",[18837]],[[195056,195056],"mapped",[38327]],[[195057,195057],"mapped",[167287]],[[195058,195058],"mapped",[18918]],[[195059,195059],"mapped",[38595]],[[195060,195060],"mapped",[23986]],[[195061,195061],"mapped",[38691]],[[195062,195062],"mapped",[168261]],[[195063,195063],"mapped",[168474]],[[195064,195064],"mapped",[19054]],[[195065,195065],"mapped",[19062]],[[195066,195066],"mapped",[38880]],[[195067,195067],"mapped",[168970]],[[195068,195068],"mapped",[19122]],[[195069,195069],"mapped",[169110]],[[195070,195071],"mapped",[38923]],[[195072,195072],"mapped",[38953]],[[195073,195073],"mapped",[169398]],[[195074,195074],"mapped",[39138]],[[195075,195075],"mapped",[19251]],[[195076,195076],"mapped",[39209]],[[195077,195077],"mapped",[39335]],[[195078,195078],"mapped",[39362]],[[195079,195079],"mapped",[39422]],[[195080,195080],"mapped",[19406]],[[195081,195081],"mapped",[170800]],[[195082,195082],"mapped",[39698]],[[195083,195083],"mapped",[40000]],[[195084,195084],"mapped",[40189]],[[195085,195085],"mapped",[19662]],[[195086,195086],"mapped",[19693]],[[195087,195087],"mapped",[40295]],[[195088,195088],"mapped",[172238]],[[195089,195089],"mapped",[19704]],[[195090,195090],"mapped",[172293]],[[195091,195091],"mapped",[172558]],[[195092,195092],"mapped",[172689]],[[195093,195093],"mapped",[40635]],[[195094,195094],"mapped",[19798]],[[195095,195095],"mapped",[40697]],[[195096,195096],"mapped",[40702]],[[195097,195097],"mapped",[40709]],[[195098,195098],"mapped",[40719]],[[195099,195099],"mapped",[40726]],[[195100,195100],"mapped",[40763]],[[195101,195101],"mapped",[173568]],[[195102,196605],"disallowed"],[[196606,196607],"disallowed"],[[196608,262141],"disallowed"],[[262142,262143],"disallowed"],[[262144,327677],"disallowed"],[[327678,327679],"disallowed"],[[327680,393213],"disallowed"],[[393214,393215],"disallowed"],[[393216,458749],"disallowed"],[[458750,458751],"disallowed"],[[458752,524285],"disallowed"],[[524286,524287],"disallowed"],[[524288,589821],"disallowed"],[[589822,589823],"disallowed"],[[589824,655357],"disallowed"],[[655358,655359],"disallowed"],[[655360,720893],"disallowed"],[[720894,720895],"disallowed"],[[720896,786429],"disallowed"],[[786430,786431],"disallowed"],[[786432,851965],"disallowed"],[[851966,851967],"disallowed"],[[851968,917501],"disallowed"],[[917502,917503],"disallowed"],[[917504,917504],"disallowed"],[[917505,917505],"disallowed"],[[917506,917535],"disallowed"],[[917536,917631],"disallowed"],[[917632,917759],"disallowed"],[[917760,917999],"ignored"],[[918000,983037],"disallowed"],[[983038,983039],"disallowed"],[[983040,1048573],"disallowed"],[[1048574,1048575],"disallowed"],[[1048576,1114109],"disallowed"],[[1114110,1114111],"disallowed"]] \ No newline at end of file diff --git a/node/node_modules/node-fetch/node_modules/tr46/package.json b/node/node_modules/node-fetch/node_modules/tr46/package.json new file mode 100644 index 0000000..b6826da --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/tr46/package.json @@ -0,0 +1,31 @@ +{ + "name": "tr46", + "version": "0.0.3", + "description": "An implementation of the Unicode TR46 spec", + "main": "index.js", + "scripts": { + "test": "mocha", + "pretest": "node scripts/getLatestUnicodeTests.js", + "prepublish": "node scripts/generateMappingTable.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Sebmaster/tr46.js.git" + }, + "keywords": [ + "unicode", + "tr46", + "url", + "whatwg" + ], + "author": "Sebastian Mayr ", + "license": "MIT", + "bugs": { + "url": "https://github.com/Sebmaster/tr46.js/issues" + }, + "homepage": "https://github.com/Sebmaster/tr46.js#readme", + "devDependencies": { + "mocha": "^2.2.5", + "request": "^2.57.0" + } +} diff --git a/node/node_modules/node-fetch/node_modules/webidl-conversions/LICENSE.md b/node/node_modules/node-fetch/node_modules/webidl-conversions/LICENSE.md new file mode 100644 index 0000000..d4a994f --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/webidl-conversions/LICENSE.md @@ -0,0 +1,12 @@ +# The BSD 2-Clause License + +Copyright (c) 2014, Domenic Denicola +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node/node_modules/node-fetch/node_modules/webidl-conversions/README.md b/node/node_modules/node-fetch/node_modules/webidl-conversions/README.md new file mode 100644 index 0000000..3657890 --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/webidl-conversions/README.md @@ -0,0 +1,53 @@ +# WebIDL Type Conversions on JavaScript Values + +This package implements, in JavaScript, the algorithms to convert a given JavaScript value according to a given [WebIDL](http://heycam.github.io/webidl/) [type](http://heycam.github.io/webidl/#idl-types). + +The goal is that you should be able to write code like + +```js +const conversions = require("webidl-conversions"); + +function doStuff(x, y) { + x = conversions["boolean"](x); + y = conversions["unsigned long"](y); + // actual algorithm code here +} +``` + +and your function `doStuff` will behave the same as a WebIDL operation declared as + +```webidl +void doStuff(boolean x, unsigned long y); +``` + +## API + +This package's main module's default export is an object with a variety of methods, each corresponding to a different WebIDL type. Each method, when invoked on a JavaScript value, will give back the new JavaScript value that results after passing through the WebIDL conversion rules. (See below for more details on what that means.) Alternately, the method could throw an error, if the WebIDL algorithm is specified to do so: for example `conversions["float"](NaN)` [will throw a `TypeError`](http://heycam.github.io/webidl/#es-float). + +## Status + +All of the numeric types are implemented (float being implemented as double) and some others are as well - check the source for all of them. This list will grow over time in service of the [HTML as Custom Elements](https://github.com/dglazkov/html-as-custom-elements) project, but in the meantime, pull requests welcome! + +I'm not sure yet what the strategy will be for modifiers, e.g. [`[Clamp]`](http://heycam.github.io/webidl/#Clamp). Maybe something like `conversions["unsigned long"](x, { clamp: true })`? We'll see. + +We might also want to extend the API to give better error messages, e.g. "Argument 1 of HTMLMediaElement.fastSeek is not a finite floating-point value" instead of "Argument is not a finite floating-point value." This would require passing in more information to the conversion functions than we currently do. + +## Background + +What's actually going on here, conceptually, is pretty weird. Let's try to explain. + +WebIDL, as part of its madness-inducing design, has its own type system. When people write algorithms in web platform specs, they usually operate on WebIDL values, i.e. instances of WebIDL types. For example, if they were specifying the algorithm for our `doStuff` operation above, they would treat `x` as a WebIDL value of [WebIDL type `boolean`](http://heycam.github.io/webidl/#idl-boolean). Crucially, they would _not_ treat `x` as a JavaScript variable whose value is either the JavaScript `true` or `false`. They're instead working in a different type system altogether, with its own rules. + +Separately from its type system, WebIDL defines a ["binding"](http://heycam.github.io/webidl/#ecmascript-binding) of the type system into JavaScript. This contains rules like: when you pass a JavaScript value to the JavaScript method that manifests a given WebIDL operation, how does that get converted into a WebIDL value? For example, a JavaScript `true` passed in the position of a WebIDL `boolean` argument becomes a WebIDL `true`. But, a JavaScript `true` passed in the position of a [WebIDL `unsigned long`](http://heycam.github.io/webidl/#idl-unsigned-long) becomes a WebIDL `1`. And so on. + +Finally, we have the actual implementation code. This is usually C++, although these days [some smart people are using Rust](https://github.com/servo/servo). The implementation, of course, has its own type system. So when they implement the WebIDL algorithms, they don't actually use WebIDL values, since those aren't "real" outside of specs. Instead, implementations apply the WebIDL binding rules in such a way as to convert incoming JavaScript values into C++ values. For example, if code in the browser called `doStuff(true, true)`, then the implementation code would eventually receive a C++ `bool` containing `true` and a C++ `uint32_t` containing `1`. + +The upside of all this is that implementations can abstract all the conversion logic away, letting WebIDL handle it, and focus on implementing the relevant methods in C++ with values of the correct type already provided. That is payoff of WebIDL, in a nutshell. + +And getting to that payoff is the goal of _this_ project—but for JavaScript implementations, instead of C++ ones. That is, this library is designed to make it easier for JavaScript developers to write functions that behave like a given WebIDL operation. So conceptually, the conversion pipeline, which in its general form is JavaScript values ↦ WebIDL values ↦ implementation-language values, in this case becomes JavaScript values ↦ WebIDL values ↦ JavaScript values. And that intermediate step is where all the logic is performed: a JavaScript `true` becomes a WebIDL `1` in an unsigned long context, which then becomes a JavaScript `1`. + +## Don't Use This + +Seriously, why would you ever use this? You really shouldn't. WebIDL is … not great, and you shouldn't be emulating its semantics. If you're looking for a generic argument-processing library, you should find one with better rules than those from WebIDL. In general, your JavaScript should not be trying to become more like WebIDL; if anything, we should fix WebIDL to make it more like JavaScript. + +The _only_ people who should use this are those trying to create faithful implementations (or polyfills) of web platform interfaces defined in WebIDL. diff --git a/node/node_modules/node-fetch/node_modules/webidl-conversions/lib/index.js b/node/node_modules/node-fetch/node_modules/webidl-conversions/lib/index.js new file mode 100644 index 0000000..c5153a3 --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/webidl-conversions/lib/index.js @@ -0,0 +1,189 @@ +"use strict"; + +var conversions = {}; +module.exports = conversions; + +function sign(x) { + return x < 0 ? -1 : 1; +} + +function evenRound(x) { + // Round x to the nearest integer, choosing the even integer if it lies halfway between two. + if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor) + return Math.floor(x); + } else { + return Math.round(x); + } +} + +function createNumberConversion(bitLength, typeOpts) { + if (!typeOpts.unsigned) { + --bitLength; + } + const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength); + const upperBound = Math.pow(2, bitLength) - 1; + + const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength); + const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1); + + return function(V, opts) { + if (!opts) opts = {}; + + let x = +V; + + if (opts.enforceRange) { + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite number"); + } + + x = sign(x) * Math.floor(Math.abs(x)); + if (x < lowerBound || x > upperBound) { + throw new TypeError("Argument is not in byte range"); + } + + return x; + } + + if (!isNaN(x) && opts.clamp) { + x = evenRound(x); + + if (x < lowerBound) x = lowerBound; + if (x > upperBound) x = upperBound; + return x; + } + + if (!Number.isFinite(x) || x === 0) { + return 0; + } + + x = sign(x) * Math.floor(Math.abs(x)); + x = x % moduloVal; + + if (!typeOpts.unsigned && x >= moduloBound) { + return x - moduloVal; + } else if (typeOpts.unsigned) { + if (x < 0) { + x += moduloVal; + } else if (x === -0) { // don't return negative zero + return 0; + } + } + + return x; + } +} + +conversions["void"] = function () { + return undefined; +}; + +conversions["boolean"] = function (val) { + return !!val; +}; + +conversions["byte"] = createNumberConversion(8, { unsigned: false }); +conversions["octet"] = createNumberConversion(8, { unsigned: true }); + +conversions["short"] = createNumberConversion(16, { unsigned: false }); +conversions["unsigned short"] = createNumberConversion(16, { unsigned: true }); + +conversions["long"] = createNumberConversion(32, { unsigned: false }); +conversions["unsigned long"] = createNumberConversion(32, { unsigned: true }); + +conversions["long long"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 }); +conversions["unsigned long long"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 }); + +conversions["double"] = function (V) { + const x = +V; + + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite floating-point value"); + } + + return x; +}; + +conversions["unrestricted double"] = function (V) { + const x = +V; + + if (isNaN(x)) { + throw new TypeError("Argument is NaN"); + } + + return x; +}; + +// not quite valid, but good enough for JS +conversions["float"] = conversions["double"]; +conversions["unrestricted float"] = conversions["unrestricted double"]; + +conversions["DOMString"] = function (V, opts) { + if (!opts) opts = {}; + + if (opts.treatNullAsEmptyString && V === null) { + return ""; + } + + return String(V); +}; + +conversions["ByteString"] = function (V, opts) { + const x = String(V); + let c = undefined; + for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) { + if (c > 255) { + throw new TypeError("Argument is not a valid bytestring"); + } + } + + return x; +}; + +conversions["USVString"] = function (V) { + const S = String(V); + const n = S.length; + const U = []; + for (let i = 0; i < n; ++i) { + const c = S.charCodeAt(i); + if (c < 0xD800 || c > 0xDFFF) { + U.push(String.fromCodePoint(c)); + } else if (0xDC00 <= c && c <= 0xDFFF) { + U.push(String.fromCodePoint(0xFFFD)); + } else { + if (i === n - 1) { + U.push(String.fromCodePoint(0xFFFD)); + } else { + const d = S.charCodeAt(i + 1); + if (0xDC00 <= d && d <= 0xDFFF) { + const a = c & 0x3FF; + const b = d & 0x3FF; + U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b)); + ++i; + } else { + U.push(String.fromCodePoint(0xFFFD)); + } + } + } + } + + return U.join(''); +}; + +conversions["Date"] = function (V, opts) { + if (!(V instanceof Date)) { + throw new TypeError("Argument is not a Date object"); + } + if (isNaN(V)) { + return undefined; + } + + return V; +}; + +conversions["RegExp"] = function (V, opts) { + if (!(V instanceof RegExp)) { + V = new RegExp(V); + } + + return V; +}; diff --git a/node/node_modules/node-fetch/node_modules/webidl-conversions/package.json b/node/node_modules/node-fetch/node_modules/webidl-conversions/package.json new file mode 100644 index 0000000..c31bc07 --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/webidl-conversions/package.json @@ -0,0 +1,23 @@ +{ + "name": "webidl-conversions", + "version": "3.0.1", + "description": "Implements the WebIDL algorithms for converting to and from JavaScript values", + "main": "lib/index.js", + "scripts": { + "test": "mocha test/*.js" + }, + "repository": "jsdom/webidl-conversions", + "keywords": [ + "webidl", + "web", + "types" + ], + "files": [ + "lib/" + ], + "author": "Domenic Denicola (https://domenic.me/)", + "license": "BSD-2-Clause", + "devDependencies": { + "mocha": "^1.21.4" + } +} diff --git a/node/node_modules/node-fetch/node_modules/whatwg-url/LICENSE.txt b/node/node_modules/node-fetch/node_modules/whatwg-url/LICENSE.txt new file mode 100644 index 0000000..54dfac3 --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/whatwg-url/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015–2016 Sebastian Mayr + +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. diff --git a/node/node_modules/node-fetch/node_modules/whatwg-url/README.md b/node/node_modules/node-fetch/node_modules/whatwg-url/README.md new file mode 100644 index 0000000..4347a7f --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/whatwg-url/README.md @@ -0,0 +1,67 @@ +# whatwg-url + +whatwg-url is a full implementation of the WHATWG [URL Standard](https://url.spec.whatwg.org/). It can be used standalone, but it also exposes a lot of the internal algorithms that are useful for integrating a URL parser into a project like [jsdom](https://github.com/tmpvar/jsdom). + +## Current Status + +whatwg-url is currently up to date with the URL spec up to commit [a62223](https://github.com/whatwg/url/commit/a622235308342c9adc7fc2fd1659ff059f7d5e2a). + +## API + +### The `URL` Constructor + +The main API is the [`URL`](https://url.spec.whatwg.org/#url) export, which follows the spec's behavior in all ways (including e.g. `USVString` conversion). Most consumers of this library will want to use this. + +### Low-level URL Standard API + +The following methods are exported for use by places like jsdom that need to implement things like [`HTMLHyperlinkElementUtils`](https://html.spec.whatwg.org/#htmlhyperlinkelementutils). They operate on or return an "internal URL" or ["URL record"](https://url.spec.whatwg.org/#concept-url) type. + +- [URL parser](https://url.spec.whatwg.org/#concept-url-parser): `parseURL(input, { baseURL, encodingOverride })` +- [Basic URL parser](https://url.spec.whatwg.org/#concept-basic-url-parser): `basicURLParse(input, { baseURL, encodingOverride, url, stateOverride })` +- [URL serializer](https://url.spec.whatwg.org/#concept-url-serializer): `serializeURL(urlRecord, excludeFragment)` +- [Host serializer](https://url.spec.whatwg.org/#concept-host-serializer): `serializeHost(hostFromURLRecord)` +- [Serialize an integer](https://url.spec.whatwg.org/#serialize-an-integer): `serializeInteger(number)` +- [Origin](https://url.spec.whatwg.org/#concept-url-origin) [serializer](https://html.spec.whatwg.org/multipage/browsers.html#serialization-of-an-origin): `serializeURLOrigin(urlRecord)` +- [Set the username](https://url.spec.whatwg.org/#set-the-username): `setTheUsername(urlRecord, usernameString)` +- [Set the password](https://url.spec.whatwg.org/#set-the-password): `setThePassword(urlRecord, passwordString)` +- [Cannot have a username/password/port](https://url.spec.whatwg.org/#cannot-have-a-username-password-port): `cannotHaveAUsernamePasswordPort(urlRecord)` + +The `stateOverride` parameter is one of the following strings: + +- [`"scheme start"`](https://url.spec.whatwg.org/#scheme-start-state) +- [`"scheme"`](https://url.spec.whatwg.org/#scheme-state) +- [`"no scheme"`](https://url.spec.whatwg.org/#no-scheme-state) +- [`"special relative or authority"`](https://url.spec.whatwg.org/#special-relative-or-authority-state) +- [`"path or authority"`](https://url.spec.whatwg.org/#path-or-authority-state) +- [`"relative"`](https://url.spec.whatwg.org/#relative-state) +- [`"relative slash"`](https://url.spec.whatwg.org/#relative-slash-state) +- [`"special authority slashes"`](https://url.spec.whatwg.org/#special-authority-slashes-state) +- [`"special authority ignore slashes"`](https://url.spec.whatwg.org/#special-authority-ignore-slashes-state) +- [`"authority"`](https://url.spec.whatwg.org/#authority-state) +- [`"host"`](https://url.spec.whatwg.org/#host-state) +- [`"hostname"`](https://url.spec.whatwg.org/#hostname-state) +- [`"port"`](https://url.spec.whatwg.org/#port-state) +- [`"file"`](https://url.spec.whatwg.org/#file-state) +- [`"file slash"`](https://url.spec.whatwg.org/#file-slash-state) +- [`"file host"`](https://url.spec.whatwg.org/#file-host-state) +- [`"path start"`](https://url.spec.whatwg.org/#path-start-state) +- [`"path"`](https://url.spec.whatwg.org/#path-state) +- [`"cannot-be-a-base-URL path"`](https://url.spec.whatwg.org/#cannot-be-a-base-url-path-state) +- [`"query"`](https://url.spec.whatwg.org/#query-state) +- [`"fragment"`](https://url.spec.whatwg.org/#fragment-state) + +The URL record type has the following API: + +- [`scheme`](https://url.spec.whatwg.org/#concept-url-scheme) +- [`username`](https://url.spec.whatwg.org/#concept-url-username) +- [`password`](https://url.spec.whatwg.org/#concept-url-password) +- [`host`](https://url.spec.whatwg.org/#concept-url-host) +- [`port`](https://url.spec.whatwg.org/#concept-url-port) +- [`path`](https://url.spec.whatwg.org/#concept-url-path) (as an array) +- [`query`](https://url.spec.whatwg.org/#concept-url-query) +- [`fragment`](https://url.spec.whatwg.org/#concept-url-fragment) +- [`cannotBeABaseURL`](https://url.spec.whatwg.org/#url-cannot-be-a-base-url-flag) (as a boolean) + +These properties should be treated with care, as in general changing them will cause the URL record to be in an inconsistent state until the appropriate invocation of `basicURLParse` is used to fix it up. You can see examples of this in the URL Standard, where there are many step sequences like "4. Set context object’s url’s fragment to the empty string. 5. Basic URL parse _input_ with context object’s url as _url_ and fragment state as _state override_." In between those two steps, a URL record is in an unusable state. + +The return value of "failure" in the spec is represented by the string `"failure"`. That is, functions like `parseURL` and `basicURLParse` can return _either_ a URL record _or_ the string `"failure"`. diff --git a/node/node_modules/node-fetch/node_modules/whatwg-url/lib/URL-impl.js b/node/node_modules/node-fetch/node_modules/whatwg-url/lib/URL-impl.js new file mode 100644 index 0000000..dc7452c --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/whatwg-url/lib/URL-impl.js @@ -0,0 +1,200 @@ +"use strict"; +const usm = require("./url-state-machine"); + +exports.implementation = class URLImpl { + constructor(constructorArgs) { + const url = constructorArgs[0]; + const base = constructorArgs[1]; + + let parsedBase = null; + if (base !== undefined) { + parsedBase = usm.basicURLParse(base); + if (parsedBase === "failure") { + throw new TypeError("Invalid base URL"); + } + } + + const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase }); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + + this._url = parsedURL; + + // TODO: query stuff + } + + get href() { + return usm.serializeURL(this._url); + } + + set href(v) { + const parsedURL = usm.basicURLParse(v); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + + this._url = parsedURL; + } + + get origin() { + return usm.serializeURLOrigin(this._url); + } + + get protocol() { + return this._url.scheme + ":"; + } + + set protocol(v) { + usm.basicURLParse(v + ":", { url: this._url, stateOverride: "scheme start" }); + } + + get username() { + return this._url.username; + } + + set username(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + usm.setTheUsername(this._url, v); + } + + get password() { + return this._url.password; + } + + set password(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + usm.setThePassword(this._url, v); + } + + get host() { + const url = this._url; + + if (url.host === null) { + return ""; + } + + if (url.port === null) { + return usm.serializeHost(url.host); + } + + return usm.serializeHost(url.host) + ":" + usm.serializeInteger(url.port); + } + + set host(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + usm.basicURLParse(v, { url: this._url, stateOverride: "host" }); + } + + get hostname() { + if (this._url.host === null) { + return ""; + } + + return usm.serializeHost(this._url.host); + } + + set hostname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + usm.basicURLParse(v, { url: this._url, stateOverride: "hostname" }); + } + + get port() { + if (this._url.port === null) { + return ""; + } + + return usm.serializeInteger(this._url.port); + } + + set port(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + if (v === "") { + this._url.port = null; + } else { + usm.basicURLParse(v, { url: this._url, stateOverride: "port" }); + } + } + + get pathname() { + if (this._url.cannotBeABaseURL) { + return this._url.path[0]; + } + + if (this._url.path.length === 0) { + return ""; + } + + return "/" + this._url.path.join("/"); + } + + set pathname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + this._url.path = []; + usm.basicURLParse(v, { url: this._url, stateOverride: "path start" }); + } + + get search() { + if (this._url.query === null || this._url.query === "") { + return ""; + } + + return "?" + this._url.query; + } + + set search(v) { + // TODO: query stuff + + const url = this._url; + + if (v === "") { + url.query = null; + return; + } + + const input = v[0] === "?" ? v.substring(1) : v; + url.query = ""; + usm.basicURLParse(input, { url, stateOverride: "query" }); + } + + get hash() { + if (this._url.fragment === null || this._url.fragment === "") { + return ""; + } + + return "#" + this._url.fragment; + } + + set hash(v) { + if (v === "") { + this._url.fragment = null; + return; + } + + const input = v[0] === "#" ? v.substring(1) : v; + this._url.fragment = ""; + usm.basicURLParse(input, { url: this._url, stateOverride: "fragment" }); + } + + toJSON() { + return this.href; + } +}; diff --git a/node/node_modules/node-fetch/node_modules/whatwg-url/lib/URL.js b/node/node_modules/node-fetch/node_modules/whatwg-url/lib/URL.js new file mode 100644 index 0000000..78c7207 --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/whatwg-url/lib/URL.js @@ -0,0 +1,196 @@ +"use strict"; + +const conversions = require("webidl-conversions"); +const utils = require("./utils.js"); +const Impl = require(".//URL-impl.js"); + +const impl = utils.implSymbol; + +function URL(url) { + if (!this || this[impl] || !(this instanceof URL)) { + throw new TypeError("Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function."); + } + if (arguments.length < 1) { + throw new TypeError("Failed to construct 'URL': 1 argument required, but only " + arguments.length + " present."); + } + const args = []; + for (let i = 0; i < arguments.length && i < 2; ++i) { + args[i] = arguments[i]; + } + args[0] = conversions["USVString"](args[0]); + if (args[1] !== undefined) { + args[1] = conversions["USVString"](args[1]); + } + + module.exports.setup(this, args); +} + +URL.prototype.toJSON = function toJSON() { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + const args = []; + for (let i = 0; i < arguments.length && i < 0; ++i) { + args[i] = arguments[i]; + } + return this[impl].toJSON.apply(this[impl], args); +}; +Object.defineProperty(URL.prototype, "href", { + get() { + return this[impl].href; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].href = V; + }, + enumerable: true, + configurable: true +}); + +URL.prototype.toString = function () { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + return this.href; +}; + +Object.defineProperty(URL.prototype, "origin", { + get() { + return this[impl].origin; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "protocol", { + get() { + return this[impl].protocol; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].protocol = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "username", { + get() { + return this[impl].username; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].username = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "password", { + get() { + return this[impl].password; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].password = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "host", { + get() { + return this[impl].host; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].host = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "hostname", { + get() { + return this[impl].hostname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hostname = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "port", { + get() { + return this[impl].port; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].port = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "pathname", { + get() { + return this[impl].pathname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].pathname = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "search", { + get() { + return this[impl].search; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].search = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "hash", { + get() { + return this[impl].hash; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hash = V; + }, + enumerable: true, + configurable: true +}); + + +module.exports = { + is(obj) { + return !!obj && obj[impl] instanceof Impl.implementation; + }, + create(constructorArgs, privateData) { + let obj = Object.create(URL.prototype); + this.setup(obj, constructorArgs, privateData); + return obj; + }, + setup(obj, constructorArgs, privateData) { + if (!privateData) privateData = {}; + privateData.wrapper = obj; + + obj[impl] = new Impl.implementation(constructorArgs, privateData); + obj[impl][utils.wrapperSymbol] = obj; + }, + interface: URL, + expose: { + Window: { URL: URL }, + Worker: { URL: URL } + } +}; + diff --git a/node/node_modules/node-fetch/node_modules/whatwg-url/lib/public-api.js b/node/node_modules/node-fetch/node_modules/whatwg-url/lib/public-api.js new file mode 100644 index 0000000..932dcad --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/whatwg-url/lib/public-api.js @@ -0,0 +1,11 @@ +"use strict"; + +exports.URL = require("./URL").interface; +exports.serializeURL = require("./url-state-machine").serializeURL; +exports.serializeURLOrigin = require("./url-state-machine").serializeURLOrigin; +exports.basicURLParse = require("./url-state-machine").basicURLParse; +exports.setTheUsername = require("./url-state-machine").setTheUsername; +exports.setThePassword = require("./url-state-machine").setThePassword; +exports.serializeHost = require("./url-state-machine").serializeHost; +exports.serializeInteger = require("./url-state-machine").serializeInteger; +exports.parseURL = require("./url-state-machine").parseURL; diff --git a/node/node_modules/node-fetch/node_modules/whatwg-url/lib/url-state-machine.js b/node/node_modules/node-fetch/node_modules/whatwg-url/lib/url-state-machine.js new file mode 100644 index 0000000..27d977a --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/whatwg-url/lib/url-state-machine.js @@ -0,0 +1,1297 @@ +"use strict"; +const punycode = require("punycode"); +const tr46 = require("tr46"); + +const specialSchemes = { + ftp: 21, + file: null, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 +}; + +const failure = Symbol("failure"); + +function countSymbols(str) { + return punycode.ucs2.decode(str).length; +} + +function at(input, idx) { + const c = input[idx]; + return isNaN(c) ? undefined : String.fromCodePoint(c); +} + +function isASCIIDigit(c) { + return c >= 0x30 && c <= 0x39; +} + +function isASCIIAlpha(c) { + return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); +} + +function isASCIIAlphanumeric(c) { + return isASCIIAlpha(c) || isASCIIDigit(c); +} + +function isASCIIHex(c) { + return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); +} + +function isSingleDot(buffer) { + return buffer === "." || buffer.toLowerCase() === "%2e"; +} + +function isDoubleDot(buffer) { + buffer = buffer.toLowerCase(); + return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; +} + +function isWindowsDriveLetterCodePoints(cp1, cp2) { + return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); +} + +function isWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); +} + +function isNormalizedWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; +} + +function containsForbiddenHostCodePoint(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function containsForbiddenHostCodePointExcludingPercent(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function isSpecialScheme(scheme) { + return specialSchemes[scheme] !== undefined; +} + +function isSpecial(url) { + return isSpecialScheme(url.scheme); +} + +function defaultPort(scheme) { + return specialSchemes[scheme]; +} + +function percentEncode(c) { + let hex = c.toString(16).toUpperCase(); + if (hex.length === 1) { + hex = "0" + hex; + } + + return "%" + hex; +} + +function utf8PercentEncode(c) { + const buf = new Buffer(c); + + let str = ""; + + for (let i = 0; i < buf.length; ++i) { + str += percentEncode(buf[i]); + } + + return str; +} + +function utf8PercentDecode(str) { + const input = new Buffer(str); + const output = []; + for (let i = 0; i < input.length; ++i) { + if (input[i] !== 37) { + output.push(input[i]); + } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { + output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); + i += 2; + } else { + output.push(input[i]); + } + } + return new Buffer(output).toString(); +} + +function isC0ControlPercentEncode(c) { + return c <= 0x1F || c > 0x7E; +} + +const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); +function isPathPercentEncode(c) { + return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); +} + +const extraUserinfoPercentEncodeSet = + new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); +function isUserinfoPercentEncode(c) { + return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); +} + +function percentEncodeChar(c, encodeSetPredicate) { + const cStr = String.fromCodePoint(c); + + if (encodeSetPredicate(c)) { + return utf8PercentEncode(cStr); + } + + return cStr; +} + +function parseIPv4Number(input) { + let R = 10; + + if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { + input = input.substring(2); + R = 16; + } else if (input.length >= 2 && input.charAt(0) === "0") { + input = input.substring(1); + R = 8; + } + + if (input === "") { + return 0; + } + + const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); + if (regex.test(input)) { + return failure; + } + + return parseInt(input, R); +} + +function parseIPv4(input) { + const parts = input.split("."); + if (parts[parts.length - 1] === "") { + if (parts.length > 1) { + parts.pop(); + } + } + + if (parts.length > 4) { + return input; + } + + const numbers = []; + for (const part of parts) { + if (part === "") { + return input; + } + const n = parseIPv4Number(part); + if (n === failure) { + return input; + } + + numbers.push(n); + } + + for (let i = 0; i < numbers.length - 1; ++i) { + if (numbers[i] > 255) { + return failure; + } + } + if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { + return failure; + } + + let ipv4 = numbers.pop(); + let counter = 0; + + for (const n of numbers) { + ipv4 += n * Math.pow(256, 3 - counter); + ++counter; + } + + return ipv4; +} + +function serializeIPv4(address) { + let output = ""; + let n = address; + + for (let i = 1; i <= 4; ++i) { + output = String(n % 256) + output; + if (i !== 4) { + output = "." + output; + } + n = Math.floor(n / 256); + } + + return output; +} + +function parseIPv6(input) { + const address = [0, 0, 0, 0, 0, 0, 0, 0]; + let pieceIndex = 0; + let compress = null; + let pointer = 0; + + input = punycode.ucs2.decode(input); + + if (input[pointer] === 58) { + if (input[pointer + 1] !== 58) { + return failure; + } + + pointer += 2; + ++pieceIndex; + compress = pieceIndex; + } + + while (pointer < input.length) { + if (pieceIndex === 8) { + return failure; + } + + if (input[pointer] === 58) { + if (compress !== null) { + return failure; + } + ++pointer; + ++pieceIndex; + compress = pieceIndex; + continue; + } + + let value = 0; + let length = 0; + + while (length < 4 && isASCIIHex(input[pointer])) { + value = value * 0x10 + parseInt(at(input, pointer), 16); + ++pointer; + ++length; + } + + if (input[pointer] === 46) { + if (length === 0) { + return failure; + } + + pointer -= length; + + if (pieceIndex > 6) { + return failure; + } + + let numbersSeen = 0; + + while (input[pointer] !== undefined) { + let ipv4Piece = null; + + if (numbersSeen > 0) { + if (input[pointer] === 46 && numbersSeen < 4) { + ++pointer; + } else { + return failure; + } + } + + if (!isASCIIDigit(input[pointer])) { + return failure; + } + + while (isASCIIDigit(input[pointer])) { + const number = parseInt(at(input, pointer)); + if (ipv4Piece === null) { + ipv4Piece = number; + } else if (ipv4Piece === 0) { + return failure; + } else { + ipv4Piece = ipv4Piece * 10 + number; + } + if (ipv4Piece > 255) { + return failure; + } + ++pointer; + } + + address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; + + ++numbersSeen; + + if (numbersSeen === 2 || numbersSeen === 4) { + ++pieceIndex; + } + } + + if (numbersSeen !== 4) { + return failure; + } + + break; + } else if (input[pointer] === 58) { + ++pointer; + if (input[pointer] === undefined) { + return failure; + } + } else if (input[pointer] !== undefined) { + return failure; + } + + address[pieceIndex] = value; + ++pieceIndex; + } + + if (compress !== null) { + let swaps = pieceIndex - compress; + pieceIndex = 7; + while (pieceIndex !== 0 && swaps > 0) { + const temp = address[compress + swaps - 1]; + address[compress + swaps - 1] = address[pieceIndex]; + address[pieceIndex] = temp; + --pieceIndex; + --swaps; + } + } else if (compress === null && pieceIndex !== 8) { + return failure; + } + + return address; +} + +function serializeIPv6(address) { + let output = ""; + const seqResult = findLongestZeroSequence(address); + const compress = seqResult.idx; + let ignore0 = false; + + for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { + if (ignore0 && address[pieceIndex] === 0) { + continue; + } else if (ignore0) { + ignore0 = false; + } + + if (compress === pieceIndex) { + const separator = pieceIndex === 0 ? "::" : ":"; + output += separator; + ignore0 = true; + continue; + } + + output += address[pieceIndex].toString(16); + + if (pieceIndex !== 7) { + output += ":"; + } + } + + return output; +} + +function parseHost(input, isSpecialArg) { + if (input[0] === "[") { + if (input[input.length - 1] !== "]") { + return failure; + } + + return parseIPv6(input.substring(1, input.length - 1)); + } + + if (!isSpecialArg) { + return parseOpaqueHost(input); + } + + const domain = utf8PercentDecode(input); + const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); + if (asciiDomain === null) { + return failure; + } + + if (containsForbiddenHostCodePoint(asciiDomain)) { + return failure; + } + + const ipv4Host = parseIPv4(asciiDomain); + if (typeof ipv4Host === "number" || ipv4Host === failure) { + return ipv4Host; + } + + return asciiDomain; +} + +function parseOpaqueHost(input) { + if (containsForbiddenHostCodePointExcludingPercent(input)) { + return failure; + } + + let output = ""; + const decoded = punycode.ucs2.decode(input); + for (let i = 0; i < decoded.length; ++i) { + output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); + } + return output; +} + +function findLongestZeroSequence(arr) { + let maxIdx = null; + let maxLen = 1; // only find elements > 1 + let currStart = null; + let currLen = 0; + + for (let i = 0; i < arr.length; ++i) { + if (arr[i] !== 0) { + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + currStart = null; + currLen = 0; + } else { + if (currStart === null) { + currStart = i; + } + ++currLen; + } + } + + // if trailing zeros + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + return { + idx: maxIdx, + len: maxLen + }; +} + +function serializeHost(host) { + if (typeof host === "number") { + return serializeIPv4(host); + } + + // IPv6 serializer + if (host instanceof Array) { + return "[" + serializeIPv6(host) + "]"; + } + + return host; +} + +function trimControlChars(url) { + return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); +} + +function trimTabAndNewline(url) { + return url.replace(/\u0009|\u000A|\u000D/g, ""); +} + +function shortenPath(url) { + const path = url.path; + if (path.length === 0) { + return; + } + if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { + return; + } + + path.pop(); +} + +function includesCredentials(url) { + return url.username !== "" || url.password !== ""; +} + +function cannotHaveAUsernamePasswordPort(url) { + return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; +} + +function isNormalizedWindowsDriveLetter(string) { + return /^[A-Za-z]:$/.test(string); +} + +function URLStateMachine(input, base, encodingOverride, url, stateOverride) { + this.pointer = 0; + this.input = input; + this.base = base || null; + this.encodingOverride = encodingOverride || "utf-8"; + this.stateOverride = stateOverride; + this.url = url; + this.failure = false; + this.parseError = false; + + if (!this.url) { + this.url = { + scheme: "", + username: "", + password: "", + host: null, + port: null, + path: [], + query: null, + fragment: null, + + cannotBeABaseURL: false + }; + + const res = trimControlChars(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + } + + const res = trimTabAndNewline(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + + this.state = stateOverride || "scheme start"; + + this.buffer = ""; + this.atFlag = false; + this.arrFlag = false; + this.passwordTokenSeenFlag = false; + + this.input = punycode.ucs2.decode(this.input); + + for (; this.pointer <= this.input.length; ++this.pointer) { + const c = this.input[this.pointer]; + const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); + + // exec state machine + const ret = this["parse " + this.state](c, cStr); + if (!ret) { + break; // terminate algorithm + } else if (ret === failure) { + this.failure = true; + break; + } + } +} + +URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { + if (isASCIIAlpha(c)) { + this.buffer += cStr.toLowerCase(); + this.state = "scheme"; + } else if (!this.stateOverride) { + this.state = "no scheme"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { + if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { + this.buffer += cStr.toLowerCase(); + } else if (c === 58) { + if (this.stateOverride) { + if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { + return false; + } + + if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { + return false; + } + + if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { + return false; + } + + if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { + return false; + } + } + this.url.scheme = this.buffer; + this.buffer = ""; + if (this.stateOverride) { + return false; + } + if (this.url.scheme === "file") { + if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { + this.parseError = true; + } + this.state = "file"; + } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { + this.state = "special relative or authority"; + } else if (isSpecial(this.url)) { + this.state = "special authority slashes"; + } else if (this.input[this.pointer + 1] === 47) { + this.state = "path or authority"; + ++this.pointer; + } else { + this.url.cannotBeABaseURL = true; + this.url.path.push(""); + this.state = "cannot-be-a-base-URL path"; + } + } else if (!this.stateOverride) { + this.buffer = ""; + this.state = "no scheme"; + this.pointer = -1; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { + if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { + return failure; + } else if (this.base.cannotBeABaseURL && c === 35) { + this.url.scheme = this.base.scheme; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.url.cannotBeABaseURL = true; + this.state = "fragment"; + } else if (this.base.scheme === "file") { + this.state = "file"; + --this.pointer; + } else { + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { + if (c === 47) { + this.state = "authority"; + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative"] = function parseRelative(c) { + this.url.scheme = this.base.scheme; + if (isNaN(c)) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 47) { + this.state = "relative slash"; + } else if (c === 63) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else if (isSpecial(this.url) && c === 92) { + this.parseError = true; + this.state = "relative slash"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(0, this.base.path.length - 1); + + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { + if (isSpecial(this.url) && (c === 47 || c === 92)) { + if (c === 92) { + this.parseError = true; + } + this.state = "special authority ignore slashes"; + } else if (c === 47) { + this.state = "authority"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "special authority ignore slashes"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { + if (c !== 47 && c !== 92) { + this.state = "authority"; + --this.pointer; + } else { + this.parseError = true; + } + + return true; +}; + +URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { + if (c === 64) { + this.parseError = true; + if (this.atFlag) { + this.buffer = "%40" + this.buffer; + } + this.atFlag = true; + + // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars + const len = countSymbols(this.buffer); + for (let pointer = 0; pointer < len; ++pointer) { + const codePoint = this.buffer.codePointAt(pointer); + + if (codePoint === 58 && !this.passwordTokenSeenFlag) { + this.passwordTokenSeenFlag = true; + continue; + } + const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); + if (this.passwordTokenSeenFlag) { + this.url.password += encodedCodePoints; + } else { + this.url.username += encodedCodePoints; + } + } + this.buffer = ""; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + if (this.atFlag && this.buffer === "") { + this.parseError = true; + return failure; + } + this.pointer -= countSymbols(this.buffer) + 1; + this.buffer = ""; + this.state = "host"; + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse hostname"] = +URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { + if (this.stateOverride && this.url.scheme === "file") { + --this.pointer; + this.state = "file host"; + } else if (c === 58 && !this.arrFlag) { + if (this.buffer === "") { + this.parseError = true; + return failure; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "port"; + if (this.stateOverride === "hostname") { + return false; + } + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + --this.pointer; + if (isSpecial(this.url) && this.buffer === "") { + this.parseError = true; + return failure; + } else if (this.stateOverride && this.buffer === "" && + (includesCredentials(this.url) || this.url.port !== null)) { + this.parseError = true; + return false; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "path start"; + if (this.stateOverride) { + return false; + } + } else { + if (c === 91) { + this.arrFlag = true; + } else if (c === 93) { + this.arrFlag = false; + } + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { + if (isASCIIDigit(c)) { + this.buffer += cStr; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92) || + this.stateOverride) { + if (this.buffer !== "") { + const port = parseInt(this.buffer); + if (port > Math.pow(2, 16) - 1) { + this.parseError = true; + return failure; + } + this.url.port = port === defaultPort(this.url.scheme) ? null : port; + this.buffer = ""; + } + if (this.stateOverride) { + return false; + } + this.state = "path start"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); + +URLStateMachine.prototype["parse file"] = function parseFile(c) { + this.url.scheme = "file"; + + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file slash"; + } else if (this.base !== null && this.base.scheme === "file") { + if (isNaN(c)) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 63) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points + !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || + (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points + !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + shortenPath(this.url); + } else { + this.parseError = true; + } + + this.state = "path"; + --this.pointer; + } + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file host"; + } else { + if (this.base !== null && this.base.scheme === "file") { + if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { + this.url.path.push(this.base.path[0]); + } else { + this.url.host = this.base.host; + } + } + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { + if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { + --this.pointer; + if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { + this.parseError = true; + this.state = "path"; + } else if (this.buffer === "") { + this.url.host = ""; + if (this.stateOverride) { + return false; + } + this.state = "path start"; + } else { + let host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + if (host === "localhost") { + host = ""; + } + this.url.host = host; + + if (this.stateOverride) { + return false; + } + + this.buffer = ""; + this.state = "path start"; + } + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { + if (isSpecial(this.url)) { + if (c === 92) { + this.parseError = true; + } + this.state = "path"; + + if (c !== 47 && c !== 92) { + --this.pointer; + } + } else if (!this.stateOverride && c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (!this.stateOverride && c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else if (c !== undefined) { + this.state = "path"; + if (c !== 47) { + --this.pointer; + } + } + + return true; +}; + +URLStateMachine.prototype["parse path"] = function parsePath(c) { + if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || + (!this.stateOverride && (c === 63 || c === 35))) { + if (isSpecial(this.url) && c === 92) { + this.parseError = true; + } + + if (isDoubleDot(this.buffer)) { + shortenPath(this.url); + if (c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } + } else if (isSingleDot(this.buffer) && c !== 47 && + !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } else if (!isSingleDot(this.buffer)) { + if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { + if (this.url.host !== "" && this.url.host !== null) { + this.parseError = true; + this.url.host = ""; + } + this.buffer = this.buffer[0] + ":"; + } + this.url.path.push(this.buffer); + } + this.buffer = ""; + if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { + while (this.url.path.length > 1 && this.url.path[0] === "") { + this.parseError = true; + this.url.path.shift(); + } + } + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += percentEncodeChar(c, isPathPercentEncode); + } + + return true; +}; + +URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else { + // TODO: Add: not a URL code point + if (!isNaN(c) && c !== 37) { + this.parseError = true; + } + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + if (!isNaN(c)) { + this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); + } + } + + return true; +}; + +URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { + if (isNaN(c) || (!this.stateOverride && c === 35)) { + if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { + this.encodingOverride = "utf-8"; + } + + const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || + buffer[i] === 0x3C || buffer[i] === 0x3E) { + this.url.query += percentEncode(buffer[i]); + } else { + this.url.query += String.fromCodePoint(buffer[i]); + } + } + + this.buffer = ""; + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { + if (isNaN(c)) { // do nothing + } else if (c === 0x0) { + this.parseError = true; + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); + } + + return true; +}; + +function serializeURL(url, excludeFragment) { + let output = url.scheme + ":"; + if (url.host !== null) { + output += "//"; + + if (url.username !== "" || url.password !== "") { + output += url.username; + if (url.password !== "") { + output += ":" + url.password; + } + output += "@"; + } + + output += serializeHost(url.host); + + if (url.port !== null) { + output += ":" + url.port; + } + } else if (url.host === null && url.scheme === "file") { + output += "//"; + } + + if (url.cannotBeABaseURL) { + output += url.path[0]; + } else { + for (const string of url.path) { + output += "/" + string; + } + } + + if (url.query !== null) { + output += "?" + url.query; + } + + if (!excludeFragment && url.fragment !== null) { + output += "#" + url.fragment; + } + + return output; +} + +function serializeOrigin(tuple) { + let result = tuple.scheme + "://"; + result += serializeHost(tuple.host); + + if (tuple.port !== null) { + result += ":" + tuple.port; + } + + return result; +} + +module.exports.serializeURL = serializeURL; + +module.exports.serializeURLOrigin = function (url) { + // https://url.spec.whatwg.org/#concept-url-origin + switch (url.scheme) { + case "blob": + try { + return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); + } catch (e) { + // serializing an opaque origin returns "null" + return "null"; + } + case "ftp": + case "gopher": + case "http": + case "https": + case "ws": + case "wss": + return serializeOrigin({ + scheme: url.scheme, + host: url.host, + port: url.port + }); + case "file": + // spec says "exercise to the reader", chrome says "file://" + return "file://"; + default: + // serializing an opaque origin returns "null" + return "null"; + } +}; + +module.exports.basicURLParse = function (input, options) { + if (options === undefined) { + options = {}; + } + + const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); + if (usm.failure) { + return "failure"; + } + + return usm.url; +}; + +module.exports.setTheUsername = function (url, username) { + url.username = ""; + const decoded = punycode.ucs2.decode(username); + for (let i = 0; i < decoded.length; ++i) { + url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.setThePassword = function (url, password) { + url.password = ""; + const decoded = punycode.ucs2.decode(password); + for (let i = 0; i < decoded.length; ++i) { + url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.serializeHost = serializeHost; + +module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; + +module.exports.serializeInteger = function (integer) { + return String(integer); +}; + +module.exports.parseURL = function (input, options) { + if (options === undefined) { + options = {}; + } + + // We don't handle blobs, so this just delegates: + return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); +}; diff --git a/node/node_modules/node-fetch/node_modules/whatwg-url/lib/utils.js b/node/node_modules/node-fetch/node_modules/whatwg-url/lib/utils.js new file mode 100644 index 0000000..a562009 --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/whatwg-url/lib/utils.js @@ -0,0 +1,20 @@ +"use strict"; + +module.exports.mixin = function mixin(target, source) { + const keys = Object.getOwnPropertyNames(source); + for (let i = 0; i < keys.length; ++i) { + Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); + } +}; + +module.exports.wrapperSymbol = Symbol("wrapper"); +module.exports.implSymbol = Symbol("impl"); + +module.exports.wrapperForImpl = function (impl) { + return impl[module.exports.wrapperSymbol]; +}; + +module.exports.implForWrapper = function (wrapper) { + return wrapper[module.exports.implSymbol]; +}; + diff --git a/node/node_modules/node-fetch/node_modules/whatwg-url/package.json b/node/node_modules/node-fetch/node_modules/whatwg-url/package.json new file mode 100644 index 0000000..fce35ae --- /dev/null +++ b/node/node_modules/node-fetch/node_modules/whatwg-url/package.json @@ -0,0 +1,32 @@ +{ + "name": "whatwg-url", + "version": "5.0.0", + "description": "An implementation of the WHATWG URL Standard's URL API and parsing machinery", + "main": "lib/public-api.js", + "files": [ + "lib/" + ], + "author": "Sebastian Mayr ", + "license": "MIT", + "repository": "jsdom/whatwg-url", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + }, + "devDependencies": { + "eslint": "^2.6.0", + "istanbul": "~0.4.3", + "mocha": "^2.2.4", + "recast": "~0.10.29", + "request": "^2.55.0", + "webidl2js": "^3.0.2" + }, + "scripts": { + "build": "node scripts/transform.js && node scripts/convert-idl.js", + "coverage": "istanbul cover node_modules/mocha/bin/_mocha", + "lint": "eslint .", + "prepublish": "npm run build", + "pretest": "node scripts/get-latest-platform-tests.js && npm run build", + "test": "mocha" + } +} diff --git a/node/node_modules/node-fetch/package.json b/node/node_modules/node-fetch/package.json new file mode 100644 index 0000000..e0be176 --- /dev/null +++ b/node/node_modules/node-fetch/package.json @@ -0,0 +1,89 @@ +{ + "name": "node-fetch", + "version": "2.7.0", + "description": "A light-weight module that brings window.fetch to node.js", + "main": "lib/index.js", + "browser": "./browser.js", + "module": "lib/index.mjs", + "files": [ + "lib/index.js", + "lib/index.mjs", + "lib/index.es.js", + "browser.js" + ], + "engines": { + "node": "4.x || >=6.0.0" + }, + "scripts": { + "build": "cross-env BABEL_ENV=rollup rollup -c", + "prepare": "npm run build", + "test": "cross-env BABEL_ENV=test mocha --require babel-register --throw-deprecation test/test.js", + "report": "cross-env BABEL_ENV=coverage nyc --reporter lcov --reporter text mocha -R spec test/test.js", + "coverage": "cross-env BABEL_ENV=coverage nyc --reporter json --reporter text mocha -R spec test/test.js && codecov -f coverage/coverage-final.json" + }, + "repository": { + "type": "git", + "url": "https://github.com/bitinn/node-fetch.git" + }, + "keywords": [ + "fetch", + "http", + "promise" + ], + "author": "David Frank", + "license": "MIT", + "bugs": { + "url": "https://github.com/bitinn/node-fetch/issues" + }, + "homepage": "https://github.com/bitinn/node-fetch", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + }, + "devDependencies": { + "@ungap/url-search-params": "^0.1.2", + "abort-controller": "^1.1.0", + "abortcontroller-polyfill": "^1.3.0", + "babel-core": "^6.26.3", + "babel-plugin-istanbul": "^4.1.6", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-polyfill": "^6.26.0", + "babel-preset-env": "1.4.0", + "babel-register": "^6.16.3", + "chai": "^3.5.0", + "chai-as-promised": "^7.1.1", + "chai-iterator": "^1.1.1", + "chai-string": "~1.3.0", + "codecov": "3.3.0", + "cross-env": "^5.2.0", + "form-data": "^2.3.3", + "is-builtin-module": "^1.0.0", + "mocha": "^5.0.0", + "nyc": "11.9.0", + "parted": "^0.1.1", + "promise": "^8.0.3", + "resumer": "0.0.0", + "rollup": "^0.63.4", + "rollup-plugin-babel": "^3.0.7", + "string-to-arraybuffer": "^1.0.2", + "teeny-request": "3.7.0" + }, + "release": { + "branches": [ + "+([0-9]).x", + "main", + "next", + { + "name": "beta", + "prerelease": true + } + ] + } +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/LICENSE b/node/node_modules/tencentcloud-sdk-nodejs-common/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/README.md b/node/node_modules/tencentcloud-sdk-nodejs-common/README.md new file mode 100644 index 0000000..19a0390 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/README.md @@ -0,0 +1,147 @@ +# 简介 + +欢迎使用腾讯云开发者工具套件(SDK),NODEJS SDK 4.0 是云 API 3.0 平台的配套工具。目前已经支持 cvm、vpc、cbs 等产品,后续所有的云服务产品都会接入进来。新版 SDK 实现了统一化,具有各个语言版本的 SDK 使用方法相同,接口调用方式相同,统一的错误码和返回包格式这些优点。 +为方便 NODEJS 开发者调试和接入腾讯云产品 API,这里向您介绍适用于 NODEJS 的腾讯云开发工具包,并提供首次使用开发工具包的简单示例。让您快速获取腾讯云 NODEJS SDK 并开始调用。 + +# 依赖环境 + +1. NODEJS 10.0.0 版本及以上 +2. 从腾讯云控制台 开通相应产品 +3. 获取 SecretID、SecretKey 以及调用地址(endpoint),endpoint 一般形式为\*.tencentcloudapi.com,如 CVM 的调用地址为 cvm.tencentcloudapi.com,具体参考各产品说明。 + +# 获取安装 + +安装 NODEJS SDK 前,先获取安全凭证。在第一次使用云 API 之前,用户首先需要在腾讯云控制台上申请安全凭证,安全凭证包括 SecretID 和 SecretKey, SecretID 是用于标识 API 调用者的身份,SecretKey 是用于加密签名字符串和服务器端验证签名字符串的密钥。SecretKey 必须严格保管,避免泄露。 + +## 通过 Npm 安装 + +通过 npm 获取安装是使用 NODEJS SDK 的推荐方法,npm 是 NODEJS 的包管理工具。关于 npm 详细可参考[ npm 官网](https://www.npmjs.com/) 。 + +1. 执行以下安装命令: + > npm install tencentcloud-sdk-nodejs --save +2. 在您的代码中引用对应模块代码,可参考示例。 +3. 如上引用方式会将腾讯云所有产品sdk下载到本地,可以将tencentcloud-sdk-nodejs换成tencentcloud-sdk-nodejs-cvm/cbs/vpc等,即可引用特定产品的sdk,代码中可将require("tencentcloud-sdk-nodejs")改为require("tencentcloud-sdk-nodejs-cvm/cbs/vpc"),其余不变,可参考示例,可大大节省存储空间。 + +## 通过源码包安装 + +1. 前往 [Github 仓库](https://github.com/tencentcloud/tencentcloud-sdk-nodejs) 或者 [Gitee 仓库](https://gitee.com/tencentcloud/tencentcloud-sdk-nodejs) 下载源码压缩包。 +2. 解压源码包到您项目合适的位置,例如 `sdk/tencentcloud-sdk-nodejs`。 +3. 执行 `npm install ./sdk/tencentcloud-sdk-nodejs`。 +4. 使用 `require("tencentcloud-sdk-nodejs")` 的方式引入sdk,具体可参考示例。 + +# 示例 + +```js +const tencentcloud = require("tencentcloud-sdk-nodejs") + +// 导入对应产品模块的client models。 +const CvmClient = tencentcloud.cvm.v20170312.Client + +// 实例化要请求产品(以cvm为例)的client对象 +const client = new CvmClient({ + // 为了保护密钥安全,建议将密钥设置在环境变量中或者配置文件中,请参考本文凭证管理章节。 + // 硬编码密钥到代码中有可能随代码泄露而暴露,有安全隐患,并不推荐。 + credential: { + secretId: process.env.TENCENTCLOUD_SECRET_ID, + secretKey: process.env.TENCENTCLOUD_SECRET_KEY, + }, + // 产品地域 + region: "ap-shanghai", + // 可选配置实例 + profile: { + signMethod: "TC3-HMAC-SHA256", // 签名方法 + httpProfile: { + reqMethod: "POST", // 请求方法 + reqTimeout: 30, // 请求超时时间,默认60s + headers: { + // 自定义 header + }, + // proxy: "http://127.0.0.1:8899" // http请求代理 + }, + }, +}) +// 通过client对象调用想要访问的接口(Action),需要传入请求对象(Params)以及响应回调函数 +// 即:client.Action(Params).then(res => console.log(res), err => console.error(err)) +// 如:查询云服务器可用区列表 +client.DescribeZones().then( + (data) => { + console.log(data) + }, + (err) => { + console.error("error", err) + } +) +``` + +在支持 typescript 项目中,采用如下方式调用 + +```js +import * as tencentcloud from "tencentcloud-sdk-nodejs" + +const CvmClient = tencentcloud.cvm.v20170312.Client + +// ... +``` + +实例化`Client` 的入参支持 `clientConfig` 数据结构和说明 详见 [ClientConfig](https://github.com/TencentCloud/tencentcloud-sdk-nodejs/blob/master/src/common/interface.ts) + +## 更多示例 + +更丰富的使用 demo 请在 examples 目录中寻找。 + +# 相关配置 + +## 代理 + +如果是有代理的环境下,需要配置代理,请在创建Client时传入 [profile.httpProfile.proxy](https://github.com/TencentCloud/tencentcloud-sdk-nodejs/blob/master/src/common/interface.ts#L78) 参数,或设置系统环境变量 `http_proxy` ,否则可能无法正常调用,抛出连接超时的异常。 + +# 凭证管理 + +除显式传入凭证外,从 `v4.0.506` 起支持 [腾讯云实例角色](https://cloud.tencent.com/document/product/213/47668) + +在您为实例绑定角色后,您可以在实例中访问相关元数据接口获取临时凭证。用法可参考 [js示例代码](./examples/cvm_role.js) 或 [ts示例代码](./examples/cvm_role.ts) +```javascript +// ... +const CvmRoleCredential = require("tencentcloud-sdk-nodejs/tencentcloud/common/cvm_role_credential").default + +new XxxClient({ + // ... + credential: new CvmRoleCredential(), + // ... +}) +``` + +# 旧版 SDK + +我们推荐使用新版 NODEJS SDK,如果一定要用旧版 SDK,请前往[github 仓库](https://github.com/CFETeam/qcloudapi-sdk)下载。 + +# 常见问题 +- webpack打包出错/浏览器报错 + + 请**务必不要**将此sdk直接用于web前端(包括小程序等),暴露密钥在这些环境非常不安全。 + + 正确的做法是在自己的服务端引用此sdk,并保存好密钥,做好请求鉴权;前端再调用服务端执行业务流程。 + +- `The "original" argument must be of type Function.` + + 通常是因为nodejs版本低于 `v10` ,或处于非node环境,请再次确认执行环境。 + +- 请求不通 + + 设置环境变量 `NODE_DEBUG=http` 来开启请求日志输出来定位问题,例如: + ```sh + # MacOS + NODE_DEBUG=http node app.js + # windows cmd + set NODE_DEBUG=http & node app.js + # windows powershell + $env:NODE_DEBUG='http' ; node app.js + ``` + 如需要配置代理,请查阅 [代理](#代理),或设置环境变量 `http_proxy`,例如: + ```sh + # MacOS + http_proxy=http://代理地址:代理端口 node app.js + ``` + +- 整数类型值超出 JavaScript 最大安全整数 + 使用新的数据类型 `BigInt` diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/index.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/index.d.ts new file mode 100644 index 0000000..feb2f7f --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/index.d.ts @@ -0,0 +1,2 @@ +import * as tencentcloud from './tencentcloud'; +export default tencentcloud; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/index.js b/node/node_modules/tencentcloud-sdk-nodejs-common/index.js new file mode 100644 index 0000000..9d47dd4 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/index.js @@ -0,0 +1,6 @@ +'use strict' +Object.defineProperty(exports, '__esModule', { value: true }) +const tslib_1 = require('tslib') +const tencentcloud = tslib_1.__importStar(require('./tencentcloud')) +exports.default = tencentcloud +//# sourceMappingURL=index.js.map diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/package.json b/node/node_modules/tencentcloud-sdk-nodejs-common/package.json new file mode 100644 index 0000000..0f1c100 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/package.json @@ -0,0 +1,57 @@ +{ + "name": "tencentcloud-sdk-nodejs-common", + "version": "4.0.813", + "description": "Tencent Cloud API NODEJS SDK", + "main": "tencentcloud/index.js", + "scripts": { + "test": "mocha -t 10000", + "build": "tsc", + "prettier": "prettier --config prettier.config.js --write 'src/**/*.{tsx,ts,jsx,js,css,json,vue}'" + }, + "engines": { + "node": ">=10" + }, + "keywords": [ + "tencentcloudapi", + "tencentcloud", + "qcloud", + "sdk", + "js", + "nodejs" + ], + "author": "tencentcloudapi", + "license": "Apache-2.0", + "dependencies": { + "form-data": "^3.0.0", + "get-stream": "^6.0.0", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "json-bigint": "^1.0.0", + "node-fetch": "^2.2.0", + "tslib": "1.13.0" + }, + "directories": { + "example": "examples", + "lib": "lib" + }, + "repository": { + "type": "git", + "url": "https://github.com/tencentcloud/tencentcloud-sdk-nodejs" + }, + "devDependencies": { + "babel-eslint": "^10.0.2", + "eslint-plugin-react": "^7.17.0", + "@types/form-data": "^2.5.0", + "@types/json-bigint": "^1.0.1", + "@types/node": "^14.0.26", + "@types/node-fetch": "^2.5.7", + "@typescript-eslint/eslint-plugin": "^2.34.0", + "@typescript-eslint/parser": "^2.34.0", + "chai": "^4.2.0", + "eslint": "^6.8.0", + "mocha": "^8.1.1", + "prettier": "^2.3.0", + "ts-node": "^8.10.2", + "typescript": "^3.9.7" + } +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/prettier.config.js b/node/node_modules/tencentcloud-sdk-nodejs-common/prettier.config.js new file mode 100644 index 0000000..5378237 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/prettier.config.js @@ -0,0 +1,38 @@ +// prettier.config.js +module.exports = { + // 一行最多 100 字符 + printWidth: 100, + // 使用 4 个空格缩进 + tabWidth: 2, + // 不使用缩进符,而使用空格 + useTabs: false, + // 行尾需要有分号 + semi: false, + // 使用单引号 + singleQuote: false, + // 对象的 key 仅在必要时用引号 + quoteProps: "as-needed", + // jsx 不使用单引号,而使用双引号 + jsxSingleQuote: false, + // 末尾不需要逗号 + trailingComma: "es5", + // 大括号内的首尾需要空格 + bracketSpacing: true, + // jsx 标签的反尖括号需要换行 + jsxBracketSameLine: false, + // 箭头函数,只有一个参数的时候,也需要括号 + arrowParens: "always", + // 每个文件格式化的范围是文件的全部内容 + rangeStart: 0, + rangeEnd: Infinity, + // 不需要写文件开头的 @prettier + requirePragma: false, + // 不需要自动在文件开头插入 @prettier + insertPragma: false, + // 使用默认的折行标准 + proseWrap: "preserve", + // 根据显示样式决定 html 要不要折行 + htmlWhitespaceSensitivity: "css", + // 换行符使用 lf + endOfLine: "lf", +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/products.md b/node/node_modules/tencentcloud-sdk-nodejs-common/products.md new file mode 100644 index 0000000..cb9c292 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/products.md @@ -0,0 +1,246 @@ +| 包名 | 产品中文名 | 更新时间 | +|-|-|-| +| aa | [活动防刷](https://cloud.tencent.com/document/product/1189) | 2023-05-18 01:01:13 | +| aai | [](https://cloud.tencent.com/document/product) | 2019-08-08 23:15:13 | +| acp | [应用合规平台](https://cloud.tencent.com/document/product/1553) | 2024-03-12 01:07:35 | +| advisor | [云顾问](https://cloud.tencent.com/document/product/1264) | 2024-03-12 01:07:39 | +| af | [借贷反欺诈](https://cloud.tencent.com/document/product/668) | 2024-03-14 01:07:34 | +| afc | [定制建模](https://cloud.tencent.com/document/product/1029) | 2024-03-15 01:07:29 | +| aiart | [大模型图像创作引擎](https://cloud.tencent.com/document/product/1668) | 2024-03-13 01:07:42 | +| ame | [正版曲库直通车](https://cloud.tencent.com/document/product/1155) | 2023-08-17 01:06:14 | +| ams | [音频内容安全](https://cloud.tencent.com/document/product/1219) | 2024-03-12 01:07:46 | +| anicloud | [动效素材服务](https://cloud.tencent.com/document/product/1641) | 2023-05-18 01:01:53 | +| antiddos | [T-Sec-DDoS防护(Anti-DDoS)](https://cloud.tencent.com/document/product/297) | 2024-03-12 01:07:50 | +| apcas | [汽车精准获客服务](https://cloud.tencent.com/document/product/1244) | 2022-04-04 06:05:36 | +| ape | [正版图库直通车](https://cloud.tencent.com/document/product/1181) | 2022-04-04 06:05:40 | +| api | [云 API](https://cloud.tencent.com/document/product/1278) | 2023-01-05 01:02:52 | +| apigateway | [API 网关](https://cloud.tencent.com/document/product/628) | 2024-03-12 01:08:27 | +| apm | [应用性能监控](https://cloud.tencent.com/document/product/1463) | 2024-03-12 01:09:06 | +| as | [弹性伸缩](https://cloud.tencent.com/document/product/377) | 2024-03-12 01:09:11 | +| asr | [语音识别](https://cloud.tencent.com/document/product/1093) | 2024-03-12 01:09:34 | +| asw | [应用与服务编排工作流](https://cloud.tencent.com/document/product/1272) | 2023-05-18 01:04:02 | +| ba | [ICP备案](https://cloud.tencent.com/document/product/243) | 2024-03-12 01:09:45 | +| batch | [批量计算](https://cloud.tencent.com/document/product/599) | 2024-03-12 01:09:46 | +| bda | [人体分析](https://cloud.tencent.com/document/product/1208) | 2024-03-12 01:09:59 | +| bi | [商业智能分析 BI](https://cloud.tencent.com/document/product/590) | 2024-03-12 01:10:06 | +| billing | [费用中心](https://cloud.tencent.com/document/product/555) | 2024-03-12 01:10:17 | +| bizlive | [商业直播](https://cloud.tencent.com/document/product) | 2020-03-10 01:08:07 | +| bm | [黑石物理服务器CPM](https://cloud.tencent.com/document/product/386) | 2024-03-12 19:49:25 | +| bma | [品牌经营管家](https://cloud.tencent.com/document/product/1296) | 2024-03-12 01:10:49 | +| bmeip | [黑石弹性公网IP](https://cloud.tencent.com/document/product/1028) | 2024-03-12 01:10:54 | +| bmlb | [黑石负载均衡](https://cloud.tencent.com/document/product/1027) | 2024-03-12 01:11:02 | +| bmvpc | [黑石私有网络](https://cloud.tencent.com/document/product/1024) | 2024-03-12 01:11:28 | +| bpaas | [商业流程服务](https://cloud.tencent.com/document/product/1083) | 2024-03-12 01:11:48 | +| bri | [业务风险情报](https://cloud.tencent.com/document/product/1064) | 2024-03-12 01:11:50 | +| bsca | [二进制软件成分分析](https://cloud.tencent.com/document/product/1483) | 2024-03-12 01:11:51 | +| btoe | [区块链可信取证](https://cloud.tencent.com/document/product/1259) | 2024-03-12 01:11:54 | +| cam | [访问管理](https://cloud.tencent.com/document/product/598) | 2024-03-12 19:49:56 | +| captcha | [验证码](https://cloud.tencent.com/document/product/1110) | 2024-03-12 01:12:18 | +| car | [应用云渲染](https://cloud.tencent.com/document/product/1547) | 2024-03-12 01:12:25 | +| cat | [云拨测](https://cloud.tencent.com/document/product/280) | 2024-03-13 01:09:29 | +| cbs | [云硬盘](https://cloud.tencent.com/document/product/362) | 2024-03-12 01:12:33 | +| ccc | [云联络中心](https://cloud.tencent.com/document/product/679) | 2024-03-13 01:09:37 | +| cdb | [云数据库 MySQL](https://cloud.tencent.com/document/product/236) | 2024-03-13 01:09:46 | +| cdc | [本地专用集群](https://cloud.tencent.com/document/product/1346) | 2024-03-12 01:14:14 | +| cdn | [内容分发网络 CDN](https://cloud.tencent.com/document/product/228) | 2024-03-15 01:09:39 | +| cds | [T-Sec-数据安全审计(DSA)](https://cloud.tencent.com/document/product/856) | 2024-03-12 01:14:59 | +| cdwch | [云数据仓库 ClickHouse](https://cloud.tencent.com/document/product/1299) | 2024-03-12 01:15:02 | +| cdwdoris | [腾讯云数据仓库 TCHouse-D](https://cloud.tencent.com/document/product/1387) | 2024-03-12 01:15:12 | +| cdwpg | [云数据仓库 PostgreSQL](https://cloud.tencent.com/document/product/878) | 2024-03-12 01:15:19 | +| cfg | [混沌演练平台](https://cloud.tencent.com/document/product/1500) | 2024-03-12 01:15:23 | +| cfs | [文件存储](https://cloud.tencent.com/document/product/582) | 2024-03-12 01:15:29 | +| cfw | [云防火墙](https://cloud.tencent.com/document/product/1132) | 2024-03-12 01:15:46 | +| chdfs | [云 HDFS](https://cloud.tencent.com/document/product/1105) | 2024-03-12 01:16:36 | +| ciam | [账号风控平台](https://cloud.tencent.com/document/product/1441) | 2024-03-12 01:16:46 | +| cii | [智能保险助手](https://cloud.tencent.com/document/product/1368) | 2023-05-18 01:12:07 | +| cim | [](https://cloud.tencent.com/document/product) | 2019-05-16 17:21:18 | +| cis | [](https://cloud.tencent.com/document/product) | 2018-06-07 15:01:42 | +| ckafka | [消息队列 CKafka 版](https://cloud.tencent.com/document/product/597) | 2024-03-12 01:16:57 | +| clb | [负载均衡](https://cloud.tencent.com/document/product/214) | 2024-03-12 19:50:19 | +| cloudaudit | [操作审计](https://cloud.tencent.com/document/product/629) | 2024-01-15 01:09:37 | +| cloudhsm | [云加密机](https://cloud.tencent.com/document/product/639) | 2024-03-12 01:17:48 | +| cloudstudio | [Cloud Studio(云端 IDE)](https://cloud.tencent.com/document/product/1039) | 2024-03-12 01:17:53 | +| cls | [日志服务](https://cloud.tencent.com/document/product/614) | 2024-03-15 01:10:50 | +| cme | [多媒体创作引擎](https://cloud.tencent.com/document/product/1156) | 2023-12-05 01:27:33 | +| cmq | [消息队列 CMQ](https://cloud.tencent.com/document/product/406) | 2024-03-12 01:18:40 | +| cms | [内容安全](https://cloud.tencent.com/document/product/669) | 2024-03-12 01:18:46 | +| config | [配置审计](https://cloud.tencent.com/document/product/1579) | 2024-03-12 01:18:49 | +| cpdp | [企业收付平台](https://cloud.tencent.com/document/product/1122) | 2023-09-21 02:09:54 | +| cr | [金融联络机器人](https://cloud.tencent.com/document/product/656) | 2021-02-24 08:03:24 | +| csip | [云安全一体化平台](https://cloud.tencent.com/document/product/664) | 2024-03-12 01:18:51 | +| csxg | [5G入云服务](https://cloud.tencent.com/document/product/1687) | 2024-03-12 01:19:07 | +| cvm | [云服务器](https://cloud.tencent.com/document/product/213) | 2024-03-12 01:19:09 | +| cwp | [主机安全](https://cloud.tencent.com/document/product/296) | 2024-03-12 01:19:53 | +| cws | [漏洞扫描服务](https://cloud.tencent.com/document/product) | 2019-11-22 12:16:15 | +| cynosdb | [TDSQL-C MySQL 版](https://cloud.tencent.com/document/product/1003) | 2024-03-15 01:12:26 | +| dasb | [T-Sec-堡垒机(BH)](https://cloud.tencent.com/document/product/1025) | 2024-03-12 01:24:05 | +| dataintegration | [数据接入平台](https://cloud.tencent.com/document/product/1591) | 2022-07-26 15:32:15 | +| dayu | [DDoS 高防包](https://cloud.tencent.com/document/product/1021) | 2023-05-18 01:20:11 | +| dbbrain | [数据库智能管家 DBbrain](https://cloud.tencent.com/document/product/1130) | 2024-03-13 01:13:43 | +| dbdc | [云数据库独享集群](https://cloud.tencent.com/document/product/1322) | 2024-03-12 01:24:53 | +| dc | [专线接入](https://cloud.tencent.com/document/product/216) | 2024-03-12 01:24:56 | +| dcdb | [TDSQL MySQL 版](https://cloud.tencent.com/document/product/557) | 2024-03-12 01:25:05 | +| dlc | [数据湖计算 DLC](https://cloud.tencent.com/document/product/1342) | 2024-03-12 01:25:34 | +| dnspod | [DNSPod](https://cloud.tencent.com/document/product/1427) | 2024-03-14 01:14:21 | +| domain | [域名注册](https://cloud.tencent.com/document/product/242) | 2024-03-13 01:14:31 | +| drm | [数字版权管理](https://cloud.tencent.com/document/product/1000) | 2024-03-12 01:27:01 | +| ds | [文档服务](https://cloud.tencent.com/document/product/869) | 2024-03-12 01:27:05 | +| dsgc | [数据安全治理中心](https://cloud.tencent.com/document/product/1087) | 2024-03-12 01:27:10 | +| dtf | [分布式事务](https://cloud.tencent.com/document/product/1224) | 2022-04-04 06:38:57 | +| dts | [数据传输服务](https://cloud.tencent.com/document/product/571) | 2024-03-14 01:15:02 | +| eb | [事件总线](https://cloud.tencent.com/document/product/1359) | 2024-03-12 01:28:33 | +| ecc | [英文作文批改](https://cloud.tencent.com/document/product/1076) | 2024-03-12 01:28:45 | +| ecdn | [全站加速网络](https://cloud.tencent.com/document/product/570) | 2024-03-12 01:28:47 | +| ecm | [边缘计算机器](https://cloud.tencent.com/document/product/1108) | 2024-03-12 01:28:55 | +| eiam | [数字身份管控平台(员工版)](https://cloud.tencent.com/document/product/1442) | 2024-03-12 01:29:44 | +| eis | [数据连接器](https://cloud.tencent.com/document/product/1270) | 2023-08-10 01:17:44 | +| emr | [弹性 MapReduce](https://cloud.tencent.com/document/product/589) | 2024-03-15 01:14:37 | +| es | [Elasticsearch Service](https://cloud.tencent.com/document/product/845) | 2024-03-14 01:15:53 | +| ess | [腾讯电子签企业版](https://cloud.tencent.com/document/product/1323) | 2024-03-15 01:14:52 | +| essbasic | [腾讯电子签(基础版)](https://cloud.tencent.com/document/product/1420) | 2024-03-15 01:15:07 | +| facefusion | [人脸融合](https://cloud.tencent.com/document/product/670) | 2024-03-12 01:31:22 | +| faceid | [人脸核身](https://cloud.tencent.com/document/product/1007) | 2024-03-12 19:51:24 | +| fmu | [人脸试妆](https://cloud.tencent.com/document/product/1172) | 2024-03-12 01:31:30 | +| ft | [人像变换](https://cloud.tencent.com/document/product/1202) | 2024-03-12 01:31:35 | +| gaap | [全球应用加速](https://cloud.tencent.com/document/product/608) | 2024-03-12 01:31:38 | +| gme | [游戏多媒体引擎](https://cloud.tencent.com/document/product/607) | 2024-03-12 01:32:15 | +| goosefs | [数据加速器 GooseFS](https://cloud.tencent.com/document/product/1424) | 2024-03-12 01:32:26 | +| gpm | [游戏玩家匹配](https://cloud.tencent.com/document/product/1294) | 2022-07-11 06:12:36 | +| gs | [云游戏](https://cloud.tencent.com/document/product/1162) | 2024-03-12 01:32:33 | +| gse | [游戏服务器伸缩](https://cloud.tencent.com/document/product/1165) | 2022-07-11 06:12:44 | +| habo | [](https://cloud.tencent.com/document/product) | 2019-05-09 19:37:22 | +| hai | [高性能应用服务](https://cloud.tencent.com/document/product/1721) | 2024-03-12 11:37:33 | +| hasim | [高可用物联网卡](https://cloud.tencent.com/document/product/1482) | 2023-05-18 01:29:47 | +| hcm | [数学作业批改](https://cloud.tencent.com/document/product/1004) | 2024-03-12 01:32:40 | +| hunyuan | [腾讯混元大模型](https://cloud.tencent.com/document/product/1729) | 2024-03-11 15:37:37 | +| iai | [人脸识别](https://cloud.tencent.com/document/product/867) | 2024-03-12 01:32:45 | +| ic | [图片瘦身](https://cloud.tencent.com/document/product/636) | 2023-03-02 01:23:21 | +| icr | [对话机器人](https://cloud.tencent.com/document/product/1268) | 2024-03-12 01:33:01 | +| ie | [智能编辑](https://cloud.tencent.com/document/product/1186) | 2023-08-17 03:20:18 | +| iecp | [物联网边缘计算平台](https://cloud.tencent.com/document/product/1118) | 2024-03-12 01:33:02 | +| iir | [智能识图](https://cloud.tencent.com/document/product/1217) | 2022-04-04 06:48:05 | +| ims | [图片内容安全](https://cloud.tencent.com/document/product/1125) | 2024-03-12 01:33:38 | +| ioa | [iOA 零信任安全管理系统](https://cloud.tencent.com/document/product/1092) | 2024-03-12 01:33:40 | +| iot | [加速物联网套件](https://cloud.tencent.com/document/product/568) | 2023-07-17 01:22:28 | +| iotcloud | [物联网通信](https://cloud.tencent.com/document/product/634) | 2024-03-12 01:33:42 | +| iotexplorer | [物联网开发平台](https://cloud.tencent.com/document/product/1081) | 2024-03-14 01:17:47 | +| iottid | [物联网设备身份认证](https://cloud.tencent.com/document/product/1086) | 2023-05-18 01:33:02 | +| iotvideo | [物联网智能视频服务](https://cloud.tencent.com/document/product/1131) | 2024-03-12 01:34:52 | +| iotvideoindustry | [物联网智能视频服务(行业版)](https://cloud.tencent.com/document/product/1361) | 2024-03-12 01:35:29 | +| irp | [智能推荐平台](https://cloud.tencent.com/document/product/1541) | 2024-03-12 01:36:07 | +| iss | [智能视图计算平台](https://cloud.tencent.com/document/product/1344) | 2024-03-12 01:36:10 | +| ivld | [媒体智能标签](https://cloud.tencent.com/document/product/1509) | 2024-03-12 01:36:41 | +| keewidb | [云数据库 KeeWiDB](https://cloud.tencent.com/document/product/1520) | 2024-03-12 01:36:51 | +| kms | [密钥管理系统](https://cloud.tencent.com/document/product/573) | 2024-03-12 01:37:06 | +| lcic | [实时互动-教育版](https://cloud.tencent.com/document/product/1639) | 2024-03-15 01:17:42 | +| lighthouse | [轻量应用服务器](https://cloud.tencent.com/document/product/1207) | 2024-03-12 01:37:46 | +| live | [云直播CSS](https://cloud.tencent.com/document/product/267) | 2024-03-14 01:19:23 | +| lowcode | [云开发低码](https://cloud.tencent.com/document/product/1301) | 2022-04-04 06:56:51 | +| lp | [登录保护](https://cloud.tencent.com/document/product/1190) | 2022-04-04 06:56:52 | +| mall | [商场客留大数据](https://cloud.tencent.com/document/product/1707) | 2024-03-12 01:39:23 | +| mariadb | [云数据库 MariaDB](https://cloud.tencent.com/document/product/237) | 2024-03-12 01:39:24 | +| market | [云市场](https://cloud.tencent.com/document/product/306) | 2024-03-12 01:39:50 | +| memcached | [云数据库Memcached](https://cloud.tencent.com/document/product/241) | 2024-03-12 01:39:51 | +| mgobe | [游戏联机对战引擎](https://cloud.tencent.com/document/product/1038) | 2022-07-08 06:11:32 | +| mmps | [小程序安全](https://cloud.tencent.com/document/product/1223) | 2024-03-12 01:39:52 | +| mna | [多网聚合加速](https://cloud.tencent.com/document/product/1385) | 2024-03-12 01:39:57 | +| mongodb | [云数据库 MongoDB](https://cloud.tencent.com/document/product/240) | 2024-03-13 01:19:31 | +| monitor | [腾讯云可观测平台](https://cloud.tencent.com/document/product/248) | 2024-03-12 11:37:38 | +| mps | [媒体处理](https://cloud.tencent.com/document/product/862) | 2024-03-14 01:20:29 | +| mrs | [医疗报告结构化](https://cloud.tencent.com/document/product/1314) | 2024-03-14 01:20:51 | +| ms | [移动应用安全](https://cloud.tencent.com/document/product/283) | 2024-03-12 01:42:14 | +| msp | [迁移服务平台](https://cloud.tencent.com/document/product/659) | 2024-03-12 01:42:23 | +| mvj | [营销价值判断](https://cloud.tencent.com/document/product) | 2020-03-19 08:11:44 | +| nlp | [NLP 服务](https://cloud.tencent.com/document/product/271) | 2024-03-12 01:42:26 | +| npp | [号码保护](https://cloud.tencent.com/document/product) | 2020-04-22 08:00:22 | +| oceanus | [流计算 Oceanus](https://cloud.tencent.com/document/product/849) | 2024-03-12 01:42:31 | +| ocr | [文字识别](https://cloud.tencent.com/document/product/866) | 2024-03-13 01:20:34 | +| omics | [腾讯健康组学平台](https://cloud.tencent.com/document/product/1643) | 2024-03-12 01:43:25 | +| organization | [集团账号管理](https://cloud.tencent.com/document/product/850) | 2024-03-12 01:43:35 | +| partners | [渠道合作伙伴](https://cloud.tencent.com/document/product/563) | 2024-03-12 01:43:51 | +| pds | [私域安全](https://cloud.tencent.com/document/product/1473) | 2023-05-18 01:44:14 | +| postgres | [云数据库 PostgreSQL](https://cloud.tencent.com/document/product/409) | 2024-03-12 01:43:59 | +| privatedns | [私有域解析 Private DNS](https://cloud.tencent.com/document/product/1338) | 2024-03-12 01:44:34 | +| pts | [云压测](https://cloud.tencent.com/document/product/1484) | 2024-03-12 01:44:44 | +| rce | [全栈式风控引擎](https://cloud.tencent.com/document/product/1343) | 2024-03-12 01:45:01 | +| redis | [云数据库Redis](https://cloud.tencent.com/document/product/239) | 2024-03-12 01:45:03 | +| region | [地域管理系统](https://cloud.tencent.com/document/product/1596) | 2024-03-12 01:45:39 | +| rkp | [风险探针](https://cloud.tencent.com/document/product/1169) | 2023-12-25 00:16:39 | +| rp | [注册保护](https://cloud.tencent.com/document/product/1191) | 2022-04-04 07:04:06 | +| rum | [前端性能监控](https://cloud.tencent.com/document/product/1464) | 2024-03-12 01:45:41 | +| scf | [云函数](https://cloud.tencent.com/document/product/583) | 2024-03-14 01:22:33 | +| ses | [邮件推送](https://cloud.tencent.com/document/product/1288) | 2024-03-12 01:46:29 | +| smh | [智能媒资托管](https://cloud.tencent.com/document/product/1339) | 2024-03-12 01:46:38 | +| smop | [腾讯安心用户运营平台](https://cloud.tencent.com/document/product/1310) | 2024-03-12 01:46:43 | +| smpn | [营销号码安全](https://cloud.tencent.com/document/product/1127) | 2024-03-12 01:46:44 | +| sms | [短信](https://cloud.tencent.com/document/product/382) | 2024-03-12 01:46:46 | +| soe | [智聆口语评测](https://cloud.tencent.com/document/product/884) | 2024-03-12 01:46:54 | +| solar | [智汇零售](https://cloud.tencent.com/document/product) | 2020-03-19 08:01:59 | +| sqlserver | [云数据库 SQL Server](https://cloud.tencent.com/document/product/238) | 2024-03-15 01:20:49 | +| ssa | [安全运营中心](https://cloud.tencent.com/document/product/664) | 2023-11-15 02:18:28 | +| ssl | [SSL 证书](https://cloud.tencent.com/document/product/400) | 2024-03-14 01:23:11 | +| sslpod | [证书监控 SSLPod](https://cloud.tencent.com/document/product/1084) | 2024-03-12 01:48:16 | +| ssm | [凭据管理系统](https://cloud.tencent.com/document/product/1140) | 2024-03-12 01:48:20 | +| sts | [安全凭证服务](https://cloud.tencent.com/document/product/1312) | 2024-03-12 01:48:29 | +| svp | [节省计划](https://cloud.tencent.com/document/product/1761) | 2024-03-12 01:48:32 | +| taf | [流量反欺诈](https://cloud.tencent.com/document/product/1031) | 2024-03-12 01:48:33 | +| tag | [标签](https://cloud.tencent.com/document/product/651) | 2024-03-12 01:48:35 | +| tan | [碳引擎](https://cloud.tencent.com/document/product/1498) | 2024-03-12 01:48:46 | +| tat | [自动化助手](https://cloud.tencent.com/document/product/1340) | 2024-03-12 01:48:47 | +| tav | [文件检测](https://cloud.tencent.com/document/product) | 2019-11-28 22:10:04 | +| tbaas | [腾讯云区块链服务平台 TBaaS](https://cloud.tencent.com/document/product/663) | 2024-03-12 01:48:58 | +| tbm | [](https://cloud.tencent.com/document/product) | 2019-03-29 14:49:11 | +| tbp | [腾讯智能对话平台](https://cloud.tencent.com/document/product/1060) | 2024-03-12 01:49:10 | +| tcaplusdb | [游戏数据库 TcaplusDB](https://cloud.tencent.com/document/product/596) | 2024-03-12 01:49:11 | +| tcb | [云开发 CloudBase](https://cloud.tencent.com/document/product/876) | 2024-03-12 01:49:30 | +| tcbr | [云托管 CloudBase Run](https://cloud.tencent.com/document/product/1243) | 2024-03-12 01:50:06 | +| tcex | [腾讯云释义](https://cloud.tencent.com/document/product/1266) | 2022-07-21 06:17:29 | +| tchd | [腾讯云健康看板](https://cloud.tencent.com/document/product/1688) | 2024-03-12 01:50:10 | +| tci | [腾讯智学课堂分析](https://cloud.tencent.com/document/product) | 2020-08-24 08:06:03 | +| tcm | [服务网格](https://cloud.tencent.com/document/product/1261) | 2024-03-12 01:50:11 | +| tcr | [容器镜像服务](https://cloud.tencent.com/document/product/1141) | 2024-03-12 01:50:17 | +| tcss | [容器安全服务](https://cloud.tencent.com/document/product/1285) | 2024-03-12 01:51:00 | +| tdcpg | [TDSQL-C PostgreSQL 版](https://cloud.tencent.com/document/product/1556) | 2024-03-12 01:53:11 | +| tdid | [分布式身份](https://cloud.tencent.com/document/product/1439) | 2024-03-12 01:53:20 | +| tdmq | [消息队列 TDMQ](https://cloud.tencent.com/document/product/1179) | 2024-03-13 01:24:22 | +| tds | [设备安全](https://cloud.tencent.com/document/product/1628) | 2024-03-12 01:54:17 | +| tem | [弹性微服务](https://cloud.tencent.com/document/product/1371) | 2024-03-12 01:54:19 | +| teo | [边缘安全加速平台](https://cloud.tencent.com/document/product/1552) | 2024-03-14 01:25:29 | +| thpc | [高性能计算平台](https://cloud.tencent.com/document/product/1527) | 2024-03-12 01:55:22 | +| tia | [智能钛机器学习](https://cloud.tencent.com/document/product/851) | 2021-10-21 11:12:52 | +| tic | [资源编排 TIC](https://cloud.tencent.com/document/product/1213) | 2023-08-17 05:26:08 | +| ticm | [智能鉴黄](https://cloud.tencent.com/document/product/864) | 2021-01-07 08:08:15 | +| tics | [威胁情报云查服务](https://cloud.tencent.com/document/product/1013) | 2024-03-12 01:55:30 | +| tiems | [腾讯云 TI 平台 TI-EMS ](https://cloud.tencent.com/document/product/1120) | 2022-07-19 06:19:39 | +| tiia | [图像分析](https://cloud.tencent.com/document/product/865) | 2024-03-12 01:55:32 | +| tione | [TI-ONE 训练平台](https://cloud.tencent.com/document/product/851) | 2024-03-14 01:25:59 | +| tiw | [互动白板](https://cloud.tencent.com/document/product/1137) | 2024-03-12 01:56:17 | +| tke | [容器服务](https://cloud.tencent.com/document/product/457) | 2024-03-12 01:58:07 | +| tkgdq | [腾讯知识图谱数据查询](https://cloud.tencent.com/document/product) | 2020-03-10 00:51:44 | +| tms | [文本内容安全](https://cloud.tencent.com/document/product/1124) | 2024-03-12 01:58:09 | +| tmt | [机器翻译](https://cloud.tencent.com/document/product/551) | 2024-03-12 01:58:11 | +| tourism | [文旅客情大数据](https://cloud.tencent.com/document/product/1684) | 2024-03-12 01:58:14 | +| trdp | [流量风险决策平台](https://cloud.tencent.com/document/product/1604) | 2023-05-18 02:01:19 | +| trocket | [消息队列 RocketMQ 版](https://cloud.tencent.com/document/product/1493) | 2024-03-12 01:58:15 | +| trp | [T-Sec-安心平台(RP)](https://cloud.tencent.com/document/product/1458) | 2024-03-15 01:24:38 | +| trro | [远程实时操控](https://cloud.tencent.com/document/product/1584) | 2024-03-12 01:58:53 | +| trtc | [实时音视频](https://cloud.tencent.com/document/product/647) | 2024-03-12 10:45:07 | +| tse | [微服务引擎](https://cloud.tencent.com/document/product/1364) | 2024-03-12 01:59:06 | +| tsf | [微服务平台 TSF](https://cloud.tencent.com/document/product/649) | 2024-03-13 15:09:33 | +| tsw | [微服务观测平台 TSW](https://cloud.tencent.com/document/product/1311) | 2024-03-12 02:00:39 | +| tts | [语音合成](https://cloud.tencent.com/document/product/1073) | 2024-03-12 02:00:41 | +| ump | [客流数字化平台](https://cloud.tencent.com/document/product/1320) | 2024-03-12 02:00:43 | +| vm | [视频内容安全](https://cloud.tencent.com/document/product/1265) | 2024-03-12 02:00:49 | +| vms | [语音消息](https://cloud.tencent.com/document/product/1128) | 2024-03-12 02:00:52 | +| vod | [云点播](https://cloud.tencent.com/document/product/266) | 2024-03-12 02:00:55 | +| vpc | [私有网络](https://cloud.tencent.com/document/product/215) | 2024-03-12 02:02:20 | +| vrs | [声音复刻](https://cloud.tencent.com/document/product/1283) | 2024-03-12 02:04:17 | +| waf | [Web 应用防火墙](https://cloud.tencent.com/document/product/627) | 2024-03-12 02:04:20 | +| wav | [企业微信汽车行业版](https://cloud.tencent.com/document/product/1318) | 2024-03-12 02:05:11 | +| wedata | [数据开发治理平台 WeData](https://cloud.tencent.com/document/product/1267) | 2024-03-14 01:29:38 | +| weilingwith | [微瓴同业开放平台](https://cloud.tencent.com/document/product/1693) | 2024-03-12 02:07:35 | +| wss | [SSL证书管理服务](https://cloud.tencent.com/document/product) | 2020-04-01 08:53:44 | +| yinsuda | [音速达直播音乐版权引擎](https://cloud.tencent.com/document/product/1592) | 2024-03-12 02:07:58 | +| youmall | [](https://cloud.tencent.com/document/product) | 2019-01-11 11:24:15 | +| yunjing | [主机安全](https://cloud.tencent.com/document/product) | 2020-09-15 08:08:47 | +| yunsou | [腾讯云搜TCS](https://cloud.tencent.com/document/product/270) | 2024-03-12 02:08:06 | \ No newline at end of file diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/abstract_client.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/abstract_client.ts new file mode 100644 index 0000000..48a7514 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/abstract_client.ts @@ -0,0 +1,346 @@ +import { sdkVersion } from "./sdk_version" +import { + ClientProfile, + Credential, + ClientConfig, + SUPPORT_LANGUAGE_LIST, + HttpProfile, + DynamicCredential, +} from "./interface" +import Sign from "./sign" +import { HttpConnection } from "./http/http_connection" +import TencentCloudSDKHttpException from "./exception/tencent_cloud_sdk_exception" +import { Response } from "node-fetch" +import { SSEResponseModel } from "./sse_response_model" + +export type ResponseCallback = (error: string, rep: TReuslt) => void +export interface RequestOptions extends Partial> { + multipart?: boolean + /** + * 中止请求信号 + */ + signal?: AbortSignal +} + +interface RequestData { + Action: string + RequestClient: string + Nonce: number + Timestamp: number + Version: string + Signature: string + SecretId?: string + region?: string + Token?: string + SinatureMethod?: string + [key: string]: any +} +type ResponseData = any + +/** + * @inner + */ +export class AbstractClient { + sdkVersion: string + path: string + credential: Credential | DynamicCredential + region: string + apiVersion: string + endpoint: string + profile: ClientProfile + /** + * 实例化client对象 + * @param {string} endpoint 接入点域名 + * @param {string} version 产品版本 + * @param {Credential} credential 认证信息实例 + * @param {string} region 产品地域 + * @param {ClientProfile} profile 可选配置实例 + */ + constructor( + endpoint: string, + version: string, + { credential, region, profile = {} }: ClientConfig + ) { + this.path = "/" + + /** + * 认证信息实例 + */ + if (credential && "getCredential" in credential) { + this.credential = credential + } else { + this.credential = Object.assign( + { + secretId: null, + secretKey: null, + token: null, + }, + credential + ) + } + + /** + * 产品地域 + */ + this.region = region || null + this.sdkVersion = "SDK_NODEJS_" + sdkVersion + this.apiVersion = version + this.endpoint = (profile && profile.httpProfile && profile.httpProfile.endpoint) || endpoint + + /** + * 可选配置实例 + * @type {ClientProfile} + */ + this.profile = { + signMethod: (profile && profile.signMethod) || "TC3-HMAC-SHA256", + httpProfile: Object.assign( + { + reqMethod: "POST", + endpoint: null, + protocol: "https://", + reqTimeout: 60, + }, + profile && profile.httpProfile + ), + language: profile.language, + } + + if (this.profile.language && !SUPPORT_LANGUAGE_LIST.includes(this.profile.language)) { + throw new TencentCloudSDKHttpException( + `Language invalid, choices: ${SUPPORT_LANGUAGE_LIST.join("|")}` + ) + } + } + + async getCredential(): Promise { + if ("getCredential" in this.credential) { + return await this.credential.getCredential() + } + return this.credential + } + + /** + * @inner + */ + async request( + action: string, + req: any, + options?: ResponseCallback | RequestOptions, + cb?: ResponseCallback + ): Promise { + if (typeof options === "function") { + cb = options + options = {} as RequestOptions + } + try { + const result = await this.doRequest(action, req ?? {}, options as RequestOptions) + cb && cb(null, result) + return result + } catch (e) { + cb && cb(e as any, null) + throw e + } + } + + /** + * @inner + */ + async requestOctetStream( + action: string, + req: any, + options?: ResponseCallback | RequestOptions, + cb?: ResponseCallback + ) { + if (typeof options === "function") { + cb = options + options = {} as RequestOptions + } + + try { + const result = await this.doRequest( + action, + req ?? {}, + Object.assign({}, options, { + headers: { + "Content-Type": "application/octet-stream; charset=utf-8", + }, + }) + ) + cb && cb(null, result) + return result + } catch (e) { + cb && cb(e as any, null) + throw e + } + } + + /** + * @inner + */ + private async doRequest( + action: string, + req: any, + options: RequestOptions = {} + ): Promise { + if (this.profile.signMethod === "TC3-HMAC-SHA256") { + return this.doRequestWithSign3(action, req, options) + } + let params = this.mergeData(req) + params = await this.formatRequestData(action, params) + let res + try { + res = await HttpConnection.doRequest({ + method: this.profile.httpProfile.reqMethod, + url: this.profile.httpProfile.protocol + this.endpoint + this.path, + data: params, + timeout: this.profile.httpProfile.reqTimeout * 1000, + headers: Object.assign({}, this.profile.httpProfile.headers, options.headers), + agent: this.profile.httpProfile.agent, + proxy: this.profile.httpProfile.proxy, + signal: options.signal, + }) + } catch (error) { + throw new TencentCloudSDKHttpException((error as any).message) + } + return this.parseResponse(res) + } + + /** + * @inner + */ + private async doRequestWithSign3( + action: string, + params: any, + options: RequestOptions = {} + ): Promise { + let res + try { + const credential = await this.getCredential() + res = await HttpConnection.doRequestWithSign3({ + method: this.profile.httpProfile.reqMethod, + url: this.profile.httpProfile.protocol + this.endpoint + this.path, + secretId: credential.secretId, + secretKey: credential.secretKey, + region: this.region, + data: params || "", + service: this.endpoint.split(".")[0], + action: action, + version: this.apiVersion, + multipart: options && options.multipart, + timeout: this.profile.httpProfile.reqTimeout * 1000, + token: credential.token, + requestClient: this.sdkVersion, + language: this.profile.language, + headers: Object.assign({}, this.profile.httpProfile.headers, options.headers), + agent: this.profile.httpProfile.agent, + proxy: this.profile.httpProfile.proxy, + signal: options.signal, + }) + } catch (e) { + throw new TencentCloudSDKHttpException((e as any).message) + } + return this.parseResponse(res) + } + + private async parseResponse(res: Response): Promise { + if (res.status !== 200) { + const tcError = new TencentCloudSDKHttpException(res.statusText) + tcError.httpCode = res.status + throw tcError + } else { + if (res.headers.get("content-type") === "text/event-stream") { + return new SSEResponseModel(res.body) + } else { + const data = await res.json() + if (data.Response.Error) { + const tcError = new TencentCloudSDKHttpException( + data.Response.Error.Message, + data.Response.RequestId + ) + tcError.code = data.Response.Error.Code + throw tcError + } else { + return data.Response + } + } + } + } + + /** + * @inner + */ + private mergeData(data: any, prefix = "") { + const ret: any = {} + for (const k in data) { + if (data[k] === null || data[k] === undefined) { + continue + } + if (data[k] instanceof Array || data[k] instanceof Object) { + Object.assign(ret, this.mergeData(data[k], prefix + k + ".")) + } else { + ret[prefix + k] = data[k] + } + } + return ret + } + + /** + * @inner + */ + private async formatRequestData(action: string, params: RequestData): Promise { + params.Action = action + params.RequestClient = this.sdkVersion + params.Nonce = Math.round(Math.random() * 65535) + params.Timestamp = Math.round(Date.now() / 1000) + params.Version = this.apiVersion + + const credential = await this.getCredential() + + if (credential.secretId) { + params.SecretId = credential.secretId + } + + if (this.region) { + params.Region = this.region + } + + if (credential.token) { + params.Token = credential.token + } + + if (this.profile.language) { + params.Language = this.profile.language + } + + if (this.profile.signMethod) { + params.SignatureMethod = this.profile.signMethod + } + const signStr = this.formatSignString(params) + + params.Signature = Sign.sign(credential.secretKey, signStr, this.profile.signMethod) + return params + } + + /** + * @inner + */ + private formatSignString(params: RequestData): string { + let strParam = "" + const keys = Object.keys(params) + keys.sort() + for (const k in keys) { + if (!keys.hasOwnProperty(k)) { + continue + } + //k = k.replace(/_/g, '.'); + strParam += "&" + keys[k] + "=" + params[keys[k]] + } + const strSign = + this.profile.httpProfile.reqMethod.toLocaleUpperCase() + + this.endpoint + + this.path + + "?" + + strParam.slice(1) + return strSign + } +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/common_client.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/common_client.ts new file mode 100644 index 0000000..8062a38 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/common_client.ts @@ -0,0 +1,3 @@ +import { AbstractClient } from "./abstract_client" + +export class CommonClient extends AbstractClient {} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/cvm_role_credential.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/cvm_role_credential.ts new file mode 100644 index 0000000..c9abe69 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/cvm_role_credential.ts @@ -0,0 +1,62 @@ +import { Credential, DynamicCredential } from "./interface" +import fetch from "./http/fetch" + +const META_URL = "http://metadata.tencentyun.com/latest/meta-data/" +const ROLE_URL = META_URL + "cam/security-credentials/" +const EXPIRE_BUFFER = 30 * 1000 + +interface CvmRoleCredentialResult { + TmpSecretId: string + TmpSecretKey: string + ExpiredTime: 1671330188 + Expiration: string + Token: string + Code: string +} +export default class CvmRoleCredential implements DynamicCredential { + protected roleNameTask: Promise | null + protected credentialTask: Promise | null + protected async getRoleName() { + const response = await fetch(ROLE_URL, {}) + if (!response.ok) { + throw new Error("Get cvm role name failed, Please confirm whether the role is bound") + } + return await response.text() + } + protected async getRoleCredential(roleName: string): Promise { + const response = await fetch(ROLE_URL + roleName, {}) + if (!response.ok) { + throw new Error( + `Get credential from metadata server by role name ${roleName} failed, http code: ${response.status}` + ) + } + const json: CvmRoleCredentialResult = await response.json() + if (json.Code !== "Success") { + throw new Error( + `Get credential from metadata server by role name ${roleName} failed, Code: ${json.Code}` + ) + } + return json + } + async getCredential(): Promise { + if (!this.roleNameTask) { + this.roleNameTask = this.getRoleName() + } + const roleName = await this.roleNameTask + if (!this.credentialTask) { + this.credentialTask = this.getRoleCredential(roleName) + } + const credential = await this.credentialTask + // expired + if (credential.ExpiredTime * 1000 - EXPIRE_BUFFER <= Date.now()) { + this.credentialTask = null + return this.getCredential() + } + + return { + secretId: credential.TmpSecretId, + secretKey: credential.TmpSecretKey, + token: credential.Token, + } + } +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/exception/tencent_cloud_sdk_exception.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/exception/tencent_cloud_sdk_exception.ts new file mode 100644 index 0000000..f09c04c --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/exception/tencent_cloud_sdk_exception.ts @@ -0,0 +1,52 @@ +/** + * @inner + */ +export default class TencentCloudSDKHttpException extends Error { + /** + * 请求id + */ + requestId: string + + /** + * http状态码 + */ + httpCode?: number + + /** + * 接口返回状态码 + */ + code?: string + + constructor(error: string, requestId = "") { + super(error) + this.requestId = requestId || "" + } + + getMessage(): string { + return this.message + } + + getRequestId(): string { + return this.requestId + } + + toString(): string { + return ( + "[TencentCloudSDKException]" + + "message:" + + this.getMessage() + + " requestId:" + + this.getRequestId() + ) + } + + toLocaleString(): string { + return ( + "[TencentCloudSDKException]" + + "message:" + + this.getMessage() + + " requestId:" + + this.getRequestId() + ) + } +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/http/fetch.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/http/fetch.ts new file mode 100644 index 0000000..7e6b643 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/http/fetch.ts @@ -0,0 +1,19 @@ +import fetch, { RequestInit, Response } from "node-fetch" +import HttpsProxyAgent = require("https-proxy-agent") + +export interface FetchOptions extends Omit { + proxy?: string + headers?: Record + // node-fetch中的signal声明与ts自带的有点冲突,以ts的为准 + signal?: AbortSignal +} +export default function (url: string, options: FetchOptions): Promise { + const instanceOptions = options || ({} as FetchOptions) + + const proxy = options.proxy || process.env.http_proxy + if (!options.agent && proxy) { + instanceOptions.agent = new (HttpsProxyAgent as any)(proxy) + } + + return fetch(url, instanceOptions as any) +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/http/http_connection.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/http/http_connection.ts new file mode 100644 index 0000000..f284aeb --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/http/http_connection.ts @@ -0,0 +1,232 @@ +import * as QueryString from "querystring" +import { URL } from "url" +import * as isStream from "is-stream" +import * as getStream from "get-stream" +import * as FormData from "form-data" +import Sign from "../sign" +import fetch, { FetchOptions } from "./fetch" +import { Response, RequestInit } from "node-fetch" +import { Agent } from "http" +import * as JSONBigInt from "json-bigint" + +const JSONbigNative = JSONBigInt({ useNativeBigInt: true }) +/** + * @inner + */ +export class HttpConnection { + static async doRequest({ + method, + url, + data, + timeout, + headers = {}, + agent, + proxy, + signal, + }: { + method: string + url: string + data: any + timeout: number + headers?: Record + agent?: Agent + proxy?: string + signal?: AbortSignal + }): Promise { + const config: FetchOptions = { + method: method, + headers: Object.assign({}, headers), + timeout, + agent, + proxy, + signal, + } + if (method === "GET") { + url += "?" + QueryString.stringify(data) + } else { + config.headers["Content-Type"] = "application/x-www-form-urlencoded" + config.body = QueryString.stringify(data) + } + return await fetch(url, config) + } + + static async doRequestWithSign3({ + method, + url, + data, + service, + action, + region, + version, + secretId, + secretKey, + multipart = false, + timeout = 60000, + token, + requestClient, + language, + headers = {}, + agent, + proxy, + signal, + }: { + method: string + url: string + data: any + service: string + action: string + region: string + version: string + secretId: string + secretKey: string + multipart?: boolean + timeout?: number + token: string + requestClient: string + language: string + headers?: Record + agent?: Agent + proxy?: string + signal?: AbortSignal + }): Promise { + // data 中可能带有 readStream,由于需要计算整个 body 的 hash, + // 所以这里把 readStream 转为 Buffer + // eslint-disable-next-line @typescript-eslint/no-use-before-define + await convertReadStreamToBuffer(data) + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + data = deepRemoveNull(data) + + const timestamp = parseInt(String(new Date().getTime() / 1000)) + method = method.toUpperCase() + + let payload = "" + if (method === "GET") { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + data = mergeData(data) + url += "?" + QueryString.stringify(data) + } + if (method === "POST") { + payload = data + } + const config: FetchOptions = { + method, + timeout, + headers: Object.assign({}, headers, { + Host: new URL(url).host, + "X-TC-Action": action, + "X-TC-Region": region, + "X-TC-Timestamp": timestamp, + "X-TC-Version": version, + "X-TC-Token": token, + "X-TC-RequestClient": requestClient, + }), + agent, + proxy, + signal, + } + + if (token === null || token === undefined) { + delete config.headers["X-TC-Token"] + } + if (region === null || region === undefined) { + delete config.headers["X-TC-Region"] + } + + if (language) { + config.headers["X-TC-Language"] = language + } + + let form + if (method === "GET") { + config.headers["Content-Type"] = "application/x-www-form-urlencoded" + } + if (method === "POST" && !multipart) { + config.body = data + const contentType = config.headers["Content-Type"] || "application/json" + if (!isBuffer(data)) config.body = JSONbigNative.stringify(data) + config.headers["Content-Type"] = contentType + } + if (method === "POST" && multipart) { + form = new FormData() + for (const key in data) { + form.append(key, data[key]) + } + config.body = form + config.headers = Object.assign({}, config.headers, form.getHeaders()) + } + + const signature = Sign.sign3({ + method, + url, + payload, + timestamp, + service, + secretId, + secretKey, + multipart, + boundary: form ? form.getBoundary() : undefined, + headers: config.headers, + }) + + config.headers["Authorization"] = signature + + return await fetch(url, config) + } +} + +async function convertReadStreamToBuffer(data: any): Promise { + for (const key in data) { + if (isStream(data[key])) { + data[key] = await getStream.buffer(data[key]) + } + } +} + +function mergeData(data: any, prefix = "") { + const ret: any = {} + for (const k in data) { + if (data[k] === null) { + continue + } + if (data[k] instanceof Array || data[k] instanceof Object) { + Object.assign(ret, mergeData(data[k], prefix + k + ".")) + } else { + ret[prefix + k] = data[k] + } + } + return ret +} + +function deepRemoveNull(obj: any) { + if (isArray(obj)) { + return obj.map(deepRemoveNull) + } else if (isObject(obj)) { + const result: any = {} + for (const key in obj) { + const value = obj[key] + if (!isNull(value)) { + result[key] = deepRemoveNull(value) + } + } + return result + } else { + return obj + } +} + +function isBuffer(x: any): boolean { + return Buffer.isBuffer(x) +} + +function isArray(x: any): boolean { + return Array.isArray(x) +} + +function isObject(x: any): boolean { + return typeof x === "object" && !isArray(x) && !isStream(x) && !isBuffer(x) && x !== null +} + +function isNull(x: any): boolean { + return x === null +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/interface.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/interface.ts new file mode 100644 index 0000000..8cdde38 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/interface.ts @@ -0,0 +1,121 @@ +import { Agent } from "http" +/** + * 初始化client对象参数类型 + */ +export interface ClientConfig { + /** + * @param {Credential} credential 认证信息 + * 必选 + */ + credential: Credential | DynamicCredential + /** + * @param {string} region 产品地域 + * 对于要求区分地域的产品,此参数必选(如 cvm);对于不区分地域的产品(如 sms),无需传入。 + */ + region?: string + /** + * @param {ClientProfile} profile 可选配置实例 + * 可选,没有特殊需求可以跳过。 + */ + profile?: ClientProfile +} + +/** + * 可选配置实例 + */ +export interface ClientProfile { + /** + * 签名方法 (TC3-HMAC-SHA256 HmacSHA1 HmacSHA256) + * @type {string} + * 非必选 + */ + signMethod?: "TC3-HMAC-SHA256" | "HmacSHA256" | "HmacSHA1" + /** + * http相关选项实例 + * @type {HttpProfile} + * 非必选 + */ + httpProfile?: HttpProfile + /** + * api请求时附带的 language 字段 + * @type {"zh-CN" | "en-US"} + * 非必选 + */ + language?: "zh-CN" | "en-US" +} + +export interface HttpProfile { + /** + * 请求方法 + * @type {"POST" | "GET"} + * 非必选 + */ + reqMethod?: "POST" | "GET" + /** + * 接入点域名,形如(cvm.ap-shanghai.tencentcloud.com) + * @type {string} + * 非必选 + */ + endpoint?: string + /** + * 协议,目前支持(https://) + * @type {string} + * 非必选 + */ + protocol?: string + /** + * 请求超时时间,默认60s + * @type {number} + * 非必选 + */ + reqTimeout?: number + /** + * 自定义请求头,例如 { "X-TC-TraceId": "ffe0c072-8a5d-4e17-8887-a8a60252abca" } + * @type {Record} + * 非必选 + */ + headers?: Record + /** + * 高级请求代理,例如 new HttpsProxyAgent("http://127.0.0.1:8899") + * + * 优先级高于 proxy 配置 + */ + agent?: Agent + /** + * http请求代理,例如 "http://127.0.0.1:8899" + */ + proxy?: string +} + +/** + * ClientProfile.language 属性支持的取值列表 + */ +export const SUPPORT_LANGUAGE_LIST = ["zh-CN", "en-US"] + +/** + * 认证信息类 + */ +export interface Credential { + /** + * 腾讯云账户secretId,secretKey + * 非必选,和 token 二选一 + */ + secretId?: string + /** + * 腾讯云账户secretKey + * 非必选,和 token 二选一 + */ + secretKey?: string + /** + * 腾讯云账户token + * 非必选,和 secretId 二选一 + */ + token?: string +} + +/** + * 动态认证信息 + */ +export interface DynamicCredential { + getCredential(): Promise +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sdk_version.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sdk_version.ts new file mode 100644 index 0000000..c43c7cf --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sdk_version.ts @@ -0,0 +1 @@ +export const sdkVersion = "4.0.813" diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sign.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sign.ts new file mode 100644 index 0000000..011c963 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sign.ts @@ -0,0 +1,148 @@ +import TencentCloudSDKHttpException from "./exception/tencent_cloud_sdk_exception" +import * as crypto from "crypto" +import { URL } from "url" +import * as JSONBigInt from "json-bigint" + +const JSONbigNative = JSONBigInt({ useNativeBigInt: true }) + +/** + * @inner + */ +export default class Sign { + static sign(secretKey: string, signStr: string, signMethod: string): string { + const signMethodMap: { + [key: string]: string + } = { + HmacSHA1: "sha1", + HmacSHA256: "sha256", + } + + if (!signMethodMap.hasOwnProperty(signMethod)) { + throw new TencentCloudSDKHttpException( + "signMethod invalid, signMethod only support (HmacSHA1, HmacSHA256)" + ) + } + const hmac = crypto.createHmac(signMethodMap[signMethod], secretKey || "") + return hmac.update(Buffer.from(signStr, "utf8")).digest("base64") + } + + static sign3({ + method = "POST", + url = "", + payload, + timestamp, + service, + secretId, + secretKey, + multipart, + boundary, + headers: configHeaders = {}, + }: { + method?: string + url?: string + payload: any + timestamp: number + service: string + secretId: string + secretKey: string + multipart: boolean + boundary: string + headers: Record + }): string { + const urlObj = new URL(url) + const contentType = configHeaders["Content-Type"] + + // 通用头部 + let headers = "" + let signedHeaders = "" + if (method === "GET") { + signedHeaders = "content-type" + headers = `content-type:${contentType}\n` + } else if (method === "POST") { + signedHeaders = "content-type" + if (multipart) { + headers = `content-type:multipart/form-data; boundary=${boundary}\n` + } else { + headers = `content-type:${contentType}\n` + } + } + headers += `host:${urlObj.hostname}\n` + signedHeaders += ";host" + + const path = urlObj.pathname + const querystring = urlObj.search.slice(1) + + let payload_hash = "" + if (multipart) { + const hash = crypto.createHash("sha256") + hash.update(`--${boundary}`) + for (const key in payload) { + const content = payload[key] + if (Buffer.isBuffer(content)) { + hash.update( + `\r\nContent-Disposition: form-data; name="${key}"\r\nContent-Type: application/octet-stream\r\n\r\n` + ) + hash.update(content) + hash.update("\r\n") + } else if (typeof content === "string") { + hash.update(`\r\nContent-Disposition: form-data; name="${key}"\r\n\r\n`) + hash.update(`${content}\r\n`) + } + hash.update(`--${boundary}`) + } + hash.update(`--\r\n`) + payload_hash = hash.digest("hex") + } else { + const hashMessage = Buffer.isBuffer(payload) ? payload : JSONbigNative.stringify(payload) + payload_hash = payload ? getHash(hashMessage) : getHash("") + } + + const canonicalRequest = + method + + "\n" + + path + + "\n" + + querystring + + "\n" + + headers + + "\n" + + signedHeaders + + "\n" + + payload_hash + const date = getDate(timestamp) + + const StringToSign = + "TC3-HMAC-SHA256" + + "\n" + + timestamp + + "\n" + + `${date}/${service}/tc3_request` + + "\n" + + getHash(canonicalRequest) + + const kDate = sha256(date, "TC3" + secretKey) + const kService = sha256(service, kDate) + const kSigning = sha256("tc3_request", kService) + const signature = sha256(StringToSign, kSigning, "hex") + + return `TC3-HMAC-SHA256 Credential=${secretId}/${date}/${service}/tc3_request, SignedHeaders=${signedHeaders}, Signature=${signature}` + } +} + +function sha256(message: string, secret = "", encoding?: string): string { + const hmac = crypto.createHmac("sha256", secret) + return hmac.update(message).digest(encoding as any) +} + +function getHash(message: crypto.BinaryLike, encoding = "hex"): string { + const hash = crypto.createHash("sha256") + return hash.update(message).digest(encoding as any) +} + +function getDate(timestamp: number): string { + const date = new Date(timestamp * 1000) + const year = date.getUTCFullYear() + const month = ("0" + (date.getUTCMonth() + 1)).slice(-2) + const day = ("0" + date.getUTCDate()).slice(-2) + return `${year}-${month}-${day}` +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sse_response_model.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sse_response_model.ts new file mode 100644 index 0000000..796da11 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/src/common/sse_response_model.ts @@ -0,0 +1,121 @@ +import { EventEmitter } from "events" +import { Readable } from "stream" + +interface EventSourceMessage { + /** The event ID to set the EventSource object's last event ID value. */ + id: string + /** A string identifying the type of event described. */ + event: string + /** The event data */ + data: string + /** The reconnection interval (in milliseconds) to wait before retrying the connection */ + retry?: number +} + +class SSEEventEmitter extends EventEmitter {} + +export class SSEResponseModel { + private stream: NodeJS.ReadableStream + private eventSource: SSEEventEmitter + + constructor(stream: NodeJS.ReadableStream) { + this.stream = stream + this.eventSource = new SSEEventEmitter() + this.init() + } + + /** + * @inner + */ + private init() { + const { stream, eventSource } = this + stream.on("data", (chunk) => { + if (chunk !== null) { + const messages = chunk.toString().split("\n\n") + for (let i = 0; i < messages.length; i++) { + if (messages[i].length > 0) { + eventSource.emit("message", this.parseSSEMessage(messages[i])) + } + } + } + }) + stream.on("close", () => { + eventSource.emit("close") + }) + stream.on("error", (err) => { + eventSource.emit("error", err) + }) + } + + /** + * @inner + */ + private parseSSEMessage(chunk: string) { + const message: EventSourceMessage = { + data: "", + event: "", + id: "", + retry: undefined, + } + + const lines = chunk.split("\n") + for (let i = 0; i < lines.length; i++) { + const line = lines[i] + // line is of format ":" or ": " + const colonIndex = line.indexOf(":") + if (colonIndex <= 0) continue // exclude comments and lines with no values + const field = line.slice(0, colonIndex) + const value = line.slice(colonIndex + (line[colonIndex + 1] === " " ? 2 : 1)) + + switch (field) { + case "data": + message.data = message.data ? message.data + "\n" + value : value + break + case "event": + message.event = value + break + case "id": + message.id = value + break + case "retry": + const retry = parseInt(value, 10) + if (!isNaN(retry)) { + // per spec, ignore non-integers + message.retry = retry + } + break + } + } + + return message + } + + on(event: "message", listener: (message: EventSourceMessage) => void): this + on(event: "close", listener: () => void): this + on(event: "error", listener: (err: Error) => void): this + on(event: string, listener: any) { + this.eventSource.on(event, listener) + return this + } + + removeListener(event: "message", listener: (message: EventSourceMessage) => void): this + removeListener(event: "close", listener: () => void): this + removeListener(event: "error", listener: (err: Error) => void): this + removeListener(event: string, listener: any) { + this.eventSource.removeListener(event, listener) + return this + } + + async *[Symbol.asyncIterator](): AsyncIterableIterator { + for await (const chunk of this.stream) { + if (chunk !== null) { + const messages = chunk.toString().split("\n\n") + for (let i = 0; i < messages.length; i++) { + if (messages[i].length > 0) { + yield this.parseSSEMessage(messages[i]) + } + } + } + } + } +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/src/index.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/src/index.ts new file mode 100644 index 0000000..2b05277 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/src/index.ts @@ -0,0 +1,3 @@ +export * from "./common/abstract_client" +export * from "./common/common_client" +export * from "./common/interface" \ No newline at end of file diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/abstract_client.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/abstract_client.d.ts new file mode 100644 index 0000000..9674e9c --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/abstract_client.d.ts @@ -0,0 +1,62 @@ +import { ClientProfile, Credential, ClientConfig, HttpProfile, DynamicCredential } from "./interface"; +export declare type ResponseCallback = (error: string, rep: TReuslt) => void; +export interface RequestOptions extends Partial> { + multipart?: boolean; + /** + * 中止请求信号 + */ + signal?: AbortSignal; +} +declare type ResponseData = any; +/** + * @inner + */ +export declare class AbstractClient { + sdkVersion: string; + path: string; + credential: Credential | DynamicCredential; + region: string; + apiVersion: string; + endpoint: string; + profile: ClientProfile; + /** + * 实例化client对象 + * @param {string} endpoint 接入点域名 + * @param {string} version 产品版本 + * @param {Credential} credential 认证信息实例 + * @param {string} region 产品地域 + * @param {ClientProfile} profile 可选配置实例 + */ + constructor(endpoint: string, version: string, { credential, region, profile }: ClientConfig); + getCredential(): Promise; + /** + * @inner + */ + request(action: string, req: any, options?: ResponseCallback | RequestOptions, cb?: ResponseCallback): Promise; + /** + * @inner + */ + requestOctetStream(action: string, req: any, options?: ResponseCallback | RequestOptions, cb?: ResponseCallback): Promise; + /** + * @inner + */ + private doRequest; + /** + * @inner + */ + private doRequestWithSign3; + private parseResponse; + /** + * @inner + */ + private mergeData; + /** + * @inner + */ + private formatRequestData; + /** + * @inner + */ + private formatSignString; +} +export {}; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/abstract_client.js b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/abstract_client.js new file mode 100644 index 0000000..44673d4 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/abstract_client.js @@ -0,0 +1,260 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AbstractClient = void 0; +const sdk_version_1 = require("./sdk_version"); +const interface_1 = require("./interface"); +const sign_1 = require("./sign"); +const http_connection_1 = require("./http/http_connection"); +const tencent_cloud_sdk_exception_1 = require("./exception/tencent_cloud_sdk_exception"); +const sse_response_model_1 = require("./sse_response_model"); +/** + * @inner + */ +class AbstractClient { + /** + * 实例化client对象 + * @param {string} endpoint 接入点域名 + * @param {string} version 产品版本 + * @param {Credential} credential 认证信息实例 + * @param {string} region 产品地域 + * @param {ClientProfile} profile 可选配置实例 + */ + constructor(endpoint, version, { credential, region, profile = {} }) { + this.path = "/"; + /** + * 认证信息实例 + */ + if (credential && "getCredential" in credential) { + this.credential = credential; + } + else { + this.credential = Object.assign({ + secretId: null, + secretKey: null, + token: null, + }, credential); + } + /** + * 产品地域 + */ + this.region = region || null; + this.sdkVersion = "SDK_NODEJS_" + sdk_version_1.sdkVersion; + this.apiVersion = version; + this.endpoint = (profile && profile.httpProfile && profile.httpProfile.endpoint) || endpoint; + /** + * 可选配置实例 + * @type {ClientProfile} + */ + this.profile = { + signMethod: (profile && profile.signMethod) || "TC3-HMAC-SHA256", + httpProfile: Object.assign({ + reqMethod: "POST", + endpoint: null, + protocol: "https://", + reqTimeout: 60, + }, profile && profile.httpProfile), + language: profile.language, + }; + if (this.profile.language && !interface_1.SUPPORT_LANGUAGE_LIST.includes(this.profile.language)) { + throw new tencent_cloud_sdk_exception_1.default(`Language invalid, choices: ${interface_1.SUPPORT_LANGUAGE_LIST.join("|")}`); + } + } + async getCredential() { + if ("getCredential" in this.credential) { + return await this.credential.getCredential(); + } + return this.credential; + } + /** + * @inner + */ + async request(action, req, options, cb) { + if (typeof options === "function") { + cb = options; + options = {}; + } + try { + const result = await this.doRequest(action, req !== null && req !== void 0 ? req : {}, options); + cb && cb(null, result); + return result; + } + catch (e) { + cb && cb(e, null); + throw e; + } + } + /** + * @inner + */ + async requestOctetStream(action, req, options, cb) { + if (typeof options === "function") { + cb = options; + options = {}; + } + try { + const result = await this.doRequest(action, req !== null && req !== void 0 ? req : {}, Object.assign({}, options, { + headers: { + "Content-Type": "application/octet-stream; charset=utf-8", + }, + })); + cb && cb(null, result); + return result; + } + catch (e) { + cb && cb(e, null); + throw e; + } + } + /** + * @inner + */ + async doRequest(action, req, options = {}) { + if (this.profile.signMethod === "TC3-HMAC-SHA256") { + return this.doRequestWithSign3(action, req, options); + } + let params = this.mergeData(req); + params = await this.formatRequestData(action, params); + let res; + try { + res = await http_connection_1.HttpConnection.doRequest({ + method: this.profile.httpProfile.reqMethod, + url: this.profile.httpProfile.protocol + this.endpoint + this.path, + data: params, + timeout: this.profile.httpProfile.reqTimeout * 1000, + headers: Object.assign({}, this.profile.httpProfile.headers, options.headers), + agent: this.profile.httpProfile.agent, + proxy: this.profile.httpProfile.proxy, + signal: options.signal, + }); + } + catch (error) { + throw new tencent_cloud_sdk_exception_1.default(error.message); + } + return this.parseResponse(res); + } + /** + * @inner + */ + async doRequestWithSign3(action, params, options = {}) { + let res; + try { + const credential = await this.getCredential(); + res = await http_connection_1.HttpConnection.doRequestWithSign3({ + method: this.profile.httpProfile.reqMethod, + url: this.profile.httpProfile.protocol + this.endpoint + this.path, + secretId: credential.secretId, + secretKey: credential.secretKey, + region: this.region, + data: params || "", + service: this.endpoint.split(".")[0], + action: action, + version: this.apiVersion, + multipart: options && options.multipart, + timeout: this.profile.httpProfile.reqTimeout * 1000, + token: credential.token, + requestClient: this.sdkVersion, + language: this.profile.language, + headers: Object.assign({}, this.profile.httpProfile.headers, options.headers), + agent: this.profile.httpProfile.agent, + proxy: this.profile.httpProfile.proxy, + signal: options.signal, + }); + } + catch (e) { + throw new tencent_cloud_sdk_exception_1.default(e.message); + } + return this.parseResponse(res); + } + async parseResponse(res) { + if (res.status !== 200) { + const tcError = new tencent_cloud_sdk_exception_1.default(res.statusText); + tcError.httpCode = res.status; + throw tcError; + } + else { + if (res.headers.get("content-type") === "text/event-stream") { + return new sse_response_model_1.SSEResponseModel(res.body); + } + else { + const data = await res.json(); + if (data.Response.Error) { + const tcError = new tencent_cloud_sdk_exception_1.default(data.Response.Error.Message, data.Response.RequestId); + tcError.code = data.Response.Error.Code; + throw tcError; + } + else { + return data.Response; + } + } + } + } + /** + * @inner + */ + mergeData(data, prefix = "") { + const ret = {}; + for (const k in data) { + if (data[k] === null || data[k] === undefined) { + continue; + } + if (data[k] instanceof Array || data[k] instanceof Object) { + Object.assign(ret, this.mergeData(data[k], prefix + k + ".")); + } + else { + ret[prefix + k] = data[k]; + } + } + return ret; + } + /** + * @inner + */ + async formatRequestData(action, params) { + params.Action = action; + params.RequestClient = this.sdkVersion; + params.Nonce = Math.round(Math.random() * 65535); + params.Timestamp = Math.round(Date.now() / 1000); + params.Version = this.apiVersion; + const credential = await this.getCredential(); + if (credential.secretId) { + params.SecretId = credential.secretId; + } + if (this.region) { + params.Region = this.region; + } + if (credential.token) { + params.Token = credential.token; + } + if (this.profile.language) { + params.Language = this.profile.language; + } + if (this.profile.signMethod) { + params.SignatureMethod = this.profile.signMethod; + } + const signStr = this.formatSignString(params); + params.Signature = sign_1.default.sign(credential.secretKey, signStr, this.profile.signMethod); + return params; + } + /** + * @inner + */ + formatSignString(params) { + let strParam = ""; + const keys = Object.keys(params); + keys.sort(); + for (const k in keys) { + if (!keys.hasOwnProperty(k)) { + continue; + } + //k = k.replace(/_/g, '.'); + strParam += "&" + keys[k] + "=" + params[keys[k]]; + } + const strSign = this.profile.httpProfile.reqMethod.toLocaleUpperCase() + + this.endpoint + + this.path + + "?" + + strParam.slice(1); + return strSign; + } +} +exports.AbstractClient = AbstractClient; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/common_client.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/common_client.d.ts new file mode 100644 index 0000000..284587f --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/common_client.d.ts @@ -0,0 +1,3 @@ +import { AbstractClient } from "./abstract_client"; +export declare class CommonClient extends AbstractClient { +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/common_client.js b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/common_client.js new file mode 100644 index 0000000..bf54ed4 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/common_client.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CommonClient = void 0; +const abstract_client_1 = require("./abstract_client"); +class CommonClient extends abstract_client_1.AbstractClient { +} +exports.CommonClient = CommonClient; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/cvm_role_credential.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/cvm_role_credential.d.ts new file mode 100644 index 0000000..f17184b --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/cvm_role_credential.d.ts @@ -0,0 +1,17 @@ +import { Credential, DynamicCredential } from "./interface"; +interface CvmRoleCredentialResult { + TmpSecretId: string; + TmpSecretKey: string; + ExpiredTime: 1671330188; + Expiration: string; + Token: string; + Code: string; +} +export default class CvmRoleCredential implements DynamicCredential { + protected roleNameTask: Promise | null; + protected credentialTask: Promise | null; + protected getRoleName(): Promise; + protected getRoleCredential(roleName: string): Promise; + getCredential(): Promise; +} +export {}; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/cvm_role_credential.js b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/cvm_role_credential.js new file mode 100644 index 0000000..f86b436 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/cvm_role_credential.js @@ -0,0 +1,47 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const fetch_1 = require("./http/fetch"); +const META_URL = "http://metadata.tencentyun.com/latest/meta-data/"; +const ROLE_URL = META_URL + "cam/security-credentials/"; +const EXPIRE_BUFFER = 30 * 1000; +class CvmRoleCredential { + async getRoleName() { + const response = await fetch_1.default(ROLE_URL, {}); + if (!response.ok) { + throw new Error("Get cvm role name failed, Please confirm whether the role is bound"); + } + return await response.text(); + } + async getRoleCredential(roleName) { + const response = await fetch_1.default(ROLE_URL + roleName, {}); + if (!response.ok) { + throw new Error(`Get credential from metadata server by role name ${roleName} failed, http code: ${response.status}`); + } + const json = await response.json(); + if (json.Code !== "Success") { + throw new Error(`Get credential from metadata server by role name ${roleName} failed, Code: ${json.Code}`); + } + return json; + } + async getCredential() { + if (!this.roleNameTask) { + this.roleNameTask = this.getRoleName(); + } + const roleName = await this.roleNameTask; + if (!this.credentialTask) { + this.credentialTask = this.getRoleCredential(roleName); + } + const credential = await this.credentialTask; + // expired + if (credential.ExpiredTime * 1000 - EXPIRE_BUFFER <= Date.now()) { + this.credentialTask = null; + return this.getCredential(); + } + return { + secretId: credential.TmpSecretId, + secretKey: credential.TmpSecretKey, + token: credential.Token, + }; + } +} +exports.default = CvmRoleCredential; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/exception/tencent_cloud_sdk_exception.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/exception/tencent_cloud_sdk_exception.d.ts new file mode 100644 index 0000000..3b04208 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/exception/tencent_cloud_sdk_exception.d.ts @@ -0,0 +1,22 @@ +/** + * @inner + */ +export default class TencentCloudSDKHttpException extends Error { + /** + * 请求id + */ + requestId: string; + /** + * http状态码 + */ + httpCode?: number; + /** + * 接口返回状态码 + */ + code?: string; + constructor(error: string, requestId?: string); + getMessage(): string; + getRequestId(): string; + toString(): string; + toLocaleString(): string; +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/exception/tencent_cloud_sdk_exception.js b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/exception/tencent_cloud_sdk_exception.js new file mode 100644 index 0000000..801ac77 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/exception/tencent_cloud_sdk_exception.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * @inner + */ +class TencentCloudSDKHttpException extends Error { + constructor(error, requestId = "") { + super(error); + this.requestId = requestId || ""; + } + getMessage() { + return this.message; + } + getRequestId() { + return this.requestId; + } + toString() { + return ("[TencentCloudSDKException]" + + "message:" + + this.getMessage() + + " requestId:" + + this.getRequestId()); + } + toLocaleString() { + return ("[TencentCloudSDKException]" + + "message:" + + this.getMessage() + + " requestId:" + + this.getRequestId()); + } +} +exports.default = TencentCloudSDKHttpException; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/fetch.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/fetch.d.ts new file mode 100644 index 0000000..a34719d --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/fetch.d.ts @@ -0,0 +1,7 @@ +import { RequestInit, Response } from "node-fetch"; +export interface FetchOptions extends Omit { + proxy?: string; + headers?: Record; + signal?: AbortSignal; +} +export default function (url: string, options: FetchOptions): Promise; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/fetch.js b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/fetch.js new file mode 100644 index 0000000..80876c1 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/fetch.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const node_fetch_1 = require("node-fetch"); +const HttpsProxyAgent = require("https-proxy-agent"); +function default_1(url, options) { + const instanceOptions = options || {}; + const proxy = options.proxy || process.env.http_proxy; + if (!options.agent && proxy) { + instanceOptions.agent = new HttpsProxyAgent(proxy); + } + return node_fetch_1.default(url, instanceOptions); +} +exports.default = default_1; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/http_connection.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/http_connection.d.ts new file mode 100644 index 0000000..0996a7f --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/http_connection.d.ts @@ -0,0 +1,38 @@ +/// +import { Response } from "node-fetch"; +import { Agent } from "http"; +/** + * @inner + */ +export declare class HttpConnection { + static doRequest({ method, url, data, timeout, headers, agent, proxy, signal, }: { + method: string; + url: string; + data: any; + timeout: number; + headers?: Record; + agent?: Agent; + proxy?: string; + signal?: AbortSignal; + }): Promise; + static doRequestWithSign3({ method, url, data, service, action, region, version, secretId, secretKey, multipart, timeout, token, requestClient, language, headers, agent, proxy, signal, }: { + method: string; + url: string; + data: any; + service: string; + action: string; + region: string; + version: string; + secretId: string; + secretKey: string; + multipart?: boolean; + timeout?: number; + token: string; + requestClient: string; + language: string; + headers?: Record; + agent?: Agent; + proxy?: string; + signal?: AbortSignal; + }): Promise; +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/http_connection.js b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/http_connection.js new file mode 100644 index 0000000..89c4adf --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/http/http_connection.js @@ -0,0 +1,165 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.HttpConnection = void 0; +const QueryString = require("querystring"); +const url_1 = require("url"); +const isStream = require("is-stream"); +const getStream = require("get-stream"); +const FormData = require("form-data"); +const sign_1 = require("../sign"); +const fetch_1 = require("./fetch"); +const JSONBigInt = require("json-bigint"); +const JSONbigNative = JSONBigInt({ useNativeBigInt: true }); +/** + * @inner + */ +class HttpConnection { + static async doRequest({ method, url, data, timeout, headers = {}, agent, proxy, signal, }) { + const config = { + method: method, + headers: Object.assign({}, headers), + timeout, + agent, + proxy, + signal, + }; + if (method === "GET") { + url += "?" + QueryString.stringify(data); + } + else { + config.headers["Content-Type"] = "application/x-www-form-urlencoded"; + config.body = QueryString.stringify(data); + } + return await fetch_1.default(url, config); + } + static async doRequestWithSign3({ method, url, data, service, action, region, version, secretId, secretKey, multipart = false, timeout = 60000, token, requestClient, language, headers = {}, agent, proxy, signal, }) { + // data 中可能带有 readStream,由于需要计算整个 body 的 hash, + // 所以这里把 readStream 转为 Buffer + // eslint-disable-next-line @typescript-eslint/no-use-before-define + await convertReadStreamToBuffer(data); + // eslint-disable-next-line @typescript-eslint/no-use-before-define + data = deepRemoveNull(data); + const timestamp = parseInt(String(new Date().getTime() / 1000)); + method = method.toUpperCase(); + let payload = ""; + if (method === "GET") { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + data = mergeData(data); + url += "?" + QueryString.stringify(data); + } + if (method === "POST") { + payload = data; + } + const config = { + method, + timeout, + headers: Object.assign({}, headers, { + Host: new url_1.URL(url).host, + "X-TC-Action": action, + "X-TC-Region": region, + "X-TC-Timestamp": timestamp, + "X-TC-Version": version, + "X-TC-Token": token, + "X-TC-RequestClient": requestClient, + }), + agent, + proxy, + signal, + }; + if (token === null || token === undefined) { + delete config.headers["X-TC-Token"]; + } + if (region === null || region === undefined) { + delete config.headers["X-TC-Region"]; + } + if (language) { + config.headers["X-TC-Language"] = language; + } + let form; + if (method === "GET") { + config.headers["Content-Type"] = "application/x-www-form-urlencoded"; + } + if (method === "POST" && !multipart) { + config.body = data; + const contentType = config.headers["Content-Type"] || "application/json"; + if (!isBuffer(data)) + config.body = JSONbigNative.stringify(data); + config.headers["Content-Type"] = contentType; + } + if (method === "POST" && multipart) { + form = new FormData(); + for (const key in data) { + form.append(key, data[key]); + } + config.body = form; + config.headers = Object.assign({}, config.headers, form.getHeaders()); + } + const signature = sign_1.default.sign3({ + method, + url, + payload, + timestamp, + service, + secretId, + secretKey, + multipart, + boundary: form ? form.getBoundary() : undefined, + headers: config.headers, + }); + config.headers["Authorization"] = signature; + return await fetch_1.default(url, config); + } +} +exports.HttpConnection = HttpConnection; +async function convertReadStreamToBuffer(data) { + for (const key in data) { + if (isStream(data[key])) { + data[key] = await getStream.buffer(data[key]); + } + } +} +function mergeData(data, prefix = "") { + const ret = {}; + for (const k in data) { + if (data[k] === null) { + continue; + } + if (data[k] instanceof Array || data[k] instanceof Object) { + Object.assign(ret, mergeData(data[k], prefix + k + ".")); + } + else { + ret[prefix + k] = data[k]; + } + } + return ret; +} +function deepRemoveNull(obj) { + if (isArray(obj)) { + return obj.map(deepRemoveNull); + } + else if (isObject(obj)) { + const result = {}; + for (const key in obj) { + const value = obj[key]; + if (!isNull(value)) { + result[key] = deepRemoveNull(value); + } + } + return result; + } + else { + return obj; + } +} +function isBuffer(x) { + return Buffer.isBuffer(x); +} +function isArray(x) { + return Array.isArray(x); +} +function isObject(x) { + return typeof x === "object" && !isArray(x) && !isStream(x) && !isBuffer(x) && x !== null; +} +function isNull(x) { + return x === null; +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/interface.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/interface.d.ts new file mode 100644 index 0000000..87c386b --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/interface.d.ts @@ -0,0 +1,117 @@ +/// +import { Agent } from "http"; +/** + * 初始化client对象参数类型 + */ +export interface ClientConfig { + /** + * @param {Credential} credential 认证信息 + * 必选 + */ + credential: Credential | DynamicCredential; + /** + * @param {string} region 产品地域 + * 对于要求区分地域的产品,此参数必选(如 cvm);对于不区分地域的产品(如 sms),无需传入。 + */ + region?: string; + /** + * @param {ClientProfile} profile 可选配置实例 + * 可选,没有特殊需求可以跳过。 + */ + profile?: ClientProfile; +} +/** + * 可选配置实例 + */ +export interface ClientProfile { + /** + * 签名方法 (TC3-HMAC-SHA256 HmacSHA1 HmacSHA256) + * @type {string} + * 非必选 + */ + signMethod?: "TC3-HMAC-SHA256" | "HmacSHA256" | "HmacSHA1"; + /** + * http相关选项实例 + * @type {HttpProfile} + * 非必选 + */ + httpProfile?: HttpProfile; + /** + * api请求时附带的 language 字段 + * @type {"zh-CN" | "en-US"} + * 非必选 + */ + language?: "zh-CN" | "en-US"; +} +export interface HttpProfile { + /** + * 请求方法 + * @type {"POST" | "GET"} + * 非必选 + */ + reqMethod?: "POST" | "GET"; + /** + * 接入点域名,形如(cvm.ap-shanghai.tencentcloud.com) + * @type {string} + * 非必选 + */ + endpoint?: string; + /** + * 协议,目前支持(https://) + * @type {string} + * 非必选 + */ + protocol?: string; + /** + * 请求超时时间,默认60s + * @type {number} + * 非必选 + */ + reqTimeout?: number; + /** + * 自定义请求头,例如 { "X-TC-TraceId": "ffe0c072-8a5d-4e17-8887-a8a60252abca" } + * @type {Record} + * 非必选 + */ + headers?: Record; + /** + * 高级请求代理,例如 new HttpsProxyAgent("http://127.0.0.1:8899") + * + * 优先级高于 proxy 配置 + */ + agent?: Agent; + /** + * http请求代理,例如 "http://127.0.0.1:8899" + */ + proxy?: string; +} +/** + * ClientProfile.language 属性支持的取值列表 + */ +export declare const SUPPORT_LANGUAGE_LIST: string[]; +/** + * 认证信息类 + */ +export interface Credential { + /** + * 腾讯云账户secretId,secretKey + * 非必选,和 token 二选一 + */ + secretId?: string; + /** + * 腾讯云账户secretKey + * 非必选,和 token 二选一 + */ + secretKey?: string; + /** + * 腾讯云账户token + * 非必选,和 secretId 二选一 + */ + token?: string; +} +/** + * 动态认证信息 + */ +export interface DynamicCredential { + getCredential(): Promise; +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/interface.js b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/interface.js new file mode 100644 index 0000000..a0d4de0 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/interface.js @@ -0,0 +1,7 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SUPPORT_LANGUAGE_LIST = void 0; +/** + * ClientProfile.language 属性支持的取值列表 + */ +exports.SUPPORT_LANGUAGE_LIST = ["zh-CN", "en-US"]; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sdk_version.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sdk_version.d.ts new file mode 100644 index 0000000..6e73ce2 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sdk_version.d.ts @@ -0,0 +1 @@ +export declare const sdkVersion = "4.0.813"; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sdk_version.js b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sdk_version.js new file mode 100644 index 0000000..42c5c2b --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sdk_version.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sdkVersion = void 0; +exports.sdkVersion = "4.0.813"; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sign.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sign.d.ts new file mode 100644 index 0000000..0a4c13f --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sign.d.ts @@ -0,0 +1,18 @@ +/** + * @inner + */ +export default class Sign { + static sign(secretKey: string, signStr: string, signMethod: string): string; + static sign3({ method, url, payload, timestamp, service, secretId, secretKey, multipart, boundary, headers: configHeaders, }: { + method?: string; + url?: string; + payload: any; + timestamp: number; + service: string; + secretId: string; + secretKey: string; + multipart: boolean; + boundary: string; + headers: Record; + }): string; +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sign.js b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sign.js new file mode 100644 index 0000000..78c4352 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sign.js @@ -0,0 +1,111 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tencent_cloud_sdk_exception_1 = require("./exception/tencent_cloud_sdk_exception"); +const crypto = require("crypto"); +const url_1 = require("url"); +const JSONBigInt = require("json-bigint"); +const JSONbigNative = JSONBigInt({ useNativeBigInt: true }); +/** + * @inner + */ +class Sign { + static sign(secretKey, signStr, signMethod) { + const signMethodMap = { + HmacSHA1: "sha1", + HmacSHA256: "sha256", + }; + if (!signMethodMap.hasOwnProperty(signMethod)) { + throw new tencent_cloud_sdk_exception_1.default("signMethod invalid, signMethod only support (HmacSHA1, HmacSHA256)"); + } + const hmac = crypto.createHmac(signMethodMap[signMethod], secretKey || ""); + return hmac.update(Buffer.from(signStr, "utf8")).digest("base64"); + } + static sign3({ method = "POST", url = "", payload, timestamp, service, secretId, secretKey, multipart, boundary, headers: configHeaders = {}, }) { + const urlObj = new url_1.URL(url); + const contentType = configHeaders["Content-Type"]; + // 通用头部 + let headers = ""; + let signedHeaders = ""; + if (method === "GET") { + signedHeaders = "content-type"; + headers = `content-type:${contentType}\n`; + } + else if (method === "POST") { + signedHeaders = "content-type"; + if (multipart) { + headers = `content-type:multipart/form-data; boundary=${boundary}\n`; + } + else { + headers = `content-type:${contentType}\n`; + } + } + headers += `host:${urlObj.hostname}\n`; + signedHeaders += ";host"; + const path = urlObj.pathname; + const querystring = urlObj.search.slice(1); + let payload_hash = ""; + if (multipart) { + const hash = crypto.createHash("sha256"); + hash.update(`--${boundary}`); + for (const key in payload) { + const content = payload[key]; + if (Buffer.isBuffer(content)) { + hash.update(`\r\nContent-Disposition: form-data; name="${key}"\r\nContent-Type: application/octet-stream\r\n\r\n`); + hash.update(content); + hash.update("\r\n"); + } + else if (typeof content === "string") { + hash.update(`\r\nContent-Disposition: form-data; name="${key}"\r\n\r\n`); + hash.update(`${content}\r\n`); + } + hash.update(`--${boundary}`); + } + hash.update(`--\r\n`); + payload_hash = hash.digest("hex"); + } + else { + const hashMessage = Buffer.isBuffer(payload) ? payload : JSONbigNative.stringify(payload); + payload_hash = payload ? getHash(hashMessage) : getHash(""); + } + const canonicalRequest = method + + "\n" + + path + + "\n" + + querystring + + "\n" + + headers + + "\n" + + signedHeaders + + "\n" + + payload_hash; + const date = getDate(timestamp); + const StringToSign = "TC3-HMAC-SHA256" + + "\n" + + timestamp + + "\n" + + `${date}/${service}/tc3_request` + + "\n" + + getHash(canonicalRequest); + const kDate = sha256(date, "TC3" + secretKey); + const kService = sha256(service, kDate); + const kSigning = sha256("tc3_request", kService); + const signature = sha256(StringToSign, kSigning, "hex"); + return `TC3-HMAC-SHA256 Credential=${secretId}/${date}/${service}/tc3_request, SignedHeaders=${signedHeaders}, Signature=${signature}`; + } +} +exports.default = Sign; +function sha256(message, secret = "", encoding) { + const hmac = crypto.createHmac("sha256", secret); + return hmac.update(message).digest(encoding); +} +function getHash(message, encoding = "hex") { + const hash = crypto.createHash("sha256"); + return hash.update(message).digest(encoding); +} +function getDate(timestamp) { + const date = new Date(timestamp * 1000); + const year = date.getUTCFullYear(); + const month = ("0" + (date.getUTCMonth() + 1)).slice(-2); + const day = ("0" + date.getUTCDate()).slice(-2); + return `${year}-${month}-${day}`; +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sse_response_model.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sse_response_model.d.ts new file mode 100644 index 0000000..12b5f86 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sse_response_model.d.ts @@ -0,0 +1,32 @@ +/// +interface EventSourceMessage { + /** The event ID to set the EventSource object's last event ID value. */ + id: string; + /** A string identifying the type of event described. */ + event: string; + /** The event data */ + data: string; + /** The reconnection interval (in milliseconds) to wait before retrying the connection */ + retry?: number; +} +export declare class SSEResponseModel { + private stream; + private eventSource; + constructor(stream: NodeJS.ReadableStream); + /** + * @inner + */ + private init; + /** + * @inner + */ + private parseSSEMessage; + on(event: "message", listener: (message: EventSourceMessage) => void): this; + on(event: "close", listener: () => void): this; + on(event: "error", listener: (err: Error) => void): this; + removeListener(event: "message", listener: (message: EventSourceMessage) => void): this; + removeListener(event: "close", listener: () => void): this; + removeListener(event: "error", listener: (err: Error) => void): this; + [Symbol.asyncIterator](): AsyncIterableIterator; +} +export {}; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sse_response_model.js b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sse_response_model.js new file mode 100644 index 0000000..aed0d48 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/common/sse_response_model.js @@ -0,0 +1,96 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SSEResponseModel = void 0; +const events_1 = require("events"); +class SSEEventEmitter extends events_1.EventEmitter { +} +class SSEResponseModel { + constructor(stream) { + this.stream = stream; + this.eventSource = new SSEEventEmitter(); + this.init(); + } + /** + * @inner + */ + init() { + const { stream, eventSource } = this; + stream.on("data", (chunk) => { + if (chunk !== null) { + const messages = chunk.toString().split("\n\n"); + for (let i = 0; i < messages.length; i++) { + if (messages[i].length > 0) { + eventSource.emit("message", this.parseSSEMessage(messages[i])); + } + } + } + }); + stream.on("close", () => { + eventSource.emit("close"); + }); + stream.on("error", (err) => { + eventSource.emit("error", err); + }); + } + /** + * @inner + */ + parseSSEMessage(chunk) { + const message = { + data: "", + event: "", + id: "", + retry: undefined, + }; + const lines = chunk.split("\n"); + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + // line is of format ":" or ": " + const colonIndex = line.indexOf(":"); + if (colonIndex <= 0) + continue; // exclude comments and lines with no values + const field = line.slice(0, colonIndex); + const value = line.slice(colonIndex + (line[colonIndex + 1] === " " ? 2 : 1)); + switch (field) { + case "data": + message.data = message.data ? message.data + "\n" + value : value; + break; + case "event": + message.event = value; + break; + case "id": + message.id = value; + break; + case "retry": + const retry = parseInt(value, 10); + if (!isNaN(retry)) { + // per spec, ignore non-integers + message.retry = retry; + } + break; + } + } + return message; + } + on(event, listener) { + this.eventSource.on(event, listener); + return this; + } + removeListener(event, listener) { + this.eventSource.removeListener(event, listener); + return this; + } + async *[Symbol.asyncIterator]() { + for await (const chunk of this.stream) { + if (chunk !== null) { + const messages = chunk.toString().split("\n\n"); + for (let i = 0; i < messages.length; i++) { + if (messages[i].length > 0) { + yield this.parseSSEMessage(messages[i]); + } + } + } + } + } +} +exports.SSEResponseModel = SSEResponseModel; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/index.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/index.d.ts new file mode 100644 index 0000000..2f59692 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/index.d.ts @@ -0,0 +1,3 @@ +export * from "./common/abstract_client"; +export * from "./common/common_client"; +export * from "./common/interface"; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/index.js b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/index.js new file mode 100644 index 0000000..201b77d --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tencentcloud/index.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +tslib_1.__exportStar(require("./common/abstract_client"), exports); +tslib_1.__exportStar(require("./common/common_client"), exports); +tslib_1.__exportStar(require("./common/interface"), exports); diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/tsconfig.json b/node/node_modules/tencentcloud-sdk-nodejs-common/tsconfig.json new file mode 100644 index 0000000..d1d460c --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + // "incremental": true, /* 增量编译 提高编译速度*/ + "target": "ES2019" /* 编译目标ES版本*/, + "module": "commonjs" /* 编译目标模块系统*/, + // "lib": [], /* 编译过程中需要引入的库文件列表*/ + "declaration": true /* 编译时创建声明文件 */, + "outDir": "tencentcloud" /* ts编译输出目录 */, + "rootDir": "src" /* ts编译根目录. */, + "importHelpers": true /* 从tslib导入辅助工具函数(如__importDefault)*/, + "strict": true /* 严格模式开关 等价于noImplicitAny、strictNullChecks、strictFunctionTypes、strictBindCallApply等设置true */, + "strictNullChecks": false, + "noUnusedLocals": false /* 未使用局部变量报错*/, + "noUnusedParameters": false /* 未使用参数报错*/, + "noImplicitReturns": true /* 有代码路径没有返回值时报错*/, + "noFallthroughCasesInSwitch": true /* 不允许switch的case语句贯穿*/, + "moduleResolution": "node" /* 模块解析策略 */, + "typeRoots": [ + /* 要包含的类型声明文件路径列表*/ + "./typings", + "./node_modules/@types" + ], + "allowSyntheticDefaultImports": true /* 允许从没有设置默认导出的模块中默认导入,仅用于提示,不影响编译结果*/, + "esModuleInterop": false /* 允许编译生成文件时,在代码中注入工具类(__importDefault、__importStar)对ESM与commonjs混用情况做兼容处理*/, + "sourceMap": false + }, + "include": [ + /* 需要编译的文件 */ + "src/**/*.ts", + "typings/**/*.ts" + ], + "exclude": [] +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-common/typings/index.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-common/typings/index.d.ts new file mode 100644 index 0000000..1c87af3 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-common/typings/index.d.ts @@ -0,0 +1,2 @@ +declare module "get-stream" +declare module "is-stream" \ No newline at end of file diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/LICENSE b/node/node_modules/tencentcloud-sdk-nodejs-sms/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/README.md b/node/node_modules/tencentcloud-sdk-nodejs-sms/README.md new file mode 100644 index 0000000..19a0390 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/README.md @@ -0,0 +1,147 @@ +# 简介 + +欢迎使用腾讯云开发者工具套件(SDK),NODEJS SDK 4.0 是云 API 3.0 平台的配套工具。目前已经支持 cvm、vpc、cbs 等产品,后续所有的云服务产品都会接入进来。新版 SDK 实现了统一化,具有各个语言版本的 SDK 使用方法相同,接口调用方式相同,统一的错误码和返回包格式这些优点。 +为方便 NODEJS 开发者调试和接入腾讯云产品 API,这里向您介绍适用于 NODEJS 的腾讯云开发工具包,并提供首次使用开发工具包的简单示例。让您快速获取腾讯云 NODEJS SDK 并开始调用。 + +# 依赖环境 + +1. NODEJS 10.0.0 版本及以上 +2. 从腾讯云控制台 开通相应产品 +3. 获取 SecretID、SecretKey 以及调用地址(endpoint),endpoint 一般形式为\*.tencentcloudapi.com,如 CVM 的调用地址为 cvm.tencentcloudapi.com,具体参考各产品说明。 + +# 获取安装 + +安装 NODEJS SDK 前,先获取安全凭证。在第一次使用云 API 之前,用户首先需要在腾讯云控制台上申请安全凭证,安全凭证包括 SecretID 和 SecretKey, SecretID 是用于标识 API 调用者的身份,SecretKey 是用于加密签名字符串和服务器端验证签名字符串的密钥。SecretKey 必须严格保管,避免泄露。 + +## 通过 Npm 安装 + +通过 npm 获取安装是使用 NODEJS SDK 的推荐方法,npm 是 NODEJS 的包管理工具。关于 npm 详细可参考[ npm 官网](https://www.npmjs.com/) 。 + +1. 执行以下安装命令: + > npm install tencentcloud-sdk-nodejs --save +2. 在您的代码中引用对应模块代码,可参考示例。 +3. 如上引用方式会将腾讯云所有产品sdk下载到本地,可以将tencentcloud-sdk-nodejs换成tencentcloud-sdk-nodejs-cvm/cbs/vpc等,即可引用特定产品的sdk,代码中可将require("tencentcloud-sdk-nodejs")改为require("tencentcloud-sdk-nodejs-cvm/cbs/vpc"),其余不变,可参考示例,可大大节省存储空间。 + +## 通过源码包安装 + +1. 前往 [Github 仓库](https://github.com/tencentcloud/tencentcloud-sdk-nodejs) 或者 [Gitee 仓库](https://gitee.com/tencentcloud/tencentcloud-sdk-nodejs) 下载源码压缩包。 +2. 解压源码包到您项目合适的位置,例如 `sdk/tencentcloud-sdk-nodejs`。 +3. 执行 `npm install ./sdk/tencentcloud-sdk-nodejs`。 +4. 使用 `require("tencentcloud-sdk-nodejs")` 的方式引入sdk,具体可参考示例。 + +# 示例 + +```js +const tencentcloud = require("tencentcloud-sdk-nodejs") + +// 导入对应产品模块的client models。 +const CvmClient = tencentcloud.cvm.v20170312.Client + +// 实例化要请求产品(以cvm为例)的client对象 +const client = new CvmClient({ + // 为了保护密钥安全,建议将密钥设置在环境变量中或者配置文件中,请参考本文凭证管理章节。 + // 硬编码密钥到代码中有可能随代码泄露而暴露,有安全隐患,并不推荐。 + credential: { + secretId: process.env.TENCENTCLOUD_SECRET_ID, + secretKey: process.env.TENCENTCLOUD_SECRET_KEY, + }, + // 产品地域 + region: "ap-shanghai", + // 可选配置实例 + profile: { + signMethod: "TC3-HMAC-SHA256", // 签名方法 + httpProfile: { + reqMethod: "POST", // 请求方法 + reqTimeout: 30, // 请求超时时间,默认60s + headers: { + // 自定义 header + }, + // proxy: "http://127.0.0.1:8899" // http请求代理 + }, + }, +}) +// 通过client对象调用想要访问的接口(Action),需要传入请求对象(Params)以及响应回调函数 +// 即:client.Action(Params).then(res => console.log(res), err => console.error(err)) +// 如:查询云服务器可用区列表 +client.DescribeZones().then( + (data) => { + console.log(data) + }, + (err) => { + console.error("error", err) + } +) +``` + +在支持 typescript 项目中,采用如下方式调用 + +```js +import * as tencentcloud from "tencentcloud-sdk-nodejs" + +const CvmClient = tencentcloud.cvm.v20170312.Client + +// ... +``` + +实例化`Client` 的入参支持 `clientConfig` 数据结构和说明 详见 [ClientConfig](https://github.com/TencentCloud/tencentcloud-sdk-nodejs/blob/master/src/common/interface.ts) + +## 更多示例 + +更丰富的使用 demo 请在 examples 目录中寻找。 + +# 相关配置 + +## 代理 + +如果是有代理的环境下,需要配置代理,请在创建Client时传入 [profile.httpProfile.proxy](https://github.com/TencentCloud/tencentcloud-sdk-nodejs/blob/master/src/common/interface.ts#L78) 参数,或设置系统环境变量 `http_proxy` ,否则可能无法正常调用,抛出连接超时的异常。 + +# 凭证管理 + +除显式传入凭证外,从 `v4.0.506` 起支持 [腾讯云实例角色](https://cloud.tencent.com/document/product/213/47668) + +在您为实例绑定角色后,您可以在实例中访问相关元数据接口获取临时凭证。用法可参考 [js示例代码](./examples/cvm_role.js) 或 [ts示例代码](./examples/cvm_role.ts) +```javascript +// ... +const CvmRoleCredential = require("tencentcloud-sdk-nodejs/tencentcloud/common/cvm_role_credential").default + +new XxxClient({ + // ... + credential: new CvmRoleCredential(), + // ... +}) +``` + +# 旧版 SDK + +我们推荐使用新版 NODEJS SDK,如果一定要用旧版 SDK,请前往[github 仓库](https://github.com/CFETeam/qcloudapi-sdk)下载。 + +# 常见问题 +- webpack打包出错/浏览器报错 + + 请**务必不要**将此sdk直接用于web前端(包括小程序等),暴露密钥在这些环境非常不安全。 + + 正确的做法是在自己的服务端引用此sdk,并保存好密钥,做好请求鉴权;前端再调用服务端执行业务流程。 + +- `The "original" argument must be of type Function.` + + 通常是因为nodejs版本低于 `v10` ,或处于非node环境,请再次确认执行环境。 + +- 请求不通 + + 设置环境变量 `NODE_DEBUG=http` 来开启请求日志输出来定位问题,例如: + ```sh + # MacOS + NODE_DEBUG=http node app.js + # windows cmd + set NODE_DEBUG=http & node app.js + # windows powershell + $env:NODE_DEBUG='http' ; node app.js + ``` + 如需要配置代理,请查阅 [代理](#代理),或设置环境变量 `http_proxy`,例如: + ```sh + # MacOS + http_proxy=http://代理地址:代理端口 node app.js + ``` + +- 整数类型值超出 JavaScript 最大安全整数 + 使用新的数据类型 `BigInt` diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/index.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/index.d.ts new file mode 100644 index 0000000..feb2f7f --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/index.d.ts @@ -0,0 +1,2 @@ +import * as tencentcloud from './tencentcloud'; +export default tencentcloud; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/index.js b/node/node_modules/tencentcloud-sdk-nodejs-sms/index.js new file mode 100644 index 0000000..9d47dd4 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/index.js @@ -0,0 +1,6 @@ +'use strict' +Object.defineProperty(exports, '__esModule', { value: true }) +const tslib_1 = require('tslib') +const tencentcloud = tslib_1.__importStar(require('./tencentcloud')) +exports.default = tencentcloud +//# sourceMappingURL=index.js.map diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/package.json b/node/node_modules/tencentcloud-sdk-nodejs-sms/package.json new file mode 100644 index 0000000..e92297e --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/package.json @@ -0,0 +1,47 @@ +{ + "name": "tencentcloud-sdk-nodejs-sms", + "version": "4.0.810", + "description": "Tencent Cloud API NODEJS SDK", + "main": "tencentcloud/index.js", + "scripts": { + "test": "mocha -t 10000", + "build": "tsc", + "prettier": "prettier --config prettier.config.js --write 'src/**/*.{tsx,ts,jsx,js,css,json,vue}'" + }, + "engines": { + "node": ">=10" + }, + "keywords": [ + "tencentcloudapi", + "tencentcloud", + "qcloud", + "sdk", + "js", + "nodejs" + ], + "author": "tencentcloudapi", + "license": "Apache-2.0", + "dependencies": { + "tencentcloud-sdk-nodejs-common": "^4.0.488" + }, + "directories": { + "example": "examples", + "lib": "lib" + }, + "repository": { + "type": "git", + "url": "https://github.com/tencentcloud/tencentcloud-sdk-nodejs" + }, + "devDependencies": { + "@types/form-data": "^2.5.0", + "@types/node": "^14.0.26", + "@types/node-fetch": "^2.5.7", + "@typescript-eslint/eslint-plugin": "^2.34.0", + "@typescript-eslint/parser": "^2.34.0", + "chai": "^4.2.0", + "eslint": "^6.8.0", + "mocha": "^8.1.1", + "ts-node": "^8.10.2", + "typescript": "^3.9.7" + } +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/prettier.config.js b/node/node_modules/tencentcloud-sdk-nodejs-sms/prettier.config.js new file mode 100644 index 0000000..5378237 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/prettier.config.js @@ -0,0 +1,38 @@ +// prettier.config.js +module.exports = { + // 一行最多 100 字符 + printWidth: 100, + // 使用 4 个空格缩进 + tabWidth: 2, + // 不使用缩进符,而使用空格 + useTabs: false, + // 行尾需要有分号 + semi: false, + // 使用单引号 + singleQuote: false, + // 对象的 key 仅在必要时用引号 + quoteProps: "as-needed", + // jsx 不使用单引号,而使用双引号 + jsxSingleQuote: false, + // 末尾不需要逗号 + trailingComma: "es5", + // 大括号内的首尾需要空格 + bracketSpacing: true, + // jsx 标签的反尖括号需要换行 + jsxBracketSameLine: false, + // 箭头函数,只有一个参数的时候,也需要括号 + arrowParens: "always", + // 每个文件格式化的范围是文件的全部内容 + rangeStart: 0, + rangeEnd: Infinity, + // 不需要写文件开头的 @prettier + requirePragma: false, + // 不需要自动在文件开头插入 @prettier + insertPragma: false, + // 使用默认的折行标准 + proseWrap: "preserve", + // 根据显示样式决定 html 要不要折行 + htmlWhitespaceSensitivity: "css", + // 换行符使用 lf + endOfLine: "lf", +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/products.md b/node/node_modules/tencentcloud-sdk-nodejs-sms/products.md new file mode 100644 index 0000000..150367e --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/products.md @@ -0,0 +1,246 @@ +| 包名 | 产品中文名 | 更新时间 | +|-|-|-| +| aa | [活动防刷](https://cloud.tencent.com/document/product/1189) | 2023-05-18 01:01:13 | +| aai | [](https://cloud.tencent.com/document/product) | 2019-08-08 23:15:13 | +| acp | [应用合规平台](https://cloud.tencent.com/document/product/1553) | 2024-03-12 01:07:35 | +| advisor | [云顾问](https://cloud.tencent.com/document/product/1264) | 2024-03-12 01:07:39 | +| af | [借贷反欺诈](https://cloud.tencent.com/document/product/668) | 2024-03-12 01:07:41 | +| afc | [定制建模](https://cloud.tencent.com/document/product/1029) | 2024-03-12 01:07:43 | +| aiart | [大模型图像创作引擎](https://cloud.tencent.com/document/product/1668) | 2024-03-13 01:07:42 | +| ame | [正版曲库直通车](https://cloud.tencent.com/document/product/1155) | 2023-08-17 01:06:14 | +| ams | [音频内容安全](https://cloud.tencent.com/document/product/1219) | 2024-03-12 01:07:46 | +| anicloud | [动效素材服务](https://cloud.tencent.com/document/product/1641) | 2023-05-18 01:01:53 | +| antiddos | [T-Sec-DDoS防护(Anti-DDoS)](https://cloud.tencent.com/document/product/297) | 2024-03-12 01:07:50 | +| apcas | [汽车精准获客服务](https://cloud.tencent.com/document/product/1244) | 2022-04-04 06:05:36 | +| ape | [正版图库直通车](https://cloud.tencent.com/document/product/1181) | 2022-04-04 06:05:40 | +| api | [云 API](https://cloud.tencent.com/document/product/1278) | 2023-01-05 01:02:52 | +| apigateway | [API 网关](https://cloud.tencent.com/document/product/628) | 2024-03-12 01:08:27 | +| apm | [应用性能监控](https://cloud.tencent.com/document/product/1463) | 2024-03-12 01:09:06 | +| as | [弹性伸缩](https://cloud.tencent.com/document/product/377) | 2024-03-12 01:09:11 | +| asr | [语音识别](https://cloud.tencent.com/document/product/1093) | 2024-03-12 01:09:34 | +| asw | [应用与服务编排工作流](https://cloud.tencent.com/document/product/1272) | 2023-05-18 01:04:02 | +| ba | [ICP备案](https://cloud.tencent.com/document/product/243) | 2024-03-12 01:09:45 | +| batch | [批量计算](https://cloud.tencent.com/document/product/599) | 2024-03-12 01:09:46 | +| bda | [人体分析](https://cloud.tencent.com/document/product/1208) | 2024-03-12 01:09:59 | +| bi | [商业智能分析 BI](https://cloud.tencent.com/document/product/590) | 2024-03-12 01:10:06 | +| billing | [费用中心](https://cloud.tencent.com/document/product/555) | 2024-03-12 01:10:17 | +| bizlive | [商业直播](https://cloud.tencent.com/document/product) | 2020-03-10 01:08:07 | +| bm | [黑石物理服务器CPM](https://cloud.tencent.com/document/product/386) | 2024-03-12 19:49:25 | +| bma | [品牌经营管家](https://cloud.tencent.com/document/product/1296) | 2024-03-12 01:10:49 | +| bmeip | [黑石弹性公网IP](https://cloud.tencent.com/document/product/1028) | 2024-03-12 01:10:54 | +| bmlb | [黑石负载均衡](https://cloud.tencent.com/document/product/1027) | 2024-03-12 01:11:02 | +| bmvpc | [黑石私有网络](https://cloud.tencent.com/document/product/1024) | 2024-03-12 01:11:28 | +| bpaas | [商业流程服务](https://cloud.tencent.com/document/product/1083) | 2024-03-12 01:11:48 | +| bri | [业务风险情报](https://cloud.tencent.com/document/product/1064) | 2024-03-12 01:11:50 | +| bsca | [二进制软件成分分析](https://cloud.tencent.com/document/product/1483) | 2024-03-12 01:11:51 | +| btoe | [区块链可信取证](https://cloud.tencent.com/document/product/1259) | 2024-03-12 01:11:54 | +| cam | [访问管理](https://cloud.tencent.com/document/product/598) | 2024-03-12 19:49:56 | +| captcha | [验证码](https://cloud.tencent.com/document/product/1110) | 2024-03-12 01:12:18 | +| car | [应用云渲染](https://cloud.tencent.com/document/product/1547) | 2024-03-12 01:12:25 | +| cat | [云拨测](https://cloud.tencent.com/document/product/280) | 2024-03-13 01:09:29 | +| cbs | [云硬盘](https://cloud.tencent.com/document/product/362) | 2024-03-12 01:12:33 | +| ccc | [云联络中心](https://cloud.tencent.com/document/product/679) | 2024-03-13 01:09:37 | +| cdb | [云数据库 MySQL](https://cloud.tencent.com/document/product/236) | 2024-03-13 01:09:46 | +| cdc | [本地专用集群](https://cloud.tencent.com/document/product/1346) | 2024-03-12 01:14:14 | +| cdn | [内容分发网络 CDN](https://cloud.tencent.com/document/product/228) | 2024-03-12 01:14:23 | +| cds | [T-Sec-数据安全审计(DSA)](https://cloud.tencent.com/document/product/856) | 2024-03-12 01:14:59 | +| cdwch | [云数据仓库 ClickHouse](https://cloud.tencent.com/document/product/1299) | 2024-03-12 01:15:02 | +| cdwdoris | [腾讯云数据仓库 TCHouse-D](https://cloud.tencent.com/document/product/1387) | 2024-03-12 01:15:12 | +| cdwpg | [云数据仓库 PostgreSQL](https://cloud.tencent.com/document/product/878) | 2024-03-12 01:15:19 | +| cfg | [混沌演练平台](https://cloud.tencent.com/document/product/1500) | 2024-03-12 01:15:23 | +| cfs | [文件存储](https://cloud.tencent.com/document/product/582) | 2024-03-12 01:15:29 | +| cfw | [云防火墙](https://cloud.tencent.com/document/product/1132) | 2024-03-12 01:15:46 | +| chdfs | [云 HDFS](https://cloud.tencent.com/document/product/1105) | 2024-03-12 01:16:36 | +| ciam | [账号风控平台](https://cloud.tencent.com/document/product/1441) | 2024-03-12 01:16:46 | +| cii | [智能保险助手](https://cloud.tencent.com/document/product/1368) | 2023-05-18 01:12:07 | +| cim | [](https://cloud.tencent.com/document/product) | 2019-05-16 17:21:18 | +| cis | [](https://cloud.tencent.com/document/product) | 2018-06-07 15:01:42 | +| ckafka | [消息队列 CKafka 版](https://cloud.tencent.com/document/product/597) | 2024-03-12 01:16:57 | +| clb | [负载均衡](https://cloud.tencent.com/document/product/214) | 2024-03-12 19:50:19 | +| cloudaudit | [操作审计](https://cloud.tencent.com/document/product/629) | 2024-01-15 01:09:37 | +| cloudhsm | [云加密机](https://cloud.tencent.com/document/product/639) | 2024-03-12 01:17:48 | +| cloudstudio | [Cloud Studio(云端 IDE)](https://cloud.tencent.com/document/product/1039) | 2024-03-12 01:17:53 | +| cls | [日志服务](https://cloud.tencent.com/document/product/614) | 2024-03-13 01:11:37 | +| cme | [多媒体创作引擎](https://cloud.tencent.com/document/product/1156) | 2023-12-05 01:27:33 | +| cmq | [消息队列 CMQ](https://cloud.tencent.com/document/product/406) | 2024-03-12 01:18:40 | +| cms | [内容安全](https://cloud.tencent.com/document/product/669) | 2024-03-12 01:18:46 | +| config | [配置审计](https://cloud.tencent.com/document/product/1579) | 2024-03-12 01:18:49 | +| cpdp | [企业收付平台](https://cloud.tencent.com/document/product/1122) | 2023-09-21 02:09:54 | +| cr | [金融联络机器人](https://cloud.tencent.com/document/product/656) | 2021-02-24 08:03:24 | +| csip | [云安全一体化平台](https://cloud.tencent.com/document/product/664) | 2024-03-12 01:18:51 | +| csxg | [5G入云服务](https://cloud.tencent.com/document/product/1687) | 2024-03-12 01:19:07 | +| cvm | [云服务器](https://cloud.tencent.com/document/product/213) | 2024-03-12 01:19:09 | +| cwp | [主机安全](https://cloud.tencent.com/document/product/296) | 2024-03-12 01:19:53 | +| cws | [漏洞扫描服务](https://cloud.tencent.com/document/product) | 2019-11-22 12:16:15 | +| cynosdb | [TDSQL-C MySQL 版](https://cloud.tencent.com/document/product/1003) | 2024-03-12 01:23:13 | +| dasb | [T-Sec-堡垒机(BH)](https://cloud.tencent.com/document/product/1025) | 2024-03-12 01:24:05 | +| dataintegration | [数据接入平台](https://cloud.tencent.com/document/product/1591) | 2022-07-26 15:32:15 | +| dayu | [DDoS 高防包](https://cloud.tencent.com/document/product/1021) | 2023-05-18 01:20:11 | +| dbbrain | [数据库智能管家 DBbrain](https://cloud.tencent.com/document/product/1130) | 2024-03-13 01:13:43 | +| dbdc | [云数据库独享集群](https://cloud.tencent.com/document/product/1322) | 2024-03-12 01:24:53 | +| dc | [专线接入](https://cloud.tencent.com/document/product/216) | 2024-03-12 01:24:56 | +| dcdb | [TDSQL MySQL 版](https://cloud.tencent.com/document/product/557) | 2024-03-12 01:25:05 | +| dlc | [数据湖计算 DLC](https://cloud.tencent.com/document/product/1342) | 2024-03-12 01:25:34 | +| dnspod | [DNSPod](https://cloud.tencent.com/document/product/1427) | 2024-03-12 01:26:21 | +| domain | [域名注册](https://cloud.tencent.com/document/product/242) | 2024-03-13 01:14:31 | +| drm | [数字版权管理](https://cloud.tencent.com/document/product/1000) | 2024-03-12 01:27:01 | +| ds | [文档服务](https://cloud.tencent.com/document/product/869) | 2024-03-12 01:27:05 | +| dsgc | [数据安全治理中心](https://cloud.tencent.com/document/product/1087) | 2024-03-12 01:27:10 | +| dtf | [分布式事务](https://cloud.tencent.com/document/product/1224) | 2022-04-04 06:38:57 | +| dts | [数据传输服务](https://cloud.tencent.com/document/product/571) | 2024-03-13 01:15:00 | +| eb | [事件总线](https://cloud.tencent.com/document/product/1359) | 2024-03-12 01:28:33 | +| ecc | [英文作文批改](https://cloud.tencent.com/document/product/1076) | 2024-03-12 01:28:45 | +| ecdn | [全站加速网络](https://cloud.tencent.com/document/product/570) | 2024-03-12 01:28:47 | +| ecm | [边缘计算机器](https://cloud.tencent.com/document/product/1108) | 2024-03-12 01:28:55 | +| eiam | [数字身份管控平台(员工版)](https://cloud.tencent.com/document/product/1442) | 2024-03-12 01:29:44 | +| eis | [数据连接器](https://cloud.tencent.com/document/product/1270) | 2023-08-10 01:17:44 | +| emr | [弹性 MapReduce](https://cloud.tencent.com/document/product/589) | 2024-03-12 01:29:59 | +| es | [Elasticsearch Service](https://cloud.tencent.com/document/product/845) | 2024-03-12 01:30:18 | +| ess | [腾讯电子签企业版](https://cloud.tencent.com/document/product/1323) | 2024-03-11 01:15:16 | +| essbasic | [腾讯电子签(基础版)](https://cloud.tencent.com/document/product/1420) | 2024-03-13 01:15:56 | +| facefusion | [人脸融合](https://cloud.tencent.com/document/product/670) | 2024-03-12 01:31:22 | +| faceid | [人脸核身](https://cloud.tencent.com/document/product/1007) | 2024-03-12 19:51:24 | +| fmu | [人脸试妆](https://cloud.tencent.com/document/product/1172) | 2024-03-12 01:31:30 | +| ft | [人像变换](https://cloud.tencent.com/document/product/1202) | 2024-03-12 01:31:35 | +| gaap | [全球应用加速](https://cloud.tencent.com/document/product/608) | 2024-03-12 01:31:38 | +| gme | [游戏多媒体引擎](https://cloud.tencent.com/document/product/607) | 2024-03-12 01:32:15 | +| goosefs | [数据加速器 GooseFS](https://cloud.tencent.com/document/product/1424) | 2024-03-12 01:32:26 | +| gpm | [游戏玩家匹配](https://cloud.tencent.com/document/product/1294) | 2022-07-11 06:12:36 | +| gs | [云游戏](https://cloud.tencent.com/document/product/1162) | 2024-03-12 01:32:33 | +| gse | [游戏服务器伸缩](https://cloud.tencent.com/document/product/1165) | 2022-07-11 06:12:44 | +| habo | [](https://cloud.tencent.com/document/product) | 2019-05-09 19:37:22 | +| hai | [高性能应用服务](https://cloud.tencent.com/document/product/1721) | 2024-03-12 11:37:33 | +| hasim | [高可用物联网卡](https://cloud.tencent.com/document/product/1482) | 2023-05-18 01:29:47 | +| hcm | [数学作业批改](https://cloud.tencent.com/document/product/1004) | 2024-03-12 01:32:40 | +| hunyuan | [腾讯混元大模型](https://cloud.tencent.com/document/product/1729) | 2024-03-11 15:37:37 | +| iai | [人脸识别](https://cloud.tencent.com/document/product/867) | 2024-03-12 01:32:45 | +| ic | [图片瘦身](https://cloud.tencent.com/document/product/636) | 2023-03-02 01:23:21 | +| icr | [对话机器人](https://cloud.tencent.com/document/product/1268) | 2024-03-12 01:33:01 | +| ie | [智能编辑](https://cloud.tencent.com/document/product/1186) | 2023-08-17 03:20:18 | +| iecp | [物联网边缘计算平台](https://cloud.tencent.com/document/product/1118) | 2024-03-12 01:33:02 | +| iir | [智能识图](https://cloud.tencent.com/document/product/1217) | 2022-04-04 06:48:05 | +| ims | [图片内容安全](https://cloud.tencent.com/document/product/1125) | 2024-03-12 01:33:38 | +| ioa | [iOA 零信任安全管理系统](https://cloud.tencent.com/document/product/1092) | 2024-03-12 01:33:40 | +| iot | [加速物联网套件](https://cloud.tencent.com/document/product/568) | 2023-07-17 01:22:28 | +| iotcloud | [物联网通信](https://cloud.tencent.com/document/product/634) | 2024-03-12 01:33:42 | +| iotexplorer | [物联网开发平台](https://cloud.tencent.com/document/product/1081) | 2024-03-12 01:34:08 | +| iottid | [物联网设备身份认证](https://cloud.tencent.com/document/product/1086) | 2023-05-18 01:33:02 | +| iotvideo | [物联网智能视频服务](https://cloud.tencent.com/document/product/1131) | 2024-03-12 01:34:52 | +| iotvideoindustry | [物联网智能视频服务(行业版)](https://cloud.tencent.com/document/product/1361) | 2024-03-12 01:35:29 | +| irp | [智能推荐平台](https://cloud.tencent.com/document/product/1541) | 2024-03-12 01:36:07 | +| iss | [智能视图计算平台](https://cloud.tencent.com/document/product/1344) | 2024-03-12 01:36:10 | +| ivld | [媒体智能标签](https://cloud.tencent.com/document/product/1509) | 2024-03-12 01:36:41 | +| keewidb | [云数据库 KeeWiDB](https://cloud.tencent.com/document/product/1520) | 2024-03-12 01:36:51 | +| kms | [密钥管理系统](https://cloud.tencent.com/document/product/573) | 2024-03-12 01:37:06 | +| lcic | [实时互动-教育版](https://cloud.tencent.com/document/product/1639) | 2024-03-12 01:37:24 | +| lighthouse | [轻量应用服务器](https://cloud.tencent.com/document/product/1207) | 2024-03-12 01:37:46 | +| live | [云直播CSS](https://cloud.tencent.com/document/product/267) | 2024-03-12 01:38:26 | +| lowcode | [云开发低码](https://cloud.tencent.com/document/product/1301) | 2022-04-04 06:56:51 | +| lp | [登录保护](https://cloud.tencent.com/document/product/1190) | 2022-04-04 06:56:52 | +| mall | [商场客留大数据](https://cloud.tencent.com/document/product/1707) | 2024-03-12 01:39:23 | +| mariadb | [云数据库 MariaDB](https://cloud.tencent.com/document/product/237) | 2024-03-12 01:39:24 | +| market | [云市场](https://cloud.tencent.com/document/product/306) | 2024-03-12 01:39:50 | +| memcached | [云数据库Memcached](https://cloud.tencent.com/document/product/241) | 2024-03-12 01:39:51 | +| mgobe | [游戏联机对战引擎](https://cloud.tencent.com/document/product/1038) | 2022-07-08 06:11:32 | +| mmps | [小程序安全](https://cloud.tencent.com/document/product/1223) | 2024-03-12 01:39:52 | +| mna | [多网聚合加速](https://cloud.tencent.com/document/product/1385) | 2024-03-12 01:39:57 | +| mongodb | [云数据库 MongoDB](https://cloud.tencent.com/document/product/240) | 2024-03-13 01:19:31 | +| monitor | [腾讯云可观测平台](https://cloud.tencent.com/document/product/248) | 2024-03-12 11:37:38 | +| mps | [媒体处理](https://cloud.tencent.com/document/product/862) | 2024-03-12 01:41:19 | +| mrs | [医疗报告结构化](https://cloud.tencent.com/document/product/1314) | 2024-03-12 01:42:05 | +| ms | [移动应用安全](https://cloud.tencent.com/document/product/283) | 2024-03-12 01:42:14 | +| msp | [迁移服务平台](https://cloud.tencent.com/document/product/659) | 2024-03-12 01:42:23 | +| mvj | [营销价值判断](https://cloud.tencent.com/document/product) | 2020-03-19 08:11:44 | +| nlp | [NLP 服务](https://cloud.tencent.com/document/product/271) | 2024-03-12 01:42:26 | +| npp | [号码保护](https://cloud.tencent.com/document/product) | 2020-04-22 08:00:22 | +| oceanus | [流计算 Oceanus](https://cloud.tencent.com/document/product/849) | 2024-03-12 01:42:31 | +| ocr | [文字识别](https://cloud.tencent.com/document/product/866) | 2024-03-13 01:20:34 | +| omics | [腾讯健康组学平台](https://cloud.tencent.com/document/product/1643) | 2024-03-12 01:43:25 | +| organization | [集团账号管理](https://cloud.tencent.com/document/product/850) | 2024-03-12 01:43:35 | +| partners | [渠道合作伙伴](https://cloud.tencent.com/document/product/563) | 2024-03-12 01:43:51 | +| pds | [私域安全](https://cloud.tencent.com/document/product/1473) | 2023-05-18 01:44:14 | +| postgres | [云数据库 PostgreSQL](https://cloud.tencent.com/document/product/409) | 2024-03-12 01:43:59 | +| privatedns | [私有域解析 Private DNS](https://cloud.tencent.com/document/product/1338) | 2024-03-12 01:44:34 | +| pts | [云压测](https://cloud.tencent.com/document/product/1484) | 2024-03-12 01:44:44 | +| rce | [全栈式风控引擎](https://cloud.tencent.com/document/product/1343) | 2024-03-12 01:45:01 | +| redis | [云数据库Redis](https://cloud.tencent.com/document/product/239) | 2024-03-12 01:45:03 | +| region | [地域管理系统](https://cloud.tencent.com/document/product/1596) | 2024-03-12 01:45:39 | +| rkp | [风险探针](https://cloud.tencent.com/document/product/1169) | 2023-12-25 00:16:39 | +| rp | [注册保护](https://cloud.tencent.com/document/product/1191) | 2022-04-04 07:04:06 | +| rum | [前端性能监控](https://cloud.tencent.com/document/product/1464) | 2024-03-12 01:45:41 | +| scf | [云函数](https://cloud.tencent.com/document/product/583) | 2024-03-12 01:46:04 | +| ses | [邮件推送](https://cloud.tencent.com/document/product/1288) | 2024-03-12 01:46:29 | +| smh | [智能媒资托管](https://cloud.tencent.com/document/product/1339) | 2024-03-12 01:46:38 | +| smop | [腾讯安心用户运营平台](https://cloud.tencent.com/document/product/1310) | 2024-03-12 01:46:43 | +| smpn | [营销号码安全](https://cloud.tencent.com/document/product/1127) | 2024-03-12 01:46:44 | +| sms | [短信](https://cloud.tencent.com/document/product/382) | 2024-03-12 01:46:46 | +| soe | [智聆口语评测](https://cloud.tencent.com/document/product/884) | 2024-03-12 01:46:54 | +| solar | [智汇零售](https://cloud.tencent.com/document/product) | 2020-03-19 08:01:59 | +| sqlserver | [云数据库 SQL Server](https://cloud.tencent.com/document/product/238) | 2024-03-12 01:46:58 | +| ssa | [安全运营中心](https://cloud.tencent.com/document/product/664) | 2023-11-15 02:18:28 | +| ssl | [SSL 证书](https://cloud.tencent.com/document/product/400) | 2024-03-12 01:47:52 | +| sslpod | [证书监控 SSLPod](https://cloud.tencent.com/document/product/1084) | 2024-03-12 01:48:16 | +| ssm | [凭据管理系统](https://cloud.tencent.com/document/product/1140) | 2024-03-12 01:48:20 | +| sts | [安全凭证服务](https://cloud.tencent.com/document/product/1312) | 2024-03-12 01:48:29 | +| svp | [节省计划](https://cloud.tencent.com/document/product/1761) | 2024-03-12 01:48:32 | +| taf | [流量反欺诈](https://cloud.tencent.com/document/product/1031) | 2024-03-12 01:48:33 | +| tag | [标签](https://cloud.tencent.com/document/product/651) | 2024-03-12 01:48:35 | +| tan | [碳引擎](https://cloud.tencent.com/document/product/1498) | 2024-03-12 01:48:46 | +| tat | [自动化助手](https://cloud.tencent.com/document/product/1340) | 2024-03-12 01:48:47 | +| tav | [文件检测](https://cloud.tencent.com/document/product) | 2019-11-28 22:10:04 | +| tbaas | [腾讯云区块链服务平台 TBaaS](https://cloud.tencent.com/document/product/663) | 2024-03-12 01:48:58 | +| tbm | [](https://cloud.tencent.com/document/product) | 2019-03-29 14:49:11 | +| tbp | [腾讯智能对话平台](https://cloud.tencent.com/document/product/1060) | 2024-03-12 01:49:10 | +| tcaplusdb | [游戏数据库 TcaplusDB](https://cloud.tencent.com/document/product/596) | 2024-03-12 01:49:11 | +| tcb | [云开发 CloudBase](https://cloud.tencent.com/document/product/876) | 2024-03-12 01:49:30 | +| tcbr | [云托管 CloudBase Run](https://cloud.tencent.com/document/product/1243) | 2024-03-12 01:50:06 | +| tcex | [腾讯云释义](https://cloud.tencent.com/document/product/1266) | 2022-07-21 06:17:29 | +| tchd | [腾讯云健康看板](https://cloud.tencent.com/document/product/1688) | 2024-03-12 01:50:10 | +| tci | [腾讯智学课堂分析](https://cloud.tencent.com/document/product) | 2020-08-24 08:06:03 | +| tcm | [服务网格](https://cloud.tencent.com/document/product/1261) | 2024-03-12 01:50:11 | +| tcr | [容器镜像服务](https://cloud.tencent.com/document/product/1141) | 2024-03-12 01:50:17 | +| tcss | [容器安全服务](https://cloud.tencent.com/document/product/1285) | 2024-03-12 01:51:00 | +| tdcpg | [TDSQL-C PostgreSQL 版](https://cloud.tencent.com/document/product/1556) | 2024-03-12 01:53:11 | +| tdid | [分布式身份](https://cloud.tencent.com/document/product/1439) | 2024-03-12 01:53:20 | +| tdmq | [消息队列 TDMQ](https://cloud.tencent.com/document/product/1179) | 2024-03-13 01:24:22 | +| tds | [设备安全](https://cloud.tencent.com/document/product/1628) | 2024-03-12 01:54:17 | +| tem | [弹性微服务](https://cloud.tencent.com/document/product/1371) | 2024-03-12 01:54:19 | +| teo | [边缘安全加速平台](https://cloud.tencent.com/document/product/1552) | 2024-03-13 01:24:49 | +| thpc | [高性能计算平台](https://cloud.tencent.com/document/product/1527) | 2024-03-12 01:55:22 | +| tia | [智能钛机器学习](https://cloud.tencent.com/document/product/851) | 2021-10-21 11:12:52 | +| tic | [资源编排 TIC](https://cloud.tencent.com/document/product/1213) | 2023-08-17 05:26:08 | +| ticm | [智能鉴黄](https://cloud.tencent.com/document/product/864) | 2021-01-07 08:08:15 | +| tics | [威胁情报云查服务](https://cloud.tencent.com/document/product/1013) | 2024-03-12 01:55:30 | +| tiems | [腾讯云 TI 平台 TI-EMS ](https://cloud.tencent.com/document/product/1120) | 2022-07-19 06:19:39 | +| tiia | [图像分析](https://cloud.tencent.com/document/product/865) | 2024-03-12 01:55:32 | +| tione | [TI-ONE 训练平台](https://cloud.tencent.com/document/product/851) | 2024-03-13 01:25:17 | +| tiw | [互动白板](https://cloud.tencent.com/document/product/1137) | 2024-03-12 01:56:17 | +| tke | [容器服务](https://cloud.tencent.com/document/product/457) | 2024-03-12 01:58:07 | +| tkgdq | [腾讯知识图谱数据查询](https://cloud.tencent.com/document/product) | 2020-03-10 00:51:44 | +| tms | [文本内容安全](https://cloud.tencent.com/document/product/1124) | 2024-03-12 01:58:09 | +| tmt | [机器翻译](https://cloud.tencent.com/document/product/551) | 2024-03-12 01:58:11 | +| tourism | [文旅客情大数据](https://cloud.tencent.com/document/product/1684) | 2024-03-12 01:58:14 | +| trdp | [流量风险决策平台](https://cloud.tencent.com/document/product/1604) | 2023-05-18 02:01:19 | +| trocket | [消息队列 RocketMQ 版](https://cloud.tencent.com/document/product/1493) | 2024-03-12 01:58:15 | +| trp | [T-Sec-安心平台(RP)](https://cloud.tencent.com/document/product/1458) | 2024-03-12 01:58:33 | +| trro | [远程实时操控](https://cloud.tencent.com/document/product/1584) | 2024-03-12 01:58:53 | +| trtc | [实时音视频](https://cloud.tencent.com/document/product/647) | 2024-03-12 10:45:07 | +| tse | [微服务引擎](https://cloud.tencent.com/document/product/1364) | 2024-03-12 01:59:06 | +| tsf | [微服务平台 TSF](https://cloud.tencent.com/document/product/649) | 2024-02-23 01:26:28 | +| tsw | [微服务观测平台 TSW](https://cloud.tencent.com/document/product/1311) | 2024-03-12 02:00:39 | +| tts | [语音合成](https://cloud.tencent.com/document/product/1073) | 2024-03-12 02:00:41 | +| ump | [客流数字化平台](https://cloud.tencent.com/document/product/1320) | 2024-03-12 02:00:43 | +| vm | [视频内容安全](https://cloud.tencent.com/document/product/1265) | 2024-03-12 02:00:49 | +| vms | [语音消息](https://cloud.tencent.com/document/product/1128) | 2024-03-12 02:00:52 | +| vod | [云点播](https://cloud.tencent.com/document/product/266) | 2024-03-12 02:00:55 | +| vpc | [私有网络](https://cloud.tencent.com/document/product/215) | 2024-03-12 02:02:20 | +| vrs | [声音复刻](https://cloud.tencent.com/document/product/1283) | 2024-03-12 02:04:17 | +| waf | [Web 应用防火墙](https://cloud.tencent.com/document/product/627) | 2024-03-12 02:04:20 | +| wav | [企业微信汽车行业版](https://cloud.tencent.com/document/product/1318) | 2024-03-12 02:05:11 | +| wedata | [数据开发治理平台 WeData](https://cloud.tencent.com/document/product/1267) | 2024-03-13 01:28:24 | +| weilingwith | [微瓴同业开放平台](https://cloud.tencent.com/document/product/1693) | 2024-03-12 02:07:35 | +| wss | [SSL证书管理服务](https://cloud.tencent.com/document/product) | 2020-04-01 08:53:44 | +| yinsuda | [音速达直播音乐版权引擎](https://cloud.tencent.com/document/product/1592) | 2024-03-12 02:07:58 | +| youmall | [](https://cloud.tencent.com/document/product) | 2019-01-11 11:24:15 | +| yunjing | [主机安全](https://cloud.tencent.com/document/product) | 2020-09-15 08:08:47 | +| yunsou | [腾讯云搜TCS](https://cloud.tencent.com/document/product/270) | 2024-03-12 02:08:06 | \ No newline at end of file diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/src/index.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/index.ts new file mode 100644 index 0000000..b19cc05 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/index.ts @@ -0,0 +1 @@ +export * from "./services" \ No newline at end of file diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/index.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/index.ts new file mode 100644 index 0000000..9d9bb51 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/index.ts @@ -0,0 +1 @@ +export { sms } from "./sms" \ No newline at end of file diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/index.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/index.ts new file mode 100644 index 0000000..d67fb89 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/index.ts @@ -0,0 +1,7 @@ +import { v20190711 } from "./v20190711" +import { v20210111 } from "./v20210111" + +export const sms = { + v20190711: v20190711, + v20210111: v20210111, +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/index.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/index.ts new file mode 100644 index 0000000..1a8ca96 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/index.ts @@ -0,0 +1,6 @@ +import * as Models from "./sms_models" +import { Client } from "./sms_client" +export const v20190711 = { + Client: Client, + Models: Models, +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/sms_client.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/sms_client.ts new file mode 100644 index 0000000..4dbf95a --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/sms_client.ts @@ -0,0 +1,280 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* + * Copyright (c) 2018 THL A29 Limited, a Tencent company. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import * as TencentCloudCommon from "tencentcloud-sdk-nodejs-common" +import { + PullSmsReplyStatusRequest, + DeleteSmsTemplateResponse, + ModifySmsTemplateResponse, + ModifySmsSignRequest, + AddSmsSignRequest, + AddTemplateStatus, + DescribeSmsTemplateListResponse, + PullSmsSendStatusByPhoneNumberRequest, + AddSmsTemplateRequest, + ModifySmsTemplateRequest, + PullSmsReplyStatus, + CallbackStatusStatisticsResponse, + PullSmsSendStatusRequest, + SmsPackagesStatistics, + PullSmsSendStatusByPhoneNumberResponse, + ModifySignStatus, + DescribeSignListStatus, + SendSmsResponse, + SendStatusStatisticsResponse, + SendSmsRequest, + SendStatusStatistics, + CallbackStatusStatisticsRequest, + DeleteTemplateStatus, + DescribeSmsSignListRequest, + SmsPackagesStatisticsRequest, + DescribeTemplateListStatus, + AddSmsTemplateResponse, + PullSmsSendStatus, + DescribeSmsSignListResponse, + DescribeSmsTemplateListRequest, + CallbackStatusStatistics, + SendStatusStatisticsRequest, + DeleteSmsTemplateRequest, + PullSmsReplyStatusByPhoneNumberResponse, + SendStatus, + DeleteSmsSignResponse, + AddSmsSignResponse, + DeleteSmsSignRequest, + PullSmsReplyStatusByPhoneNumberRequest, + ModifySmsSignResponse, + AddSignStatus, + ModifyTemplateStatus, + PullSmsSendStatusResponse, + SmsPackagesStatisticsResponse, + DeleteSignStatus, + PullSmsReplyStatusResponse, +} from "./sms_models" + +/** + * sms client + * @class + */ +export class Client extends TencentCloudCommon.AbstractClient { + constructor(clientConfig: TencentCloudCommon.ClientConfig) { + super("sms.tencentcloudapi.com", "2019-07-11", clientConfig) + } + + /** + * 1. 修改短信签名,修改之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 +2. ⚠️注意:个人认证用户不支持使用 API 修改短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信签名。 +3. 修改短信签名,仅当签名为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的签名不支持修改。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async ModifySmsSign( + req: ModifySmsSignRequest, + cb?: (error: string, rep: ModifySmsSignResponse) => void + ): Promise { + return this.request("ModifySmsSign", req, cb) + } + + /** + * 1. 添加短信签名,申请之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 +2. ⚠️注意:个人认证用户不支持使用 API 申请短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录控制台申请短信签名。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async AddSmsSign( + req: AddSmsSignRequest, + cb?: (error: string, rep: AddSmsSignResponse) => void + ): Promise { + return this.request("AddSmsSign", req, cb) + } + + /** + * 拉取短信下发状态。 +目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 +>- 注:此接口需要联系 [sms helper](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsSendStatus( + req: PullSmsSendStatusRequest, + cb?: (error: string, rep: PullSmsSendStatusResponse) => void + ): Promise { + return this.request("PullSmsSendStatus", req, cb) + } + + /** + * 短信发送接口,用于给用户发短信验证码、通知类短信或营销短信。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async SendSms( + req: SendSmsRequest, + cb?: (error: string, rep: SendSmsResponse) => void + ): Promise { + return this.request("SendSms", req, cb) + } + + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信正文模板,请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信正文模板,如需了解请参阅 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DeleteSmsTemplate( + req: DeleteSmsTemplateRequest, + cb?: (error: string, rep: DeleteSmsTemplateResponse) => void + ): Promise { + return this.request("DeleteSmsTemplate", req, cb) + } + + /** + * 用户套餐包信息统计。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async SmsPackagesStatistics( + req: SmsPackagesStatisticsRequest, + cb?: (error: string, rep: SmsPackagesStatisticsResponse) => void + ): Promise { + return this.request("SmsPackagesStatistics", req, cb) + } + + /** + * 统计用户发送短信的数据。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async SendStatusStatistics( + req: SendStatusStatisticsRequest, + cb?: (error: string, rep: SendStatusStatisticsResponse) => void + ): Promise { + return this.request("SendStatusStatistics", req, cb) + } + + /** + * 统计用户回执的数据。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async CallbackStatusStatistics( + req: CallbackStatusStatisticsRequest, + cb?: (error: string, rep: CallbackStatusStatisticsResponse) => void + ): Promise { + return this.request("CallbackStatusStatistics", req, cb) + } + + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DescribeSmsTemplateList( + req: DescribeSmsTemplateListRequest, + cb?: (error: string, rep: DescribeSmsTemplateListResponse) => void + ): Promise { + return this.request("DescribeSmsTemplateList", req, cb) + } + + /** + * 拉取短信回复状态。 +目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 +>- 注:此接口需要联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsReplyStatus( + req: PullSmsReplyStatusRequest, + cb?: (error: string, rep: PullSmsReplyStatusResponse) => void + ): Promise { + return this.request("PullSmsReplyStatus", req, cb) + } + + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 查询短信签名。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DescribeSmsSignList( + req: DescribeSmsSignListRequest, + cb?: (error: string, rep: DescribeSmsSignListResponse) => void + ): Promise { + return this.request("DescribeSmsSignList", req, cb) + } + + /** + * 拉取单个号码短信下发状态。 +目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsSendStatusByPhoneNumber( + req: PullSmsSendStatusByPhoneNumberRequest, + cb?: (error: string, rep: PullSmsSendStatusByPhoneNumberResponse) => void + ): Promise { + return this.request("PullSmsSendStatusByPhoneNumber", req, cb) + } + + /** + * 1. 修改短信正文模板,修改之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 +2. ⚠️注意:个人认证用户不支持使用 API 修改短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信正文模板。 +3. 修改短信模板,仅当正文模板为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的正文模板不支持修改。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async ModifySmsTemplate( + req: ModifySmsTemplateRequest, + cb?: (error: string, rep: ModifySmsTemplateResponse) => void + ): Promise { + return this.request("ModifySmsTemplate", req, cb) + } + + /** + * 拉取单个号码短信回复状态。 +目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsReplyStatusByPhoneNumber( + req: PullSmsReplyStatusByPhoneNumberRequest, + cb?: (error: string, rep: PullSmsReplyStatusByPhoneNumberResponse) => void + ): Promise { + return this.request("PullSmsReplyStatusByPhoneNumber", req, cb) + } + + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信签名。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DeleteSmsSign( + req: DeleteSmsSignRequest, + cb?: (error: string, rep: DeleteSmsSignResponse) => void + ): Promise { + return this.request("DeleteSmsSign", req, cb) + } + + /** + * 1. 添加短信模板,申请之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 +2. ⚠️注意:个人认证用户不支持使用 API 申请短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 申请短信正文模板。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async AddSmsTemplate( + req: AddSmsTemplateRequest, + cb?: (error: string, rep: AddSmsTemplateResponse) => void + ): Promise { + return this.request("AddSmsTemplate", req, cb) + } +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/sms_models.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/sms_models.ts new file mode 100644 index 0000000..32e2205 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20190711/sms_models.ts @@ -0,0 +1,1045 @@ +/* + * Copyright (c) 2018 THL A29 Limited, a Tencent company. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * PullSmsReplyStatus请求参数结构体 + */ +export interface PullSmsReplyStatusRequest { + /** + * 拉取最大条数,最多100条。 + */ + Limit: number + /** + * 短信 SdkAppid 在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际 SdkAppid,例如1400006666。 + */ + SmsSdkAppid: string +} + +/** + * DeleteSmsTemplate返回参数结构体 + */ +export interface DeleteSmsTemplateResponse { + /** + * 删除模板响应 + */ + DeleteTemplateStatus?: DeleteTemplateStatus + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * ModifySmsTemplate返回参数结构体 + */ +export interface ModifySmsTemplateResponse { + /** + * 修改模板参数响应 + */ + ModifyTemplateStatus?: ModifyTemplateStatus + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * ModifySmsSign请求参数结构体 + */ +export interface ModifySmsSignRequest { + /** + * 待修改的签名 ID。 + */ + SignId: number + /** + * 签名名称。 + */ + SignName: string + /** + * 签名类型。其中每种类型后面标注了其可选的 DocumentType(证明类型): +0:公司,可选 DocumentType 有(0,1)。 +1:APP,可选 DocumentType 有(0,1,2,3,4) 。 +2:网站,可选 DocumentType 有(0,1,2,3,5)。 +3:公众号,可选 DocumentType 有(0,1,2,3,8)。 +4:商标,可选 DocumentType 有(7)。 +5:政府/机关事业单位/其他机构,可选 DocumentType 有(2,3)。 +6:小程序,可选 DocumentType 有(0,1,2,3,6)。 +注:必须按照对应关系选择证明类型,否则会审核失败。 + */ + SignType: number + /** + * 证明类型: +0:三证合一。 +1:企业营业执照。 +2:组织机构代码证书。 +3:社会信用代码证书。 +4:应用后台管理截图(个人开发APP)。 +5:网站备案后台截图(个人开发网站)。 +6:小程序设置页面截图(个人认证小程序)。 +7:商标注册书。 +8:公众号设置页面截图(个人认证公众号)。 + */ + DocumentType: number + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 +注:需要和待修改签名International值保持一致,该参数不能直接修改国内签名到国际签名。 + */ + International: number + /** + * 签名用途: +0:自用。 +1:他用。 + */ + UsedMethod: number + /** + * 签名对应的资质证明图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + */ + ProofImage: string + /** + * 委托授权证明。选择 UsedMethod 为他用之后需要提交委托的授权证明。 +图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 +注:只有 UsedMethod 在选择为 1(他用)时,这个字段才会生效。 + */ + CommissionImage?: string + /** + * 签名的申请备注。 + */ + Remark?: string +} + +/** + * AddSmsSign请求参数结构体 + */ +export interface AddSmsSignRequest { + /** + * 签名名称。 +注:不能重复申请已通过或待审核的签名。 + */ + SignName: string + /** + * 签名类型。其中每种类型后面标注了其可选的 DocumentType(证明类型): +0:公司,可选 DocumentType 有(0,1)。 +1:APP,可选 DocumentType 有(0,1,2,3,4) 。 +2:网站,可选 DocumentType 有(0,1,2,3,5)。 +3:公众号,可选 DocumentType 有(0,1,2,3,8)。 +4:商标,可选 DocumentType 有(7)。 +5:政府/机关事业单位/其他机构,可选 DocumentType 有(2,3)。 +6:小程序,可选 DocumentType 有(0,1,2,3,6)。 +注:必须按照对应关系选择证明类型,否则会审核失败。 + */ + SignType: number + /** + * 证明类型: +0:三证合一。 +1:企业营业执照。 +2:组织机构代码证书。 +3:社会信用代码证书。 +4:应用后台管理截图(个人开发APP)。 +5:网站备案后台截图(个人开发网站)。 +6:小程序设置页面截图(个人认证小程序)。 +7:商标注册书。 +8:公众号设置页面截图(个人认证公众号)。 + */ + DocumentType: number + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International: number + /** + * 签名用途: +0:自用。 +1:他用。 + */ + UsedMethod: number + /** + * 签名对应的资质证明图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + */ + ProofImage: string + /** + * 委托授权证明。选择 UsedMethod 为他用之后需要提交委托的授权证明。 +图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 +注:只有 UsedMethod 在选择为 1(他用)时,这个字段才会生效。 + */ + CommissionImage?: string + /** + * 签名的申请备注。 + */ + Remark?: string +} + +/** + * 添加模板参数响应 + */ +export interface AddTemplateStatus { + /** + * 模板参数 + */ + TemplateId: string +} + +/** + * DescribeSmsTemplateList返回参数结构体 + */ +export interface DescribeSmsTemplateListResponse { + /** + * 获取短信模板信息响应 + */ + DescribeTemplateStatusSet?: Array + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * PullSmsSendStatusByPhoneNumber请求参数结构体 + */ +export interface PullSmsSendStatusByPhoneNumberRequest { + /** + * 拉取起始时间,UNIX 时间戳(时间:秒)。 +注:最大可拉取当前时期7天前的数据。 + */ + SendDateTime: number + /** + * 偏移量。 +注:目前固定设置为0。 + */ + Offset: number + /** + * 拉取最大条数,最多 100。 + */ + Limit: number + /** + * 下发目的手机号码,依据 e.164 标准为:+[国家(或地区)码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,例如1400006666。 + */ + SmsSdkAppid: string + /** + * 拉取截止时间,UNIX 时间戳(时间:秒)。 + */ + EndDateTime?: number +} + +/** + * AddSmsTemplate请求参数结构体 + */ +export interface AddSmsTemplateRequest { + /** + * 模板名称。 + */ + TemplateName: string + /** + * 模板内容。 + */ + TemplateContent: string + /** + * 短信类型,0表示普通短信, 1表示营销短信。 + */ + SmsType: number + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International: number + /** + * 模板备注,例如申请原因,使用场景等。 + */ + Remark: string +} + +/** + * ModifySmsTemplate请求参数结构体 + */ +export interface ModifySmsTemplateRequest { + /** + * 待修改的模板的模板 ID。 + */ + TemplateId: number + /** + * 新的模板名称。 + */ + TemplateName: string + /** + * 新的模板内容。 + */ + TemplateContent: string + /** + * 短信类型,0表示普通短信, 1表示营销短信。 + */ + SmsType: number + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International: number + /** + * 模板备注,例如申请原因,使用场景等。 + */ + Remark: string +} + +/** + * 短信回复状态 + */ +export interface PullSmsReplyStatus { + /** + * 短信码号扩展号,默认未开通,如需开通请联系 [sms helper](https://cloud.tencent.com/document/product/382/3773)。 + */ + ExtendCode: string + /** + * 国家(或地区)码。 + */ + NationCode: string + /** + * 手机号码,e.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string + /** + * 短信签名。 + */ + Sign: string + /** + * 用户回复的内容。 + */ + ReplyContent: string + /** + * 回复时间(例如:2019-10-08 17:18:37)。 + */ + ReplyTime: string + /** + * 回复时间,UNIX 时间戳(单位:秒)。 + */ + ReplyUnixTime: number +} + +/** + * CallbackStatusStatistics返回参数结构体 + */ +export interface CallbackStatusStatisticsResponse { + /** + * 回执数据统计响应包体。 + */ + CallbackStatusStatistics?: CallbackStatusStatistics + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * PullSmsSendStatus请求参数结构体 + */ +export interface PullSmsSendStatusRequest { + /** + * 拉取最大条数,最多100条。 + */ + Limit: number + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,例如1400006666。 + */ + SmsSdkAppid: string +} + +/** + * 套餐包信息统计响应包体 + */ +export interface SmsPackagesStatistics { + /** + * 套餐包创建时间,标准时间,例如:2019-10-08 17:18:37。 + */ + PackageCreateTime: string + /** + * 套餐包创建时间,UNIX 时间戳(单位:秒)。 + */ + PackageCreateUnixTime: number + /** + * 套餐包生效时间,标准时间,例如:2019-10-08 17:18:37。 + */ + PackageEffectiveTime: string + /** + * 套餐包生效时间,UNIX 时间戳(单位:秒)。 + */ + PackageEffectiveUnixTime: number + /** + * 套餐包过期时间,标准时间,例如:2019-10-08 17:18:37。 + */ + PackageExpiredTime: string + /** + * 套餐包过期时间,UNIX 时间戳(单位:秒)。 + */ + PackageExpiredUnixTime: number + /** + * 套餐包条数。 + */ + AmountOfPackage: number + /** + * 0表示赠送套餐包,1表示购买套餐包。 + */ + TypeOfPackage: number + /** + * 套餐包 ID。 + */ + PackageId: number + /** + * 当前使用量。 + */ + CurrentUsage: number +} + +/** + * PullSmsSendStatusByPhoneNumber返回参数结构体 + */ +export interface PullSmsSendStatusByPhoneNumberResponse { + /** + * 下发状态响应集合。 + */ + PullSmsSendStatusSet?: Array + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * 修改签名响应 + */ +export interface ModifySignStatus { + /** + * 签名Id + */ + SignId: number + /** + * 签名修改申请Id + */ + SignApplyId: string +} + +/** + * 获取短信签名信息响应 + */ +export interface DescribeSignListStatus { + /** + * 签名Id + */ + SignId: number + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International: number + /** + * 申请签名状态。其中: +0:表示审核通过。 +1:表示审核中。 +-1:表示审核未通过或审核失败。 + */ + StatusCode: number + /** + * 审核回复,审核人员审核后给出的回复,通常是审核未通过的原因。 + */ + ReviewReply: string + /** + * 签名名称。 + */ + SignName: string + /** + * 提交审核时间,UNIX 时间戳(单位:秒)。 + */ + CreateTime: number +} + +/** + * SendSms返回参数结构体 + */ +export interface SendSmsResponse { + /** + * 短信发送状态。 + */ + SendStatusSet?: Array + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * SendStatusStatistics返回参数结构体 + */ +export interface SendStatusStatisticsResponse { + /** + * 发送数据统计响应包体。 + */ + SendStatusStatistics?: SendStatusStatistics + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * SendSms请求参数结构体 + */ +export interface SendSmsRequest { + /** + * 下发手机号码,采用 e.164 标准,格式为+[国家或地区码][手机号],单次请求最多支持200个手机号且要求全为境内手机号或全为境外手机号。 +例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumberSet: Array + /** + * 模板 ID,必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台](https://console.cloud.tencent.com/smsv2) 查看,若向境外手机号发送短信,仅支持使用国际/港澳台短信模板。 + */ + TemplateID: string + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,示例如1400006666。 + */ + SmsSdkAppid: string + /** + * 短信签名内容,使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台](https://console.cloud.tencent.com/smsv2) 查看。注:国内短信为必填参数。 + */ + Sign?: string + /** + * 模板参数,若无模板参数,则设置为空。 + */ + TemplateParamSet?: Array + /** + * 短信码号扩展号,默认未开通,如需开通请联系 [sms helper](https://cloud.tencent.com/document/product/382/3773)。 + */ + ExtendCode?: string + /** + * 用户的 session 内容,可以携带用户侧 ID 等上下文信息,server 会原样返回。注意长度需小于512字节。 + */ + SessionContext?: string + /** + * 国内短信无senderid,无需填写该项;若需开通国际/港澳台短信senderid,请联系smshelper。 + */ + SenderId?: string +} + +/** + * 发送数据统计响应包体 + */ +export interface SendStatusStatistics { + /** + * 短信计费条数统计,例如提交成功量为100条,其中有20条是长短信(长度为80字)被拆分成2条,则计费条数为: ```80 * 1 + 20 * 2 = 120``` 条。 + */ + FeeCount: number + /** + * 短信提交量统计。 + */ + RequestCount: number + /** + * 短信提交成功量统计。 + */ + RequestSuccessCount: number +} + +/** + * CallbackStatusStatistics请求参数结构体 + */ +export interface CallbackStatusStatisticsRequest { + /** + * 开始时间,yyyymmddhh 需要拉取的起始时间,精确到小时。 + */ + StartDateTime: number + /** + * 结束时间,yyyymmddhh 需要拉取的截止时间,精确到小时。 +注:EndDataTime 必须大于 StartDateTime。 + */ + EndDataTime: number + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,示例如1400006666。 + */ + SmsSdkAppid: string + /** + * 最大上限。 +注:目前固定设置为0。 + */ + Limit: number + /** + * 偏移量。 +注:目前固定设置为0。 + */ + Offset: number +} + +/** + * 删除模板响应 + */ +export interface DeleteTemplateStatus { + /** + * 删除状态信息。 + */ + DeleteStatus: string + /** + * 删除时间,UNIX 时间戳(单位:秒)。 + */ + DeleteTime: number +} + +/** + * DescribeSmsSignList请求参数结构体 + */ +export interface DescribeSmsSignListRequest { + /** + * 签名 ID 数组。 + */ + SignIdSet: Array + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International: number +} + +/** + * SmsPackagesStatistics请求参数结构体 + */ +export interface SmsPackagesStatisticsRequest { + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,示例如1400006666。 + */ + SmsSdkAppid: string + /** + * 最大上限(需要拉取的套餐包个数)。 + */ + Limit: number + /** + * 偏移量。 +注:目前固定设置为0。 + */ + Offset: number +} + +/** + * 获取短信模板信息响应 + */ +export interface DescribeTemplateListStatus { + /** + * 模板Id + */ + TemplateId?: number + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International?: number + /** + * 申请模板状态,其中0表示审核通过且已生效,1表示审核中,2表示审核通过待生效,-1表示审核未通过或审核失败。 + */ + StatusCode?: number + /** + * 审核回复,审核人员审核后给出的回复,通常是审核未通过的原因。 + */ + ReviewReply?: string + /** + * 模板名称。 + */ + TemplateName?: string + /** + * 提交审核时间,UNIX 时间戳(单位:秒)。 + */ + CreateTime?: number +} + +/** + * AddSmsTemplate返回参数结构体 + */ +export interface AddSmsTemplateResponse { + /** + * 添加短信模板响应包体 + */ + AddTemplateStatus?: AddTemplateStatus + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * 短信的下发状态详细信息 + */ +export interface PullSmsSendStatus { + /** + * 用户实际接收到短信的时间。 + */ + UserReceiveTime: string + /** + * 用户实际接收到短信的时间,UNIX 时间戳(单位:秒)。 + */ + UserReceiveUnixTime: number + /** + * 国家(或地区)码。 + */ + NationCode: string + /** + * 手机号码,e.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PurePhoneNumber: string + /** + * 手机号码,普通格式,示例如:13711112222。 + */ + PhoneNumber: string + /** + * 本次发送标识 ID。 + */ + SerialNo: string + /** + * 实际是否收到短信接收状态,SUCCESS(成功)、FAIL(失败)。 + */ + ReportStatus: string + /** + * 用户接收短信状态描述。 + */ + Description: string +} + +/** + * DescribeSmsSignList返回参数结构体 + */ +export interface DescribeSmsSignListResponse { + /** + * 获取签名信息响应 + */ + DescribeSignListStatusSet?: Array + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * DescribeSmsTemplateList请求参数结构体 + */ +export interface DescribeSmsTemplateListRequest { + /** + * 模板 ID 数组。 + */ + TemplateIdSet: Array + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International: number +} + +/** + * 回执数据统计响应包体 + */ +export interface CallbackStatusStatistics { + /** + * 短信回执量统计。 + */ + CallbackCount: number + /** + * 短信提交成功量统计。 + */ + RequestSuccessCount: number + /** + * 短信回执失败量统计。 + */ + CallbackFailCount: number + /** + * 短信回执成功量统计。 + */ + CallbackSuccessCount: number + /** + * 运营商内部错误统计。 + */ + InternalErrorCount: number + /** + * 号码无效或空号统计。 + */ + InvalidNumberCount: number + /** + * 停机、关机等错误统计。 + */ + ShutdownErrorCount: number + /** + * 号码拉入黑名单统计。 + */ + BlackListCount: number + /** + * 运营商频率限制统计。 + */ + FrequencyLimitCount: number +} + +/** + * SendStatusStatistics请求参数结构体 + */ +export interface SendStatusStatisticsRequest { + /** + * 拉取起始时间,yyyymmddhh 需要拉取的起始时间,精确到小时。 + */ + StartDateTime: number + /** + * 结束时间,yyyymmddhh 需要拉取的截止时间,精确到小时 +注:EndDataTime 必须大于 StartDateTime。 + */ + EndDataTime: number + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,示例如1400006666。 + */ + SmsSdkAppid: string + /** + * 最大上限。 +注:目前固定设置为0。 + */ + Limit: number + /** + * 偏移量。 +注:目前固定设置为0。 + */ + Offset: number +} + +/** + * DeleteSmsTemplate请求参数结构体 + */ +export interface DeleteSmsTemplateRequest { + /** + * 待删除的模板 ID。 + */ + TemplateId: number +} + +/** + * PullSmsReplyStatusByPhoneNumber返回参数结构体 + */ +export interface PullSmsReplyStatusByPhoneNumberResponse { + /** + * 回复状态响应集合。 + */ + PullSmsReplyStatusSet?: Array + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * 发送短信状态 + */ +export interface SendStatus { + /** + * 发送流水号。 + */ + SerialNo: string + /** + * 手机号码,e.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string + /** + * 计费条数,计费规则请查询 [计费策略](https://cloud.tencent.com/document/product/382/36135)。 + */ + Fee: number + /** + * 用户Session内容。 + */ + SessionContext: string + /** + * 短信请求错误码,具体含义请参考错误码。 + */ + Code: string + /** + * 短信请求错误码描述。 + */ + Message: string + /** + * 国家码或地区码,例如CN,US等,对于未识别出国家码或者地区码,默认返回DEF,具体支持列表请参考国际/港澳台计费总览。 + */ + IsoCode: string +} + +/** + * DeleteSmsSign返回参数结构体 + */ +export interface DeleteSmsSignResponse { + /** + * 删除签名响应 + */ + DeleteSignStatus?: DeleteSignStatus + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * AddSmsSign返回参数结构体 + */ +export interface AddSmsSignResponse { + /** + * 添加签名响应 + */ + AddSignStatus?: AddSignStatus + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * DeleteSmsSign请求参数结构体 + */ +export interface DeleteSmsSignRequest { + /** + * 待删除的签名 ID。 + */ + SignId: number +} + +/** + * PullSmsReplyStatusByPhoneNumber请求参数结构体 + */ +export interface PullSmsReplyStatusByPhoneNumberRequest { + /** + * 拉取起始时间,UNIX 时间戳(时间:秒)。 +注:最大可拉取当前时期7天前的数据。 + */ + SendDateTime: number + /** + * 偏移量。 +注:目前固定设置为0。 + */ + Offset: number + /** + * 拉取最大条数,最多 100。 + */ + Limit: number + /** + * 下发目的手机号码,依据 e.164 标准为:+[国家(或地区)码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,例如1400006666。 + */ + SmsSdkAppid: string + /** + * 拉取截止时间,UNIX 时间戳(时间:秒)。 + */ + EndDateTime?: number +} + +/** + * ModifySmsSign返回参数结构体 + */ +export interface ModifySmsSignResponse { + /** + * 修改签名响应 + */ + ModifySignStatus?: ModifySignStatus + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * 添加签名响应 + */ +export interface AddSignStatus { + /** + * 签名Id。 + */ + SignId: number + /** + * 签名申请Id。 + */ + SignApplyId: number +} + +/** + * 修改模板参数响应 + */ +export interface ModifyTemplateStatus { + /** + * 模板参数 + */ + TemplateId: number +} + +/** + * PullSmsSendStatus返回参数结构体 + */ +export interface PullSmsSendStatusResponse { + /** + * 下发状态响应集合。 + */ + PullSmsSendStatusSet?: Array + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * SmsPackagesStatistics返回参数结构体 + */ +export interface SmsPackagesStatisticsResponse { + /** + * 发送数据统计响应包体。 + */ + SmsPackagesStatisticsSet?: Array + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * 删除签名响应 + */ +export interface DeleteSignStatus { + /** + * 删除状态信息。 +注意:此字段可能返回 null,表示取不到有效值。 + */ + DeleteStatus: string + /** + * 删除时间,UNIX 时间戳(单位:秒)。 +注意:此字段可能返回 null,表示取不到有效值。 + */ + DeleteTime: number +} + +/** + * PullSmsReplyStatus返回参数结构体 + */ +export interface PullSmsReplyStatusResponse { + /** + * 回复状态响应集合。 + */ + PullSmsReplyStatusSet?: Array + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/index.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/index.ts new file mode 100644 index 0000000..a09089b --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/index.ts @@ -0,0 +1,6 @@ +import * as Models from "./sms_models" +import { Client } from "./sms_client" +export const v20210111 = { + Client: Client, + Models: Models, +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/sms_client.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/sms_client.ts new file mode 100644 index 0000000..6c550fc --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/sms_client.ts @@ -0,0 +1,309 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* + * Copyright (c) 2018 THL A29 Limited, a Tencent company. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import * as TencentCloudCommon from "tencentcloud-sdk-nodejs-common" +import { + PullSmsReplyStatusRequest, + DeleteSmsTemplateResponse, + ModifySmsTemplateResponse, + ModifySmsSignRequest, + SmsPackagesStatisticsRequest, + ReportConversionStatus, + AddSmsSignRequest, + AddTemplateStatus, + DescribeSmsTemplateListResponse, + DescribePhoneNumberInfoRequest, + PullSmsSendStatusByPhoneNumberRequest, + ReportConversionResponse, + AddSmsTemplateRequest, + ModifySmsTemplateRequest, + PullSmsReplyStatus, + CallbackStatusStatisticsResponse, + PullSmsSendStatusRequest, + SmsPackagesStatistics, + PullSmsSendStatusByPhoneNumberResponse, + ModifySignStatus, + DescribeSignListStatus, + SendSmsResponse, + SendStatusStatisticsResponse, + SendSmsRequest, + SendStatusStatistics, + CallbackStatusStatisticsRequest, + DeleteTemplateStatus, + DescribeSmsSignListRequest, + DescribePhoneNumberInfoResponse, + DescribeTemplateListStatus, + AddSmsTemplateResponse, + PullSmsSendStatus, + DescribeSmsSignListResponse, + DescribeSmsTemplateListRequest, + CallbackStatusStatistics, + PhoneNumberInfo, + SendStatusStatisticsRequest, + DeleteSmsTemplateRequest, + PullSmsReplyStatusByPhoneNumberResponse, + SendStatus, + DeleteSmsSignResponse, + AddSmsSignResponse, + DeleteSmsSignRequest, + PullSmsReplyStatusByPhoneNumberRequest, + ModifySmsSignResponse, + ReportConversionRequest, + AddSignStatus, + ModifyTemplateStatus, + PullSmsSendStatusResponse, + SmsPackagesStatisticsResponse, + DeleteSignStatus, + PullSmsReplyStatusResponse, +} from "./sms_models" + +/** + * sms client + * @class + */ +export class Client extends TencentCloudCommon.AbstractClient { + constructor(clientConfig: TencentCloudCommon.ClientConfig) { + super("sms.tencentcloudapi.com", "2021-01-11", clientConfig) + } + + /** + * 1. 修改短信签名,修改之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 +2. ⚠️注意:个人认证用户不支持使用 API 修改短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信签名。 +3. 修改短信签名,仅当签名为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的签名不支持修改。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async ModifySmsSign( + req: ModifySmsSignRequest, + cb?: (error: string, rep: ModifySmsSignResponse) => void + ): Promise { + return this.request("ModifySmsSign", req, cb) + } + + /** + * 1. 添加短信签名,申请之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 +2. ⚠️注意:个人认证用户不支持使用 API 申请短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录控制台申请短信签名。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async AddSmsSign( + req: AddSmsSignRequest, + cb?: (error: string, rep: AddSmsSignResponse) => void + ): Promise { + return this.request("AddSmsSign", req, cb) + } + + /** + * 拉取短信下发状态。 +目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 +>- 注:此接口需要联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsSendStatus( + req: PullSmsSendStatusRequest, + cb?: (error: string, rep: PullSmsSendStatusResponse) => void + ): Promise { + return this.request("PullSmsSendStatus", req, cb) + } + + /** + * 短信发送接口,用于给用户发短信验证码、通知类短信或营销短信。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 +>- 注:您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 +>- 注:当前接口属于 2021-01-11 版本,如果您仍在使用 [2019-07-11 版本](https://cloud.tencent.com/document/product/382/38778),建议您使用当前最新版本的接口,版本差异可参考[版本描述](https://cloud.tencent.com/document/product/382/63195#.E7.89.88.E6.9C.AC.E6.8F.8F.E8.BF.B0)。 + */ + async SendSms( + req: SendSmsRequest, + cb?: (error: string, rep: SendSmsResponse) => void + ): Promise { + return this.request("SendSms", req, cb) + } + + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信正文模板,请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信正文模板,如需了解请参阅 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DeleteSmsTemplate( + req: DeleteSmsTemplateRequest, + cb?: (error: string, rep: DeleteSmsTemplateResponse) => void + ): Promise { + return this.request("DeleteSmsTemplate", req, cb) + } + + /** + * 用户套餐包信息统计。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async SmsPackagesStatistics( + req: SmsPackagesStatisticsRequest, + cb?: (error: string, rep: SmsPackagesStatisticsResponse) => void + ): Promise { + return this.request("SmsPackagesStatistics", req, cb) + } + + /** + * 统计用户发送短信的数据。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async SendStatusStatistics( + req: SendStatusStatisticsRequest, + cb?: (error: string, rep: SendStatusStatisticsResponse) => void + ): Promise { + return this.request("SendStatusStatistics", req, cb) + } + + /** + * 统计用户回执的数据。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async CallbackStatusStatistics( + req: CallbackStatusStatisticsRequest, + cb?: (error: string, rep: CallbackStatusStatisticsResponse) => void + ): Promise { + return this.request("CallbackStatusStatistics", req, cb) + } + + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DescribeSmsTemplateList( + req: DescribeSmsTemplateListRequest, + cb?: (error: string, rep: DescribeSmsTemplateListResponse) => void + ): Promise { + return this.request("DescribeSmsTemplateList", req, cb) + } + + /** + * 拉取短信回复状态。 +目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 +>- 注:此接口需要联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsReplyStatus( + req: PullSmsReplyStatusRequest, + cb?: (error: string, rep: PullSmsReplyStatusResponse) => void + ): Promise { + return this.request("PullSmsReplyStatus", req, cb) + } + + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 查询短信签名。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DescribeSmsSignList( + req: DescribeSmsSignListRequest, + cb?: (error: string, rep: DescribeSmsSignListResponse) => void + ): Promise { + return this.request("DescribeSmsSignList", req, cb) + } + + /** + * 拉取单个号码短信下发状态。 +目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsSendStatusByPhoneNumber( + req: PullSmsSendStatusByPhoneNumberRequest, + cb?: (error: string, rep: PullSmsSendStatusByPhoneNumberResponse) => void + ): Promise { + return this.request("PullSmsSendStatusByPhoneNumber", req, cb) + } + + /** + * 短信转化率上报。将已接收到短信的流水号上报到腾讯云短信服务。 +>- 注:当前接口以白名单方式对外开放,如有需要请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 + */ + async ReportConversion( + req: ReportConversionRequest, + cb?: (error: string, rep: ReportConversionResponse) => void + ): Promise { + return this.request("ReportConversion", req, cb) + } + + /** + * 1. 修改短信正文模板,修改之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 +2. ⚠️注意:个人认证用户不支持使用 API 修改短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信正文模板。 +3. 修改短信模板,仅当正文模板为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的正文模板不支持修改。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async ModifySmsTemplate( + req: ModifySmsTemplateRequest, + cb?: (error: string, rep: ModifySmsTemplateResponse) => void + ): Promise { + return this.request("ModifySmsTemplate", req, cb) + } + + /** + * 拉取单个号码短信回复状态。 +目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsReplyStatusByPhoneNumber( + req: PullSmsReplyStatusByPhoneNumberRequest, + cb?: (error: string, rep: PullSmsReplyStatusByPhoneNumberResponse) => void + ): Promise { + return this.request("PullSmsReplyStatusByPhoneNumber", req, cb) + } + + /** + * 提供电话号码的信息查询,包括国家(或地区)码、规范的 E.164 格式号码等。 +>- 例如:查询号码 +86018845720123,可以得到国家码 86、规范的 E.164 号码 +8618845720123 等信息。 + */ + async DescribePhoneNumberInfo( + req: DescribePhoneNumberInfoRequest, + cb?: (error: string, rep: DescribePhoneNumberInfoResponse) => void + ): Promise { + return this.request("DescribePhoneNumberInfo", req, cb) + } + + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信签名。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DeleteSmsSign( + req: DeleteSmsSignRequest, + cb?: (error: string, rep: DeleteSmsSignResponse) => void + ): Promise { + return this.request("DeleteSmsSign", req, cb) + } + + /** + * 1. 添加短信模板,申请之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 +2. ⚠️注意:个人认证用户不支持使用 API 申请短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 申请短信正文模板。 +>- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 +>- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async AddSmsTemplate( + req: AddSmsTemplateRequest, + cb?: (error: string, rep: AddSmsTemplateResponse) => void + ): Promise { + return this.request("AddSmsTemplate", req, cb) + } +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/sms_models.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/sms_models.ts new file mode 100644 index 0000000..2405a2e --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/src/services/sms/v20210111/sms_models.ts @@ -0,0 +1,1154 @@ +/* + * Copyright (c) 2018 THL A29 Limited, a Tencent company. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * PullSmsReplyStatus请求参数结构体 + */ +export interface PullSmsReplyStatusRequest { + /** + * 拉取最大条数,最多100条。 + */ + Limit: number + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,例如1400006666。 + */ + SmsSdkAppId: string +} + +/** + * DeleteSmsTemplate返回参数结构体 + */ +export interface DeleteSmsTemplateResponse { + /** + * 删除模板响应 + */ + DeleteTemplateStatus?: DeleteTemplateStatus + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * ModifySmsTemplate返回参数结构体 + */ +export interface ModifySmsTemplateResponse { + /** + * 修改模板参数响应 + */ + ModifyTemplateStatus?: ModifyTemplateStatus + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * ModifySmsSign请求参数结构体 + */ +export interface ModifySmsSignRequest { + /** + * 待修改的签名 ID。 + */ + SignId: number + /** + * 签名名称。 + */ + SignName: string + /** + * 签名类型。其中每种类型后面标注了其可选的 DocumentType(证明类型): +0:公司,可选 DocumentType 有(0,1)。 +1:APP,可选 DocumentType 有(0,1,2,3,4) 。 +2:网站,可选 DocumentType 有(0,1,2,3,5)。 +3:公众号,可选 DocumentType 有(0,1,2,3,8)。 +4:商标,可选 DocumentType 有(7)。 +5:政府/机关事业单位/其他机构,可选 DocumentType 有(2,3)。 +6:小程序,可选 DocumentType 有(0,1,2,3,6)。 +注:必须按照对应关系选择证明类型,否则会审核失败。 + */ + SignType: number + /** + * 证明类型: +0:三证合一。 +1:企业营业执照。 +2:组织机构代码证书。 +3:社会信用代码证书。 +4:应用后台管理截图(个人开发APP)。 +5:网站备案后台截图(个人开发网站)。 +6:小程序设置页面截图(个人认证小程序)。 +7:商标注册书。 +8:公众号设置页面截图(个人认证公众号)。 + */ + DocumentType: number + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 +注:需要和待修改签名International值保持一致,该参数不能直接修改国内签名到国际签名。 + */ + International: number + /** + * 签名用途: +0:自用。 +1:他用。 + */ + SignPurpose: number + /** + * 签名对应的资质证明图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + */ + ProofImage: string + /** + * 委托授权证明。选择 SignPurpose 为他用之后需要提交委托的授权证明。 +图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 +注:只有 SignPurpose 在选择为 1(他用)时,这个字段才会生效。 + */ + CommissionImage?: string + /** + * 签名的申请备注。 + */ + Remark?: string +} + +/** + * SmsPackagesStatistics请求参数结构体 + */ +export interface SmsPackagesStatisticsRequest { + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string + /** + * 最大上限(需要拉取的套餐包个数)。 + */ + Limit: number + /** + * 偏移量。 + */ + Offset: number + /** + * 起始时间,格式为yyyymmddhh,精确到小时,例如2021050113,表示2021年5月1号13时。 +注:接口会返回 BeginTime 到 EndTime 之间创建的套餐包的统计信息。 + */ + BeginTime: string + /** + * 结束时间,格式为yyyymmddhh,精确到小时,例如2021050118,表示2021年5月1号18时。 +注:EndTime 必须大于 BeginTime 且小于当前时间。 + */ + EndTime: string +} + +/** + * 转化率上报响应。 + */ +export interface ReportConversionStatus { + /** + * 错误码。上报成功返回 ok。 + */ + Code: string + /** + * 错误码描述。 + */ + Message: string +} + +/** + * AddSmsSign请求参数结构体 + */ +export interface AddSmsSignRequest { + /** + * 签名名称。 +注:不能重复申请已通过或待审核的签名。 + */ + SignName: string + /** + * 签名类型。其中每种类型后面标注了其可选的 DocumentType(证明类型): +0:公司,可选 DocumentType 有(0,1)。 +1:APP,可选 DocumentType 有(0,1,2,3,4) 。 +2:网站,可选 DocumentType 有(0,1,2,3,5)。 +3:公众号,可选 DocumentType 有(0,1,2,3,8)。 +4:商标,可选 DocumentType 有(7)。 +5:政府/机关事业单位/其他机构,可选 DocumentType 有(2,3)。 +6:小程序,可选 DocumentType 有(0,1,2,3,6)。 +注:必须按照对应关系选择证明类型,否则会审核失败。 + */ + SignType: number + /** + * 证明类型: +0:三证合一。 +1:企业营业执照。 +2:组织机构代码证书。 +3:社会信用代码证书。 +4:应用后台管理截图(个人开发APP)。 +5:网站备案后台截图(个人开发网站)。 +6:小程序设置页面截图(个人认证小程序)。 +7:商标注册书。 +8:公众号设置页面截图(个人认证公众号)。 + */ + DocumentType: number + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International: number + /** + * 签名用途: +0:自用。 +1:他用。 + */ + SignPurpose: number + /** + * 签名对应的资质证明图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + */ + ProofImage: string + /** + * 委托授权证明。选择 SignPurpose 为他用之后需要提交委托的授权证明。 +图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 +注:只有 SignPurpose 在选择为 1(他用)时,这个字段才会生效。 + */ + CommissionImage?: string + /** + * 签名的申请备注。 + */ + Remark?: string +} + +/** + * 添加模板参数响应 + */ +export interface AddTemplateStatus { + /** + * 模板ID。 + */ + TemplateId: string +} + +/** + * DescribeSmsTemplateList返回参数结构体 + */ +export interface DescribeSmsTemplateListResponse { + /** + * 获取短信模板信息响应 + */ + DescribeTemplateStatusSet?: Array + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * DescribePhoneNumberInfo请求参数结构体 + */ +export interface DescribePhoneNumberInfoRequest { + /** + * 查询手机号码,采用 E.164 标准,格式为+[国家或地区码][手机号],单次请求最多支持200个手机号。 +例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumberSet: Array +} + +/** + * PullSmsSendStatusByPhoneNumber请求参数结构体 + */ +export interface PullSmsSendStatusByPhoneNumberRequest { + /** + * 拉取起始时间,UNIX 时间戳(时间:秒)。 +注:最大可拉取当前时期前7天的数据。 + */ + BeginTime: number + /** + * 偏移量。 +注:目前固定设置为0。 + */ + Offset: number + /** + * 拉取最大条数,最多 100。 + */ + Limit: number + /** + * 下发目的手机号码,依据 E.164 标准为:+[国家(或地区)码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string + /** + * 拉取截止时间,UNIX 时间戳(时间:秒)。 + */ + EndTime?: number +} + +/** + * ReportConversion返回参数结构体 + */ +export interface ReportConversionResponse { + /** + * 转化率上报响应包体。 + */ + ReportConversionStatus?: ReportConversionStatus + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * AddSmsTemplate请求参数结构体 + */ +export interface AddSmsTemplateRequest { + /** + * 模板名称。 + */ + TemplateName: string + /** + * 模板内容。 + */ + TemplateContent: string + /** + * 短信类型,0表示普通短信, 1表示营销短信。 + */ + SmsType: number + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International: number + /** + * 模板备注,例如申请原因,使用场景等。 + */ + Remark: string +} + +/** + * ModifySmsTemplate请求参数结构体 + */ +export interface ModifySmsTemplateRequest { + /** + * 待修改模板的ID。 + */ + TemplateId: number + /** + * 新的模板名称。 + */ + TemplateName: string + /** + * 新的模板内容。 + */ + TemplateContent: string + /** + * 短信类型,0表示普通短信, 1表示营销短信。 + */ + SmsType: number + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International: number + /** + * 模板备注,例如申请原因,使用场景等。 + */ + Remark: string +} + +/** + * 短信回复状态 + */ +export interface PullSmsReplyStatus { + /** + * 短信码号扩展号,默认未开通,如需开通请联系 [sms helper](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。 + */ + ExtendCode: string + /** + * 国家(或地区)码。 + */ + CountryCode: string + /** + * 手机号码,E.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string + /** + * 短信签名名称。 + */ + SignName: string + /** + * 用户回复的内容。 + */ + ReplyContent: string + /** + * 回复时间,UNIX 时间戳(单位:秒)。 + */ + ReplyTime: number + /** + * 用户号码,普通格式,示例如:13711112222。 + */ + SubscriberNumber: string +} + +/** + * CallbackStatusStatistics返回参数结构体 + */ +export interface CallbackStatusStatisticsResponse { + /** + * 回执数据统计响应包体。 + */ + CallbackStatusStatistics?: CallbackStatusStatistics + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * PullSmsSendStatus请求参数结构体 + */ +export interface PullSmsSendStatusRequest { + /** + * 拉取最大条数,最多100条。 + */ + Limit: number + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,例如1400006666。 + */ + SmsSdkAppId: string +} + +/** + * 套餐包信息统计响应包体 + */ +export interface SmsPackagesStatistics { + /** + * 套餐包创建时间,UNIX 时间戳(单位:秒)。 + */ + PackageCreateTime: number + /** + * 套餐包生效时间,UNIX 时间戳(单位:秒)。 + */ + PackageEffectiveTime: number + /** + * 套餐包过期时间,UNIX 时间戳(单位:秒)。 + */ + PackageExpiredTime: number + /** + * 套餐包条数。 + */ + PackageAmount: number + /** + * 套餐包类别,0表示赠送套餐包,1表示购买套餐包。 + */ + PackageType: number + /** + * 套餐包 ID。 + */ + PackageId: number + /** + * 当前使用套餐包条数。 + */ + CurrentUsage: number +} + +/** + * PullSmsSendStatusByPhoneNumber返回参数结构体 + */ +export interface PullSmsSendStatusByPhoneNumberResponse { + /** + * 下发状态响应集合。 + */ + PullSmsSendStatusSet?: Array + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * 修改签名响应 + */ +export interface ModifySignStatus { + /** + * 签名ID。 + */ + SignId: number +} + +/** + * 获取短信签名信息响应 + */ +export interface DescribeSignListStatus { + /** + * 签名ID。 + */ + SignId?: number + /** + * 是否国际/港澳台短信,其中0表示国内短信,1表示国际/港澳台短信。 + */ + International?: number + /** + * 申请签名状态,其中0表示审核通过,1表示审核中。 +-1:表示审核未通过或审核失败。 + */ + StatusCode?: number + /** + * 审核回复,审核人员审核后给出的回复,通常是审核未通过的原因。 + */ + ReviewReply?: string + /** + * 签名名称。 + */ + SignName?: string + /** + * 提交审核时间,UNIX 时间戳(单位:秒)。 + */ + CreateTime?: number +} + +/** + * SendSms返回参数结构体 + */ +export interface SendSmsResponse { + /** + * 短信发送状态。 + */ + SendStatusSet?: Array + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * SendStatusStatistics返回参数结构体 + */ +export interface SendStatusStatisticsResponse { + /** + * 发送数据统计响应包体。 + */ + SendStatusStatistics?: SendStatusStatistics + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * SendSms请求参数结构体 + */ +export interface SendSmsRequest { + /** + * 下发手机号码,采用 E.164 标准,格式为+[国家或地区码][手机号],单次请求最多支持200个手机号且要求全为境内手机号或全为境外手机号。 +例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 +注:发送国内短信格式还支持0086、86或无任何国家或地区码的11位手机号码,前缀默认为+86。 + */ + PhoneNumberSet: Array + /** + * 短信 SdkAppId,在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string + /** + * 模板 ID,必须填写已审核通过的模板 ID。模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看,若向境外手机号发送短信,仅支持使用国际/港澳台短信模板。 + */ + TemplateId: string + /** + * 短信签名内容,使用 UTF-8 编码,必须填写已审核通过的签名,例如:腾讯云,签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看。 +发送国内短信该参数必填,且需填写签名内容而非签名ID。 + */ + SignName?: string + /** + * 模板参数,若无模板参数,则设置为空。 +模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致。 + */ + TemplateParamSet?: Array + /** + * 短信码号扩展号,默认未开通,如需开通请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。 + */ + ExtendCode?: string + /** + * 用户的 session 内容,可以携带用户侧 ID 等上下文信息,server 会原样返回。注意长度需小于512字节。 + */ + SessionContext?: string + /** + * 国内短信无需填写该项;国际/港澳台短信已申请独立 SenderId 需要填写该字段,默认使用公共 SenderId,无需填写该字段。 +注:月度使用量达到指定量级可申请独立 SenderId 使用,详情请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。 + */ + SenderId?: string +} + +/** + * 发送数据统计响应包体 + */ +export interface SendStatusStatistics { + /** + * 短信计费条数统计,例如提交成功量为100条,其中有20条是长短信(长度为80字)被拆分成2条,则计费条数为: ```80 * 1 + 20 * 2 = 120``` 条。 + */ + FeeCount: number + /** + * 短信提交量统计。 + */ + RequestCount: number + /** + * 短信提交成功量统计。 + */ + RequestSuccessCount: number +} + +/** + * CallbackStatusStatistics请求参数结构体 + */ +export interface CallbackStatusStatisticsRequest { + /** + * 起始时间,格式为yyyymmddhh,精确到小时,例如2021050113,表示2021年5月1号13时。 + */ + BeginTime: string + /** + * 结束时间,格式为yyyymmddhh,精确到小时,例如2021050118,表示2021年5月1号18时。 +注:EndTime 必须大于 BeginTime,且相差不超过32天。 + */ + EndTime: string + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string + /** + * 最大上限。 +注:目前固定设置为0。 + */ + Limit: number + /** + * 偏移量。 +注:目前固定设置为0。 + */ + Offset: number +} + +/** + * 删除模板响应 + */ +export interface DeleteTemplateStatus { + /** + * 删除状态信息。 + */ + DeleteStatus: string + /** + * 删除时间,UNIX 时间戳(单位:秒)。 + */ + DeleteTime: number +} + +/** + * DescribeSmsSignList请求参数结构体 + */ +export interface DescribeSmsSignListRequest { + /** + * 签名 ID 数组。 +注:默认数组最大长度100。 + */ + SignIdSet: Array + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International: number +} + +/** + * DescribePhoneNumberInfo返回参数结构体 + */ +export interface DescribePhoneNumberInfoResponse { + /** + * 获取号码信息。 + */ + PhoneNumberInfoSet?: Array + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * 获取短信模板信息响应 + */ +export interface DescribeTemplateListStatus { + /** + * 模板ID。 + */ + TemplateId?: number + /** + * 是否国际/港澳台短信,其中0表示国内短信,1表示国际/港澳台短信,3表示该模板既支持国内短信也支持国际/港澳台短信。 + */ + International?: number + /** + * 申请模板状态,其中0表示审核通过且已生效,1表示审核中,2表示审核通过待生效,-1表示审核未通过或审核失败。注:只有状态值为0时该模板才能使用。 + */ + StatusCode?: number + /** + * 审核回复,审核人员审核后给出的回复,通常是审核未通过的原因。 + */ + ReviewReply?: string + /** + * 模板名称。 + */ + TemplateName?: string + /** + * 提交审核时间,UNIX 时间戳(单位:秒)。 + */ + CreateTime?: number + /** + * 模板内容。 + */ + TemplateContent?: string +} + +/** + * AddSmsTemplate返回参数结构体 + */ +export interface AddSmsTemplateResponse { + /** + * 添加短信模板响应包体 + */ + AddTemplateStatus?: AddTemplateStatus + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * 短信的下发状态详细信息 + */ +export interface PullSmsSendStatus { + /** + * 用户实际接收到短信的时间,UNIX 时间戳(单位:秒)。 + */ + UserReceiveTime: number + /** + * 国家(或地区)码。 + */ + CountryCode: string + /** + * 用户号码,普通格式,示例如:13711112222。 + */ + SubscriberNumber: string + /** + * 手机号码,E.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string + /** + * 本次发送标识 ID。 + */ + SerialNo: string + /** + * 实际是否收到短信接收状态,SUCCESS(成功)、FAIL(失败)。 + */ + ReportStatus: string + /** + * 用户接收短信状态描述。 + */ + Description: string + /** + * 用户的 session 内容。与请求中的 SessionContext 一致,默认为空,如需开通请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。 +注意:此字段可能返回 null,表示取不到有效值。 + */ + SessionContext: string +} + +/** + * DescribeSmsSignList返回参数结构体 + */ +export interface DescribeSmsSignListResponse { + /** + * 获取签名信息响应 + */ + DescribeSignListStatusSet?: Array + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * DescribeSmsTemplateList请求参数结构体 + */ +export interface DescribeSmsTemplateListRequest { + /** + * 是否国际/港澳台短信: +0:表示国内短信。 +1:表示国际/港澳台短信。 + */ + International: number + /** + * 模板 ID 数组。数组为空时默认查询模板列表信息,请使用 Limit 和 Offset 字段设置查询范围。 +默认数组长度最大100 + */ + TemplateIdSet?: Array + /** + * 最大上限,最多100。 +注:默认为0,TemplateIdSet 为空时启用。 + */ + Limit?: number + /** + * 偏移量。 +注:默认为0,TemplateIdSet 为空时启用。 + */ + Offset?: number +} + +/** + * 回执数据统计响应包体 + */ +export interface CallbackStatusStatistics { + /** + * 短信回执量统计。 + */ + CallbackCount: number + /** + * 短信提交成功量统计。 + */ + RequestSuccessCount: number + /** + * 短信回执失败量统计。 + */ + CallbackFailCount: number + /** + * 短信回执成功量统计。 + */ + CallbackSuccessCount: number + /** + * 运营商内部错误统计。 + */ + InternalErrorCount: number + /** + * 号码无效或空号统计。 + */ + InvalidNumberCount: number + /** + * 停机、关机等错误统计。 + */ + ShutdownErrorCount: number + /** + * 号码拉入黑名单统计。 + */ + BlackListCount: number + /** + * 运营商频率限制统计。 + */ + FrequencyLimitCount: number +} + +/** + * 号码信息。 + */ +export interface PhoneNumberInfo { + /** + * 号码信息查询错误码,查询成功返回 "Ok"。 + */ + Code: string + /** + * 号码信息查询错误码描述。 + */ + Message: string + /** + * 国家(或地区)码。 + */ + NationCode: string + /** + * 用户号码,去除国家或地区码前缀的普通格式,示例如:13711112222。 + */ + SubscriberNumber: string + /** + * 解析后的规范的 E.164 号码,与下发短信的号码解析结果一致。解析失败时会原样返回。 + */ + PhoneNumber: string + /** + * 国家码或地区码,例如 CN、US 等,对于未识别出国家码或者地区码,默认返回 DEF。 + */ + IsoCode: string + /** + * 国家码或地区名,例如 China,可参考 [国际/港澳台短信价格总览](https://cloud.tencent.com/document/product/382/18051#.E6.97.A5.E7.BB.93.E5.90.8E.E4.BB.98.E8.B4.B9.3Ca-id.3D.22post-payment.22.3E.3C.2Fa.3E) + */ + IsoName: string +} + +/** + * SendStatusStatistics请求参数结构体 + */ +export interface SendStatusStatisticsRequest { + /** + * 起始时间,格式为yyyymmddhh,精确到小时,例如2021050113,表示2021年5月1号13时。 + */ + BeginTime: string + /** + * 结束时间,格式为yyyymmddhh,精确到小时,例如2021050118,表示2021年5月1号18时。 +注:EndTime 必须大于 BeginTime。 + */ + EndTime: string + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string + /** + * 最大上限。 +注:目前固定设置为0。 + */ + Limit: number + /** + * 偏移量。 +注:目前固定设置为0。 + */ + Offset: number +} + +/** + * DeleteSmsTemplate请求参数结构体 + */ +export interface DeleteSmsTemplateRequest { + /** + * 待删除的模板 ID。 + */ + TemplateId: number +} + +/** + * PullSmsReplyStatusByPhoneNumber返回参数结构体 + */ +export interface PullSmsReplyStatusByPhoneNumberResponse { + /** + * 回复状态响应集合。 + */ + PullSmsReplyStatusSet?: Array + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * 发送短信状态 + */ +export interface SendStatus { + /** + * 发送流水号。 + */ + SerialNo: string + /** + * 手机号码,E.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string + /** + * 计费条数,计费规则请查询 [计费策略](https://cloud.tencent.com/document/product/382/36135)。 + */ + Fee: number + /** + * 用户 session 内容。 + */ + SessionContext: string + /** + * 短信请求错误码,具体含义请参考 [错误码](https://cloud.tencent.com/document/api/382/55981#6.-.E9.94.99.E8.AF.AF.E7.A0.81),发送成功返回 "Ok"。 + */ + Code: string + /** + * 短信请求错误码描述。 + */ + Message: string + /** + * 国家码或地区码,例如 CN、US 等,对于未识别出国家码或者地区码,默认返回 DEF,具体支持列表请参考 [国际/港澳台短信价格总览](https://cloud.tencent.com/document/product/382/18051)。 + */ + IsoCode: string +} + +/** + * DeleteSmsSign返回参数结构体 + */ +export interface DeleteSmsSignResponse { + /** + * 删除签名响应 + */ + DeleteSignStatus?: DeleteSignStatus + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * AddSmsSign返回参数结构体 + */ +export interface AddSmsSignResponse { + /** + * 添加签名响应 + */ + AddSignStatus?: AddSignStatus + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * DeleteSmsSign请求参数结构体 + */ +export interface DeleteSmsSignRequest { + /** + * 待删除的签名 ID。 + */ + SignId: number +} + +/** + * PullSmsReplyStatusByPhoneNumber请求参数结构体 + */ +export interface PullSmsReplyStatusByPhoneNumberRequest { + /** + * 拉取起始时间,UNIX 时间戳(时间:秒)。 +注:最大可拉取当前时期前7天的数据。 + */ + BeginTime: number + /** + * 偏移量。 +注:目前固定设置为0。 + */ + Offset: number + /** + * 拉取最大条数,最多 100。 + */ + Limit: number + /** + * 下发目的手机号码,依据 E.164 标准为:+[国家(或地区)码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string + /** + * 拉取截止时间,UNIX 时间戳(时间:秒)。 + */ + EndTime?: number +} + +/** + * ModifySmsSign返回参数结构体 + */ +export interface ModifySmsSignResponse { + /** + * 修改签名响应 + */ + ModifySignStatus?: ModifySignStatus + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * ReportConversion请求参数结构体 + */ +export interface ReportConversionRequest { + /** + * 短信应用ID。在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string + /** + * 发送短信返回的流水号。 + */ + SerialNo: string + /** + * 用户回填时间,UNIX 时间戳(单位:秒)。 + */ + ConversionTime?: number +} + +/** + * 添加签名响应 + */ +export interface AddSignStatus { + /** + * 签名ID。 + */ + SignId: number +} + +/** + * 修改模板参数响应 + */ +export interface ModifyTemplateStatus { + /** + * 模板ID。 + */ + TemplateId: number +} + +/** + * PullSmsSendStatus返回参数结构体 + */ +export interface PullSmsSendStatusResponse { + /** + * 下发状态响应集合。 + */ + PullSmsSendStatusSet?: Array + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * SmsPackagesStatistics返回参数结构体 + */ +export interface SmsPackagesStatisticsResponse { + /** + * 发送数据统计响应包体。 + */ + SmsPackagesStatisticsSet?: Array + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} + +/** + * 删除签名响应 + */ +export interface DeleteSignStatus { + /** + * 删除状态信息。 +注意:此字段可能返回 null,表示取不到有效值。 + */ + DeleteStatus: string + /** + * 删除时间,UNIX 时间戳(单位:秒)。 +注意:此字段可能返回 null,表示取不到有效值。 + */ + DeleteTime: number +} + +/** + * PullSmsReplyStatus返回参数结构体 + */ +export interface PullSmsReplyStatusResponse { + /** + * 回复状态响应集合。 + */ + PullSmsReplyStatusSet?: Array + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/index.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/index.d.ts new file mode 100644 index 0000000..b2221a9 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/index.d.ts @@ -0,0 +1 @@ +export * from "./services"; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/index.js b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/index.js new file mode 100644 index 0000000..319e4f0 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/index.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = require("tslib"); +tslib_1.__exportStar(require("./services"), exports); diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/index.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/index.d.ts new file mode 100644 index 0000000..f78760e --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/index.d.ts @@ -0,0 +1 @@ +export { sms } from "./sms"; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/index.js b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/index.js new file mode 100644 index 0000000..b45322f --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/index.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var sms_1 = require("./sms"); +Object.defineProperty(exports, "sms", { enumerable: true, get: function () { return sms_1.sms; } }); diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/index.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/index.d.ts new file mode 100644 index 0000000..4f2563a --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/index.d.ts @@ -0,0 +1,10 @@ +export declare const sms: { + v20190711: { + Client: typeof import("./v20190711/sms_client").Client; + Models: typeof import("./v20190711/sms_models"); + }; + v20210111: { + Client: typeof import("./v20210111/sms_client").Client; + Models: typeof import("./v20210111/sms_models"); + }; +}; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/index.js b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/index.js new file mode 100644 index 0000000..6ef01e5 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/index.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sms = void 0; +const v20190711_1 = require("./v20190711"); +const v20210111_1 = require("./v20210111"); +exports.sms = { + v20190711: v20190711_1.v20190711, + v20210111: v20210111_1.v20210111, +}; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/index.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/index.d.ts new file mode 100644 index 0000000..4c6f79d --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/index.d.ts @@ -0,0 +1,6 @@ +import * as Models from "./sms_models"; +import { Client } from "./sms_client"; +export declare const v20190711: { + Client: typeof Client; + Models: typeof Models; +}; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/index.js b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/index.js new file mode 100644 index 0000000..59b8b3c --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/index.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.v20190711 = void 0; +const Models = require("./sms_models"); +const sms_client_1 = require("./sms_client"); +exports.v20190711 = { + Client: sms_client_1.Client, + Models: Models, +}; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_client.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_client.d.ts new file mode 100644 index 0000000..cf818a7 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_client.d.ts @@ -0,0 +1,117 @@ +import * as TencentCloudCommon from "tencentcloud-sdk-nodejs-common"; +import { PullSmsReplyStatusRequest, DeleteSmsTemplateResponse, ModifySmsTemplateResponse, ModifySmsSignRequest, AddSmsSignRequest, DescribeSmsTemplateListResponse, PullSmsSendStatusByPhoneNumberRequest, AddSmsTemplateRequest, ModifySmsTemplateRequest, CallbackStatusStatisticsResponse, PullSmsSendStatusRequest, PullSmsSendStatusByPhoneNumberResponse, SendSmsResponse, SendStatusStatisticsResponse, SendSmsRequest, CallbackStatusStatisticsRequest, DescribeSmsSignListRequest, SmsPackagesStatisticsRequest, AddSmsTemplateResponse, DescribeSmsSignListResponse, DescribeSmsTemplateListRequest, SendStatusStatisticsRequest, DeleteSmsTemplateRequest, PullSmsReplyStatusByPhoneNumberResponse, DeleteSmsSignResponse, AddSmsSignResponse, DeleteSmsSignRequest, PullSmsReplyStatusByPhoneNumberRequest, ModifySmsSignResponse, PullSmsSendStatusResponse, SmsPackagesStatisticsResponse, PullSmsReplyStatusResponse } from "./sms_models"; +/** + * sms client + * @class + */ +export declare class Client extends TencentCloudCommon.AbstractClient { + constructor(clientConfig: TencentCloudCommon.ClientConfig); + /** + * 1. 修改短信签名,修改之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 + 2. ⚠️注意:个人认证用户不支持使用 API 修改短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信签名。 + 3. 修改短信签名,仅当签名为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的签名不支持修改。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + ModifySmsSign(req: ModifySmsSignRequest, cb?: (error: string, rep: ModifySmsSignResponse) => void): Promise; + /** + * 1. 添加短信签名,申请之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 + 2. ⚠️注意:个人认证用户不支持使用 API 申请短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录控制台申请短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + AddSmsSign(req: AddSmsSignRequest, cb?: (error: string, rep: AddSmsSignResponse) => void): Promise; + /** + * 拉取短信下发状态。 + 目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 + >- 注:此接口需要联系 [sms helper](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + PullSmsSendStatus(req: PullSmsSendStatusRequest, cb?: (error: string, rep: PullSmsSendStatusResponse) => void): Promise; + /** + * 短信发送接口,用于给用户发短信验证码、通知类短信或营销短信。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + SendSms(req: SendSmsRequest, cb?: (error: string, rep: SendSmsResponse) => void): Promise; + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信正文模板,请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信正文模板,如需了解请参阅 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + DeleteSmsTemplate(req: DeleteSmsTemplateRequest, cb?: (error: string, rep: DeleteSmsTemplateResponse) => void): Promise; + /** + * 用户套餐包信息统计。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + SmsPackagesStatistics(req: SmsPackagesStatisticsRequest, cb?: (error: string, rep: SmsPackagesStatisticsResponse) => void): Promise; + /** + * 统计用户发送短信的数据。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + SendStatusStatistics(req: SendStatusStatisticsRequest, cb?: (error: string, rep: SendStatusStatisticsResponse) => void): Promise; + /** + * 统计用户回执的数据。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + CallbackStatusStatistics(req: CallbackStatusStatisticsRequest, cb?: (error: string, rep: CallbackStatusStatisticsResponse) => void): Promise; + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + DescribeSmsTemplateList(req: DescribeSmsTemplateListRequest, cb?: (error: string, rep: DescribeSmsTemplateListResponse) => void): Promise; + /** + * 拉取短信回复状态。 + 目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 + >- 注:此接口需要联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + PullSmsReplyStatus(req: PullSmsReplyStatusRequest, cb?: (error: string, rep: PullSmsReplyStatusResponse) => void): Promise; + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 查询短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + DescribeSmsSignList(req: DescribeSmsSignListRequest, cb?: (error: string, rep: DescribeSmsSignListResponse) => void): Promise; + /** + * 拉取单个号码短信下发状态。 + 目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + PullSmsSendStatusByPhoneNumber(req: PullSmsSendStatusByPhoneNumberRequest, cb?: (error: string, rep: PullSmsSendStatusByPhoneNumberResponse) => void): Promise; + /** + * 1. 修改短信正文模板,修改之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 + 2. ⚠️注意:个人认证用户不支持使用 API 修改短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信正文模板。 + 3. 修改短信模板,仅当正文模板为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的正文模板不支持修改。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + ModifySmsTemplate(req: ModifySmsTemplateRequest, cb?: (error: string, rep: ModifySmsTemplateResponse) => void): Promise; + /** + * 拉取单个号码短信回复状态。 + 目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + PullSmsReplyStatusByPhoneNumber(req: PullSmsReplyStatusByPhoneNumberRequest, cb?: (error: string, rep: PullSmsReplyStatusByPhoneNumberResponse) => void): Promise; + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + DeleteSmsSign(req: DeleteSmsSignRequest, cb?: (error: string, rep: DeleteSmsSignResponse) => void): Promise; + /** + * 1. 添加短信模板,申请之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 + 2. ⚠️注意:个人认证用户不支持使用 API 申请短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 申请短信正文模板。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + AddSmsTemplate(req: AddSmsTemplateRequest, cb?: (error: string, rep: AddSmsTemplateResponse) => void): Promise; +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_client.js b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_client.js new file mode 100644 index 0000000..3a54d53 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_client.js @@ -0,0 +1,171 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Client = void 0; +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* + * Copyright (c) 2018 THL A29 Limited, a Tencent company. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +const TencentCloudCommon = require("tencentcloud-sdk-nodejs-common"); +/** + * sms client + * @class + */ +class Client extends TencentCloudCommon.AbstractClient { + constructor(clientConfig) { + super("sms.tencentcloudapi.com", "2019-07-11", clientConfig); + } + /** + * 1. 修改短信签名,修改之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 + 2. ⚠️注意:个人认证用户不支持使用 API 修改短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信签名。 + 3. 修改短信签名,仅当签名为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的签名不支持修改。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async ModifySmsSign(req, cb) { + return this.request("ModifySmsSign", req, cb); + } + /** + * 1. 添加短信签名,申请之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 + 2. ⚠️注意:个人认证用户不支持使用 API 申请短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录控制台申请短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async AddSmsSign(req, cb) { + return this.request("AddSmsSign", req, cb); + } + /** + * 拉取短信下发状态。 + 目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 + >- 注:此接口需要联系 [sms helper](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsSendStatus(req, cb) { + return this.request("PullSmsSendStatus", req, cb); + } + /** + * 短信发送接口,用于给用户发短信验证码、通知类短信或营销短信。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async SendSms(req, cb) { + return this.request("SendSms", req, cb); + } + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信正文模板,请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信正文模板,如需了解请参阅 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DeleteSmsTemplate(req, cb) { + return this.request("DeleteSmsTemplate", req, cb); + } + /** + * 用户套餐包信息统计。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async SmsPackagesStatistics(req, cb) { + return this.request("SmsPackagesStatistics", req, cb); + } + /** + * 统计用户发送短信的数据。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async SendStatusStatistics(req, cb) { + return this.request("SendStatusStatistics", req, cb); + } + /** + * 统计用户回执的数据。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async CallbackStatusStatistics(req, cb) { + return this.request("CallbackStatusStatistics", req, cb); + } + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DescribeSmsTemplateList(req, cb) { + return this.request("DescribeSmsTemplateList", req, cb); + } + /** + * 拉取短信回复状态。 + 目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 + >- 注:此接口需要联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsReplyStatus(req, cb) { + return this.request("PullSmsReplyStatus", req, cb); + } + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 查询短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DescribeSmsSignList(req, cb) { + return this.request("DescribeSmsSignList", req, cb); + } + /** + * 拉取单个号码短信下发状态。 + 目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsSendStatusByPhoneNumber(req, cb) { + return this.request("PullSmsSendStatusByPhoneNumber", req, cb); + } + /** + * 1. 修改短信正文模板,修改之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 + 2. ⚠️注意:个人认证用户不支持使用 API 修改短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信正文模板。 + 3. 修改短信模板,仅当正文模板为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的正文模板不支持修改。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async ModifySmsTemplate(req, cb) { + return this.request("ModifySmsTemplate", req, cb); + } + /** + * 拉取单个号码短信回复状态。 + 目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsReplyStatusByPhoneNumber(req, cb) { + return this.request("PullSmsReplyStatusByPhoneNumber", req, cb); + } + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DeleteSmsSign(req, cb) { + return this.request("DeleteSmsSign", req, cb); + } + /** + * 1. 添加短信模板,申请之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 + 2. ⚠️注意:个人认证用户不支持使用 API 申请短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 申请短信正文模板。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async AddSmsTemplate(req, cb) { + return this.request("AddSmsTemplate", req, cb); + } +} +exports.Client = Client; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_models.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_models.d.ts new file mode 100644 index 0000000..7aed4e6 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_models.d.ts @@ -0,0 +1,983 @@ +/** + * PullSmsReplyStatus请求参数结构体 + */ +export interface PullSmsReplyStatusRequest { + /** + * 拉取最大条数,最多100条。 + */ + Limit: number; + /** + * 短信 SdkAppid 在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际 SdkAppid,例如1400006666。 + */ + SmsSdkAppid: string; +} +/** + * DeleteSmsTemplate返回参数结构体 + */ +export interface DeleteSmsTemplateResponse { + /** + * 删除模板响应 + */ + DeleteTemplateStatus?: DeleteTemplateStatus; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * ModifySmsTemplate返回参数结构体 + */ +export interface ModifySmsTemplateResponse { + /** + * 修改模板参数响应 + */ + ModifyTemplateStatus?: ModifyTemplateStatus; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * ModifySmsSign请求参数结构体 + */ +export interface ModifySmsSignRequest { + /** + * 待修改的签名 ID。 + */ + SignId: number; + /** + * 签名名称。 + */ + SignName: string; + /** + * 签名类型。其中每种类型后面标注了其可选的 DocumentType(证明类型): + 0:公司,可选 DocumentType 有(0,1)。 + 1:APP,可选 DocumentType 有(0,1,2,3,4) 。 + 2:网站,可选 DocumentType 有(0,1,2,3,5)。 + 3:公众号,可选 DocumentType 有(0,1,2,3,8)。 + 4:商标,可选 DocumentType 有(7)。 + 5:政府/机关事业单位/其他机构,可选 DocumentType 有(2,3)。 + 6:小程序,可选 DocumentType 有(0,1,2,3,6)。 + 注:必须按照对应关系选择证明类型,否则会审核失败。 + */ + SignType: number; + /** + * 证明类型: + 0:三证合一。 + 1:企业营业执照。 + 2:组织机构代码证书。 + 3:社会信用代码证书。 + 4:应用后台管理截图(个人开发APP)。 + 5:网站备案后台截图(个人开发网站)。 + 6:小程序设置页面截图(个人认证小程序)。 + 7:商标注册书。 + 8:公众号设置页面截图(个人认证公众号)。 + */ + DocumentType: number; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + 注:需要和待修改签名International值保持一致,该参数不能直接修改国内签名到国际签名。 + */ + International: number; + /** + * 签名用途: + 0:自用。 + 1:他用。 + */ + UsedMethod: number; + /** + * 签名对应的资质证明图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + */ + ProofImage: string; + /** + * 委托授权证明。选择 UsedMethod 为他用之后需要提交委托的授权证明。 + 图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + 注:只有 UsedMethod 在选择为 1(他用)时,这个字段才会生效。 + */ + CommissionImage?: string; + /** + * 签名的申请备注。 + */ + Remark?: string; +} +/** + * AddSmsSign请求参数结构体 + */ +export interface AddSmsSignRequest { + /** + * 签名名称。 + 注:不能重复申请已通过或待审核的签名。 + */ + SignName: string; + /** + * 签名类型。其中每种类型后面标注了其可选的 DocumentType(证明类型): + 0:公司,可选 DocumentType 有(0,1)。 + 1:APP,可选 DocumentType 有(0,1,2,3,4) 。 + 2:网站,可选 DocumentType 有(0,1,2,3,5)。 + 3:公众号,可选 DocumentType 有(0,1,2,3,8)。 + 4:商标,可选 DocumentType 有(7)。 + 5:政府/机关事业单位/其他机构,可选 DocumentType 有(2,3)。 + 6:小程序,可选 DocumentType 有(0,1,2,3,6)。 + 注:必须按照对应关系选择证明类型,否则会审核失败。 + */ + SignType: number; + /** + * 证明类型: + 0:三证合一。 + 1:企业营业执照。 + 2:组织机构代码证书。 + 3:社会信用代码证书。 + 4:应用后台管理截图(个人开发APP)。 + 5:网站备案后台截图(个人开发网站)。 + 6:小程序设置页面截图(个人认证小程序)。 + 7:商标注册书。 + 8:公众号设置页面截图(个人认证公众号)。 + */ + DocumentType: number; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International: number; + /** + * 签名用途: + 0:自用。 + 1:他用。 + */ + UsedMethod: number; + /** + * 签名对应的资质证明图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + */ + ProofImage: string; + /** + * 委托授权证明。选择 UsedMethod 为他用之后需要提交委托的授权证明。 + 图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + 注:只有 UsedMethod 在选择为 1(他用)时,这个字段才会生效。 + */ + CommissionImage?: string; + /** + * 签名的申请备注。 + */ + Remark?: string; +} +/** + * 添加模板参数响应 + */ +export interface AddTemplateStatus { + /** + * 模板参数 + */ + TemplateId: string; +} +/** + * DescribeSmsTemplateList返回参数结构体 + */ +export interface DescribeSmsTemplateListResponse { + /** + * 获取短信模板信息响应 + */ + DescribeTemplateStatusSet?: Array; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * PullSmsSendStatusByPhoneNumber请求参数结构体 + */ +export interface PullSmsSendStatusByPhoneNumberRequest { + /** + * 拉取起始时间,UNIX 时间戳(时间:秒)。 + 注:最大可拉取当前时期7天前的数据。 + */ + SendDateTime: number; + /** + * 偏移量。 + 注:目前固定设置为0。 + */ + Offset: number; + /** + * 拉取最大条数,最多 100。 + */ + Limit: number; + /** + * 下发目的手机号码,依据 e.164 标准为:+[国家(或地区)码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string; + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,例如1400006666。 + */ + SmsSdkAppid: string; + /** + * 拉取截止时间,UNIX 时间戳(时间:秒)。 + */ + EndDateTime?: number; +} +/** + * AddSmsTemplate请求参数结构体 + */ +export interface AddSmsTemplateRequest { + /** + * 模板名称。 + */ + TemplateName: string; + /** + * 模板内容。 + */ + TemplateContent: string; + /** + * 短信类型,0表示普通短信, 1表示营销短信。 + */ + SmsType: number; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International: number; + /** + * 模板备注,例如申请原因,使用场景等。 + */ + Remark: string; +} +/** + * ModifySmsTemplate请求参数结构体 + */ +export interface ModifySmsTemplateRequest { + /** + * 待修改的模板的模板 ID。 + */ + TemplateId: number; + /** + * 新的模板名称。 + */ + TemplateName: string; + /** + * 新的模板内容。 + */ + TemplateContent: string; + /** + * 短信类型,0表示普通短信, 1表示营销短信。 + */ + SmsType: number; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International: number; + /** + * 模板备注,例如申请原因,使用场景等。 + */ + Remark: string; +} +/** + * 短信回复状态 + */ +export interface PullSmsReplyStatus { + /** + * 短信码号扩展号,默认未开通,如需开通请联系 [sms helper](https://cloud.tencent.com/document/product/382/3773)。 + */ + ExtendCode: string; + /** + * 国家(或地区)码。 + */ + NationCode: string; + /** + * 手机号码,e.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string; + /** + * 短信签名。 + */ + Sign: string; + /** + * 用户回复的内容。 + */ + ReplyContent: string; + /** + * 回复时间(例如:2019-10-08 17:18:37)。 + */ + ReplyTime: string; + /** + * 回复时间,UNIX 时间戳(单位:秒)。 + */ + ReplyUnixTime: number; +} +/** + * CallbackStatusStatistics返回参数结构体 + */ +export interface CallbackStatusStatisticsResponse { + /** + * 回执数据统计响应包体。 + */ + CallbackStatusStatistics?: CallbackStatusStatistics; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * PullSmsSendStatus请求参数结构体 + */ +export interface PullSmsSendStatusRequest { + /** + * 拉取最大条数,最多100条。 + */ + Limit: number; + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,例如1400006666。 + */ + SmsSdkAppid: string; +} +/** + * 套餐包信息统计响应包体 + */ +export interface SmsPackagesStatistics { + /** + * 套餐包创建时间,标准时间,例如:2019-10-08 17:18:37。 + */ + PackageCreateTime: string; + /** + * 套餐包创建时间,UNIX 时间戳(单位:秒)。 + */ + PackageCreateUnixTime: number; + /** + * 套餐包生效时间,标准时间,例如:2019-10-08 17:18:37。 + */ + PackageEffectiveTime: string; + /** + * 套餐包生效时间,UNIX 时间戳(单位:秒)。 + */ + PackageEffectiveUnixTime: number; + /** + * 套餐包过期时间,标准时间,例如:2019-10-08 17:18:37。 + */ + PackageExpiredTime: string; + /** + * 套餐包过期时间,UNIX 时间戳(单位:秒)。 + */ + PackageExpiredUnixTime: number; + /** + * 套餐包条数。 + */ + AmountOfPackage: number; + /** + * 0表示赠送套餐包,1表示购买套餐包。 + */ + TypeOfPackage: number; + /** + * 套餐包 ID。 + */ + PackageId: number; + /** + * 当前使用量。 + */ + CurrentUsage: number; +} +/** + * PullSmsSendStatusByPhoneNumber返回参数结构体 + */ +export interface PullSmsSendStatusByPhoneNumberResponse { + /** + * 下发状态响应集合。 + */ + PullSmsSendStatusSet?: Array; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * 修改签名响应 + */ +export interface ModifySignStatus { + /** + * 签名Id + */ + SignId: number; + /** + * 签名修改申请Id + */ + SignApplyId: string; +} +/** + * 获取短信签名信息响应 + */ +export interface DescribeSignListStatus { + /** + * 签名Id + */ + SignId: number; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International: number; + /** + * 申请签名状态。其中: + 0:表示审核通过。 + 1:表示审核中。 + -1:表示审核未通过或审核失败。 + */ + StatusCode: number; + /** + * 审核回复,审核人员审核后给出的回复,通常是审核未通过的原因。 + */ + ReviewReply: string; + /** + * 签名名称。 + */ + SignName: string; + /** + * 提交审核时间,UNIX 时间戳(单位:秒)。 + */ + CreateTime: number; +} +/** + * SendSms返回参数结构体 + */ +export interface SendSmsResponse { + /** + * 短信发送状态。 + */ + SendStatusSet?: Array; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * SendStatusStatistics返回参数结构体 + */ +export interface SendStatusStatisticsResponse { + /** + * 发送数据统计响应包体。 + */ + SendStatusStatistics?: SendStatusStatistics; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * SendSms请求参数结构体 + */ +export interface SendSmsRequest { + /** + * 下发手机号码,采用 e.164 标准,格式为+[国家或地区码][手机号],单次请求最多支持200个手机号且要求全为境内手机号或全为境外手机号。 + 例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumberSet: Array; + /** + * 模板 ID,必须填写已审核通过的模板 ID。模板ID可登录 [短信控制台](https://console.cloud.tencent.com/smsv2) 查看,若向境外手机号发送短信,仅支持使用国际/港澳台短信模板。 + */ + TemplateID: string; + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,示例如1400006666。 + */ + SmsSdkAppid: string; + /** + * 短信签名内容,使用 UTF-8 编码,必须填写已审核通过的签名,签名信息可登录 [短信控制台](https://console.cloud.tencent.com/smsv2) 查看。注:国内短信为必填参数。 + */ + Sign?: string; + /** + * 模板参数,若无模板参数,则设置为空。 + */ + TemplateParamSet?: Array; + /** + * 短信码号扩展号,默认未开通,如需开通请联系 [sms helper](https://cloud.tencent.com/document/product/382/3773)。 + */ + ExtendCode?: string; + /** + * 用户的 session 内容,可以携带用户侧 ID 等上下文信息,server 会原样返回。注意长度需小于512字节。 + */ + SessionContext?: string; + /** + * 国内短信无senderid,无需填写该项;若需开通国际/港澳台短信senderid,请联系smshelper。 + */ + SenderId?: string; +} +/** + * 发送数据统计响应包体 + */ +export interface SendStatusStatistics { + /** + * 短信计费条数统计,例如提交成功量为100条,其中有20条是长短信(长度为80字)被拆分成2条,则计费条数为: ```80 * 1 + 20 * 2 = 120``` 条。 + */ + FeeCount: number; + /** + * 短信提交量统计。 + */ + RequestCount: number; + /** + * 短信提交成功量统计。 + */ + RequestSuccessCount: number; +} +/** + * CallbackStatusStatistics请求参数结构体 + */ +export interface CallbackStatusStatisticsRequest { + /** + * 开始时间,yyyymmddhh 需要拉取的起始时间,精确到小时。 + */ + StartDateTime: number; + /** + * 结束时间,yyyymmddhh 需要拉取的截止时间,精确到小时。 + 注:EndDataTime 必须大于 StartDateTime。 + */ + EndDataTime: number; + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,示例如1400006666。 + */ + SmsSdkAppid: string; + /** + * 最大上限。 + 注:目前固定设置为0。 + */ + Limit: number; + /** + * 偏移量。 + 注:目前固定设置为0。 + */ + Offset: number; +} +/** + * 删除模板响应 + */ +export interface DeleteTemplateStatus { + /** + * 删除状态信息。 + */ + DeleteStatus: string; + /** + * 删除时间,UNIX 时间戳(单位:秒)。 + */ + DeleteTime: number; +} +/** + * DescribeSmsSignList请求参数结构体 + */ +export interface DescribeSmsSignListRequest { + /** + * 签名 ID 数组。 + */ + SignIdSet: Array; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International: number; +} +/** + * SmsPackagesStatistics请求参数结构体 + */ +export interface SmsPackagesStatisticsRequest { + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,示例如1400006666。 + */ + SmsSdkAppid: string; + /** + * 最大上限(需要拉取的套餐包个数)。 + */ + Limit: number; + /** + * 偏移量。 + 注:目前固定设置为0。 + */ + Offset: number; +} +/** + * 获取短信模板信息响应 + */ +export interface DescribeTemplateListStatus { + /** + * 模板Id + */ + TemplateId?: number; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International?: number; + /** + * 申请模板状态,其中0表示审核通过且已生效,1表示审核中,2表示审核通过待生效,-1表示审核未通过或审核失败。 + */ + StatusCode?: number; + /** + * 审核回复,审核人员审核后给出的回复,通常是审核未通过的原因。 + */ + ReviewReply?: string; + /** + * 模板名称。 + */ + TemplateName?: string; + /** + * 提交审核时间,UNIX 时间戳(单位:秒)。 + */ + CreateTime?: number; +} +/** + * AddSmsTemplate返回参数结构体 + */ +export interface AddSmsTemplateResponse { + /** + * 添加短信模板响应包体 + */ + AddTemplateStatus?: AddTemplateStatus; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * 短信的下发状态详细信息 + */ +export interface PullSmsSendStatus { + /** + * 用户实际接收到短信的时间。 + */ + UserReceiveTime: string; + /** + * 用户实际接收到短信的时间,UNIX 时间戳(单位:秒)。 + */ + UserReceiveUnixTime: number; + /** + * 国家(或地区)码。 + */ + NationCode: string; + /** + * 手机号码,e.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PurePhoneNumber: string; + /** + * 手机号码,普通格式,示例如:13711112222。 + */ + PhoneNumber: string; + /** + * 本次发送标识 ID。 + */ + SerialNo: string; + /** + * 实际是否收到短信接收状态,SUCCESS(成功)、FAIL(失败)。 + */ + ReportStatus: string; + /** + * 用户接收短信状态描述。 + */ + Description: string; +} +/** + * DescribeSmsSignList返回参数结构体 + */ +export interface DescribeSmsSignListResponse { + /** + * 获取签名信息响应 + */ + DescribeSignListStatusSet?: Array; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * DescribeSmsTemplateList请求参数结构体 + */ +export interface DescribeSmsTemplateListRequest { + /** + * 模板 ID 数组。 + */ + TemplateIdSet: Array; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International: number; +} +/** + * 回执数据统计响应包体 + */ +export interface CallbackStatusStatistics { + /** + * 短信回执量统计。 + */ + CallbackCount: number; + /** + * 短信提交成功量统计。 + */ + RequestSuccessCount: number; + /** + * 短信回执失败量统计。 + */ + CallbackFailCount: number; + /** + * 短信回执成功量统计。 + */ + CallbackSuccessCount: number; + /** + * 运营商内部错误统计。 + */ + InternalErrorCount: number; + /** + * 号码无效或空号统计。 + */ + InvalidNumberCount: number; + /** + * 停机、关机等错误统计。 + */ + ShutdownErrorCount: number; + /** + * 号码拉入黑名单统计。 + */ + BlackListCount: number; + /** + * 运营商频率限制统计。 + */ + FrequencyLimitCount: number; +} +/** + * SendStatusStatistics请求参数结构体 + */ +export interface SendStatusStatisticsRequest { + /** + * 拉取起始时间,yyyymmddhh 需要拉取的起始时间,精确到小时。 + */ + StartDateTime: number; + /** + * 结束时间,yyyymmddhh 需要拉取的截止时间,精确到小时 + 注:EndDataTime 必须大于 StartDateTime。 + */ + EndDataTime: number; + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,示例如1400006666。 + */ + SmsSdkAppid: string; + /** + * 最大上限。 + 注:目前固定设置为0。 + */ + Limit: number; + /** + * 偏移量。 + 注:目前固定设置为0。 + */ + Offset: number; +} +/** + * DeleteSmsTemplate请求参数结构体 + */ +export interface DeleteSmsTemplateRequest { + /** + * 待删除的模板 ID。 + */ + TemplateId: number; +} +/** + * PullSmsReplyStatusByPhoneNumber返回参数结构体 + */ +export interface PullSmsReplyStatusByPhoneNumberResponse { + /** + * 回复状态响应集合。 + */ + PullSmsReplyStatusSet?: Array; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * 发送短信状态 + */ +export interface SendStatus { + /** + * 发送流水号。 + */ + SerialNo: string; + /** + * 手机号码,e.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string; + /** + * 计费条数,计费规则请查询 [计费策略](https://cloud.tencent.com/document/product/382/36135)。 + */ + Fee: number; + /** + * 用户Session内容。 + */ + SessionContext: string; + /** + * 短信请求错误码,具体含义请参考错误码。 + */ + Code: string; + /** + * 短信请求错误码描述。 + */ + Message: string; + /** + * 国家码或地区码,例如CN,US等,对于未识别出国家码或者地区码,默认返回DEF,具体支持列表请参考国际/港澳台计费总览。 + */ + IsoCode: string; +} +/** + * DeleteSmsSign返回参数结构体 + */ +export interface DeleteSmsSignResponse { + /** + * 删除签名响应 + */ + DeleteSignStatus?: DeleteSignStatus; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * AddSmsSign返回参数结构体 + */ +export interface AddSmsSignResponse { + /** + * 添加签名响应 + */ + AddSignStatus?: AddSignStatus; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * DeleteSmsSign请求参数结构体 + */ +export interface DeleteSmsSignRequest { + /** + * 待删除的签名 ID。 + */ + SignId: number; +} +/** + * PullSmsReplyStatusByPhoneNumber请求参数结构体 + */ +export interface PullSmsReplyStatusByPhoneNumberRequest { + /** + * 拉取起始时间,UNIX 时间戳(时间:秒)。 + 注:最大可拉取当前时期7天前的数据。 + */ + SendDateTime: number; + /** + * 偏移量。 + 注:目前固定设置为0。 + */ + Offset: number; + /** + * 拉取最大条数,最多 100。 + */ + Limit: number; + /** + * 下发目的手机号码,依据 e.164 标准为:+[国家(或地区)码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string; + /** + * 短信SdkAppid在 [短信控制台](https://console.cloud.tencent.com/smsv2) 添加应用后生成的实际SdkAppid,例如1400006666。 + */ + SmsSdkAppid: string; + /** + * 拉取截止时间,UNIX 时间戳(时间:秒)。 + */ + EndDateTime?: number; +} +/** + * ModifySmsSign返回参数结构体 + */ +export interface ModifySmsSignResponse { + /** + * 修改签名响应 + */ + ModifySignStatus?: ModifySignStatus; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * 添加签名响应 + */ +export interface AddSignStatus { + /** + * 签名Id。 + */ + SignId: number; + /** + * 签名申请Id。 + */ + SignApplyId: number; +} +/** + * 修改模板参数响应 + */ +export interface ModifyTemplateStatus { + /** + * 模板参数 + */ + TemplateId: number; +} +/** + * PullSmsSendStatus返回参数结构体 + */ +export interface PullSmsSendStatusResponse { + /** + * 下发状态响应集合。 + */ + PullSmsSendStatusSet?: Array; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * SmsPackagesStatistics返回参数结构体 + */ +export interface SmsPackagesStatisticsResponse { + /** + * 发送数据统计响应包体。 + */ + SmsPackagesStatisticsSet?: Array; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * 删除签名响应 + */ +export interface DeleteSignStatus { + /** + * 删除状态信息。 + 注意:此字段可能返回 null,表示取不到有效值。 + */ + DeleteStatus: string; + /** + * 删除时间,UNIX 时间戳(单位:秒)。 + 注意:此字段可能返回 null,表示取不到有效值。 + */ + DeleteTime: number; +} +/** + * PullSmsReplyStatus返回参数结构体 + */ +export interface PullSmsReplyStatusResponse { + /** + * 回复状态响应集合。 + */ + PullSmsReplyStatusSet?: Array; + /** + * 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_models.js b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_models.js new file mode 100644 index 0000000..0f824c4 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20190711/sms_models.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * Copyright (c) 2018 THL A29 Limited, a Tencent company. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/index.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/index.d.ts new file mode 100644 index 0000000..8d31849 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/index.d.ts @@ -0,0 +1,6 @@ +import * as Models from "./sms_models"; +import { Client } from "./sms_client"; +export declare const v20210111: { + Client: typeof Client; + Models: typeof Models; +}; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/index.js b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/index.js new file mode 100644 index 0000000..c17f98c --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/index.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.v20210111 = void 0; +const Models = require("./sms_models"); +const sms_client_1 = require("./sms_client"); +exports.v20210111 = { + Client: sms_client_1.Client, + Models: Models, +}; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_client.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_client.d.ts new file mode 100644 index 0000000..d095b85 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_client.d.ts @@ -0,0 +1,128 @@ +import * as TencentCloudCommon from "tencentcloud-sdk-nodejs-common"; +import { PullSmsReplyStatusRequest, DeleteSmsTemplateResponse, ModifySmsTemplateResponse, ModifySmsSignRequest, SmsPackagesStatisticsRequest, AddSmsSignRequest, DescribeSmsTemplateListResponse, DescribePhoneNumberInfoRequest, PullSmsSendStatusByPhoneNumberRequest, ReportConversionResponse, AddSmsTemplateRequest, ModifySmsTemplateRequest, CallbackStatusStatisticsResponse, PullSmsSendStatusRequest, PullSmsSendStatusByPhoneNumberResponse, SendSmsResponse, SendStatusStatisticsResponse, SendSmsRequest, CallbackStatusStatisticsRequest, DescribeSmsSignListRequest, DescribePhoneNumberInfoResponse, AddSmsTemplateResponse, DescribeSmsSignListResponse, DescribeSmsTemplateListRequest, SendStatusStatisticsRequest, DeleteSmsTemplateRequest, PullSmsReplyStatusByPhoneNumberResponse, DeleteSmsSignResponse, AddSmsSignResponse, DeleteSmsSignRequest, PullSmsReplyStatusByPhoneNumberRequest, ModifySmsSignResponse, ReportConversionRequest, PullSmsSendStatusResponse, SmsPackagesStatisticsResponse, PullSmsReplyStatusResponse } from "./sms_models"; +/** + * sms client + * @class + */ +export declare class Client extends TencentCloudCommon.AbstractClient { + constructor(clientConfig: TencentCloudCommon.ClientConfig); + /** + * 1. 修改短信签名,修改之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 + 2. ⚠️注意:个人认证用户不支持使用 API 修改短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信签名。 + 3. 修改短信签名,仅当签名为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的签名不支持修改。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + ModifySmsSign(req: ModifySmsSignRequest, cb?: (error: string, rep: ModifySmsSignResponse) => void): Promise; + /** + * 1. 添加短信签名,申请之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 + 2. ⚠️注意:个人认证用户不支持使用 API 申请短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录控制台申请短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + AddSmsSign(req: AddSmsSignRequest, cb?: (error: string, rep: AddSmsSignResponse) => void): Promise; + /** + * 拉取短信下发状态。 + 目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 + >- 注:此接口需要联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + PullSmsSendStatus(req: PullSmsSendStatusRequest, cb?: (error: string, rep: PullSmsSendStatusResponse) => void): Promise; + /** + * 短信发送接口,用于给用户发短信验证码、通知类短信或营销短信。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 注:您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + >- 注:当前接口属于 2021-01-11 版本,如果您仍在使用 [2019-07-11 版本](https://cloud.tencent.com/document/product/382/38778),建议您使用当前最新版本的接口,版本差异可参考[版本描述](https://cloud.tencent.com/document/product/382/63195#.E7.89.88.E6.9C.AC.E6.8F.8F.E8.BF.B0)。 + */ + SendSms(req: SendSmsRequest, cb?: (error: string, rep: SendSmsResponse) => void): Promise; + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信正文模板,请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信正文模板,如需了解请参阅 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + DeleteSmsTemplate(req: DeleteSmsTemplateRequest, cb?: (error: string, rep: DeleteSmsTemplateResponse) => void): Promise; + /** + * 用户套餐包信息统计。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + SmsPackagesStatistics(req: SmsPackagesStatisticsRequest, cb?: (error: string, rep: SmsPackagesStatisticsResponse) => void): Promise; + /** + * 统计用户发送短信的数据。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + SendStatusStatistics(req: SendStatusStatisticsRequest, cb?: (error: string, rep: SendStatusStatisticsResponse) => void): Promise; + /** + * 统计用户回执的数据。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + CallbackStatusStatistics(req: CallbackStatusStatisticsRequest, cb?: (error: string, rep: CallbackStatusStatisticsResponse) => void): Promise; + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + DescribeSmsTemplateList(req: DescribeSmsTemplateListRequest, cb?: (error: string, rep: DescribeSmsTemplateListResponse) => void): Promise; + /** + * 拉取短信回复状态。 + 目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 + >- 注:此接口需要联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + PullSmsReplyStatus(req: PullSmsReplyStatusRequest, cb?: (error: string, rep: PullSmsReplyStatusResponse) => void): Promise; + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 查询短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + DescribeSmsSignList(req: DescribeSmsSignListRequest, cb?: (error: string, rep: DescribeSmsSignListResponse) => void): Promise; + /** + * 拉取单个号码短信下发状态。 + 目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + PullSmsSendStatusByPhoneNumber(req: PullSmsSendStatusByPhoneNumberRequest, cb?: (error: string, rep: PullSmsSendStatusByPhoneNumberResponse) => void): Promise; + /** + * 短信转化率上报。将已接收到短信的流水号上报到腾讯云短信服务。 + >- 注:当前接口以白名单方式对外开放,如有需要请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 + */ + ReportConversion(req: ReportConversionRequest, cb?: (error: string, rep: ReportConversionResponse) => void): Promise; + /** + * 1. 修改短信正文模板,修改之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 + 2. ⚠️注意:个人认证用户不支持使用 API 修改短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信正文模板。 + 3. 修改短信模板,仅当正文模板为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的正文模板不支持修改。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + ModifySmsTemplate(req: ModifySmsTemplateRequest, cb?: (error: string, rep: ModifySmsTemplateResponse) => void): Promise; + /** + * 拉取单个号码短信回复状态。 + 目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + PullSmsReplyStatusByPhoneNumber(req: PullSmsReplyStatusByPhoneNumberRequest, cb?: (error: string, rep: PullSmsReplyStatusByPhoneNumberResponse) => void): Promise; + /** + * 提供电话号码的信息查询,包括国家(或地区)码、规范的 E.164 格式号码等。 + >- 例如:查询号码 +86018845720123,可以得到国家码 86、规范的 E.164 号码 +8618845720123 等信息。 + */ + DescribePhoneNumberInfo(req: DescribePhoneNumberInfoRequest, cb?: (error: string, rep: DescribePhoneNumberInfoResponse) => void): Promise; + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + DeleteSmsSign(req: DeleteSmsSignRequest, cb?: (error: string, rep: DeleteSmsSignResponse) => void): Promise; + /** + * 1. 添加短信模板,申请之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 + 2. ⚠️注意:个人认证用户不支持使用 API 申请短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 申请短信正文模板。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + AddSmsTemplate(req: AddSmsTemplateRequest, cb?: (error: string, rep: AddSmsTemplateResponse) => void): Promise; +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_client.js b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_client.js new file mode 100644 index 0000000..c669880 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_client.js @@ -0,0 +1,186 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Client = void 0; +/* eslint-disable @typescript-eslint/no-unused-vars */ +/* + * Copyright (c) 2018 THL A29 Limited, a Tencent company. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +const TencentCloudCommon = require("tencentcloud-sdk-nodejs-common"); +/** + * sms client + * @class + */ +class Client extends TencentCloudCommon.AbstractClient { + constructor(clientConfig) { + super("sms.tencentcloudapi.com", "2021-01-11", clientConfig); + } + /** + * 1. 修改短信签名,修改之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 + 2. ⚠️注意:个人认证用户不支持使用 API 修改短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信签名。 + 3. 修改短信签名,仅当签名为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的签名不支持修改。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async ModifySmsSign(req, cb) { + return this.request("ModifySmsSign", req, cb); + } + /** + * 1. 添加短信签名,申请之前请先认真参阅 [腾讯云短信签名审核标准](https://cloud.tencent.com/document/product/382/39022)。 + 2. ⚠️注意:个人认证用户不支持使用 API 申请短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录控制台申请短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async AddSmsSign(req, cb) { + return this.request("AddSmsSign", req, cb); + } + /** + * 拉取短信下发状态。 + 目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 + >- 注:此接口需要联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsSendStatus(req, cb) { + return this.request("PullSmsSendStatus", req, cb); + } + /** + * 短信发送接口,用于给用户发短信验证码、通知类短信或营销短信。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 [SDK](https://cloud.tencent.com/document/product/382/43193) 来使用云短信服务。 + >- 注:您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + >- 注:当前接口属于 2021-01-11 版本,如果您仍在使用 [2019-07-11 版本](https://cloud.tencent.com/document/product/382/38778),建议您使用当前最新版本的接口,版本差异可参考[版本描述](https://cloud.tencent.com/document/product/382/63195#.E7.89.88.E6.9C.AC.E6.8F.8F.E8.BF.B0)。 + */ + async SendSms(req, cb) { + return this.request("SendSms", req, cb); + } + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信正文模板,请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信正文模板,如需了解请参阅 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DeleteSmsTemplate(req, cb) { + return this.request("DeleteSmsTemplate", req, cb); + } + /** + * 用户套餐包信息统计。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async SmsPackagesStatistics(req, cb) { + return this.request("SmsPackagesStatistics", req, cb); + } + /** + * 统计用户发送短信的数据。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async SendStatusStatistics(req, cb) { + return this.request("SendStatusStatistics", req, cb); + } + /** + * 统计用户回执的数据。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async CallbackStatusStatistics(req, cb) { + return this.request("CallbackStatusStatistics", req, cb); + } + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629)。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DescribeSmsTemplateList(req, cb) { + return this.request("DescribeSmsTemplateList", req, cb); + } + /** + * 拉取短信回复状态。 + 目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 + >- 注:此接口需要联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsReplyStatus(req, cb) { + return this.request("PullSmsReplyStatus", req, cb); + } + /** + * ⚠️注意:个人认证用户不支持使用 API 查询短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 查询短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DescribeSmsSignList(req, cb) { + return this.request("DescribeSmsSignList", req, cb); + } + /** + * 拉取单个号码短信下发状态。 + 目前也支持 [配置回调](https://cloud.tencent.com/document/product/382/37809#.E8.AE.BE.E7.BD.AE.E4.BA.8B.E4.BB.B6.E5.9B.9E.E8.B0.83.E9.85.8D.E7.BD.AE) 的方式来获取下发状态。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsSendStatusByPhoneNumber(req, cb) { + return this.request("PullSmsSendStatusByPhoneNumber", req, cb); + } + /** + * 短信转化率上报。将已接收到短信的流水号上报到腾讯云短信服务。 + >- 注:当前接口以白名单方式对外开放,如有需要请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81) 开通。 + */ + async ReportConversion(req, cb) { + return this.request("ReportConversion", req, cb); + } + /** + * 1. 修改短信正文模板,修改之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 + 2. ⚠️注意:个人认证用户不支持使用 API 修改短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 修改短信正文模板。 + 3. 修改短信模板,仅当正文模板为**待审核**或**已拒绝**状态时,才能进行修改,**已审核通过**的正文模板不支持修改。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2019-07-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async ModifySmsTemplate(req, cb) { + return this.request("ModifySmsTemplate", req, cb); + } + /** + * 拉取单个号码短信回复状态。 + 目前也支持 [配置回复回调](https://cloud.tencent.com/document/product/382/42907) 的方式来获取上行回复。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async PullSmsReplyStatusByPhoneNumber(req, cb) { + return this.request("PullSmsReplyStatusByPhoneNumber", req, cb); + } + /** + * 提供电话号码的信息查询,包括国家(或地区)码、规范的 E.164 格式号码等。 + >- 例如:查询号码 +86018845720123,可以得到国家码 86、规范的 E.164 号码 +8618845720123 等信息。 + */ + async DescribePhoneNumberInfo(req, cb) { + return this.request("DescribePhoneNumberInfo", req, cb); + } + /** + * ⚠️注意:个人认证用户不支持使用 API 删除短信签名,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),请登录 [控制台](https://console.cloud.tencent.com/smsv2) 删除短信签名。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async DeleteSmsSign(req, cb) { + return this.request("DeleteSmsSign", req, cb); + } + /** + * 1. 添加短信模板,申请之前请先认真参阅 [腾讯云短信正文模板审核标准](https://cloud.tencent.com/document/product/382/39023)。 + 2. ⚠️注意:个人认证用户不支持使用 API 申请短信正文模板,请参阅了解 [实名认证基本介绍](https://cloud.tencent.com/document/product/378/3629),如果为个人认证请登录 [控制台](https://console.cloud.tencent.com/smsv2) 申请短信正文模板。 + >- 注:由于云 **API3.0 安全性**有所提升,所以**接口鉴权**较为复杂,建议使用 SDK 来使用云短信服务。 + >- 您可以在 [API 3.0 Explorer](https://console.cloud.tencent.com/api/explorer?Product=sms&Version=2021-01-11&Action=SendSms) 中直接运行该接口,可以先免去签名计算步骤。运行成功后,API Explorer可以**自动生成**SDK代码示例。 + */ + async AddSmsTemplate(req, cb) { + return this.request("AddSmsTemplate", req, cb); + } +} +exports.Client = Client; diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_models.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_models.d.ts new file mode 100644 index 0000000..b19d363 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_models.d.ts @@ -0,0 +1,1086 @@ +/** + * PullSmsReplyStatus请求参数结构体 + */ +export interface PullSmsReplyStatusRequest { + /** + * 拉取最大条数,最多100条。 + */ + Limit: number; + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,例如1400006666。 + */ + SmsSdkAppId: string; +} +/** + * DeleteSmsTemplate返回参数结构体 + */ +export interface DeleteSmsTemplateResponse { + /** + * 删除模板响应 + */ + DeleteTemplateStatus?: DeleteTemplateStatus; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * ModifySmsTemplate返回参数结构体 + */ +export interface ModifySmsTemplateResponse { + /** + * 修改模板参数响应 + */ + ModifyTemplateStatus?: ModifyTemplateStatus; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * ModifySmsSign请求参数结构体 + */ +export interface ModifySmsSignRequest { + /** + * 待修改的签名 ID。 + */ + SignId: number; + /** + * 签名名称。 + */ + SignName: string; + /** + * 签名类型。其中每种类型后面标注了其可选的 DocumentType(证明类型): + 0:公司,可选 DocumentType 有(0,1)。 + 1:APP,可选 DocumentType 有(0,1,2,3,4) 。 + 2:网站,可选 DocumentType 有(0,1,2,3,5)。 + 3:公众号,可选 DocumentType 有(0,1,2,3,8)。 + 4:商标,可选 DocumentType 有(7)。 + 5:政府/机关事业单位/其他机构,可选 DocumentType 有(2,3)。 + 6:小程序,可选 DocumentType 有(0,1,2,3,6)。 + 注:必须按照对应关系选择证明类型,否则会审核失败。 + */ + SignType: number; + /** + * 证明类型: + 0:三证合一。 + 1:企业营业执照。 + 2:组织机构代码证书。 + 3:社会信用代码证书。 + 4:应用后台管理截图(个人开发APP)。 + 5:网站备案后台截图(个人开发网站)。 + 6:小程序设置页面截图(个人认证小程序)。 + 7:商标注册书。 + 8:公众号设置页面截图(个人认证公众号)。 + */ + DocumentType: number; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + 注:需要和待修改签名International值保持一致,该参数不能直接修改国内签名到国际签名。 + */ + International: number; + /** + * 签名用途: + 0:自用。 + 1:他用。 + */ + SignPurpose: number; + /** + * 签名对应的资质证明图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + */ + ProofImage: string; + /** + * 委托授权证明。选择 SignPurpose 为他用之后需要提交委托的授权证明。 + 图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + 注:只有 SignPurpose 在选择为 1(他用)时,这个字段才会生效。 + */ + CommissionImage?: string; + /** + * 签名的申请备注。 + */ + Remark?: string; +} +/** + * SmsPackagesStatistics请求参数结构体 + */ +export interface SmsPackagesStatisticsRequest { + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string; + /** + * 最大上限(需要拉取的套餐包个数)。 + */ + Limit: number; + /** + * 偏移量。 + */ + Offset: number; + /** + * 起始时间,格式为yyyymmddhh,精确到小时,例如2021050113,表示2021年5月1号13时。 + 注:接口会返回 BeginTime 到 EndTime 之间创建的套餐包的统计信息。 + */ + BeginTime: string; + /** + * 结束时间,格式为yyyymmddhh,精确到小时,例如2021050118,表示2021年5月1号18时。 + 注:EndTime 必须大于 BeginTime 且小于当前时间。 + */ + EndTime: string; +} +/** + * 转化率上报响应。 + */ +export interface ReportConversionStatus { + /** + * 错误码。上报成功返回 ok。 + */ + Code: string; + /** + * 错误码描述。 + */ + Message: string; +} +/** + * AddSmsSign请求参数结构体 + */ +export interface AddSmsSignRequest { + /** + * 签名名称。 + 注:不能重复申请已通过或待审核的签名。 + */ + SignName: string; + /** + * 签名类型。其中每种类型后面标注了其可选的 DocumentType(证明类型): + 0:公司,可选 DocumentType 有(0,1)。 + 1:APP,可选 DocumentType 有(0,1,2,3,4) 。 + 2:网站,可选 DocumentType 有(0,1,2,3,5)。 + 3:公众号,可选 DocumentType 有(0,1,2,3,8)。 + 4:商标,可选 DocumentType 有(7)。 + 5:政府/机关事业单位/其他机构,可选 DocumentType 有(2,3)。 + 6:小程序,可选 DocumentType 有(0,1,2,3,6)。 + 注:必须按照对应关系选择证明类型,否则会审核失败。 + */ + SignType: number; + /** + * 证明类型: + 0:三证合一。 + 1:企业营业执照。 + 2:组织机构代码证书。 + 3:社会信用代码证书。 + 4:应用后台管理截图(个人开发APP)。 + 5:网站备案后台截图(个人开发网站)。 + 6:小程序设置页面截图(个人认证小程序)。 + 7:商标注册书。 + 8:公众号设置页面截图(个人认证公众号)。 + */ + DocumentType: number; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International: number; + /** + * 签名用途: + 0:自用。 + 1:他用。 + */ + SignPurpose: number; + /** + * 签名对应的资质证明图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + */ + ProofImage: string; + /** + * 委托授权证明。选择 SignPurpose 为他用之后需要提交委托的授权证明。 + 图片需先进行 base64 编码格式转换,将转换后的字符串去掉前缀`data:image/jpeg;base64,`再赋值给该参数。 + 注:只有 SignPurpose 在选择为 1(他用)时,这个字段才会生效。 + */ + CommissionImage?: string; + /** + * 签名的申请备注。 + */ + Remark?: string; +} +/** + * 添加模板参数响应 + */ +export interface AddTemplateStatus { + /** + * 模板ID。 + */ + TemplateId: string; +} +/** + * DescribeSmsTemplateList返回参数结构体 + */ +export interface DescribeSmsTemplateListResponse { + /** + * 获取短信模板信息响应 + */ + DescribeTemplateStatusSet?: Array; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * DescribePhoneNumberInfo请求参数结构体 + */ +export interface DescribePhoneNumberInfoRequest { + /** + * 查询手机号码,采用 E.164 标准,格式为+[国家或地区码][手机号],单次请求最多支持200个手机号。 + 例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumberSet: Array; +} +/** + * PullSmsSendStatusByPhoneNumber请求参数结构体 + */ +export interface PullSmsSendStatusByPhoneNumberRequest { + /** + * 拉取起始时间,UNIX 时间戳(时间:秒)。 + 注:最大可拉取当前时期前7天的数据。 + */ + BeginTime: number; + /** + * 偏移量。 + 注:目前固定设置为0。 + */ + Offset: number; + /** + * 拉取最大条数,最多 100。 + */ + Limit: number; + /** + * 下发目的手机号码,依据 E.164 标准为:+[国家(或地区)码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string; + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string; + /** + * 拉取截止时间,UNIX 时间戳(时间:秒)。 + */ + EndTime?: number; +} +/** + * ReportConversion返回参数结构体 + */ +export interface ReportConversionResponse { + /** + * 转化率上报响应包体。 + */ + ReportConversionStatus?: ReportConversionStatus; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * AddSmsTemplate请求参数结构体 + */ +export interface AddSmsTemplateRequest { + /** + * 模板名称。 + */ + TemplateName: string; + /** + * 模板内容。 + */ + TemplateContent: string; + /** + * 短信类型,0表示普通短信, 1表示营销短信。 + */ + SmsType: number; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International: number; + /** + * 模板备注,例如申请原因,使用场景等。 + */ + Remark: string; +} +/** + * ModifySmsTemplate请求参数结构体 + */ +export interface ModifySmsTemplateRequest { + /** + * 待修改模板的ID。 + */ + TemplateId: number; + /** + * 新的模板名称。 + */ + TemplateName: string; + /** + * 新的模板内容。 + */ + TemplateContent: string; + /** + * 短信类型,0表示普通短信, 1表示营销短信。 + */ + SmsType: number; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International: number; + /** + * 模板备注,例如申请原因,使用场景等。 + */ + Remark: string; +} +/** + * 短信回复状态 + */ +export interface PullSmsReplyStatus { + /** + * 短信码号扩展号,默认未开通,如需开通请联系 [sms helper](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。 + */ + ExtendCode: string; + /** + * 国家(或地区)码。 + */ + CountryCode: string; + /** + * 手机号码,E.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string; + /** + * 短信签名名称。 + */ + SignName: string; + /** + * 用户回复的内容。 + */ + ReplyContent: string; + /** + * 回复时间,UNIX 时间戳(单位:秒)。 + */ + ReplyTime: number; + /** + * 用户号码,普通格式,示例如:13711112222。 + */ + SubscriberNumber: string; +} +/** + * CallbackStatusStatistics返回参数结构体 + */ +export interface CallbackStatusStatisticsResponse { + /** + * 回执数据统计响应包体。 + */ + CallbackStatusStatistics?: CallbackStatusStatistics; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * PullSmsSendStatus请求参数结构体 + */ +export interface PullSmsSendStatusRequest { + /** + * 拉取最大条数,最多100条。 + */ + Limit: number; + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,例如1400006666。 + */ + SmsSdkAppId: string; +} +/** + * 套餐包信息统计响应包体 + */ +export interface SmsPackagesStatistics { + /** + * 套餐包创建时间,UNIX 时间戳(单位:秒)。 + */ + PackageCreateTime: number; + /** + * 套餐包生效时间,UNIX 时间戳(单位:秒)。 + */ + PackageEffectiveTime: number; + /** + * 套餐包过期时间,UNIX 时间戳(单位:秒)。 + */ + PackageExpiredTime: number; + /** + * 套餐包条数。 + */ + PackageAmount: number; + /** + * 套餐包类别,0表示赠送套餐包,1表示购买套餐包。 + */ + PackageType: number; + /** + * 套餐包 ID。 + */ + PackageId: number; + /** + * 当前使用套餐包条数。 + */ + CurrentUsage: number; +} +/** + * PullSmsSendStatusByPhoneNumber返回参数结构体 + */ +export interface PullSmsSendStatusByPhoneNumberResponse { + /** + * 下发状态响应集合。 + */ + PullSmsSendStatusSet?: Array; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * 修改签名响应 + */ +export interface ModifySignStatus { + /** + * 签名ID。 + */ + SignId: number; +} +/** + * 获取短信签名信息响应 + */ +export interface DescribeSignListStatus { + /** + * 签名ID。 + */ + SignId?: number; + /** + * 是否国际/港澳台短信,其中0表示国内短信,1表示国际/港澳台短信。 + */ + International?: number; + /** + * 申请签名状态,其中0表示审核通过,1表示审核中。 + -1:表示审核未通过或审核失败。 + */ + StatusCode?: number; + /** + * 审核回复,审核人员审核后给出的回复,通常是审核未通过的原因。 + */ + ReviewReply?: string; + /** + * 签名名称。 + */ + SignName?: string; + /** + * 提交审核时间,UNIX 时间戳(单位:秒)。 + */ + CreateTime?: number; +} +/** + * SendSms返回参数结构体 + */ +export interface SendSmsResponse { + /** + * 短信发送状态。 + */ + SendStatusSet?: Array; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * SendStatusStatistics返回参数结构体 + */ +export interface SendStatusStatisticsResponse { + /** + * 发送数据统计响应包体。 + */ + SendStatusStatistics?: SendStatusStatistics; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * SendSms请求参数结构体 + */ +export interface SendSmsRequest { + /** + * 下发手机号码,采用 E.164 标准,格式为+[国家或地区码][手机号],单次请求最多支持200个手机号且要求全为境内手机号或全为境外手机号。 + 例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + 注:发送国内短信格式还支持0086、86或无任何国家或地区码的11位手机号码,前缀默认为+86。 + */ + PhoneNumberSet: Array; + /** + * 短信 SdkAppId,在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string; + /** + * 模板 ID,必须填写已审核通过的模板 ID。模板 ID 可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看,若向境外手机号发送短信,仅支持使用国际/港澳台短信模板。 + */ + TemplateId: string; + /** + * 短信签名内容,使用 UTF-8 编码,必须填写已审核通过的签名,例如:腾讯云,签名信息可前往 [国内短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [国际/港澳台短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的签名管理查看。 + 发送国内短信该参数必填,且需填写签名内容而非签名ID。 + */ + SignName?: string; + /** + * 模板参数,若无模板参数,则设置为空。 + 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致。 + */ + TemplateParamSet?: Array; + /** + * 短信码号扩展号,默认未开通,如需开通请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。 + */ + ExtendCode?: string; + /** + * 用户的 session 内容,可以携带用户侧 ID 等上下文信息,server 会原样返回。注意长度需小于512字节。 + */ + SessionContext?: string; + /** + * 国内短信无需填写该项;国际/港澳台短信已申请独立 SenderId 需要填写该字段,默认使用公共 SenderId,无需填写该字段。 + 注:月度使用量达到指定量级可申请独立 SenderId 使用,详情请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。 + */ + SenderId?: string; +} +/** + * 发送数据统计响应包体 + */ +export interface SendStatusStatistics { + /** + * 短信计费条数统计,例如提交成功量为100条,其中有20条是长短信(长度为80字)被拆分成2条,则计费条数为: ```80 * 1 + 20 * 2 = 120``` 条。 + */ + FeeCount: number; + /** + * 短信提交量统计。 + */ + RequestCount: number; + /** + * 短信提交成功量统计。 + */ + RequestSuccessCount: number; +} +/** + * CallbackStatusStatistics请求参数结构体 + */ +export interface CallbackStatusStatisticsRequest { + /** + * 起始时间,格式为yyyymmddhh,精确到小时,例如2021050113,表示2021年5月1号13时。 + */ + BeginTime: string; + /** + * 结束时间,格式为yyyymmddhh,精确到小时,例如2021050118,表示2021年5月1号18时。 + 注:EndTime 必须大于 BeginTime,且相差不超过32天。 + */ + EndTime: string; + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string; + /** + * 最大上限。 + 注:目前固定设置为0。 + */ + Limit: number; + /** + * 偏移量。 + 注:目前固定设置为0。 + */ + Offset: number; +} +/** + * 删除模板响应 + */ +export interface DeleteTemplateStatus { + /** + * 删除状态信息。 + */ + DeleteStatus: string; + /** + * 删除时间,UNIX 时间戳(单位:秒)。 + */ + DeleteTime: number; +} +/** + * DescribeSmsSignList请求参数结构体 + */ +export interface DescribeSmsSignListRequest { + /** + * 签名 ID 数组。 + 注:默认数组最大长度100。 + */ + SignIdSet: Array; + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International: number; +} +/** + * DescribePhoneNumberInfo返回参数结构体 + */ +export interface DescribePhoneNumberInfoResponse { + /** + * 获取号码信息。 + */ + PhoneNumberInfoSet?: Array; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * 获取短信模板信息响应 + */ +export interface DescribeTemplateListStatus { + /** + * 模板ID。 + */ + TemplateId?: number; + /** + * 是否国际/港澳台短信,其中0表示国内短信,1表示国际/港澳台短信,3表示该模板既支持国内短信也支持国际/港澳台短信。 + */ + International?: number; + /** + * 申请模板状态,其中0表示审核通过且已生效,1表示审核中,2表示审核通过待生效,-1表示审核未通过或审核失败。注:只有状态值为0时该模板才能使用。 + */ + StatusCode?: number; + /** + * 审核回复,审核人员审核后给出的回复,通常是审核未通过的原因。 + */ + ReviewReply?: string; + /** + * 模板名称。 + */ + TemplateName?: string; + /** + * 提交审核时间,UNIX 时间戳(单位:秒)。 + */ + CreateTime?: number; + /** + * 模板内容。 + */ + TemplateContent?: string; +} +/** + * AddSmsTemplate返回参数结构体 + */ +export interface AddSmsTemplateResponse { + /** + * 添加短信模板响应包体 + */ + AddTemplateStatus?: AddTemplateStatus; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * 短信的下发状态详细信息 + */ +export interface PullSmsSendStatus { + /** + * 用户实际接收到短信的时间,UNIX 时间戳(单位:秒)。 + */ + UserReceiveTime: number; + /** + * 国家(或地区)码。 + */ + CountryCode: string; + /** + * 用户号码,普通格式,示例如:13711112222。 + */ + SubscriberNumber: string; + /** + * 手机号码,E.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string; + /** + * 本次发送标识 ID。 + */ + SerialNo: string; + /** + * 实际是否收到短信接收状态,SUCCESS(成功)、FAIL(失败)。 + */ + ReportStatus: string; + /** + * 用户接收短信状态描述。 + */ + Description: string; + /** + * 用户的 session 内容。与请求中的 SessionContext 一致,默认为空,如需开通请联系 [腾讯云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。 + 注意:此字段可能返回 null,表示取不到有效值。 + */ + SessionContext: string; +} +/** + * DescribeSmsSignList返回参数结构体 + */ +export interface DescribeSmsSignListResponse { + /** + * 获取签名信息响应 + */ + DescribeSignListStatusSet?: Array; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * DescribeSmsTemplateList请求参数结构体 + */ +export interface DescribeSmsTemplateListRequest { + /** + * 是否国际/港澳台短信: + 0:表示国内短信。 + 1:表示国际/港澳台短信。 + */ + International: number; + /** + * 模板 ID 数组。数组为空时默认查询模板列表信息,请使用 Limit 和 Offset 字段设置查询范围。 + 默认数组长度最大100 + */ + TemplateIdSet?: Array; + /** + * 最大上限,最多100。 + 注:默认为0,TemplateIdSet 为空时启用。 + */ + Limit?: number; + /** + * 偏移量。 + 注:默认为0,TemplateIdSet 为空时启用。 + */ + Offset?: number; +} +/** + * 回执数据统计响应包体 + */ +export interface CallbackStatusStatistics { + /** + * 短信回执量统计。 + */ + CallbackCount: number; + /** + * 短信提交成功量统计。 + */ + RequestSuccessCount: number; + /** + * 短信回执失败量统计。 + */ + CallbackFailCount: number; + /** + * 短信回执成功量统计。 + */ + CallbackSuccessCount: number; + /** + * 运营商内部错误统计。 + */ + InternalErrorCount: number; + /** + * 号码无效或空号统计。 + */ + InvalidNumberCount: number; + /** + * 停机、关机等错误统计。 + */ + ShutdownErrorCount: number; + /** + * 号码拉入黑名单统计。 + */ + BlackListCount: number; + /** + * 运营商频率限制统计。 + */ + FrequencyLimitCount: number; +} +/** + * 号码信息。 + */ +export interface PhoneNumberInfo { + /** + * 号码信息查询错误码,查询成功返回 "Ok"。 + */ + Code: string; + /** + * 号码信息查询错误码描述。 + */ + Message: string; + /** + * 国家(或地区)码。 + */ + NationCode: string; + /** + * 用户号码,去除国家或地区码前缀的普通格式,示例如:13711112222。 + */ + SubscriberNumber: string; + /** + * 解析后的规范的 E.164 号码,与下发短信的号码解析结果一致。解析失败时会原样返回。 + */ + PhoneNumber: string; + /** + * 国家码或地区码,例如 CN、US 等,对于未识别出国家码或者地区码,默认返回 DEF。 + */ + IsoCode: string; + /** + * 国家码或地区名,例如 China,可参考 [国际/港澳台短信价格总览](https://cloud.tencent.com/document/product/382/18051#.E6.97.A5.E7.BB.93.E5.90.8E.E4.BB.98.E8.B4.B9.3Ca-id.3D.22post-payment.22.3E.3C.2Fa.3E) + */ + IsoName: string; +} +/** + * SendStatusStatistics请求参数结构体 + */ +export interface SendStatusStatisticsRequest { + /** + * 起始时间,格式为yyyymmddhh,精确到小时,例如2021050113,表示2021年5月1号13时。 + */ + BeginTime: string; + /** + * 结束时间,格式为yyyymmddhh,精确到小时,例如2021050118,表示2021年5月1号18时。 + 注:EndTime 必须大于 BeginTime。 + */ + EndTime: string; + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string; + /** + * 最大上限。 + 注:目前固定设置为0。 + */ + Limit: number; + /** + * 偏移量。 + 注:目前固定设置为0。 + */ + Offset: number; +} +/** + * DeleteSmsTemplate请求参数结构体 + */ +export interface DeleteSmsTemplateRequest { + /** + * 待删除的模板 ID。 + */ + TemplateId: number; +} +/** + * PullSmsReplyStatusByPhoneNumber返回参数结构体 + */ +export interface PullSmsReplyStatusByPhoneNumberResponse { + /** + * 回复状态响应集合。 + */ + PullSmsReplyStatusSet?: Array; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * 发送短信状态 + */ +export interface SendStatus { + /** + * 发送流水号。 + */ + SerialNo: string; + /** + * 手机号码,E.164标准,+[国家或地区码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string; + /** + * 计费条数,计费规则请查询 [计费策略](https://cloud.tencent.com/document/product/382/36135)。 + */ + Fee: number; + /** + * 用户 session 内容。 + */ + SessionContext: string; + /** + * 短信请求错误码,具体含义请参考 [错误码](https://cloud.tencent.com/document/api/382/55981#6.-.E9.94.99.E8.AF.AF.E7.A0.81),发送成功返回 "Ok"。 + */ + Code: string; + /** + * 短信请求错误码描述。 + */ + Message: string; + /** + * 国家码或地区码,例如 CN、US 等,对于未识别出国家码或者地区码,默认返回 DEF,具体支持列表请参考 [国际/港澳台短信价格总览](https://cloud.tencent.com/document/product/382/18051)。 + */ + IsoCode: string; +} +/** + * DeleteSmsSign返回参数结构体 + */ +export interface DeleteSmsSignResponse { + /** + * 删除签名响应 + */ + DeleteSignStatus?: DeleteSignStatus; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * AddSmsSign返回参数结构体 + */ +export interface AddSmsSignResponse { + /** + * 添加签名响应 + */ + AddSignStatus?: AddSignStatus; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * DeleteSmsSign请求参数结构体 + */ +export interface DeleteSmsSignRequest { + /** + * 待删除的签名 ID。 + */ + SignId: number; +} +/** + * PullSmsReplyStatusByPhoneNumber请求参数结构体 + */ +export interface PullSmsReplyStatusByPhoneNumberRequest { + /** + * 拉取起始时间,UNIX 时间戳(时间:秒)。 + 注:最大可拉取当前时期前7天的数据。 + */ + BeginTime: number; + /** + * 偏移量。 + 注:目前固定设置为0。 + */ + Offset: number; + /** + * 拉取最大条数,最多 100。 + */ + Limit: number; + /** + * 下发目的手机号码,依据 E.164 标准为:+[国家(或地区)码][手机号] ,示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号。 + */ + PhoneNumber: string; + /** + * 短信 SdkAppId 在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string; + /** + * 拉取截止时间,UNIX 时间戳(时间:秒)。 + */ + EndTime?: number; +} +/** + * ModifySmsSign返回参数结构体 + */ +export interface ModifySmsSignResponse { + /** + * 修改签名响应 + */ + ModifySignStatus?: ModifySignStatus; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * ReportConversion请求参数结构体 + */ +export interface ReportConversionRequest { + /** + * 短信应用ID。在 [短信控制台](https://console.cloud.tencent.com/smsv2/app-manage) 添加应用后生成的实际 SdkAppId,示例如1400006666。 + */ + SmsSdkAppId: string; + /** + * 发送短信返回的流水号。 + */ + SerialNo: string; + /** + * 用户回填时间,UNIX 时间戳(单位:秒)。 + */ + ConversionTime?: number; +} +/** + * 添加签名响应 + */ +export interface AddSignStatus { + /** + * 签名ID。 + */ + SignId: number; +} +/** + * 修改模板参数响应 + */ +export interface ModifyTemplateStatus { + /** + * 模板ID。 + */ + TemplateId: number; +} +/** + * PullSmsSendStatus返回参数结构体 + */ +export interface PullSmsSendStatusResponse { + /** + * 下发状态响应集合。 + */ + PullSmsSendStatusSet?: Array; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * SmsPackagesStatistics返回参数结构体 + */ +export interface SmsPackagesStatisticsResponse { + /** + * 发送数据统计响应包体。 + */ + SmsPackagesStatisticsSet?: Array; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} +/** + * 删除签名响应 + */ +export interface DeleteSignStatus { + /** + * 删除状态信息。 + 注意:此字段可能返回 null,表示取不到有效值。 + */ + DeleteStatus: string; + /** + * 删除时间,UNIX 时间戳(单位:秒)。 + 注意:此字段可能返回 null,表示取不到有效值。 + */ + DeleteTime: number; +} +/** + * PullSmsReplyStatus返回参数结构体 + */ +export interface PullSmsReplyStatusResponse { + /** + * 回复状态响应集合。 + */ + PullSmsReplyStatusSet?: Array; + /** + * 唯一请求 ID,由服务端生成,每次请求都会返回(若请求因其他原因未能抵达服务端,则该次请求不会获得 RequestId)。定位问题时需要提供该次请求的 RequestId。 + */ + RequestId?: string; +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_models.js b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_models.js new file mode 100644 index 0000000..0f824c4 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tencentcloud/services/sms/v20210111/sms_models.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * Copyright (c) 2018 THL A29 Limited, a Tencent company. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/tsconfig.json b/node/node_modules/tencentcloud-sdk-nodejs-sms/tsconfig.json new file mode 100644 index 0000000..d1d460c --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + // "incremental": true, /* 增量编译 提高编译速度*/ + "target": "ES2019" /* 编译目标ES版本*/, + "module": "commonjs" /* 编译目标模块系统*/, + // "lib": [], /* 编译过程中需要引入的库文件列表*/ + "declaration": true /* 编译时创建声明文件 */, + "outDir": "tencentcloud" /* ts编译输出目录 */, + "rootDir": "src" /* ts编译根目录. */, + "importHelpers": true /* 从tslib导入辅助工具函数(如__importDefault)*/, + "strict": true /* 严格模式开关 等价于noImplicitAny、strictNullChecks、strictFunctionTypes、strictBindCallApply等设置true */, + "strictNullChecks": false, + "noUnusedLocals": false /* 未使用局部变量报错*/, + "noUnusedParameters": false /* 未使用参数报错*/, + "noImplicitReturns": true /* 有代码路径没有返回值时报错*/, + "noFallthroughCasesInSwitch": true /* 不允许switch的case语句贯穿*/, + "moduleResolution": "node" /* 模块解析策略 */, + "typeRoots": [ + /* 要包含的类型声明文件路径列表*/ + "./typings", + "./node_modules/@types" + ], + "allowSyntheticDefaultImports": true /* 允许从没有设置默认导出的模块中默认导入,仅用于提示,不影响编译结果*/, + "esModuleInterop": false /* 允许编译生成文件时,在代码中注入工具类(__importDefault、__importStar)对ESM与commonjs混用情况做兼容处理*/, + "sourceMap": false + }, + "include": [ + /* 需要编译的文件 */ + "src/**/*.ts", + "typings/**/*.ts" + ], + "exclude": [] +} diff --git a/node/node_modules/tencentcloud-sdk-nodejs-sms/typings/index.d.ts b/node/node_modules/tencentcloud-sdk-nodejs-sms/typings/index.d.ts new file mode 100644 index 0000000..1c87af3 --- /dev/null +++ b/node/node_modules/tencentcloud-sdk-nodejs-sms/typings/index.d.ts @@ -0,0 +1,2 @@ +declare module "get-stream" +declare module "is-stream" \ No newline at end of file diff --git a/node/node_modules/tslib/CopyrightNotice.txt b/node/node_modules/tslib/CopyrightNotice.txt new file mode 100644 index 0000000..2e4a05c --- /dev/null +++ b/node/node_modules/tslib/CopyrightNotice.txt @@ -0,0 +1,15 @@ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + diff --git a/node/node_modules/tslib/LICENSE.txt b/node/node_modules/tslib/LICENSE.txt new file mode 100644 index 0000000..fa7d1bd --- /dev/null +++ b/node/node_modules/tslib/LICENSE.txt @@ -0,0 +1,12 @@ +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/node/node_modules/tslib/README.md b/node/node_modules/tslib/README.md new file mode 100644 index 0000000..a3911fb --- /dev/null +++ b/node/node_modules/tslib/README.md @@ -0,0 +1,142 @@ +# tslib + +This is a runtime library for [TypeScript](http://www.typescriptlang.org/) that contains all of the TypeScript helper functions. + +This library is primarily used by the `--importHelpers` flag in TypeScript. +When using `--importHelpers`, a module that uses helper functions like `__extends` and `__assign` in the following emitted file: + +```ts +var __assign = (this && this.__assign) || Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; +}; +exports.x = {}; +exports.y = __assign({}, exports.x); + +``` + +will instead be emitted as something like the following: + +```ts +var tslib_1 = require("tslib"); +exports.x = {}; +exports.y = tslib_1.__assign({}, exports.x); +``` + +Because this can avoid duplicate declarations of things like `__extends`, `__assign`, etc., this means delivering users smaller files on average, as well as less runtime overhead. +For optimized bundles with TypeScript, you should absolutely consider using `tslib` and `--importHelpers`. + +# Installing + +For the latest stable version, run: + +## npm + +```sh +# TypeScript 2.3.3 or later +npm install --save tslib + +# TypeScript 2.3.2 or earlier +npm install --save tslib@1.6.1 +``` + +## yarn + +```sh +# TypeScript 2.3.3 or later +yarn add tslib + +# TypeScript 2.3.2 or earlier +yarn add tslib@1.6.1 +``` + +## bower + +```sh +# TypeScript 2.3.3 or later +bower install tslib + +# TypeScript 2.3.2 or earlier +bower install tslib@1.6.1 +``` + +## JSPM + +```sh +# TypeScript 2.3.3 or later +jspm install tslib + +# TypeScript 2.3.2 or earlier +jspm install tslib@1.6.1 +``` + +# Usage + +Set the `importHelpers` compiler option on the command line: + +``` +tsc --importHelpers file.ts +``` + +or in your tsconfig.json: + +```json +{ + "compilerOptions": { + "importHelpers": true + } +} +``` + +#### For bower and JSPM users + +You will need to add a `paths` mapping for `tslib`, e.g. For Bower users: + +```json +{ + "compilerOptions": { + "module": "amd", + "importHelpers": true, + "baseUrl": "./", + "paths": { + "tslib" : ["bower_components/tslib/tslib.d.ts"] + } + } +} +``` + +For JSPM users: + +```json +{ + "compilerOptions": { + "module": "system", + "importHelpers": true, + "baseUrl": "./", + "paths": { + "tslib" : ["jspm_packages/npm/tslib@1.13.0/tslib.d.ts"] + } + } +} +``` + + +# Contribute + +There are many ways to [contribute](https://github.com/Microsoft/TypeScript/blob/master/CONTRIBUTING.md) to TypeScript. + +* [Submit bugs](https://github.com/Microsoft/TypeScript/issues) and help us verify fixes as they are checked in. +* Review the [source code changes](https://github.com/Microsoft/TypeScript/pulls). +* Engage with other TypeScript users and developers on [StackOverflow](http://stackoverflow.com/questions/tagged/typescript). +* Join the [#typescript](http://twitter.com/#!/search/realtime/%23typescript) discussion on Twitter. +* [Contribute bug fixes](https://github.com/Microsoft/TypeScript/blob/master/CONTRIBUTING.md). + +# Documentation + +* [Quick tutorial](http://www.typescriptlang.org/Tutorial) +* [Programming handbook](http://www.typescriptlang.org/Handbook) +* [Homepage](http://www.typescriptlang.org/) diff --git a/node/node_modules/tslib/package.json b/node/node_modules/tslib/package.json new file mode 100644 index 0000000..72a6455 --- /dev/null +++ b/node/node_modules/tslib/package.json @@ -0,0 +1,29 @@ +{ + "name": "tslib", + "author": "Microsoft Corp.", + "homepage": "https://www.typescriptlang.org/", + "version": "1.13.0", + "license": "0BSD", + "description": "Runtime library for TypeScript helper functions", + "keywords": [ + "TypeScript", + "Microsoft", + "compiler", + "language", + "javascript", + "tslib", + "runtime" + ], + "bugs": { + "url": "https://github.com/Microsoft/TypeScript/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/Microsoft/tslib.git" + }, + "main": "tslib.js", + "module": "tslib.es6.js", + "jsnext:main": "tslib.es6.js", + "typings": "tslib.d.ts", + "sideEffects": false +} diff --git a/node/node_modules/tslib/tslib.d.ts b/node/node_modules/tslib/tslib.d.ts new file mode 100644 index 0000000..4d7f724 --- /dev/null +++ b/node/node_modules/tslib/tslib.d.ts @@ -0,0 +1,37 @@ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +export declare function __extends(d: Function, b: Function): void; +export declare function __assign(t: any, ...sources: any[]): any; +export declare function __rest(t: any, propertyNames: (string | symbol)[]): any; +export declare function __decorate(decorators: Function[], target: any, key?: string | symbol, desc?: any): any; +export declare function __param(paramIndex: number, decorator: Function): Function; +export declare function __metadata(metadataKey: any, metadataValue: any): Function; +export declare function __awaiter(thisArg: any, _arguments: any, P: Function, generator: Function): any; +export declare function __generator(thisArg: any, body: Function): any; +export declare function __exportStar(m: any, exports: any): void; +export declare function __values(o: any): any; +export declare function __read(o: any, n?: number): any[]; +export declare function __spread(...args: any[][]): any[]; +export declare function __spreadArrays(...args: any[][]): any[]; +export declare function __await(v: any): any; +export declare function __asyncGenerator(thisArg: any, _arguments: any, generator: Function): any; +export declare function __asyncDelegator(o: any): any; +export declare function __asyncValues(o: any): any; +export declare function __makeTemplateObject(cooked: string[], raw: string[]): TemplateStringsArray; +export declare function __importStar(mod: T): T; +export declare function __importDefault(mod: T): T | { default: T }; +export declare function __classPrivateFieldGet(receiver: T, privateMap: { has(o: T): boolean, get(o: T): V | undefined }): V; +export declare function __classPrivateFieldSet(receiver: T, privateMap: { has(o: T): boolean, set(o: T, value: V): any }, value: V): V; +export declare function __createBinding(object: object, target: object, key: PropertyKey, objectKey?: PropertyKey): void; \ No newline at end of file diff --git a/node/node_modules/tslib/tslib.es6.html b/node/node_modules/tslib/tslib.es6.html new file mode 100644 index 0000000..b122e41 --- /dev/null +++ b/node/node_modules/tslib/tslib.es6.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node/node_modules/tslib/tslib.es6.js b/node/node_modules/tslib/tslib.es6.js new file mode 100644 index 0000000..7fdec02 --- /dev/null +++ b/node/node_modules/tslib/tslib.es6.js @@ -0,0 +1,218 @@ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +export function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +export var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + } + return __assign.apply(this, arguments); +} + +export function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +} + +export function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +export function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +} + +export function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); +} + +export function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +export function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +export function __createBinding(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +} + +export function __exportStar(m, exports) { + for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) exports[p] = m[p]; +} + +export function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +} + +export function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +} + +export function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; +} + +export function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; +}; + +export function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} + +export function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +} + +export function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } +} + +export function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +} + +export function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; + +export function __importStar(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result.default = mod; + return result; +} + +export function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; +} + +export function __classPrivateFieldGet(receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +} + +export function __classPrivateFieldSet(receiver, privateMap, value) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to set private field on non-instance"); + } + privateMap.set(receiver, value); + return value; +} diff --git a/node/node_modules/tslib/tslib.html b/node/node_modules/tslib/tslib.html new file mode 100644 index 0000000..44c9ba5 --- /dev/null +++ b/node/node_modules/tslib/tslib.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/node/node_modules/tslib/tslib.js b/node/node_modules/tslib/tslib.js new file mode 100644 index 0000000..fbce018 --- /dev/null +++ b/node/node_modules/tslib/tslib.js @@ -0,0 +1,284 @@ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +/* global global, define, System, Reflect, Promise */ +var __extends; +var __assign; +var __rest; +var __decorate; +var __param; +var __metadata; +var __awaiter; +var __generator; +var __exportStar; +var __values; +var __read; +var __spread; +var __spreadArrays; +var __await; +var __asyncGenerator; +var __asyncDelegator; +var __asyncValues; +var __makeTemplateObject; +var __importStar; +var __importDefault; +var __classPrivateFieldGet; +var __classPrivateFieldSet; +var __createBinding; +(function (factory) { + var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {}; + if (typeof define === "function" && define.amd) { + define("tslib", ["exports"], function (exports) { factory(createExporter(root, createExporter(exports))); }); + } + else if (typeof module === "object" && typeof module.exports === "object") { + factory(createExporter(root, createExporter(module.exports))); + } + else { + factory(createExporter(root)); + } + function createExporter(exports, previous) { + if (exports !== root) { + if (typeof Object.create === "function") { + Object.defineProperty(exports, "__esModule", { value: true }); + } + else { + exports.__esModule = true; + } + } + return function (id, v) { return exports[id] = previous ? previous(id, v) : v; }; + } +}) +(function (exporter) { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + + __extends = function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; + + __assign = Object.assign || function (t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + + __rest = function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + }; + + __decorate = function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + + __param = function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } + }; + + __metadata = function (metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); + }; + + __awaiter = function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + + __generator = function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } + }; + + __createBinding = function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }; + + __exportStar = function (m, exports) { + for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) exports[p] = m[p]; + }; + + __values = function (o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); + }; + + __read = function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; + }; + + __spread = function () { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; + }; + + __spreadArrays = function () { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + }; + + __await = function (v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); + }; + + __asyncGenerator = function (thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } + }; + + __asyncDelegator = function (o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } + }; + + __asyncValues = function (o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } + }; + + __makeTemplateObject = function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; + }; + + __importStar = function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; + }; + + __importDefault = function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; + }; + + __classPrivateFieldGet = function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); + }; + + __classPrivateFieldSet = function (receiver, privateMap, value) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to set private field on non-instance"); + } + privateMap.set(receiver, value); + return value; + }; + + exporter("__extends", __extends); + exporter("__assign", __assign); + exporter("__rest", __rest); + exporter("__decorate", __decorate); + exporter("__param", __param); + exporter("__metadata", __metadata); + exporter("__awaiter", __awaiter); + exporter("__generator", __generator); + exporter("__exportStar", __exportStar); + exporter("__createBinding", __createBinding); + exporter("__values", __values); + exporter("__read", __read); + exporter("__spread", __spread); + exporter("__spreadArrays", __spreadArrays); + exporter("__await", __await); + exporter("__asyncGenerator", __asyncGenerator); + exporter("__asyncDelegator", __asyncDelegator); + exporter("__asyncValues", __asyncValues); + exporter("__makeTemplateObject", __makeTemplateObject); + exporter("__importStar", __importStar); + exporter("__importDefault", __importDefault); + exporter("__classPrivateFieldGet", __classPrivateFieldGet); + exporter("__classPrivateFieldSet", __classPrivateFieldSet); +}); diff --git a/node/package-lock.json b/node/package-lock.json index 804ae3b..90004a3 100644 --- a/node/package-lock.json +++ b/node/package-lock.json @@ -20,7 +20,8 @@ "morgan": "~1.9.1", "multer": "^1.4.5-lts.1", "multiparty": "^4.2.3", - "path": "^0.12.7" + "path": "^0.12.7", + "tencentcloud-sdk-nodejs-sms": "^4.0.810" } }, "node_modules/@mongodb-js/saslprep": { @@ -75,6 +76,38 @@ "acorn": "^2.1.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/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/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/align-text": { "version": "0.1.4", "resolved": "https://registry.npmmirror.com/align-text/-/align-text-0.1.4.tgz", @@ -111,6 +144,11 @@ "resolved": "https://registry.npmmirror.com/asap/-/asap-1.0.0.tgz", "integrity": "sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/basic-auth/-/basic-auth-2.0.1.tgz", @@ -122,6 +160,14 @@ "node": ">= 0.8" } }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, "node_modules/body-parser": { "version": "1.18.3", "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.18.3.tgz", @@ -240,6 +286,17 @@ "wordwrap": "0.0.2" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "2.6.0", "resolved": "https://registry.npmmirror.com/commander/-/commander-2.6.0.tgz", @@ -364,6 +421,14 @@ "node": ">=0.10.0" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", @@ -476,6 +541,19 @@ "node": ">= 0.8" } }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", @@ -492,6 +570,14 @@ "node": ">= 0.6" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + } + }, "node_modules/graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz", @@ -511,6 +597,39 @@ "node": ">= 0.6" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/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/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.23.tgz", @@ -545,6 +664,14 @@ "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", @@ -571,6 +698,14 @@ "jade": "bin/jade.js" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/jsonwebtoken": { "version": "9.0.2", "resolved": "https://registry.npmmirror.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", @@ -1005,6 +1140,44 @@ "node": ">= 0.6" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", @@ -1288,6 +1461,34 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/tencentcloud-sdk-nodejs-common": { + "version": "4.0.813", + "resolved": "https://registry.npmmirror.com/tencentcloud-sdk-nodejs-common/-/tencentcloud-sdk-nodejs-common-4.0.813.tgz", + "integrity": "sha512-eSzYb4ntXNpzUkevy9bEk994NrM3o6OXNOlBFi2nhrxOV3NE0WrcUe/PgGp9+DNocuohsMgn3sX57cPwr1iMeQ==", + "dependencies": { + "form-data": "^3.0.0", + "get-stream": "^6.0.0", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "json-bigint": "^1.0.0", + "node-fetch": "^2.2.0", + "tslib": "1.13.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tencentcloud-sdk-nodejs-sms": { + "version": "4.0.810", + "resolved": "https://registry.npmmirror.com/tencentcloud-sdk-nodejs-sms/-/tencentcloud-sdk-nodejs-sms-4.0.810.tgz", + "integrity": "sha512-vFmqR/KZJdH+FG1Oh5mlU1gDfkJQ0sf1YEQLyuUwuci+eBFtnuuHqyScdk6ftaRiQDP6j2RLaFW+kQKprRc4WQ==", + "dependencies": { + "tencentcloud-sdk-nodejs-common": "^4.0.488" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "license": "MIT", @@ -1356,6 +1557,11 @@ "node": ">=0.4.0" } }, + "node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", diff --git a/node/package.json b/node/package.json index cc3110f..f852da1 100644 --- a/node/package.json +++ b/node/package.json @@ -18,6 +18,7 @@ "morgan": "~1.9.1", "multer": "^1.4.5-lts.1", "multiparty": "^4.2.3", - "path": "^0.12.7" + "path": "^0.12.7", + "tencentcloud-sdk-nodejs-sms": "^4.0.810" } } diff --git a/node/routes/llf_api.js b/node/routes/llf_api.js index 9ebeecf..175e4b7 100644 --- a/node/routes/llf_api.js +++ b/node/routes/llf_api.js @@ -1,7 +1,7 @@ var express = require('express'); var router = express.Router(); var jwt = require('jsonwebtoken') - +const tencentcloud = require("tencentcloud-sdk-nodejs-sms"); let { LoginModel, RefreshToken, CleanModel, StewardModel } = require('../model/module/llf_db') @@ -45,6 +45,80 @@ router.post('/login', async (req, res) => { } }); + + + +// 获取验证码 +router.post('/verification-code-login', async (req, res, next) => { + const { phone_number } = req.body + console.log(phone_number); + // 随机生成的六位验证码 生成0~999999的随机整数 + let randomNum = Math.floor(Math.random() * 1000000); + // 将结果转换成字符串,并在前面补0,直到达到六位 + let result = String(randomNum).padStart(6, '0'); + + + const tencentcloud = require("tencentcloud-sdk-nodejs-sms"); + const SmsClient = tencentcloud.sms.v20210111.Client; + // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 + // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 + // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + const clientConfig = { + credential: { + secretId: "AKIDSsMkZOCXt9D9yeAaw9C6tY7ayPhomdNz", + secretKey: "Y0KUYUL4jFiGh6gFg1MpKpQ2gLxX2kEl", + }, + region: "ap-beijing", + profile: { + httpProfile: { + endpoint: "sms.tencentcloudapi.com", + }, + }, + }; + // 实例化要请求产品的client对象,clientProfile是可选的 + const client = new SmsClient(clientConfig); + const params = { + "PhoneNumberSet": ["+86" + phone_number], + "SmsSdkAppId": "1400859378", + "SignName": "拙劣的模仿者公众号", + "TemplateId": "1944720", + "TemplateParamSet": [result.toString()] + }; + client.SendSms(params).then( + (data) => { + res.send({ code: 200, msg: "验证码发送成功", verification_code: result.toString(), data }) + }, + (err) => { + console.error("error", err); + } + ); +}); + + +//注册 +router.post('/register', async (req, res) => { + console.log(req.body); + const { username, phone_number, verification, password, verification_code ,userImg} = req.body; + // 检查验证码是否正确 + if (verification !== verification_code) { + return res.send({ code: 400, msg: "验证码错误" }); + } + // 检查手机号是否已被注册 + const user = await LoginModel.findOne({ phone: phone_number }); + if (user) { + return res.send({ code: 400, msg: "该手机号已被注册" }); + } + // 创建新用户 + const data = await LoginModel.create({ username: username, phone: phone_number, password: password ,userImg: userImg}); + + // 创建新用户 + res.send({ code: 200, msg: "注册成功",data }); + +}) + + + + router.post('/refresh', async (req, res) => { const { refreshToken } = req.body; @@ -109,6 +183,7 @@ const authenticate = (req, res, next) => { // 新增检查token剩余有效期的接口 router.get('/check-token-expiry', authenticate, (req, res) => { const token = req.headers.authorization.split(' ')[1]; + console.log(token); try { const decodedToken = jwt.decode(token, { complete: true }); const now = Math.floor(Date.now() / 1000); @@ -141,7 +216,7 @@ router.get("/protectedData", (req, res) => { router.get('/cleanList', async (req, res) => { const data = await CleanModel.find() - + console.log(data); res.send({ code: 200, returncode: 0, @@ -151,8 +226,9 @@ router.get('/cleanList', async (req, res) => { router.get('/cleanDetail', async (req, res) => { const id = req.query.id + console.log(id); const data = await CleanModel.findById({ _id: id }) - + console.log(data); res.send({ code: 200, returncode: 0, @@ -162,7 +238,7 @@ router.get('/cleanDetail', async (req, res) => { router.get('/getStewart', async (req, res) => { const data = await StewardModel.find() - + console.log(data); res.send({ code: 200, returncode: 0, @@ -174,7 +250,7 @@ router.get('/stewartDetail', async (req, res) => { const id = req.query.id console.log(id); const data = await StewardModel.findById({ _id: id }) - + console.log(data); res.send({ code: 200, returncode: 0, @@ -185,7 +261,7 @@ router.get('/stewartDetail', async (req, res) => { router.get('/stewartlist', async (req, res) => { const data = await StewardModel.find({ StewardType: 3 }) - + console.log(data); res.send({ code: 200, returncode: 0, diff --git a/vite-project/components.d.ts b/vite-project/components.d.ts index 930eb77..9fb0bc7 100644 --- a/vite-project/components.d.ts +++ b/vite-project/components.d.ts @@ -10,22 +10,18 @@ declare module 'vue' { RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] VanButton: typeof import('vant/es')['Button'] - VanCell: typeof import('vant/es')['Cell'] VanCellGroup: typeof import('vant/es')['CellGroup'] - VanConfigProvider: typeof import('vant/es')['ConfigProvider'] - VanCouponCell: typeof import('vant/es')['CouponCell'] - VanCouponList: typeof import('vant/es')['CouponList'] + VanCheckbox: typeof import('vant/es')['Checkbox'] VanField: typeof import('vant/es')['Field'] VanForm: typeof import('vant/es')['Form'] + VanGrid: typeof import('vant/es')['Grid'] + VanGridItem: typeof import('vant/es')['GridItem'] VanIcon: typeof import('vant/es')['Icon'] - VanImage: typeof import('vant/es')['Image'] - VanList: typeof import('vant/es')['List'] VanNavBar: typeof import('vant/es')['NavBar'] - VanPopover: typeof import('vant/es')['Popover'] VanPopup: typeof import('vant/es')['Popup'] VanRadio: typeof import('vant/es')['Radio'] VanRadioGroup: typeof import('vant/es')['RadioGroup'] - VanShareSheet: typeof import('vant/es')['ShareSheet'] + VanSearch: typeof import('vant/es')['Search'] VanSticky: typeof import('vant/es')['Sticky'] VanSwipe: typeof import('vant/es')['Swipe'] VanSwipeItem: typeof import('vant/es')['SwipeItem'] @@ -34,6 +30,5 @@ declare module 'vue' { VanTabbarItem: typeof import('vant/es')['TabbarItem'] VanTabs: typeof import('vant/es')['Tabs'] VanTag: typeof import('vant/es')['Tag'] - VanWatermark: typeof import('vant/es')['Watermark'] } } diff --git a/vite-project/package-lock.json b/vite-project/package-lock.json index 11aea75..2432a75 100644 --- a/vite-project/package-lock.json +++ b/vite-project/package-lock.json @@ -8,6 +8,7 @@ "name": "vite-project", "version": "0.0.0", "dependencies": { + "@vant/area-data": "^1.5.1", "axios": "^1.6.7", "dplayer": "^1.27.1", "hls.js": "^1.5.7", @@ -623,6 +624,11 @@ "dev": true, "license": "ISC" }, + "node_modules/@vant/area-data": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/@vant/area-data/-/area-data-1.5.1.tgz", + "integrity": "sha512-gR5TPEzTbxN1cTK1aDhCoyikSCLX7DAacxyXoKyI4SAsYYTZrDl/nLgQFIm9vLsvWzlPIda8xV8/U3x7M9k6ww==" + }, "node_modules/@vant/auto-import-resolver": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/@vant/auto-import-resolver/-/auto-import-resolver-1.0.2.tgz", diff --git a/vite-project/package.json b/vite-project/package.json index 4916551..496c586 100644 --- a/vite-project/package.json +++ b/vite-project/package.json @@ -12,6 +12,7 @@ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore" }, "dependencies": { + "@vant/area-data": "^1.5.1", "axios": "^1.6.7", "dplayer": "^1.27.1", "hls.js": "^1.5.7", diff --git a/vite-project/public/login.png b/vite-project/public/login.png new file mode 100644 index 0000000000000000000000000000000000000000..6be8e51bbd0c7ad2938d3f5630600ded7fdc1eed GIT binary patch literal 800621 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�TG2qI)_5H=))2{}4 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ú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≷ow5DGk^k*O5AU~&$<_rR7<&_l+)UX$YL?~Y|JQ5lInicB8x+y& zstl`FKIxzVQLhuo+66lub@xh{9>W=pQE#kXPT9$U;Cc}Fr| zvKhn3jlo6)1y~$_aYPgZlNgjiL@EprxM`SUWkH(##pRdZcJtYP{QJN2zx(LV-V9te zTg(=f&FiQQRY6;Ksex1hg;_Y5OO>KjQ-XIVQcg*{h2nyoo#6%pl$b~sEyn<%(MxUo z%)^g7@Qv@jI_JsOMbtY@R8}~R+(5x94^61z(c*Bv;N%+q>db^(eV}(XLqVI)Gv0G)MJ1Au?13`p` zpw>5Br~g7gC%sk^os$zNWrDA(YBU0N48Ct`2uBzI$? zT!1N;w_I5u&e(FGD)fE1u7L+))w6MI>FnGw_(4pa4;-AOY&_^d0>(< zY^JJ_!0*2I-M{{8AC2DZUfm56xDt5Ez-~=!o3?39iMXn&x*ku)Q;pim{obL9I<}Wb zap+;-C?<_efMjkCC#I-TM9!Z(f5+{&-+ssKXU?7jS50eeV;vzR$GP!%T2(bM1rY%I z*LH8YaMM5ilRvxTmb+S;!vyT@yshin%?}O^+BUX}_VD0fKA)TBPz`fK$>*KCepfvq zR!8t;8ApS|1`_F1rh?N^%(3!}HqC++qUa7z*tSf}?js%0y@Y!XE=qY|he5CzgLA%` z0ob1IoIiWc+(gJrI)NN5vsseoCrWujQ?;zLr%1m1`;=A;s{rYBR^}+(ZOPVW%ubP zpZMGtzPP)$|D!c#tTsOM7z}U&IU6csxM|z6`qeA1Ts*V&v0wkS`|i8%ZFk%>Ie%`^ zHZCw?1zd_ok0cc4a4 zwJLCgix;cfF^)vn!wt)a^%l7GfyKuh*KG_mV1Z@QbMEX-H{JY}x4h-9x4-R{ zn=g*X)na}$o6lU$&0z>Erme?jF*}4i8ClatUEKdO@B90I@b>^*JGkP`)hHYs9E?Vz zo6cVtjcQ`FZF_WdxM&yVE{SwAjCE55<-AG0Vex03e{AF^>*{mfe@bfb4cGPSe(j%T z)45ABX!YSbaoDXBTRAHG$PpZ_=D9c;$jI2-JVYL%JG4aAGp7p9 zy?J+-(6wU-4p-BZFm%aMu>`@hM-3C1`-?BV3;^KdTbwfW6=qj5)q+r}12T~(3hdUI z%DXagqCHy5rF)#jI4kvaE{NaA#^Tg691bHB zasYve&_LbgrNe`Je)|4j{P0I^y>zMO(TIXZt69jL9qeF(I2h%tCxGMRU{jd1+>!=E zZ8{sFx@P$F7ry-Li@WvoB8^xzEGT*lcXb!AQYvEDNwI;v9%{+Mb~63-vv~LozJYdE zw8@R_RVM1%Td>TlJ3WhMb@4md*lw>U%ba9g@1HFraaU# z>n1nllo-^Fh|L**3tK8s!Q`H*x2hbvuFe6$~l)j@s3+K|wSihIoOtNT}N_XZ|;5k|Ta&_W?YCX(G-(Sef)$-a)C&LEaGwjH5eOW`p#3ZYeihs{b`){7d+Kh20f@>g3Rz zMmMQmDG6jsULnj?H5%15Glx)}J#+4DcfI}XZ@>G(g_{5@n#RmE#2#VL z$AOfjzc3H#vMHB4bnDZJEF5lzera~8GxCA%Ah6JEHhcM{m `a%%LPpNpn)(PHCn2ii;h}CFtGR<@Vvs~gtN6JVhDxETS$ zJQ8M_B>AH@V4gh*Ryo>J{OfMgvLhi-@lEOwn*0}(6 za=?r&l{sZN0C5;e1(y_00d;tAwqRmyZ7rIs6K{UuJ@5F#-}}42{;s!GKojR^nJ8A` z0!Ayfs1a(4WTpgT1Xnh8kVGguE5Sjm%+VkLYF_6IrXq%jAj0*Y<8$Bo-d}$0>(5_3 zid*M-5>!Vf;|LfqZ<}TT0wSDDlk9V3IKJNbgzPocR|6wQS~<|D+%(@rW`LLFVw@X*1A4>bWGf%arc&6h>4?zXkH zHJOf8Q>rvB%jHOel1yUhlZ9CVt*AmPyrqK(X(ANkYv*~E>XR)`O6u8IKXSdcw(Ksy z)N{wo`cn@1DPh@hhrOAE_1aoDvDTG0&zT@nXSQv7=FHCRx8H8+an_`aAVOS*TPT~T zIeC?+s;YVye&|CaxJI?^Iq4P#5pcypsuT^NRPJlhEZW${*s8@4f)DuEkTNJ!Oi5qk*x*w%@B?-Nlhk2!aCG$I%P#>C z4&=in$L=oOEwl2#xfn$^&;^OQCpsaJTQ<0?OO=i6?fCKC*!L%$bbKo;&AUr?Z+Dur zhrDvx5ZO5aEPDHzr9pZUTQKYTSzCZXQ4acz-W zW_MSMgHE03iJy@EJ;U8$e#1TnYb8AX)Rn^MZ`pv)2z-y?vC2~NRHg~-f_LUb1cYaLA> z>P^sksWyGfMZgDoq!NRG0>E3-?@O;(ul4qr`K)EV|yBcJPkP8uzd{C`O0C}zs{j`5ZfJ$S`*|w7+s11+&t?~9_Zn`zwXgD%EV4)LqDQ6 z1Z8PJi1I=f_ww3QFPytD-P%%9LPBNP=1R#*p4|*G^P|DMMMt3p6b(RuJ3IxlYg)lc zJ{f(qM1CYDW~Lb9Y&Ksk8Z~d**fg!0ojtR2^G!ExO~!BqAQE!5U9gbA4W=4nRNLRX z`fDHg$Zve~H(JEjJjQ6|Ok9YaLG0%9`Mg;yVvJb_PT`4OXuCJP9M_@O>+IvUX?bJi zm^Jxx!X1t|a@j1hhJ#mWk$UYUeJ$Ia>q&8?$QNG&5!54#vuDqZMIZlh9 zasewrJDcB`@(J!9hz<@8u3WhSAW%SGId1q`)b{{&+Gn~{CpY>k86x5vpw8;Mri~S4 z?wGdz`%2&6s7#@ympayae#7;t|LQ|O-@f@O15c}Asv1Pbewv5tsJJsabZ%qCL@>~Gi`ku!vMUi~LxYrqQl(0BF{4ya!pRNf z&Q2;|Fu7JNQOGz31|mZ%&={>AUE}%HTW&i44?g~}-~Pq-TmT5x#+JiqTscb+snE<> z+?4?drY@-5C^!*QD!>9~gF#3l8!Ol<5+`$FiVLbHY*jsJfX_ejgTMUBL(lGAi`BMm zZ8hdIqIrz5^mj|dIZ<4W1=?gGNQfLOzc90RPL_kNrgeaL>ghkANbigg<+C5H!Kc3= z+biU{aphrs+dFGfhv8S=n+Tw&s;X4t0(+ynuU~n2vUHSCN5*aJ9TZ8NfAU@yT`$B0J)~G>N5hSd zLk(%5e~s5R?rS`7{e^xUt$T#*VO119;v_e=wzdE_^OOXgnX@&n%iLMs(u!rMvs?lw zYbnM5A)CdKfqG6e+BGf#tw^9fCHH7!yO_^4Mp!AfYzpG7t?jMpwj_v65F+Wa5`mIO zSH`1^tDzhAok=Y5sR2Pe;jjfr%opbDB*FUeTk2n5d@VRm3 zA9vzOd6iXU^1ht(FUECN@?$O)({G z>|1xw`N#4h1+gxp&%`E}_pV*La``dE)uHTlr zY5k|}0had;pR?=I*Dq^UIn{L@qyO$*pQeqqQk?_UpswrDXoO)WugarzJ~52Q#9&0s zt%2RiC05Ns2=$Z!`u<~&9qnH`T|d9^jS1v{n41u}JClGSSw+$YxcOmht{u$pzVAIh z|Nfu5bm@{vCBo)j0ql_E%Wn=g&Sc=oMLWF(iL--D;~Z3r%oQrN1bp?O?>_p&=j!dV zqv@H3MqrIZf?%oUMY6RM&^ZAwOT)gmX~S06N_zQ?(q?EoSh>j1rm%5){UXc9M);f067qm8Dhp)|=iStuh)T=kzC|{K!N|j>arXDonYW zCBunGJ?VK0r|1l_7BMJpWh)w#5kXecx5fMszE3+ zf{D5civmQ!U<84sIu<5T)Q#8*uWd!0NtGG#K-u8ccxNB-^~YZP>#sfX^1+t>BmFU#2TfL9zX-DByEqvc07`ZUcZUMFaN*); zTt|&=U7bq+88TD1O(YUH)y7=EW!C{^yq2K14v~k833FxBY<|uY z5E*m#bXoS7S1I3es)~XyyaV(oS0Q4iRA-4w#DZ%Z7xQ_H(ah3~+~MZ+s2YuHX5msQ z*b*5L92t2_5GQ*1)tBG*Gw=JIPyJ3r6Bn&BgaA{35_o53q~O{ZRTTh>bgzk`LsHLe zjsx4n-d+-@YkwUrVMqg~*glz%*0-^|69W?JC+gt1A}g2QYe`2d2V^$X7f4F?OZM_J zXU~qtV>dH6F%!rNzF+IIZVpp_yOm>duTh6vyaZD3?d|R#8~|V!a9O`OZeW)AMfvR3 zS3o?J*JbE8JTNWGi;Zn%P?UTIQhtx^KBM2yY?!Bt&@pvK- z%jqoE-#Ke%3DOvd%_Eo%FoV*(3Yf=6Z9ZQ-_3ekg|Jai!L992cWmg8EcxEKjW-g&> z7YzZGdlTd2?BwiCH=~{aGcyZ;8)5-js2r{U8Ci+TGG-Md1Hi0p0ShB0=ed)inSsdh z!ZrQe7r%1lNY9)*&$Vb9)S_nA!fEUb0C}=ndQKS7Pm6UiS2%6|dU*u06J*}N>IK$$ z*~W>pzWw^zx@x_~SC`aEUpn^KYi?FhU*F@c5c%LINfIYPr#xreL2PbBF3ReF!rV!V zR^V_qCMRNZck#dht(mjM;D+Xa=JUnT?wK+D&L=+pyC46+os1TGaI|1y)K$G`qNFO% z5;%Cu>cL#GIfzMF1rR4@NAT!?sZ%O?5eQO`O{0@bTZNrH(AOS)`ftAS%@=2TR8QM_ z+ByMf0p|c>0PFy&nvK8%+rUtB2eLrtA|Em?$Z#DXDyEw?tNkVpyT+^j+iDvvCIft$ z1Q`*TnZ{UbC&jgB4V?MGSGvK>)O0qV?;jj277J4)LJ$#V23Mg9RRAUL&|I#ylx%f3i%|oKJDm9M{O<4F zdFif$_5kKoaq+|;5n*B?Qq}o3=2MdC+q=B+HghzRtO)*?ujJ)~+^`*-P?! ziJ=alUcvnCD8Z)X90HhCjY(3@AqOcUfbHqDuB+HaDr#H*_N$AJOP$o~2Fuix!S!Gk zFf%|ezx;C39sn>HvS<3{up;V22$nfudOPH(>lCF7JE1bSuYI1>=*G3~H?L78Aqv{)dQ+Mx)Va+|@5%5hW=}0VpPFVyGjEL*WLm0oE2Fa*VsP*~1Th<dCR-r_3=-9;;y^yy7}C8HQlZVL?p~r z2o=~E3^Ji)cNZlis=%fV5T?@|f?KN=3Cvu}4EV~opM2<%?>025wzsqvPZ}dv27|L@ zLpdp!p+reJ5QwGRN$j4gM_H=mN!fFwAOHY;8ABstgYj_o4>dVD=Ie3oMlsbX4({aL z>Pg2*x?`@{k@4$boSn^Z?be+sBtudM850|+P%!IR7J$)QZ_0K1TcHh>&zM=Y*x4fE)rs;39QSHJ&*FF*9y?o3h9wItjTH};_90vJe0ii2$-y3X1+=+r#wy%le5;QpIL@H8YEtP6bZ-XROnaIFAy7_2Y`nI%t`IJum zBl`b$_hwJCB-ee|@0^oW)&1>vojV(5C3axAm=HG!q_{w!C`z&x(+=rD4~}qzJ@iDl3mJRvZeujPr+JdOg2Gi!qDb@m37?iAXrH+nmIbafnctZf}Xiiargs{jxJUqm^%~t z__c(dZ$>{MX^O_L-M~{crr(~S6a*OgjqBI*T?SHQlgz18X@O6oK9X+fNm}2OE*8n< zoj^qE=|;9p;Lgv-+B36$)d`E8IGWcoW&Och=hTi zdbVn#D>%~G@^oi^_lc*U{pnBr{0lFVDuCVmX24-Z}+WMS9!BkMe~um5zfSG{GYiETZm z9*v|M$U!hRcXDylY^+HPGjLifDhatrJ+hM#VC8F0=6aVb*|I7yh&fKs#IjCt5A&Abvozs#b%34tuDP$vQ22!q8IACy6i{dU0 zgF9DHkznF#`wn7mPJrL|qc4BvPyhU@uP*-L#_?F3IoFc zs+<6?03u4s2m&ZL6jTf!0YFu|t^;k)0=@Opdj@H~l`_)FVqGqDEfl!m#s{Y_19l}?e*7gT)+PM>(^g@?bX}2Z+BhCAmOAq z7m*+mJnQmJI1m`oS7&GSOn%|-{QM&q9ywXuC9p_Xo5aAf(zcDAYRs&55mctO&Tj)* zdpF8?z4szw_aYq%HgR_^>UMJ@Cl`l9VU3a#2f44%gz^tz1Y)}FmJRH!h zk>e4lCR9IG%a=2qgvb&$2_dN2E3du^fDn*qVbK$eU(jQs$-s+6VL2uA;*-H6(csNY z=D@+9n`Y!aRQj18v@29bP_CF-IcRecp3P<<1oo_DAs?PLGJ-Hg14XDA!#F}roDu3k z6;~}<(?}Mnp5MOt&ENXm=kG3KeCHW=Cvt)^$kMTpxj}$VO zgFpB~*REYtM*~*kI#hL4@9*uKyD>45lRFbDIh>T4R-HO?r6Lkli5=9&mcm|x`4_%( z>;Lod$|OCgsmwd`&6*yQ0bxu4eIV~Y!`3^gR7gsANLnC;$_KIDA;a9!BbHyOis9CzHO_!tg-7}X&6^(kz!eq{V8CW5Pv>;05W-sbM)tnA2X3-|XA z9=Up@Yg;oTD0&#pJt=0(#RLMwi|)U@Qh$qSgT=(SBgK_TUEOSC%2ABfbX&+{S>S%s z`pGQbTkBAIJk1<>cQdR?#}Mf;o;RQk39C+<3~pqh@|UO zRbz}@jA|+5OwN06Ztk{h+mqANJ157t@7y^#Jzd4l-9)&mDrR<9(`c?pF|6F-uBs5I z`t{de`^d*W@>4(cGmhx)$?_-0PEFx%rWCjdP3*cDwO1l0MBN`RJ>Z&5Kxqu2YoLX9 z6S{os%g3l?{U?XRECp(vu)z)}lc+0Gt!F)y&K^DiQ6>=T)d!IFFA9l1ten1B4uyJVoAMg#m3;)98-C z)@j!Wmdp6X-}}8+uHSs;XM%%yD59hT<}fmanP~_?;OZ8*it4vcj(3iBFFyWQy?+5X z)m0Pj$Q)`QaTuF`K#PODc>sRxKYad=Ui@}7I}G#v zj)F?fPU;~>GZ=FESx;=Dg9*;bi`G)^;{1WhF3P}3qgu{J@NjIkwquXC+T^{jKKKhC zqL{p8mk$|gO33~p-CJ=&9I;+h65r%3gkCbg5xG&1YKnO#6DOIEh(%jw?3(H7WVO2f zqc42;zy76P`uN4YB@B1((!8z&!csM}sAk^nG>y9wU@lC~Fd{@2iR>k$Jj0+&t}tSy zGeT`qcB-bXXHwl+uDKvn~t2?M<=*V700A)k=US-=WWwXIQQiwMWz0R15 zI)o+~-E-!9`m@srls7-mTd8-wtamS;?-spM287SB~CoGq8? z{;5y>?BVXE11E^SVv7gMJ>)++C;gEE~Oae0;t3M@aWJ1Pbv41&guGh7S`OyV$Sf}=y-16 z*~@VwIZ|98sY10}EK^7ssgkkO8dd0-^Lzl=`%okdlc{M^QWdp(Ida)B-`+A!>yy}n z%LLmDS9~3}yvrD7OdJNtT$@88FmWhTY+s8N;m5pPdsd} z-MV4M-)Zgc^V=z(54o4QWt!FtP6B8MNIgaig{jE{%pz2822qerqP^)E&w)l2h%IT$ zzQpnI*`3!v@XVwC}$ zjHZ43^$k9~<`W$75_CqG zi@;CLLP0`Ocy(Q8QIj@9s>rZvi0T%?@s$ z24kfU(1}>T%lc z&{oFYhOE|ciWV8{?h1e9l~;f3v!AC9@EA=R5Aso`gaR#L3P-5?2a$ViP4c4-R)%a_NZ88G(S= zAAa-I-~PQXdaU{4L8yX9R&geBViRP`o8YA40Ku7}gW=?2qMI>G&!zh3{#F>s2VmJB zLOHkPDe5Wa`lDZm7S0Ee2gb|~tBf=cH03`wrTTPX;%?hh^kN8}rDrv>imG664Y~p? ze0hrHoew|z%s=|{r@sHOs|4JQC%}rGq-rV--7=yQbAk}afFzF!lQ0W08<<=S7Tr6l z7pg{Kwd!u&T6Ag%0%}_4Wi--YUO78uxscg%0KfATR@6^J8Jv`eZ{?n(bkD=>hwh`l zt#i9s-&)SQ`OVeWx^!Os-W~EDfY*0af|opJ#ZqRA=AzI%+Srm~jZ3~l#12R#vbB1FUt(r6Z&!(NCrbW7Te#D;O<(4CYPvr; z4t&c9=;6Y{xPFgMzh}J<>vfKZvUL!?y*oZxtt3vHdsSES`E2B#M^U4xCUI_eckhu$ zu08tbqgSt9y?F7`#fz7&J#y{x#mi08IN&Lcca{fo$VFy0x5eUYu~?WX5rq(lDVe*} zO&vlQD@sOgovEMML5qlpg@C%Qc6WA<4v#Kgy10LE(9C9>!fTl`GbP53shKszqOGlB zyR*Oh6F>3evueK7)?q2^qlmykJfvh!kUw^FA7){~d_M?m`E=pVzv+$F?+YgzuUMC* zCtcj$BS$ZNxT{8FjeF6&IG9=4m?Ujvg#y^$-#Doaj{&fX!PfA`7|-;V-&RTtzTV97ygmESY0ZOl zcGQ{m*Ttr;_jYz2$@?vZDoa}8$=vm*zzxZ_B$->WOVkM1om;p5 z=u2PzjbHvhe*a5CPrT{~~874ZLk?)U!eJFf(Y zhW#iGn>mX+a&+dDI)~u`cQ!D?2+7L$T&shJIE!zms^Q*kpZDuMpPG*REeav`+);(C z8s3tz$h~@Y59~)JoeBX!6;;WFhy_gt_O@Hx?vAg2WsU^u3em+ z_LJgnUfknH&yDI+_0V)bJP3pIfaM{;zgQcbOECZOCyQ-!z>38nj zzH#%$>FG(=b%}QmB5FoNP1B^-;7Dwlh=fukhzKWp^z?$+Y3?bN;=74i&bWneW`abJm^!h$+P9Xt$|`fF!P#ks8L!!Hb^9N{D>TB5^>wV$U@ zwM6cqDj*1m&rZ%zl^{K--&p+|lFZ|6<{^&E;Dqx{2 z>2&U5OmLD26$B#>#6(~MS%g%sPD0M??9DLLxvQF*soKaD(}!ob&o&;I*SW_^z3KXZOed`81M~)kJx0%U z7ket8M~R8>Y=wosoq?Aw8de{{PzD!vcBCLar04+b?CgjHa|3aas1m20n7QO43}KcK zG8^9?4EuOGrhK*cT_PqDkuJv5voipa8Z9-y5gi-(7YbyI_&ZVse? zGR&w%swz;TLVxpi`K_x9a8uU&ub*6mwrk(kU~ zEs{GkQ_jZ3lrn)E++pUii_BqnckkffVAjm4y58N}xp?uy;o%`OCu?{RHS^hOwJ@_7 zy$%&XtJpsA_~Re_$j1O_+nD$VAhGNwB1DvM3%qArd)V7#i5{F#W(qV#P`+``o2hTI z+@p(Id$_H)Q@ZK>AyzqOOL$mS9X{Y$O73%s(vZ7>pwR(bx_DuKXCB+GH{>fs_?)+& zix&y`OtDWQN&W4_eCO8f{LQS~xjr%FxxpZ8ZDMi&nev1s;gcq!ijba+-3i3R#7ydu5r7oZzXEBXJIBY5 zKk?`Q8&7T#3Wv{rv1#p(#uqm>^`Nv|f8#y3F;nz(KJQM`8_p}|!QjKK_oQTNS4Sn&x}x|) zKN*FGPpdo$DbqKYc6BCAG&Jc&qeO)y_FLV_$*Vym+L`aDS?&NO44=<)@*@NQ%p62A zuhVajsS*8je+?Vf%?M~0%agmu=_ev*$2w3<*{H$K!TXjbcb`+}oLkO=i+2Vd#`OpJ z>`~2w6FFa-p`;gZcVafT5CY)tmVTPg=gq89(;_*;%|nobgTuqaqpGg5$(tM8iO_c4 zVzG3jfZYsGX1EDN2q8!%RaFu5s_Smwz5Ckr*I$0+)o*?KJKy-mH(z?`JFmZfeQ~x( zab(=QgqO@IT}7m6>Yd&Be0N?qO{hX$*TSM|F?MPO_xWso;lhQTogH^FRg00Gc6Rpa zX2#$)MgV7vMOD=w|MWdLx+; z!SF#`Dejn~uC6b8#;Om%9giQ~0G@lmz+0*N#&wLY_dgBZ7t}xJ1-&NvkS=>~{#H1W zl#0uJcXzjzMiEisA~gG@D<+#p4xA%}G?VHVq^H% z@&>n@(?l~nxra78*xyzz6``yA70m50Ap)~Aq9LHRS&*s{u?6Cy?T+8KxBqj0{jYuU ziAN8Bvv}rS&7}#!NhCN`GMhDI$}2x(bAl%S5m%?^DfCe!7gRx-Rck~bsSFGX3M6B# zbk6DE;9$TC9$uej&s_#NQc!PZW+`F_vxE?;5URRq>ZTdtmbE$EPG8>?xIQeD`XFs? zzqc3Gkk9Qs*#jiyV$K#>j1z!zKci^kOAr{q-8HIOpCdC}Pe_&lI1xulalQbAkUR{z z=)rUIgNnvs?jcm6s^GAs7u`mp#thEDF#rICs=j@Ecd$&hymR#jDgFHqcrs1}R}2sKBCm)n7mHclm|2SW;AT}* z&u23NC0{aABf{>^&e73f2*J&h@|(bB+OC$z$9Hbtym5AV8dWpXo!KKW3p1Nq7h~6U z?Q-dA1jMd8JvqI5`_6K)^ehmPnME_A6u=_RXY&h3M^~?2dF8GB) zdiC1={=S3|HJTe0nRRb>_vrAbsw?#z{es{cyJ%h1$Rco4*z?an|Jb9C8k8YkyGD~x zv4pORDQRYkahaL5o);NWNt#S1ZC$^f-JP!21J*ZNdQ0`KbbUOY5&V171Eiylbexxd zRn;8iKIWX0VNs)zVhwwo;kfUmhQoMknHmK`(UE(Ov&=c;9w#nZ&%A%T^--P z`N)+^-}iwJUVHrMuYBbz+I1bF4x*hwyIQ2ynwW0fx=9T8piabQAhswZssw>qC1fCD zpRKwGj;}58E5Gykryu+K)$Sp$;%aePxmJwO%*3=~CIyN1>CHK(2`;;|FNGDP@@m9!McxU7r;0$IjwbP z+hy+<;1(%MP^velxb1G268h={2K+P2m}Mj&787JOVQR22?5SUbOY8P zz)Qxxf+>1CZYpQEy;wh9kI4&0ubLW6Ps%%iC+=596m*@zn%H_z=xpMp6H^YPFm{}q zC=_b5Z5quJ^`tRPF*xz@;)qStm}a*mFGRhZ^yISvH8sl00Kh{C%;IJv`G|VEpvlRp z_x+}R2(xV=vDx&Q4R;=H67z+42ky7M{)K zmo8n}-Q9C|5UHw)S*oUH=BBC5oQR1eK}8q4DulzM!{d{a+qZAW7?aHJKwUScQB_$; zwR`l@M?dhP4}I;$FE19W-JMzFE+vo>2}#yS7QH;uH?9-KNxkPvH&D)l!O%H~{$ZC5 z@NmznfDP7^%vB&jv2aP!i<@~e33e1awj|G+S<>1j>H=VY|DdjGy>m?2$EjC404Qi= zpo7Dw=O~<6JyGN)?#X}VxXDG>&F|j10{~zcoZ&E6TceUFIBsJdd(v63X9|Woo}&S^ zY;LfDuB~D0>0PCzwOM{67JhHNtYOIUat!wr5sNTRfSsJS`^U;HaCZ+O?C$O!-@U6) zzzyl>CDWU28;1r*5r;E1u|3<_jkk}_g3Z4A#m|2J3r{`ycr(qA_BIt3b8%-!vYE+I z`_dsJvK(hjBog7ldEU%A^OMu|O!56c_K6?(!5;>&S}ZD_0ZbrQ>fFM-22*RTcrB(z zaC1^ssv{9Q7&!uER8i`{00{%X|D~6H^AG<7B(%5BRamWJX9oAqncOX?Avm)WDCKv8 zud_eMq-<^K32PVc$^DK~TW+B%{>D%iZ8Ug)TD8%o>GiSS`gWd<9dB^N@Z8x6HvgaN^Uycc;+g&&OBb=mYz2^pMIwL`Bg&5V_1uqt{rWd?Ny2y(ii5 z+r-AvDf#C_fSS5dGXmT-|JGAE4CbdH2n|p=;ON3t6MCw-hG&R`sj9=vFTY$~Z%JT7 zauB3(iy0h*S%fDC)#q{UTlds^79QSQxeq3sjA@GHGWitdYynknX=bwwSVRD+#`%1{ zx4S1C+>@g+5m6W8@!jK_*KaOPPANq}FxRMU+btK%#bUWwE*6Vr6{^P`eeCI{pML78 zr=NQ2ea}Ao%=?~v-{HYgsG5VrgDaP>T)uee@})~xuU>iN>eYk&{Z1nshldA8M@O@! z5fKonSr?<3h9I-qOoBv>s+u(5W~OS*Y<_TX7((UlF~(%VPO#*F+O4{7)$Z=?yzu=m z2txD@43Xe)Rh3H80hOi{!DWs%4roWfJelN;8r^qkruV-cahv>+SE>G=fUyquk_1PWKwqo6$?h%$Q#yfZK0+7UM zF~}JuD9G9fd&|ILcsS~b_dh3`>l;1W7ZW0cOqHG~0*(7p>ld*!Lv5G0f*i&u;qwJw-U~@L-l6>jj<3Xna4{yzp*nbzRkU$V*S| zZl=0gtxgxGZP#)TFn6(AESJmGs_k0UNKEtj?2)Tio`3$iXP>S)iv_>TdA)!Rm>YZ1SG32@Hx3S{WJKyzn zKd-D|!i`?%DavAeIo9kKgGv+xg2PSK+?aW1XQ$@MkSdpui3AV{(QjT|0X z7gjB!zxbuk|M8c{@mhvm28*;4or?abyMza1)2Zyb{)AQP5QkRNuK_ zzxkllXsrSNUiOG!42+w-hO?fK3K~SSf+Sr z{n7I}<>%buz0dm_@55XC+!%h}&mNcg7-62@oAs7@hei+pRyHz%J2XhJ09Sy-K^%=* zGLsnN^2Wu6e(J}*|EE9x{tE!dm5I!%RR98NsUrX~5)Cd!1V$8BkSisxR3R5-QLuv@ zDdIcB*}-hg#;^eR$fd9!y@^2kvO!btwI6(B&PGE%Do+{S z`UguOhxN%R`lh~qZdZr^hzNnlK_SX>ljCG25@Dnh)wEDFX|4C($jp%E28iHD&*EF( z{5F7!LyGi4;K*?zaF3{NUDt`a6npyYp}Td?whZw-4iax$*`}`;s|7NA5J)6NUU!(A zDcpkuX3?l_p2&CC#l_-mxm-n6GhZ$i%d-W{c6a7iFJF1`i6@_Z`kD7X|9#It_x$07 zBQVFVJ3Bd9Etj$FmW$=tV$rTvZZ5O8-YbcLLefI zs;X{YP99M=_3qAYRn^q1;?0=Z%_KS4Xm|DErAMw_1Kgug%5-i+5F<5>QS&CDqJkaD zxzO`YC<)(6*~-BW-caX~RVwKk%54+M?tOGAq|m(vVBRzdGw{F*Q;$Wm_rtasD`((| z3G`x4ow_mVHk_HG>2k3c9`quJ4p?$1o4TU0DMuC+2vp3yHXhyR>3e_0?@`Wy;>qO! zr*6j_KyruRx~Z$G0?1+JV@@)~7~7;c#TyG`07r`e7K_u9lP`Vg&;RAW{8xW@W;oQyxS8$?QJG>Ww9Vs3#D&4s8l)lQgBkB?7)_kZ+bpZxUSe&UHIc6N58 zs)(Eo2GvgIyK@*3J9}_)cLo{5;fbt5!Jt*73IvrZE`3&YE%1AP_^sdky+7`%W@mo5 zwAw0mhM9CMmBSgyqm32HL`7&`E4}En0j1k;K)>&X>%MW%+V#zg_k^iUk%88(Yz$&u zmwsOB(;g1^`aEv?p_aAzpluh=e{<1H^nW=df+xcV6J;kD#90A}Mr_t9tR@o*mFolPc{vyWy46(?&LY6DuL^|PVTw6WdbFCvJIu-FsaWn1W-rn9*PrVO-Msw2?4zl=g zg8(({g_-_D;sHO%oNO~;2%ExQgTV;6PnG*B`aCc&gU0f`er5Bz(<2RzW_hX?k7D7RcLv_-#fRaMZ`_dvBp(5#Lt2`!9EEQm+0Kln zu(vJRguV^WoFIjIk zkmQ0r@v?M8hu6mG7Ouhf!$#Tfw26j&c$t$=VjOsp20x|-Jw;4yYx*TG#? zlNLWEtdCJy=;FnTbzR-Lee2}pBt`mDGf%9UrBIPxiPUvnRTVRrX~_ZUo2F@+hDAb1 z7F<99Vz)Ug{4?({7s>^$|b@%i4ATp{}bOy}xX@J~UuHK=r=q(#;W%o(@?0?s?hW zR3<&y?sPF`Qjq%g`#xC~V0MlQbWA}w6N_1-Sx z>QBG;#dfvY!qh#~!j!b`S^d>VEE=i*n5qb4B2!g%)>>rV%nb$-U3K5NvwY#>AN#xi z;O||#cC8APTjy0(1&P|mrB*d6udQ~90l}P8q&Iehk;9!d0$nF;%1klFSyy$0`Y(^| z*M9x8uU$W@_Kt+B7NlNj$U01Ah{DK?nA{TmP7x^z$dePuz;0duUlc0NqihnCmnoml z)2NQZK$JTA9Y0>mRqFA@08l8+q9BLKFXe3x6u)8L1W@m>3b|9VH0asG zfel(`cBc^niC1!h)18qsqXGf3{#?%$gyTIjibX>VA@(gZ<#aPm`NmkS^waOSDWCo0V3X} z`V@Qi*st%&^viHNr7tuX22PpP4WTUc%rq{@KdP%Y&CCfo03P%nq*5ubeRd z$ux*kt_+a7C*c9x)cvFN7|%zUb1!O&ZTsv!S>J*Uwh-ZMGcYP+k=auM)Pib=MUYu{ zPrnK?XWRD3!lu4hEH!Ess>6eW#~yw3si&SgI=UdtF?LM>#2lD~ zViy;SWsI8Cvz^AS>)Z_~9Au31*=&D*f3aNLx_L|0LI{*Y**M^_i!nxrv#?a5ACLvsMkRrpU^Y5g4H&rHj;_)XNo<(%#PK3Z5V?t-1f~*xe(76zDpD?obne_od zdDePOgv0Un8`kr_>we$*v(rfpLgG7zyt16Agl9OYSd zL*up7Ag{P~m{6rKA+~Z9NMlS#8T9~tyzpXZ+)s6xIbxKcAF6S+>Hy@E-2kX7E3F9! zr9seW5q%K$2ZhMknP#Gwy!YP`NYlH$jDMM8A{H>DG>~_xwDgVr?xlSArcc1llo%0!WTdLpT6~- zm$tBJ54CVI4ggX-wSjp^n<9NN28ge$&ofbTs zyK<{>XLg}!n!6pHS#%3V>XxvRIU+%m?SOGmhe!5M!xgmTC3hSM_`|Qg@;iUU~4zn^7zihA;c_tszH?1h?eM1Dqa1+2cP|gPyX=ZK=jsl zIqSTsw3~A@xKreMfmxItaTO5584zfzQ$x{iV^HxOkR!ic8j zh3_B5+Kn{gC$b??&u0|NqW*5eg#YM&Z~#uuMnq)2VfkPnA)K;Tj-Dmt2oj~6J{4-q z4(_>Put-Q5F_UovF;{gHs^;ro|Hess6M%JYQJs9*E*YEv7lfSM6L5H_D&oXJCT@(Q zs;U*;>iXcybZ=7MDM{M`7jG*(JS12uHb-x~P#Jw6`V5{;6bMQ0&iM$Lh=dtL4rdky zbzOUQc0z>x{k>~fA9?K2$D6w8R$aSVby1@l5sOsrWbR!TB?Mu%=v|D7JC8BK)S@oW z&f0F3I5`n^_o}K7_75b4+qZ75+Eoy#svx0~AZf^|8e?QaQ`L3V)Kw!A7)(g%ekg<> zEGWms%z=mq4C3ep=F69^93CD4Zt6rFW2~Ac7Mt4a%nH&JRDLbC!Tl98!-5nW4-9*F zEVB2%J{;JXHj7aOJ(P?$!hmH6lMkTSO(Apb*(#ZaU~`ESF`!I{DfYVqfH~D7PLY7l zIv5!=>5>SR7{u{ADFa!WFQ%d>CgPyRK`O0HT|UlO}uO;5mRSt*sOj zCH%w8EFvNjc&rK;aTEl=C-bqnzUOVb5e7*c^d3}T_Wt6FF7D`Jov zdvNh!uEBzmr&x|%8~tWg&wt>Zum`AZnVFFWAA~E(HvzHUH zaHy*hBPmDAk%%#~W$Sw~7&#e?Kq(BM=i>qcDw1R=Gg#IYi;Fx#G@3UbU0-_`Nf8GoOcZLcHN>`j&MO)(tm?S~55?&aGN?VdI>swG$(j>S`&+T{94Ws9WS z@~LOasgX8`8#AR46J>XLUO#t`TU2!gI0S+Fs%_`h3~pch`qy#?$kJA2XCoz|WO3yg zOq{??T_=Lk?-J^R3nyC$-`q&kbzetOe-#Ryf7H;IF|17nUt%gakc`*Ovh5@s<_gL| zJOC#mRaf*}O93;$+B(05R1GXhp$roxwK2YRlthXsBFzI7pX{m(hVKz*8+C)q zR!$@oJ?a>49L(hMhYwN=5jl*B)rp`mis_&%Ml+ZaQ2=#NfopP7!5{<;!Kboe8%+G_V$*ZvsFxRo{D)urC;#{tcb>c|1bM)1_XbOFGa_P^%p&wibc57p z35ZifY!PB}f-oDwyRY6p{{9bt-+%ir{)hkhfBGN4{>_(Od+pVzTJzipQi)|HQwl4Y z0Te_@9py-{uGEs%&e35}LuF|H@|OME-}>zfN1uBB>P2l9+V?#a4j;V*;3y;cMQ$1R^SlQS#7yjrZk27hVW|zFsyzt-;FR;m+_P3~cU;zR_$J z-KU)CMa#^=_53=OUgX=xq>uCJu3@Y~1*nC%xD71kP*Zz<_d5fLNrx%773NW@zt+5`ya~`8@*#Z>?-&P__$&G=>>uB$5%Q_go86@)%_nS2G6@ zn5=m7x^ZD-S@$t%^6Yexn0_+_L5QoWs_WWJ&(0Px zro_%jK}9)1DhTee)7fl(;lf1}cMfLmH&l*R-V3Pf^y9uI&Ec5QIbU`Aj+QMFZI3^C zTHKGaw~9$?nh;7l<|@FH@UT0>ErC$F&)P1z3@1v@AR@45)ATHD4**I-iq>=}r|ND_ zOeo0&l5b3bBA9_m+IF>AEC5K-<`Xfqsbd*SgRwcyeT4ga;*mVk zZFBw}EcauFvS06r%=98(%Hb^{Ayj+2d#5L-5v?VjBSAps|A|VZNJr8+!vXV@cC`*f zsu76wY}Qrt+u!=i=YH=GA9>_wcPq%-!?_0sn2_xGoQ5o_Yf?Kf>}Q87+{_uIv14#u z)vMLnUo2-o_w&E-8^8VAH*VZGJ3BhTU0p3=G_sW6&U>m!y)Q`58oEQhW7HOvgMq!( zK(%=Lg|EGK`L{lM#vRXCHF$C^bCpW|4g`fENM^9I0zxjo4+_G*a6?f7G*FfHiOJ^3y)yWBc z(w4kllXJ+?^sX~hqgm*WtVASl{`E;5?W;|(ZgOz4W*D+L>*p5QSel1ipC0g}VHJ3z z2{d2>;TPx~&7TkLOqu$=fvGlW)L6RH%S|Y*V8ldZW?C$j%`&9)eK#|8Q!{o;WO_Jc z9MtaafOb($iAc>fDie_ifRmGxuYT=o00e;mgFB2|#(N-BKtLn}38@p5-9Sd0W~i=- zCf?68M*F%4rMG>p-2|R1+E_QeB+*vNpqNebnd1Zwqh=35Ix)~7L&KdV@qBtF}#2A|-)#EmU z{sFKG$pDf8aI$C1=IIRBa=8M*+(-gc)4^TB>*nBO(>}l|dZSMURJCnaYF3FLMIJ$h zNf3hxZe~`6uv)DY5rrLRN^wY>oW1zTZY#dALIo4hKxaq4p4-mGWEa{!p6Kml|J?G9 z;*Bv5oYZN+A3aozpLKXjc!lint*#-+d_LdZ-Mw?#Ih>6N>7aD-V(JN9QED0!qcv-Y z8APjYRnO|>^7ONx``nNH*bmPixp3b}dvhfa6K82pK}A>V#VyW@w$t-4j~|Bb5`zwqgw_<>oow`#8&iO0^IO|-T;c@u&tvBAXftW*PWmX@fH z!+dOod{56Dr*7T9UVx!kp_I>iJzH4PY<*VLLz&x1z%(dJhUw2e%wyqlOyE7spZZ_! z_X5GAJ`8;;Z0>OV!Rk&U4r6p>{hnbqh(_;C%78>^Q!4~Gr_GfS^Kgog$HD~n6!9o6 z9a;LxG)DJiyGaJ*G%F4!f;mO*!irH-Fm{_&Rkye`-?{t~Klst^r2EaUytL}hWVe}j zVMz?QISZN5gh}r^>HW#-I?5WjvBF*uFj{gT_sf+@Hc#sMDot7}Gf-x$pUL;)=jiN* z#v`F^!<&{KBF9f8(R5=z;5|h-r#Z*qOwu28gutN+R4DrJiu}!47zANv0(06&S$mem zbIM~ZA-0%Jor<0Ma@p?g%x>Mf{nEEy1kltqIlD0dB*ZGn^p}tsdKZzD>U=U2<7x7( zU_s-ZoBs9Uk+iWcTXydE!si%wtwVk>{-CmW{WO)`S&)RA18%Nnn&^^*;LsHAoR}Eo z70;@fP_kdpq)!(TP>$TaT&+}NRfoE%Q-(_bnFk}VNL@D)Dv!#{AkrAyc4cnDiPUQ| zuZ|85uHR^)#^aN_vw2+!qhhHlW?Gz{+_`g$h^ndzA&7_rss?v8&G4Fn<3O?$$^;kB zlz{75b@AfGG8LX|@~E&AeNdeO`V(b)Z!$x)iF48_ycghM4bKepWsGVw#d9C?n&WZx zw-yG@hfPI*K}mx#u{)fI(|tE@-l(g(t^*l_nTkrDllL$sUSr@fJfRFB5stBorlATV zlyXB7bF$DSN@2#N0!s*IC#QWN8$wa>5{gXVV+2tKH>E?x4kwL^iHLc6(>eHe@)NCH z_I`Blh1I|BCrx;*?c*Lep=7d@!=zGH&ZS%;o`SKSoF1DS1Vzh}Xv>-alL1cQbFN_M zh*CIdRtr)i?8fV_zW(Z~PrZGNd+eeJxiQ>rl&L%SFs-E*Qvjl*+jR59xPzF5qb;a) zulS`q$A9gGkG%Bv|Iz>bfBx^@nXtX~+D!mzM##Zmk~*ZAWRU}&B2v0TCG1wG%T?eg zkvbNJa-g&5|L(Vb_mN8%|Hco0WU*S=+3lqTwyr|m24!P+b|-gsuseYmNC$`va`W_+ z@&Iz&_i?PvVS^Box%0h6zU}M@CBuzLI{>J>tK9EBI$;OF6NAAyOq>Hr{&q@?YwEBU zRFS>g)A5LBWad6-_ifV8wLaqw*3bKVfO~u(5uO}52|2ui57!H4UU;-T_cS=}Qi`jV zV%?H~9b%r{@xduPI}=z*y%o$!K<-4=Dnfhb=9P<=e)`A%S{vhMzwzDG=}M{;{4@|$ zQ4w17c0m*DxxH-uR(f4njp2H)0vVk+oZsxI?%yMy019U{aK!-bF@NRh{8(0yj?SOQ zxN+1H4U;@>Yx-DzDjit6yPKMM&$uJAh5$pOrH}#UNim<8xkBJ6OQ9*jDhKJ7OA!IV z)L~jx)k`nE^vd<`0#G*lRH zO*3m|GiG+j?OS(VfBkyfb@SPbn8|aFq%?c2v!4)=fhXMW}zU;hSx*=`Nvm%sa6mXO1PB>uB7G?{%TN)bf3qSJN-XX}_7 zbB)o-5hQf4p5g!f_rHF0arW%xOBP#=r|zK&t+e7HvcuWf4LMf3!#zpToO0KvNl(|Q z-)<-Z+vMzPIz^kv?cQZ``>j2dIP*kz5k#UUxtI!OcCBR5^!qQk z=YbYjLSYXnAMTiE6RiP%+<)>O#xCC~aK4H91C*`cHoiz})u~{)%?@TvcKSmnBBC+v zE_d}}x4Ww=00gF{R?u=4n^1vzaLVzdvgx`60NNQmt6wZB)p~Q-9Ap**s73P%3MZfM zG)EUNefy=C05BNQK!AW0Oe8EC6^W_>OiWHJ!pt#ia38d6g@oxGeh<~}U)H2G$NCgZ zn@cPj5>p!_0B!^GuF{)b5R%caHQzZbqQx!r|$(uQm3ri9mkB^UI*ELNYgjFMq zDydA3nB9yBDW1pf?%w{v;i|ovtWcuGRkv!pSk(qXAQs}#RD1jTcaKlZ?9QFLv(*a3 zQM=>2ce}RRna@QeMW}RjARk0~Hdyz}RG`@FIhfc1VJFaRHs3os5>!C~vO6k@sDnP? z8+yC!ZPR>j97FfLg1Jl4iIT|S;o;4@w*dqM zMa(P+JfEs>Ok!`EU(~?;a1*IaCoxDW_vLc%$$`iIt*s@0^R?_BSG^_PG1AN<`*vvhWG2pPQn08kO!DE&{ z+(4X}=LEcC6~wr#LD71d?uX&bCi9=?10xm3)MV+O;*|3U8aDeeZHu=3w6*`6Jso}= zuD+Fe9{ZLz`E=-oxAk5)_VuRo;_9 z+obp21LgZjYvRf6jI&YG`U2di(E0H2h8lS&^|xGlZfux`au$))QzO9fe9F{=Ns;3` zeNR*4y^3K1-Ii0SoF1QatFy|q60TVwM1YZJ?X0Gd{b)pjQxz(+NPuVBOwJiUIKaZ4 zX=SuKn+vh<>}+*hNqy^;SN_ev`M&^ERD&$(^$ZS&2*;S{u?qx%!z+=L;{E|iQ%{Hr zo4)my@45PBnashI;*Pcr4Zn>9wQQ;BMhqfz?c(Xl9kvc6?nLT{-P!T&CU7&KSM$A2 zBN<7uDmFLQ#qwm;t=xRM>WGOe38*+{QjCp=JEwHGLc|JixUhH8mcBYWZM&6|uVAq~ zw5DPq=E|d+TTL>T%9pE!#rBN5E_ShVM9*HlnWe*lbQ()wHgj{V z&X&OuPtO#c&<@z#3?S3Ou4l%s942IT@d0!Y(?uu@$~%dF9=v!D1%u6EPdkwGFv*0V z98Bk%h#W>qdk6xlMuMcMk3te1FMjLA8#iA++M6Fk=hZw^3?W52%K*76P#j1pInpp7 z#O@Ro+_{)Du`mQ4YGby~lUiO8&O_ICGfpWHH2Atquk z77UxKLZIkz&J`QQu9Hw1gW+c<$G7jC9UXn+t6%-f3m^Wzomp7###=7oaCfF%wG+B3 z1W&jD#KNkccoJqVCq_&&$A0ne{NgYF>t8-P zy0CY!^G9F$(rd3RyS4*S2%(E@mJr+uX@k|J+X>J$86{vItmORFfE6qAGH%SUOThV(Q4ENhPjc5k)s)0#Qu9MM;MNF9IuV z)`$4YZn>Uj;NI6KbuaHK?Q;neXPTmeRs=0xFO&`?M)w;L_k9C%5sW@3GSRUZmm}Xh(Kq0270Rg|q8DWl;zKGv^bJtfxwrVr2=+(xk^c^L6CO z!dFqx=TANU*p-VHPr4PWFSV$Y(E3TmtjMC(oz$lD9u1r?aUj(Bad9WdifDGJ6kSO^d4!N zYQDR7a5!&ft8P_?pnwotG!~xi?Vg^VYG?b070Bx*umoX=rgc-9TGE)NB&TLZsuwTr zRh4(~@bqj2bFR3mYZ3`flfulg)85{0ynIpJyBOWPsW2lXylt?A@p!^~y5(Qd>rGR* z8&xOa7-KEfY_~Z)IC%P*XKJcC>nah;bSt}JWLs*t5s+bRGHQa zd(=7z)L2-}nMh5Er8sTzg^Neawq@qFZ5@^@SS&gPR&@z7-00vZnVk9u4 zY7HI^doiq^xierXCMjWz{E~FQOjTVcuO91_Vw5z+BUKa#6MN2)boN&hw*c6nLQ?E{goIh$lVCI~4IIWG2c0fEajUAJZXC@(GZHkjqobp% zv#`(BybXb6!nJCK3V^(sr`HYu4tB@i-v6N&-v704gitRR?N`41O_94Dj6fn)j8?c% zLXmygp&`HmBtmE46-D=z)Y1itjcN@vEnfV>m%n-_pZ+cHu2(4pYbq7C{12aDXY8VG5SF@lzEtt_N5I3#Q}(hwr;^<@)s- z$C08_#}$)+%q?qTEN43GReQa)eji1YdQXKh78vv*Ec4wR>QL*<$ub)^aHk`pTAZ!` zpbzE^V0?Y#nC0(w{hYq7QH3$%nUq9n*2s%8&>f~0W2|`DQkQ44xL0MaBJm-d{Mwyd zMn2g65e^)lavm{}ssdIdjeA-r+fzp%$$4WJ6M zRn+J)xd{qbzzQ48*_@lIsY6p$)tGDV6&3}G#sXZHYH8{~zwPrq1RHOmzBaN+nS39l z=iEZ_|L(fBt{XaAxygk`uk9Tih9L7J4nFl#49uaX4PKXEdUk|1O|k1 zUXYwzISHubM9!3~^7_@wY7PP*5-O=GsjDhv+TuPo^G;8U4us(o74p4t`+I2J-zc3L z!SkRBE3}Am*p+-I)EwruG&{|nMF)~?bzV*aY!pVE!45QVawstw1*Z<7bB+k^&1`<{ k+NFzo^XAP%(fQ^72dHZOmc^z$!T0KmC;$Ke literal 0 HcmV?d00001 diff --git a/vite-project/src/assets/iconfont/demo_index.html b/vite-project/src/assets/iconfont/demo_index.html index 98fd072..44d0499 100644 --- a/vite-project/src/assets/iconfont/demo_index.html +++ b/vite-project/src/assets/iconfont/demo_index.html @@ -54,6 +54,54 @@

    +
  • + +
    scene-icon-25
    +
    &#xe655;
    +
  • + +
  • + +
    时钟
    +
    &#xe672;
    +
  • + +
  • + +
    个人_物业费提取(menuicon_wyftq)
    +
    &#xe639;
    +
  • + +
  • + +
    洗衣机
    +
    &#xe601;
    +
  • + +
  • + +
    沙发
    +
    &#xe615;
    +
  • + +
  • + +
    扳手
    +
    &#xe602;
    +
  • + +
  • + +
    uniE78D
    +
    &#xe603;
    +
  • + +
  • + +
    支付宝支付
    +
    &#xe670;
    +
  • +
  • 3.1-客服
    @@ -180,9 +228,9 @@
    @font-face {
       font-family: 'iconfont';
    -  src: url('iconfont.woff2?t=1710298973478') format('woff2'),
    -       url('iconfont.woff?t=1710298973478') format('woff'),
    -       url('iconfont.ttf?t=1710298973478') format('truetype');
    +  src: url('iconfont.woff2?t=1710609130416') format('woff2'),
    +       url('iconfont.woff?t=1710609130416') format('woff'),
    +       url('iconfont.ttf?t=1710609130416') format('truetype');
     }
     

    第二步:定义使用 iconfont 的样式

    @@ -208,6 +256,78 @@
      +
    • + +
      + scene-icon-25 +
      +
      .icon-scene-icon-25 +
      +
    • + +
    • + +
      + 时钟 +
      +
      .icon-shizhong +
      +
    • + +
    • + +
      + 个人_物业费提取(menuicon_wyftq) +
      +
      .icon-geren_wuyefeitiqumenuicon_wyftq +
      +
    • + +
    • + +
      + 洗衣机 +
      +
      .icon-xiyiji1 +
      +
    • + +
    • + +
      + 沙发 +
      +
      .icon-shafa +
      +
    • + +
    • + +
      + 扳手 +
      +
      .icon-banshou1 +
      +
    • + +
    • + +
      + uniE78D +
      +
      .icon-uniE78D +
      +
    • + +
    • + +
      + 支付宝支付 +
      +
      .icon-zhifubaozhifu +
      +
    • +
    • @@ -397,6 +517,70 @@
        +
      • + +
        scene-icon-25
        +
        #icon-scene-icon-25
        +
      • + +
      • + +
        时钟
        +
        #icon-shizhong
        +
      • + +
      • + +
        个人_物业费提取(menuicon_wyftq)
        +
        #icon-geren_wuyefeitiqumenuicon_wyftq
        +
      • + +
      • + +
        洗衣机
        +
        #icon-xiyiji1
        +
      • + +
      • + +
        沙发
        +
        #icon-shafa
        +
      • + +
      • + +
        扳手
        +
        #icon-banshou1
        +
      • + +
      • + +
        uniE78D
        +
        #icon-uniE78D
        +
      • + +
      • + +
        支付宝支付
        +
        #icon-zhifubaozhifu
        +
      • +
        • -
        • +
        • 陪护开始时间

          - 2023-02-12 + + {{ currentDate.join('-') }} +
        • -
        • +
        • 选择城市

          - 请选择 + 请选择城市{{ selectedAddressText }}
        • @@ -52,9 +54,9 @@ @@ -70,19 +72,82 @@
      + + + + + + - @@ -150,13 +225,13 @@ const routerpay = () => { } .Accompany_from ul li p { - width: 60%; + width: 40%; font-size: 18px; font-weight: 600; } .Accompany_from ul li span { - width: 30%; + width: 50%; text-align: right; } @@ -272,4 +347,5 @@ const routerpay = () => { width: 100%; align-items: center; bottom: 0; -} \ No newline at end of file +} + \ No newline at end of file diff --git a/vite-project/src/views/Home/HomeView.vue b/vite-project/src/views/Home/HomeView.vue index cf11585..72ed834 100644 --- a/vite-project/src/views/Home/HomeView.vue +++ b/vite-project/src/views/Home/HomeView.vue @@ -1,121 +1,126 @@ @@ -154,7 +159,7 @@ const getlist = async () => { Authorization: `Bearer ${accessToken}` } }) - + console.log(data); } const Cleanlist = ref([]) @@ -165,7 +170,7 @@ const CleanList = async () => { } }) Cleanlist.value = data.data - + console.log(data); } @@ -177,33 +182,42 @@ const handelRouterHomeServer = () => { }) } -const handleRouterJiadian=()=>{ +const handleRouterJiadian = () => { router.push({ - path:'/jia', + path: '/jia', }) } \ No newline at end of file +} \ No newline at end of file diff --git a/vite-project/src/views/Home/butlerDetails.vue b/vite-project/src/views/Home/butlerDetails.vue deleted file mode 100644 index 5a77d04..0000000 --- a/vite-project/src/views/Home/butlerDetails.vue +++ /dev/null @@ -1,190 +0,0 @@ - - - - - \ No newline at end of file diff --git a/vite-project/src/views/Home/butlerHotel.vue b/vite-project/src/views/Home/butlerHotel.vue deleted file mode 100644 index b02f3d3..0000000 --- a/vite-project/src/views/Home/butlerHotel.vue +++ /dev/null @@ -1,260 +0,0 @@ - - - - - \ No newline at end of file diff --git a/vite-project/src/views/LoginView.vue b/vite-project/src/views/LoginView.vue index f7f9954..ea9307d 100644 --- a/vite-project/src/views/LoginView.vue +++ b/vite-project/src/views/LoginView.vue @@ -1,11 +1,17 @@ - diff --git a/vite-project/src/views/home/butlerDetails.vue b/vite-project/src/views/home/butlerDetails.vue deleted file mode 100644 index 5a77d04..0000000 --- a/vite-project/src/views/home/butlerDetails.vue +++ /dev/null @@ -1,190 +0,0 @@ - - - - - \ No newline at end of file diff --git a/vite-project/src/views/home/butlerHotel.vue b/vite-project/src/views/home/butlerHotel.vue deleted file mode 100644 index b02f3d3..0000000 --- a/vite-project/src/views/home/butlerHotel.vue +++ /dev/null @@ -1,260 +0,0 @@ - - - - - \ No newline at end of file diff --git a/vite-project/src/views/register.vue b/vite-project/src/views/register.vue new file mode 100644 index 0000000..165fdc6 --- /dev/null +++ b/vite-project/src/views/register.vue @@ -0,0 +1,180 @@ + + + + + + + \ No newline at end of file -- Gitee From d813c735c155ee264969cc232e090553969fd37b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E5=B3=B0=E2=80=9C?= <3512137118@qq.com> Date: Sun, 17 Mar 2024 23:29:05 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=90=88=E5=B9=B62?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite-project/components.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/vite-project/components.d.ts b/vite-project/components.d.ts index 9fb0bc7..2127b3f 100644 --- a/vite-project/components.d.ts +++ b/vite-project/components.d.ts @@ -30,5 +30,6 @@ declare module 'vue' { VanTabbarItem: typeof import('vant/es')['TabbarItem'] VanTabs: typeof import('vant/es')['Tabs'] VanTag: typeof import('vant/es')['Tag'] + VanUploader: typeof import('vant/es')['Uploader'] } } -- Gitee From c574613ee8a0240d0667f4e3d79a640ac994a54e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E5=B3=B0=E2=80=9C?= <3512137118@qq.com> Date: Sun, 17 Mar 2024 23:30:44 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E9=9A=90=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7475717 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +vite-project/src/views/Home/butlerDetails.vue +vite-project/src/views/Home/butlerHotel.vue -- Gitee From 058f073df3370e502033c34810a5b382d1a7cd00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E5=B3=B0=E2=80=9C?= <3512137118@qq.com> Date: Sun, 17 Mar 2024 23:42:11 +0800 Subject: [PATCH 4/6] llf --- .gitignore | 2 - .idea/.gitignore | 5 - .idea/inspectionProfiles/Project_Default.xml | 6 - .idea/modules.xml | 8 - .idea/vcs.xml | 6 - ".idea/\351\241\271\347\233\256.iml" | 12 - vite-project/src/router/index.ts | 5 + .../src/views/Home/ButlerDetailsView.vue | 236 ++++++++++++++++++ .../src/views/Home/ButlerHotelView.vue | 226 +++++++++++++++++ 9 files changed, 467 insertions(+), 39 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml delete mode 100644 ".idea/\351\241\271\347\233\256.iml" create mode 100644 vite-project/src/views/Home/ButlerDetailsView.vue create mode 100644 vite-project/src/views/Home/ButlerHotelView.vue diff --git a/.gitignore b/.gitignore index 7475717..e69de29 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +0,0 @@ -vite-project/src/views/Home/butlerDetails.vue -vite-project/src/views/Home/butlerHotel.vue diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 10b731c..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# 默认忽略的文件 -/shelf/ -/workspace.xml -# 基于编辑器的 HTTP 客户端请求 -/httpRequests/ diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 03d9549..0000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 0eabfa5..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git "a/.idea/\351\241\271\347\233\256.iml" "b/.idea/\351\241\271\347\233\256.iml" deleted file mode 100644 index 24643cc..0000000 --- "a/.idea/\351\241\271\347\233\256.iml" +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/vite-project/src/router/index.ts b/vite-project/src/router/index.ts index eed0249..ed2dfc2 100644 --- a/vite-project/src/router/index.ts +++ b/vite-project/src/router/index.ts @@ -17,8 +17,13 @@ const Records = () => import("views/MyView/RecordsView.vue"); const FabuView = () => import("views/Hjc/FabuView.vue"); const XiangView = () => import("views/Hjc/XiangView.vue"); const Chatui = () => import("views/yzk/chatUi.vue"); +<<<<<<< HEAD const ButlerDeta = () => import("views/Home/ButlerDetails.vue"); const ButlerHotel = () => import("views/Home/ButlerHotel.vue"); +======= +const ButlerDeta = () => import("views/Home/ButlerDetailsView.vue"); +const ButlerHotel = () => import("views/Home/ButlerHotelView.vue"); +>>>>>>> 4cacf13 (一版) const RemenView = () => import("views/Hjc/RemenView.vue"); // 视频 diff --git a/vite-project/src/views/Home/ButlerDetailsView.vue b/vite-project/src/views/Home/ButlerDetailsView.vue new file mode 100644 index 0000000..8ea63c9 --- /dev/null +++ b/vite-project/src/views/Home/ButlerDetailsView.vue @@ -0,0 +1,236 @@ + + + + + \ No newline at end of file diff --git a/vite-project/src/views/Home/ButlerHotelView.vue b/vite-project/src/views/Home/ButlerHotelView.vue new file mode 100644 index 0000000..5a3557c --- /dev/null +++ b/vite-project/src/views/Home/ButlerHotelView.vue @@ -0,0 +1,226 @@ + + + + + \ No newline at end of file -- Gitee From 0603acf00bfe6ce0b9dad1d5f824444d44c4d55b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E5=B3=B0=E2=80=9C?= <3512137118@qq.com> Date: Sun, 17 Mar 2024 23:44:39 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E6=9C=80=E5=90=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vite-project/src/router/index.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/vite-project/src/router/index.ts b/vite-project/src/router/index.ts index ed2dfc2..eed0249 100644 --- a/vite-project/src/router/index.ts +++ b/vite-project/src/router/index.ts @@ -17,13 +17,8 @@ const Records = () => import("views/MyView/RecordsView.vue"); const FabuView = () => import("views/Hjc/FabuView.vue"); const XiangView = () => import("views/Hjc/XiangView.vue"); const Chatui = () => import("views/yzk/chatUi.vue"); -<<<<<<< HEAD const ButlerDeta = () => import("views/Home/ButlerDetails.vue"); const ButlerHotel = () => import("views/Home/ButlerHotel.vue"); -======= -const ButlerDeta = () => import("views/Home/ButlerDetailsView.vue"); -const ButlerHotel = () => import("views/Home/ButlerHotelView.vue"); ->>>>>>> 4cacf13 (一版) const RemenView = () => import("views/Hjc/RemenView.vue"); // 视频 -- Gitee From c5cfd604dc684fbe17189fe218241de66f5cae84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E5=B3=B0?= <3512137118@qq.com> Date: Sun, 17 Mar 2024 15:47:19 +0000 Subject: [PATCH 6/6] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20.git?= =?UTF-8?q?ignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e69de29..0000000 -- Gitee

G(H6q0H{DhWbV>BST>$3@G!sSzKuY&_?PK7@$V)y>^3sHs#iJ-p_` zMz;nPmT}Ccqd9)8><7F)q#XX22Y20R!E?7K6>{UbwRJu)uMM$bS2-J{4Nsqr-d;-C zQO#sp$=0m{-q`BX?KboIQzm2bGLh~xYLYX4opSS;kE}DaQ(B$Qx2?Ii!5hyCWw1+- zxUDfe?cT~b&sEnMm5gt>=H-{6P*IR%Qx}X^!Av?!kY2ArK?p*;Qh_Nsp^V%@B(oe5 zir8_t3<%n&qPU;ZxlF6xONQ^)JoNhazURGP_TDdj_ZR<1uX*h&n=n_!$??hc>o>a9 z65=r?LYlTQZ3!YJ2Q0Mi$x|}XXuyZgtgzk-Hu67#kNlbaYpF@UCx!yVdp zv1vl50qTu4kxA7Ao{Z*5Cgx;NiKGbm zMKmD=(VkG0KzeYI;**R>n9^xkyvVx&Oj`G1a`PP7gH#OTCLyv9(nLlREv&!xYE8=z z5hqPRH>kUNBN`o6dY?uvt`$RN>GLIhmQ&c-8RT^f-L5YmRN!}q9oyZZjq1**y?*Zz zcgp(TwcCnRwzCggt*zsOBqBN5V-*^cJDf>j4hUReoP42#z5{_-&*R1|1V4e#(rhtb z#$@6&ri4ah1$@C<-}$b$zw6mgKiT&km0iCw3%#j@;B){@J2TCBu2oAM#=-u4f}UiJ zV#{P0IQW|mL~M{b^GzGi)7zipS&zYgBVFj^5fO<$y2Kf`v-4++nc}e3*Y^_e$Vgz+kfM4 z{k6aOfuH`F53b@dA{L8FO#mtGDG^Gc3Q~fodt%Oqn2b!D$(7tElMKP zMU+rD=JPotM5shcvSgp)2>`|HtH1L7-~5}u`JL~4_k$1KzrR0Ut-6!Lqid@dQ%c$O zM^!)Q~lLH#l<&3m-XMkxHsw z#)-rp?(_YFOY^j015;23r&DjTOAdw8Ds6+tHZnZq`*3IWm3CR~kQV?+I1tRWZ zSoJ{bz)UTY%3jfZjYLjhYPR^pF+W1d^bnKo6AY2~b3b znj{xfcfuh-8Qo^eo(vR<(4k84vNvODX-H?D@jjRp^Vwy#K##0<7a}RO`fYf&lZ8oE z*5zC{AgEIIvq%xmPkC8*bb}?P048yhkl?08sVhlg@We(XIRk{sbs_q;$^hQhP{V1r zu06IUq!6^GQ0zRr9?qC232P`pa?XgI9q$Xj>UDZW` zGnGx32F??S;vldL^I1Ac)~s;2unS#Wsds(TlGNa7)d1al-uvYj4)&gU?io6}cmk2- za-|{!HRtdQCn1=sS+HPcW@=U4+Eu})(z5DnKbT*v z1MzCYF^&!}u^`--KbYb}vU;mvm?L9VtUsq%UsT`(nPLx6MYD(v&`cpx)bcs=AB2en zsM7RUg>?AhwWa!nX0f<(>Hqrse$Ti3&TspPfBY~1rw{z~|NZa(&6AVs0Oora7GlSu z5@n@6m#}17u<=DJN6RHs0~Ix-K8ZDSsuC_qIOGLHS+vPLB~O+@$+}u>106|Jy^kE& zVzzs#DO`tfo*2Ajj^=|vGab|6mU71HenlDU4Q_UxGT@n)mk&*Pu)gxf`Euq%ciQT( z6LeP3*4&rwRK%Fn_Sr`88|sOj$AetF_V0PhsiW~(ddt(^<<9!BefN2vKUFL|Z;L$T z{L4~CYA{TD0NbWpgc)*5*KS-(eUIX`l$H3|AxniGU~o^2H9xn4 zP?2IGlXq0Bc64KvmMJ~4ZqF=bu!azdS8-)fFfqeR>&R8tNs!&rtnpk=pO71!R+qY?nppb1Hha7c6p6={Ij!err%p%2LJTml-M z0Y;*g;LcVwIc5zR5t1Y#!02e8RKlgvl#+TtLraLkLu?W}%o@6*X_(kHLJ*Ou6(j(Z zBq?OZ?*xQSgE>=x^nhkvo~tMvE-n;^YqkKBlr3y>bdW0WiX*9NRt74>CC8R4nHy=K zGe@yZ>Pk>WB1+mO2#~CJ85SXzIX*>DMAD2gn>ODDbJLjmtP{3?uN76)zl@iJ6o-#yp<_ytFby5Z5 zO(X;e9$k%4hl;SL%+;388N{?X#tDG8yy15!w&LSO`|bw3OrbI)D`2VZjBh&XOE<$2UKD z^XC4+yqUf4SAF%@{MujrZ$9{Y{^XzfQ~%_j|AXc6%_T5z_hqj+AeO6sW?>bhAKg^g zrGtytkFJ}8VnIl;!0P3I64zjyL)pN_z3+Rvo0;b1RC#Yil|}a>00#kP6r;waP&H@k zrkWc#Y;z6O5##U~ZhNu3WKbce{y6K#(>s!<-5L&=_HmmaO>Nw71Kpi}q;}kS8btdn zlyzKw>apDZh@3toyK2~I^;CK7{H;uGnclN~yz_;&NYAay9pLMiEMdOXLe@=qBEu2@ z6QZ4W_uQF0dQvYUe!jnA*edXwtAk2~f{xX48ARbKBH9?8o^qxdT^`-c?Z56-kACa7 z{-@vkE#Lf_M_#q+S2quDT)TF)k8T206Qu@=F+miWCn865Ve(X#YEIfZumKe>z$6A4I8GbB(|6{SeQ?5e72xzr<76&?IMMRo1i$k_p_k$dS|K|=!>@#M;gE5t{ zIRM!8ItTgSGlwvT*z%LsrrpFk@Y-2!*}LtUw=Uj7Be2$(Y#*NQsXL%2|9;BL|Gm$c zM7IT+Prp1N3OnwdILl`&*y!}n@{*K@I z?Z4*N{`yxu^3c_*FFg6wCk~H}MX3@j1geOHu$cF&m70o*LcCJF0++^MV^ZE@x;dQR zf>Sa$dGq@AYkpj{{_HCyH2^}L0Ogr1wYU?A*&I|LL3BlrDK$-daBu*COrTPn3MAJ& z%p-qNsHDCp&ofs(mr8&}VKC_uRg5aCiJ)~z(do^s_dOg?58*~(mjYZV(MiTU4U>~p zIK?QEkO8bv5FAcePy%#_3YFqW<}J-zo4KHMXKNJDqcn*$1>GYpr*KrSDKAOFM3S@E z*aL8(dd}WNLTZ?qvaG%A&C`*Sw&#%VQ)jO-k3a>O6rqob8X-75)C z6+o6=fkNbpHO%M`iD4*!$)vB+-1=vl{F1D;;0RvFPs7PW1+I@^zla&-o{1;;U?T`BE8j#DI3R=ZLKN(yOaK$=lsU{IafP7>o4zG zcuS^87+<9jmy}Y~#*;!($_{WYKlAKg?7h@EPJCxponj{fa2b8M_gFsTG zQmD+vN)n+BJpx8SVuFY{s4i)k1zG+AklCbVb}djcZ@VZx$q<|P(%+dLQdn8%m@RAj@hatRFJ5k%LDuCpVDLjOD-~ z{pQ|cZ?V|xW1n+CC+m-K}snRIp$1F36$03G*whsFIll% zbn>dE42$fr$)D09szjHEKTXIW0mI0^xj&4Xfv zIiTEO;5GyytOJwjQr`Hv2I8lXX6WPEls-S`+_`XWvz$j**xmR!o{_B|Q|h;VZ9QJp zZ6WW?(fnLP?dN{qQ*V(|NA}-K+5YZWC*EAYzWeRR<+VvnPb=F?apwb*tE@Bwyu*#^ zGOb7PJO8ae%4LvncTa^6h$wR?uIU04Kq#zUbyTQ;q9!1;5k#116dcDD&;xk%^>6+5 z|NPs(;TwMA0}otTEtj8o{NqQ*$069PZA^@S_eoWkCnq9eA+(`+@csvnPmUo7X6~s# zm^#|y7*wJe?qv&93co1^r=kQ*HM+y;DV;2rp3+I5 zf++$l1OTccVhVBkdc=ofSqe{{;%&-#p93X8qCp*uAsL}bA#s(g1rB?D@TdRX)1Q7i zNDO2vI-5xd+KOth(6$R}+r@0JF>9K6Xe4NBrmC$4F_~GTQM3^u8Wj-XB7l;^~i6)XjDKo1$J)5XI0MAB2qI3%23iSlDN%+6pD7(oD zcOFh{AkJ0iS!Ig8*Pq>m_J_r}Sq%ORC2O66?caL2xcJ|-RVwbY@cUEHay3KDscd2QrhBxYcpyE2Add_lGPvw6(9gl zPB3QrNQxk*G0Kk%M04yK(d-2qLTH*MgvQJ)gdC%=0%MdsW!alss;SDDL1B!GQn7yR z>je7`%yv|@)HfVIVp)Qdx;AFR0DISPZWgYXB?M0{H92d?G+$ik`jZ}_bf-}k2rjn8n|`%{$4uo?m4C` z5>yqc1%xUzhm!JyP0_3LeDeA`aO=qZwk}PsbM4ks?;M8jjzRoJr=}g)y!lQL%XI5t z{e{OjtkzjXC1P6!6lXLr_Kt%*HrZldyJvD@ZMw>4KYy7(`msM;KXs0$c3(J!KG)+7 zmxRq~HX!f%l0SoFuiursF}0FevzXak)7e~sXIwkILuWt1&ExaV$&FVT=b>PDyQ1GI z^e}s1Ihj)Qzm&6#^w{PHXTMs_0Yim?IdO=2H{_B~p9|8tK&^RtgXlhdmj zpg;o&Tg<}Ve7-l|-hf+3}(H74a) z&ZNKVl(Bkg%O;5$iQG17U&r^OyT_pF+)>L`C$QtvZ7{aaGy~k(l_{W^o*fnF*$}2W z)|A@^Rk6F5d5{M?V@Rin<~ZT3!41{2?jVVPNn8ukEP>mJ!MJ+>$75>~TsxSZl+Rx8 z&2F7pl~VllM{7b9LzpZu(wV?Sl30~j%lnBTgeHV`)`q5OL!%Zu zKx9Yo%7ChfF)_W$eUqwKslElnjGU^fhKIJk+K5bw7gVkzFJdPJTzO9iQ*@R2d_Tp+ zoUb4YY^e|a;D&L+7oxi z=Va^e_SNZpxb0Uy<>cnrpWdr+s!m164Sc%M&^CH~8UIfE$%5Zro+86kA75qt`Yrg= z&hNMl-?#ow7s;fN0jrhsLnxASO}KN54KIH=g9DD+dby1Et%r>oh#`t@hH&>7;}itv zJzJ#-kaY%`N=fms^MFPgsA~!TC|IJy(gD2c!B>6rH+}Q3`3+zH_P2k52tWSB$KtYU z+R%p9LLiW01kgoKeWw;?&CFD_(MXSdJUTkOaN(jS2UNAX83?LKTtu18skD)kWVmt6 zq9fdxW|@6dTT!J*kTE?8nNms~`>tE{eb@CVrIdP)o;;?+5JDo8yNS%_3*;cb6sJ*o z$q~J)s55?~(E;r9rvwl%FsVp%F->A7ju7Zhfl;F{yNY_Vf6M_u@)d0gEb&yQb6mz}oRSEq2Z#mbo@WD_0tVp-_UQCCsALM=L; ztudb{qN*7;*BK`Ol(N|0Yn$fkwd;L6BGI%9RgHc3%+pWq?OpiQ zzvfrH=e_Uwzz6>N5B|WPdH(R3zV87nX8VoJyS~ezh@Hukmmr){IEg|@B=PE=K1K+l zNXdFqbF^lGM^tml@!~%)mAwiYTr7F|>1}-`TIBGjl-rl!?yy}J(SPbyTAfq#>k6b|y1Zv~ ztB}R>fQC{fk}jDNI*O`!gKu9qjLg%NH-rE?j!((qiwfy(|0s^Tomb!J-LaZU$|jfSJv^2GqU> znY5QkLGRijIaNToh`Li;MLfrM6u6Tf1$39D5qNY6v!|)5#KxPXuF0Vpus9$YwIeBW z_9%fmNRvs6~KgQ<*YZ~b^TCF4-fM7S--6JeMI)(bFX zT-s{;mdGBbJh)!L6r4>%?rm@)PG9e(v#3)m*|?B-2Mc!2=q+!QkGXF}a|j|4Nrc9f z8mOBg9o~KAq2rrJ5cHk^Wc2Q-Se|$dUBa3pbfQ%OFj&uIV2ll+f0N+nlSMZ?Ro9ds ztX2U-w38gwC~N4C1>1f+u?iY!3V zRZM{@gdkHx!7!$0&7x`l*M8SugFVs26sPE8RN;Pdc>ShRG|Xr7uIm_APH&nS$dlv4 z)$(NT;KFzQ{_py_-|%&R{?GmSzxr4I`pxAFC#$1oHVf8}P8b3ZL3N?BCJgD=0chB` zFz0f}0#mj}f>07%Gda=W4b-%Z?sRRk@P|6_ru_Vt^L!_gTKnp^wO%&vUZ*&xRk9_W zpQE)i`?Ps+LI5`!I1m0hWrD3W!mYozRpgYv+gHzMapPlcA5UvLrRJAe5R(bAyrXi) zXFhG75u?aHlCZooWO_gAaiwOP9bNmqJ%pc8?7l-R+D2WufWFv1tph!`X6FKEcXkq}&JxK$HvP5ijphb$Hz>k1q@ahV-I^r3h1lcyd)|us(GmH8HROqEY+griehJ?nx+7qq!z{5RHlu;Tj^M zYQsLUHR&SShJ9kt!A*87Tqic1o+T$YpGAx&0O1xz3T%Jrv~5aZH?B-2jj`SFsd9kz z1DwB8XS1(cGqF#i9698DSzVBwUR#c19 zXh8p>9EfygTe*Rf#;bnxGH$1`L@DxCUR6Ww<9pX|G)4D2t*Inz%{m=p@}$%hQwH(q zvd52@X%m{zG;Px~?W}E@&}1WdD>RyPaYBm>o|)@7ZwXeZut+?&f|qOZ%=%{N#Y$y}+fzL2@7uDYcl3nh6aqRx0y=$YLWRec2@Yr6KjM?9>B z4N>gQZ60>6oZEYB>ua1_09eQSyQ;s%qxs))Xx2AhCd6Y?^dHJ(zEAPmX)?$Lth?P| z-+BLOb*|sc?H{KTyXi0tn^@y$PpHRE!Dq*%+b2EWR1UD{i$sOww?gWN& zG{BIxn@;QLop6xPO3A{>goS4)o^2aNY#`T}#3c7V_StGBm#Ha9Hu!F}1-v`yX0sU} zjD)h$&@L87hlk7l7{EhU9{#Pr?YDo+fAX8(`1&`dlwNrL(^s!vgJ@#`W*`!yh%}9* zl#q=xMF9!zOd*7)lyW!(vjAvvmy{|E1hbEjRwI_GqRQl12iswQL~>7AM;=r1lwuB( z6Dulr4qLi;gt(!~DlDeTcTyXY;WkKpM8rf>q|n=@DPJJFqDdO|c=FJqs4e~T&rSwF zKoSpBm*ViCfKzEP!N{o8-g^_!fgqydSg8bugUq>!9Igln6eI|<-dZR?FEFPFlaWMF zDzu}Ka8-4ICkMp|AVIH+%*m^WvPyBa^s7refd-$-y7>zY4i1`o_Gb6obLF19FFkPA zU3cAeu(!WB*lYLai*`0wK_hC6;tqEa=W5l{8!)CMNKC<`&xSFuoC`Kd3_XaBCX$^T z#F|8hIMIkjI$S|QHPOvgfRyJO%_XS{002S%zCHV#h?+CiJY$8O=NZXO+F1TMjbe{w zlVqNCOQjrD^d#<_+E?erEq&8VU?1mv^riBsEKqWQ2F1mOlZyZ|ZGs@XDN5ZX6u39D zi${lti*`P6RWl_3MT)(s%~6BZcctML?-JDNwy& z2Lw5}r#k-_j0S)$>7G0lgBo|zJ*8E*TAGE>gb>=cY1>)bG_%{fX&XgjiV7Epi#r|eZ8P`548IP08Tg`6 zDpG{177v7MIHL+Di$B@+>*bG@SxsJhQ)5?7zVYVwp3s7g^S4*H^><_Fw{G7hfN#j& zyBpbAM$~-@*1jF3f=nmX+0VU1NIR|P++x7a54C-KMwPO4uxl+$R@o`#JoNJHLEo66 zxBf^QsDI54W?W3$TZNf;0Tp3QWW76_@~8Cfvw_w&+@mM{IzU#-iKs}TGkNU$m^@ah zQ`H{;2r)wr;nl+%C!r}&VJ7o-7L7NqUhC0a*t_T3zU5oL{X2f=+urt;n}>(bKKJQs zSFfv~33CfZ(o+JN%?^}QXrilF?y0Bb1svCGO2gi1*)moDIT0YLgHH$mp{iz@w}c6L zN_`(!tL3Wex>c8rTe7b!3!?%_(E*HPJ;*QvN(6}E!n#{kol-UQvF3?X&N_(MYzCl$ zo&tO-#gIWBV78+8yemOTA;lQM5C!7&h9N3FiHakc7==``lwb}t?kG9U;lkpH8IXYB z7$U0VF{BFUh(R=ZYDy*}OXlVl38N&pAO<8XgcJ!$#AgsTspk>p&#V3X z$wLL^z+Qv9_V@NL9^7;3(mj_h+hq~&z)c5Vhc4;A{L{%~g#NDfP zV2&&$wvit{(4o~8mvP%fYkUw3Pr4MJqQ_61A2)<)fga1DFIB; zMUYY=(RWczkB=n;YeJaKX0!QX);3K$6F~^Ulcbt}TV#w`Ihltnamr+9dk0+ED!W$0 zWJt2)J2+`)K}I1YLf)JO9OjTFG?x7M=FJy?qvQhnQfjqwM?nWCZ1Z8jm}ZqC~=-~^R90@OoGXY^&Zs)cuG~bqCDqB?RNm# zc0RKGEl!!#+oI0)@o9fgYwC8(=nQyz4QI&)FK3yO|0(Yw#{O+~p}?&zzH$Z~**WRA zSk>wMJH5i&Eh8|j+#DGf=WrQ9GG+_ztjPv4ZIfZQPb5363Yj!DDToP~1g1?`^?rEs z8i4oyim&*t-}l|`d+&Q~-hSefkM}7GG2h$wY>*PWoVGh}#yTB2+CeoEotT|-U^=L3 zAgx*_01(T78^v%@vcjFjs$2D4zv{Z!_si9CwOnPqK1c#0P!Tb!BLUPc;zC%)?P7`w zowd&+e;a#Jd0H_%77%oLOtEcqgcNwr$w^ix*AhugMe~4vKH_$S#v~;xY)}MjG$eXM zLaYZ(9WI1Oawrl#xaBMWK9~czAS8&;DK0Q%$dXm>N&z)NX({y~g%}dxggeAR6;A^1 z^5!%F&{Txt;z%>m)EJ^*Cg?Q6p&cY4o&eAF_|&!I{@U>z&jMHg0XPWQ+rzyV?z!i_ zORv25@;&$8`@lW-+^gKvZe&bRl6#C$VKPTnF)m|ot@hrl zo0nWnux#zjoYf4_q^?;ER0u5F(vHwd3PIv7Bbv=0vPFAJnX-=IluVFdt!9Gm*VGtX zXRCKKnFqRb-ZHtjtUtjPncdZuvvI?Y=SFTQ<3YB!tK&nui`5N36o8ESJ8uW(YMh+4 z?Fk^FmWd#6cy#lVPd<6qJ@?b#Nt7aD5M+ys><}^OOpd%*Vn(7kq;B{;pvV>LgEi== z%3pG-n?XHYRTL!>eZ{vBz$Xp|dAC-JM+#IOgjygyci2GA z&*t+cG-k}3p>;qB0ew?`MD9R&w^2ZwxNmNM+*9Tg2a|dMa$8jsLnP16ra8_pQgn)1 zXqU@Xirw{h?p__=lG9a9r2`e1`=?BkcY+Vk^^rC@cG|5wMbYz!K$~mvjINy3uX-x0EvotDh=hyLhr6c~WAaq; z$K+c|l#A@A1eOg!H7G0_KLoMa{_Ny%dD0yN_%FWwcYn|C`>y-%d+_?-t^?lPcbT3At#W1u|f+9kVqBhAIF|lYH)N|H9RW*RgQ@83)PL{{V z$E$7?WAx-DcBF_kjhSInR$Cijnfy}}8d^l0!R9bOFBAAQ>`NdsXi~Ddy>mXB1J#w5 zC4NA;ucmtyRrt%3H2#-c36|zjI&)15BteKw0U9A-3Q}^CLZzo$vIG(F`hChb9_W7! z(%~7-2vrgo2o*AFR9J^zMIF%?A`<{O4NhyI9+Iq-;!yFVD-m=simRwY(L}Yt4p3#I zVu1>H3q;W25u%7MM3)-~H(unEFShvj0=N+Hz&#fpc<8}bT)zC^Lw8@k`<}Zm+%?-@ z%+Lx~kTmc57*}0);$1W)JwgEwp-IVuX(DHCiD1J%(M&-X0g@;rIYgpDBeh_3t=uLv zKpA`vD+9`_eT&Xyo>}Jp2FaR4+n!wJ+NC0@%Fx#E%(-UoZX!8lJZljEWEa~%qYUU_ zG!DNb9zOt*btaRs?jX~z0jS(v$u`>+6AQAa?n7so<*dp8S)4`v3jn zFZ{B*_77g{uDd&+#oi((;&dA!>u9i42vbo=tfTY+RE^4I);HNu)pCM|t4aRwbqUlE z4#g-ZdkLxLjY7s6;jzGCLN&*!kpu{k+$H%*-*>Ckp&SMa^ZmVpy}j9dkz>Q>2J%iQ z0e9E35nQlpR#=zLj?{KK{njD-j;~t3J4ZH%VV=3#P@yRZ~V2R{scWPUbrYO0Q){>-MN|3U20`QK-YHc^UkvpqC(Iq zrjk1_4YNA_J6V$B>>Q?Nc|n=H+QvBS5@LqCWO{1a!f;yF|8CTO%9=V2MxC{?cQNOx z!sFW6bHUYHVXT4Y6T2tS?clHTmTgjt&6gX>X=5l`)!ahrIs?Zf&jrvbubx>jqm%3LK0fTHnS?O?&B{uS%;Y9}ZLP-yzrl#)R_x;K8q+6~|mM162 zC+^8}FdUH(f|-r>Y-=C3EYsnwtL9}Q(yh(8vKudTw|s;Nqc*+}>3m`~%OOrYhYzkF zi8(t8iIUwF>GT!zIb4DOuG%E&fdG#*E!OKQ7C|B1MH5^~G8zJIuo^XmuHrdIDNyHc zQT#ChunsOz)kIgollR6LVX)+YMuEb_oe`_xMoQC1hq}@G08Nn~H3AuVX$}NxLeUf) zR3Rl$sEHyAMzjqTklK<0E5q zin<4#_xoK$QC1r(s@oL_rl2+@l2ocNfz8>HE2-olox{whLUTx*+n&2Dpno)H9{QA> z6}NEnxyz(4BlNtJiq@*Eh&bz&#dGXVO5S0UVrZuhSLmR$PJ|?f118WSY6-yXsw1j> zbRk09hQ9whfA@cV8$lvRd-h6q$7+K z@oECdYHv6U(!eU5$Qe)bJEf2O{sJfqYfhA+B`33WD4{r zThWvEg@|V%4J2rddCUtF-D>&CPdxU@SH1QJfAG)#iZA>X-}}e@$hG6EH*Vet(wdqz zZSO1O_)ntryj6yEqtnue(?L;cSq?d>GKF<(tJ=e0+*m_JMHqNweYd=mP{f?cP;5yy z)3F!;@zx@itz%g~Ki|LJe|y01GqSw8vnr#&H9(>YXyNUP(M5E{fnRV-LaNmWIV ze2j7{g{)QiDZl#!8;^!AfT@KLlKaW=$o@tjc*n4d7P4<|we|cMw6}b$wiAeY;tkRmDU7A`s20dq>_T zy`xY4%ee$Yn00+LZQNZ{BU5nAS=ec$LxJQlgQO&;2^4cdR<%>aa?TQF<5O4WNQ?Pz zuZ;zlvR^?`g3^QrXWK((1W!39Mjgi*P|uSJwziqG-s7k+DwV{n&r;6qB_`m&=-+y@Z`EUGuG_yszB+-4Y@4%TdCrf6*w$ZxUVQNuFOINdZr={W;( zask?Q*7d6=KKb~C3m1RKcYOP6-|*V+`@TQ^<3IgxBfCZqR(&5dP$CGBsyV5$0GyrJB*WCy@ZUgDKHWRgy~=nv96-EZOCmnE(38W!I|?dNEByOEtwoGylq_`HIyx=Ob~^Pkb1bAk19)wEf| z8MEN*=FVO&x9Z_7o1ILQjrj!vba&6WJ|iS6`l5Ry(km7g`elbk`hfj}WAPb6Z$5K0 z)&zszI6MT>TONJK5B!NA_|?DaS6;t*_4%t;CA71~QtAMK7=ZbFKa;4uQPw$>)oM<^ar5xT%^OEY$E(#crf90F8k$B`vjI(^!woL@%O}01u=?MCq_VPuV!YM}#LpXQBy7-JlLF z+I9iS9<$JOQKPsGQ5GN~E-ogL+#6vcpny@5v<*CpqvR*8N#8vyGzlo&mrA%mROrg! z5_`@B9oYmqq0f@8v}+CB3iHmEAq4>_EflTlOagSCx&*x8Po?Hc>km87jCL$R% zYupVPqbuoB5MYi0d+tI)AudT6C`lMFIWB)O97ARFMm}#76TCh$M(p6bx2|D0GteKG zpiI%Ipiq;EG7%IP36#2lmfNBxkd5GkIOw|AhLH5Ql|}OY_@r(3RwpNo28yc%Ft*wp zr_~Ssg+KRC{`J57hOhmGcfI57m+rZ{nKg^{KpZY4(RZEXFg1=OE;;@Zo$dpra`#}t zncYep*{@y%IW+~m?l5M$TPR@OKTrV7vY?=D9ikXjYVj~qEW4$uN|hR=QtPf;rId;< zl4K3Cni&CA%UeUD6oEA)*>`>4$JMG^E?0+#H{024KA$h<^L93y&1NCwIFfL8B*`*> z53WoDx5#3Z47_6e_AFm-LeGa!Ji(kCrc50cx@*Sp9+{xQlpa&c3YW%a5M00dVi&vj zyzk3D@PWViU;o$t)&Kmr{>n*z7__xuqI361aRtIMk4 zEYe%Hj$XxjUo}`zyGGlns~~OX%Ye}N$`GP-K|(JpgZ1nh&JubMqQkeF>Z)b>mcz+) z?e{j2I&*mx0jdJXqOzKf<9h4swU0>deCYAkUE4si({Fu;l@>+FR_%i(5u1ZHr8c`O zpWtYj{NAuRob-895wSjp*N)djmwGf#>B%a%C00G<#3_$XG1GPh8`ym+(3GWmnlQk# zd;9Vg*_yjMQTu7fx6#hrP6XH|G#MBMTI%fk;rnnym90DjT<+*t^*)~wrR~Qvk!74OhH_#Njz~KC=Q@ zwHV(N+Z^Ul>uex!NkUT;)o4?zB~?%)1?kDgwGEilS2tmY z=$^j0`h}ZM+sB@s1NY7Jk$dlY3bN{`sdicRB_gp;KzdJ}&GOkwelh}2!?^F|F za#bN41;qqCiJUjRXH197LoiUq=m?ErWefn-NQfl30feYX4j)}~bp-P^hLA4M48-YV z4uXS_&>I4oAO_^833`c>p~bjR130U-Sb#;pZ?Uy#cv^qIP zaAklAT}4yRMnfN@jj{XbpZ>|8{^_55UCPSTq9&7&JedS%R9G7K!7MRl zIf;1>4pSgljf*yxLq-o}?5ZiwnJZ&h4Aa3Z0Dc&0nVc@LY=@xCt%Fm`*<$wD51!|S zZHT`Hg14KOX_q*7bLVSoKyxrT6l}xO3A7%&QHSe=;nyClWUiYD-CQ}7tJOg{6deWMXh{@&TV+f|0?Qh#xJe(h{QKLQrTGX&Xz zsw$aNhV6g|oKQg|42VEbxJZ-OHEgZX=nMg=R}Cg)M(yA9b>H&+-}im5d;M#lfA+cS zH?LdUh-gZkvxKP;RkO;@Di|+>HODq9Cast<#|-O{yQqnp>SUtcbl za5inLrbV$+sncj1zdkKcY-go*1SIGlJ?7jXDJ5$fQ!Tkti}{KGkfL1jA}W#YQ7EF? zwlh%^NZYg;)J#R>xf|C$@$o0G{>XFx?1%p~$OcALxF@kaE%^r9?15lekek@zyO#vZOAa7m5OjMU`Kmy@;siBhL}u zgyNtwx#U=+F~VIjbGpII?xv*1B<@3#cIcyXW>ctswWltWu_wI)tdEk*N zmtS%J<-6~>bZK#+Z6(BG#^mm{TmqhAOd63iD5QW40cgK7;*cL>GHUjHy{&zinvdrMiiDHW3%(I4?%JFp|9nYNlT*CRhPV zZGyUa@Bo2|Bsc-ph-d5 zt+lE~Ag;P%!w)z;rsVE~3jy&MS0sbA&Xgl`0jk9D;ZYWyQT$YM-~nkuQ&|95bT-Jo z)~X^BNC{>&-G;}wl;!H^=y*2I2JnmdY}U?NGb>g*?hblNK#2@9QPzxF8>#aD1a3+d zt}x}#ERrS2?6M$0?Py^dWab1VK$crDQR}3{>UGG!|NXXw%_(`Jx>6o zwr2Cx_aa2=vFrO)U%e5)A}NnS51bS-xd&BIVf4Je;3`NC#jr;V3`U)K4G9FyAw*Gq zYu9nlU@Jd-g)Qhc{5Ou#DZ0>s!HyVq^nTvHd3tV&&88h(YiFa;JLZaG8(Rxr)^FHs zXsT1+=+-6~8FZm*dwcb0Qp+w&*kR(Wi$POc^8wkNIt;S?Em`rDKv)xIOknicLwef- zKETcT})EY5l!EL)hrF-kvqu)5l~oFHWm&SZ`Cqs!WtN=eUue`)XWPknNA za%>iw(8LrWVxsOYsD_ELEn0ciyy@@VvO7FJIyySKd3ZC$)P&H? z3TnpyuO~xWiAi3G^(P( zVoZlehtEC#%(Krv^Vr8f{?W%i`mx79adPAM`q7PNpZX+#1VNwF1PMt6i7tsMfhlTZ z(IaT2oH6G=H%oBoiD2wHwV=H-KodPEoC?nvUiy?m#=?P&0)@CDTfrl{0SGlGN7Zbq zp=$0#HhWKNM$tP|5R)__JyLK@LI|AP zVA(q+vWSy5^%*=(Q?pL8H`&tJcdyg^9e18~>3oGkgHUpe{SqK1(!~T2iuE}>zez|6 z5jkl0<_8GZq0&b7A%>(_b*tbaf%KG;DRP`$6HNddVhGy0rai||>dmnN;?1M(=Ft)_ z68O|Px|&DD04hvHLTH+%QPq$=fICfQ{ieT+;gdP=>!N1d)%P29yF)p$G^$IBwrZ0Da%ZqjYj|(jK<6S-Y4o=8JjT&f2yOO@L@hF-0dl_EEG1 z&IAT#DiyDAeO#t!Xh4qJ#tIxvfKb&y^z5MHbXW+42U8_(UcY*Bc=V0m{7si1xcsf( z@~zKbeQLEloVWYItm{@rW6BJgOrbUL`B_-;+HUvKpFh9ld=<0o}Ux#guu5h+;MdJtuF<&?W~_zn**CSPfm@f zYrtNUJM*Mib34WsojF6Q!TJDlpo!y0Atv>o{eo2_9j$Q2-mcYf8fd=LvJM)X-Hz!(;4LXQTgh;n`qD5t{g2xc?1FIo!bbfm1Gw5EorI`X{7Nh(YY zhle+3?Yxmj8XoN3b^Z9}aesX2!aaZX&;HPF|JH9kIyw2&C!TQj+BB*mrbrMO3kiyr z!q`NEQt&v`q+RA()9E_36g->rZ|9)1P?a z@sE7uBOm?vN1yuCQ_ns7%(6S)c-5eDQJ2_tf|8F&$!H>xG^6$w5ur_he!khu1Z7I< zF2U%8xFn0gn;2=0gF@02Ip~jSvN&5>RFY5?GMT7@H7p*0l#OiZ3F4X*Dh$;DL0N2C zqy{)rzYG|-I}E$PS^1h6Ln@d{R=& zDJV2rl%!Uef=hlOVFvHC=y`(zAV@ctQUO_4@oghyR`vP7%!+8f zi&?%bWu1pk%5TE0-@{xpLnt9(u(?4?S?-eGgo^=bnRugZZp=_pa+x zOtD|49GuK!qQH@|g}szqO+{rQgFEyja-|4J(+u|&BBp8<+-VlFJ?E-hb=~Ut=%{Ji z#e6=WFZK`iXR}!_%X@ZN3dpwUMOjr@Zra)^#HT z#x5DPnzo&Zx%)i!DS2{FDQ1%=df6S8;&PrV$*)cWJaIJLsC-_eMk5^!j8qFzD?K?& z$#^=tUiZ#CUzvimi3mTT8ZRTVJX>0qGk>m~m$j*~F(l(o;`HJgO55Sgx}zCRiI4!3 zlnLwd2G)@v}S4<8`*hwqlUHnWb%%6OKYoZXHJ~$BBvkk?&*$xol8rN<= z_vD&5#N48*GI`{To>aU$NM)#p)91>vCUeZk3OrDV4BqQ9^CAKax zC^|BzxV!Zhn?59qfNBY$fTW_?<{1ECPA^{7H9}jmZFg$baa%`65c18xl`PuB6tUFsSu~DL)B7DjY$`w7A0DOlTW1L)LQ<>w9#=Wwjv}Be7b(fEQIs{BP3GJOxz8B^$&R5Vjxdl?a%W7vJ5Nqd zR?B4whu3dhUzD=fgwTXG8_F|79};Aao`yl?yavm$jt(cX+1gnaS|Za3r5O$<5Y_}H zkABiNO&2>A`Pj!k{zYH>MgRT({eSp_fAA0e%YXHcPWt0c7Bgu&^vH>ws<&_XQngANUkF$6t5P$IF?L;dbbNStcyzKnS*=!d4^7iHjhcyQ$r3&Y0Wz*c zspM!R(s{@ww^f53=)Ut@FHEr88!9sxh)oWKj^ob9B=ofze!yo>o z5C77KpMB=p8#k|GJxHCQp+YDc;O-V0htkNWH8B*5jHXU|7mUz?=Bp=iO^nz|~9ewPCYafZQdDXc0JTpbNlJqi74v z#REe^Boyiv#Yxg31ZD_v?xAaw^eP60MwP(eiR!`zOkhY{iKh&w9M}i$TQqNd?L%*Q z^wBrI`r#{gU2H7PRMN?D>W=9##oj!cK$5WO&6!fpKt^a#=FpHi0=r~Mf+$g9K!wDD zu~1@;NL30-2|-gpMhVa)2@Jc4=jNFzU2n@kkvXS6ulqrg-MxynEWn+uI2R`!L^}qX%fB5IGbq$a#tYB{F zQ`W3YR@EniCQszvV$UP`*rhxlJ-HbumgD(2T#~{lP8YQjp>Z&bB+05kt-6zHNk~FP z(;9NfCa?fRvawf{gEOK};_7sFB<@g7AYgI-1NXo3)vtcj8(#mmx4iX@kG}EBefM3s za1dj^TCMuNU!E+Tu7Z?MRW~gB2_W4pOp#FLKxMl&uXq)ALf|?P9Um z+uK_#7ERk`-A#$PP~uq*Ly$W#{q)*P+{=b1ANa6N3~feOFV#70eC;~_*9NI#j`dL*M2G2frnwN^3cPZ9D2eZGN6vwkS+B z6L3$aT7bFd0I~$&?ishUlDtw;Re1|E4}bm})YMFXM49im-O=(So&flxfAstR%isS8 z4v$Wrdh!WX+gr@~6rC`EWa>&v@immH{w_0a6r@?-d=iLPRa7ne?R2Zvjhi=a-n@By za-3o!sisY6a%h2KLV>zuCM2W?3x($(dCsZ|&ml8%2L}B-hrtu~gq&{Lbg{Q@W}BLJBw(AXvu?VK%zki=+^NQB~?nxj~I06a%i z0kwui1SpVVpDyF7$d>C=7iua>v2lY_N~k;*Obe(?966E*1UZZgh3euel%(D$VuFb# zlUBqX;wcJDgkB^RA}ih;jjGepq^6r`P?sf>#@-d(3LtO+c&Npj-tg+TzwQmMe#PYn z@4s&`lLgSPuCMx@-7>|_s0v7k5&@F{&)LsZoiIxP5=9)aL_)N2q`7FHGYOTDfy0ui z+=C?qb@{}*{726si|34vz`2YQ5A3g@+g^TSfE}@L8E+`_zkRakEDMXAN z#1sNE6Q!smMkGKl-Le-~EnvzVn^$dczyvc<+7pJG@^WA08g{ zU34ZDh#E$V4+?TtY8TCV6JZIMP+*4Eumha9a%Ls8dzpB_!rtEA{{G&4vDY?1&Ad8t z5MXqu=*^ z|L`CE9RNZ14ZiYdb?B?ktxRtxB?ux2S_lVw`}+q6O%q~_AaVk5)uOe^LCvxPzQnrE zd@QGQ%8_>pZf6!_Sl!yDCht;MCPvUcv7#^IlNI~xuzWZe#F%rf(ltb|E*OwB4OM-z z=1aNuT{xMy)n0!`Bb%Qv3kE|XfLhab{lm4j8`i5_YoWO458}`6vO@teHJ?9Exg}Cx z>mjzrW#~#K2)p`vi_VOcBl~o{?7;n{mo-^(W7@0_;ca904NIqWtEcUeTbIr_%6kJn zad%ZQZTi@mWmhwhP}LmaH*d1}u#$m6!Kh~0E+qqZRW(%+5w$RHj}MPxS^@Z>AN+H_ z>pOne)fZlT_Ua3vX%wmocfuqfD-vtC+-jvh>3!X_%L@OBxz#KOT(=PD-gn*2!<#p6 z9vvSa^?fgbCNyRyDrQZ_>vc`%aU9rHR;D8>SpWecDrP!B|C9s5%;-`P&7k~a2AOHB{&tHFjP_7Gduy|Dy2$+gG145*1U!ed* z9UdrDdV~ce50of^*o3x^ooIj)W~%D8Q21S!AN>8__r1UETfXt0MRU8;>6den&ONEZp>PEk>(i>f1);DK6#kt2tz0MtaZPuC%H$w>i} zP8D@9IF@8kCq%sH>1og?M4~`w&?K%fM>1HFWUz$#m*z+!;yy~F!|E?Ocqp@#3AT#98J1 zz&$% zO@u)`N}-H0MH6ev)bSlF4c&~0DQo_7bq@*vO8!t0f#j{(qOvS|mjs>ceYrlE&Ff$D z+Ande_Cf?m0d@UY;DDthzpCixFf8m+a_3Qk)us)0t9eTT??$`H@w7 zIrntkHO(t6-%KLLUPLU|Vz$^n*k3Fbp=ok#`JAwtIcCeipw{5~Wb*9R>#gC-ffD3d z6jYpy?rI^Z#26DLSkw1iGYb#B;*p>GnV2?E>WV8;;JTnA5FzV zSavJPsssfDo_sN1T)cR3Hk)UQ_MwZWQrN$WilXXMC8taC5-yV^L;0}Zg5)XhSEQKS zYnULi1WBfs^t74$YKhG+gI(zq?pN_I!#|Ot)Ss%-rV~tR;;y2s%_3Qq5TqVBz&>XA zbQthaQks6VN@uF@CX+dxv4ujUcmKcEd!16qQmqrEj zM2}Dj<{;AVdP|PNS*;0GmA<#P-_B+)JpY`unCs%=T^FBx`l$Po8`T`{*bM zSh9t?qBz4iogz&W0xf!MLYU8H*KXWQ=nvY9fBCQem9P8tzwYU$pL_Ae=Y!eaVz28v z&uJA48?52YMYcY2UE+gZQe9smgJxj4THU;HRTYA<@0+F}Id9v8gMAWx-#`8IGe7k+KmC(G z@e?2V*`N9Jr=LCQZVsd0qLIcbg_4|{mF}!Cayp%yt^m{=uFj+g?hb*tgHBaAOd6^q zppgS_X7^rt$CrG?@BIVc`Q=~qt_!W5cRGD86tSSC}LbjcLh#>3&7oiS6#XI=$l{tj@P{YRj+&K z-h+dXR;&J)U5v}6cgqxe6*qB#8j@0oglzhst!P5Xu?+JTKz0+*Om2$K897={b$0Wq zTB;1>I{nH+S!rBFO}EtTl)aHHzo4x-wqDm1pilYjwgbue8D`Pbxw_GMbm-IU!lI=< z^X!w$qhqx|m@&da*2L23CiJj^%=Ry)#odoR{>(r4;UD|S=Z+76qf7VBZrr?SoF(Z@ z9f=fGHCT$vNXwRs9yAb1vLSfN!E$AocLWU~5jk9oY-5FCSXf{97OyND|5mJ@i)wKa zk{ql>B%gr@L~|l*CdPghCz|+s4laN7SAX?a|Hr@b?eBQo#e42utybOY_~y->hBi-(82iRd-)I$fC#_Fp#2w zK&{}S)8}iho0Iw{{}idF67&i{^45En0@vrjnm^!1D_hl{M#A#R3UzR%%6n+38n*4e zVbCy)1`21?cUqa+$7~2!YvTH5-_9<@w8?fx6r14twF=Jw@Mpc*Ie~k*c}l#7{tV=z z;K)gI7fg=1`5dOtkyO)Z2AEC-!s_D$7no(rJ0HfO3%$*l>}gu@#*fcV;nU;CH-r~k)$-}9d5 zo_^+qYuBu8Ll*M~+sLw9IjAzK9boByUVj;kMFRu&7CsRQ#AH`_%6zzn6|fD*}kaa#BTC zF*>OtoubvfS$DLwU?SJ;4|Mpiucx5kqUImtsxnU*NK&d%Z zi_skdB<^3@x89TY(kD@iwz6f@=P=1F%pnPp2qF<`K+KM(a7u7Vpm>mZN-If7ft9sW zk)t&VBE50xsD_-qiFCGFS(_9eRi#ps)d>ycFG=Po-L54sYw-ajU0_~x?Oq)K6?B>y zQ%Orsb%W9zt|iPnl2MaozziA1lF?DEawBHu)05e7mLlrnn)eP|5nQRFrmE59?sRgJ zV&~C;7MKCAyx2VYs@K2c-EVyLLznN~zc3Hf82j#~EPJvScj=QFgi)wK2Wdo{gc*x) zl}(kjS{X2JkLGNqAix|0equO_I(q9Uazf(9Fj;31>w%2;MDKpuottO4MtR2=f16t7 zQ|jEs4JwIKs7o(BI-gybw=SQ4?x~Zb<-AFNC0A&pIp(&yq{cNlLkGkBf*xFY`q}IM z=tqA1-+kv0p+(C<-{}Ad7X5IiiXP)X^7jBnO1zmU5nf%GN71 zos2xz5Xg>qA7TCaMldF-WsDqgkZ|jj3=JtBG$et!&{TR6q@|yD-LJgwo`-(r*L=~}$@sY!`Ffk@6v(#L2b zp=lTMSv#9GO*@;-+9n67q;ra@roe9s!Ztw1aGD$Uq51;ky$7e5io2_bL$h^@nLYH1 zhkoM6f9kux^SgiSr+!$_?#<^8XL679tZ;D8dNhY;Q$VK^oVSa6?zww5pMy-vrvsk5 zIjXfpN*cA27nj3It521?N;IU&?{O?kj0ho_p?u%>F{TvzYHE}6-gy=qSe+<})l;Pt zk|}-O9~tIVZF~Cd2AhrCyn~vYn%R4uaKv!u2$r{I^yHFMYh4UNM^?Befh2cXSI=)% zGWnT>oE>0u8e+x>0-T^ z^VhHmp0{=|q%!l(u~`4sJ4UK*v9E!Ct)ZCKWQWmGjGLD#ff~)?003&ztyX5CX`9t@ zsTNdh#pNO_l1D&Nim{K(jF3oDD8mqjATMB7wrmmDHgjv_#jDQ)c-LFM=r8`I|M8vg zeA`n`JazrrwfTI}&fAnyHN`0rBu8N$Z z%C;-naxafh(eLaK+)D#>I0+Q8mT5!Q)j<%XQRB&Km1)(%;=;XG?mbxSKmOzsKmL>-&D)%N@42Umh`raE zbG{#I?Hv*4-W2f0dq1q5QrtKZJ9e}7YQFi+IlpN_oU?j3cIMnY_uYN}-FJTBpZm%$ z{^GYCn>3TpGT`12XOM6q$;GL27lV(`Og4kJZaU9HxmwinUnm095CRy%VFD>o*4=?f z#F3GqYU1t?b(j^g7ANo_{G#!R6^0c`OvHlp0`_0(BPH^PTWI37V$#`AZFJF9dK0OFAn2UHO3J!N>s5_Av zoY{$I#Leiat*sx-`9mN7#DDm;KX?&fKzKwX#@U=Ly9cLiPLezkU@QPR!zf7ZOll^P zIFyVTFmW@k9q@3AAG(D<)^a+SS%;C#;vEf{A>8|%7?emGmMFrpq~pWDsmt>;>qj%`E2( zfZ!5h*_x)AOeRfiSh!qm6>6YEx47EJdO*3{v<*`5G9z80in?GM3o686C<&50LI)r+ocGu0Cj&FzB)_o!5 zxni@qo1yjI5^1Rk3z(Eh7So42MWFYQ{UemjV3A zFZt8|&;RWo+;`u-+uK+6r~4FQ42`?0FT(AL;kpvNw$k%zmnq4y#4Jq25<^Hi&!*G8 zy}jwdL6;H}v2ZEYU2<<~EX**)95R{u-cJNGXJ*UFQgyD>+}wf$C$pqsJerI*HrFS@ z{A(Zj&p-JSAN)_h`pY*C7LhOn8A&5e@G|cg#843(1DK!FprIkO2-H; z#wHe&`+63j40I5QGMBYD-b7gc_|unu<9Gky_nx`93q%0i1X6{x)P&qRD3P11Q3yof zA`pq}D()Gm@nRt7Od6IJp<6@to9_0HyBwA^!uuar&^!c6769fz_H^dNnZ5npq!wh9 zI8pLI3^L}R=3O__9=>m_pZL7bee>Ji_V!o3@@2=4ZApkJ#i+` zrkih|UxBH}z`I#i%_*5_@$JSK#^dp5G@6XZA;cI1QBm=!P`Ki|{we!sXvf}%d=m!f zNhW3@GF5eVr%?#=oG0Va>C@+a_be@-N5({|M!o1{jfI7c zn(^^t$H(Kbdo2@N&ca+Q=>7_*k0Kvl3)UX^_Fi$w-3OX?AjayX>JEZ1yL$*>2y;gt z2|Gaf^16(V9jLh87JNK>QRvYNz^{S3x+r7y(T zFu0L={}L_jv@%Vs7+)(pIcgAj5$Pye;cjZqU?+9wQRw!k%tR8*O^8y;MdS;$EPL+` zt)w4U`8xBBwKa=$W9J%xcmA2L{_gMoU+%o;j;oiq4-WPS)Jz&vg_Cok6;_=COYJuF z-Jx?A_E4l|cADzW&d%Q6Ufa%d&P*gB)L9q32~PddmQrGtMlNc56h|dPQ|1u7%=uOI z5$1VgV`DsCXSLt@-4Fl35B|`ve&|<*OWg=-6hp070dp;4A!YWdF9t0q6vUqGT}&Q0 zocKP>-EJOGBd^U|871yrz#%kfJ3Dpiw!81S@18r)-*?~3-|^?Z{Grcz`6y5*S`eQ_ z8%;3IWCXH8xE2G(laP>LlB3AM*S+hVk34k$^~+a~_w&JY-lg5?LF%%a&D%7eck|rl zE=?_^E_F%UHqB>kJ5SSONzp3iy^_8G+5`IX2?3$J;n;DNHZNb8qYAk=h_vKd7PZJC zpT@);MS@b_^-92tmk^gyW|zPvuioIq;CUj6Fdz_I!Q$o|pis_YYy>v3f`VBEFfJ;W zA{ca`3<%^(rSw#V@qiIG>ME}0OeMTt7+sf-Zfs>&OO`x4GOOssLZUH5O;etAfC6LS zT*Q5M-Syg+-+SK!ci(>E$a;vxmiDeAYxWuDQx}RV96L%uIKhM^!A3-L*M=pV2lkvP z#A-7b4I{tDcl~lc%nn5{vscz%#_l(73(dVU8QO9n+Dp&)G+>BZetXOQdCQMhSEza} z2TI;TrWOg4jWHRvFJG9?XB+~1MKm?>AUyOT4iA`^twT}nk?FTO~JvylbzKHFxwz3U^uOE=davfXSg z^+#FwkcT#_ArtNm$84z%btr*D(|EEF7!VL3Y}w}Np#M2P^zw(k@NHlCrZ>Fl_Pg#} z+nD5JZ8y(t+jcF$%y5TyCa*&$??74`@P@&_r4Rr`eehB zJDDcUoEnU@%vc5x)Ge^6D-&;SZmqAc$Jm%^ZL$GH_oY$|PF7bxuO$f=|1Su-2*~yK zL_G~&@46!IIv*}V%y}qqh+<+_GoeTP3oyFOI1cuBZy=OUOQ4OH$R9J!Ih(uXQe(=p z8LMegWkv~+TAb7u&wCL?<5=9o;(7){yE-Lm>ciRFL_orF(av?0RJCmsl1dqP?n@V#(imOSU%ND9gAM# z{qjBiA+r`Oy&F6*FJ^z#&x{VD>1=9deUUyaW{4p|pl569JP9UeWsC0W z0J#vWKnQWXerjvu#9jBl{GPiWeDK~kzV#h%dc&iW$nmobvjYHVf=NQDWoW%~#vBli zFpX{z`D^~%7rx~UZ$fu1Y6tEnG34x-3E5qUomxZcvStNQn>){%T(kOg?p^CQrnBAY zY=3wE#@_z!!QOtmx3}NT=X#I;paakcTht8D(#aU5#EUx|-6kVpOX4H-mZfm}LXHfof7oiha{GVim*sR$ASO=U0a%yyt)rVHyuW*pa?0*XnVrjBg%F4-XI1U2 zmxn)l>W)Vreck7M-sisdHIJM+bK2axuFWZT-8`$o3}BWjSXQAs!7~HG?lYIW1T{Vm9*-LfdsPG^26b z&Ybzoxij;F`L}-4H~r|peLsNp@n+5mD9k~D%e51$tB_uZ`zz@@u^ z%lgzSW1=MdGew6HFodd`gHR$+?IMH`eIm)y-XG#Cv? zeer1Anb?Qs>?yfE&WHP-_hB_^3ip(gs^zSjwWsQ_AoMBrpy;%Cod6w;){Rk|25}7x>fCtg^=S*F&KlP0^D+- z(~`~B`(}CruWz>{a68B#_vh)Y+p@axN{svR>3ro1`wO~NlPr+qt?&BgTlmaBxaC2X zBDt6FI{;eh5!Ino;=6`*1AV_<=~s2N8pZ{%Vh7cAh?%^IHkS4ROtYGDp!s~3VE`E6 z^s$q7+#J#c0QXX)uP(SfjwIuqQzRleKKkyo#cqX3_cxE<7B({NDAi1sX;jXcl8+9b~y;>d6N zoCp5$SAKD5=Q-_1>oR3>5)hHXS)?ISb9R`7F{t)iM<8*Mt*lDQE!5_^*X8-a^m^N- zgX#8kesE)Nd%8d0J=ksM2YUxM_Pd!ufsFdfWi|&&|0M`OMR`wH5>i&t=s}ejW@3>z z1MEGorDUPPep7=hv=I=2G=dx@AyrH?swj*>FcLPcYIvN~MiQJ0(Gr zECrCmGiS_e{6Cn40$|Q8u36$JOu~4U=Bb-I!O7rFbaP6KhN6$SQOj&@)*fgaqXTdo z;r_eNJoLc5FT4BRyHB6ox-IhlH07k-)aMkzL`C)o6xfKQ41z-c zd1b;%0a}z9%Sqh=Np_VYGr1JJQmP55Auy78WXk5kFk=E-GUrA^7jl!O3%SW5g&cF} zLT)r9$x%ZmsnI4$7tmzy0yWvYz{C3#DArFb1rFJBAkjYbce&Tz!~)e2NhWuLs1s;ThQ&zSR6s@?05xXH3T8`*B|0S{Qui2IM9bupHIs<2Ml!xWv*#{fy|{gO zXYa<|eml=yVr%!iS(n?ayYn;$975vmoGmlN>NOK1>rKENJ(9U;N?BQc4y~$76ZvO~ z<2|%Qm!+LRO6IP&9XYkTd!zMs*qts*8k=$ zZ+qL@@4xSXBPWiwY2MD$Y&P{GyIUmvs$Ek@?ckOzYCA>tOC)%eZ-Zuaw^Rht-GoCk zYSz})Hn+CM&4`#)bCE$T_q14`m!kj{tMzIJS^mY+(pVHBLI|4G9TEdEPMtpUJOAak zzy2G({)wkQ5wX@pYBe<+TkU!x$l1t+$dFw*FdMCJtZi*>iUfeNs;~f9#Q6=kuCApD zAUQ;YV8nqao9*u0P)8Kz5CSuWAXHp-t`4rXDNKtZ5^-R1;(|D+*0#0fT$4)6RnoqP zFU!DX@IUu(pZX662ELYYB?3{oo+7_njiHL@ZShYHn78G>heX&O4=*mMd^0fc3NQDv zfVQj8_0~xDFkWBW`^68i(%0-4}rV)*$}oZDqGVlyWHW`{tvSMm}U( z6jQ&nmG|WkKonvqLaSzdabjQSe=c1{HIA%b_G)T!8IxYqKgzIm^Mm%lkO2n-K;+S> z+itu2-g_T?Q!MUa!ZgkWabm7FpXKn+K85@C00n#um` zDuBQBEq~{4f7`dlakzZ>YEBwQF`E|Gy)VWrF`-!Ui}{{b6196mysBOnJ-OLzdgI3K z!NHzt20==hr(s(f-DSx3JYDY;C1OU=t}3T92a{B{v}Sj=jJ37V(Gw@z+3e?j_UC@+ zhu-`6GmisUll3?WnzhRb8Hj}BTxLIl2s?RdQ=)Wayw&9{XDyQn2(GTAY>Zmwe33d| zC9aoyNTq&Q;eZfI$xIL9pxKC#tafP`r3OQc;N24?%WuK&q}VnY!pC> zKmt)$Ap&_(SAhsDx^JhXCpxLy<78 zkk}_V_{c?Lh~R`Ky0ygKb#p~G-J2(G=kpr}2RGXJ^q||DwmbVbc5WP8-`(3g=yqBt z&;kY|fJ@>a5DBd`BlygvghIHQM>aENw+s^^brlJ4q99DoXguq3N}ZU3$lyY3aMg}N zh~`e@d-6W>Pa^K&Ww; zL%@nsV%rf@QLzrw|!buwzCNaFC`P%G4BAfF(JDiNI8OAR==F77~_Vrkc9Wi-!z?@#|jy z`nSF13;vtW{}Z>LKWC(~>3lk$nL$$mKm-Y~63|t!yaF{Q4ie0(njv#77p5gXLseCo zI5u%I8Xq}&WNmG&aK@_H2illcV9knK{Lse$de2e;qkX_#Wj{-n8WYdD*~XD0TN_7y z_=n#6Er088I`Uex!NU99Y~mwDs)6HN4(w(&X(nwqXO$E+?~5i1ejD>(5GvsE74st2PUhKpcEshhEYearB=wmACe z`a;B`#`gH~OZl#^OjRq!D{5(~3iI7p$IB8fB&uQoLoND&hNs0nQoWvvM!lyPeQ~La zjvVsbaspFeDRQ#zFx8>2E;ZAl;pSId$3rutm-3c>3hov**s; zdFNfXpF4f;{V%)s{(DZHKIX8$ zYxhN>xP-vd`99$P{n!4rzxVh5z68H?>8hzYA+YoVL;(m>ty}HOX7i#)mk!{4v=8;c z>zZ|XFx|beb1c_Z z7$P$XeRgu~Wg`I~EGjvgB=KUQvyzY5yU5h#?lmVj|Hfbbs?+N+&n`PW_}rC2CJtu= zhYAIAWr%ZG64ec0g_6UvOB7QAR2`*mBC!DAuoeP?0yA-llvziOT4xs9+~%ZNb#Iz> zc5iH7JJ{a2`ohI4+t;?Q@8zu>$XFwy z!Uar$R1GjK(hyc+It-xBRT!!s85y7&JA;yVSi-@xqs+TZoU#RGfD}c|RZEg=0E1lJ zgcxuwktJ{j*N_s3u$zNf6~gA)cmpw!=$^8slygZ8I1b!-`sgFCeEDl%{@@+w&x{*u z+`8FLnjXM9$sJK6oF!)zbBfgrLc~GHBZ;}fpqkW3iK;fI^krlLf`Y`2NQxXDah1v> z5}20=-kv=Liasd82xZ5b7q~!5!+V062QE1aSlVlOWnR3mF`9Z4c3<5Vz`f@I74D3d)c~4C0umY`Yl*VDG-Gp#<253HCu>KK zj*pzWw3~nM13&dEzyJG?hB>x5n>!OTbw(_zMs2?(Mp&ReB6U?1XVM>SNdHP#eNuC5GOk?C6a`W0ISLh3Rl_ITTm3+B1hl z@5Al6Wc2hy97`Q+r9YQ_7bqLFyw?IU7a;BK>Q-*QmZvgvht&uj!vM8=#p zH@9lI4u7vS#Bk9|1#ap$OO*UFO!lP&WAvPGF;)7{KchQr^%~11*y5(@C$#`CFLW^a z#u^U3jPy|)9;6S9C^j7UjEQS58eO3gC~w3KY9Gb#@3pf&vVjwH_dI}cyu!Q$N%J?eeZj}2SCFO z1L_56lDV-^k!)g!gaG0|q3!01_Rsw3ulRv~@x9KpbM(GmE z0R2cMEP1>8URfoej6{Nj0^;}g_xE;pXY*OkSwxs9givH3m&V@Ed8j%c`ma<}7;1a9X57jz$`V<9Pl@dU47S(z^OMSO2PmbV0MFk^kRC1g6$ol5jee1XV z^>6;h+m24w!)GsAU)n;M`5m?Vrq{_C3=?rO5ny+3f4bk&<|sSH=BCU9gR{9Y!(9{v zB11{BCNg$mm>`f_il72o$;HLY1W+{*wr;AK0Lh+N8e;WXLxG#vu)76rHb$q99mO5D znFnVi+j7~(=r zb~PnvCa77?Iiw~<9VJR-QR0-7kSJ8F$;6UNoH~lEo)`UY07ix!&}4LMWKp1Ca*G5a zHz~)A(Q8B5A=JNc0P6K zH-6QV**pxHRHi!reRQG|^& zXsnbvD^R8K+2F+P%7ntiDohZpI1G9|4@`CX8gS`SJpF?AD6bA@ui_U=D|Z>gWojzu zqyJ=y`S}c7j^F%OnFmTq&I(1GXo+!x7cRodixmb?Ah*gjQfMS6QYbSNqGKN!TWULV z(=JmaZmc_y$!PP!lTUx@4}M>PNSw10TmU0;0&CF-xP|w4xnTxQ7@(mTW{v1X-;6gc zf_^gq>OZM4XNgX$@qlH4hxN+lj2;3RtY5M#66$S$zFD2rP0g4I#4*MZ#yO=9vx`?> z_}4%7!yo*&KlPTky!Fez^h+Ol_@SdmH`7|Py?w3AMkQHSh#ADpP83*Gi3+ahix%}R z?8+xeEPRr>&FAy&?QK;(a`Z^kG{mY|ORb3-$guz={!(3~$F~*fR+{q(TsU}5iSypqObR0scI@x%ZLDuLqvq7=dV9AZpNEOwnjdVA;1wrq#nJPn`Y~}t`rR2+}H{+`0x~%-Bq)B>S}NbIT3lq zay|XFAhGJZMRzOX(H9tKfuENK%c1rf`qcu@4u|VODyTHVEo|ulWt2Wy>?Eup;Id{{ zZ`ZIS2Mj?o7yw)WUe<$qb1x<4%U``3PDvCfa&s^@uZXQSQ-8_*SXd68S^96$ILqT^ z@!B^i4F_2=PL^75!KEJtzf1VFX1oFbvxFf=V7Qo7UqHoiOOZ1@zOF1%8inUYZhj5S4-rJHupu3p_QIg zM~nkrqT;O*b{#pk1fSCor&7fuyS%C3obNSM9*Dqf@edO+!h6ZNDnp(@=wnnZQdFqe`ZZ3gELY!=f96xvDuG?>;SKgo1 z=7xjW?8eUS3sQ~ouKBzWCXJsy68m< z(_NU8A+je0g1VA1c+{E;1*b$1&jex`HzTAt4%4o+*{ApP$&Y;UKYrwsFFSYgp_kwD z+J|0o`^l3>PaN~^_`kHh7KC(kO6*>f5!8*8j0H|&%o&h@AoI4peED*hy5q-> zudiJ^9pQk3atG3m2~L?6~`6 z)JO=U(1?W5WX#NsgiH#U!{_scSqotu)R|nIw*S=U+tNm}eOQXmC3ub>n@coz0eZDMuA5%SlPh`?^ zphJPybta&t!_>FS@%2kv?^!BlKp&9fy*$s-kXhWy!eS^^!-5U>r9s>u9f!76xLn^Y z;&kedYxZgNe9pjucg)hsH{hXLeC8nUygpV zF5|O05I`jWx<7ci`2LQDM+@{kf%iAie_XE17J$rsFbwL*?GLfk4Xf2@j)Q}Pp$IV% zm&hnBf$41Z`I!O)5hrT9{;Q-hcM&xzlG(9X)zv zZ89E>MqM^AZrs>c&0yB7Z9CJP*VflGx9z+=apKg$eExrb-@m+Y{e^(QB1MF;&gopA zf;-5)iIFnQUAy+^#)-f8_x`u@=g&R+{0nfBNNmK+s!4N}5EkRB&asul&E>_rpK-<3IY?lb*nhbU;FfjqmEyhJueFoPo_Py`!{i4Bb82yio?L~uh0F3iEnOQf}M zon|+5%(IRD^1ccj@Yk*5~d z_h;94u3o)-?fEMgFJHO#+~w<6cISKWnI*Fw2Vw$48WtAH%*>pW)Re?6u?Da?v3fVQ zCUGu{n<*ORj*Qq#-lPF!ed#EN3qWMqg_FWS)&ctja3x+`?^bHrEjvtdlu%+SBx3E^Pnah3#Mbjo*3n{<|N2^(!B^`}UKY z$K%#U+TY95{gl%@&siDKL#rSVdm@WTEGjvH!HFy=Cs8I=GbaieO0`(6Q_YugHeyE6 zsGr_orDK4-&eHiKc&Na*PVNkplal=_>lXZ7l3`$RzO|gYWa#<7!rV! z69GNLQ5GU1fT>Fe!Ce`m1wy(p80IbxA$U;EqUsPhLNsS0cBj4F-KU;=rU8^27dCgO z8b}$OD`M!c_SO^05UW5S>HXs`Ipxr;^Yf^}t%bqF#9A`9$}+hWOJAcLR`3O(#L5gN z){0NW0jN3G%En5}BrTMf9)-AdFy-r;(H!_PA^s<_2aeWn%k7`$9rbP^N&sGiASHD_PzuM6Nrv?&wF>HKk zBrQ4>mU!4D3kbflOF8?18dv&N1@EOt)j48-;0tQHuN>h}a`yhQER2q7M-tV{w!ug# zC!ktfrVxJ1wZLjmU;NjD3Lgyn0o$V@{N*$DAle5ox@ermR)Dvcz@KU$ zdhaRey#~GKpd761x7u4*9d5n#xzum#ze`h1=|!Mr-hA=purC%f&0r)9glV;N7H915 zvF{hln*II5xBhK!|17h~!=cbyQbP}_r|(w=uQpp@g{9U6Ehb8DDjOWuOSh@1nPyFj z49NOu^VF#`XHK6!cjol@^XJc^JmVSUf;j1~W}vdvGw#rY!6VwHy!# zJ{gUhjiya$I-N}>>*sDi|1W>wU;OMZ{1gDNlv0Q8y(pGB;4DGiND&=0qUm%Oz~BDP z?|jQ!zu@wfEAw_P%y4#h&pH{6vs&*SV}mXQ#thcX(5q0AX@t2MjfBJA?(WXc^_?3# zIa@P|F-D?=8?JB0CG0*71OVE8q(lieQd{O%q&Py)uPY7ytE7oc34aWJw>*Bg9Dha&${m=he5&0p9FGf zfs_DyNj`Lg+U!RA(T{$#ZQFbAd+_t$^0|$ge6|P7P$>C-#wK88FOq_kBaMJgATf0r z{%2qJs=xH*e@feJ?CtPKscnsUq_C(lQx;-prbODPC_8CCw&AEUkM6}8=0MG41<5*vvliDR%$Tglz* z+Rp6i)hkcFxc$PFix*$Kc5&xm2gpEC)@T4nh-_v}jv)4!JrO)RB%3!xa5rLh7&~V; z7+jW9tujRb2v8y>?JKf5xeyA{am#h2P|-vL+}Q+T*~D2RB&&zu3Ent$ktUrU2pR;{ z90-XKjZ}E#)&>a#ZGt2Y($13R1Q>7>c-g6qH^2JP*SzY%yG|WvNj%>_nBMSq9*8s> zagGLaV=mT{vlh)TVK@bc3sDAwk%^Hpmngm>NW%`Lp1dxTGZ*0(93G#m-E0B27X_PE z;rj{(SVX-W_i+9eN4#k|C|o7EsfHLlUL2eZ?k++}DNsqrB{&JW zk+BDZk`WsTGq;w31|fDX9M?8)JNt>JF1+{0fBw0-A~wlctyYJFlT!z0f+^${SHHOG zT1-<&LJSqd4GY+!>B>DX9G{Ezl9t~0%V1pz`mo3$x?p(wc5=JTl`0}wQS;VZuSUGIA5o%i0;PUi;)yPbA04zaGgL{x&> zYn8#FP25o=Qiz5~UsIdUTeZBtzJB8PiOsDof~TCd=&~(^9WOQY0{ko?nx)(CfgAv; zAyaVk5=*u=9v?Y={ICDjZ~9m7|Nc=Jxdj%OpO z)beorlIMjU_zuIQH-o7+x7_-~+r=VS6E`sc;pO4e_mi9Y)Gb@h9n7Rw!nnW< z%YUo{p!Xaw0flW_<*a>(6XzAUv7CFl^mrEx{(>G}z7b!v*Q(uii|%oFpQZV#u!;TR zwHR*8lzqLEYIB$w7A3S6oc-VvSUN!UFZf_PQEx6R+Y$?uU*Fat4M(*p1{_=`=ITbP z7ShViukf-<_uS8*)d#cW1S`BdRSN;V+|4lOJNi(!Qt+_sxH54s;q%21Ed8Mm?kKK< zO7qtzUi0ONnc!@mt!OO3a?WO!RhdX6tgUUFI(_Q)^S9rB-~D&qdB>TvXO0~^vbnw{ z97wpxznUu*t#q(ew%kP`b14aDFb8>d70~Yf?s&X*`?))xdh+qV@>l-K#qA3b4GWba zR|Kg*{X`{PG9ek#=GKwk^{%h}zy6PZ*o?-PuU;u_DnZ=6+==(WZ}8>zz-q6rOMtmE zQxivSdN7@BU%fh;PR%vOCN>d{URSqpq(k-v2Gm~W3w7)HaV9u1EUCMPX0)}nvAMDF z-YW0|NH&#Ete3{#L&1{4AIp?7#Yr zBA|zWyNh#;gV&0s6|)W$bg`0Z zyS*cK}Di^mpgW<`HIBB9h$mkvf-XpjcCl2 zDK?yQVkQ-gJjg~2g3+1~tI>SkU7JpCT-$x&>h=rIUwr1m#b;jJzLIgHb_*1(4FOA_ zOafxdX1(Z|QY5$1J;_~J-MLHv#wBsarE;Qg`5{8JGZfZ8ooa_?54H)hi#k>+F$@ z(C+Q$g9A!)Rt06s+0ns?Nxc+_L5S>`5Y#oOSa1e88!rUeGkOY~h>CK)8!bKcp;x^G zejga)n}GY$;$B|{;IV+`hhW(%SPg$rmVnf4U%%>I4o%OU7p+ymq18{_c`4h~ z19v}s@#r&@3538Rp#t}1PW14$vEJTgNx|_V;H8GnlzM3!6E} zMMCBGts;hHPL7G0Yxh#K)OD&l9*s}lc4BjLlUOw8BI;a$Tpx9?3g4Id$|^-D$d z1y#UkW=tVzy8GVye(C4`!=L%`KMCZ3u>@3j%oUWVDS?dK6(K|>nx})c(Z=V$`7M9# zfB5?2r%vqc>`G|js9D=sA2pNFxJfBb_xE?M?_Rld@zYN}`P7q7KK|(^FJ8WMu)o)K zE!>+Jgr#6a4uL@;TtgrF$5W6QlMG431{CdAcGpD-1SVj(+EtX?4?!O&?!JvyhTvj- ztr{-oy*}^aFo!L6Kiuj|Xtf@E5x&!}^QdepdcyYx`Gup3>~?%*Vi|WA3Jg8%$a-cx#!&Z zvv=He$Enk&Ha9m3#7tl*-HO~qn2Az0k)jC6Qtph!fufo=pBS%- zBl)iH{H_oF%m)BjZ`K@|HCOCjpfU5{FJg{rooe@r2Os*8_x{hq?0@TT-0FhCUPY_qek5$p|g~x84%z&@X);{-}stWKk|x~9Y4A*dDial+w6d#Y#xvd z1~O72%1SZjxi(P@Ok_f2u=*6)9io)!@BPJjqBERp$TH73*cV%rjnDJ#ftl(%y!Ih4x~ir6eHs7)|iyX z*R<*yM(amUr7-zdKlKa0_Q?ww@U>BzBg5gWWNa|bVy*=91#n-!hkhlmLfIh%k$~lC zdnNRIseaIMJV3Q(di=2jEtX3>`|?%*{IJF^?EqkyE_=hu1y!e{czRKkhEdAi8?&%+ z392JzHXtx5q!9)mv@=Hr@TvzM{;PlW8$S1Q|3ov6d%L>_2L~m-y(C;x=@wj59v2v` zXXt2A9F*qm+*CI<){h=Ny18|PnKY}};V!s>-g=O@OpqS#b|v23oJDd zt*`lu@BYbO{Gebw8cEl7fn{!U0FfI2MP{jl6@=KhYO?Ock&|El^GpL+4~#j97Z&8G*dc|MylGf^pz zC=z1Hf^c|QdJEKn*2ixptD;9poUE^UC>htDt= zHbbxRtK0Eu6*2+>1M_7^xk{{F`>uA_5X{op(Ufee~ybbT3kH=USx@b zmsxM6F&2hPe{F^BD37T^eXKlF^xEOW{glyU1(H_s-yL9Lz*EjdXkv7)@j^~0Otbf0 zw10(ZHP)EO4O&EoayD0UFUe)G8EtNC-FE7>b7#+-IdkTod+xsbt~-yPJhryBQChE7 z_f;iA2%$tBN|2&f9zrxXs7nwy4A7j_^G%%Noo&27g{{M^s}^mqK- z|JjizVGYb~ma_te;tgXi2DZV(0tarp{ZZWf7ytZwzv^A@ym;;M!R~=D8Jw7lT}9<5 z74|Q6+rhFLo}YVhNXDjNV1IhBePw$#of#~~rfC{?Gp*jQ@-tp&ZBYrqDyJim6%7nf z>N*gb*lZm+a`f2oPkj6j{`LFb_pd+j!{t&MG@%JrO+uKKWO#CS2;AJr%nP(Gh3ISl zAg9&7zifFEsMPf7S1a!akb809QST;NA{4A1yUt9+fKhQP!b!*MhxDd%ns{PnN;vu}Rn zzPx)e>wa)T+i_Duw@UdBLg6&ode?1VPU z0q&*D$$(DCHFJ?WaVQbgV-v~9kl4iqoY`5KnT!gLpOgZ-o2gS^c109sOvd79CP%3e z;-*W!H=pn9T)%W>|Ki09PdIRAe0KJuD3z2cRd#{%EjOL+?KtZl`zA_ZsTH1e3l zN9GC-ObJaOHDY)sh`T8l>3(x3s>`eOp+bLz5mGT>Pc-*7`pQyQcEsx6x9qq}PdN8_8q@j&07$a3h0}yK!bS0(Ce%c~lC^$zTjNb}_{{>IuY!2=uF1m4W55n|V(n*Ns>zISCqP74LeAadC?En6i@URM z`B*pzv%AmItmyu}_? z6z3z1M&lz#k8Eyi1`#z?Ee_nJu5=iD4jpOB17zy0Ta=4Ze1 z-R}ati4%d$()8q!<7?}aXD>V_($G+z9Hb6m5vDG8U+~tqebYDowXGvt(^)&7j0w&F z3x_x&xP-_=AvQ6D*o+EE*roaGV7hbt+U1LvFI>3r{0kRey!hgkD_5>wzqWhh#&kAK zT~}H-#wG*_Ar8F)gea0>&|1c{sO7M52%+4Osa8JLi?lw45K`Ak2;A369r{w=kNQ^X z8TT4le@mnL@K)FE6)?O4E(dJwjuJSvT!#KocOP&KVX*0z9(FYiyiadjHRNu>*eiVC zO4Q9To%P3AST%Na^JmVTJ+gIVZGBQo zV5gjm*(1yjaNx;!jhTrlMxj!q$qnvYH8#myHEY*(U6;Uou)9B6n_S!8o*zt)-gbfv zUE8VKxwE%lymawz{jG2R|U< zcfad9XY+&W*LH(QRyDGsb&F~MqY^Rjp}STuh&wZzo2!Dr#N+W8p#8nQ%a5#@gD23om@|Cw}S&-}~O3 z>2&~OG;uO2NIK^nB$RS^=*wG|<(|MqWUeK`bLh&8n3k2EP6T3+McIdiFcQ)4Gl-b4E#W}Gzf)rw;WMk`+<160$`gec%TX=eXx_eDnNmF2Q(@0{Z z?o3`Q-1p$DZ*)T+@Ww>yCPZo`rTQkhqcH0bA+7Z|D^~YfC5Pcv%w?c-0tjvyO2$Iy zoI=f$Cud@FIMiJPW)j@YN&+lFUEy3vaD~OV?jj;h;2737$+0_aclY)$ZSP#XcmTE@!lTSiAs0WI%)oP_>qojDnDs5<&(9a${z5ZUX7F)e6#zcY;7!G`MI{ zju#gd3nm#^KpoLoIYkv^V`E2#i%X_FGBG$aIzn(Z_6SyXB6A`nrG{PDLl|Wuo=pwe zfeG;N`IB#c{UZ-Oc<<5mW&)j0cQmz)Co?1RU`DPK$P|n!$jW2}aZ++2LdoefND+Z5 zYOBQ^wSq7K^z`lUzBusRnM&VyNmRc0;-y1IZrX-5h1?7C2+z~m?!g{%X5k9lmlM~V zh^**$7TsS)0rp&catKyxi8`c69GLMejwFnmqvw9>lTZHePygC=fVt^Ja;;fV$R#jR z>Gf%;3dF)nq5j^8$iX5T>+2yzF5GR;#8re<_3j*A$*{t<6?Zu^S1pnrv2!1UfMMFB z)rP9e1QoJxPif@~pz0|<~XF-_00|VylCFNGKYO*l;$pETaQ9Yi!UNcdtisdU8+x^D-cuF3V9%4gHAR!x>@>~ulbta_%FZG@Q6v2 zj8xUl;0-s4G7p>(Nm6ZM)Ra!#cIunH@f+X#md|TvEdeY{U=d~x%)}%iNO_DTfrumo zfSNc0z=W=Ar_=e)_3Kx!UA=ns+LcR}FJHOx;)M&_+gG-)U%zo%@^&!1Khrem%MG%8oF2FzngR|-6Aj@?{mm?2kuR*JLqF_IKo%KH zeN`nUBG#155n?04Wy0aUp_sVf^di!qRm&6vAjW2WZT;A>V<%3YICt*c*|TR(-gevZ z6UVoQd_3Qo5&| z?jO7Dwt3r;`($k`we7r3o12>(Ya8G9z5o1s-upd-xUsQ@x$7hw)2jdIdBow zh!om1cTZpVmUsN%4}AZL)5o8C_61T08A!^VTb~HlKhRY}u0CWZCv}6n1RljP0SD8A z?JHMy_x6a1IW$dR;<_8rVCoiE2B8`#`+NH_iiD^J3Czrvb2Dx>*SBt5yZ-Ng>6iY^ zkG}u$r#=NBqG?9a0XKDbBGH`P-C%^8K2)ZQq9xD|-_;Sh=yg=;u`@}rpm>M|Te6Rf zK~(@j&RMOv9O^{v=6#md!Wt!a2OBc?l_LoX2s5A_CSt9m(40Mc+bdpv&zHaFum1Tj z`_mhv5I##4W`YmXcE8o}S;}Xtmu1GXzIgHC-a$IrG+#86Wmb?8wIZkfSK9dBXP&%Wb9ml2LTSN zFr%OdH3!6!QeacCF$k^-B}8ubAPq2YgJQa8k=Ej5>&WEniH&sE*;&ea)7M_RzW4O= z&pvbE@^hCiT-eEbK!*fC6;6T}w>+jeQ;Purfdxf`L}BD9=N!0J_=70r=&ZylWN`7| zl8}pMTg@RbXMw02v3OQU305U%1q2SLk&qG*!A#68xPw8)tO=6T&2qyU$0N_ePBWeV z<_p`OeBl>g`{3QLd+jS8y6dj3&0}$%bGqSKrJbt~*rO966R{HmmN~L1K_CVbL#>qK zC{<@o6w16LX`?K-ltg9@Z*Ojnf z=dJbit*s-=^;U-96*numS~Y7~vfM-jAl0lTL#v2b0|0S}jNfuf1FWQ(@8J zZiTkjB9&aOtdF<^Rs9CkQRoC-dP==(4OWV3^1|LGP$^2xY8phw&5_xBZ@=C7z90G* zzx?YT`io!n)nD|*Z##B$Yc`J8cXm>ji}Vt4iBUx#HA6#t3~%8iB5FFHx9+>lys^0v zL&%l7>zlj6EMFXALEtQaUSbJ~~-%_V=cv(MW_-R)U2f%qF3zFPG?-;Tn^g zmZ*jGwee(p>colTv)ku6=XT!iAM9VdcJ11=or@PQT)KGi!ljGb+uOT0c2e85)9DP5 zaWiQ~qw!cmWDg~CH?GHG`<1TLwDFsq+Vx zvHD=-4{cFUV^RZ{ncWm6mK_ApXgn@IC{s}({!KM&cJr*7Qi6MkVQsv&xq0No@#E*t zo;`E!?CCS7PnqPa^cXVaWgR#O5*0yCOXqm~`M*2JWmH4%A;vc5Kc;leW?{E43g5XX@cv?QZ@ zDeq_{2u;n|m>ZKT0Bj*DZ3Eo;_ zf^r~J0zopeSj{bAu(>izky$O|7aTC4;G^=V6O7#8q`^aCWhOEr)Iy5RB}$9HUXswu z+G0e~!B`4eI@DD!-JcyGDftoqICtBb`|dow*R^{)vu7_}div6(3ol;0aP8{V1I%4h(isplF>wr8NJ@oYa~BV6 zXk`?1u8d&CHqNEfx&>zoYAzhrjI9js%nEwv&movGNI0$sl?X@7k3lu2%-cr zR#F5(ae5+wIhz78vWzx-o_B2iA0B)96OTRp=&N7x#@D>;f!oh*ZJmy$?ZFLCop?&Q zV{vs7GcdDffDDR`NfNsN3JBPooN~xwQbIeH88u&et$k{-ppdV8|57Ux112S&@H20| zSOpjOi$FDFYhgXm!sp#zrW+S8ua@*akTa;__=h=)axOS<9K~-J%+H%cK3eg`d?wB3U5S&0=BZMYA*k! zuG2pIREw-(W!!5dv=4fV{pWRk9_B^~?5?#egS)#g^u3n3NE=dnhn2h!#4Url1|GS& zfR!^8$z0W%@kHS5eERs4fAC#@@9+HDuYd8o|H8W;e%+&|PoFy2-J7;883E?1MVO#O z&Qz4gy~aun*+2*(r#zp}Z`{~1x1&dniqsnEwZXkNj+SFJYKL1q5Lzs${Te|f6W5%e zrt|5+pZb&U_@00M@FyPsn1eyNthRC7n7Q{l3PzP!AY%i_@bQoT{--|q$=AL95n)O> zY0e_-KvriXQ!S)Bi!@CvWx8u;cP@55F(xsFCc@mzPTI+H=gynibUtg__F!-C>h{%3 zmo8p-{`nU#UA*|>#Y@+=cXn>1yd8tY(I|!{NE2gpplKqpv%uU{GYG<>3(L0Ne&NQP zhM47Iywwu5eSa=L@LLbe&oo?@W`V`PuLfoh4f~PVyWS54h*U7TyqNcgSv=sI&Gi+$ z{uySSVegmH$ofNm_($IPCS&9e*$&OBH`@b)>9r&QfI2vPsiE4!1u?FK^%N7mKAyp6 zwTOSlpr4XQ2b!gTb=v7A$zvXhOQW}eg5)=>t(|NTFDdFMqyCO%S5uI6S8 zVj%zq7od+Hm*g`be%t@}ZEtw}qgSq6Of%|UmRCQ@f>>^6?K#!&19-C;IgOFM#;kD7m+S=Ns7caj5 zNB+%E{KN-$4z2?j^N7cdY0@rh(H9{t%3~!ia@A_Ay{`0!zMj@Hns@xD^Nmg@M2sojWs!e0@4wyT1Qq z)DQf~zd3*B`TK7_OXPv7c+qFgR)PCcC@c*oPOXpbPDlW@Z%i*;zLd_NWMYJI(5WLh zD=A4Ys-g@cLl&?B08wyN1S*+<^(0J=Dra6SCXl;;Asup~oXLrY;86lo$&x6@998uU zLhiyaC9n-_O$o(is@ByH7kiyLabCd-?j+XP-RS|m^Eo91$z&qIGqWPI8le#- z6(S<>lGNg4!jdS396(mIe8__#L&^=7)yvq(OZFrPP62RtCN>Z}6PN=soIF?Oh7}zN zGBIjPdcoX7?06KSM(X5objKk z5;s;`y+X{M^jyqi#m*HbkhpjS?p3RzYEPi%wAQEx9|C`Ac$!pF2CS~#73FIgm;#t~ zE+MYPHMmdn>=*yjFMRkTA9>fizVe-4{^#$y`@G!P-PzkO&qbJtfj*hCmm}>t#}g9oAQel#<7I^4gt7cQn0{&LyR$}Zf}40W5>~bX}6b74g7TExW2| z0a;z!N{Avn8jYpIzKC!La4>PxsHvtdX~FvD<52@5J$drpd+t-ygM)+pgT3kA!PT9e z%NJgJ=DBB{e(LELE?&64v(wIRxR-3U(P%V^F|vrTcr8puU{WhUy-H6M4y;mxHNkaY z$oj@7R42$HB7HG_4-LdyV)>;>U_j{Q$iB(}Ed5}4%J9Y8)k6-uzSKH>Xl}a21XGNs zn||NNQ++1v?}vYKYe-JZSNTVt;^?N=l`k+f60I(h=6c9Mhx)~8d45{rn zMj@e6y&;C_ddJep`DRK;lHfVN$~O7}6yTF-pogxI}N$ z#yIQf+VhY9#()0Mi9h)zTN~?Rw$W!-qH2lk0I(paP*IH!ohlnKZ~#2@!sX9<=;hL^ z+5AQVn$n!vbfkhJP)cA1XJ?SI6BL0dlZlfS9c?eA&Z`0E3#$?COp>6CQWrQR&yhm5 z6e(uUOu;NOMYR+tWOsHI3MDhSJX|M&)%Cy$qYTf}c_NZz8j_~$VDC!w z4#?Z3wcHeWYzy{BqU%L@vIt%)RoBL&%nic-tK7whHH+;kWw(I8lI)8@UL zNgqd2$q6j8zN^1jezRaT>IsHW8LAOfs24cU9`M2oCr4mXcVVJnnn+44FI>qvvqAv~ z3u_bE;zf@x}BrT&HNF{@=gxq2K)4ulw3B zeEVCQ$z=QTW$V502AC=fRY2)=`fxIUibGkLQ%YUxcK3E2zO{9=Q_+1uaoj(_q`{^{jw7ud&!E+TZ@+yjDBHVeY)M#`mso2k2)>QhfW zxxKx8_RMXXQ?aI*L{-T_HL07+BWv3ZZu`7fgqlJVW7CXBqZnfdQ6!F<#sP>uo0yY|BK7oK_UnJ1ro>cYi~*RF0)r_;2%3xWv8 z(3H|GA%xorN7=hPD>}Q*ze|W^M%z;OUGRK z`W7EJmM4HiC;bc{eg(KLzrV?7==Wc;7XD~x`=$0;p0ED6TQNj$4qPu^VzHQF=+LOx zk$U@gVYt_IagiZAcsTlSzCpH6Q9MZ{jmWrHicBeYT{2TMH9%F%0mhTbsZ*!!x%=)r z@4WMlJMTJw`?+JskF8JEnkG`8iBo46GhqfHjv_IKBBI37G>wyslz!-zbvmEVXY*Ox z%?=Jy+m_oSr_hAac+3o~0yUmfm%2<;(|?7<3B{%4&cx8n%r(j_3OkVjM>da6clST= zV;`97LBJ?^*GRPNs>*?pRD)46l(aI~JSRtf^~10GJO9(Sk0Nhh-vx|07=Rj5N1&qO zFf4pDG;(?R=2p^6B*?fKG0Su|yL{!!{{CLm#1LXJoN8!e?F599Nsp3{R!D3o0uvmX zQ#yX~)QJ3qgFpN4e;Po9j5jvKxlMCdz&*oUOU3Y9FU`F8+*WGh^>(Zc zLC+wEGNe#R5`stwBHk~0gGbhTj=d+_ow!f2jj?3r0Ms<2thRTsN7-1!bx4dH22F{A zE$M+I<|ySmoe3$@IC*A>Ww>^H0v9h{{PlnLGq>M)#~WYw=&1Q@(}ffPK*Y|S{xo9PJi+Ek_b|uQLKocda z$|4|V74i&XXAYtyO#^2Z2~NylXBKvf(V<|IyIXc54w%VA~fPu?LF7E3o`Jtia63S##TERe}@qB1x+^83{m5MqpZe=SASs zN!X1@%u1*X6G;aq8R=;A!ykX*Qx~s6#>|!=z6jIu($NWOMB-kWiVSnzq zl7E3r0bw<}pTQF?BGIsToZKk}X}n`r^<3;xF#+9z6Q!YmOa1 zrrA_8gJ8~K!IRWm?Mnfqg)aOjWLoh$Ql< zLV&*w(+qTnb+odk0Gz7H-iLuaBO^_fWBtlFs@T`e66JcXx- zx8HT==REw-8{hb**T4344?pzK{rBB>`}y0CY;A=QbJwM=?YdS|XPUF-Qthf_NH7aX z$jPc$WMy27E_AQUR4mJ0k9_D^HI#AjKf>~#dh2`Xr-s8Fxo`KSHutJsLP4lkZYicU>X;=Oz$AuX zCJ&2|x3Br<%>6szE{sp@g}k zR&jE7gPWemV-~U6ed&8s8zVL!|)`Zw|1!O&iIGCf02eyQ3(a*8t@uZ1yHlJO-ba`jzdI+Hz zjr#%@R1mUxKkF0M(Z{U0W>yvb#}MiCsZ&Dofe(D(fB*ac`)~i=M*s*$YlvYW~)hvxrMDIB*aNv1wwAB@4L@Nbf6;^`eaINpqe;qTw)Tuth;ap*p!_z9n7@r_7lP@ zU-hbEn`_~-s~VFCU>=-ROq_F(*@ug;fyjfgL(G|AZsO^4?!W)&=BBm>jV2A$7|dO$ z2tl|jBPeHbaRBC_z-2Kuh8Ri`sS^pQ5eIW)h`9+EUeqL=m|;pR24xOzSva^UlejyG z;l(xp$OK|eC`H?)PE{`8p3Wk!Xo8%qfpoAy4g!PKC++n2#QFaFm zfw`C^#Au8%<~pByn&x&LMNz51bt9=z|q^C#BU#4+8QX3SkvMm85P zm35XzgqF+)%9)zbu*`s+)*gTE(vwd-cKycQcx|+PQR~E`QI5i@P^RcbC8|#Lg<|L^v;TbrPgH{SooTWPN>O zor!xf=N^JA;fmqU#kW0H9(Gz<$i1wz5~QqKB0|hTgqUl7$N;jc`_cR8t@?Xl`Po!B zCR~mnR4NrL@sj=GLlQ2Pzm!GHBArHi-j@Z#l?NC&f)`X_nr}>`V5N- z5~GPR#Q1?9dw=#M6amkgHzw=zZqCls2Y{iN{3K0?EXG03p1b|k4?pClg;8TB5$T;A zR470~2{Xu+)pFLZvz(Z!{zgtIbzM83b=|z{+N$d4&crdqrWrTmNrW1*u+9`)N)J( zI1)GrO8{|*qse5lHkqtXCgixWyZiVjKlPg*`p@tC;rG3G>3IQ15+&1|)wGGBX&O~4 zAvZ9NG0f*vz`y0MfBV;e!#7;qesMaR1(b193u%>kc4fxtZ7c76nI))CL`I{Lu%wi( zY+t^ybDfx*W<*4$YG(Bbp|?}31JwYi=D=b^#cMHHTRVRI#8Xc__kaGM|M2^M;Cpuu zb_hI)V+qpf+_kDjRb?!Jleb;Vy%k4Qxbv3tWW50fM~N}S5JJxo^^|r$5C@I-;;nV} zVwtS3uN6a$S8ONW%z}?P259F-_so?` z58QX!VraXt=9U`r8*^-ILOU`h7@SQ|iYW%DGu)+?Tdz~FI}?;#%F^1S04JA%jNMC- zPAP>uoz2~g>&d_lC5RW^kBp4nowNlTw`i&32?2WH@#RGSoT|0ULaXrs=a*{dCW1HG0u7h*H*mdraB)hVd8KpQ( zj6p@vlNo9zM7cf{lHgfQ76GILwpz|-@E!N4p8yo0BI=oo-e)(!ORvA6vIzAG=)9I7Qc6iY!yMM|JnRWw#rHM8D%+wb5Dc$|- zWK!$yX3GvAHRCal_vZ(XJ^2TJ>1)5?o4@s2-}&di{N(XtJ3BXWQsPpl*hHj>jeE)^ z@eK|z3%NNngSp7P+3qe8udlB&i>fYcj1?njiBlT3o;fZp%OYw{L?Y1@S@WwOe)!d| zctSP1D2}LeYYcqsbVwaS}2^;(4Bt;-Ee76y|xx z&MC`?PRQo^vCX^AoSkx_nO;xR?#kX%S6;mG^m9*KeE!GC87B z5^6GXM3c}BubEoGC?QA0L^+~K)E(Ld_5IDSxOt!DBP?BcJ>&9g7pckUr0yRw<$#z;14)7gNG1&w6rE6$xs4Q( zrN|SHDKfWd-gTQ>Tbiv)T}rt`Do{aqSoqW)ofRGI5Me z6Puj#)oWL;U%w8ZiIIAvmlz^JBowt)wQLS1Ht^bHZ8n?Ex>kg<+18OGr%#;t<^S|6 z|JOhMXCM8$~J^e%INC5I53W#M41 z3^8^pia#~cZa~q?8BaCru~g+GTXHXz%@-b;-UC>Z<0=nX<8Asw*I!k}4FhM%OsX#Z zqF7e-f>^w#Yzx&30!l#;BFd%H5a2LSplU>vE6E@y0$AM>&~+L|lQ0^M#_OYIgz-4d z<+<(4Pd@eB?|t&qk3IYJ3ww3|aEVT%bq;E-L|GN)lF8j{G72UQQnmo?$SHXi9d|Mx zJL`}lRETOLkQo@P(u$AOTLJ^@$l|PlMGeB9-Nl81xv>;n3C$ubBr+myZJy^2tN~}% zM{j-f;YVNfzKu$504R1v@*b znUf>C3pkO%5gFOAgt2?>Wz;k$PoA7iCT2xptf+Y0g5{`vd5LrHo9L$S|6#_ZD#lgF z%AzlCW~y2U+^lM9HEyu?nHSLQL%Iu5SDFMi;CFIX_z zAPB>X%qt0m2wh5w4!}FU@Js*3H~;ms=g&-c4`!(oNOomd$|*`nSqrJQ7}zi~7YW(S zRVU-|k)ua9H#U1Yd@J|peO_IiBbH*UtEJJW!juKooZu=f&fLUs{OF0l`@ekmKm14k zAfk~VNi{kvTM3jZRJ55BF$Zz=5IJyo)k6<|=XZSjv7^U!_V=LXghoOUr?CFQKpdEp zYHnLF0<$}*X>oN7(Lu#&ZdTTNF5v_P2{oh9csw4Bnh;|o38N8%6z*ni*LH2{a_YJk zRwMX5Cy==LXgp#Ngu5HSN+V)>YaI)N{(Yqz)ttnA;9CdDTJV=aLZZMv~4?83lc};(PVA&-h1zT@PU_|J$L4g z^JmYWJ2M(hO7U`*>h*IqBZLq^F3e>*7vbX2V-b>4Ws6hJYMQ&$wVkQX+c{vSo|A$~ zek9y2`Miq~z+|W_<$|QC-J<7@+#RlJ#XTrNq67(nKzqA4E?&CS&gV@t zk`Ve~RkdC~MdR2dN@)#+1!4o4YG|6tXdH!q{^$SwKmF(b_{GZ?0NNTKQBQ47RYtlB zj~zlt!_+sVq!tl(LSIv}?9D7C?ubi1a7zdXDfg8hM+Zzwq4E{q}flQUZe{ zB#!`mC`w*qU5l5kFouO~#Nh5&u!)5rU!+2m;FguGUQ0Ptf0RDOrgF2@4p`cM@pBsf ztw90AuISfh@2N)sR9w0x%dR#^$;4rS!%J-*a&~jqB8XKMpmHbdq-dO)k)(8BDbJ=i z=3zWu--x5h{pXKAc-QH-zx~aZu3UTUQ;+@rC!YDePkrjC1DpE+B{0x5O(WJp%5a>w zt+Pu>>nkZWfw+wxG6-e@Qh<*?nJC? zY}U<)8);-S=ah8*{6YJHU;Xg!ed^1=}he8 zc0=X4>ulyI=aLkNw^s{IB2rcR&C0-+2An^&7i;AkL0aGfFAfWHrDIr4*v0uvjL{ zsy3U=nfGFdlgXF}nwO%AhUklx)+Q`pIEL`}LJL!FldC!7i{J6Z|L`CEgM_Y;&16<= zkb!ANwQ)e?BJ4Rk)86$PFFt$m*pcHWjvj$in>q$}UF#+O&=er^Y=a8~Tnef%GZ>bg z*s2XAM1TkvgCyl_S*--p?(G8O)wH)Q?xa&k~ngutd+#RU5KAoqln~VhFED zC=4BQk@kX{Ux&H^{amncHZ5LzlBW+l>FvC-WDINMp*3cCz%E(lJqD~DXfZ4+av6?U z#{SBc^nRcIb?Bybe0v>DwQ@CqoH%e38ZdFqBCCT-cgeJH35rMU^nZLTAegQY?{$1hQOt8Y8|~^-}lR9pIt?Ol{OoVMr-TqU6%}6 zR}CJbZpkr7*cO~xw8cv?*WNTD0$^$c7g)}6<*DEQ@Nazh)R(@)n=porNlLmnNZgA!yp~`~W`{!wfn7-xC~Bt!SBDroC};?qYe#vq72=4S=D7=(e(RHu zee7eO`1G?EuXQ*890(v07SerNCozRZ&p8ViM!> zj};)0x{I(Ggpr`)!P(f@LTOU-8CQzv_-NC%kLh z8&~JuEO<6pfIBN!LqdumdReatq#!n@lDf=30MAM$4K3TpvzBz5evhT6w3zo6J@?S_ zc1Mwm6(M%oJJ_4<9hhq%29=bSzH;hPPxQiLP$4MADT|B47_3Sq{lb`(noii)j$Ya4 zpZw(y|L${_3?Tz;uoI|wNshjskczC$~>t|-4 zedgJ~0yT18E!~V5c%-mIa_G?ELkABMlV)9AN0(!f_TB1W#4cOn2?$Y!@-k2hP;lE> zmTu}&V_dcG`}ur6pU)8v;9>L!y?ft;TfDn;U>8<@ly{8+tV{CDaErdUXDSwUbajv= zq*z&iGYL3V()L}S=K%ko|KtDkkNsPJq%%CY^C0J5n8EA=RfaG)gB+#qI&<(u0bgHR zJ9PNSWHQm5ZDH69U=Vv6m=>1(;Fv8NP&mciy{gjs#zt2EiGT4Ay!OVcBblhG2&?9W zu|&*Kgco4ccGK+-}mXyo_+4z`(AqKLm&Rg;iJdux(W$?Gt1idUDx-WW{pOy zs>*_g%7X$Hl@^c2rV^U8Wo*i^h`blX>kcrqwJ4u}vOLA)?C;!uK*RhoIQ#lzz8VVn(K`7&x2PQj-fPmKP-6kN=l#gL^v zpW6H8x8G#^DZl;Bjy-`Ldd78z4eW`RpS;19FvId)GwZv~)QAP}lq!k@gT?R}fEp3! zsQsW>&HBCz%~}yTc;LX<^JgwzeBq_{z4*Qt-*@`VnPZ2K95}cECgI2n}sHL zpF49kGiHHVvD`vF01!@1-He*iXw-~GqpbbB?YFmgE?>F)#+%>x`q#ep_S@gOe&g2e zYQM4$x^Ldv$H%FPp?n}013|dM_glO7Mj~qDmi+}I$z5LNv zZa=u=y{44Z%wbmY1O{yBOGaZ1_mFSTeFjlgrMhmal%~_^-Me=;w>AlgBz|75lMWy; z7t7VX>w1oo=BaWwsj4G~58u9d^RNDuzxLCA`+oq?NW)witF>mN0s+CGY^~c!b|%Yhn727O;yJtTb*9MeeVO$odyYd&7!G-Lg2)1Jwr+* z8-8MydIE{;@mCDom+$--92(0tEIj_p-&dDP2gsuedl6e+{r=@+lMntCCuVh*!6`z6 zgaje@bPi);g)yK;##UMCI7?4WVwXw9CITY`o2q8r-MsJHkBvd~#_2AdX1lN7*}U=p`@(B) zzVU;f`JPuk@PVU;Pfm6p&*qz)4X&n25>=WqK*V5Ybz@M1DRYp?E6=@1GS#Rj7Y>AQ zZ4b+Y@7ckq^vtvNyTw2n%mM7%?1n8fe0om|iSi~5Bu@Y(Qb+_4lZGZ$7Rs*bb(6+B zv(1NFTLw5M_Fjp_(ebdZ58f3Xpx+aCy!halxvHvVcbfrHtg1sB6@tuafWrrbU1r20G*^lmGIL?$EHHh6*UN`5 zGr#EYI9bkMViGtJJbTv8#-nC^y#8qW{(t>v|Lf0v?(={8&-_>C&Yykv#?4tbuX${i zT@YpV!l%p3eJ=Z~v!^QceZRA_3lKBcbxo>+IK#f-^<=BA_@4qIdxV&IcX#{r=?g#d z!$11k8?ScSCaFvZ^gP6CXvmpIOPr*ttJ!q=E5G)u##Bpn{N#yqr%zwJ_~P>yFP=Gb z_UN%AhmRgvKd>RpUE9s)^R8>%j1#+i)+q5av2y}J(|Jb1jlJ>S_hH(?g3gr%-( zW)c#JgfchEBnxEVgikaCypOGedhGpGiNS7|NQw2=MNn{eE8s@dQ|0JbJsrHe0=xO zgL&WWZ0#P}IIw9#8B8^MMkUg#k-Nh}ZLq59B&kkmZEajtRhRS5&i0#cUB2|z zrPts1#+A#LFTeB7?YsA~chNEpjSfx@R8>>gHCTvHs9xbrC%8jRbJuCkY-B*DP{VUx zc>BZmL6V4f+Z_OZ^xyoqKlMG|bK}+x>vKY6;RSpwj`0Fa2FC(W>}evXde}cAiI{WF z+uK{y-Ca0RlE^WQ(O2RmgeV{dCuR^4LL<8eBC^!VG~eCsd#zy7=b=^yg873l**VN<{?}Ivz$4vX;4VbtK0 z!@uuC|IWYqhi031bm#t<1m0KTZUA%2+E*kQE(_uwqcEDwmcPe)y3%iP<}*C*`#}G` z-``^?-g9Q~Z4}SoI1ONHaev|Vf)N86AtR3p@5BQoQ5kG*Lgt2W*D^RKts)f8;^b@r z?A<`%R`YyrSZl`Aq(ev6Mr*sR-n#Sf?W;Gw^2Rscx^(kaMh7q;psGoTl~LVE+}Ts+ zOkNR`+?l9%OU6pZE`XbRVz{{znG!ij6yPX|DG()Nhmnb=3=@KoC@Xt%SVPFnfaVdK zr?EKD*GV5vfwKvp{^4l{AbSuDxUZ7#w?Nk5}L)o@n`lt9!=VLTgr+M zqI57B)kzwucKTVL+Y?7l{<%NMR0qH4iQ(^L#!d z;$ugT9yoA-C0Xp23+pBflNGC^tQf0t4TQ&?0py&kN=}|U^N)Y+*MIU~`3V4%YCU_8 zj3|;DjJA@(MFhAxCX==CXae_YH0q|ac{g>p-1&GiK6Lo-kwb@0oj!Hp!ugk8c=5UC zE*?34Y;Aqb%`~gKy6U`bOCD$BKLolVW?~GnDI$apW+|NH#pH@AHdfL=$&0Hm>QPHv z2ITIZl8i^=!$*%CId*h?eWRUs-MsC(e%`j-tnc!?@7g}kvwF}HoOslX%wcYQ-|y~B zA3u0_``vf%+`n`4#?5!%z5VdP!>#SD-JPATYq`{8VIJ!2gfM>rIAx^A22cP}38!$$ z^xXr;2Qz+Q7e2)=?<=!*^VAPLWd|C9Q~RA&g@d!ab6N(+ z-s_TaH8qVi&&4f;j}z{^AlDE@zXwmf%Q>98byclR)(###cS zJbB>Yfu^crsGC{t+H8H-n}f*T=dM zDbwK}EqY@C&UuKc3~V64qhf%E%FR&giI}y|#8g)mSn9fA=BiZpVRPHu+`4q-oo~MW z=9_Q5apm&m>({S8+2aX*({M*0z#sBut z{Xc)}%fA6&W3e~zlPqYArCLcWx-bTZT_Y@UD>Tf&aK(h* z&&)(PNLFE3R#i0`k0ztBq=aHT`oNqFn%ux6T$vRy%6-sJ8tfxVDRq7S_|c=y?M;IT zgqhp|A-b<@jRQxPLQ-(0a1=2S16C(iYNa}P@jw1!KluHlWYs|N`Yt^v z5u8bkRTNq?vQdgsr3vO-Ik%P8M7>x&N|<-E&pdzhKl%6mtqt4Vy?=Ye&S*g_3TH@^ zVDh3H12*!(8~My*#h*e3j|@>-nyclUf2PM=O=a9e0@$-cu7V)|?#@iEOcV@vl#~qv zaX@xQ5O)KUhnnT0;Jqsut2>-iP3Dv+Rm{>mT-9@Ki8bfcOx6z_c23UYN87u%?>_$O z>#x81jkn%@INt;+AOWe82szJ*tPj>A1eC>CS>d2Wq~z+s|HnL$ypW z+3K#sJq|=8_be5gt}^zh(x)Wh=-T-vaVg}>LkvAVUdi~oegs#9AFOlC;&hK8Qc*pk zo8I2n_?^X31wj&_*Ni_`e@CepG*V$WddbaxH9%93c)#>H0-sXC{q(!yzw>^(ZC{>Y z;^b{53vkUwi~9#0Q=KGcQcEy9Y`A*@WOQiMC_A6C3p|&6DGEGF za9RmGwedB~;GqAPr>)%c$iRi^+Dk8LJ!>>S_NOO87?1jL5F!3SUqluVjo>H}sUG#s z$~wub0skPF)`>N#KnK}Uu|66)%Vh>if>_=N!=@D$BO|H zxnm{O!<5}^GcybxKw`ro?5=fbVb%L`{ZE@Okof@hed=$Bz^8U_avHauZal1|0vF>no-P2(~M5$MUQ|{a$hgnK#Bg*jR=AL znQ{%ra3>+@M|X}kTnl9;4vZzsUkwpn2-O?=H|6vNsOIDr{axF(|}Si@FZxWK^Dn3MNMpJWXATp10;M zkLedO5?p0v5>PxlE~Q2W_0)xyE0^oITbWDE?jGlmTh(gxtQasZqjzt{2yrX#9pybp z%(IsJCfk)0@uQPRFxln{H#Jc&cLW~Jjj5cpy6qpUq_4KPANR)@2!kyVaDOU~Sz1&< zdx0k|J9ck))7C*(8bk1&1?idO5P>E zG`){8jo|An*PVzI>Na4JJm>k zd=f+OixrZwO0x}3!9z0fntPx^JDALQIh-iPoadVoRpO+tt zXg`T~9t{LYkUYshoy_~NjD7VuIo2Pi2FxsO%1Hbcj4HZ_oZbvGY=VcexlY&J(vQ}_ z|B!g#_1~j$kTiGN8?TA7(NvMlU1ubmUvyXp5)ah6bc&HJm1V<|<{OXJKBGJI_$K#` z*K334>hxYHL(X(=NUA{^2?_6u5#DD6je-WN%DO~zaIwszMY+4@TE6d;?XaHa5V=62 zcI^%_r!z2gs$3wDA+sy@t*%hv_PcR=Q~!%>VW*DlKS-}XcTzyw)vFf?Ycr+IQh!#@ zM<=zgM0D0=vCxTp;dA9zk=y8HK^SKw+~Iye7=hL^BuVF+Xg3K(||8aNx zO@)ewX%cX@oZxqzs<(P$ZZW-lGxv3eJVVUvduFsw9#vFtVj?54UID!6N56)FkofoU zNjN)P(DYw*^%10^^ZmC0gk@G6XB3db$gj!Pmg zn)?Lohewd@YoK>r3Z{UUc8jf9-Ll*7h2P7XK6}D5xRRnw#_(2j#W@ z#_3l&g1NAQ)osP8sYJbwUT#kwVUkZx&lCj|#Vr&5gMn|}NLjw}3YT%|`_c!>a6veUSNLluNwT5Yln*%FjF?5&I?bEJMKppTd5Dutaayy(iHlv7Hgz+3=2ezyP z%%s<>Lw6e8^hOr|#5j&&?0$FOee=xZzO?cdnj6Vv5+9?$LS zu8k*9Nt$3{tITM;PHeG_6fN#wzOSCB_6JZR!c2;|@=|mrq02aQ!docU>8q1ObKna+ z7j{Fl8hCm7XLoM5Cn5phD)T0+{O7~hX=516e<~xOQXx?$FZU?ZG0$VT;k`-k zd%foLg9?O;@x?0iAvuY$Ty7T4vV$@qwET25s>u(GIIN5Fug_58SAdFOMQ}fiOba`I z2PqWat#p09%jt51+F~ULUpt$W`1^MdqWi_%=x@7J#^UJLsio*WP?3f4rIK(~$^0zYRZLnQRGv2`mp>r7v%)&+YhoiKwLx(eE!En_!gzLjb-p+7m6j{`P6Yt3-R{oCPL^A} z54%Dix^xhEb_q)b0268wt+_&LFp2gOq80Nngq~uhHzBc9x8SzHqo z>hW-W+-QFYu{+Qt2MKLsW-16On~huHrKcFRk;mcDh~DpT`|o!=);wPxeho07jncNY zMtcK={r0|2(c*_Jc~>liaJTbtnp1!9$Vp+tLM)U%1w-{X)DptYj#Wpyi>!2n)ush_ ztE2gCoL_TX+uRIx)8L%g5UmM^53gDEDnjS=AV9_7;IC<{YFMrzMpylf7dFt zj!nR3N*5U{nYKZZ%(zXw>AGyFVBFCLJ6yzi6I27=+NA-67Z z&pQvWj#K|G#Zs1LulexvzOF#OOU>plW}j@Swj9a%OY4ugw~04jf%w75`PDU zYe6aunl9!84!9lFz|Y%(_bdR|xnA$;F|i=sTpvxpdqWmK#9=NZogv&k zUzcr|$)a63Lm714_IxtOw7SN~lZ_W+1KBrlNw2LpYwM6t*_A*c(Z89YWT4JN)Z=^x zn3ZB4*Q3Fq3jN70AW&lJzg_>eEOJCq>jb;W_!K!1BE53&PiOw{@Nj0kEW7dwtoUmC zleLZ$Cy+6fm}~E>P?Jy>E&iV&xzX}0kXEtJTx^z(V2GUn#hyfjC;z%tTV~S*`7$J0 zVa(Fs@%Ue@#U5AA2~0eHVy|w&y``=J`gFPhfOqOusPD}jZRQGt zn~!{xKm}2+8F^m`>ytBM6O9tdL{#K9D|5)mWi_0@28H6;IX9{4i3(8aD4Bx4oyqgk ztoWD386nt|OP80Fz~^oboD61hNB7se;($I&;DS(yPPvo$&Z z=^AesdeL9cn{R6emllwk-0G`Zedwb5ZjMx*l?9=YDp|bFt%%W4O<^NR`=L4O!AT#q zC&90h(v8KRh{#WzCb7o`N)oY?nFV0$tWpy6>wCY;xg8ZCM>Ak+?5nZQ-tn7x;B8r4 zTwNLehsa~ecvUd8(L$1@95$<#k;xc_*X@ieq}f#h?@eirZcvh==Xx!D`A=pHdh(7d z6){;1$7#@h)(8H;A>ZHqIc>$0wDaThh~!-Xe&FTVu7#^}Vb1J|47yeA5sAW(t2k6_ zbZj{+M52FmssVTct(F>s{fmxY(ziPq=c zbVLDLlqPjwGrDl}8o7l9H#jUeUMX_9{?&93}-ckhU7J|8 zqu7p+l1S#ef=r>E2NPtZnw_?S@)Aap>IU6CWE+rPbG!(wK@}|24+ig$MPuU-zaV`_ zB7jj4!ALUY@lg9wT=f{-kTDs==x%8?OZNrL6pXnBs-J38GsH*g;7s;&+U8QJpUUe5 zQA}XI8x-Mh(#FM}USCArAm80&W@D6uwj3-h!pXBz_`v?{t+Vg%XSv%v_J{EU?uluh z)-NK2)uC&3Ts>9RA+;{)apW3$V<^Yk6kU#=>+vdjk?N|iv5N+CaNZNehal3Oe5i=o z-qlz5=3^?cKEu}$qwo`DDQcD@@p3mxwJofL$_!DX=NC23<~Wqz=ho)l20V|5^?qDg zdxR<7+8G&1wwnF5pm_x0hg6X;g?7k+PID0Z#9_ttzr0_M>t*^lPu65T?HTVw6=J_l za5o2itT*!NqdyPU7)50=Gpp7*IP{Uo2m7Z#h=2F~m7*r)LYtPOS~=Qi-b(xE4UhjT zgrkxd4+H}Ucn;lh@eFQMQ%_ZFOjCf0OaO8f{#Ez;%lgYDjZ-DnU#BHc3DT03=99V} z6+%_o`Xvh)>)GSnW2>3Usw#yrQUMOOk1mKDxCI;eAt&T{u=c~2bRbcqVYkx>#*~%w z4(avRrFD4<$`_4^T?%(cI^N6R&u>wVI30f6>f(>(D192B@G#D=n(&ugSy@?Je4GIquAy--qI35t&p#!(_vpKzvP zOYH?NNg8ed#f84jk$1jAdCNG4F*10T>U4Ewe-rX*?$ozzSq-oF?arHmX#c;*i6mnhKV;z+3C_UjnYt_q*%w7>-R;c1}E|JPu!n`2qoV3_R}+wP<2gc^IJwfeheqw*4htQ*)f@< z8l0-u^ui~COB(rQhb=t%5J>gm{bW}tK!CjWzn|&D{$G@S=e9RNBkJnq&u1&|k-_D! zE0_y+YJ%2Pj=l5)o*C=U3%r3a-R%*?16v+&+5?^XJ|bcF&HzAcy6Vqg6(-kh}h z-@)5phGGdt!Q^Ecf}n;pc{P6ejkimbaAz=v5=vNxOlcl^eqRV1h8{PyXY&EALZlZZ zyao8{;PJsuAjs2yhm7fc!Xy7m$P?N5XtJE<<*8$>a&6Un*%?G%*_{>lC6mkO6Sy`b z!rzwUMyZ>=(4eWYv8l0XB@vRPy<-ycnGjKveNCnxC(`)I?-rxJIfiJ3eR3krI zVTN%PBJg?z7bknMmZbAb^Lh6z!eTA zM{4q~IlB5Pj+=k7^eKJP_U<5Aa)Z{>5Tm`y{bJa(=VSDNINED-uqG0e2t8qq!BP=E zj+5R8GLp5o`W)aD*;Pl;BWO1VMb_b6Hi%+l!6vEIpUPqqn_vCfzfv*Cj*`+B1nv&F~5OO|X}fIV9SXNL5~%GZQ=J`f)t|PnpnH*d37j+kAIQ z%rE+Lrh{6sVbo|M_p>vXopGTq|AD$NE z`@aNzs-9-=2`3?cj?t_SIYG}Sk#exql4=WHAIGbisdvTVR{F9IOQ7~7#}sEFb{#$% znpIS`ORZUr_ZmEX=$6%6ewi#O|Imvp{%4i0LqO<>JoJUUtWChYHjrdCL}eQ1VL`hZ z1*?RR@|y-FXBKs@5pkXKtlq_4>*2iyfobG42iNcAqUf>Tx8KUN$3U;O#_UQ|v@8lN zr_Z@NH*kcs&`8tSQg9YLswlpCti0U1NxH3{Zb)7$JmVj3xd>;MQ$V|NEeT$|rDm{B z>s`)na0I{?C;ga>YPg^pwhuy;q7o**#hS!ioIWRJijb+I`8{^Jl3V=8yx4+{bdDVJp%1K zA++NhXf-T?prj0Ktg}cIub$J=bVoH^j zt(HTd@S|$18RI09V@mL+e!aiEs5oNZ-2f)rc||~}cg1xaPA$2DTb$wsMF>?~r|vS$ z@X3E5pgC-5JoFWgRRDbNe&_!HZsTLFsQ>v9)NKHuhJCLu|5ywN;W@<~5PrUB)E>KN zTyZR2+&jg4g(3EXl8fs^KR#_n+vMGcZwsoMc;+q%_v$EgLCvQXmG-bZhdEEG<+}ag zIApEH-nacaW~Z|dd*fMp8AcG~AVu!y#1qgl`?Ui|9ns_JaN9Xg1y>uve2(EOVi$Kf zJV^6KR5o}5YHCSRyFnU5!uW+yT<8^%5wRS^Q*}YVH3np|e)nsb^L}jIfsr-%t-aHd zE<-mDhEkW*ca42PuMi#;xFJIRlYjo*rM2Yy{4tc7M#ov5?eJ-((9|Yvjvfj;F2_Q1QEKsa^>+UFFz z&N{129wbCgt~Uv-I!#lxv~Q5&QOr{!6>eW*cJ{4`Kdt@xl2MU~q32;dua@G4{ejks zT1NhXcDeg~eK!J?C$!C%!0e=2!0Xg}MQ{^B9yd29d_MqfQs?-?$E7xM^69ZIqp0iD zQuiR4X$yxbv;hXIX}gwRdcM<>xGvX|xJxRJ>re@X@g>o>{xWxxZ8zWzz~Opz5Z|Bk zVDyoaeE#cNtIGp?<6>Z1Zc0b>ofg?BYHIQy4apuTLhVVJi_J?kbdR$VsbTiQJnYE8 zFyFgb!OqqNS^Uc9ZL;{~Gr4q2{m)6pe{ouTAiQlR8Bqq_axs3Nt1KvkBGe&jkdO&% z&f87<4(OvtKsh>49+jFc`k3p&*Wt#&6@F3aNVFdC$qq?#@z8 z$5~aAQ`^IjKKFOI!9qXDp*O5?9M;vYRdZuXVGL$D!6pI*tnPYf0gXf^u2F{0Kja$T zZW6z$F3!nGiK>T?*{Jn0=^3-XxvFfdU2zQ9zgoJXe(D^Myet4rz}w&d!JCV#-n}`H z0DJ8GQf?JyK>lntni6bj}?6(5`&{}jCymkzrMZPBgp#Jt}lybyysw%?I$@$ zPQ(XBtqOyJO3m&p9fWEt(KYX1@6lf==}VEzIpDde1>wsvep-CmNRw^Vjm%SDKl4(R zdTYf+Ll;ogb@Fm)kq~|#tF1elVPG*jw7M~e9(J;gmLk2H#)Tn^C!fjo5VvnKZZ z*W5JpBF-yEYD@&4e;1Swl18J*_Kd2Mra5{)N=Fi-kQqc$_x9b#&_WenH4Re-yk`vIKm{=P`f2haEtc5(obL~jt=B_T|2_v zHy8B;4$o7i#-_`#wYGi$@Ui46^4d#r&5Kn&tQT~2xuM7YQS7e;%5c_0&Q{vz-mo&z zX7TbHv<@9cJyEP2j_-Ju95Wifl`$&qc+x>x2J!O#lR*H2YTV&GqHHo@4T)@ zGh-%<{hl|&VrZ!*n32*`inWUZX=Ku$ODM>wb2251+(y=PBvjdH^(JB(0JQ5 z^kh+;lb^S4Mv1v7Gym2LfNjQ7+j|yDl`1f08G(1uK zY2^!joBVVD1-b7oZ0Kn z6F~8~Vs7`_XT&VPE;^+HQl+6E&stjW1KSU9h($jpCq^uZiyy-CGG=3$ezkCFBPr86 zE6qed=owD3{NnScLSq)vokeiYw1V<{0<$nQrZfe!%g=cC*v`{s)K?|-+o(a^F zE#6zZO>~%g-h(UhH)z9X`|${7|h+T#SBA zkx){<(}KXX=dd(kE#*)RPBJI$@KOj@Qfw^eu7L^tVFZy!X}t6{&(%mdphf1ZUt+vSV&Neih*2m z_nWOD6{FAk&k>pHAOIK?0r@LwQ-!uwugp20(|<)o>{L25SJdtA54d(wsZ)uo<7L